ruby_syntax_lsp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []