Quellcode durchsuchen

ZF-12155: Zend_Reflection_File doesn't handle complex parsed variable syntax properly

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24803 44c647ce-9c0f-0410-b52a-842ac1e357ba
adamlundrigan vor 13 Jahren
Ursprung
Commit
dcd3deeb47

+ 16 - 5
library/Zend/Reflection/File.php

@@ -309,10 +309,11 @@ class Zend_Reflection_File implements Reflector
         $contents = $this->_contents;
         $tokens   = token_get_all($contents);
 
-        $functionTrapped = false;
-        $classTrapped    = false;
-        $requireTrapped  = false;
-        $openBraces      = 0;
+        $functionTrapped           = false;
+        $classTrapped              = false;
+        $requireTrapped            = false;
+        $embeddedVariableTrapped   = false;
+        $openBraces                = 0;
 
         $this->_checkFileDocBlock($tokens);
 
@@ -339,13 +340,23 @@ class Zend_Reflection_File implements Reflector
                 if ($token == '{') {
                     $openBraces++;
                 } else if ($token == '}') {
-                    $openBraces--;
+                    if ( $embeddedVariableTrapped ) {
+                        $embeddedVariableTrapped = false;
+                    } else {
+                        $openBraces--;
+                    }
                 }
 
                 continue;
             }
 
             switch ($type) {
+                case T_STRING_VARNAME:
+                case T_DOLLAR_OPEN_CURLY_BRACES:
+                case T_CURLY_OPEN:
+                    $embeddedVariableTrapped = true;
+                    continue;
+
                 // Name of something
                 case T_STRING:
                     if ($functionTrapped) {

+ 15 - 0
tests/Zend/Reflection/FileTest.php

@@ -139,5 +139,20 @@ class Zend_Reflection_FileTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('Zend_Reflection_TestSampleInterface', $class->getName());
         $this->assertTrue($class->isInterface());
     }
+
+    /**
+     * @group ZF-12155
+     */
+    public function testFileCanReflectFunctionsContainingVariablesEmbeddedInStringWithCurlyBraces()
+    {
+        $fileToRequire = dirname(__FILE__) . '/_files/FunctionWithEmbeddedVariableInString.php';
+        require_once $fileToRequire;
+        $reflectionFile = new Zend_Reflection_File($fileToRequire);
+        $functions = $reflectionFile->getFunctions();
+        $this->assertEquals(2, count($functions));
+        $this->assertContainsOnly('Zend_Reflection_Function', $functions);
+        $this->assertEquals('firstOne', $functions[0]->getName());
+        $this->assertEquals('secondOne', $functions[1]->getName());
+    }
 }
 

+ 11 - 0
tests/Zend/Reflection/_files/FunctionWithEmbeddedVariableInString.php

@@ -0,0 +1,11 @@
+<?php
+
+function firstOne() {
+    $substitute = "Testing";
+    $varA = "${substitute} 123!";
+    $varB = "{$substitute} 123!";
+    $varC = "$substitute 123!";
+    $varD = "${substitute}";
+}
+
+function secondOne() {}