Add more tests
parent
49f16f5c3e
commit
1106521b9e
|
@ -5,6 +5,7 @@ namespace LanguageServer\Server;
|
||||||
|
|
||||||
use LanguageServer\{LanguageClient, Project};
|
use LanguageServer\{LanguageClient, Project};
|
||||||
use PhpParser\PrettyPrinter\Standard as PrettyPrinter;
|
use PhpParser\PrettyPrinter\Standard as PrettyPrinter;
|
||||||
|
use PhpParser\Node;
|
||||||
use LanguageServer\Protocol\{
|
use LanguageServer\Protocol\{
|
||||||
TextDocumentItem,
|
TextDocumentItem,
|
||||||
TextDocumentIdentifier,
|
TextDocumentIdentifier,
|
||||||
|
@ -164,21 +165,36 @@ class TextDocument
|
||||||
*
|
*
|
||||||
* @param TextDocumentIdentifier $textDocument The text document
|
* @param TextDocumentIdentifier $textDocument The text document
|
||||||
* @param Position $position The position inside the text document
|
* @param Position $position The position inside the text document
|
||||||
* @return Hover|null
|
* @return Hover
|
||||||
*/
|
*/
|
||||||
public function hover(TextDocumentIdentifier $textDocument, Position $position)
|
public function hover(TextDocumentIdentifier $textDocument, Position $position): Hover
|
||||||
{
|
{
|
||||||
$document = $this->project->getDocument($textDocument->uri);
|
$document = $this->project->getDocument($textDocument->uri);
|
||||||
|
// Find the node under the cursor
|
||||||
$node = $document->getNodeAtPosition($position);
|
$node = $document->getNodeAtPosition($position);
|
||||||
if ($node === null) {
|
if ($node === null) {
|
||||||
return null;
|
return new Hover([]);
|
||||||
}
|
}
|
||||||
|
$range = Range::fromNode($node);
|
||||||
|
// Get the definition node for whatever node is under the cursor
|
||||||
$def = $document->getDefinitionByNode($node);
|
$def = $document->getDefinitionByNode($node);
|
||||||
if ($def === null) {
|
if ($def === null) {
|
||||||
return null;
|
return new Hover([], $range);
|
||||||
}
|
}
|
||||||
$contents = [];
|
$contents = [];
|
||||||
$defLine = clone $def;
|
|
||||||
|
// Build a declaration string
|
||||||
|
if ($def instanceof Node\Stmt\PropertyProperty || $def instanceof Node\Const_) {
|
||||||
|
// Properties and constants can have multiple declarations
|
||||||
|
// Use the parent node (that includes the modifiers), but only render the requested declaration
|
||||||
|
$child = $def;
|
||||||
|
$def = $def->getAttribute('parentNode');
|
||||||
|
$defLine = clone $def;
|
||||||
|
$defLine->props = [$child];
|
||||||
|
} else {
|
||||||
|
$defLine = clone $def;
|
||||||
|
}
|
||||||
|
// Don't include the docblock in the declaration string
|
||||||
$defLine->setAttribute('comments', []);
|
$defLine->setAttribute('comments', []);
|
||||||
if (isset($defLine->stmts)) {
|
if (isset($defLine->stmts)) {
|
||||||
$defLine->stmts = [];
|
$defLine->stmts = [];
|
||||||
|
@ -188,10 +204,27 @@ class TextDocument
|
||||||
if (isset($lines[0])) {
|
if (isset($lines[0])) {
|
||||||
$contents[] = new MarkedString('php', "<?php\n" . $lines[0]);
|
$contents[] = new MarkedString('php', "<?php\n" . $lines[0]);
|
||||||
}
|
}
|
||||||
$docBlock = $def->getAttribute('docBlock');
|
|
||||||
if ($docBlock !== null) {
|
// Get the documentation string
|
||||||
$contents[] = $docBlock->getSummary();
|
if ($def instanceof Node\Param) {
|
||||||
|
$fn = $def->getAttribute('parentNode');
|
||||||
|
$docBlock = $fn->getAttribute('docBlock');
|
||||||
|
if ($docBlock !== null) {
|
||||||
|
$tags = $docBlock->getTagsByName('param');
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
if ($tag->getVariableName() === $def->name) {
|
||||||
|
$contents[] = $tag->getDescription()->render();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$docBlock = $def->getAttribute('docBlock');
|
||||||
|
if ($docBlock !== null) {
|
||||||
|
$contents[] = $docBlock->getSummary();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new Hover($contents, Range::fromNode($node));
|
|
||||||
|
return new Hover($contents, $range);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,91 @@ class HoverTest extends ServerTestCase
|
||||||
], $reference->range), $result);
|
], $reference->range), $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testHoverWithoutDocBlock()
|
public function testHoverForMethod()
|
||||||
|
{
|
||||||
|
// $obj->testMethod();
|
||||||
|
// Get hover for testMethod
|
||||||
|
$reference = $this->getReferenceLocations('TestClass::testMethod()')[0];
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($reference->uri), $reference->range->end);
|
||||||
|
$this->assertEquals(new Hover([
|
||||||
|
new MarkedString('php', "<?php\npublic function testMethod(\$testParameter)"),
|
||||||
|
'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.'
|
||||||
|
], $reference->range), $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHoverForProperty()
|
||||||
|
{
|
||||||
|
// echo $obj->testProperty;
|
||||||
|
// Get hover for testProperty
|
||||||
|
$reference = $this->getReferenceLocations('TestClass::testProperty')[0];
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($reference->uri), $reference->range->end);
|
||||||
|
$this->assertEquals(new Hover([
|
||||||
|
new MarkedString('php', "<?php\npublic \$testProperty;"),
|
||||||
|
'Reprehenderit magna velit mollit ipsum do.'
|
||||||
|
], $reference->range), $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHoverForStaticMethod()
|
||||||
|
{
|
||||||
|
// TestClass::staticTestMethod();
|
||||||
|
// Get hover for staticTestMethod
|
||||||
|
$reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0];
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($reference->uri), $reference->range->end);
|
||||||
|
$this->assertEquals(new Hover([
|
||||||
|
new MarkedString('php', "<?php\npublic static function staticTestMethod()"),
|
||||||
|
'Do magna consequat veniam minim proident eiusmod incididunt aute proident.'
|
||||||
|
], $reference->range), $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHoverForStaticProperty()
|
||||||
|
{
|
||||||
|
// echo TestClass::staticTestProperty;
|
||||||
|
// Get hover for staticTestProperty
|
||||||
|
$reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0];
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($reference->uri), $reference->range->end);
|
||||||
|
$this->assertEquals(new Hover([
|
||||||
|
new MarkedString('php', "<?php\npublic static \$staticTestProperty;"),
|
||||||
|
'Lorem excepteur officia sit anim velit veniam enim.'
|
||||||
|
], $reference->range), $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHoverForClassConstant()
|
||||||
|
{
|
||||||
|
// echo TestClass::TEST_CLASS_CONST;
|
||||||
|
// Get hover for TEST_CLASS_CONST
|
||||||
|
$reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0];
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($reference->uri), $reference->range->end);
|
||||||
|
$this->assertEquals(new Hover([
|
||||||
|
new MarkedString('php', "<?php\nconst TEST_CLASS_CONST = 123;"),
|
||||||
|
'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.'
|
||||||
|
], $reference->range), $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHoverForFunction()
|
||||||
|
{
|
||||||
|
// test_function();
|
||||||
|
// Get hover for test_function
|
||||||
|
$reference = $this->getReferenceLocations('test_function()')[0];
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($reference->uri), $reference->range->end);
|
||||||
|
$this->assertEquals(new Hover([
|
||||||
|
new MarkedString('php', "<?php\nfunction test_function()"),
|
||||||
|
'Officia aliquip adipisicing et nulla et laboris dolore labore.'
|
||||||
|
], $reference->range), $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHoverForConstant()
|
||||||
|
{
|
||||||
|
// echo TEST_CONST;
|
||||||
|
// Get hover for TEST_CONST
|
||||||
|
$reference = $this->getReferenceLocations('TEST_CONST')[0];
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($reference->uri), $reference->range->end);
|
||||||
|
$this->assertEquals(new Hover([
|
||||||
|
new MarkedString('php', "<?php\nconst TEST_CONST = 123;"),
|
||||||
|
'Esse commodo excepteur pariatur Lorem est aute incididunt reprehenderit.'
|
||||||
|
], $reference->range), $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHoverForVariable()
|
||||||
{
|
{
|
||||||
// echo $var;
|
// echo $var;
|
||||||
// Get hover for $var
|
// Get hover for $var
|
||||||
|
@ -34,4 +118,19 @@ class HoverTest extends ServerTestCase
|
||||||
new Range(new Position(13, 5), new Position(13, 9))
|
new Range(new Position(13, 5), new Position(13, 9))
|
||||||
), $result);
|
), $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testHoverForParam()
|
||||||
|
{
|
||||||
|
// echo $param;
|
||||||
|
// Get hover for $param
|
||||||
|
$uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php'));
|
||||||
|
$result = $this->textDocument->hover(new TextDocumentIdentifier($uri), new Position(22, 11));
|
||||||
|
$this->assertEquals(new Hover(
|
||||||
|
[
|
||||||
|
new MarkedString('php', "<?php\n\TestNamespace\TestClass \$param"),
|
||||||
|
'Adipisicing non non cillum sint incididunt cillum enim mollit.'
|
||||||
|
],
|
||||||
|
new Range(new Position(22, 9), new Position(22, 15))
|
||||||
|
), $result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue