function enterNode(\PhpParser\Node $node) { if ($node instanceof \PhpParser\Node\Stmt\Namespace_) { $this->addNamespace(array('namespace' => $node->name->toString(), 'line' => $node->getLine(), 'file' => $this->file)); } if ($node instanceof \PhpParser\Node\Stmt\Use_) { foreach ($node->uses as $use) { $this->addUse(array('name' => $use->name, 'alias' => $use->alias)); } } if ($node instanceof \PhpParser\Node\Stmt\Class_) { $this->addClass(array('name' => $node->name, 'extends' => $node->extends, 'implements' => $node->implements, 'abstract' => $node->isAbstract(), 'final' => $node->isFinal(), 'comment' => $node->getDocComment(), 'doc' => $this->doc_comment_parser->parse($node->getDocComment()), 'line' => $node->getLine(), 'file' => $this->file)); } if ($node instanceof \PhpParser\Node\Stmt\Interface_) { $this->addInterface(array('name' => $node->name, 'extends' => $node->extends, 'comment' => $node->getDocComment(), 'doc' => $this->doc_comment_parser->parse($node->getDocComment()), 'line' => $node->getLine(), 'file' => $this->file)); } if ($node instanceof \PhpParser\Node\Stmt\ClassMethod) { $this->addClassMethod(array('byRef' => $node->byRef, 'name' => $node->name, 'params' => $node->params, 'returnType' => $node->returnType, 'public' => $node->isPublic(), 'protected' => $node->isProtected(), 'private' => $node->isPrivate(), 'abstract' => $node->isAbstract(), 'final' => $node->isFinal(), 'static' => $node->isStatic(), 'comment' => $node->getDocComment(), 'doc' => $this->doc_comment_parser->parse($node->getDocComment()), 'line' => $node->getLine(), 'file' => $this->file)); } if ($node instanceof \PhpParser\Node\Stmt\Property) { $this->last_property = $node; } if ($node instanceof \PhpParser\Node\Stmt\PropertyProperty) { $this->addClassProperty(array('name' => $node->name, 'default' => $node->default, 'public' => $this->last_property->isPublic(), 'protected' => $this->last_property->isProtected(), 'private' => $this->last_property->isPrivate(), 'static' => $this->last_property->isStatic(), 'comment' => $node->getDocComment(), 'doc' => $this->doc_comment_parser->parse($node->getDocComment()), 'line' => $node->getLine(), 'file' => $this->file)); } // $this->logger->info(get_class($node)); }
/** * @inheritdoc * @param Stmt\Property $node */ public function defineVariableByValue(Node $node) { assert($node instanceof Stmt\Property, 'Only accepts class properties'); if ($node->isStatic()) { return parent::defineVariableByValue($node); } else { $this->instanceEnvironment->defineVariableByValue($node); return $this; } }
public function enterNode(Node $node) { switch ($node->getType()) { case 'Stmt_Class': $this->currentClass = $node->name; break; case 'Stmt_ClassMethod': if ($node->isStatic()) { $this->currentMethod = $node->name; } break; default: if (!is_null($this->currentMethod)) { $this->enterMethodCode($node); } } }
/** * @param \PhpParser\Node\Stmt\Property $node * @param \PHPStan\Analyser\Scope $scope * @return string[] */ public function processNode(Node $node, Scope $scope) : array { if ($scope->getClass() === null || !$this->broker->hasClass($scope->getClass())) { return []; } $classReflection = $this->broker->getClass($scope->getClass()); $errors = []; foreach ($node->props as $property) { if ($property->default === null) { continue; } $propertyReflection = $classReflection->getProperty($property->name); $propertyType = $propertyReflection->getType(); $defaultValueType = $scope->getType($property->default); if ($propertyType->accepts($defaultValueType)) { continue; } $errors[] = sprintf('%s %s::$%s (%s) does not accept default value of type %s.', $node->isStatic() ? 'Static property' : 'Property', $scope->getClass(), $property->name, $propertyType->describe(), $defaultValueType->describe()); } return $errors; }
public function leaveNode(Node $node) { if ($node instanceof ClassMethod && $node->isStatic()) { $this->inStaticMethod = false; } }
protected function compareModifier(Node $a, Node $b) { // Within same visibility, goes first $cmp = strcmp($b->isStatic(), $a->isStatic()); if ($cmp !== 0) { return $cmp; } // Within same visibility and ess, abstract goes first if ($a instanceof ClassMethod) { $cmp = strcmp($b->isAbstract(), $a->isAbstract()); } return $cmp; }