Skip to content

Commit c767573

Browse files
committed
Added example diagnostic provider and docs
1 parent 7c93dfe commit c767573

File tree

5 files changed

+92
-4
lines changed

5 files changed

+92
-4
lines changed

bin/serve.php

+13-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
use Phpactor\LanguageServerProtocol\InitializeParams;
55
use Phpactor\LanguageServer\Adapter\Psr\AggregateEventDispatcher;
66
use Phpactor\LanguageServer\Core\CodeAction\AggregateCodeActionProvider;
7+
use Phpactor\LanguageServer\Core\Diagnostics\AggregateDiagnosticsProvider;
8+
use Phpactor\LanguageServer\Core\Diagnostics\DiagnosticsEngine;
79
use Phpactor\LanguageServer\Core\Dispatcher\ArgumentResolver\ChainArgumentResolver;
810
use Phpactor\LanguageServer\Core\Dispatcher\ArgumentResolver\LanguageSeverProtocolParamsResolver;
911
use Phpactor\LanguageServer\Core\Dispatcher\ArgumentResolver\PassThroughArgumentResolver;
@@ -19,6 +21,7 @@
1921
use Phpactor\LanguageServer\Core\Workspace\Workspace;
2022
use Phpactor\LanguageServer\Example\CodeAction\SayHelloCodeActionProvider;
2123
use Phpactor\LanguageServer\Example\Command\SayHelloCommand;
24+
use Phpactor\LanguageServer\Example\Diagnostics\SayHelloDiagnosticsProvider;
2225
use Phpactor\LanguageServer\Handler\TextDocument\CodeActionHandler;
2326
use Phpactor\LanguageServer\Listener\ServiceListener;
2427
use Phpactor\LanguageServer\Core\Service\ServiceManager;
@@ -36,6 +39,7 @@
3639
use Phpactor\LanguageServer\Middleware\HandlerMiddleware;
3740
use Phpactor\LanguageServer\Middleware\InitializeMiddleware;
3841
use Phpactor\LanguageServer\Core\Command\CommandDispatcher;
42+
use Phpactor\LanguageServer\Service\DiagnosticsService;
3943
use Psr\Log\AbstractLogger;
4044
use function Safe\fopen;
4145

@@ -90,15 +94,21 @@ function (MessageTransmitter $transmitter, InitializeParams $params) use ($logge
9094
$responseWatcher = new DeferredResponseWatcher();
9195
$clientApi = new ClientApi(new JsonRpcClient($transmitter, $responseWatcher));
9296

93-
$serviceProviders = new ServiceProviders(
94-
//new PingProvider($clientApi)
97+
$diagnosticsService = new DiagnosticsService(
98+
new DiagnosticsEngine($clientApi, new AggregateDiagnosticsProvider(
99+
$logger,
100+
new SayHelloDiagnosticsProvider()
101+
))
95102
);
96103

104+
$serviceProviders = new ServiceProviders($diagnosticsService);
105+
97106
$workspace = new Workspace();
98107
$serviceManager = new ServiceManager($serviceProviders, $logger);
99108
$eventDispatcher = new AggregateEventDispatcher(
100109
new ServiceListener($serviceManager),
101-
new WorkspaceListener($workspace)
110+
new WorkspaceListener($workspace),
111+
$diagnosticsService
102112
);
103113

104114
$handlers = new Handlers(

doc/index.rst

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Reference
2222
reference/builder
2323
reference/handlers
2424
reference/service-providers
25+
reference/diagnostic-providers
2526
reference/code-action-providers
2627
reference/commands
2728

doc/reference/code-action-providers.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Example of a command:
1515
:linenos:
1616

1717
It unconditionally provides two code actions: ``Alice`` and ``Bob``. It
18-
references a previously registered :doc:`commands <../reference/command>` such as:
18+
references a previously registered :doc:`commands <../reference/commands>` such as:
1919

2020
.. literalinclude:: ../../lib/Example/Command/SayHelloCommand.php
2121
:language: php
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
Diagnostic Providers
2+
====================
3+
4+
Diagnostic providers are invoked when text documents are updated and are
5+
responsible to send diagnostics (e.g. actual or potential problems with the
6+
code) to the client.
7+
8+
Example
9+
-------
10+
11+
Example of a diagnostic provider:
12+
13+
.. literalinclude:: ../../lib/Example/Diagnostics/SayHelloDiagnosticsProvider.php
14+
:language: php
15+
:linenos:
16+
17+
.. code-block:: php
18+
19+
$diagnosticsService = new DiagnosticsService(
20+
new DiagnosticsEngine($clientApi, new AggregateDiagnosticsProvider(
21+
$logger,
22+
new SayHelloDiagnosticsProvider()
23+
))
24+
);
25+
26+
Integration
27+
-----------
28+
29+
Diagnostics are facilitated through the "Diagnostics Service" which in turn
30+
requires the ``DiagnosticsEngine`` which accepts a ``DiagnosticProvider`` -
31+
below we use the ``AggregateDiagnosticsProvider`` which allows you to provide
32+
many diagnostic providers:
33+
34+
.. code-block:: php
35+
36+
<?php
37+
38+
$diagnosticsService = new DiagnosticsService(
39+
new DiagnosticsEngine($clientApi, new AggregateDiagnosticsProvider(
40+
$logger,
41+
new SayHelloDiagnosticsProvider()
42+
))
43+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Phpactor\LanguageServer\Example\Diagnostics;
4+
5+
use Amp\Promise;
6+
use Phpactor\LanguageServerProtocol\Diagnostic;
7+
use Phpactor\LanguageServerProtocol\DiagnosticSeverity;
8+
use Phpactor\LanguageServerProtocol\Position;
9+
use Phpactor\LanguageServerProtocol\Range;
10+
use Phpactor\LanguageServerProtocol\TextDocumentItem;
11+
use Phpactor\LanguageServer\Core\Diagnostics\DiagnosticsProvider;
12+
use function Amp\call;
13+
14+
class SayHelloDiagnosticsProvider implements DiagnosticsProvider
15+
{
16+
/**
17+
* {@inheritDoc}
18+
*/
19+
public function provideDiagnostics(TextDocumentItem $textDocument): Promise
20+
{
21+
return call(function () {
22+
return [
23+
new Diagnostic(
24+
new Range(
25+
new Position(0, 0),
26+
new Position(1, 0)
27+
),
28+
'This is the first line, hello!',
29+
DiagnosticSeverity::INFORMATION
30+
)
31+
];
32+
});
33+
}
34+
}

0 commit comments

Comments
 (0)