diff --git a/features/optimize_use.feature b/features/optimize_use.feature index 4fb767c..b2507e2 100644 --- a/features/optimize_use.feature +++ b/features/optimize_use.feature @@ -47,4 +47,38 @@ Feature: Optimize use return $service; """ + Scenario: Organize use for file without namespace and other uses + Given a PHP File named "src/Foo.php" with: + """ + broker->processString($file->getCode(), $file->getRelativePath(), true); foreach ($file->getNamespaces() as $namespace) { + $noNamespace = ReflectionNamespace::NO_NAMESPACE_NAME === $namespace->getName(); foreach ($namespace->getClasses() as $class) { $classes[] = new PhpClass( PhpName::createDeclarationName($class->getName()), $class->getStartLine(), - $namespace->getStartLine() + $noNamespace ? 0 : $namespace->getStartLine() ); } } diff --git a/src/main/QafooLabs/Refactoring/Application/OptimizeUse.php b/src/main/QafooLabs/Refactoring/Application/OptimizeUse.php index ec950ff..ce9d8de 100644 --- a/src/main/QafooLabs/Refactoring/Application/OptimizeUse.php +++ b/src/main/QafooLabs/Refactoring/Application/OptimizeUse.php @@ -37,6 +37,7 @@ public function refactor(File $file) $occurances = $this->phpNameScanner->findNames($file); $class = $classes[0]; + $appendNewLine = 0 === $class->namespaceDeclarationLine(); $lastUseStatementLine = $class->namespaceDeclarationLine() + 2; $usedNames = array(); $fqcns = array(); @@ -44,7 +45,7 @@ public function refactor(File $file) foreach ($occurances as $occurance) { $name = $occurance->name(); - if ($name->type() === PhpName::TYPE_NAMESPACE) { + if ($name->type() === PhpName::TYPE_NAMESPACE || $name->type() === PhpName::TYPE_CLASS) { continue; } @@ -67,7 +68,13 @@ public function refactor(File $file) $buffer->replaceString($occurance->declarationLine(), '\\'.$name->fullyQualifiedName(), $name->shortname()); if (!in_array($name->fullyQualifiedName(), $usedNames)) { - $buffer->append($lastUseStatementLine, array(sprintf('use %s;', $name->fullyQualifiedName()))); + $lines = array(sprintf('use %s;', $name->fullyQualifiedName())); + if ($appendNewLine) { + $appendNewLine = FALSE; + $lines[] = ''; + } + + $buffer->append($lastUseStatementLine, $lines); $lastUseStatementLine++; } } diff --git a/src/test/QafooLabs/Refactoring/Adapters/TokenReflection/StaticCodeAnalysisTest.php b/src/test/QafooLabs/Refactoring/Adapters/TokenReflection/StaticCodeAnalysisTest.php new file mode 100644 index 0000000..b24394e --- /dev/null +++ b/src/test/QafooLabs/Refactoring/Adapters/TokenReflection/StaticCodeAnalysisTest.php @@ -0,0 +1,28 @@ +findClasses($file); + $class = $classes[0]; + + $this->assertEquals(0, $class->namespaceDeclarationLine(), 'namespace declaration line for file without namespace'); + } +}