ruby-lsp-cell 0.1.2 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d26cf866d9c38fe88db134b7da05d7c883aa8cab0907b064042ef41a01dce7c7
4
- data.tar.gz: d91237300c2695320827a43142dcb84d3392d66486fa72a6f7df16750f490743
3
+ metadata.gz: af2de44e3dcfc2374fd50bfcfe41227029465fdfc55a4af05a4f9bf478681ca3
4
+ data.tar.gz: 79d0086b44a359a5473a50950149df9d2465f0cbe92364cdeb357a0c7eb0c9d4
5
5
  SHA512:
6
- metadata.gz: 3d0b35cd0593bcdc3c71cb18c19c7ffd8202763ce75a26389c1538e6f5ab4650e8996c69efcd8a16dd6e31e3d9c1b7013d869759b1a0bd922fec4f71a384f2be
7
- data.tar.gz: 46d0d9e866cdc4a8a0a75f6b930a31d40861616f5f2212069937cfdd4ba3a7077fe542b2b398f0dca1f6b5b9aa9d1a2a113c4bb5eeda349f03f3b86dc679f1dc
6
+ metadata.gz: 4794c22ccc66ac0d1f7bc8d4cd3bc81c68faa9f37eb1d7138491cb524c59c16e49ff28c22fbffb9ede5240343b3ec868b6a48c736fef0037e0fed2b7802b92a4
7
+ data.tar.gz: 79fe3cb7d38cd34e5491458d92788512f0892091fde0ed20606a103b955795c0d8499071a609b08fd47f372dd7036ec6f59c1dc593013d6ce07068d9b081872a
@@ -3,6 +3,6 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Cell
6
- VERSION = "0.1.2"
6
+ VERSION = "0.1.3"
7
7
  end
8
8
  end
@@ -29,6 +29,8 @@ module RubyLsp
29
29
 
30
30
  sig { params(global_state: RubyLsp::GlobalState, message_queue: Thread::Queue).void }
31
31
  def activate(global_state, message_queue)
32
+ return unless are_required_libraries_installed?
33
+
32
34
  @message_queue = message_queue
33
35
  @global_state = global_state
34
36
  @settings = @global_state.settings_for_addon(name) || {}
@@ -66,6 +68,14 @@ module RubyLsp
66
68
  def version
67
69
  RubyLsp::Cell::VERSION
68
70
  end
71
+
72
+ def are_required_libraries_installed?
73
+ Bundler.definition.specs.any? do |spec|
74
+ spec.name == "cells"
75
+ end
76
+ rescue Bundler::GemNotFound
77
+ false
78
+ end
69
79
  end
70
80
  end
71
81
  end
@@ -9,14 +9,12 @@ module RubyLsp
9
9
 
10
10
  include ::RubyLsp::Requests::Support::Common
11
11
 
12
- REQUIRED_LIBRARY = T.let("cells-rails", String)
13
-
14
12
  ResponseType = type_member { { fixed: T::Array[CodeRay] } }
15
13
 
16
14
  sig do
17
15
  params(
18
16
  response_builder: RubyLsp::ResponseBuilders::CollectionResponseBuilder,
19
- uri: URI::Generic,
17
+ uri: URI::File,
20
18
  dispatcher: Prism::Dispatcher,
21
19
  global_state: RubyLsp::GlobalState,
22
20
  enabled: T::Boolean,
@@ -33,28 +31,49 @@ module RubyLsp
33
31
  @class_name = T.let("", String)
34
32
  @pattern = T.let("_cell", String)
35
33
  @default_view_filename = T.let(default_view_filename, String)
36
- dispatcher.register(self, :on_class_node_enter, :on_def_node_leave)
34
+ @in_cell_class = T.let(false, T::Boolean)
35
+ @nesting = T.let([], T::Array[String])
36
+ dispatcher.register(
37
+ self,
38
+ :on_module_node_enter,
39
+ :on_module_node_leave,
40
+ :on_class_node_enter,
41
+ :on_class_node_leave,
42
+ :on_def_node_enter,
43
+ )
44
+ end
45
+
46
+ sig { params(node: Prism::ModuleNode).void }
47
+ def on_module_node_enter(node)
48
+ @nesting.push(node.constant_path.slice)
49
+ end
50
+
51
+ sig { params(node: Prism::ModuleNode).void }
52
+ def on_module_node_leave(node)
53
+ @nesting.pop
37
54
  end
38
55
 
39
56
  sig { params(node: Prism::ClassNode).void }
40
57
  def on_class_node_enter(node)
41
- @class_name = node.constant_path.slice
42
- return unless @class_name.end_with?("Cell")
43
- return unless @global_state.index.linearized_ancestors_of(@class_name).include?("Cell::ViewModel")
58
+ @nesting.push(node.constant_path.slice)
59
+ class_name = @nesting.join("::")
60
+ return unless class_name.end_with?("Cell")
61
+ return unless @global_state.index.linearized_ancestors_of(class_name).include?("Cell::ViewModel")
44
62
 
63
+ @in_cell_class = true
45
64
  add_default_goto_code_lens(node)
46
65
  end
47
66
 
48
67
  sig { params(node: Prism::ClassNode).void }
49
68
  def on_class_node_leave(node)
50
- @class_name = ""
69
+ @nesting.pop
70
+ @in_cell_class = false
51
71
  end
52
72
 
53
73
  sig { params(node: Prism::DefNode).void }
54
- def on_def_node_leave(node)
55
- return unless @class_name.end_with?("Cell")
74
+ def on_def_node_enter(node)
75
+ return unless @in_cell_class
56
76
  return unless contains_render_call?(node.body)
57
- return unless @global_state.index.linearized_ancestors_of(@class_name).include?("Cell::ViewModel")
58
77
 
59
78
  add_function_goto_code_lens(node, node.name.to_s)
60
79
  end
@@ -63,44 +82,27 @@ module RubyLsp
63
82
 
64
83
  sig { params(node: Prism::Node).void }
65
84
  def add_default_goto_code_lens(node)
66
- return unless are_required_libraries_installed?
67
-
68
85
  erb_filename = remove_last_pattern_in_string @default_view_filename, ".erb"
69
86
  uri = compute_erb_view_path @default_view_filename
70
87
 
71
- @response_builder << create_code_lens(
72
- node,
73
- title: "Go to #{erb_filename}",
74
- command_name: "vscode.open",
75
- arguments: [uri],
76
- data: { type: "goToFile" },
77
- )
88
+ create_go_to_file_code_lens(node, erb_filename, uri)
78
89
  end
79
90
 
80
91
  sig { params(node: T.nilable(Prism::Node)).returns(T::Boolean) }
81
92
  def contains_render_call?(node)
82
93
  return false if node.nil?
83
94
 
84
- return true if node.is_a?(Prism::CallNode) &&
85
- node.receiver.nil? &&
86
- node.message == "render"
95
+ if node.is_a?(Prism::CallNode)
96
+ return true if node.receiver.nil? && node.name == :render
97
+ end
87
98
 
88
99
  node.child_nodes.any? { |child| contains_render_call?(child) }
89
100
  end
90
101
 
91
102
  sig { params(node: Prism::Node, name: String).void }
92
103
  def add_function_goto_code_lens(node, name)
93
- return unless are_required_libraries_installed?
94
-
95
104
  uri = compute_erb_view_path("#{name}.erb")
96
-
97
- @response_builder << create_code_lens(
98
- node,
99
- title: "Go to #{name}",
100
- command_name: "vscode.open",
101
- arguments: [uri],
102
- data: { type: "goToFile" },
103
- )
105
+ create_go_to_file_code_lens(node, name, uri)
104
106
  end
105
107
 
106
108
  sig { params(string: String, pattern: String).returns(String) }
@@ -113,12 +115,20 @@ module RubyLsp
113
115
  escaped_pattern = Regexp.escape(@pattern)
114
116
  base_path = @path.sub(/#{escaped_pattern}\.rb$/, "")
115
117
  folder = File.basename(base_path)
116
- File.join(File.dirname(base_path), folder, name)
118
+ path = File.join(File.dirname(base_path), folder, name)
119
+ uri = URI::File.from_path(path: path).to_s
120
+ uri
117
121
  end
118
122
 
119
- sig { returns(T::Boolean) }
120
- def are_required_libraries_installed?
121
- Bundler.locked_gems.dependencies.keys.include?(REQUIRED_LIBRARY)
123
+ sig { params(node: Prism::Node, name: String, uri: String).void }
124
+ def create_go_to_file_code_lens(node, name, uri)
125
+ @response_builder << create_code_lens(
126
+ node,
127
+ title: "Go to #{name}",
128
+ command_name: "rubyLsp.openFile",
129
+ arguments: [[uri]],
130
+ data: { type: "file" },
131
+ )
122
132
  end
123
133
  end
124
134
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp-cell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edgar Guzmán