diff --git a/src/ClassRegistryInitExtension.php b/src/ClassRegistryInitExtension.php index 184a660..409623f 100644 --- a/src/ClassRegistryInitExtension.php +++ b/src/ClassRegistryInitExtension.php @@ -5,6 +5,7 @@ namespace PHPStanCakePHP2; use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; use PHPStanCakePHP2\Service\SchemaService; @@ -48,23 +49,29 @@ public function isStaticMethodSupported(MethodReflection $methodReflection): boo public function getTypeFromStaticMethodCall(MethodReflection $methodReflection, StaticCall $methodCall, Scope $scope): ?Type { $value = $methodCall->getArgs()[0]->value; - $evaluator = new ConstExprEvaluator(); + + if ($value instanceof Variable) { + return new ObjectType('Model'); + } if ($value instanceof ClassConstFetch && $value->class instanceof Name\FullyQualified) { $value = new String_($value->class->toString()); } - $arg1 = $evaluator->evaluateSilently($value); + $arg1 = (new ConstExprEvaluator())->evaluateSilently($value); if (! is_string($arg1)) { return $this->getDefaultType(); } + if ($this->reflectionProvider->hasClass($arg1)) { return new ObjectType($arg1); } + if ($this->schemaService->hasTable(Inflector::tableize($arg1))) { return new ObjectType('Model'); } + return $this->getDefaultType(); } diff --git a/tests/Feature/data/class_registry_init.php b/tests/Feature/data/class_registry_init.php index 2580723..54dcd20 100644 --- a/tests/Feature/data/class_registry_init.php +++ b/tests/Feature/data/class_registry_init.php @@ -15,3 +15,7 @@ $class = ClassRegistry::init(BasicModel::class); assertType('BasicModel', $class); + +$var = 'BasicModel'; + +assertType('Model', ClassRegistry::init($var));