Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
45 changes: 31 additions & 14 deletions src/Type/FileTypeMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -578,24 +578,41 @@ function (Node $node) use ($fileName, $lookForTrait, &$traitFound, $traitMethodA

if ($node instanceof Node\Stmt\Namespace_) {
$namespace = $node->name !== null ? (string) $node->name : null;
} elseif ($node instanceof Node\Stmt\Use_) {
if ($node->type === Node\Stmt\Use_::TYPE_NORMAL) {
foreach ($node->uses as $use) {
$uses[strtolower($use->getAlias()->name)] = (string) $use->name;
} elseif ($node instanceof Node\Stmt\Use_ || $node instanceof Node\Stmt\GroupUse) {
if ($node instanceof Node\Stmt\Use_) {
if ($node->type === Node\Stmt\Use_::TYPE_NORMAL) {
foreach ($node->uses as $use) {
$uses[strtolower($use->getAlias()->name)] = (string) $use->name;
}
} elseif ($node->type === Node\Stmt\Use_::TYPE_CONSTANT) {
foreach ($node->uses as $use) {
$constUses[strtolower($use->getAlias()->name)] = (string) $use->name;
}
}
} elseif ($node->type === Node\Stmt\Use_::TYPE_CONSTANT) {
} else {
$prefix = (string) $node->prefix;
foreach ($node->uses as $use) {
$constUses[strtolower($use->getAlias()->name)] = (string) $use->name;
if ($node->type === Node\Stmt\Use_::TYPE_NORMAL || $use->type === Node\Stmt\Use_::TYPE_NORMAL) {
$uses[strtolower($use->getAlias()->name)] = sprintf('%s\\%s', $prefix, (string) $use->name);
} elseif ($node->type === Node\Stmt\Use_::TYPE_CONSTANT || $use->type === Node\Stmt\Use_::TYPE_CONSTANT) {
$constUses[strtolower($use->getAlias()->name)] = sprintf('%s\\%s', $prefix, (string) $use->name);
}
}
}
} elseif ($node instanceof Node\Stmt\GroupUse) {
$prefix = (string) $node->prefix;
foreach ($node->uses as $use) {
if ($node->type === Node\Stmt\Use_::TYPE_NORMAL || $use->type === Node\Stmt\Use_::TYPE_NORMAL) {
$uses[strtolower($use->getAlias()->name)] = sprintf('%s\\%s', $prefix, (string) $use->name);
} elseif ($node->type === Node\Stmt\Use_::TYPE_CONSTANT || $use->type === Node\Stmt\Use_::TYPE_CONSTANT) {
$constUses[strtolower($use->getAlias()->name)] = sprintf('%s\\%s', $prefix, (string) $use->name);
}
if (array_key_exists($nameScopeKey, $nameScopeMap)) {
$parentNameScope = array_last($typeMapStack) ?? null;
$typeAliasesMap = array_last($typeAliasStack) ?? [];
$nameScopeMap[$nameScopeKey] = new IntermediaryNameScope(
$namespace,
$uses,
$className,
$functionName,
$parentNameScope !== null ? $parentNameScope->getTemplatePhpDocNodes() : [],
$parentNameScope !== null ? $parentNameScope->getParent() : null,
$typeAliasesMap,
constUses: $constUses,
typeAliasClassName: $lookForTrait,
);
}
} elseif ($node instanceof Node\Stmt\TraitUse) {
$traitMethodAliases = [];
Expand Down
11 changes: 11 additions & 0 deletions tests/PHPStan/Rules/PhpDoc/InvalidPhpDocVarTagTypeRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -186,4 +186,15 @@ public function testBug9055(): void
]);
}

public function testBug14648(): void
{
$this->analyse([__DIR__ . '/data/bug-14648.php'], [
[
'PHPDoc tag @var for variable $class contains unknown class Bug14648Helper\MyClass.',
9,
'Learn more at https://phpstan.org/user-guide/discovering-symbols',
],
]);
}

}
9 changes: 9 additions & 0 deletions tests/PHPStan/Rules/PhpDoc/data/bug-14648.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php // empty tag
?>
<p>Hello World</p>
<?php

use Bug14648Helper\MyClass;

/** @var MyClass $class */
$class = new MyClass;
4 changes: 0 additions & 4 deletions tmp/.gitignore

This file was deleted.

2 changes: 0 additions & 2 deletions tmp/cache/.gitignore

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
<?php declare(strict_types = 1);

// odsl-/home/runner/work/phpstan-src/phpstan-src/tests/PHPStan/Rules/Classes/TraitAttributeClassRuleTest.php-PHPStan\BetterReflection\Reflection\ReflectionClass-PHPStan\Rules\Classes\TraitAttributeClassRuleTest
return \PHPStan\Cache\CacheItem::__set_state(array(
'variableKey' => 'v2-6.70.0.1-8.4.21-9fcef6f102e5701fe30b654902c3233c6ba4f48d034a5ea20a8551408326b5a1',
'data' =>
array (
'locatedSource' =>
array (
'class' => 'PHPStan\\BetterReflection\\SourceLocator\\Located\\LocatedSource',
'data' =>
array (
'name' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'filename' => '/home/runner/work/phpstan-src/phpstan-src/tests/PHPStan/Rules/Classes/TraitAttributeClassRuleTest.php',
),
),
'namespace' => 'PHPStan\\Rules\\Classes',
'name' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'shortName' => 'TraitAttributeClassRuleTest',
'isInterface' => false,
'isTrait' => false,
'isEnum' => false,
'isBackedEnum' => false,
'modifiers' => 0,
'docComment' => '/**
* @extends RuleTestCase<TraitAttributeClassRule>
*/',
'attributes' =>
array (
),
'startLine' => 11,
'endLine' => 29,
'startColumn' => 1,
'endColumn' => 1,
'parentClassName' => 'PHPStan\\Testing\\RuleTestCase',
'implementsClassNames' =>
array (
),
'traitClassNames' =>
array (
),
'immediateConstants' =>
array (
),
'immediateProperties' =>
array (
),
'immediateMethods' =>
array (
'getRule' =>
array (
'name' => 'getRule',
'parameters' =>
array (
),
'returnsReference' => false,
'returnType' =>
array (
'class' => 'PHPStan\\BetterReflection\\Reflection\\ReflectionNamedType',
'data' =>
array (
'name' => 'PHPStan\\Rules\\Rule',
'isIdentifier' => false,
),
),
'attributes' =>
array (
),
'docComment' => NULL,
'startLine' => 14,
'endLine' => 17,
'startColumn' => 2,
'endColumn' => 2,
'couldThrow' => false,
'isClosure' => false,
'isGenerator' => false,
'isVariadic' => false,
'modifiers' => 2,
'namespace' => 'PHPStan\\Rules\\Classes',
'declaringClassName' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'implementingClassName' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'currentClassName' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'aliasName' => NULL,
),
'testRule' =>
array (
'name' => 'testRule',
'parameters' =>
array (
),
'returnsReference' => false,
'returnType' =>
array (
'class' => 'PHPStan\\BetterReflection\\Reflection\\ReflectionNamedType',
'data' =>
array (
'name' => 'void',
'isIdentifier' => true,
),
),
'attributes' =>
array (
),
'docComment' => NULL,
'startLine' => 19,
'endLine' => 27,
'startColumn' => 2,
'endColumn' => 2,
'couldThrow' => false,
'isClosure' => false,
'isGenerator' => false,
'isVariadic' => false,
'modifiers' => 1,
'namespace' => 'PHPStan\\Rules\\Classes',
'declaringClassName' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'implementingClassName' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'currentClassName' => 'PHPStan\\Rules\\Classes\\TraitAttributeClassRuleTest',
'aliasName' => NULL,
),
),
'traitsData' =>
array (
'aliases' =>
array (
),
'modifiers' =>
array (
),
'precedences' =>
array (
),
'hashes' =>
array (
),
),
),
));
Loading
Loading