Update php-parser to latest commit (#119)
parent
ed41df0062
commit
18e58b4ce8
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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));
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue