diff --git a/src/LanguageServer.php b/src/LanguageServer.php index 8b3f90b..31fc52d 100644 --- a/src/LanguageServer.php +++ b/src/LanguageServer.php @@ -2,16 +2,17 @@ namespace LanguageServer; -use LanguageServer\Protocol\ProtocolServer; +use LanguageServer\Protocol\{ProtocolServer, ServerCapabilities}; +use LanguageServer\Protocol\Methods\Initialize\{InitializeRequest, InitializeResult, InitializeResponse}; class LanguageServer extends ProtocolServer { - public function listen() + public function initialize(InitializeRequest $req): InitializeResponse { - $this->on('initialize', function (InitializeRequest $req) { - $res = new InitializeResponse(); - $this->sendResponse($res); - }); - parent::listen(); + $result = new InitializeResult; + $result->capabilites = new ServerCapabilities; + return new InitializeResponse($result); } + + public function shutdown } diff --git a/src/Protocol/Methods/Initialize/InitializeResponse.php b/src/Protocol/Methods/Initialize/InitializeResponse.php index 33bdf74..d93ebb6 100644 --- a/src/Protocol/Methods/Initialize/InitializeResponse.php +++ b/src/Protocol/Methods/Initialize/InitializeResponse.php @@ -2,14 +2,10 @@ namespace LanguageServer\Protocol\Methods\Initialize; -use LanguageServer\Protocol\Response; - -class InitializeResponse extends Response +class InitializeResponse { /** - * The capabilities the language server provides. - * - * @var LanguageServer\Protocol\ServerCapabilities + * @var InitializeResult */ - public $capabilites; + public $result; } diff --git a/src/Protocol/Methods/Initialize/InitializeResult.php b/src/Protocol/Methods/Initialize/InitializeResult.php new file mode 100644 index 0000000..efa42ad --- /dev/null +++ b/src/Protocol/Methods/Initialize/InitializeResult.php @@ -0,0 +1,15 @@ +emit($body->method, [$req]); + if (!method_exists($this, $req->method)) { + $this->sendResponse(new Response(null, new ResponseError("Method {$req->method} is not implemented", ErrorCode::METHOD_NOT_FOUND, $e))); + } else { + try { + $result = $this->{$req->method}($req->params); + $this->sendResponse(new Response($result)); + } catch (ResponseError $e) { + $this->sendResponse(new Response(null, $e)); + } catch (Throwable $e) { + $this->sendResponse(new Response(null, new ResponseError($e->getMessage(), $e->getCode(), null, $e))); + } + } $this->parsingMode = ParsingMode::HEADERS; $this->buffer = ''; } @@ -64,4 +75,6 @@ class ProtocolServer extends EventEmitter { fwrite($this->output, json_encode($res)); } + + abstract public function initialize(InitializeRequest $req): InitializeResponse; } diff --git a/src/Protocol/Response.php b/src/Protocol/Response.php index 3401e47..db7f02d 100644 --- a/src/Protocol/Response.php +++ b/src/Protocol/Response.php @@ -15,12 +15,18 @@ class Response extends Message public $method; /** - * @var object|null + * @var mixed */ - public $params; + public $result; /** * @var ResponseError|null */ public $error; + + public function __construct($result, ResponseError $error = null) + { + $this->result = $result; + $this->error = $error; + } } diff --git a/src/Protocol/ResponseError.php b/src/Protocol/ResponseError.php index 3d0bd9e..25e0950 100644 --- a/src/Protocol/ResponseError.php +++ b/src/Protocol/ResponseError.php @@ -2,7 +2,9 @@ namespace LanguageServer\Protocol; -class ResponseError +use Exception; + +class ResponseError extends Exception { /** * A number indicating the error type that occurred. @@ -25,4 +27,10 @@ class ResponseError * @var mixed */ public $data; + + public function __construct(string $message, int $code = ErrorCode::INTERNAL_ERROR, $data = null, Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + $this->data = $data; + } } diff --git a/src/Protocol/ServerCapabilities.php b/src/Protocol/ServerCapabilities.php index dbc66f4..4b800b0 100644 --- a/src/Protocol/ServerCapabilities.php +++ b/src/Protocol/ServerCapabilities.php @@ -107,5 +107,5 @@ class ServerCapabilites * * @var bool|null */ - public $renameProvidern; + public $renameProvider; }