Chris@0: class = $node; Chris@0: $this->abstractMethods = []; Chris@0: } elseif ($node instanceof ClassMethod) { Chris@0: if ($node->isAbstract()) { Chris@0: $name = sprintf('%s::%s', $this->class->name, $node->name); Chris@0: $this->abstractMethods[] = $name; Chris@0: Chris@0: if ($node->stmts !== null) { Chris@0: $msg = sprintf('Abstract function %s cannot contain body', $name); Chris@0: throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); Chris@0: } Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * @throws RuntimeException if the node is a non-abstract class with abstract methods Chris@0: * Chris@0: * @param Node $node Chris@0: */ Chris@0: public function leaveNode(Node $node) Chris@0: { Chris@0: if ($node instanceof Class_) { Chris@0: $count = count($this->abstractMethods); Chris@0: if ($count > 0 && !$node->isAbstract()) { Chris@0: $msg = sprintf( Chris@0: 'Class %s contains %d abstract method%s must therefore be declared abstract or implement the remaining methods (%s)', Chris@0: $node->name, Chris@0: $count, Chris@0: ($count === 1) ? '' : 's', Chris@0: implode(', ', $this->abstractMethods) Chris@0: ); Chris@0: throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); Chris@0: } Chris@0: } Chris@0: } Chris@0: }