Skip to content
This repository has been 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 9 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)
;

14 changes: 14 additions & 0 deletions lib/AbstractExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Phpactor\Extension;

use Phpactor\Container\Container;
use Phpactor\LanguageServerProtocol\ClientCapabilities;

abstract class AbstractExtension
{
protected function clientCapabilities(Container $container): ClientCapabilities
{
return $container->get(ClientCapabilities::class);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

as below, i'd rather avoid this...

}
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 @@ -5,6 +5,7 @@
use Phpactor\Container\Container;
use Phpactor\Container\ContainerBuilder;
use Phpactor\Container\Extension;
use Phpactor\Extension\AbstractExtension;
use Phpactor\Extension\Completion\CompletionExtension;
use Phpactor\Extension\LanguageServerCodeTransform\Model\NameImport\NameImporter;
use Phpactor\Extension\LanguageServerCompletion\Handler\SignatureHelpHandler;
Expand All @@ -14,7 +15,7 @@
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\MapResolver\Resolver;

class LanguageServerCompletionExtension implements Extension
class LanguageServerCompletionExtension extends AbstractExtension implements Extension
{
private const PARAM_TRIM_LEADING_DOLLAR = 'language_server_completion.trim_leading_dollar';

Expand Down Expand Up @@ -47,7 +48,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,13 +63,9 @@ 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 => [] ]);
}

private function clientCapabilities(Container $container): ClientCapabilities
{
return $container->get(ClientCapabilities::class);
}
}
19 changes: 15 additions & 4 deletions lib/LanguageServerHover/Handler/HoverHandler.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\Hover;
use Phpactor\LanguageServerProtocol\MarkupContent;
use Phpactor\LanguageServerProtocol\Position;
Expand Down Expand Up @@ -43,11 +44,21 @@ class HoverHandler implements Handler, CanRegisterCapabilities
*/
private $workspace;

public function __construct(Workspace $workspace, Reflector $reflector, ObjectRenderer $renderer)
{
/**
* @var ClientCapabilities
*/
private ClientCapabilities $clientCapabilities;

public function __construct(
Workspace $workspace,
Reflector $reflector,
ObjectRenderer $renderer,
ClientCapabilities $clientCapabilities
) {
$this->reflector = $reflector;
$this->renderer = $renderer;
$this->workspace = $workspace;
$this->clientCapabilities = $clientCapabilities;
}

public function methods(): array
Expand All @@ -73,7 +84,7 @@ public function hover(
$symbolContext = $offsetReflection->symbolContext();
$info = $this->infoFromReflecionOffset($offsetReflection);
$string = new MarkupContent('markdown', $info);

return new Hover($string, new Range(
PositionConverter::byteOffsetToPosition(
ByteOffset::fromInt($symbolContext->symbol()->position()->start()),
Expand All @@ -89,7 +100,7 @@ public function hover(

public function registerCapabiltiies(ServerCapabilities $capabilities): void
{
$capabilities->hoverProvider = true;
$capabilities->hoverProvider = null !== $this->clientCapabilities->textDocument->hover;
}

private function infoFromReflecionOffset(ReflectionOffset $offset): string
Expand Down
11 changes: 7 additions & 4 deletions lib/LanguageServerHover/LanguageServerHoverExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,22 @@
use Phpactor\CodeBuilder\Domain\TemplatePathResolver\PhpVersionPathResolver;
use Phpactor\Container\Container;
use Phpactor\Container\ContainerBuilder;
use Phpactor\Extension\AbstractExtension;
use Phpactor\Extension\Logger\LoggingExtension;
use Phpactor\Extension\Php\Model\PhpVersionResolver;
use Phpactor\Extension\WorseReflection\WorseReflectionExtension;
use Phpactor\FilePathResolverExtension\FilePathResolverExtension;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\ObjectRenderer\ObjectRendererBuilder;
use Phpactor\Extension\LanguageServer\LanguageServerExtension;
use Phpactor\Extension\LanguageServerHover\Handler\HoverHandler;
use Phpactor\Container\Extension;
use Phpactor\MapResolver\Resolver;

class LanguageServerHoverExtension implements Extension
class LanguageServerHoverExtension extends AbstractExtension implements Extension
{
public const PARAM_TEMPLATE_PATHS = 'language_server_hover.template_paths';

private const SERVICE_MARKDOWN_RENDERER = 'language_server_completion.object_renderer.markdown';

/**
Expand Down Expand Up @@ -47,7 +49,8 @@ public function load(ContainerBuilder $container): void
return new HoverHandler(
$container->get(LanguageServerExtension::SERVICE_SESSION_WORKSPACE),
$container->get(WorseReflectionExtension::SERVICE_REFLECTOR),
$container->get(self::SERVICE_MARKDOWN_RENDERER)
$container->get(self::SERVICE_MARKDOWN_RENDERER),
$this->clientCapabilities($container)
);
}, [ LanguageServerExtension::TAG_METHOD_HANDLER => []]);

Expand All @@ -71,7 +74,7 @@ public function load(ContainerBuilder $container): void
foreach ($paths as $path) {
$builder = $builder->addTemplatePath($path);
}

return $builder->build();
});
}
Expand Down
11 changes: 9 additions & 2 deletions lib/LanguageServerIndexer/Handler/WorkspaceSymbolHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Amp\Promise;
use Phpactor\Extension\LanguageServerIndexer\Model\WorkspaceSymbolProvider;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\ServerCapabilities;
use Phpactor\LanguageServerProtocol\SymbolInformation;
use Phpactor\LanguageServerProtocol\WorkspaceSymbolParams;
Expand All @@ -17,9 +18,15 @@ class WorkspaceSymbolHandler implements Handler, CanRegisterCapabilities
*/
private $provider;

public function __construct(WorkspaceSymbolProvider $provider)
/**
* @var ClientCapabilities
*/
private ClientCapabilities $clientCapabilities;

public function __construct(WorkspaceSymbolProvider $provider, ClientCapabilities $clientCapabilities)
{
$this->provider = $provider;
$this->clientCapabilities = $clientCapabilities;
}

public function methods(): array
Expand All @@ -42,6 +49,6 @@ public function symbol(

public function registerCapabiltiies(ServerCapabilities $capabilities): void
{
$capabilities->workspaceSymbolProvider = true;
$capabilities->workspaceSymbolProvider = null !== ($this->clientCapabilities->workspace['symbol'] ?? null);
}
}
6 changes: 4 additions & 2 deletions lib/LanguageServerIndexer/LanguageServerIndexerExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Phpactor\Container\Container;
use Phpactor\Container\ContainerBuilder;
use Phpactor\Container\Extension;
use Phpactor\Extension\AbstractExtension;
use Phpactor\Extension\LanguageServerIndexer\Handler\IndexerHandler;
use Phpactor\Extension\LanguageServerIndexer\Handler\WorkspaceSymbolHandler;
use Phpactor\Extension\LanguageServerIndexer\Listener\ReindexListener;
Expand All @@ -23,7 +24,7 @@
use Phpactor\TextDocument\TextDocumentLocator;
use Psr\EventDispatcher\EventDispatcherInterface;

class LanguageServerIndexerExtension implements Extension
class LanguageServerIndexerExtension extends AbstractExtension implements Extension
{
public const WORKSPACE_SYMBOL_SEARCH_LIMIT = 'language_server_indexer.workspace_symbol_search_limit';

Expand All @@ -40,7 +41,8 @@ public function load(ContainerBuilder $container): void
$container->get(SearchClient::class),
$container->get(TextDocumentLocator::class),
$container->getParameter(self::WORKSPACE_SYMBOL_SEARCH_LIMIT)
)
),
$this->clientCapabilities($container)
);
}, [ LanguageServerExtension::TAG_METHOD_HANDLER => [] ]);

Expand Down
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\DefinitionParams;
use Phpactor\LanguageServerProtocol\ServerCapabilities;
use Phpactor\Extension\LanguageServerBridge\Converter\LocationConverter;
Expand Down Expand Up @@ -31,11 +32,21 @@ class GotoDefinitionHandler implements Handler, CanRegisterCapabilities
*/
private $locationConverter;

public function __construct(Workspace $workspace, DefinitionLocator $definitionLocator, LocationConverter $locationConverter)
{
/**
* @var ClientCapabilities
*/
private ClientCapabilities $clientCapabilities;
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 forgotten that the whole project still depends on (unsupported) PHP 7.3 and typed properties are not allowed.

Copy link
Contributor

Choose a reason for hiding this comment

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

yeah, it would be good to bump it again. just a big PITA with 50 packages.


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
Expand Down Expand Up @@ -70,6 +81,6 @@ public function definition(

public function registerCapabiltiies(ServerCapabilities $capabilities): void
{
$capabilities->definitionProvider = true;
$capabilities->definitionProvider = null !== $this->clientCapabilities->textDocument->definition;
}
}
Loading