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