getDiagnosticForNode(); } return null; } /** * @param Token $token * @return Diagnostic|null */ private static function checkDiagnosticForUnexpectedToken($token) { if ($token instanceof SkippedToken) { // TODO - consider also attaching parse context information to skipped tokens // this would allow us to provide more helpful error messages that inform users what to do // about the problem rather than simply pointing out the mistake. return new Diagnostic( DiagnosticKind::Error, "Unexpected '" . (self::$tokenKindToText[$token->kind] ?? Token::getTokenKindNameFromValue($token->kind)) . "'", $token->start, $token->getEndPosition() - $token->start ); } elseif ($token instanceof MissingToken) { return new Diagnostic( DiagnosticKind::Error, "'" . (self::$tokenKindToText[$token->kind] ?? Token::getTokenKindNameFromValue($token->kind)) . "' expected.", $token->start, $token->getEndPosition() - $token->start ); } return null; } /** * Traverses AST to generate diagnostics. * @param \Microsoft\PhpParser\Node $n * @return Diagnostic[] */ public static function getDiagnostics(Node $n) : array { $diagnostics = []; /** * @param \Microsoft\PhpParser\Node|\Microsoft\PhpParser\Token $node */ $n->walkDescendantNodesAndTokens(function($node) use (&$diagnostics) { if (($diagnostic = self::checkDiagnostics($node)) !== null) { $diagnostics[] = $diagnostic; } }); return $diagnostics; } } DiagnosticsProvider::initTokenKindToText();