ruby_syntax_lsp 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 01b172fd9fd266168fec4edb27dc48600be59db0c556c2e82ed0aea39f1ee019
4
+ data.tar.gz: 9182a89cde238189af8bf19e406d9fd4f81c055070df08d3f22d133b850f6a7f
5
+ SHA512:
6
+ metadata.gz: dd0c79a83a6a6e377b52f4a6e162a8d02bb01fd298953aa1b1516793a7287d5128acd9bc6522cdf9452bb50a961f257b607db6c2e694e6eb1ef5e0f5803f288b
7
+ data.tar.gz: 85c876f9ef97500414eadb2e4d9ef53e5698e8b9084a37b0ee13a06845f0860d3aab3253d42e69060abba14778d4c59c60b8637ea664fdcfc79e6c0ef4754353
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "ruby_syntax_lsp"
4
+
5
+ writer = LSP::Transport::Stdio::Writer.new
6
+ reader = LSP::Transport::Stdio::Reader.new
7
+ server = Server.new(writer, reader)
8
+
9
+ server.start
@@ -0,0 +1,107 @@
1
+ require "language_server-protocol"
2
+ require "Logger"
3
+
4
+ $logger = Logger.new(STDERR)
5
+ LSP = LanguageServer::Protocol
6
+
7
+ class Server
8
+ def initialize(writer, reader)
9
+ @writer = writer
10
+ @reader = reader
11
+ end
12
+
13
+ def start
14
+ $logger.info "Started Ruby Syntax LSP server..."
15
+ @reader.read do |request|
16
+ break if request[:method] == "shutdown"
17
+ method_name = ("request_" + request[:method].gsub(/[A-Z]/) { |m| "_#{m.downcase}" }.gsub("/", "_")).to_sym
18
+ if respond_to?(method_name)
19
+ $logger.debug "Received supported method: #{method_name}"
20
+ begin
21
+ send(method_name, request[:id], request[:params])
22
+ rescue => e
23
+ $logger.error "Error: #{e.full_message}"
24
+ @writer.write(
25
+ code: -32603,
26
+ message: e.message,
27
+ )
28
+ end
29
+ elsif request[:method].start_with?("$/")
30
+ $logger.debug "Received unsupported method: #{request[:method]}"
31
+ else
32
+ @writer.write(
33
+ code: -32601,
34
+ message: "Method not implemented: #{request[:method]}",
35
+ )
36
+ end
37
+ end
38
+ end
39
+
40
+ def request_initialize(id, params)
41
+ @writer.write(
42
+ id: id,
43
+ result: LSP::Interface::InitializeResult.new(
44
+ capabilities: LSP::Interface::ServerCapabilities.new(
45
+ text_document_sync: LSP::Interface::TextDocumentSyncOptions.new(
46
+ change: LSP::Constant::TextDocumentSyncKind::FULL,
47
+ ),
48
+ ),
49
+ ),
50
+ )
51
+ end
52
+
53
+ def request_initialized(id, params)
54
+ # none
55
+ end
56
+
57
+ def request_text_document_did_change(id, params)
58
+ @writer.write(
59
+ method: "textDocument/publishDiagnostics",
60
+ params: {
61
+ uri: params[:textDocument][:uri],
62
+ diagnostics: params[:contentChanges].filter_map do |change|
63
+ text = change[:text]
64
+ begin
65
+ RubyVM::InstructionSequence.compile(text)
66
+ rescue SyntaxError => e
67
+ $logger.info("SyntaxError detected:\n#{e.message}")
68
+ lines = text.lines
69
+ e.message.split(/^<compiled>:(?=\d+: )/m)[1..].map do |error|
70
+ $logger.info("Parsing this error message:\n#{error}")
71
+ lineno_s, message = error.split(": ", 2)
72
+ lineno = lineno_s.to_i
73
+ range = if message.lines.length > 1 # Message has `^`
74
+ pos_start = message.lines[2].index("^")
75
+ if message.lines[1].start_with?("...")
76
+ pos_start += lines[lineno - 1].index(message.lines[1].delete_prefix("...").delete_suffix("...")) - 3
77
+ end
78
+ pos_end = pos_start + message.lines[2].count("~") + 1
79
+
80
+ $logger.info("line: #{lineno}, position: #{pos_start}-#{pos_end}")
81
+ LSP::Interface::Range.new(
82
+ start: LSP::Interface::Position.new(line: lineno - 1, character: pos_start),
83
+ end: LSP::Interface::Position.new(line: lineno - 1, character: pos_end),
84
+ )
85
+ else
86
+ $logger.info("line: #{lineno}, no position")
87
+ LSP::Interface::Range.new(
88
+ start: LSP::Interface::Position.new(line: lineno - 1, character: 0),
89
+ end: LSP::Interface::Position.new(line: lineno - 1, character: lines[lineno - 1].length - 1),
90
+ )
91
+ end
92
+ LSP::Interface::Diagnostic.new(
93
+ range: range,
94
+ severity: LSP::Constant::DiagnosticSeverity::ERROR,
95
+ message: message.lines[0].strip.sub(/^syntax error, /, ""),
96
+ source: "Ruby Syntax LSP",
97
+ )
98
+ end
99
+ else
100
+ $logger.info("No SyntaxError")
101
+ nil
102
+ end
103
+ end.flatten,
104
+ },
105
+ )
106
+ end
107
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_syntax_lsp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - sevenc-nanashi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-04-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: language_server-protocol
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.16'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.16'
27
+ description:
28
+ email:
29
+ - sevenc7c@sevenc7c.com
30
+ executables:
31
+ - ruby_syntax_lsp
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - exe/ruby_syntax_lsp
36
+ - lib/ruby_syntax_lsp.rb
37
+ homepage: https://github.com/sevenc-nanashi/ruby_syntax_lsp
38
+ licenses:
39
+ - MIT
40
+ metadata:
41
+ homepage_uri: https://github.com/sevenc-nanashi/ruby_syntax_lsp
42
+ source_code_uri: https://github.com/sevenc-nanashi/ruby_syntax_lsp
43
+ changelog_uri: https://github.com/sevenc-nanashi/ruby_syntax_lsp/blob/main/CHANGELOG.md
44
+ rubygems_mfa_required: 'true'
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 3.0.0
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubygems_version: 3.2.32
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: A Ruby Language Server that checks syntax
64
+ test_files: []