Skip to content

Commit 1864733

Browse files
authored
Migrate to use RBS annotations (#63)
* Upgrade Sorbet and enable RBS support * Migrate codebase to RBS annotations
1 parent b083e0c commit 1864733

File tree

11 files changed

+97
-139
lines changed

11 files changed

+97
-139
lines changed

Gemfile.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ GEM
8989
rbs (>= 3, < 4)
9090
sorbet-runtime (>= 0.5.10782)
9191
ruby-progressbar (1.13.0)
92-
sorbet (0.5.12048)
93-
sorbet-static (= 0.5.12048)
94-
sorbet-runtime (0.5.12048)
95-
sorbet-static (0.5.12048-universal-darwin)
96-
sorbet-static (0.5.12048-x86_64-linux)
97-
sorbet-static-and-runtime (0.5.12048)
98-
sorbet (= 0.5.12048)
99-
sorbet-runtime (= 0.5.12048)
92+
sorbet (0.5.12087)
93+
sorbet-static (= 0.5.12087)
94+
sorbet-runtime (0.5.12087)
95+
sorbet-static (0.5.12087-universal-darwin)
96+
sorbet-static (0.5.12087-x86_64-linux)
97+
sorbet-static-and-runtime (0.5.12087)
98+
sorbet (= 0.5.12087)
99+
sorbet-runtime (= 0.5.12087)
100100
spoom (1.6.1)
101101
erubi (>= 1.10.0)
102102
prism (>= 0.28.0)

lib/ruby-lsp-rspec.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# typed: strict
22
# frozen_string_literal: true
33

4-
require "sorbet-runtime"
54
require "ruby_lsp_rspec/version"
65

76
module RubyLsp

lib/ruby_lsp/ruby_lsp_rspec/addon.rb

Lines changed: 48 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,86 +14,86 @@
1414
module RubyLsp
1515
module RSpec
1616
class Addon < ::RubyLsp::Addon
17-
extend T::Sig
17+
FORMATTER_PATH = File.expand_path("rspec_formatter.rb", __dir__) #: String
18+
FORMATTER_NAME = "RubyLsp::RSpec::RSpecFormatter" #: String
1819

19-
FORMATTER_PATH = T.let(File.expand_path("rspec_formatter.rb", __dir__), String)
20-
FORMATTER_NAME = T.let("RubyLsp::RSpec::RSpecFormatter", String)
21-
22-
sig { returns(T::Boolean) }
20+
#: bool
2321
attr_reader :debug
2422

25-
sig { void }
23+
#: -> void
2624
def initialize
2725
super
28-
@debug = T.let(false, T::Boolean)
29-
@rspec_command = T.let(nil, T.nilable(String))
26+
@debug = false #: bool
27+
@rspec_command = nil #: String?
3028
end
3129

32-
sig { override.params(global_state: GlobalState, message_queue: Thread::Queue).void }
30+
# @override
31+
#: (GlobalState, Thread::Queue) -> void
3332
def activate(global_state, message_queue)
34-
@index = T.let(global_state.index, T.nilable(RubyIndexer::Index))
33+
@index = global_state.index #: RubyIndexer::Index?
3534

3635
settings = global_state.settings_for_addon(name)
3736
@rspec_command = rspec_command(settings)
38-
@workspace_path = T.let(global_state.workspace_path, T.nilable(String))
37+
@workspace_path = global_state.workspace_path #: String?
3938
@debug = settings&.dig(:debug) || false
4039
end
4140

42-
sig { override.void }
41+
# @override
42+
#: -> void
4343
def deactivate; end
4444

45-
sig { override.returns(String) }
45+
# @override
46+
#: -> String
4647
def name
4748
"ruby-lsp-rspec"
4849
end
4950

50-
sig { override.returns(String) }
51+
# @override
52+
#: -> String
5153
def version
5254
VERSION
5355
end
5456

5557
# Creates a new CodeLens listener. This method is invoked on every CodeLens request
56-
sig do
57-
override.params(
58-
response_builder: ResponseBuilders::CollectionResponseBuilder[Interface::CodeLens],
59-
uri: URI::Generic,
60-
dispatcher: Prism::Dispatcher,
61-
).void
62-
end
58+
# @override
59+
#: (ResponseBuilders::CollectionResponseBuilder[Interface::CodeLens], URI::Generic, Prism::Dispatcher) -> void
6360
def create_code_lens_listener(response_builder, uri, dispatcher)
6461
return unless uri.to_standardized_path&.end_with?("_test.rb") || uri.to_standardized_path&.end_with?("_spec.rb")
6562

66-
CodeLens.new(response_builder, uri, dispatcher, T.must(@rspec_command), debug: debug)
63+
CodeLens.new(
64+
response_builder,
65+
uri,
66+
dispatcher,
67+
@rspec_command, #: as !nil
68+
debug: debug,
69+
)
6770
end
6871

6972
# Creates a new Discover Tests listener. This method is invoked on every DiscoverTests request
70-
sig do
71-
override.params(
72-
response_builder: ResponseBuilders::TestCollection,
73-
dispatcher: Prism::Dispatcher,
74-
uri: URI::Generic,
75-
).void
76-
end
73+
# @override
74+
#: (ResponseBuilders::TestCollection, Prism::Dispatcher, URI::Generic) -> void
7775
def create_discover_tests_listener(response_builder, dispatcher, uri)
7876
return unless uri.to_standardized_path&.end_with?("_spec.rb")
7977

80-
TestDiscovery.new(response_builder, dispatcher, uri, T.must(@workspace_path))
78+
TestDiscovery.new(
79+
response_builder,
80+
dispatcher,
81+
uri,
82+
@workspace_path, #: as !nil
83+
)
8184
end
8285

8386
# Resolves the minimal set of commands required to execute the requested tests
84-
sig do
85-
override.params(
86-
items: T::Array[T::Hash[Symbol, T.untyped]],
87-
).returns(T::Array[String])
88-
end
87+
# @override
88+
#: (Array[Hash[Symbol, untyped]]) -> Array[String]
8989
def resolve_test_commands(items)
9090
commands = []
9191
queue = items.dup
9292

9393
full_files = []
9494

9595
until queue.empty?
96-
item = T.must(queue.shift)
96+
item = queue.shift #: as !nil
9797
tags = Set.new(item[:tags])
9898
next unless tags.include?("framework:rspec")
9999

@@ -128,33 +128,29 @@ def resolve_test_commands(items)
128128
commands
129129
end
130130

131-
sig do
132-
override.params(
133-
response_builder: ResponseBuilders::DocumentSymbol,
134-
dispatcher: Prism::Dispatcher,
135-
).void
136-
end
131+
# @override
132+
#: (ResponseBuilders::DocumentSymbol, Prism::Dispatcher) -> void
137133
def create_document_symbol_listener(response_builder, dispatcher)
138134
DocumentSymbol.new(response_builder, dispatcher)
139135
end
140136

141-
sig do
142-
override.params(
143-
response_builder: ResponseBuilders::CollectionResponseBuilder[T.any(Interface::Location, Interface::LocationLink)],
144-
uri: URI::Generic,
145-
node_context: NodeContext,
146-
dispatcher: Prism::Dispatcher,
147-
).void
148-
end
137+
# @override
138+
#: (ResponseBuilders::CollectionResponseBuilder[Interface::Location | Interface::LocationLink], URI::Generic, NodeContext, Prism::Dispatcher) -> void
149139
def create_definition_listener(response_builder, uri, node_context, dispatcher)
150140
return unless uri.to_standardized_path&.end_with?("_test.rb") || uri.to_standardized_path&.end_with?("_spec.rb")
151141

152-
Definition.new(response_builder, uri, node_context, T.must(@index), dispatcher)
142+
Definition.new(
143+
response_builder,
144+
uri,
145+
node_context,
146+
@index, #: as !nil
147+
dispatcher,
148+
)
153149
end
154150

155151
private
156152

157-
sig { params(settings: T.nilable(T::Hash[Symbol, T.untyped])).returns(String) }
153+
#: (Hash[Symbol, untyped]?) -> String
158154
def rspec_command(settings)
159155
@rspec_command ||= settings&.dig(:rspecCommand) || begin
160156
cmd = if File.exist?(File.join(Dir.pwd, "bin", "rspec"))

lib/ruby_lsp/ruby_lsp_rspec/code_lens.rb

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,24 @@
44
module RubyLsp
55
module RSpec
66
class CodeLens
7-
extend T::Sig
8-
97
include ::RubyLsp::Requests::Support::Common
108

11-
sig do
12-
params(
13-
response_builder: ResponseBuilders::CollectionResponseBuilder[Interface::CodeLens],
14-
uri: URI::Generic,
15-
dispatcher: Prism::Dispatcher,
16-
rspec_command: String,
17-
debug: T::Boolean,
18-
).void
19-
end
9+
#: (ResponseBuilders::CollectionResponseBuilder[Interface::CodeLens], URI::Generic, Prism::Dispatcher, String, ?debug: bool) -> void
2010
def initialize(response_builder, uri, dispatcher, rspec_command, debug: false)
2111
@response_builder = response_builder
2212
# Listener is only initialized if uri.to_standardized_path is valid
23-
@path = T.let(T.must(uri.to_standardized_path), String)
24-
@group_id = T.let(1, Integer)
25-
@group_id_stack = T.let([], T::Array[Integer])
13+
path = uri.to_standardized_path #: as !nil
14+
@path = path #: String
15+
@group_id = 1 #: Integer
16+
@group_id_stack = [] #: Array[Integer]
2617
@rspec_command = rspec_command
27-
@anonymous_example_count = T.let(0, Integer)
18+
@anonymous_example_count = 0 #: Integer
2819
dispatcher.register(self, :on_call_node_enter, :on_call_node_leave)
2920

3021
@debug = debug
3122
end
3223

33-
sig { params(node: Prism::CallNode).void }
24+
#: (Prism::CallNode) -> void
3425
def on_call_node_enter(node)
3526
case node.message
3627
when "example", "it", "specify"
@@ -47,7 +38,7 @@ def on_call_node_enter(node)
4738
end
4839
end
4940

50-
sig { params(node: Prism::CallNode).void }
41+
#: (Prism::CallNode) -> void
5142
def on_call_node_leave(node)
5243
case node.message
5344
when "context", "describe"
@@ -59,17 +50,17 @@ def on_call_node_leave(node)
5950

6051
private
6152

62-
sig { params(message: String).void }
53+
#: (String) -> void
6354
def log_message(message)
6455
puts "[#{self.class}]: #{message}"
6556
end
6657

67-
sig { params(node: Prism::CallNode).returns(T::Boolean) }
58+
#: (Prism::CallNode) -> bool
6859
def valid_group?(node)
6960
!(node.block.nil? || (node.receiver && node.receiver&.slice != "RSpec"))
7061
end
7162

72-
sig { params(node: Prism::CallNode).returns(String) }
63+
#: (Prism::CallNode) -> String
7364
def generate_name(node)
7465
arguments = node.arguments&.arguments
7566

@@ -92,7 +83,7 @@ def generate_name(node)
9283
end
9384
end
9485

95-
sig { params(node: Prism::Node, name: String, kind: Symbol).void }
86+
#: (Prism::Node, name: String, kind: Symbol) -> void
9687
def add_test_code_lens(node, name:, kind:)
9788
line_number = node.location.start_line
9889
command = "#{@rspec_command} #{@path}:#{line_number}"

lib/ruby_lsp/ruby_lsp_rspec/definition.rb

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,9 @@
44
module RubyLsp
55
module RSpec
66
class Definition
7-
extend T::Sig
8-
97
include ::RubyLsp::Requests::Support::Common
108

11-
sig do
12-
params(
13-
response_builder: ResponseBuilders::CollectionResponseBuilder[T.any(
14-
Interface::Location,
15-
Interface::LocationLink,
16-
)],
17-
uri: URI::Generic,
18-
node_context: NodeContext,
19-
index: RubyIndexer::Index,
20-
dispatcher: Prism::Dispatcher,
21-
).void
22-
end
9+
#: (ResponseBuilders::CollectionResponseBuilder[Interface::LocationLink | Interface::Location], URI::Generic, NodeContext, RubyIndexer::Index, Prism::Dispatcher) -> void
2310
def initialize(response_builder, uri, node_context, index, dispatcher)
2411
@response_builder = response_builder
2512
@uri = uri
@@ -28,7 +15,7 @@ def initialize(response_builder, uri, node_context, index, dispatcher)
2815
dispatcher.register(self, :on_call_node_enter)
2916
end
3017

31-
sig { params(node: Prism::CallNode).void }
18+
#: (Prism::CallNode) -> void
3219
def on_call_node_enter(node)
3320
message = node.message
3421
return unless message

lib/ruby_lsp/ruby_lsp_rspec/document_symbol.rb

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,16 @@
44
module RubyLsp
55
module RSpec
66
class DocumentSymbol
7-
extend T::Sig
8-
97
include ::RubyLsp::Requests::Support::Common
108

11-
sig do
12-
params(
13-
response_builder: ResponseBuilders::DocumentSymbol,
14-
dispatcher: Prism::Dispatcher,
15-
).void
16-
end
9+
#: (ResponseBuilders::DocumentSymbol, Prism::Dispatcher) -> void
1710
def initialize(response_builder, dispatcher)
1811
@response_builder = response_builder
1912

2013
dispatcher.register(self, :on_call_node_enter, :on_call_node_leave)
2114
end
2215

23-
sig { params(node: Prism::CallNode).void }
16+
#: (Prism::CallNode) -> void
2417
def on_call_node_enter(node)
2518
case node.message
2619
when "example", "it", "specify"
@@ -54,7 +47,7 @@ def on_call_node_enter(node)
5447
end
5548
end
5649

57-
sig { params(node: Prism::CallNode).void }
50+
#: (Prism::CallNode) -> void
5851
def on_call_node_leave(node)
5952
case node.message
6053
when "context", "describe", "shared_examples", "shared_context", "shared_examples_for"
@@ -64,7 +57,7 @@ def on_call_node_leave(node)
6457
end
6558
end
6659

67-
sig { params(node: Prism::CallNode).returns(T.nilable(String)) }
60+
#: (Prism::CallNode) -> String?
6861
def generate_name(node)
6962
arguments = node.arguments&.arguments
7063

lib/ruby_lsp/ruby_lsp_rspec/indexing_enhancement.rb

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
module RubyLsp
55
module RSpec
66
class IndexingEnhancement < RubyIndexer::Enhancement
7-
extend T::Sig
8-
9-
sig { override.params(node: Prism::CallNode).void }
7+
# @override
8+
#: (Prism::CallNode) -> void
109
def on_call_node_enter(node)
1110
return if node.receiver
1211

@@ -22,7 +21,7 @@ def on_call_node_enter(node)
2221

2322
return if arguments.arguments.count != 1
2423

25-
method_name_node = T.must(arguments.arguments.first)
24+
method_name_node = arguments.arguments.first #: as !nil
2625

2726
method_name = case method_name_node
2827
when Prism::StringNode
@@ -41,7 +40,7 @@ def on_call_node_enter(node)
4140
arguments = node.arguments
4241

4342
if arguments && arguments.arguments.count == 1
44-
method_name_node = T.must(arguments.arguments.first)
43+
method_name_node = arguments.arguments.first #: as !nil
4544
end
4645

4746
method_name = if method_name_node

lib/ruby_lsp/ruby_lsp_rspec/spec_style_patch.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ module RubyLsp
55
module Listeners
66
# Patching this listener so it doesn't generate test items for RSpec tests
77
class SpecStyle
8-
extend T::Sig
9-
10-
sig { params(response_builder: ResponseBuilders::TestCollection, global_state: GlobalState, dispatcher: Prism::Dispatcher, uri: URI::Generic).void }
8+
#: (ResponseBuilders::TestCollection, GlobalState, Prism::Dispatcher, URI::Generic) -> void
119
def initialize(response_builder, global_state, dispatcher, uri)
1210
super
1311
end

0 commit comments

Comments
 (0)