1
0
Fork 0

Update php-parser to latest commit (#119)

pull/120/head
Felix Becker 2016-10-26 22:25:24 +02:00 committed by GitHub
parent ed41df0062
commit 18e58b4ce8
5 changed files with 37 additions and 21 deletions

View File

@ -24,7 +24,7 @@
"bin": ["bin/php-language-server.php"], "bin": ["bin/php-language-server.php"],
"require": { "require": {
"php": ">=7.0", "php": ">=7.0",
"nikic/php-parser": "dev-master#90834bff8eaf7b7f893253f312e73d8f532341ca", "nikic/php-parser": "dev-master#c0f0edf0441f0ddcff0604407b7600a40993faf2",
"phpdocumentor/reflection-docblock": "^3.0", "phpdocumentor/reflection-docblock": "^3.0",
"sabre/event": "^4.0", "sabre/event": "^4.0",
"felixfbecker/advanced-json-rpc": "^2.0", "felixfbecker/advanced-json-rpc": "^2.0",

25
src/Parser.php Normal file
View File

@ -0,0 +1,25 @@
<?php
namespace LanguageServer;
use PhpParser;
/**
* Custom PHP Parser class configured for our needs
*/
class Parser extends PhpParser\Parser\Php7
{
public function __construct()
{
$lexer = new PhpParser\Lexer([
'usedAttributes' => [
'comments',
'startLine',
'endLine',
'startFilePos',
'endFilePos'
]
]);
parent::__construct($lexer);
}
}

View File

@ -13,7 +13,7 @@ use LanguageServer\NodeVisitor\{
ReferencesCollector, ReferencesCollector,
VariableReferencesCollector VariableReferencesCollector
}; };
use PhpParser\{Error, Node, NodeTraverser, Parser}; use PhpParser\{Error, ErrorHandler, Node, NodeTraverser};
use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\NameResolver;
use phpDocumentor\Reflection\DocBlockFactory; use phpDocumentor\Reflection\DocBlockFactory;
use function LanguageServer\Fqn\{getDefinedFqn, getVariableDefinition, getReferencedFqn}; use function LanguageServer\Fqn\{getDefinedFqn, getVariableDefinition, getReferencedFqn};
@ -133,19 +133,12 @@ class PhpDocument
{ {
$this->content = $content; $this->content = $content;
$stmts = null; $stmts = null;
$errors = [];
try {
$stmts = $this->parser->parse($content);
} catch (\PhpParser\Error $e) {
// Lexer can throw errors. e.g for unterminated comments
// unfortunately we don't get a location back
$errors[] = $e;
}
$errors = array_merge($this->parser->getErrors(), $errors); $errorHandler = new ErrorHandler\Collecting;
$stmts = $this->parser->parse($content, $errorHandler);
$diagnostics = []; $diagnostics = [];
foreach ($errors as $error) { foreach ($errorHandler->getErrors() as $error) {
$diagnostics[] = Diagnostic::fromError($error, $this->content, DiagnosticSeverity::ERROR, 'php'); $diagnostics[] = Diagnostic::fromError($error, $this->content, DiagnosticSeverity::ERROR, 'php');
} }
@ -154,7 +147,7 @@ class PhpDocument
$traverser = new NodeTraverser; $traverser = new NodeTraverser;
// Resolve aliased names to FQNs // Resolve aliased names to FQNs
$traverser->addVisitor(new NameResolver); $traverser->addVisitor(new NameResolver($errorHandler));
// Add parentNode, previousSibling, nextSibling attributes // Add parentNode, previousSibling, nextSibling attributes
$traverser->addVisitor(new ReferencesAdder($this)); $traverser->addVisitor(new ReferencesAdder($this));

View File

@ -5,7 +5,6 @@ namespace LanguageServer;
use LanguageServer\Protocol\SymbolInformation; use LanguageServer\Protocol\SymbolInformation;
use phpDocumentor\Reflection\DocBlockFactory; use phpDocumentor\Reflection\DocBlockFactory;
use PhpParser\{ParserFactory, Lexer};
class Project class Project
{ {
@ -34,7 +33,7 @@ class Project
/** /**
* Instance of the PHP parser * Instance of the PHP parser
* *
* @var ParserAbstract * @var Parser
*/ */
private $parser; private $parser;
@ -56,8 +55,7 @@ class Project
{ {
$this->client = $client; $this->client = $client;
$lexer = new Lexer(['usedAttributes' => ['comments', 'startLine', 'endLine', 'startFilePos', 'endFilePos']]); $this->parser = new Parser;
$this->parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7, $lexer, ['throwOnError' => false]);
$this->docBlockFactory = DocBlockFactory::createInstance(); $this->docBlockFactory = DocBlockFactory::createInstance();
} }

View File

@ -4,9 +4,9 @@ declare(strict_types = 1);
namespace LanguageServer\Tests\Server\TextDocument; namespace LanguageServer\Tests\Server\TextDocument;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use PhpParser\{ParserFactory, NodeTraverser, Node}; use PhpParser\{NodeTraverser, Node};
use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\NameResolver;
use LanguageServer\{LanguageClient, Project, PhpDocument}; use LanguageServer\{LanguageClient, Project, PhpDocument, Parser};
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\NodeVisitor\{ReferencesAdder, DefinitionCollector}; use LanguageServer\NodeVisitor\{ReferencesAdder, DefinitionCollector};
use function LanguageServer\pathToUri; use function LanguageServer\pathToUri;
@ -17,7 +17,7 @@ class DefinitionCollectorTest extends TestCase
{ {
$client = new LanguageClient(new MockProtocolStream()); $client = new LanguageClient(new MockProtocolStream());
$project = new Project($client); $project = new Project($client);
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7); $parser = new Parser;
$uri = pathToUri(realpath(__DIR__ . '/../../fixtures/symbols.php')); $uri = pathToUri(realpath(__DIR__ . '/../../fixtures/symbols.php'));
$document = $project->loadDocument($uri); $document = $project->loadDocument($uri);
$traverser = new NodeTraverser; $traverser = new NodeTraverser;
@ -56,7 +56,7 @@ class DefinitionCollectorTest extends TestCase
{ {
$client = new LanguageClient(new MockProtocolStream()); $client = new LanguageClient(new MockProtocolStream());
$project = new Project($client); $project = new Project($client);
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7); $parser = new Parser;
$uri = pathToUri(realpath(__DIR__ . '/../../fixtures/references.php')); $uri = pathToUri(realpath(__DIR__ . '/../../fixtures/references.php'));
$document = $project->loadDocument($uri); $document = $project->loadDocument($uri);
$traverser = new NodeTraverser; $traverser = new NodeTraverser;