This repository was archived by the owner on Mar 6, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathGotoDefinitionHandler.php
More file actions
86 lines (73 loc) · 2.66 KB
/
Copy pathGotoDefinitionHandler.php
File metadata and controls
86 lines (73 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
namespace Phpactor\Extension\LanguageServerReferenceFinder\Handler;
use Amp\Promise;
use Phpactor\Extension\LanguageServerBridge\Converter\PositionConverter;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\DefinitionParams;
use Phpactor\LanguageServerProtocol\ServerCapabilities;
use Phpactor\Extension\LanguageServerBridge\Converter\LocationConverter;
use Phpactor\LanguageServer\Core\Handler\CanRegisterCapabilities;
use Phpactor\LanguageServer\Core\Handler\Handler;
use Phpactor\LanguageServer\Core\Workspace\Workspace;
use Phpactor\ReferenceFinder\DefinitionLocator;
use Phpactor\ReferenceFinder\Exception\CouldNotLocateDefinition;
use Phpactor\TextDocument\TextDocumentBuilder;
class GotoDefinitionHandler implements Handler, CanRegisterCapabilities
{
/**
* @var DefinitionLocator
*/
private $definitionLocator;
/**
* @var Workspace
*/
private $workspace;
/**
* @var LocationConverter
*/
private $locationConverter;
/**
* @var ClientCapabilities
*/
private ClientCapabilities $clientCapabilities;
public function __construct(
Workspace $workspace,
DefinitionLocator $definitionLocator,
LocationConverter $locationConverter,
ClientCapabilities $clientCapabilities
) {
$this->definitionLocator = $definitionLocator;
$this->workspace = $workspace;
$this->locationConverter = $locationConverter;
$this->clientCapabilities = $clientCapabilities;
}
public function methods(): array
{
return [
'textDocument/definition' => 'definition',
];
}
public function definition(
DefinitionParams $params
): Promise {
return \Amp\call(function () use ($params) {
$textDocument = $this->workspace->get($params->textDocument->uri);
$offset = PositionConverter::positionToByteOffset($params->position, $textDocument->text);
try {
$location = $this->definitionLocator->locateDefinition(
TextDocumentBuilder::create(
$textDocument->text
)->uri($textDocument->uri)->language('php')->build(),
$offset
);
} catch (CouldNotLocateDefinition $couldNotLocateDefinition) {
return null;
}
return $this->locationConverter->toLspLocation($location);
});
}
public function registerCapabiltiies(ServerCapabilities $capabilities): void
{
$capabilities->definitionProvider = null !== $this->clientCapabilities->textDocument->definition;
}
}