ruby-lsp-rails 0.2.6 → 0.2.8

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: 70557479de3e98dce68fda3bf76ee6ee6a547ee2d123b7e26bf687306bdd1879
4
- data.tar.gz: 1c4560bc452b582ef4c40f793977ef4854cb4e8877bbd3850dbc1aa34b9e4f4a
3
+ metadata.gz: c3d8b40085e6c7ca1e23283423a0966da489180e36e4fb50415f41b1a37f5294
4
+ data.tar.gz: e98455cb80f6c386e9aa1c3fa516a29cbf0027826aed8c5af029cc1de61aaa05
5
5
  SHA512:
6
- metadata.gz: 01c4c4e000f1d0fb7996ed31a9474bc36a0ddabebdfe3d71dc276572172f0421be818037fb5d001bb77a8bd48cfd58466d1c3431595b8aad071466011f4e4d02
7
- data.tar.gz: 937340398445803a2413513a739c771bc9e21ae41813bd5529c3c68c654a2714803a0a9cf3d6d850df279188d8ef2d565767f1f157481091e5c8be891e3c0af5
6
+ metadata.gz: ff23cfda2194b449136438eee3475801c4568d7efa9dea08c9c60bd11f732af31c10a30b95014c7d366fbf5ad86dd7471dd3419ef4ef2808f031307d1ffc841e
7
+ data.tar.gz: 4a776b1c73b4c2683ba6db906afc3dccd2221f0dd4943a56d1a7fd1f0b4c43f92a789231d82e85aec2ba664fd505013c3c3a594a7b57d6931b35bfd433998ca0
@@ -17,8 +17,8 @@ module RubyLsp
17
17
  @client ||= T.let(RailsClient.new, T.nilable(RailsClient))
18
18
  end
19
19
 
20
- sig { override.void }
21
- def activate
20
+ sig { override.params(message_queue: Thread::Queue).void }
21
+ def activate(message_queue)
22
22
  client.check_if_server_is_running!
23
23
  end
24
24
 
@@ -29,24 +29,22 @@ module RubyLsp
29
29
  sig do
30
30
  override.params(
31
31
  uri: URI::Generic,
32
- emitter: EventEmitter,
33
- message_queue: Thread::Queue,
32
+ dispatcher: Prism::Dispatcher,
34
33
  ).returns(T.nilable(Listener[T::Array[Interface::CodeLens]]))
35
34
  end
36
- def create_code_lens_listener(uri, emitter, message_queue)
37
- CodeLens.new(uri, emitter, message_queue)
35
+ def create_code_lens_listener(uri, dispatcher)
36
+ CodeLens.new(uri, dispatcher)
38
37
  end
39
38
 
40
39
  sig do
41
40
  override.params(
42
41
  nesting: T::Array[String],
43
42
  index: RubyIndexer::Index,
44
- emitter: EventEmitter,
45
- message_queue: Thread::Queue,
43
+ dispatcher: Prism::Dispatcher,
46
44
  ).returns(T.nilable(Listener[T.nilable(Interface::Hover)]))
47
45
  end
48
- def create_hover_listener(nesting, index, emitter, message_queue)
49
- Hover.new(client, emitter, message_queue)
46
+ def create_hover_listener(nesting, index, dispatcher)
47
+ Hover.new(client, nesting, index, dispatcher)
50
48
  end
51
49
 
52
50
  sig { override.returns(String) }
@@ -42,17 +42,20 @@ module RubyLsp
42
42
  sig { override.returns(ResponseType) }
43
43
  attr_reader :_response
44
44
 
45
- sig { params(uri: URI::Generic, emitter: EventEmitter, message_queue: Thread::Queue).void }
46
- def initialize(uri, emitter, message_queue)
45
+ sig { params(uri: URI::Generic, dispatcher: Prism::Dispatcher).void }
46
+ def initialize(uri, dispatcher)
47
47
  @_response = T.let([], ResponseType)
48
48
  @path = T.let(uri.to_standardized_path, T.nilable(String))
49
- emitter.register(self, :on_call, :on_class, :on_def)
49
+ @group_id = T.let(1, Integer)
50
+ @group_id_stack = T.let([], T::Array[Integer])
50
51
 
51
- super(emitter, message_queue)
52
+ dispatcher.register(self, :on_call_node_enter, :on_class_node_enter, :on_def_node_enter, :on_class_node_leave)
53
+
54
+ super(dispatcher)
52
55
  end
53
56
 
54
- sig { params(node: YARP::CallNode).void }
55
- def on_call(node)
57
+ sig { params(node: Prism::CallNode).void }
58
+ def on_call_node_enter(node)
56
59
  message_value = node.message
57
60
  return unless message_value == "test"
58
61
 
@@ -62,15 +65,13 @@ module RubyLsp
62
65
  first_argument = arguments.first
63
66
 
64
67
  content = case first_argument
65
- when YARP::StringConcatNode
66
- left = first_argument.left
67
- right = first_argument.right
68
- # We only support two lines of concatenation on test names
69
- if left.is_a?(YARP::StringNode) &&
70
- right.is_a?(YARP::StringNode)
71
- left.content + right.content
68
+ when Prism::InterpolatedStringNode
69
+ parts = first_argument.parts
70
+
71
+ if parts.all? { |part| part.is_a?(Prism::StringNode) }
72
+ T.cast(parts, T::Array[Prism::StringNode]).map(&:content).join
72
73
  end
73
- when YARP::StringNode
74
+ when Prism::StringNode
74
75
  first_argument.content
75
76
  end
76
77
 
@@ -82,8 +83,8 @@ module RubyLsp
82
83
  end
83
84
 
84
85
  # Although uncommon, Rails tests can be written with the classic "def test_name" syntax.
85
- sig { params(node: YARP::DefNode).void }
86
- def on_def(node)
86
+ sig { params(node: Prism::DefNode).void }
87
+ def on_def_node_enter(node)
87
88
  method_name = node.name.to_s
88
89
  if method_name.start_with?("test_")
89
90
  line_number = node.location.start_line
@@ -92,18 +93,26 @@ module RubyLsp
92
93
  end
93
94
  end
94
95
 
95
- sig { params(node: YARP::ClassNode).void }
96
- def on_class(node)
96
+ sig { params(node: Prism::ClassNode).void }
97
+ def on_class_node_enter(node)
97
98
  class_name = node.constant_path.slice
98
99
  if class_name.end_with?("Test")
99
100
  command = "#{BASE_COMMAND} #{@path}"
100
101
  add_test_code_lens(node, name: class_name, command: command, kind: :group)
101
102
  end
103
+
104
+ @group_id_stack.push(@group_id)
105
+ @group_id += 1
106
+ end
107
+
108
+ sig { params(node: Prism::ClassNode).void }
109
+ def on_class_node_leave(node)
110
+ @group_id_stack.pop
102
111
  end
103
112
 
104
113
  private
105
114
 
106
- sig { params(node: YARP::Node, name: String, command: String, kind: Symbol).void }
115
+ sig { params(node: Prism::Node, name: String, command: String, kind: Symbol).void }
107
116
  def add_test_code_lens(node, name:, command:, kind:)
108
117
  return unless @path
109
118
 
@@ -119,12 +128,15 @@ module RubyLsp
119
128
  },
120
129
  ]
121
130
 
131
+ grouping_data = { group_id: @group_id_stack.last, kind: kind }
132
+ grouping_data[:id] = @group_id if kind == :group
133
+
122
134
  @_response << create_code_lens(
123
135
  node,
124
136
  title: "Run",
125
137
  command_name: "rubyLsp.runTest",
126
138
  arguments: arguments,
127
- data: { type: "test", kind: kind },
139
+ data: { type: "test", **grouping_data },
128
140
  )
129
141
 
130
142
  @_response << create_code_lens(
@@ -132,7 +144,7 @@ module RubyLsp
132
144
  title: "Run In Terminal",
133
145
  command_name: "rubyLsp.runTestInTerminal",
134
146
  arguments: arguments,
135
- data: { type: "test_in_terminal", kind: kind },
147
+ data: { type: "test_in_terminal", **grouping_data },
136
148
  )
137
149
 
138
150
  @_response << create_code_lens(
@@ -140,7 +152,7 @@ module RubyLsp
140
152
  title: "Debug",
141
153
  command_name: "rubyLsp.debugTest",
142
154
  arguments: arguments,
143
- data: { type: "debug", kind: kind },
155
+ data: { type: "debug", **grouping_data },
144
156
  )
145
157
  end
146
158
  end
@@ -25,37 +25,56 @@ module RubyLsp
25
25
  sig { override.returns(ResponseType) }
26
26
  attr_reader :_response
27
27
 
28
- sig { params(client: RailsClient, emitter: RubyLsp::EventEmitter, message_queue: Thread::Queue).void }
29
- def initialize(client, emitter, message_queue)
30
- super(emitter, message_queue)
28
+ sig do
29
+ params(
30
+ client: RailsClient,
31
+ nesting: T::Array[String],
32
+ index: RubyIndexer::Index,
33
+ dispatcher: Prism::Dispatcher,
34
+ ).void
35
+ end
36
+ def initialize(client, nesting, index, dispatcher)
37
+ super(dispatcher)
31
38
 
32
39
  @_response = T.let(nil, ResponseType)
33
40
  @client = client
34
- emitter.register(self, :on_constant_path, :on_constant_read, :on_call)
41
+ @nesting = nesting
42
+ @index = index
43
+ dispatcher.register(self, :on_constant_path_node_enter, :on_constant_read_node_enter, :on_call_node_enter)
35
44
  end
36
45
 
37
- sig { params(node: YARP::ConstantPathNode).void }
38
- def on_constant_path(node)
39
- @_response = generate_rails_document_link_hover(node.slice, node.location)
46
+ sig { params(node: Prism::ConstantPathNode).void }
47
+ def on_constant_path_node_enter(node)
48
+ entries = @index.resolve(node.slice, @nesting)
49
+ return unless entries
50
+
51
+ name = T.must(entries.first).name
52
+ content = +""
53
+ column_info = generate_column_content(name)
54
+ content << column_info if column_info
55
+
56
+ urls = Support::RailsDocumentClient.generate_rails_document_urls(name)
57
+ content << urls.join("\n\n") unless urls.empty?
58
+ return if content.empty?
59
+
60
+ contents = RubyLsp::Interface::MarkupContent.new(kind: "markdown", value: content)
61
+ @_response = RubyLsp::Interface::Hover.new(range: range_from_location(node.location), contents: contents)
40
62
  end
41
63
 
42
- sig { params(node: YARP::ConstantReadNode).void }
43
- def on_constant_read(node)
44
- model = @client.model(node.name.to_s)
45
- return if model.nil?
64
+ sig { params(node: Prism::ConstantReadNode).void }
65
+ def on_constant_read_node_enter(node)
66
+ entries = @index.resolve(node.name.to_s, @nesting)
67
+ return unless entries
68
+
69
+ content = generate_column_content(T.must(entries.first).name)
70
+ return unless content
46
71
 
47
- schema_file = model[:schema_file]
48
- content = +""
49
- if schema_file
50
- content << "[Schema](#{URI::Generic.build(scheme: "file", path: schema_file)})\n\n"
51
- end
52
- content << model[:columns].map { |name, type| "**#{name}**: #{type}\n" }.join("\n")
53
72
  contents = RubyLsp::Interface::MarkupContent.new(kind: "markdown", value: content)
54
- @_response = RubyLsp::Interface::Hover.new(range: range_from_node(node), contents: contents)
73
+ @_response = RubyLsp::Interface::Hover.new(range: range_from_location(node.location), contents: contents)
55
74
  end
56
75
 
57
- sig { params(node: YARP::CallNode).void }
58
- def on_call(node)
76
+ sig { params(node: Prism::CallNode).void }
77
+ def on_call_node_enter(node)
59
78
  message_value = node.message
60
79
  message_loc = node.message_loc
61
80
 
@@ -66,7 +85,19 @@ module RubyLsp
66
85
 
67
86
  private
68
87
 
69
- sig { params(name: String, location: YARP::Location).returns(T.nilable(Interface::Hover)) }
88
+ sig { params(name: String).returns(T.nilable(String)) }
89
+ def generate_column_content(name)
90
+ model = @client.model(name)
91
+ return if model.nil?
92
+
93
+ schema_file = model[:schema_file]
94
+ content = +""
95
+ content << "[Schema](#{URI::Generic.build(scheme: "file", path: schema_file)})\n\n" if schema_file
96
+ content << model[:columns].map { |name, type| "**#{name}**: #{type}\n" }.join("\n")
97
+ content
98
+ end
99
+
100
+ sig { params(name: String, location: Prism::Location).returns(T.nilable(Interface::Hover)) }
70
101
  def generate_rails_document_link_hover(name, location)
71
102
  urls = Support::RailsDocumentClient.generate_rails_document_urls(name)
72
103
  return if urls.empty?
@@ -3,6 +3,6 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Rails
6
- VERSION = "0.2.6"
6
+ VERSION = "0.2.8"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,17 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-04 00:00:00.000000000 Z
11
+ date: 2023-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '6.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '6.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '6.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: railties
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - ">="
@@ -30,20 +58,20 @@ dependencies:
30
58
  requirements:
31
59
  - - ">="
32
60
  - !ruby/object:Gem::Version
33
- version: 0.11.0
61
+ version: 0.13.0
34
62
  - - "<"
35
63
  - !ruby/object:Gem::Version
36
- version: 0.12.0
64
+ version: 0.14.0
37
65
  type: :runtime
38
66
  prerelease: false
39
67
  version_requirements: !ruby/object:Gem::Requirement
40
68
  requirements:
41
69
  - - ">="
42
70
  - !ruby/object:Gem::Version
43
- version: 0.11.0
71
+ version: 0.13.0
44
72
  - - "<"
45
73
  - !ruby/object:Gem::Version
46
- version: 0.12.0
74
+ version: 0.14.0
47
75
  - !ruby/object:Gem::Dependency
48
76
  name: sorbet-runtime
49
77
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
129
  - !ruby/object:Gem::Version
102
130
  version: '0'
103
131
  requirements: []
104
- rubygems_version: 3.4.20
132
+ rubygems_version: 3.4.21
105
133
  signing_key:
106
134
  specification_version: 4
107
135
  summary: A Ruby LSP addon for Rails