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 all 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...

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

namespace Phpactor\Extension;

use Phpactor\LanguageServerProtocol\ClientCapabilities;

abstract class AbstractHandler
{
/**
* @var ClientCapabilities
*/
protected $clientCapabilities;

public function __construct(ClientCapabilities $clientCapabilities)
{
$this->clientCapabilities = $clientCapabilities;
Copy link
Contributor

@dantleech dantleech Jan 25, 2022

Choose a reason for hiding this comment

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

I'd rather avoid generalizing abstract classes. Not all handlers need to know the client capabilities, and chances are you need to override the constructor anyways.

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 can move back those duplicates if you want.

Indeed, I forgotten to update some handlers to be depend on the client capabilities.

}
}
26 changes: 14 additions & 12 deletions lib/LanguageServerCompletion/Handler/CompletionHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@
use Amp\CancelledException;
use Amp\Delayed;
use Amp\Promise;
use Phpactor\Extension\AbstractHandler;
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;
use Phpactor\LanguageServerProtocol\CompletionParams;
use Phpactor\LanguageServerProtocol\InsertTextFormat;
use Phpactor\LanguageServerProtocol\Range;
use Phpactor\LanguageServerProtocol\ServerCapabilities;
use Phpactor\LanguageServerProtocol\SignatureHelpOptions;
use Phpactor\LanguageServerProtocol\TextDocumentItem;
use Phpactor\LanguageServerProtocol\TextEdit;
use Phpactor\Completion\Core\Suggestion;
Expand All @@ -28,7 +29,7 @@
use Phpactor\LanguageServer\Core\Workspace\Workspace;
use Phpactor\TextDocument\TextDocumentBuilder;

class CompletionHandler implements Handler, CanRegisterCapabilities
class CompletionHandler extends AbstractHandler implements Handler, CanRegisterCapabilities
{
/**
* @var TypedCompletorRegistry
Expand All @@ -50,11 +51,6 @@ class CompletionHandler implements Handler, CanRegisterCapabilities
*/
private $workspace;

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

/**
* @var NameImporter
*/
Expand All @@ -65,15 +61,15 @@ public function __construct(
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;
parent::__construct($clientCapabilities);
}

public function methods(): array
Expand Down Expand Up @@ -142,8 +138,9 @@ 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;
}

private function determineInsertTextAndFormat(
Expand All @@ -154,7 +151,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 +167,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
13 changes: 8 additions & 5 deletions lib/LanguageServerCompletion/Handler/SignatureHelpHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
namespace Phpactor\Extension\LanguageServerCompletion\Handler;

use Amp\Promise;
use Phpactor\Extension\AbstractHandler;
use Phpactor\Extension\LanguageServerBridge\Converter\PositionConverter;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\Position;
use Phpactor\LanguageServerProtocol\ServerCapabilities;
use Phpactor\LanguageServerProtocol\SignatureHelp;
Expand All @@ -17,7 +19,7 @@
use Phpactor\LanguageServer\Core\Workspace\Workspace;
use Phpactor\TextDocument\TextDocumentBuilder;

class SignatureHelpHandler implements Handler, CanRegisterCapabilities
class SignatureHelpHandler extends AbstractHandler implements Handler, CanRegisterCapabilities
{
/**
* @var Workspace
Expand All @@ -29,10 +31,11 @@ class SignatureHelpHandler implements Handler, CanRegisterCapabilities
*/
private $helper;

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

/**
Expand Down Expand Up @@ -67,8 +70,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,16 +5,16 @@
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;
use Phpactor\Extension\LanguageServerCompletion\Util\SuggestionNameFormatter;
use Phpactor\Extension\LanguageServer\LanguageServerExtension;
use Phpactor\Extension\LanguageServerCompletion\Handler\CompletionHandler;
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 +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,13 +62,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);
}
}
17 changes: 12 additions & 5 deletions lib/LanguageServerHover/Handler/HoverHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
namespace Phpactor\Extension\LanguageServerHover\Handler;

use Amp\Promise;
use Phpactor\Extension\AbstractHandler;
use Phpactor\Extension\LanguageServerBridge\Converter\PositionConverter;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\Hover;
use Phpactor\LanguageServerProtocol\MarkupContent;
use Phpactor\LanguageServerProtocol\Position;
Expand All @@ -26,7 +28,7 @@
use Phpactor\WorseReflection\Core\Type;
use Phpactor\WorseReflection\Reflector;

class HoverHandler implements Handler, CanRegisterCapabilities
class HoverHandler extends AbstractHandler implements Handler, CanRegisterCapabilities
{
/**
* @var Reflector
Expand All @@ -43,11 +45,16 @@ class HoverHandler implements Handler, CanRegisterCapabilities
*/
private $workspace;

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

public function methods(): array
Expand All @@ -73,7 +80,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 +96,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
10 changes: 6 additions & 4 deletions lib/LanguageServerHover/LanguageServerHoverExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
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;
Expand All @@ -15,10 +16,10 @@
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 +48,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 +73,7 @@ public function load(ContainerBuilder $container): void
foreach ($paths as $path) {
$builder = $builder->addTemplatePath($path);
}

return $builder->build();
});
}
Expand Down
9 changes: 6 additions & 3 deletions lib/LanguageServerIndexer/Handler/WorkspaceSymbolHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,26 @@
namespace Phpactor\Extension\LanguageServerIndexer\Handler;

use Amp\Promise;
use Phpactor\Extension\AbstractHandler;
use Phpactor\Extension\LanguageServerIndexer\Model\WorkspaceSymbolProvider;
use Phpactor\LanguageServerProtocol\ClientCapabilities;
use Phpactor\LanguageServerProtocol\ServerCapabilities;
use Phpactor\LanguageServerProtocol\SymbolInformation;
use Phpactor\LanguageServerProtocol\WorkspaceSymbolParams;
use Phpactor\LanguageServer\Core\Handler\CanRegisterCapabilities;
use Phpactor\LanguageServer\Core\Handler\Handler;

class WorkspaceSymbolHandler implements Handler, CanRegisterCapabilities
class WorkspaceSymbolHandler extends AbstractHandler implements Handler, CanRegisterCapabilities
{
/**
* @var WorkspaceSymbolProvider
*/
private $provider;

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

public function methods(): array
Expand All @@ -42,6 +45,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
Loading