language_server 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/Dockerfile +13 -0
  5. data/Dockerfile.production +5 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +41 -0
  9. data/Rakefile +10 -0
  10. data/bin/console +11 -0
  11. data/bin/generate_files +3 -0
  12. data/bin/setup +8 -0
  13. data/docker-compose.yml +20 -0
  14. data/exe/language_server +8 -0
  15. data/language_server.gemspec +28 -0
  16. data/lib/language_server/protocol/constants/completion_item_kind.rb +29 -0
  17. data/lib/language_server/protocol/constants/diagnostic_severity.rb +24 -0
  18. data/lib/language_server/protocol/constants/document_highlight_kind.rb +23 -0
  19. data/lib/language_server/protocol/constants/error_codes.rb +18 -0
  20. data/lib/language_server/protocol/constants/file_change_type.rb +23 -0
  21. data/lib/language_server/protocol/constants/initialize_error.rb +15 -0
  22. data/lib/language_server/protocol/constants/insert_text_format.rb +27 -0
  23. data/lib/language_server/protocol/constants/message_type.rb +24 -0
  24. data/lib/language_server/protocol/constants/symbol_kind.rb +29 -0
  25. data/lib/language_server/protocol/constants/text_document_save_reason.rb +24 -0
  26. data/lib/language_server/protocol/constants/text_document_sync_kind.rb +26 -0
  27. data/lib/language_server/protocol/constants.rb +11 -0
  28. data/lib/language_server/protocol/interfaces/apply_workspace_edit_params.rb +29 -0
  29. data/lib/language_server/protocol/interfaces/apply_workspace_edit_response.rb +29 -0
  30. data/lib/language_server/protocol/interfaces/cancel_params.rb +29 -0
  31. data/lib/language_server/protocol/interfaces/client_capabilities.rb +47 -0
  32. data/lib/language_server/protocol/interfaces/code_action_context.rb +33 -0
  33. data/lib/language_server/protocol/interfaces/code_action_params.rb +50 -0
  34. data/lib/language_server/protocol/interfaces/code_lens.rb +55 -0
  35. data/lib/language_server/protocol/interfaces/code_lens_options.rb +32 -0
  36. data/lib/language_server/protocol/interfaces/code_lens_params.rb +29 -0
  37. data/lib/language_server/protocol/interfaces/code_lens_registration_options.rb +29 -0
  38. data/lib/language_server/protocol/interfaces/command.rb +48 -0
  39. data/lib/language_server/protocol/interfaces/completion_item.rb +145 -0
  40. data/lib/language_server/protocol/interfaces/completion_list.rb +43 -0
  41. data/lib/language_server/protocol/interfaces/completion_options.rb +42 -0
  42. data/lib/language_server/protocol/interfaces/completion_registration_options.rb +39 -0
  43. data/lib/language_server/protocol/interfaces/diagnostic.rb +67 -0
  44. data/lib/language_server/protocol/interfaces/did_change_configuration_params.rb +29 -0
  45. data/lib/language_server/protocol/interfaces/did_change_text_document_params.rb +40 -0
  46. data/lib/language_server/protocol/interfaces/did_change_watched_files_params.rb +29 -0
  47. data/lib/language_server/protocol/interfaces/did_close_text_document_params.rb +29 -0
  48. data/lib/language_server/protocol/interfaces/did_open_text_document_params.rb +29 -0
  49. data/lib/language_server/protocol/interfaces/did_save_text_document_params.rb +39 -0
  50. data/lib/language_server/protocol/interfaces/document_filter.rb +47 -0
  51. data/lib/language_server/protocol/interfaces/document_formatting_params.rb +38 -0
  52. data/lib/language_server/protocol/interfaces/document_highlight.rb +43 -0
  53. data/lib/language_server/protocol/interfaces/document_link.rb +42 -0
  54. data/lib/language_server/protocol/interfaces/document_link_options.rb +32 -0
  55. data/lib/language_server/protocol/interfaces/document_link_params.rb +29 -0
  56. data/lib/language_server/protocol/interfaces/document_link_registration_options.rb +29 -0
  57. data/lib/language_server/protocol/interfaces/document_on_type_formatting_options.rb +41 -0
  58. data/lib/language_server/protocol/interfaces/document_on_type_formatting_params.rb +56 -0
  59. data/lib/language_server/protocol/interfaces/document_on_type_formatting_registration_options.rb +38 -0
  60. data/lib/language_server/protocol/interfaces/document_range_formatting_params.rb +47 -0
  61. data/lib/language_server/protocol/interfaces/document_symbol_params.rb +29 -0
  62. data/lib/language_server/protocol/interfaces/execute_command_options.rb +32 -0
  63. data/lib/language_server/protocol/interfaces/execute_command_params.rb +38 -0
  64. data/lib/language_server/protocol/interfaces/execute_command_registration_options.rb +32 -0
  65. data/lib/language_server/protocol/interfaces/file_event.rb +41 -0
  66. data/lib/language_server/protocol/interfaces/formatting_options.rb +41 -0
  67. data/lib/language_server/protocol/interfaces/hover.rb +42 -0
  68. data/lib/language_server/protocol/interfaces/initialize_error.rb +35 -0
  69. data/lib/language_server/protocol/interfaces/initialize_params.rb +79 -0
  70. data/lib/language_server/protocol/interfaces/initialize_result.rb +29 -0
  71. data/lib/language_server/protocol/interfaces/location.rb +32 -0
  72. data/lib/language_server/protocol/interfaces/log_message_params.rb +38 -0
  73. data/lib/language_server/protocol/interfaces/message.rb +26 -0
  74. data/lib/language_server/protocol/interfaces/message_action_item.rb +29 -0
  75. data/lib/language_server/protocol/interfaces/notification_message.rb +38 -0
  76. data/lib/language_server/protocol/interfaces/parameter_information.rb +44 -0
  77. data/lib/language_server/protocol/interfaces/position.rb +38 -0
  78. data/lib/language_server/protocol/interfaces/publish_diagnostics_params.rb +38 -0
  79. data/lib/language_server/protocol/interfaces/range.rb +38 -0
  80. data/lib/language_server/protocol/interfaces/reference_context.rb +29 -0
  81. data/lib/language_server/protocol/interfaces/reference_params.rb +26 -0
  82. data/lib/language_server/protocol/interfaces/registration.rb +51 -0
  83. data/lib/language_server/protocol/interfaces/registration_params.rb +26 -0
  84. data/lib/language_server/protocol/interfaces/rename_params.rb +49 -0
  85. data/lib/language_server/protocol/interfaces/request_message.rb +47 -0
  86. data/lib/language_server/protocol/interfaces/response_error.rb +48 -0
  87. data/lib/language_server/protocol/interfaces/response_message.rb +48 -0
  88. data/lib/language_server/protocol/interfaces/save_options.rb +32 -0
  89. data/lib/language_server/protocol/interfaces/server_capabilities.rb +183 -0
  90. data/lib/language_server/protocol/interfaces/show_message_params.rb +38 -0
  91. data/lib/language_server/protocol/interfaces/show_message_request_params.rb +47 -0
  92. data/lib/language_server/protocol/interfaces/signature_help.rb +64 -0
  93. data/lib/language_server/protocol/interfaces/signature_help_options.rb +33 -0
  94. data/lib/language_server/protocol/interfaces/signature_help_registration_options.rb +30 -0
  95. data/lib/language_server/protocol/interfaces/signature_information.rb +54 -0
  96. data/lib/language_server/protocol/interfaces/symbol_information.rb +60 -0
  97. data/lib/language_server/protocol/interfaces/text_document_change_registration_options.rb +33 -0
  98. data/lib/language_server/protocol/interfaces/text_document_client_capabilities.rb +155 -0
  99. data/lib/language_server/protocol/interfaces/text_document_content_change_event.rb +51 -0
  100. data/lib/language_server/protocol/interfaces/text_document_edit.rb +38 -0
  101. data/lib/language_server/protocol/interfaces/text_document_identifier.rb +29 -0
  102. data/lib/language_server/protocol/interfaces/text_document_item.rb +57 -0
  103. data/lib/language_server/protocol/interfaces/text_document_position_params.rb +38 -0
  104. data/lib/language_server/protocol/interfaces/text_document_registration_options.rb +30 -0
  105. data/lib/language_server/protocol/interfaces/text_document_save_registration_options.rb +29 -0
  106. data/lib/language_server/protocol/interfaces/text_document_sync_options.rb +66 -0
  107. data/lib/language_server/protocol/interfaces/text_edit.rb +40 -0
  108. data/lib/language_server/protocol/interfaces/unregistration.rb +42 -0
  109. data/lib/language_server/protocol/interfaces/unregistration_params.rb +26 -0
  110. data/lib/language_server/protocol/interfaces/versioned_text_document_identifier.rb +29 -0
  111. data/lib/language_server/protocol/interfaces/will_save_text_document_params.rb +41 -0
  112. data/lib/language_server/protocol/interfaces/workspace_client_capabilites.rb +78 -0
  113. data/lib/language_server/protocol/interfaces/workspace_edit.rb +40 -0
  114. data/lib/language_server/protocol/interfaces/workspace_symbol_params.rb +32 -0
  115. data/lib/language_server/protocol/interfaces.rb +87 -0
  116. data/lib/language_server/version.rb +3 -0
  117. data/lib/language_server.rb +176 -0
  118. data/package.json +10 -0
  119. data/scripts/generateFiles.ts +224 -0
  120. data/yarn.lock +295 -0
  121. metadata +220 -0
@@ -0,0 +1,40 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ class TextEdit
5
+ def initialize(range:, new_text:)
6
+ @attributes = {}
7
+
8
+ @attributes[:range] = range
9
+ @attributes[:newText] = new_text
10
+
11
+ @attributes.freeze
12
+ end
13
+
14
+ #
15
+ # The range of the text document to be manipulated. To insert
16
+ # text into a document create a range where start === end.
17
+ #
18
+ # @return [Range]
19
+ def range
20
+ attributes.fetch(:range)
21
+ end
22
+
23
+ #
24
+ # The string to be inserted. For delete operations use an
25
+ # empty string.
26
+ #
27
+ # @return [string]
28
+ def new_text
29
+ attributes.fetch(:newText)
30
+ end
31
+
32
+ attr_reader :attributes
33
+
34
+ def to_json(*args)
35
+ attributes.to_json(*args)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,42 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ #
5
+ # General parameters to unregister a capability.
6
+ #
7
+ class Unregistration
8
+ def initialize(id:, method:)
9
+ @attributes = {}
10
+
11
+ @attributes[:id] = id
12
+ @attributes[:method] = method
13
+
14
+ @attributes.freeze
15
+ end
16
+
17
+ #
18
+ # The id used to unregister the request or notification. Usually an id
19
+ # provided during the register request.
20
+ #
21
+ # @return [string]
22
+ def id
23
+ attributes.fetch(:id)
24
+ end
25
+
26
+ #
27
+ # The method / capability to unregister for.
28
+ #
29
+ # @return [string]
30
+ def method
31
+ attributes.fetch(:method)
32
+ end
33
+
34
+ attr_reader :attributes
35
+
36
+ def to_json(*args)
37
+ attributes.to_json(*args)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ class UnregistrationParams
5
+ def initialize(unregisterations:)
6
+ @attributes = {}
7
+
8
+ @attributes[:unregisterations] = unregisterations
9
+
10
+ @attributes.freeze
11
+ end
12
+
13
+ # @return [Unregistration[]]
14
+ def unregisterations
15
+ attributes.fetch(:unregisterations)
16
+ end
17
+
18
+ attr_reader :attributes
19
+
20
+ def to_json(*args)
21
+ attributes.to_json(*args)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ class VersionedTextDocumentIdentifier
5
+ def initialize(version:)
6
+ @attributes = {}
7
+
8
+ @attributes[:version] = version
9
+
10
+ @attributes.freeze
11
+ end
12
+
13
+ #
14
+ # The version number of this document.
15
+ #
16
+ # @return [number]
17
+ def version
18
+ attributes.fetch(:version)
19
+ end
20
+
21
+ attr_reader :attributes
22
+
23
+ def to_json(*args)
24
+ attributes.to_json(*args)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,41 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ #
5
+ # The parameters send in a will save text document notification.
6
+ #
7
+ class WillSaveTextDocumentParams
8
+ def initialize(text_document:, reason:)
9
+ @attributes = {}
10
+
11
+ @attributes[:textDocument] = text_document
12
+ @attributes[:reason] = reason
13
+
14
+ @attributes.freeze
15
+ end
16
+
17
+ #
18
+ # The document that will be saved.
19
+ #
20
+ # @return [TextDocumentIdentifier]
21
+ def text_document
22
+ attributes.fetch(:textDocument)
23
+ end
24
+
25
+ #
26
+ # The 'TextDocumentSaveReason'.
27
+ #
28
+ # @return [number]
29
+ def reason
30
+ attributes.fetch(:reason)
31
+ end
32
+
33
+ attr_reader :attributes
34
+
35
+ def to_json(*args)
36
+ attributes.to_json(*args)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,78 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ #
5
+ # Workspace specific client capabilities.
6
+ #
7
+ class WorkspaceClientCapabilites
8
+ def initialize(apply_edit: nil, workspace_edit: nil, did_change_configuration: nil, did_change_watched_files: nil, symbol: nil, execute_command: nil)
9
+ @attributes = {}
10
+
11
+ @attributes[:applyEdit] = apply_edit if apply_edit
12
+ @attributes[:workspaceEdit] = workspace_edit if workspace_edit
13
+ @attributes[:didChangeConfiguration] = did_change_configuration if did_change_configuration
14
+ @attributes[:didChangeWatchedFiles] = did_change_watched_files if did_change_watched_files
15
+ @attributes[:symbol] = symbol if symbol
16
+ @attributes[:executeCommand] = execute_command if execute_command
17
+
18
+ @attributes.freeze
19
+ end
20
+
21
+ #
22
+ # The client supports applying batch edits to the workspace by supporting
23
+ # the request 'workspace/applyEdit'
24
+ #
25
+ # @return [boolean]
26
+ def apply_edit
27
+ attributes.fetch(:applyEdit)
28
+ end
29
+
30
+ #
31
+ # Capabilities specific to `WorkspaceEdit`s
32
+ #
33
+ # @return [{ documentChanges?: boolean; }]
34
+ def workspace_edit
35
+ attributes.fetch(:workspaceEdit)
36
+ end
37
+
38
+ #
39
+ # Capabilities specific to the `workspace/didChangeConfiguration` notification.
40
+ #
41
+ # @return [{ dynamicRegistration?: boolean; }]
42
+ def did_change_configuration
43
+ attributes.fetch(:didChangeConfiguration)
44
+ end
45
+
46
+ #
47
+ # Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
48
+ #
49
+ # @return [{ dynamicRegistration?: boolean; }]
50
+ def did_change_watched_files
51
+ attributes.fetch(:didChangeWatchedFiles)
52
+ end
53
+
54
+ #
55
+ # Capabilities specific to the `workspace/symbol` request.
56
+ #
57
+ # @return [{ dynamicRegistration?: boolean; }]
58
+ def symbol
59
+ attributes.fetch(:symbol)
60
+ end
61
+
62
+ #
63
+ # Capabilities specific to the `workspace/executeCommand` request.
64
+ #
65
+ # @return [{ dynamicRegistration?: boolean; }]
66
+ def execute_command
67
+ attributes.fetch(:executeCommand)
68
+ end
69
+
70
+ attr_reader :attributes
71
+
72
+ def to_json(*args)
73
+ attributes.to_json(*args)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,40 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ class WorkspaceEdit
5
+ def initialize(changes: nil, document_changes: nil)
6
+ @attributes = {}
7
+
8
+ @attributes[:changes] = changes if changes
9
+ @attributes[:documentChanges] = document_changes if document_changes
10
+
11
+ @attributes.freeze
12
+ end
13
+
14
+ #
15
+ # Holds changes to existing resources.
16
+ #
17
+ # @return [{ [uri: string]: TextEdit[]; }]
18
+ def changes
19
+ attributes.fetch(:changes)
20
+ end
21
+
22
+ #
23
+ # An array of `TextDocumentEdit`s to express changes to specific a specific
24
+ # version of a text document. Whether a client supports versioned document
25
+ # edits is expressed via `WorkspaceClientCapabilites.versionedWorkspaceEdit`.
26
+ #
27
+ # @return [TextDocumentEdit[]]
28
+ def document_changes
29
+ attributes.fetch(:documentChanges)
30
+ end
31
+
32
+ attr_reader :attributes
33
+
34
+ def to_json(*args)
35
+ attributes.to_json(*args)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ module LanguageServer
2
+ module Protocol
3
+ module Interfaces
4
+ #
5
+ # The parameters of a Workspace Symbol Request.
6
+ #
7
+ class WorkspaceSymbolParams
8
+ def initialize(query:)
9
+ @attributes = {}
10
+
11
+ @attributes[:query] = query
12
+
13
+ @attributes.freeze
14
+ end
15
+
16
+ #
17
+ # A non-empty query string
18
+ #
19
+ # @return [string]
20
+ def query
21
+ attributes.fetch(:query)
22
+ end
23
+
24
+ attr_reader :attributes
25
+
26
+ def to_json(*args)
27
+ attributes.to_json(*args)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,87 @@
1
+ require "language_server/protocol/interfaces/message"
2
+ require "language_server/protocol/interfaces/request_message"
3
+ require "language_server/protocol/interfaces/response_message"
4
+ require "language_server/protocol/interfaces/response_error"
5
+ require "language_server/protocol/interfaces/notification_message"
6
+ require "language_server/protocol/interfaces/cancel_params"
7
+ require "language_server/protocol/interfaces/position"
8
+ require "language_server/protocol/interfaces/range"
9
+ require "language_server/protocol/interfaces/location"
10
+ require "language_server/protocol/interfaces/diagnostic"
11
+ require "language_server/protocol/interfaces/command"
12
+ require "language_server/protocol/interfaces/text_edit"
13
+ require "language_server/protocol/interfaces/text_document_edit"
14
+ require "language_server/protocol/interfaces/workspace_edit"
15
+ require "language_server/protocol/interfaces/text_document_identifier"
16
+ require "language_server/protocol/interfaces/text_document_item"
17
+ require "language_server/protocol/interfaces/versioned_text_document_identifier"
18
+ require "language_server/protocol/interfaces/text_document_position_params"
19
+ require "language_server/protocol/interfaces/document_filter"
20
+ require "language_server/protocol/interfaces/initialize_params"
21
+ require "language_server/protocol/interfaces/workspace_client_capabilites"
22
+ require "language_server/protocol/interfaces/text_document_client_capabilities"
23
+ require "language_server/protocol/interfaces/client_capabilities"
24
+ require "language_server/protocol/interfaces/initialize_result"
25
+ require "language_server/protocol/interfaces/initialize_error"
26
+ require "language_server/protocol/interfaces/completion_options"
27
+ require "language_server/protocol/interfaces/signature_help_options"
28
+ require "language_server/protocol/interfaces/code_lens_options"
29
+ require "language_server/protocol/interfaces/document_on_type_formatting_options"
30
+ require "language_server/protocol/interfaces/document_link_options"
31
+ require "language_server/protocol/interfaces/execute_command_options"
32
+ require "language_server/protocol/interfaces/save_options"
33
+ require "language_server/protocol/interfaces/text_document_sync_options"
34
+ require "language_server/protocol/interfaces/server_capabilities"
35
+ require "language_server/protocol/interfaces/show_message_params"
36
+ require "language_server/protocol/interfaces/show_message_request_params"
37
+ require "language_server/protocol/interfaces/message_action_item"
38
+ require "language_server/protocol/interfaces/log_message_params"
39
+ require "language_server/protocol/interfaces/registration"
40
+ require "language_server/protocol/interfaces/registration_params"
41
+ require "language_server/protocol/interfaces/text_document_registration_options"
42
+ require "language_server/protocol/interfaces/unregistration"
43
+ require "language_server/protocol/interfaces/unregistration_params"
44
+ require "language_server/protocol/interfaces/did_change_configuration_params"
45
+ require "language_server/protocol/interfaces/did_open_text_document_params"
46
+ require "language_server/protocol/interfaces/did_change_text_document_params"
47
+ require "language_server/protocol/interfaces/text_document_content_change_event"
48
+ require "language_server/protocol/interfaces/text_document_change_registration_options"
49
+ require "language_server/protocol/interfaces/will_save_text_document_params"
50
+ require "language_server/protocol/interfaces/did_save_text_document_params"
51
+ require "language_server/protocol/interfaces/text_document_save_registration_options"
52
+ require "language_server/protocol/interfaces/did_close_text_document_params"
53
+ require "language_server/protocol/interfaces/did_change_watched_files_params"
54
+ require "language_server/protocol/interfaces/file_event"
55
+ require "language_server/protocol/interfaces/publish_diagnostics_params"
56
+ require "language_server/protocol/interfaces/completion_list"
57
+ require "language_server/protocol/interfaces/completion_item"
58
+ require "language_server/protocol/interfaces/completion_registration_options"
59
+ require "language_server/protocol/interfaces/hover"
60
+ require "language_server/protocol/interfaces/signature_help"
61
+ require "language_server/protocol/interfaces/signature_information"
62
+ require "language_server/protocol/interfaces/parameter_information"
63
+ require "language_server/protocol/interfaces/signature_help_registration_options"
64
+ require "language_server/protocol/interfaces/reference_params"
65
+ require "language_server/protocol/interfaces/reference_context"
66
+ require "language_server/protocol/interfaces/document_highlight"
67
+ require "language_server/protocol/interfaces/document_symbol_params"
68
+ require "language_server/protocol/interfaces/symbol_information"
69
+ require "language_server/protocol/interfaces/workspace_symbol_params"
70
+ require "language_server/protocol/interfaces/code_action_params"
71
+ require "language_server/protocol/interfaces/code_action_context"
72
+ require "language_server/protocol/interfaces/code_lens_params"
73
+ require "language_server/protocol/interfaces/code_lens"
74
+ require "language_server/protocol/interfaces/code_lens_registration_options"
75
+ require "language_server/protocol/interfaces/document_link_params"
76
+ require "language_server/protocol/interfaces/document_link"
77
+ require "language_server/protocol/interfaces/document_link_registration_options"
78
+ require "language_server/protocol/interfaces/document_formatting_params"
79
+ require "language_server/protocol/interfaces/formatting_options"
80
+ require "language_server/protocol/interfaces/document_range_formatting_params"
81
+ require "language_server/protocol/interfaces/document_on_type_formatting_params"
82
+ require "language_server/protocol/interfaces/document_on_type_formatting_registration_options"
83
+ require "language_server/protocol/interfaces/rename_params"
84
+ require "language_server/protocol/interfaces/execute_command_params"
85
+ require "language_server/protocol/interfaces/execute_command_registration_options"
86
+ require "language_server/protocol/interfaces/apply_workspace_edit_params"
87
+ require "language_server/protocol/interfaces/apply_workspace_edit_response"
@@ -0,0 +1,3 @@
1
+ module LanguageServer
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,176 @@
1
+ require "language_server/version"
2
+ require "language_server/protocol/interfaces"
3
+ require "language_server/protocol/constants"
4
+
5
+ require "json"
6
+ require "logger"
7
+ require "open3"
8
+ require "tempfile"
9
+ require "shellwords"
10
+
11
+ module LanguageServer
12
+ module Protocol
13
+ module Stdio
14
+ class Reader
15
+ def read(&block)
16
+ buffer = ""
17
+ header_parsed = false
18
+ content_length = nil
19
+
20
+ while char = STDIN.getc
21
+ buffer << char
22
+
23
+ unless header_parsed
24
+ if buffer[-4..-1] == "\r\n" * 2
25
+ content_length = buffer.match(/Content-Length: (\d+)/i)[1].to_i
26
+
27
+ header_parsed = true
28
+ buffer.clear
29
+ end
30
+ else
31
+ if buffer.bytesize == content_length
32
+ LanguageServer.logger.debug("Receive: #{buffer}")
33
+
34
+ request = JSON.parse(buffer, symbolize_names: true)
35
+
36
+ block.call(request)
37
+
38
+ header_parsed = false
39
+ buffer.clear
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ class Writer
47
+ def respond(id:, result:)
48
+ write(id: id, result: result)
49
+ end
50
+
51
+ def notify(method:, params: {})
52
+ write(method: method, params: params)
53
+ end
54
+
55
+ private
56
+
57
+ def write(response)
58
+ response_str = response.merge(
59
+ jsonrpc: "2.0"
60
+ ).to_json
61
+
62
+ headers = {
63
+ "Content-Length" => response_str.bytesize
64
+ }
65
+
66
+ headers.each do |k, v|
67
+ STDOUT.print "#{k}: #{v}\r\n"
68
+ end
69
+
70
+ STDOUT.print "\r\n"
71
+
72
+ STDOUT.print response_str
73
+ STDOUT.flush
74
+
75
+ LanguageServer.logger.debug("Response: #{response_str}")
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ class << self
82
+ def logger
83
+ @logger ||= Logger.new(STDERR)
84
+ end
85
+
86
+ def run
87
+ writer = Protocol::Stdio::Writer.new
88
+ reader = Protocol::Stdio::Reader.new
89
+
90
+ reader.read do |request|
91
+ method = request[:method].to_sym
92
+
93
+ logger.debug("Method: #{method} called")
94
+
95
+ _, subscriber = subscribers.find {|k, _|
96
+ k === method
97
+ }
98
+
99
+ if subscriber
100
+ result = subscriber.call(request, writer.method(:notify))
101
+
102
+ if request[:id]
103
+ writer.respond(id: request[:id], result: result)
104
+ end
105
+ else
106
+ logger.debug("Ignore: #{method}")
107
+ end
108
+ end
109
+ end
110
+
111
+ def subscribers
112
+ @subscribers ||= {}
113
+ end
114
+
115
+ def on(method, &callback)
116
+ subscribers[method] = callback
117
+ end
118
+ end
119
+
120
+ on :initialize do
121
+ Protocol::Interfaces::InitializeResult.new(
122
+ capabilities: Protocol::Interfaces::ServerCapabilities.new(
123
+ text_document_sync: Protocol::Interfaces::TextDocumentSyncOptions.new(
124
+ change: Protocol::Constants::TextDocumentSyncKind::FULL
125
+ )
126
+ )
127
+ )
128
+ end
129
+
130
+ on :shutdown do
131
+ exit
132
+ end
133
+
134
+ on :"textDocument/didChange" do |request, notifier|
135
+ uri = request[:params][:textDocument][:uri]
136
+ text = request[:params][:contentChanges][0][:text]
137
+
138
+ diagnostics = nil
139
+
140
+ Tempfile.create do |file|
141
+ file.write(text)
142
+ file.flush
143
+
144
+ out, err, status = Open3.capture3("ruby -wc #{file.path.shellescape}")
145
+ severity = status.success? ? Protocol::Constants::DiagnosticSeverity::WARNING : Protocol::Constants::DiagnosticSeverity::ERROR
146
+
147
+ diagnostics = err.lines.map do |line|
148
+ line_num, message = line.scan(/#{Regexp.escape(file.path)}:(\d+): (.*)\n/).flatten
149
+ line_num = line_num.to_i
150
+
151
+ Protocol::Interfaces::Diagnostic.new(
152
+ message: message,
153
+ severity: severity,
154
+ range: Protocol::Interfaces::Range.new(
155
+ start: Protocol::Interfaces::Position.new(
156
+ line: line_num.to_i - 1,
157
+ character: 0
158
+ ),
159
+ end: Protocol::Interfaces::Position.new(
160
+ line: line_num.to_i - 1,
161
+ character: 0
162
+ )
163
+ )
164
+ )
165
+ end
166
+ end
167
+
168
+ notifier.call(
169
+ method: :"textDocument/publishDiagnostics",
170
+ params: Protocol::Interfaces::PublishDiagnosticsParams.new(
171
+ uri: uri,
172
+ diagnostics: diagnostics
173
+ )
174
+ )
175
+ end
176
+ end
data/package.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "dependencies": {
3
+ "@types/es6-promise": "^0.0.32",
4
+ "@types/node": "^7.0.18",
5
+ "handlebars": "^4.0.8",
6
+ "isomorphic-fetch": "^2.2.1",
7
+ "ts-node": "^3.0.4",
8
+ "typescript": "^2.3.2"
9
+ }
10
+ }