diff --git a/composer.json b/composer.json index 3fccf7b..fbe3aae 100644 --- a/composer.json +++ b/composer.json @@ -5,13 +5,18 @@ "bin": ["bin/main.php"], "minimum-stability": "dev", "require": { + "php": ">=7.0", "nikic/php-parser": "3.0.0alpha1", "phpdocumentor/reflection-docblock": "^3.0", - "sabre/event": "^3.0" + "sabre/event": "^3.0", + "netresearch/jsonmapper": "^0.11.0" }, "autoload": { "psr-4": { "LanguageServer\\": "src/" } + }, + "require-dev": { + "squizlabs/php_codesniffer": "^2.6" } } diff --git a/src/Protocol/ClientCapabilites.php b/src/Protocol/ClientCapabilites.php new file mode 100644 index 0000000..746791d --- /dev/null +++ b/src/Protocol/ClientCapabilites.php @@ -0,0 +1,8 @@ +on('initialize', function (InitializeRequest $req) { + $res = new InitializeResponse(); + $this->sendResponse($res); + }); + parent::listen(); + } +} diff --git a/src/Protocol/Message.php b/src/Protocol/Message.php new file mode 100644 index 0000000..e043c49 --- /dev/null +++ b/src/Protocol/Message.php @@ -0,0 +1,11 @@ +input, function() use ($buffer, $parsingMode, $headers, $contentLength) { - $buffer .= fgetc($this->output); + Loop\addReadStream($this->input, function() { + $this->buffer .= fgetc($this->output); switch ($parsingMode) { case ParsingMode::HEADERS: if (substr($buffer, -4) === '\r\n\r\n') { - $parsingMode = ParsingMode::BODY; - $contentLength = (int)$headers['Content-Length']; - $buffer = ''; + $this->parsingMode = ParsingMode::BODY; + $this->contentLength = (int)$headers['Content-Length']; + $this->buffer = ''; } else if (substr($buffer, -2) === '\r\n') { $parts = explode(': ', $buffer); $headers[$parts[0]] = $parts[1]; - $buffer = ''; + $this->buffer = ''; } break; case ParsingMode::BODY: if (strlen($buffer) === $contentLength) { - $body = json_decode($buffer); - $this->emit($body->method, [$body->params]); - $parsingMode = ParsingMode::HEADERS; - $buffer = ''; + $req = Request::parse($body); + $this->emit($body->method, [$req]); + $this->parsingMode = ParsingMode::HEADERS; + $this->buffer = ''; } break; } @@ -59,4 +59,9 @@ class LanguageServer extends EventEmitter Loop\run(); } + + public function sendResponse(Response $res) + { + fwrite($this->output, json_encode($res)); + } } diff --git a/src/Protocol/PublishDiagnosticParams.php b/src/Protocol/PublishDiagnosticParams.php new file mode 100644 index 0000000..d81382c --- /dev/null +++ b/src/Protocol/PublishDiagnosticParams.php @@ -0,0 +1,26 @@ +id = $decoded->id; + $request->method = $decoded->method; + $pascalCasedMethod = ucfirst($decoded->method); + $namespace = __NAMESPACE__ . '\\' . str_replace('/', '\\', $pascalCasedMethod); + $className = end(explode('\\', $request->method)) . 'Params'; + $fullyQualifiedName = $namespace . $className; + $mapper->classMap['RequestParams'] = $fullyQualifiedName; + $request = $mapper->map(json_decode($body), new self()); + if (class_exists($fullyQualifiedName)) { + $request->params = new $fullyQualifiedName(); + } + foreach ($request->params as $key => $value) { + $request->{$key} = $value; + } + return $request; + } +} diff --git a/src/Protocol/Response.php b/src/Protocol/Response.php new file mode 100644 index 0000000..3401e47 --- /dev/null +++ b/src/Protocol/Response.php @@ -0,0 +1,26 @@ +