ruby-lsp 0.4.1 → 0.4.3

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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +44 -52
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp +12 -0
  5. data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +62 -0
  6. data/lib/ruby_lsp/document.rb +13 -4
  7. data/lib/ruby_lsp/executor.rb +70 -26
  8. data/lib/ruby_lsp/internal.rb +1 -0
  9. data/lib/ruby_lsp/requests/base_request.rb +15 -6
  10. data/lib/ruby_lsp/requests/code_action_resolve.rb +40 -19
  11. data/lib/ruby_lsp/requests/code_actions.rb +5 -4
  12. data/lib/ruby_lsp/requests/diagnostics.rb +4 -4
  13. data/lib/ruby_lsp/requests/document_highlight.rb +3 -3
  14. data/lib/ruby_lsp/requests/document_link.rb +7 -7
  15. data/lib/ruby_lsp/requests/document_symbol.rb +14 -11
  16. data/lib/ruby_lsp/requests/folding_ranges.rb +38 -11
  17. data/lib/ruby_lsp/requests/formatting.rb +18 -5
  18. data/lib/ruby_lsp/requests/hover.rb +7 -6
  19. data/lib/ruby_lsp/requests/inlay_hints.rb +5 -4
  20. data/lib/ruby_lsp/requests/path_completion.rb +9 -3
  21. data/lib/ruby_lsp/requests/selection_ranges.rb +3 -3
  22. data/lib/ruby_lsp/requests/semantic_highlighting.rb +72 -8
  23. data/lib/ruby_lsp/requests/support/highlight_target.rb +5 -4
  24. data/lib/ruby_lsp/requests/support/rails_document_client.rb +7 -6
  25. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -1
  26. data/lib/ruby_lsp/requests/support/semantic_token_encoder.rb +2 -2
  27. data/lib/ruby_lsp/requests/support/sorbet.rb +5 -15
  28. data/lib/ruby_lsp/requests/support/syntax_tree_formatting_runner.rb +39 -0
  29. data/lib/ruby_lsp/server.rb +4 -1
  30. data/lib/ruby_lsp/store.rb +11 -7
  31. data/lib/ruby_lsp/utils.rb +3 -0
  32. metadata +7 -5
@@ -67,12 +67,13 @@ module RubyLsp
67
67
  return unless RAILTIES_VERSION
68
68
 
69
69
  warn("Fetching Rails Documents...")
70
- # If the version's doc is not found, e.g. Rails main, it'll be redirected
71
- # In this case, we just fetch the latest doc
72
- response = if Gem::Version.new(RAILTIES_VERSION).prerelease?
73
- Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/js/search_index.js"))
74
- else
75
- Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/v#{RAILTIES_VERSION}/js/search_index.js"))
70
+
71
+ response = Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/v#{RAILTIES_VERSION}/js/search_index.js"))
72
+
73
+ if response.code == "302"
74
+ # If the version's doc is not found, e.g. Rails main, it'll be redirected
75
+ # In this case, we just fetch the latest doc
76
+ response = Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/js/search_index.js"))
76
77
  end
77
78
 
78
79
  if response.code == "200"
@@ -4,7 +4,7 @@
4
4
  module RubyLsp
5
5
  module Requests
6
6
  module Support
7
- class SelectionRange < LanguageServer::Protocol::Interface::SelectionRange
7
+ class SelectionRange < Interface::SelectionRange
8
8
  extend T::Sig
9
9
 
10
10
  sig { params(position: Document::PositionShape).returns(T::Boolean) }
@@ -16,7 +16,7 @@ module RubyLsp
16
16
  sig do
17
17
  params(
18
18
  tokens: T::Array[SemanticHighlighting::SemanticToken],
19
- ).returns(LanguageServer::Protocol::Interface::SemanticTokens)
19
+ ).returns(Interface::SemanticTokens)
20
20
  end
21
21
  def encode(tokens)
22
22
  delta = tokens
@@ -27,7 +27,7 @@ module RubyLsp
27
27
  compute_delta(token)
28
28
  end
29
29
 
30
- LanguageServer::Protocol::Interface::SemanticTokens.new(data: delta)
30
+ Interface::SemanticTokens.new(data: delta)
31
31
  end
32
32
 
33
33
  # The delta array is computed according to the LSP specification:
@@ -63,7 +63,8 @@ module RubyLsp
63
63
  when SyntaxTree::VCall
64
64
  ANNOTATIONS[node.value.value]
65
65
  when SyntaxTree::CallNode
66
- ANNOTATIONS[node.message.value]
66
+ message = node.message
67
+ ANNOTATIONS[message.value] unless message.is_a?(Symbol)
67
68
  else
68
69
  T.absurd(node)
69
70
  end
@@ -84,21 +85,10 @@ module RubyLsp
84
85
  end
85
86
 
86
87
  sig do
87
- params(node: T.nilable(T.any(
88
- SyntaxTree::VarRef,
89
- SyntaxTree::CallNode,
90
- SyntaxTree::VCall,
91
- SyntaxTree::Ident,
92
- SyntaxTree::Backtick,
93
- SyntaxTree::Const,
94
- SyntaxTree::Op,
95
- Symbol,
96
- ))).returns(T.nilable(String))
88
+ params(node: T.nilable(SyntaxTree::Node)).returns(T.nilable(String))
97
89
  end
98
90
  def node_name(node)
99
91
  case node
100
- when NilClass
101
- nil
102
92
  when SyntaxTree::VarRef
103
93
  node.value.value
104
94
  when SyntaxTree::CallNode
@@ -107,8 +97,8 @@ module RubyLsp
107
97
  node_name(node.value)
108
98
  when SyntaxTree::Ident, SyntaxTree::Backtick, SyntaxTree::Const, SyntaxTree::Op
109
99
  node.value
110
- when Symbol
111
- node.to_s
100
+ when NilClass, SyntaxTree::Node
101
+ nil
112
102
  else
113
103
  T.absurd(node)
114
104
  end
@@ -0,0 +1,39 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "syntax_tree/cli"
5
+ require "singleton"
6
+
7
+ module RubyLsp
8
+ module Requests
9
+ module Support
10
+ # :nodoc:
11
+ class SyntaxTreeFormattingRunner
12
+ extend T::Sig
13
+ include Singleton
14
+
15
+ sig { void }
16
+ def initialize
17
+ @options =
18
+ T.let(
19
+ begin
20
+ opts = SyntaxTree::CLI::Options.new
21
+ opts.parse(SyntaxTree::CLI::ConfigFile.new.arguments)
22
+ opts
23
+ end,
24
+ SyntaxTree::CLI::Options,
25
+ )
26
+ end
27
+
28
+ sig { params(_uri: String, document: Document).returns(T.nilable(String)) }
29
+ def run(_uri, document)
30
+ SyntaxTree.format(
31
+ document.source,
32
+ @options.print_width,
33
+ options: @options.formatter_options,
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,9 +2,11 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RubyLsp
5
+ # rubocop:disable RubyLsp/UseLanguageServerAliases
5
6
  Interface = LanguageServer::Protocol::Interface
6
7
  Constant = LanguageServer::Protocol::Constant
7
8
  Transport = LanguageServer::Protocol::Transport
9
+ # rubocop:enable RubyLsp/UseLanguageServerAliases
8
10
 
9
11
  class Server
10
12
  extend T::Sig
@@ -33,7 +35,8 @@ module RubyLsp
33
35
  # fall under the else branch which just pushes requests to the queue
34
36
  @reader.read do |request|
35
37
  case request[:method]
36
- when "initialize", "initialized", "textDocument/didOpen", "textDocument/didClose", "textDocument/didChange"
38
+ when "initialize", "initialized", "textDocument/didOpen", "textDocument/didClose", "textDocument/didChange",
39
+ "textDocument/formatting", "textDocument/onTypeFormatting", "codeAction/resolve"
37
40
  result = Executor.new(@store).execute(request)
38
41
  finalize_request(result, request)
39
42
  when "$/cancelRequest"
@@ -12,10 +12,14 @@ module RubyLsp
12
12
  sig { params(encoding: String).void }
13
13
  attr_writer :encoding
14
14
 
15
+ sig { returns(String) }
16
+ attr_accessor :formatter
17
+
15
18
  sig { void }
16
19
  def initialize
17
20
  @state = T.let({}, T::Hash[String, Document])
18
21
  @encoding = T.let("utf-8", String)
22
+ @formatter = T.let("auto", String)
19
23
  end
20
24
 
21
25
  sig { params(uri: String).returns(Document) }
@@ -23,19 +27,19 @@ module RubyLsp
23
27
  document = @state[uri]
24
28
  return document unless document.nil?
25
29
 
26
- set(uri, File.binread(CGI.unescape(URI.parse(uri).path)))
30
+ set(uri: uri, source: File.binread(CGI.unescape(URI.parse(uri).path)), version: 0)
27
31
  T.must(@state[uri])
28
32
  end
29
33
 
30
- sig { params(uri: String, content: String).void }
31
- def set(uri, content)
32
- document = Document.new(content, @encoding)
34
+ sig { params(uri: String, source: String, version: Integer).void }
35
+ def set(uri:, source:, version:)
36
+ document = Document.new(source: source, version: version, uri: uri, encoding: @encoding)
33
37
  @state[uri] = document
34
38
  end
35
39
 
36
- sig { params(uri: String, edits: T::Array[Document::EditShape]).void }
37
- def push_edits(uri, edits)
38
- T.must(@state[uri]).push_edits(edits)
40
+ sig { params(uri: String, edits: T::Array[Document::EditShape], version: Integer).void }
41
+ def push_edits(uri:, edits:, version:)
42
+ T.must(@state[uri]).push_edits(edits, version: version)
39
43
  end
40
44
 
41
45
  sig { void }
@@ -5,6 +5,9 @@ module RubyLsp
5
5
  # Used to indicate that a request shouldn't return a response
6
6
  VOID = T.let(Object.new.freeze, Object)
7
7
 
8
+ # This freeze is not redundant since the interpolated string is mutable
9
+ WORKSPACE_URI = T.let("file://#{Dir.pwd}".freeze, String) # rubocop:disable Style/RedundantFreeze
10
+
8
11
  # A notification to be sent to the client
9
12
  class Notification
10
13
  extend T::Sig
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.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-22 00:00:00.000000000 Z
11
+ date: 2023-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: language_server-protocol
@@ -44,7 +44,7 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '6'
47
+ version: 6.1.1
48
48
  - - "<"
49
49
  - !ruby/object:Gem::Version
50
50
  version: '7'
@@ -54,7 +54,7 @@ dependencies:
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: '6'
57
+ version: 6.1.1
58
58
  - - "<"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '7'
@@ -70,6 +70,7 @@ files:
70
70
  - README.md
71
71
  - VERSION
72
72
  - exe/ruby-lsp
73
+ - lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb
73
74
  - lib/ruby-lsp.rb
74
75
  - lib/ruby_lsp/document.rb
75
76
  - lib/ruby_lsp/executor.rb
@@ -102,6 +103,7 @@ files:
102
103
  - lib/ruby_lsp/requests/support/semantic_token_encoder.rb
103
104
  - lib/ruby_lsp/requests/support/sorbet.rb
104
105
  - lib/ruby_lsp/requests/support/source_uri.rb
106
+ - lib/ruby_lsp/requests/support/syntax_tree_formatting_runner.rb
105
107
  - lib/ruby_lsp/server.rb
106
108
  - lib/ruby_lsp/store.rb
107
109
  - lib/ruby_lsp/utils.rb
@@ -125,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
127
  - !ruby/object:Gem::Version
126
128
  version: '0'
127
129
  requirements: []
128
- rubygems_version: 3.3.3
130
+ rubygems_version: 3.4.9
129
131
  signing_key:
130
132
  specification_version: 4
131
133
  summary: An opinionated language server for Ruby