Skip to content

Commit

Permalink
Check for function invocation parsing
Browse files Browse the repository at this point in the history
Signed-off-by: Andreas Frömer <andreas.froemer@check24.de>
  • Loading branch information
Andreas Frömer committed Dec 16, 2021
1 parent 46d5619 commit 9e84e9e
Show file tree
Hide file tree
Showing 14 changed files with 112 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -21,7 +21,7 @@ require:
remove:
docker exec -it $(CONTAINER) composer remove $(filter-out $@, $(MAKECMDGOALS))

check: csfix cs phpunit analyse
check: cs analyse phpunit

phpunit:
docker exec -it $(CONTAINER) vendor/bin/phpunit
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Expand Up @@ -19,7 +19,7 @@
"require": {
"php": "^7.3 || ^8.0",
"composer-plugin-api": "^2.0",
"composer-unused/symbol-parser": "^0.1.3",
"composer-unused/symbol-parser": "dev-main",
"nikic/php-parser": "^4.13",
"psr/container": "^1.0 || ^2.0",
"psr/log": "^1.1 || ^2 || ^3"
Expand Down
2 changes: 1 addition & 1 deletion phpstan.neon
Expand Up @@ -6,7 +6,7 @@ parameters:
- phpunit.bootstrap.php
excludes_analyse:
- %currentWorkingDirectory%/tests/assets
level: max
level: 8
inferPrivatePropertyTypeFromConstructor: true
paths:
- src/
Expand Down
4 changes: 2 additions & 2 deletions src/Command/Handler/CollectConsumedSymbolsCommandHandler.php
Expand Up @@ -29,7 +29,7 @@ public function __construct(ConsumedSymbolLoaderBuilder $consumedSymbolLoaderBui
public function collect(CollectConsumedSymbolsCommand $command): Generator
{
$package = $command->getPackage();
$symbolLoader = $this->consumedSymbolLoaderBuilder->build($command->getPackageRoot());
$symbolLoader = $this->consumedSymbolLoaderBuilder->build();

$rootNamespaces = array_merge(
array_keys($package->getAutoload()['psr-0'] ?? []),
Expand All @@ -38,7 +38,7 @@ public function collect(CollectConsumedSymbolsCommand $command): Generator

yield from $this->filterRootPackageSymbols(
$rootNamespaces,
$symbolLoader->load($package)
$symbolLoader->withBaseDir($command->getPackageRoot())->load($package)
);
}

Expand Down
Expand Up @@ -30,7 +30,7 @@ public function __construct(
public function collect(LoadRequiredDependenciesCommand $command): DependencyCollection
{
$dependencyCollection = new DependencyCollection();
$providedSymbolLoader = $this->providedSymbolLoaderBuilder->build($command->getBaseDir());
$providedSymbolLoader = $this->providedSymbolLoaderBuilder->build();

foreach ($command->getPackageLinks() as $require) {
$composerPackage = $this->packageResolver->resolve(
Expand All @@ -43,11 +43,13 @@ public function collect(LoadRequiredDependenciesCommand $command): DependencyCol
continue;
}

$baseDir = $command->getBaseDir() . '/' . $composerPackage->getName();

$dependencyCollection->add(
new RequiredDependency(
$composerPackage,
(new SymbolList())->addAll(
$providedSymbolLoader->load($composerPackage)
$providedSymbolLoader->withBaseDir($baseDir)->load($composerPackage)
)
)
);
Expand Down
2 changes: 1 addition & 1 deletion src/Console/Command/UnusedCommand.php
Expand Up @@ -102,7 +102,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int

$unfilteredRequiredDependencyCollection = $this->collectRequiredDependenciesCommandHandler->collect(
new LoadRequiredDependenciesCommand(
$baseDir . DIRECTORY_SEPARATOR . $composer->getConfig()->get('vendor-dir'),
$composer->getConfig()->get('vendor-dir'),
$rootPackage->getRequires(),
$composer->getRepositoryManager()->getLocalRepository()
)
Expand Down
22 changes: 16 additions & 6 deletions src/Symbol/ConsumedSymbolLoaderBuilder.php
Expand Up @@ -5,8 +5,14 @@
namespace Icanhazstring\Composer\Unused\Symbol;

use ComposerUnused\SymbolParser\File\FileContentProvider;
use ComposerUnused\SymbolParser\Parser\PHP\AutoloadType;
use ComposerUnused\SymbolParser\Parser\PHP\ConsumedSymbolCollector;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\ClassConstStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\ConstStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\ExtendsParseStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\FunctionInvocationStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\ImplementsParseStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\InstanceofStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\NewStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\StaticStrategy;
use ComposerUnused\SymbolParser\Parser\PHP\Strategy\UsedExtensionSymbolStrategy;
Expand All @@ -22,19 +28,24 @@

final class ConsumedSymbolLoaderBuilder
{
public function build(string $packageRoot): SymbolLoaderInterface
public function build(): SymbolLoaderInterface
{
$usedSymbolCollector = new ConsumedSymbolCollector(
[
new ClassConstStrategy(),
new ConstStrategy(),
new ExtendsParseStrategy(),
new FunctionInvocationStrategy(),
new ImplementsParseStrategy(),
new InstanceofStrategy(),
new NewStrategy(),
new StaticStrategy(),
new UseStrategy(),
new ClassConstStrategy(),
new UsedExtensionSymbolStrategy(
get_loaded_extensions(),
// TODO logger
new NullLogger()
)
),
new UseStrategy(),
]
);

Expand All @@ -49,9 +60,8 @@ public function build(string $packageRoot): SymbolLoaderInterface
);

return new FileSymbolLoader(
$packageRoot,
$fileSymbolProvider,
['classmap', 'files', 'psr-0', 'psr-4']
AutoloadType::all()
);
}
}
5 changes: 3 additions & 2 deletions src/Symbol/ProvidedSymbolLoaderBuilder.php
Expand Up @@ -5,6 +5,7 @@
namespace Icanhazstring\Composer\Unused\Symbol;

use ComposerUnused\SymbolParser\File\FileContentProvider;
use ComposerUnused\SymbolParser\Parser\PHP\AutoloadType;
use ComposerUnused\SymbolParser\Parser\PHP\DefinedSymbolCollector;
use ComposerUnused\SymbolParser\Parser\PHP\SymbolNameParser;
use ComposerUnused\SymbolParser\Symbol\Loader\CompositeSymbolLoader;
Expand All @@ -17,7 +18,7 @@

final class ProvidedSymbolLoaderBuilder
{
public function build(string $packageRoot): SymbolLoaderInterface
public function build(): SymbolLoaderInterface
{
$symbolNameParser = new SymbolNameParser(
(new ParserFactory())->create(ParserFactory::ONLY_PHP7),
Expand All @@ -33,7 +34,7 @@ public function build(string $packageRoot): SymbolLoaderInterface
[
new ExtensionSymbolLoader(),
new PsrSymbolLoader(),
new FileSymbolLoader($packageRoot, $fileSymbolProvider, ['classmap', 'files'])
new FileSymbolLoader($fileSymbolProvider, [AutoloadType::CLASSMAP, AutoloadType::FILES])
]
);
}
Expand Down
16 changes: 16 additions & 0 deletions tests/Integration/UnusedCommandTest.php
Expand Up @@ -155,4 +155,20 @@ public function itShouldNotReportPatternExcludedPackages(): void

self::assertStringNotContainsString('-implementation', $output->fetch());
}

/**
* @test
*/
public function itShouldNotReportFileDependencyWithFunctionGuard(): void
{
chdir(__DIR__ . '/../assets/TestProjects/FileDependencyFunctionWithGuard');

self::assertEquals(
0,
$this->getApplication()->run(
new ArrayInput(['unused']),
new NullOutput()
)
);
}
}
@@ -0,0 +1,16 @@
{
"name": "foo/bar",
"description": "foobar",
"type": "library",
"minimum-stability": "stable",
"require": {
"test/file-dependency": "*"
},
"autoload": {
"psr-4": {
"FileDependencyFunctionWithGuard\\": "src/"
}
},
"require-dev": {
}
}
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace FileDependencyFunctionWithGuard;

class TestClass
{
public function testMethod(): void
{
$b = testfunction2();
}
}
@@ -0,0 +1,17 @@
[
{
"name": "test/file-dependency",
"type": "library",
"version": "1.0",
"description": "test dependency",
"autoload": {
"files": [
"src/file.php"
]
},
"require": {
},
"require-dev": {
}
}
]
@@ -0,0 +1,14 @@
{
"name": "test/file-dependency",
"type": "library",
"description": "test dependency",
"autoload": {
"files": [
"src/file.php"
]
},
"require": {
},
"require-dev": {
}
}
@@ -0,0 +1,7 @@
<?php

declare(strict_types=1);

if (!function_exists('testfunction2')) {
function testfunction2() {}
}

0 comments on commit 9e84e9e

Please sign in to comment.