1
0
Fork 0

Fixes #59: Handle correctly negative endLine in PHP Parser errors (#62)

* Fixes #59: Handle correctly negative endLine in PHP Parser errors

* Clearer $startLine calculation

* Add missing test file

* Better calculation of endLine

* Remove trailing spaces
pull/64/head^2
Kaloyan Raev 2016-10-11 11:15:20 +03:00 committed by Felix Becker
parent e75c1592fc
commit 1f808c59e1
3 changed files with 48 additions and 20 deletions

View File

@ -0,0 +1,5 @@
<?php
echo "Hello";
namespace A;

View File

@ -176,10 +176,11 @@ class PhpDocument
$diagnostics = [];
foreach ($errors as $error) {
$diagnostic = new Diagnostic();
$diagnostic->range = new Range(
new Position($error->getStartLine() - 1, $error->hasColumnInfo() ? $error->getStartColumn($this->content) - 1 : 0),
new Position($error->getEndLine() - 1, $error->hasColumnInfo() ? $error->getEndColumn($this->content) : 0)
);
$startLine = max($error->getStartLine() - 1, 0);
$startColumn = $error->hasColumnInfo() ? $error->getStartColumn($this->content) - 1 : 0;
$endLine = max($error->getEndLine() - 1, $startLine);
$endColumn = $error->hasColumnInfo() ? $error->getEndColumn($this->content) : 0;
$diagnostic->range = new Range(new Position($startLine, $startColumn), new Position($endLine, $endColumn));
$diagnostic->severity = DiagnosticSeverity::ERROR;
$diagnostic->source = 'php';
// Do not include "on line ..." in the error message

View File

@ -15,18 +15,12 @@ class ParseErrorsTest extends TestCase
*/
private $textDocument;
private $args;
public function setUp()
{
$client = new LanguageClient(new MockProtocolStream());
$project = new Project($client);
$this->textDocument = new Server\TextDocument($project, $client);
}
public function testParseErrorsArePublishedAsDiagnostics()
{
$args = null;
$client = new LanguageClient(new MockProtocolStream());
$client->textDocument = new class($args) extends Client\TextDocument {
$client->textDocument = new class($this->args) extends Client\TextDocument {
private $args;
public function __construct(&$args)
{
@ -38,18 +32,22 @@ class ParseErrorsTest extends TestCase
$this->args = func_get_args();
}
};
$project = new Project($client);
$this->textDocument = new Server\TextDocument($project, $client);
}
$textDocument = new Server\TextDocument($project, $client);
// Trigger parsing of source
private function openFile($file) {
$textDocumentItem = new TextDocumentItem();
$textDocumentItem->uri = 'whatever';
$textDocumentItem->languageId = 'php';
$textDocumentItem->version = 1;
$textDocumentItem->text = file_get_contents(__DIR__ . '/../../../fixtures/invalid_file.php');
$textDocument->didOpen($textDocumentItem);
$textDocumentItem->text = file_get_contents($file);
$this->textDocument->didOpen($textDocumentItem);
}
public function testParseErrorsArePublishedAsDiagnostics()
{
$this->openFile(__DIR__ . '/../../../fixtures/invalid_file.php');
$this->assertEquals([
'whatever',
[[
@ -68,6 +66,30 @@ class ParseErrorsTest extends TestCase
'source' => 'php',
'message' => "Syntax error, unexpected T_CLASS, expecting T_STRING"
]]
], json_decode(json_encode($args), true));
], json_decode(json_encode($this->args), true));
}
public function testParseErrorsWithOnlyStartLine()
{
$this->openFile(__DIR__ . '/../../../fixtures/namespace_not_first.php');
$this->assertEquals([
'whatever',
[[
'range' => [
'start' => [
'line' => 4,
'character' => 0
],
'end' => [
'line' => 4,
'character' => 0
]
],
'severity' => DiagnosticSeverity::ERROR,
'code' => null,
'source' => 'php',
'message' => "Namespace declaration statement has to be the very first statement in the script"
]]
], json_decode(json_encode($this->args), true));
}
}