Skip to content

Commit 18c6ccd

Browse files
dantleechfelixfbecker
authored andcommitted
refactor: use protocol package (#661)
Adapts the Language Server to use the extracted php language server protocol
1 parent 3d8318b commit 18c6ccd

File tree

98 files changed

+189
-1820
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+189
-1820
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"php": "^7.0",
2525
"composer/xdebug-handler": "^1.0",
2626
"felixfbecker/advanced-json-rpc": "^3.0.0",
27+
"felixfbecker/language-server-protocol": "^1.0.1",
2728
"jetbrains/phpstorm-stubs": "dev-master",
2829
"microsoft/tolerant-php-parser": "0.0.*",
2930
"netresearch/jsonmapper": "^1.0",

src/Client/TextDocument.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace LanguageServer\Client;
55

66
use LanguageServer\ClientHandler;
7-
use LanguageServer\Protocol\{TextDocumentItem, TextDocumentIdentifier};
7+
use LanguageServerProtocol\{TextDocumentItem, TextDocumentIdentifier};
88
use Sabre\Event\Promise;
99
use JsonMapper;
1010

src/Client/Workspace.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace LanguageServer\Client;
55

66
use LanguageServer\ClientHandler;
7-
use LanguageServer\Protocol\TextDocumentIdentifier;
7+
use LanguageServerProtocol\TextDocumentIdentifier;
88
use Sabre\Event\Promise;
99
use JsonMapper;
1010

src/ClientHandler.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ public function request(string $method, $params): Promise
4141
{
4242
$id = $this->idGenerator->generate();
4343
return $this->protocolWriter->write(
44-
new Protocol\Message(
44+
new Message(
4545
new AdvancedJsonRpc\Request($id, $method, (object)$params)
4646
)
4747
)->then(function () use ($id) {
4848
$promise = new Promise;
49-
$listener = function (Protocol\Message $msg) use ($id, $promise, &$listener) {
49+
$listener = function (Message $msg) use ($id, $promise, &$listener) {
5050
if (AdvancedJsonRpc\Response::isResponse($msg->body) && $msg->body->id === $id) {
5151
// Received a response
5252
$this->protocolReader->removeListener('message', $listener);
@@ -72,7 +72,7 @@ public function request(string $method, $params): Promise
7272
public function notify(string $method, $params): Promise
7373
{
7474
return $this->protocolWriter->write(
75-
new Protocol\Message(
75+
new Message(
7676
new AdvancedJsonRpc\Notification($method, (object)$params)
7777
)
7878
);

src/CompletionProvider.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
namespace LanguageServer;
55

66
use LanguageServer\Index\ReadableIndex;
7-
use LanguageServer\Protocol\{
7+
use LanguageServer\Factory\CompletionItemFactory;
8+
use LanguageServerProtocol\{
89
TextEdit,
910
Range,
1011
Position,
@@ -246,7 +247,7 @@ public function provideCompletion(PhpDocument $doc, Position $pos, CompletionCon
246247
foreach ($this->index->getDefinitions() as $fqn => $def) {
247248
foreach ($prefixes as $prefix) {
248249
if (substr($fqn, 0, strlen($prefix)) === $prefix && $def->isMember) {
249-
$list->items[] = CompletionItem::fromDefinition($def);
250+
$list->items[] = CompletionItemFactory::fromDefinition($def);
250251
}
251252
}
252253
}
@@ -279,7 +280,7 @@ public function provideCompletion(PhpDocument $doc, Position $pos, CompletionCon
279280
foreach ($this->index->getDefinitions() as $fqn => $def) {
280281
foreach ($prefixes as $prefix) {
281282
if (substr(strtolower($fqn), 0, strlen($prefix)) === strtolower($prefix) && $def->isMember) {
282-
$list->items[] = CompletionItem::fromDefinition($def);
283+
$list->items[] = CompletionItemFactory::fromDefinition($def);
283284
}
284285
}
285286
}
@@ -337,7 +338,7 @@ public function provideCompletion(PhpDocument $doc, Position $pos, CompletionCon
337338
foreach ($aliases as $alias => $fqn) {
338339
// Suggest symbols that have been `use`d and match the prefix
339340
if (substr($alias, 0, $prefixLen) === $prefix && ($def = $this->index->getDefinition($fqn))) {
340-
$list->items[] = CompletionItem::fromDefinition($def);
341+
$list->items[] = CompletionItemFactory::fromDefinition($def);
341342
}
342343
}
343344
}
@@ -370,7 +371,7 @@ public function provideCompletion(PhpDocument $doc, Position $pos, CompletionCon
370371
// Only suggest classes for `new`
371372
&& (!isset($creation) || $def->canBeInstantiated)
372373
) {
373-
$item = CompletionItem::fromDefinition($def);
374+
$item = CompletionItemFactory::fromDefinition($def);
374375
// Find the shortest name to reference the symbol
375376
if ($namespaceNode && ($alias = array_search($fqn, $aliases, true)) !== false) {
376377
// $alias is the name under which this definition is aliased in the current namespace

src/ContentRetriever/ClientContentRetriever.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace LanguageServer\ContentRetriever;
55

66
use LanguageServer\LanguageClient;
7-
use LanguageServer\Protocol\{TextDocumentIdentifier, TextDocumentItem};
7+
use LanguageServerProtocol\{TextDocumentIdentifier, TextDocumentItem};
88
use Sabre\Event\Promise;
99

1010
/**

src/Definition.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
use LanguageServer\Index\ReadableIndex;
77
use phpDocumentor\Reflection\{Types, Type, Fqsen, TypeResolver};
8-
use LanguageServer\Protocol\SymbolInformation;
8+
use LanguageServerProtocol\SymbolInformation;
99
use Generator;
1010

1111
/**

src/DefinitionResolver.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
namespace LanguageServer;
55

66
use LanguageServer\Index\ReadableIndex;
7-
use LanguageServer\Protocol\SymbolInformation;
7+
use LanguageServer\Factory\SymbolInformationFactory;
8+
use LanguageServerProtocol\SymbolInformation;
89
use Microsoft\PhpParser;
910
use Microsoft\PhpParser\Node;
1011
use Microsoft\PhpParser\FunctionLike;
@@ -36,7 +37,7 @@ class DefinitionResolver
3637
private $docBlockFactory;
3738

3839
/**
39-
* Creates SignatureInformation
40+
* Creates SignatureInformation instances
4041
*
4142
* @var SignatureInformationFactory
4243
*/
@@ -233,7 +234,7 @@ public function createDefinitionFromNode(Node $node, string $fqn = null): Defini
233234
}
234235
}
235236

236-
$def->symbolInformation = SymbolInformation::fromNode($node, $fqn);
237+
$def->symbolInformation = SymbolInformationFactory::fromNode($node, $fqn);
237238

238239
if ($def->symbolInformation !== null) {
239240
$def->type = $this->getTypeFromNode($node);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace LanguageServer\Factory;
4+
5+
use LanguageServer\Definition;
6+
use LanguageServerProtocol\CompletionItem;
7+
use LanguageServerProtocol\CompletionItemKind;
8+
use LanguageServerProtocol\SymbolKind;
9+
10+
class CompletionItemFactory
11+
{
12+
/**
13+
* Creates a CompletionItem for a Definition
14+
*
15+
* @param Definition $def
16+
* @return CompletionItem|null
17+
*/
18+
public static function fromDefinition(Definition $def)
19+
{
20+
$item = new CompletionItem;
21+
$item->label = $def->symbolInformation->name;
22+
$item->kind = CompletionItemKind::fromSymbolKind($def->symbolInformation->kind);
23+
if ($def->type) {
24+
$item->detail = (string)$def->type;
25+
} else if ($def->symbolInformation->containerName) {
26+
$item->detail = $def->symbolInformation->containerName;
27+
}
28+
if ($def->documentation) {
29+
$item->documentation = $def->documentation;
30+
}
31+
if ($def->isStatic && $def->symbolInformation->kind === SymbolKind::PROPERTY) {
32+
$item->insertText = '$' . $def->symbolInformation->name;
33+
}
34+
return $item;
35+
}
36+
}

src/Factory/LocationFactory.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace LanguageServer\Factory;
4+
5+
use LanguageServerProtocol\Location;
6+
use LanguageServerProtocol\Position;
7+
use LanguageServerProtocol\Range;
8+
use Microsoft\PhpParser\Node;
9+
use Microsoft\PhpParser\PositionUtilities;
10+
11+
class LocationFactory
12+
{
13+
/**
14+
* Returns the location of the node
15+
*
16+
* @param Node $node
17+
* @return self
18+
*/
19+
public static function fromNode(Node $node): Location
20+
{
21+
$range = PositionUtilities::getRangeFromPosition(
22+
$node->getStart(),
23+
$node->getWidth(),
24+
$node->getFileContents()
25+
);
26+
27+
return new Location($node->getUri(), new Range(
28+
new Position($range->start->line, $range->start->character),
29+
new Position($range->end->line, $range->end->character)
30+
));
31+
}
32+
}

0 commit comments

Comments
 (0)