ruby_syntax_lsp 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01b172fd9fd266168fec4edb27dc48600be59db0c556c2e82ed0aea39f1ee019
4
- data.tar.gz: 9182a89cde238189af8bf19e406d9fd4f81c055070df08d3f22d133b850f6a7f
3
+ metadata.gz: 9114e62f671e8af42ee4b110e6bfe439f0032c61ab6ec00e3dd46447552ef965
4
+ data.tar.gz: e971978cb2c87f1d38e9400b5c44540a2c2363386d922e1cf1bc76af11627ad8
5
5
  SHA512:
6
- metadata.gz: dd0c79a83a6a6e377b52f4a6e162a8d02bb01fd298953aa1b1516793a7287d5128acd9bc6522cdf9452bb50a961f257b607db6c2e694e6eb1ef5e0f5803f288b
7
- data.tar.gz: 85c876f9ef97500414eadb2e4d9ef53e5698e8b9084a37b0ee13a06845f0860d3aab3253d42e69060abba14778d4c59c60b8637ea664fdcfc79e6c0ef4754353
6
+ metadata.gz: d801d2437481d1a57aa14820808de3a982674ef87f22e5e40d4c0dd0c5e5bee7d1684a072d44ad9111a502cfa54af38938934fc464ac35c926292a050fe44273
7
+ data.tar.gz: 36925b5c78235015dae614ece3308f41e67e46390589d88dfad830305496cbe6eafba9762fbfbfa6984d9ce17a15418f69ae3ffa4036ff3a5556822769567524
data/exe/ruby_syntax_lsp CHANGED
@@ -2,8 +2,4 @@
2
2
 
3
3
  require "ruby_syntax_lsp"
4
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
5
+ RubySyntaxLsp.cli
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "optparse"
4
+ require_relative "core"
5
+ require_relative "version"
6
+
7
+ class RubySyntaxLsp
8
+ def self.cli
9
+ options = {
10
+ log_level: :info,
11
+ }
12
+ opts = OptionParser.new("Usage: ruby_syntax_lsp [options]")
13
+
14
+ opts.on("--log LEVEL", "Set log level (debug, info, warn, error, fatal)") do |v|
15
+ options[:log_level] = level.to_sym
16
+ end
17
+
18
+ opts.on("--verbose", "Set log level to debug") do
19
+ options[:log_level] = :debug
20
+ end
21
+
22
+ opts.version = RubySyntaxLsp::VERSION
23
+
24
+ opts.parse!
25
+
26
+ reader = LSP::Transport::Stdio::Reader.new
27
+ writer = LSP::Transport::Stdio::Writer.new
28
+
29
+ RubySyntaxLsp.new(writer, reader, options[:log_level]).start
30
+ end
31
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "language_server-protocol"
4
+ require "Logger"
5
+
6
+ LSP = LanguageServer::Protocol
7
+
8
+ class RubySyntaxLsp
9
+ def initialize(writer, reader, level)
10
+ @writer = writer
11
+ @reader = reader
12
+ @logger = Logger.new(STDERR, level: level)
13
+ end
14
+
15
+ def start
16
+ @logger.info "Started Ruby Syntax LSP server..."
17
+ @reader.read do |request|
18
+ break if request[:method] == "shutdown"
19
+ method_name = ("request_" + request[:method].gsub(/[A-Z]/) { |m| "_#{m.downcase}" }.gsub("/", "_")).to_sym
20
+ if respond_to?(method_name)
21
+ @logger.debug "Received supported method: #{method_name}"
22
+ begin
23
+ send(method_name, request[:id], request[:params])
24
+ rescue => e
25
+ @logger.error "Error: #{e.full_message}"
26
+ @writer.write(
27
+ code: -32603,
28
+ message: e.message,
29
+ )
30
+ end
31
+ elsif request[:method].start_with?("$/")
32
+ @logger.debug "Received unsupported method: #{request[:method]}"
33
+ else
34
+ @writer.write(
35
+ code: -32601,
36
+ message: "Method not implemented: #{request[:method]}",
37
+ )
38
+ end
39
+ end
40
+ end
41
+
42
+ def request_initialize(id, params)
43
+ @writer.write(
44
+ id: id,
45
+ result: LSP::Interface::InitializeResult.new(
46
+ capabilities: LSP::Interface::ServerCapabilities.new(
47
+ text_document_sync: LSP::Interface::TextDocumentSyncOptions.new(
48
+ change: LSP::Constant::TextDocumentSyncKind::FULL,
49
+ ),
50
+ ),
51
+ ),
52
+ )
53
+ end
54
+
55
+ def request_initialized(id, params)
56
+ # none
57
+ end
58
+
59
+ def request_text_document_did_change(id, params)
60
+ @writer.write(
61
+ method: "textDocument/publishDiagnostics",
62
+ params: {
63
+ uri: params[:textDocument][:uri],
64
+ diagnostics: params[:contentChanges].filter_map do |change|
65
+ text = change[:text]
66
+ begin
67
+ RubyVM::InstructionSequence.compile(text)
68
+ rescue SyntaxError => e
69
+ @logger.info("SyntaxError detected:\n#{e.message}")
70
+ lines = text.lines
71
+ e.message.split(/^<compiled>:(?=\d+: )/m)[1..].map do |error|
72
+ @logger.info("Parsing this error message:\n#{error}")
73
+ lineno_s, message = error.split(": ", 2)
74
+ lineno = lineno_s.strip.to_i
75
+ @logger.info("Line number: #{lineno}")
76
+ range = if message.lines.length > 1 # Message has `^`
77
+ pos_start = message.lines[2].delete_prefix("...").index("^")
78
+ if message.lines[1].start_with?("...")
79
+ pos_start += lines[lineno - 1].index(message.lines[1].delete_prefix("...").delete_suffix("..."))
80
+ end
81
+ pos_end = pos_start + message.lines[2].count("~") + 1
82
+
83
+ @logger.info("line: #{lineno}, position: #{pos_start}-#{pos_end}")
84
+ LSP::Interface::Range.new(
85
+ start: LSP::Interface::Position.new(line: lineno - 1, character: pos_start),
86
+ end: LSP::Interface::Position.new(line: lineno - 1, character: pos_end),
87
+ )
88
+ else
89
+ @logger.info("line: #{lineno}, no position")
90
+ LSP::Interface::Range.new(
91
+ start: LSP::Interface::Position.new(line: lineno - 1, character: 0),
92
+ end: LSP::Interface::Position.new(line: lineno - 1, character: lines[lineno - 1].length - 1),
93
+ )
94
+ end
95
+ LSP::Interface::Diagnostic.new(
96
+ range: range,
97
+ severity: LSP::Constant::DiagnosticSeverity::ERROR,
98
+ message: message.lines[0].strip.sub(/^syntax error, /, ""),
99
+ source: "Ruby Syntax LSP",
100
+ )
101
+ end
102
+ else
103
+ @logger.info("No SyntaxError")
104
+ nil
105
+ end
106
+ end.flatten,
107
+ },
108
+ )
109
+ end
110
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class RubySyntaxLsp
4
+ VERSION = "0.0.2"
5
+ end
@@ -1,107 +1,5 @@
1
- require "language_server-protocol"
2
- require "Logger"
1
+ # frozen_string_literal: true
3
2
 
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
3
+ require_relative "ruby_syntax_lsp/cli"
4
+ require_relative "ruby_syntax_lsp/core"
5
+ require_relative "ruby_syntax_lsp/version"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_syntax_lsp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - sevenc-nanashi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-20 00:00:00.000000000 Z
11
+ date: 2022-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: language_server-protocol
@@ -34,6 +34,9 @@ extra_rdoc_files: []
34
34
  files:
35
35
  - exe/ruby_syntax_lsp
36
36
  - lib/ruby_syntax_lsp.rb
37
+ - lib/ruby_syntax_lsp/cli.rb
38
+ - lib/ruby_syntax_lsp/core.rb
39
+ - lib/ruby_syntax_lsp/version.rb
37
40
  homepage: https://github.com/sevenc-nanashi/ruby_syntax_lsp
38
41
  licenses:
39
42
  - MIT