lsp-protocol 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87f804a9a15bc3a7cda122f38be563977751f0a1
4
- data.tar.gz: c895c0618fdc176e94ace66ba5c570e75134b4bb
3
+ metadata.gz: cad9cf151c8eea6ed1c792455f49370275229d97
4
+ data.tar.gz: f1698d0735cd92fd06fd0b369edc483b3e5803bf
5
5
  SHA512:
6
- metadata.gz: 6544d334f23f647f348eeec15f4d255ec73d70b00893cd1db6aaa3abaee6a5484d70b2c7ec6b383077764900500d65694419ff552d42d94ebc12a86c4ecd709b
7
- data.tar.gz: 4a3a873014ad130869219e3f6f2ceb7a9c8256b642a8134f6aedac0285f5013160e5debe038a81f6fa9af4c96c7f70984e950a9de2ae0a212ec86ffce9f5f271
6
+ metadata.gz: c36ccab0950c30e39058e69382e9e3d398c0b1bce3c23c80f78eaab45144ed1f3bcdb40f0701bada5be9055b0ecb5cfaeaa55f9d1c11f3a783b37e2d8e9afd23
7
+ data.tar.gz: 6982ed99efdbc5d629bd7d146cbc068ddd71eabd16ddbfcb857bc653a5ec715f288db9b2c40b62389b0f3f3d44042d741ccfc8651d996dfd877be0561e809a79
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lsp (0.0.1)
4
+ lsp-protocol (0.0.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -28,7 +28,7 @@ PLATFORMS
28
28
  DEPENDENCIES
29
29
  bundler (~> 1.9)
30
30
  byebug
31
- lsp!
31
+ lsp-protocol!
32
32
  rspec (~> 3.5.0)
33
33
 
34
34
  BUNDLED WITH
data/lib/lsp.rb CHANGED
@@ -1,24 +1,109 @@
1
1
  module Lsp
2
2
  TextDocumentIdentifier = Struct.new(:uri)
3
3
 
4
- TextDocumentHoverRequest = Struct.new(:text_document, :position)
4
+ TextDocumentPositionParams = Struct.new(:text_document, :position)
5
+ InitializeRequest = Struct.new(:root_uri)
6
+
7
+ Position = Struct.new(:line, :character) do
8
+ def self.from_hash(line:, character:)
9
+ new(line, character)
10
+ end
11
+ end
12
+ Range = Struct.new(:start, :end) do
13
+ def to_h
14
+ {
15
+ start: start.to_h,
16
+ end: self.end.to_h,
17
+ }
18
+ end
19
+ end
20
+ Location = Struct.new(:uri, :range) do
21
+ def to_h
22
+ {
23
+ uri: uri,
24
+ range: range.to_h,
25
+ }
26
+ end
27
+ end
28
+
29
+ ResponseMessage = Struct.new(:result, :error) do
30
+ def self.successful(result)
31
+ new(result, nil)
32
+ end
33
+ end
34
+
35
+ TextDocumentHoverResult = Struct.new(:contents) do
36
+ def to_h
37
+ {
38
+ contents: self.contents,
39
+ range: nil,
40
+ }
41
+ end
42
+ end
43
+
44
+ module ResponseError
45
+ class Base
46
+ def initialize(code, message, data)
47
+ @code = code
48
+ @message = message
49
+ @data = data
50
+ end
51
+
52
+ def to_h
53
+ {
54
+ code: @code,
55
+ message: @message,
56
+ data: @data,
57
+ }
58
+ end
59
+ end
60
+
61
+ class MethodNotFound < Base
62
+ def initialize
63
+ @code = -32601
64
+ @message = "Method not found"
65
+ end
66
+ end
67
+ end
5
68
 
6
69
  module LanguageServer
7
70
  LanguageServerError = Class.new(StandardError)
8
71
  NotImplementedError = Class.new(LanguageServerError)
9
- UnknownMethodError = Class.new(LanguageServerError)
10
72
 
11
73
  def request(id, method_name, params)
12
- case method_name
74
+ response = case method_name
13
75
  when "textDocument/hover"
14
- result = handle_text_document_hover(
15
- TextDocumentHoverRequest.new(
76
+ handle_text_document_hover(
77
+ TextDocumentPositionParams.new(
78
+ TextDocumentIdentifier.new(params.fetch(:textDocument).fetch(:uri)),
79
+ Position.from_hash(params.fetch(:position))))
80
+ when "textDocument/definition"
81
+ handle_text_document_definition(
82
+ TextDocumentPositionParams.new(
16
83
  TextDocumentIdentifier.new(
17
84
  params.fetch(:textDocument)),
18
85
  params.fetch(:position)))
19
- else raise UnknownMethodError
86
+ when "initialize"
87
+ handle_initialize(
88
+ InitializeRequest.new(
89
+ params.fetch(:rootUri)))
90
+ else
91
+ ResponseMessage.new(nil, ResponseError::MethodNotFound.new)
92
+ end
93
+ @language_server.response(
94
+ id,
95
+ response.result ? response.result.to_h : nil,
96
+ response.error ? response.error.to_h : nil)
97
+ rescue NotImplementedError
98
+ ResponseMessage.new(nil, ResponseError::MethodNotFound.new)
99
+ end
100
+
101
+ def notify(method_name, params)
102
+ case method_name
103
+ when "textDocument/didOpen"
104
+ handle_text_document_did_open
20
105
  end
21
- @language_server.response(id, result, nil)
106
+ rescue NotImplementedError
22
107
  end
23
108
 
24
109
  attr_writer :language_server
@@ -26,6 +111,18 @@ module Lsp
26
111
  def handle_text_document_hover(request)
27
112
  raise NotImplementedError
28
113
  end
114
+
115
+ def handle_text_document_definition(request)
116
+ raise NotImplementedError
117
+ end
118
+
119
+ def handle_initialize(request)
120
+ raise NotImplementedError
121
+ end
122
+
123
+ def handle_text_document_did_open
124
+ raise NotImplementedError
125
+ end
29
126
  end
30
127
  end
31
128
 
@@ -1,11 +1,13 @@
1
1
  require 'json'
2
+ require 'logger'
2
3
 
3
4
  module Lsp
4
5
  class FileLanguageServer
5
- def initialize(implementation, input = $stdin, output = $stdout)
6
+ def initialize(implementation, input = $stdin, output = $stdout, logger: Logger.new(nil))
6
7
  @implementation = implementation
7
8
  @input = input
8
9
  @output = output
10
+ @logger = logger
9
11
  end
10
12
 
11
13
  def start
@@ -28,10 +30,17 @@ module Lsp
28
30
 
29
31
  body_raw = input.read(headers["Content-Length"].to_i)
30
32
  body_json = JSON.parse(body_raw, symbolize_names: true)
31
- implementation.request(
32
- body_json.fetch(:id),
33
- body_json.fetch(:method),
34
- body_json.fetch(:params))
33
+ logger.info("RECV #{body_json}")
34
+ if body_json[:id]
35
+ implementation.request(
36
+ body_json.fetch(:id),
37
+ body_json.fetch(:method),
38
+ body_json.fetch(:params))
39
+ else
40
+ implementation.notify(
41
+ body_json.fetch(:method),
42
+ body_json.fetch(:params))
43
+ end
35
44
  end
36
45
  rescue EOFError
37
46
  end
@@ -41,11 +50,15 @@ module Lsp
41
50
  end
42
51
 
43
52
  def response(id, result, error)
44
- output.write(build_message({
53
+ payload = {
54
+ jsonrpc: "2.0",
45
55
  id: id,
46
56
  result: result,
47
57
  error: error,
48
- }))
58
+ }
59
+ output.write(build_message(payload))
60
+ output.flush
61
+ logger.info("SEND #{payload}")
49
62
  end
50
63
 
51
64
  def build_message(hash)
@@ -53,6 +66,6 @@ module Lsp
53
66
  "Content-Length: #{json.size}\r\n\r\n#{json}"
54
67
  end
55
68
 
56
- attr_reader :implementation, :input, :output
69
+ attr_reader :implementation, :input, :output, :logger
57
70
  end
58
71
  end
@@ -4,14 +4,14 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'lsp-protocol'
7
- spec.version = '0.0.1'
7
+ spec.version = '0.0.2'
8
8
  spec.licenses = ['MIT']
9
9
  spec.authors = ['Rafał Łasocha']
10
10
  spec.email = 'lsp@swistak35.com'
11
11
 
12
12
  spec.summary = "Language Server Protocol implementation"
13
13
  spec.description = "A simple hello world gem"
14
- spec.homepage = 'https://github.com/swistak35/language_server_protocol'
14
+ spec.homepage = 'https://github.com/swistak35/lsp'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  spec.require_paths = ['lib']
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lsp-protocol
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafał Łasocha
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-23 00:00:00.000000000 Z
11
+ date: 2018-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -64,7 +64,7 @@ files:
64
64
  - lib/lsp.rb
65
65
  - lib/lsp/file_language_server.rb
66
66
  - lsp-protocol.gemspec
67
- homepage: https://github.com/swistak35/language_server_protocol
67
+ homepage: https://github.com/swistak35/lsp
68
68
  licenses:
69
69
  - MIT
70
70
  metadata: {}