ruby-lsp 0.2.1 → 0.2.4
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 +4 -4
- data/CHANGELOG.md +14 -0
- data/VERSION +1 -1
- data/lib/ruby_lsp/handler.rb +0 -19
- data/lib/ruby_lsp/requests/document_link.rb +119 -0
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +11 -5
- data/lib/ruby_lsp/requests/support/highlight_target.rb +2 -1
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +9 -2
- data/lib/ruby_lsp/requests/support/source_uri.rb +82 -0
- data/lib/ruby_lsp/requests.rb +2 -0
- data/lib/ruby_lsp/server.rb +52 -19
- metadata +4 -69
- data/.github/dependabot.yml +0 -11
- data/.github/probots.yml +0 -2
- data/.github/pull_request_template.md +0 -15
- data/.github/workflows/ci.yml +0 -31
- data/.github/workflows/publish_docs.yml +0 -32
- data/.gitignore +0 -9
- data/.rubocop.yml +0 -40
- data/.vscode/extensions.json +0 -5
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -25
- data/CODE_OF_CONDUCT.md +0 -78
- data/Gemfile +0 -18
- data/Gemfile.lock +0 -126
- data/Rakefile +0 -28
- data/bin/console +0 -19
- data/bin/rubocop +0 -29
- data/bin/tapioca +0 -29
- data/bin/test +0 -9
- data/dev.yml +0 -20
- data/rakelib/check_docs.rake +0 -81
- data/ruby-lsp.gemspec +0 -27
- data/service.yml +0 -2
- data/sorbet/config +0 -4
- data/sorbet/rbi/.rubocop.yml +0 -8
- data/sorbet/rbi/gems/ansi@1.5.0.rbi +0 -338
- data/sorbet/rbi/gems/ast@2.4.2.rbi +0 -522
- data/sorbet/rbi/gems/builder@3.2.4.rbi +0 -418
- data/sorbet/rbi/gems/coderay@1.1.3.rbi +0 -8
- data/sorbet/rbi/gems/debug@1.5.0.rbi +0 -1273
- data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +0 -867
- data/sorbet/rbi/gems/io-console@0.5.11.rbi +0 -8
- data/sorbet/rbi/gems/irb@1.4.1.rbi +0 -376
- data/sorbet/rbi/gems/language_server-protocol@3.16.0.3.rbi +0 -7325
- data/sorbet/rbi/gems/method_source@1.0.0.rbi +0 -8
- data/sorbet/rbi/gems/minitest-reporters@1.5.0.rbi +0 -612
- data/sorbet/rbi/gems/minitest@5.15.0.rbi +0 -994
- data/sorbet/rbi/gems/parallel@1.22.1.rbi +0 -163
- data/sorbet/rbi/gems/parser@3.1.2.0.rbi +0 -3968
- data/sorbet/rbi/gems/prettier_print@0.1.0.rbi +0 -734
- data/sorbet/rbi/gems/pry@0.14.1.rbi +0 -8
- data/sorbet/rbi/gems/rainbow@3.1.1.rbi +0 -227
- data/sorbet/rbi/gems/rake@13.0.6.rbi +0 -1853
- data/sorbet/rbi/gems/rbi@0.0.14.rbi +0 -2337
- data/sorbet/rbi/gems/regexp_parser@2.5.0.rbi +0 -1854
- data/sorbet/rbi/gems/reline@0.3.1.rbi +0 -1274
- data/sorbet/rbi/gems/rexml@3.2.5.rbi +0 -3852
- data/sorbet/rbi/gems/rubocop-ast@1.18.0.rbi +0 -4180
- data/sorbet/rbi/gems/rubocop-minitest@0.20.0.rbi +0 -1369
- data/sorbet/rbi/gems/rubocop-rake@0.6.0.rbi +0 -246
- data/sorbet/rbi/gems/rubocop-shopify@2.6.0.rbi +0 -8
- data/sorbet/rbi/gems/rubocop-sorbet@0.6.8.rbi +0 -652
- data/sorbet/rbi/gems/rubocop@1.30.0.rbi +0 -36729
- data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +0 -732
- data/sorbet/rbi/gems/spoom@1.1.11.rbi +0 -1600
- data/sorbet/rbi/gems/syntax_tree@2.7.1.rbi +0 -6777
- data/sorbet/rbi/gems/tapioca@0.8.1.rbi +0 -1972
- data/sorbet/rbi/gems/thor@1.2.1.rbi +0 -2921
- data/sorbet/rbi/gems/unicode-display_width@2.1.0.rbi +0 -27
- data/sorbet/rbi/gems/unparser@0.6.5.rbi +0 -2789
- data/sorbet/rbi/gems/webrick@1.7.0.rbi +0 -1779
- data/sorbet/rbi/gems/yard-sorbet@0.6.1.rbi +0 -289
- data/sorbet/rbi/gems/yard@0.9.27.rbi +0 -13048
- data/sorbet/rbi/shims/fiddle.rbi +0 -4
- data/sorbet/rbi/shims/hash.rbi +0 -6
- data/sorbet/rbi/shims/rdoc.rbi +0 -4
- data/sorbet/tapioca/config.yml +0 -13
- data/sorbet/tapioca/require.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f263a066e68d798f4808df8b595c06345061623ab706b9f3ed8ffa0573d8ea47
|
4
|
+
data.tar.gz: 46eeeb5c2938d46e24a2d0a01e5772a49c27db9f3ab4a03ad840a1059e5161c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9c78db0a6b5262fc618fd1e7d4832f7a74d76130a29767a339897a06b5ff6fbc2799b328127f596d327d0adbff074e17ebacc5b88a7af97dff640220466ce1b
|
7
|
+
data.tar.gz: 3ddc525a0ad7220537db5ee0a94a208182821d0f5c321f5ab3babafba97d84ee196b392cedc7c925be20df801244c519d425822941e791a73563224f0b00b6b6
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,20 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.2.3]
|
10
|
+
|
11
|
+
- Resolve generic source URIs for jump to gem source (https://github.com/Shopify/ruby-lsp/pull/237)
|
12
|
+
|
13
|
+
## [0.2.2]
|
14
|
+
|
15
|
+
- Support document links (https://github.com/Shopify/ruby-lsp/pull/195)
|
16
|
+
- Avoid returning on request blocks (https://github.com/Shopify/ruby-lsp/pull/232)
|
17
|
+
- Better specify gemspec files (https://github.com/Shopify/ruby-lsp/pull/233)
|
18
|
+
- Include Kernel instance methods as special methods for semantic highlighting (https://github.com/Shopify/ruby-lsp/pull/231)
|
19
|
+
- Fix call processing when message is a :call symbol literal (https://github.com/Shopify/ruby-lsp/pull/236)
|
20
|
+
- Alert users about non auto-correctable diagnostics (https://github.com/Shopify/ruby-lsp/pull/230)
|
21
|
+
- Let clients pull diagnostics instead of pushing on edits (https://github.com/Shopify/ruby-lsp/pull/242)
|
22
|
+
|
9
23
|
## [0.2.1]
|
10
24
|
|
11
25
|
- Implement the exit lifecycle request (https://github.com/Shopify/ruby-lsp/pull/198)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
data/lib/ruby_lsp/handler.rb
CHANGED
@@ -86,25 +86,6 @@ module RubyLsp
|
|
86
86
|
store.clear
|
87
87
|
end
|
88
88
|
|
89
|
-
sig { params(uri: String).void }
|
90
|
-
def send_diagnostics(uri)
|
91
|
-
response = store.cache_fetch(uri, :diagnostics) do |document|
|
92
|
-
Requests::Diagnostics.new(uri, document).run
|
93
|
-
end
|
94
|
-
|
95
|
-
return if response.nil?
|
96
|
-
|
97
|
-
@writer.write(
|
98
|
-
method: "textDocument/publishDiagnostics",
|
99
|
-
params: Interface::PublishDiagnosticsParams.new(
|
100
|
-
uri: uri,
|
101
|
-
diagnostics: response.map(&:to_lsp_diagnostic)
|
102
|
-
)
|
103
|
-
)
|
104
|
-
rescue RuboCop::ValidationError => e
|
105
|
-
show_message(Constant::MessageType::ERROR, "Error in RuboCop configuration file: #{e.message}")
|
106
|
-
end
|
107
|
-
|
108
89
|
sig { params(uri: String).void }
|
109
90
|
def clear_diagnostics(uri)
|
110
91
|
@writer.write(
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "ruby_lsp/requests/support/source_uri"
|
5
|
+
|
6
|
+
module RubyLsp
|
7
|
+
module Requests
|
8
|
+
# 
|
9
|
+
#
|
10
|
+
# The [document link](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentLink)
|
11
|
+
# makes `# source://PATH_TO_FILE#line` comments in a Ruby/RBI file clickable if the file exists.
|
12
|
+
# When the user clicks the link, it'll open that location.
|
13
|
+
#
|
14
|
+
# # Example
|
15
|
+
#
|
16
|
+
# ```ruby
|
17
|
+
# # source://syntax_tree/3.2.1/lib/syntax_tree.rb#51 <- it will be clickable and will take the user to that location
|
18
|
+
# def format(source, maxwidth = T.unsafe(nil))
|
19
|
+
# end
|
20
|
+
# ```
|
21
|
+
class DocumentLink < BaseRequest
|
22
|
+
extend T::Sig
|
23
|
+
|
24
|
+
GEM_TO_VERSION_MAP = T.let(
|
25
|
+
[*::Gem::Specification.default_stubs, *::Gem::Specification.stubs].map! do |s|
|
26
|
+
[s.name, s.version.to_s]
|
27
|
+
end.to_h.freeze,
|
28
|
+
T::Hash[String, String]
|
29
|
+
)
|
30
|
+
|
31
|
+
class << self
|
32
|
+
extend T::Sig
|
33
|
+
|
34
|
+
sig { returns(T::Hash[String, T::Array[String]]) }
|
35
|
+
def gem_paths
|
36
|
+
@gem_paths ||= T.let(begin
|
37
|
+
lookup = {}
|
38
|
+
|
39
|
+
Gem::Specification.stubs.each do |stub|
|
40
|
+
spec = stub.to_spec
|
41
|
+
lookup[spec.name] = {}
|
42
|
+
lookup[spec.name][spec.version.to_s] = {}
|
43
|
+
|
44
|
+
Dir.glob("**/*.rb", base: "#{spec.full_gem_path}/").each do |path|
|
45
|
+
lookup[spec.name][spec.version.to_s][path] = "#{spec.full_gem_path}/#{path}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
Gem::Specification.default_stubs.each do |stub|
|
50
|
+
spec = stub.to_spec
|
51
|
+
lookup[spec.name] = {}
|
52
|
+
lookup[spec.name][spec.version.to_s] = {}
|
53
|
+
prefix_matchers = [//]
|
54
|
+
prefix_matchers.concat(spec.require_paths.map { |rp| Regexp.new("^#{rp}/") })
|
55
|
+
prefix_matcher = Regexp.union(prefix_matchers)
|
56
|
+
|
57
|
+
spec.files.each do |file|
|
58
|
+
path = file.sub(prefix_matcher, "")
|
59
|
+
lookup[spec.name][spec.version.to_s][path] = "#{RbConfig::CONFIG["rubylibdir"]}/#{path}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
lookup
|
64
|
+
end, T.nilable(T::Hash[String, T::Array[String]]))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
sig { params(uri: String, document: Document).void }
|
69
|
+
def initialize(uri, document)
|
70
|
+
super(document)
|
71
|
+
|
72
|
+
# Match the version based on the version in the RBI file name. Notice that the `@` symbol is sanitized to `%40`
|
73
|
+
# in the URI
|
74
|
+
version_match = /(?<=%40)[\d.]+(?=\.rbi$)/.match(uri)
|
75
|
+
@gem_version = T.let(version_match && version_match[0], T.nilable(String))
|
76
|
+
@links = T.let([], T::Array[LanguageServer::Protocol::Interface::DocumentLink])
|
77
|
+
end
|
78
|
+
|
79
|
+
sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::DocumentLink], Object)) }
|
80
|
+
def run
|
81
|
+
visit(@document.tree)
|
82
|
+
@links
|
83
|
+
end
|
84
|
+
|
85
|
+
sig { params(node: SyntaxTree::Comment).void }
|
86
|
+
def visit_comment(node)
|
87
|
+
match = node.value.match(%r{source://.*#\d+$})
|
88
|
+
return unless match
|
89
|
+
|
90
|
+
uri = T.cast(URI(match[0]), URI::Source)
|
91
|
+
gem_version = resolve_version(uri)
|
92
|
+
file_path = self.class.gem_paths.dig(uri.gem_name, gem_version, uri.path)
|
93
|
+
return if file_path.nil?
|
94
|
+
|
95
|
+
@links << LanguageServer::Protocol::Interface::DocumentLink.new(
|
96
|
+
range: range_from_syntax_tree_node(node),
|
97
|
+
target: "file://#{file_path}##{uri.line_number}",
|
98
|
+
tooltip: "Jump to #{file_path}##{uri.line_number}"
|
99
|
+
)
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
# Try to figure out the gem version for a source:// link. The order of precedence is:
|
105
|
+
# 1. The version in the URI
|
106
|
+
# 2. The version in the RBI file name
|
107
|
+
# 3. The version from the gemspec
|
108
|
+
sig { params(uri: URI::Source).returns(T.nilable(String)) }
|
109
|
+
def resolve_version(uri)
|
110
|
+
version = uri.gem_version
|
111
|
+
return version unless version.nil? || version.empty?
|
112
|
+
|
113
|
+
return @gem_version unless @gem_version.nil? || @gem_version.empty?
|
114
|
+
|
115
|
+
GEM_TO_VERSION_MAP[uri.gem_name]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -60,10 +60,13 @@ module RubyLsp
|
|
60
60
|
default_library: 9,
|
61
61
|
}.freeze, T::Hash[Symbol, Integer])
|
62
62
|
|
63
|
-
SPECIAL_RUBY_METHODS = T.let(
|
64
|
-
|
65
|
-
|
66
|
-
.
|
63
|
+
SPECIAL_RUBY_METHODS = T.let([
|
64
|
+
Module.instance_methods(false),
|
65
|
+
Kernel.instance_methods(false),
|
66
|
+
Kernel.methods(false),
|
67
|
+
Bundler::Dsl.instance_methods(false),
|
68
|
+
Module.private_instance_methods(false),
|
69
|
+
].flatten.map(&:to_s), T::Array[String])
|
67
70
|
|
68
71
|
class SemanticToken < T::Struct
|
69
72
|
const :location, SyntaxTree::Location
|
@@ -105,7 +108,10 @@ module RubyLsp
|
|
105
108
|
sig { params(node: SyntaxTree::Call).void }
|
106
109
|
def visit_call(node)
|
107
110
|
visit(node.receiver)
|
108
|
-
|
111
|
+
|
112
|
+
message = node.message
|
113
|
+
add_token(message.location, :method) if message != :call
|
114
|
+
|
109
115
|
visit(node.arguments)
|
110
116
|
end
|
111
117
|
|
@@ -76,7 +76,8 @@ module RubyLsp
|
|
76
76
|
when SyntaxTree::VarField, SyntaxTree::VarRef, SyntaxTree::VCall, SyntaxTree::FCall
|
77
77
|
node.value&.value
|
78
78
|
when SyntaxTree::Call, SyntaxTree::Command, SyntaxTree::CommandCall
|
79
|
-
node.message
|
79
|
+
message = node.message
|
80
|
+
message != :call ? message.value : nil
|
80
81
|
when SyntaxTree::ClassDeclaration, SyntaxTree::ModuleDeclaration
|
81
82
|
node.constant.constant.value
|
82
83
|
end
|
@@ -61,11 +61,18 @@ module RubyLsp
|
|
61
61
|
|
62
62
|
sig { returns(LanguageServer::Protocol::Interface::Diagnostic) }
|
63
63
|
def to_lsp_diagnostic
|
64
|
+
if @offense.correctable?
|
65
|
+
severity = RUBOCOP_TO_LSP_SEVERITY[@offense.severity.name]
|
66
|
+
message = @offense.message
|
67
|
+
else
|
68
|
+
severity = LanguageServer::Protocol::Constant::DiagnosticSeverity::WARNING
|
69
|
+
message = "#{@offense.message}\n\nThis offense is not auto-correctable.\n"
|
70
|
+
end
|
64
71
|
LanguageServer::Protocol::Interface::Diagnostic.new(
|
65
|
-
message:
|
72
|
+
message: message,
|
66
73
|
source: "RuboCop",
|
67
74
|
code: @offense.cop_name,
|
68
|
-
severity:
|
75
|
+
severity: severity,
|
69
76
|
range: LanguageServer::Protocol::Interface::Range.new(
|
70
77
|
start: LanguageServer::Protocol::Interface::Position.new(
|
71
78
|
line: @offense.line - 1,
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "uri/file"
|
5
|
+
|
6
|
+
module URI
|
7
|
+
# Must be kept in sync with the one in Tapioca
|
8
|
+
class Source < URI::File
|
9
|
+
extend T::Sig
|
10
|
+
|
11
|
+
COMPONENT = T.let([
|
12
|
+
:scheme,
|
13
|
+
:gem_name,
|
14
|
+
:gem_version,
|
15
|
+
:path,
|
16
|
+
:line_number,
|
17
|
+
].freeze, T::Array[Symbol])
|
18
|
+
|
19
|
+
T.unsafe(self).alias_method(:gem_name, :host)
|
20
|
+
T.unsafe(self).alias_method(:line_number, :fragment)
|
21
|
+
|
22
|
+
sig { returns(T.nilable(String)) }
|
23
|
+
attr_reader :gem_version
|
24
|
+
|
25
|
+
class << self
|
26
|
+
extend T::Sig
|
27
|
+
|
28
|
+
sig do
|
29
|
+
params(
|
30
|
+
gem_name: String,
|
31
|
+
gem_version: T.nilable(String),
|
32
|
+
path: String,
|
33
|
+
line_number: T.nilable(String)
|
34
|
+
).returns(URI::Source)
|
35
|
+
end
|
36
|
+
def build(gem_name:, gem_version:, path:, line_number:)
|
37
|
+
super(
|
38
|
+
{
|
39
|
+
scheme: "source",
|
40
|
+
host: gem_name,
|
41
|
+
path: DEFAULT_PARSER.escape("/#{gem_version}/#{path}"),
|
42
|
+
fragment: line_number,
|
43
|
+
}
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
sig { params(v: T.nilable(String)).void }
|
49
|
+
def set_path(v) # rubocop:disable Naming/AccessorMethodName
|
50
|
+
return if v.nil?
|
51
|
+
|
52
|
+
gem_version, path = v.delete_prefix("/").split("/", 2)
|
53
|
+
|
54
|
+
@gem_version = T.let(gem_version, T.nilable(String))
|
55
|
+
@path = T.let(path, T.nilable(String))
|
56
|
+
end
|
57
|
+
|
58
|
+
sig { params(v: T.nilable(String)).returns(T::Boolean) }
|
59
|
+
def check_host(v)
|
60
|
+
return true unless v
|
61
|
+
|
62
|
+
if /[A-Za-z][A-Za-z0-9\-_]*/ !~ v
|
63
|
+
raise InvalidComponentError,
|
64
|
+
"bad component(expected gem name): #{v}"
|
65
|
+
end
|
66
|
+
|
67
|
+
true
|
68
|
+
end
|
69
|
+
|
70
|
+
sig { returns(String) }
|
71
|
+
def to_s
|
72
|
+
"source://#{gem_name}/#{gem_version}#{path}##{line_number}"
|
73
|
+
end
|
74
|
+
|
75
|
+
if URI.respond_to?(:register_scheme)
|
76
|
+
URI.register_scheme("SOURCE", self)
|
77
|
+
else
|
78
|
+
@@schemes = T.let(@@schemes, T::Hash[String, Class]) # rubocop:disable Style/ClassVars
|
79
|
+
@@schemes["SOURCE"] = self
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/ruby_lsp/requests.rb
CHANGED
@@ -5,6 +5,7 @@ module RubyLsp
|
|
5
5
|
# Supported features
|
6
6
|
#
|
7
7
|
# - {RubyLsp::Requests::DocumentSymbol}
|
8
|
+
# - {RubyLsp::Requests::DocumentLink}
|
8
9
|
# - {RubyLsp::Requests::FoldingRanges}
|
9
10
|
# - {RubyLsp::Requests::SelectionRanges}
|
10
11
|
# - {RubyLsp::Requests::SemanticHighlighting}
|
@@ -15,6 +16,7 @@ module RubyLsp
|
|
15
16
|
module Requests
|
16
17
|
autoload :BaseRequest, "ruby_lsp/requests/base_request"
|
17
18
|
autoload :DocumentSymbol, "ruby_lsp/requests/document_symbol"
|
19
|
+
autoload :DocumentLink, "ruby_lsp/requests/document_link"
|
18
20
|
autoload :FoldingRanges, "ruby_lsp/requests/folding_ranges"
|
19
21
|
autoload :SelectionRanges, "ruby_lsp/requests/selection_ranges"
|
20
22
|
autoload :SemanticHighlighting, "ruby_lsp/requests/semantic_highlighting"
|
data/lib/ruby_lsp/server.rb
CHANGED
@@ -19,6 +19,10 @@ module RubyLsp
|
|
19
19
|
)
|
20
20
|
end
|
21
21
|
|
22
|
+
document_link_provider = if enabled_features.include?("documentLink")
|
23
|
+
Interface::DocumentLinkOptions.new(resolve_provider: false)
|
24
|
+
end
|
25
|
+
|
22
26
|
folding_ranges_provider = if enabled_features.include?("foldingRanges")
|
23
27
|
Interface::FoldingRangeClientCapabilities.new(line_folding_only: true)
|
24
28
|
end
|
@@ -37,20 +41,30 @@ module RubyLsp
|
|
37
41
|
)
|
38
42
|
end
|
39
43
|
|
44
|
+
diagnostics_provider = if enabled_features.include?("diagnostics")
|
45
|
+
{
|
46
|
+
interFileDependencies: false,
|
47
|
+
workspaceDiagnostics: false,
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
# TODO: switch back to using Interface::ServerCapabilities once the gem is updated for spec 3.17
|
40
52
|
Interface::InitializeResult.new(
|
41
|
-
capabilities:
|
42
|
-
|
53
|
+
capabilities: {
|
54
|
+
textDocumentSync: Interface::TextDocumentSyncOptions.new(
|
43
55
|
change: Constant::TextDocumentSyncKind::INCREMENTAL,
|
44
56
|
open_close: true,
|
45
57
|
),
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
58
|
+
selectionRangeProvider: enabled_features.include?("selectionRanges"),
|
59
|
+
documentSymbolProvider: document_symbol_provider,
|
60
|
+
documentLinkProvider: document_link_provider,
|
61
|
+
foldingRangeProvider: folding_ranges_provider,
|
62
|
+
semanticTokensProvider: semantic_tokens_provider,
|
63
|
+
documentFormattingProvider: enabled_features.include?("formatting"),
|
64
|
+
documentHighlightProvider: enabled_features.include?("documentHighlights"),
|
65
|
+
codeActionProvider: enabled_features.include?("codeActions"),
|
66
|
+
diagnosticProvider: diagnostics_provider,
|
67
|
+
}.reject { |_, v| !v }
|
54
68
|
)
|
55
69
|
end
|
56
70
|
|
@@ -58,7 +72,6 @@ module RubyLsp
|
|
58
72
|
uri = request.dig(:params, :textDocument, :uri)
|
59
73
|
store.push_edits(uri, request.dig(:params, :contentChanges))
|
60
74
|
|
61
|
-
send_diagnostics(uri)
|
62
75
|
Handler::VOID
|
63
76
|
end
|
64
77
|
|
@@ -67,7 +80,6 @@ module RubyLsp
|
|
67
80
|
text = request.dig(:params, :textDocument, :text)
|
68
81
|
store.set(uri, text)
|
69
82
|
|
70
|
-
send_diagnostics(uri)
|
71
83
|
Handler::VOID
|
72
84
|
end
|
73
85
|
|
@@ -85,6 +97,13 @@ module RubyLsp
|
|
85
97
|
end
|
86
98
|
end
|
87
99
|
|
100
|
+
on("textDocument/documentLink") do |request|
|
101
|
+
uri = request.dig(:params, :textDocument, :uri)
|
102
|
+
store.cache_fetch(uri, :document_link) do |document|
|
103
|
+
RubyLsp::Requests::DocumentLink.new(uri, document).run
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
88
107
|
on("textDocument/foldingRange") do |request|
|
89
108
|
store.cache_fetch(request.dig(:params, :textDocument, :uri), :folding_ranges) do |document|
|
90
109
|
Requests::FoldingRanges.new(document).run
|
@@ -99,15 +118,16 @@ module RubyLsp
|
|
99
118
|
Requests::SelectionRanges.new(document).run
|
100
119
|
end
|
101
120
|
|
102
|
-
return if ranges.nil?
|
103
|
-
|
104
121
|
# Per the selection range request spec (https://microsoft.github.io/language-server-protocol/specification#textDocument_selectionRange),
|
105
122
|
# every position in the positions array should have an element at the same index in the response
|
106
123
|
# array. For positions without a valid selection range, the corresponding element in the response
|
107
124
|
# array will be nil.
|
108
|
-
|
109
|
-
|
110
|
-
|
125
|
+
|
126
|
+
unless ranges.nil?
|
127
|
+
positions.map do |position|
|
128
|
+
ranges.find do |range|
|
129
|
+
range.cover?(position)
|
130
|
+
end
|
111
131
|
end
|
112
132
|
end
|
113
133
|
end
|
@@ -132,9 +152,10 @@ module RubyLsp
|
|
132
152
|
|
133
153
|
on("textDocument/documentHighlight") do |request|
|
134
154
|
document = store.get(request.dig(:params, :textDocument, :uri))
|
135
|
-
return unless document.parsed?
|
136
155
|
|
137
|
-
|
156
|
+
if document.parsed?
|
157
|
+
Requests::DocumentHighlight.new(document, request.dig(:params, :position)).run
|
158
|
+
end
|
138
159
|
end
|
139
160
|
|
140
161
|
on("textDocument/codeAction") do |request|
|
@@ -148,6 +169,18 @@ module RubyLsp
|
|
148
169
|
end
|
149
170
|
end
|
150
171
|
|
172
|
+
on("textDocument/diagnostic") do |request|
|
173
|
+
uri = request.dig(:params, :textDocument, :uri)
|
174
|
+
response = store.cache_fetch(uri, :diagnostics) do |document|
|
175
|
+
Requests::Diagnostics.new(uri, document).run
|
176
|
+
end
|
177
|
+
|
178
|
+
{ kind: "full", items: response.map(&:to_lsp_diagnostic) } if response
|
179
|
+
rescue RuboCop::ValidationError => e
|
180
|
+
show_message(Constant::MessageType::ERROR, "Error in RuboCop configuration file: #{e.message}")
|
181
|
+
nil
|
182
|
+
end
|
183
|
+
|
151
184
|
on("shutdown") { shutdown }
|
152
185
|
|
153
186
|
on("exit") do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lsp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|
@@ -60,29 +60,10 @@ executables:
|
|
60
60
|
extensions: []
|
61
61
|
extra_rdoc_files: []
|
62
62
|
files:
|
63
|
-
- ".github/dependabot.yml"
|
64
|
-
- ".github/probots.yml"
|
65
|
-
- ".github/pull_request_template.md"
|
66
|
-
- ".github/workflows/ci.yml"
|
67
|
-
- ".github/workflows/publish_docs.yml"
|
68
|
-
- ".gitignore"
|
69
|
-
- ".rubocop.yml"
|
70
|
-
- ".vscode/extensions.json"
|
71
|
-
- ".vscode/settings.json"
|
72
|
-
- ".vscode/tasks.json"
|
73
63
|
- CHANGELOG.md
|
74
|
-
- CODE_OF_CONDUCT.md
|
75
|
-
- Gemfile
|
76
|
-
- Gemfile.lock
|
77
64
|
- LICENSE.txt
|
78
65
|
- README.md
|
79
|
-
- Rakefile
|
80
66
|
- VERSION
|
81
|
-
- bin/console
|
82
|
-
- bin/rubocop
|
83
|
-
- bin/tapioca
|
84
|
-
- bin/test
|
85
|
-
- dev.yml
|
86
67
|
- exe/ruby-lsp
|
87
68
|
- lib/ruby-lsp.rb
|
88
69
|
- lib/ruby_lsp/document.rb
|
@@ -93,6 +74,7 @@ files:
|
|
93
74
|
- lib/ruby_lsp/requests/code_actions.rb
|
94
75
|
- lib/ruby_lsp/requests/diagnostics.rb
|
95
76
|
- lib/ruby_lsp/requests/document_highlight.rb
|
77
|
+
- lib/ruby_lsp/requests/document_link.rb
|
96
78
|
- lib/ruby_lsp/requests/document_symbol.rb
|
97
79
|
- lib/ruby_lsp/requests/folding_ranges.rb
|
98
80
|
- lib/ruby_lsp/requests/formatting.rb
|
@@ -104,57 +86,10 @@ files:
|
|
104
86
|
- lib/ruby_lsp/requests/support/rubocop_formatting_runner.rb
|
105
87
|
- lib/ruby_lsp/requests/support/selection_range.rb
|
106
88
|
- lib/ruby_lsp/requests/support/semantic_token_encoder.rb
|
89
|
+
- lib/ruby_lsp/requests/support/source_uri.rb
|
107
90
|
- lib/ruby_lsp/requests/support/syntax_error_diagnostic.rb
|
108
91
|
- lib/ruby_lsp/server.rb
|
109
92
|
- lib/ruby_lsp/store.rb
|
110
|
-
- rakelib/check_docs.rake
|
111
|
-
- ruby-lsp.gemspec
|
112
|
-
- service.yml
|
113
|
-
- sorbet/config
|
114
|
-
- sorbet/rbi/.rubocop.yml
|
115
|
-
- sorbet/rbi/gems/ansi@1.5.0.rbi
|
116
|
-
- sorbet/rbi/gems/ast@2.4.2.rbi
|
117
|
-
- sorbet/rbi/gems/builder@3.2.4.rbi
|
118
|
-
- sorbet/rbi/gems/coderay@1.1.3.rbi
|
119
|
-
- sorbet/rbi/gems/debug@1.5.0.rbi
|
120
|
-
- sorbet/rbi/gems/diff-lcs@1.5.0.rbi
|
121
|
-
- sorbet/rbi/gems/io-console@0.5.11.rbi
|
122
|
-
- sorbet/rbi/gems/irb@1.4.1.rbi
|
123
|
-
- sorbet/rbi/gems/language_server-protocol@3.16.0.3.rbi
|
124
|
-
- sorbet/rbi/gems/method_source@1.0.0.rbi
|
125
|
-
- sorbet/rbi/gems/minitest-reporters@1.5.0.rbi
|
126
|
-
- sorbet/rbi/gems/minitest@5.15.0.rbi
|
127
|
-
- sorbet/rbi/gems/parallel@1.22.1.rbi
|
128
|
-
- sorbet/rbi/gems/parser@3.1.2.0.rbi
|
129
|
-
- sorbet/rbi/gems/prettier_print@0.1.0.rbi
|
130
|
-
- sorbet/rbi/gems/pry@0.14.1.rbi
|
131
|
-
- sorbet/rbi/gems/rainbow@3.1.1.rbi
|
132
|
-
- sorbet/rbi/gems/rake@13.0.6.rbi
|
133
|
-
- sorbet/rbi/gems/rbi@0.0.14.rbi
|
134
|
-
- sorbet/rbi/gems/regexp_parser@2.5.0.rbi
|
135
|
-
- sorbet/rbi/gems/reline@0.3.1.rbi
|
136
|
-
- sorbet/rbi/gems/rexml@3.2.5.rbi
|
137
|
-
- sorbet/rbi/gems/rubocop-ast@1.18.0.rbi
|
138
|
-
- sorbet/rbi/gems/rubocop-minitest@0.20.0.rbi
|
139
|
-
- sorbet/rbi/gems/rubocop-rake@0.6.0.rbi
|
140
|
-
- sorbet/rbi/gems/rubocop-shopify@2.6.0.rbi
|
141
|
-
- sorbet/rbi/gems/rubocop-sorbet@0.6.8.rbi
|
142
|
-
- sorbet/rbi/gems/rubocop@1.30.0.rbi
|
143
|
-
- sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi
|
144
|
-
- sorbet/rbi/gems/spoom@1.1.11.rbi
|
145
|
-
- sorbet/rbi/gems/syntax_tree@2.7.1.rbi
|
146
|
-
- sorbet/rbi/gems/tapioca@0.8.1.rbi
|
147
|
-
- sorbet/rbi/gems/thor@1.2.1.rbi
|
148
|
-
- sorbet/rbi/gems/unicode-display_width@2.1.0.rbi
|
149
|
-
- sorbet/rbi/gems/unparser@0.6.5.rbi
|
150
|
-
- sorbet/rbi/gems/webrick@1.7.0.rbi
|
151
|
-
- sorbet/rbi/gems/yard-sorbet@0.6.1.rbi
|
152
|
-
- sorbet/rbi/gems/yard@0.9.27.rbi
|
153
|
-
- sorbet/rbi/shims/fiddle.rbi
|
154
|
-
- sorbet/rbi/shims/hash.rbi
|
155
|
-
- sorbet/rbi/shims/rdoc.rbi
|
156
|
-
- sorbet/tapioca/config.yml
|
157
|
-
- sorbet/tapioca/require.rb
|
158
93
|
homepage: https://github.com/Shopify/ruby-lsp
|
159
94
|
licenses:
|
160
95
|
- MIT
|
data/.github/dependabot.yml
DELETED
data/.github/probots.yml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
### Motivation
|
2
|
-
|
3
|
-
<!-- Explain why you are making this change. Include links to issues or describe the problem being solved, not the solution. -->
|
4
|
-
|
5
|
-
### Implementation
|
6
|
-
|
7
|
-
<!-- How did you implement your changes? Explain your solution, design decisions, things reviewers should watch out for. -->
|
8
|
-
|
9
|
-
### Automated Tests
|
10
|
-
|
11
|
-
<!-- We hope you added unit tests as part of your changes, just state that you have. If you haven't, state why. -->
|
12
|
-
|
13
|
-
### Manual Tests
|
14
|
-
|
15
|
-
<!-- Explain how we can test these changes in our own instance of VS Code. Provide the step by step instructions. -->
|
data/.github/workflows/ci.yml
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
name: CI
|
2
|
-
|
3
|
-
on: [push, pull_request]
|
4
|
-
|
5
|
-
jobs:
|
6
|
-
build:
|
7
|
-
runs-on: ubuntu-latest
|
8
|
-
strategy:
|
9
|
-
fail-fast: false
|
10
|
-
matrix:
|
11
|
-
ruby: [ "2.7", "3.0", "3.1" ]
|
12
|
-
name: Ruby ${{ matrix.ruby }}
|
13
|
-
steps:
|
14
|
-
- uses: actions/checkout@v2
|
15
|
-
- name: Set up Ruby
|
16
|
-
uses: ruby/setup-ruby@v1
|
17
|
-
with:
|
18
|
-
ruby-version: ${{ matrix.ruby }}
|
19
|
-
bundler-cache: true
|
20
|
-
|
21
|
-
- name: Check if documentation is up to date
|
22
|
-
run: bundle exec rake check_docs
|
23
|
-
|
24
|
-
- name: Typecheck
|
25
|
-
run: bundle exec srb tc
|
26
|
-
|
27
|
-
- name: Lint Ruby files
|
28
|
-
run: bin/rubocop
|
29
|
-
|
30
|
-
- name: Run tests
|
31
|
-
run: bin/test
|