/** * Parses an optional statement or returns <b>null</b>. * * @return \PDepend\Source\AST\ASTNode * @since 0.9.8 */ private function parseOptionalStatement() { $tokenType = $this->tokenizer->peek(); switch ($tokenType) { case Tokens::T_ECHO: return $this->parseEchoStatement(); case Tokens::T_SWITCH: return $this->parseSwitchStatement(); case Tokens::T_TRY: return $this->parseTryStatement(); case Tokens::T_THROW: return $this->parseThrowStatement(); case Tokens::T_IF: return $this->parseIfStatement(); case Tokens::T_FOR: return $this->parseForStatement(); case Tokens::T_FOREACH: return $this->parseForeachStatement(); case Tokens::T_DO: return $this->parseDoWhileStatement(); case Tokens::T_WHILE: return $this->parseWhileStatement(); case Tokens::T_RETURN: return $this->parseReturnStatement(); case Tokens::T_BREAK: return $this->parseBreakStatement(); case Tokens::T_CONTINUE: return $this->parseContinueStatement(); case Tokens::T_GOTO: return $this->parseGotoStatement(); case Tokens::T_GLOBAL: return $this->parseGlobalStatement(); case Tokens::T_UNSET: return $this->parseUnsetStatement(); case Tokens::T_STRING: if ($this->tokenizer->peekNext() === Tokens::T_COLON) { return $this->parseLabelStatement(); } break; case Tokens::T_CONST: return $this->parseConstantDefinition(); case Tokens::T_FUNCTION: return $this->parseFunctionOrClosureDeclaration(); case Tokens::T_COMMENT: return $this->parseCommentWithOptionalInlineClassOrInterfaceReference(); case Tokens::T_DOC_COMMENT: return $this->builder->buildAstComment($this->consumeToken(Tokens::T_DOC_COMMENT)->image); case Tokens::T_CURLY_BRACE_OPEN: return $this->parseRegularScope(); case Tokens::T_DECLARE: return $this->parseDeclareStatement(); case Tokens::T_ELSE: case Tokens::T_ENDIF: case Tokens::T_ELSEIF: case Tokens::T_ENDFOR: case Tokens::T_ENDWHILE: case Tokens::T_ENDSWITCH: case Tokens::T_ENDDECLARE: case Tokens::T_ENDFOREACH: case Tokens::T_CURLY_BRACE_CLOSE: return null; case Tokens::T_DECLARE: return $this->parseDeclareStatement(); case Tokens::T_CLOSE_TAG: if (($tokenType = $this->parseNonePhpCode()) === Tokenizer::T_EOF) { return null; } return $this->parseOptionalStatement(); case Tokens::T_TRAIT: $package = $this->getNamespaceOrPackage(); $package->addType($trait = $this->parseTraitDeclaration()); $this->builder->restoreTrait($trait); $this->compilationUnit->addChild($trait); return $trait; case Tokens::T_INTERFACE: $package = $this->getNamespaceOrPackage(); $package->addType($interface = $this->parseInterfaceDeclaration()); $this->builder->restoreInterface($interface); $this->compilationUnit->addChild($interface); return $interface; case Tokens::T_CLASS: case Tokens::T_FINAL: case Tokens::T_ABSTRACT: $package = $this->getNamespaceOrPackage(); $package->addType($class = $this->parseClassDeclaration()); $this->builder->restoreClass($class); $this->compilationUnit->addChild($class); return $class; case Tokens::T_YIELD: return $this->parseYield(); } $this->tokenStack->push(); $stmt = $this->builder->buildAstStatement(); if (($expr = $this->parseOptionalExpression()) != null) { $stmt->addChild($expr); } $this->parseStatementTermination(); return $this->setNodePositionsAndReturn($stmt); }
/** * This method can be used to register an existing interface in the current * class context. * * @param \PDepend\Source\AST\ASTInterface $interface * @return void */ public function registerInterface(ASTInterface $interface) { self::$builder->restoreInterface($interface); }