language_server 0.1.0

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.
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
+ }