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 +7 -0
- data/exe/ruby_syntax_lsp +9 -0
- data/lib/ruby_syntax_lsp.rb +107 -0
- metadata +64 -0
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
|
data/exe/ruby_syntax_lsp
ADDED
@@ -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: []
|