Skip to content

Commit 25eb2c9

Browse files
authored
feat: Implement textDocument/xevaluatableExpression (#58)
* Implement textDocument/xevaluatableExpression * phpcs * Expose xevaluatableExpressionProvider experimental server capability. * Add new server capability.
1 parent 1f55e86 commit 25eb2c9

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/LanguageServer.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,9 @@ public function initialize(ClientCapabilities $capabilities, string $rootPath =
307307
$serverCapabilities->xworkspaceReferencesProvider = true;
308308
$serverCapabilities->xdefinitionProvider = true;
309309
$serverCapabilities->xdependenciesProvider = true;
310+
$serverCapabilities->experimental = [
311+
'xevaluatableExpressionProvider' => true,
312+
];
310313

311314
return new InitializeResult($serverCapabilities);
312315
});

src/Server/TextDocument.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,4 +426,34 @@ public function xdefinition(TextDocumentIdentifier $textDocument, Position $posi
426426
return [new SymbolLocationInformation($descriptor, $def->symbolInformation->location)];
427427
});
428428
}
429+
430+
/**
431+
* Return an evaluatable exrpession under the cursor for the debugger.
432+
*
433+
* @param TextDocumentIdentifier $textDocument The text document
434+
* @param Position $position The position inside the text document
435+
* @return Promise <EE>
436+
*/
437+
public function xevaluatableExpression(TextDocumentIdentifier $textDocument, Position $position): Promise
438+
{
439+
return coroutine(function () use ($textDocument, $position) {
440+
$document = yield $this->documentLoader->getOrLoad($textDocument->uri);
441+
// Find the node under the cursor
442+
$node = $document->getNodeAtPosition($position);
443+
if ($node === null) {
444+
return null;
445+
}
446+
if (
447+
$node instanceof Node\Expression\Variable ||
448+
$node instanceof Node\Parameter ||
449+
$node instanceof Node\Expression\SubscriptExpression ||
450+
$node instanceof Node\Expression\MemberAccessExpression ||
451+
(($node2 = $node->getFirstAncestor(Node\Expression\SubscriptExpression::class)) && ($node = $node2))
452+
) {
453+
$range = RangeFactory::fromNode($node);
454+
return [ 'expression' => $node->getText(), 'range' => $range ];
455+
}
456+
return null;
457+
});
458+
}
429459
}

tests/LanguageServerTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ public function testInitialize()
4747
$serverCapabilities->xworkspaceReferencesProvider = true;
4848
$serverCapabilities->xdefinitionProvider = true;
4949
$serverCapabilities->xdependenciesProvider = true;
50+
$serverCapabilities->experimental = [
51+
'xevaluatableExpressionProvider' => true,
52+
];
5053

5154
$this->assertEquals(new InitializeResult($serverCapabilities), $result);
5255
}

0 commit comments

Comments
 (0)