Skip to content
This repository was archived by the owner on Mar 6, 2022. It is now read-only.

Allow to disable selected capabilities by the client #58

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .php_cs.dist → .php-cs-fixer.dist.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
])
;

return PhpCsFixer\Config::create()
return (new PhpCsFixer\Config())
->setRiskyAllowed(true)
->setRules([
'@PSR2' => true,
Expand All @@ -22,4 +22,3 @@
])
->setFinder($finder)
;

28 changes: 19 additions & 9 deletions lib/LanguageServerCompletion/Handler/CompletionHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Phpactor\Extension\LanguageServerBridge\Converter\PositionConverter;
use Phpactor\Extension\LanguageServerCodeTransform\Model\NameImport\NameImporter;
use Phpactor\Extension\LanguageServerCodeTransform\Model\NameImport\NameImporterResult;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\CompletionItem;
use Phpactor\LanguageServerProtocol\CompletionList;
use Phpactor\LanguageServerProtocol\CompletionOptions;
Expand Down Expand Up @@ -51,29 +52,29 @@ class CompletionHandler implements Handler, CanRegisterCapabilities
private $workspace;

/**
* @var bool
* @var NameImporter
*/
private $supportSnippets;
private $nameImporter;

/**
* @var NameImporter
* @var ClientCapabilities
*/
private $nameImporter;
private ClientCapabilities $clientCapabilities;

public function __construct(
Workspace $workspace,
TypedCompletorRegistry $registry,
SuggestionNameFormatter $suggestionNameFormatter,
NameImporter $nameImporter,
bool $supportSnippets,
ClientCapabilities $clientCapabilities,
bool $provideTextEdit = false
) {
$this->registry = $registry;
$this->provideTextEdit = $provideTextEdit;
$this->workspace = $workspace;
$this->suggestionNameFormatter = $suggestionNameFormatter;
$this->nameImporter = $nameImporter;
$this->supportSnippets = $supportSnippets;
$this->clientCapabilities = $clientCapabilities;
}

public function methods(): array
Expand Down Expand Up @@ -142,8 +143,12 @@ public function completion(CompletionParams $params, CancellationToken $token):

public function registerCapabiltiies(ServerCapabilities $capabilities): void
{
$capabilities->completionProvider = new CompletionOptions([':', '>', '$']);
$capabilities->signatureHelpProvider = new SignatureHelpOptions(['(', ',']);
$capabilities->completionProvider = (null !== $this->clientCapabilities->textDocument->completion)
? new CompletionOptions([':', '>', '$'])
: null;
$capabilities->signatureHelpProvider = (null !== $this->clientCapabilities->textDocument->signatureHelp)
? new SignatureHelpOptions(['(', ','])
: null;
}

private function determineInsertTextAndFormat(
Expand All @@ -154,7 +159,7 @@ private function determineInsertTextAndFormat(
$insertText = $name;
$insertTextFormat = InsertTextFormat::PLAIN_TEXT;

if ($this->supportSnippets) {
if ($this->supportSnippets()) {
$insertText = $suggestion->snippet() ?: $name;
$insertTextFormat = $suggestion->snippet()
? InsertTextFormat::SNIPPET
Expand All @@ -170,6 +175,11 @@ private function determineInsertTextAndFormat(
return [$insertText, $insertTextFormat];
}

private function supportSnippets(): bool
{
return $this->clientCapabilities->textDocument->completion->completionItem['snippetSupport'] ?? false;
}

private function importClassOrFunctionName(
Suggestion $suggestion,
CompletionParams $params
Expand Down
15 changes: 11 additions & 4 deletions lib/LanguageServerCompletion/Handler/SignatureHelpHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Amp\Promise;
use Phpactor\Extension\LanguageServerBridge\Converter\PositionConverter;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\Position;
use Phpactor\LanguageServerProtocol\ServerCapabilities;
use Phpactor\LanguageServerProtocol\SignatureHelp;
Expand All @@ -29,10 +30,16 @@ class SignatureHelpHandler implements Handler, CanRegisterCapabilities
*/
private $helper;

public function __construct(Workspace $workspace, SignatureHelper $helper)
/**
* @var ClientCapabilities
*/
private ClientCapabilities $clientCapabilities;

public function __construct(Workspace $workspace, SignatureHelper $helper, ClientCapabilities $clientCapabilities)
{
$this->workspace = $workspace;
$this->helper = $helper;
$this->clientCapabilities = $clientCapabilities;
}

/**
Expand Down Expand Up @@ -67,8 +74,8 @@ public function signatureHelp(

public function registerCapabiltiies(ServerCapabilities $capabilities): void
{
$options = new SignatureHelpOptions();
$options->triggerCharacters = [ '(', ',' ];
$capabilities->signatureHelpProvider = $options;
$capabilities->signatureHelpProvider = (null !== $this->clientCapabilities->textDocument->signatureHelp)
? new SignatureHelpOptions(['(', ','])
: null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ private function registerHandlers(ContainerBuilder $container): void
$container->get(CompletionExtension::SERVICE_REGISTRY),
$container->get(SuggestionNameFormatter::class),
$container->get(NameImporter::class),
$this->clientCapabilities($container)->textDocument->completion->completionItem['snippetSupport'] ?? false
$this->clientCapabilities($container)
);
}, [ LanguageServerExtension::TAG_METHOD_HANDLER => [
'methods' => [
Expand All @@ -62,7 +62,8 @@ private function registerHandlers(ContainerBuilder $container): void
$container->register('language_server_completion.handler.signature_help', function (Container $container) {
return new SignatureHelpHandler(
$container->get(LanguageServerExtension::SERVICE_SESSION_WORKSPACE),
$container->get(CompletionExtension::SERVICE_SIGNATURE_HELPER)
$container->get(CompletionExtension::SERVICE_SIGNATURE_HELPER),
$this->clientCapabilities($container)
);
}, [ LanguageServerExtension::TAG_METHOD_HANDLER => [] ]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@
use Phpactor\CodeTransform\Domain\Refactor\ImportClass\NameImport;
use Phpactor\Extension\LanguageServerCodeTransform\Model\NameImport\NameImporter;
use Phpactor\Extension\LanguageServerCodeTransform\Model\NameImport\NameImporterResult;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\CompletionClientCapabilities;
use Phpactor\LanguageServerProtocol\CompletionItem;
use Phpactor\LanguageServerProtocol\CompletionList;
use Phpactor\LanguageServerProtocol\Position;
use Phpactor\LanguageServerProtocol\Range;
use Phpactor\LanguageServerProtocol\TextDocumentClientCapabilities;
use Phpactor\LanguageServerProtocol\TextEdit;
use PHPUnit\Framework\TestCase;
use Phpactor\Completion\Core\Completor;
Expand Down Expand Up @@ -46,6 +49,34 @@ public function testHandleNoSuggestions(): void
$this->assertFalse($response->result->isIncomplete);
}

public function testHandleWithDisabledCapability(): void
{
$tester = $this->create(
[
Suggestion::create('hello'),
Suggestion::create('goodbye'),
],
true,
false,
[],
[],
false
);
$response = $tester->requestAndWait(
'textDocument/completion',
[
'textDocument' => ProtocolFactory::textDocumentIdentifier(self::EXAMPLE_URI),
'position' => ProtocolFactory::position(0, 0)
]
);
$this->assertInstanceOf(CompletionList::class, $response->result);
$this->assertEquals([
self::completionItem('hello', null),
self::completionItem('goodbye', null),
], $response->result->items);
$this->assertFalse($response->result->isIncomplete);
}

public function testHandleACompleteListOfSuggestions(): void
{
$tester = $this->create([
Expand Down Expand Up @@ -377,7 +408,8 @@ private function create(
bool $supportSnippets = true,
bool $isIncomplete = false,
array $importNameTextEdits = [],
array $aliases = []
array $aliases = [],
bool $supportCompletion = true
): LanguageServerTester {
$completor = $this->createCompletor($suggestions, $isIncomplete);
$registry = new TypedCompletorRegistry([
Expand All @@ -389,14 +421,36 @@ private function create(
$registry,
new SuggestionNameFormatter(true),
$this->createNameImporter($suggestions, $aliases, $importNameTextEdits),
$supportSnippets,
$this->createClientCapabilities($supportCompletion, $supportSnippets),
true
))->build();
$tester->textDocument()->open(self::EXAMPLE_URI, self::EXAMPLE_TEXT);

return $tester;
}

private function createClientCapabilities(
bool $completion = true,
bool $supportSnippets = true,
): ClientCapabilities {
$capabilities = new ClientCapabilities();
$capabilities->textDocument = new TextDocumentClientCapabilities();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can call Client capabilities::fromArray() or similar if it helps to generalize.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know about it but in this case building the array would look similar.


if (false === $completion) {
return $capabilities;
}

$completionCapabilities = new CompletionClientCapabilities();

if ($supportSnippets) {
$completionCapabilities->completionItem['snippetSupport'] = true;
}

$capabilities->textDocument->completion = $completionCapabilities;

return $capabilities;
}

/**
* @param array<Suggestion> $suggestions
* @param array<string|null> $aliases
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

namespace Phpactor\Extension\LanguageServerCompletion\Tests\Unit\Handler;

use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\SignatureHelp as LspSignatureHelp;
use Phpactor\LanguageServerProtocol\SignatureHelpClientCapabilities;
use Phpactor\LanguageServerProtocol\TextDocumentClientCapabilities;
use Phpactor\LanguageServerProtocol\TextDocumentIdentifier;
use PHPUnit\Framework\TestCase;
use Phpactor\Completion\Core\SignatureHelp;
Expand Down Expand Up @@ -38,10 +41,27 @@ private function create(array $suggestions): LanguageServerTester
$builder = LanguageServerTesterBuilder::create();
return $builder->addHandler(new SignatureHelpHandler(
$builder->workspace(),
$this->createHelper()
$this->createHelper(),
$this->createClientCapabilities(true)
))->build();
}

private function createClientCapabilities(
bool $supportSignatureHelp = true
): ClientCapabilities {
$capabilities = new ClientCapabilities();
$capabilities->textDocument = new TextDocumentClientCapabilities();

if (false === $supportSignatureHelp) {
return $capabilities;
}

$signatureHelpCapabilities = new SignatureHelpClientCapabilities();
$capabilities->textDocument->signatureHelp = $signatureHelpCapabilities;

return $capabilities;
}

private function createHelper(): SignatureHelper
{
return new class() implements SignatureHelper {
Expand Down