Skip to content

Commit 0d43bbb

Browse files
committed
Extract Prism anyScopeNode type alias
1 parent ab878c8 commit 0d43bbb

6 files changed

Lines changed: 24 additions & 6 deletions

File tree

lib/spoom.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ class Error < StandardError; end
2222
require "spoom/sorbet"
2323
require "spoom/cli"
2424
require "spoom/version"
25+
26+
require "spoom/ext/prism_types"

lib/spoom/ext/prism_types.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# typed: strict
2+
# frozen_string_literal: true
3+
4+
module Spoom
5+
module PrismTypes
6+
# Ideally this would just be in a shim in `sorbet/rbi/shims/prism.rbi`, but that causes
7+
# `bundle exec tapioca gem spoom` to fail. It Spoom's translator to rewrite the RBS signature comments into Sigs,
8+
# which try to access the `Prism::AnyScopeNode` constant.
9+
# Because shims aren't executed, no such constant exists at runtime, and the Sig raises a NameError.
10+
#
11+
# So instead, we define it here, where the translator can reify it into a real Sorbet `T.type_alias` at runtime.
12+
#: type anyScopeNode = ::Prism::ClassNode | ::Prism::ModuleNode | ::Prism::SingletonClassNode
13+
end
14+
end

lib/spoom/sorbet/metrics/code_metrics_visitor.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def visit_call_node(node)
147147

148148
private
149149

150-
#: (Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode) { -> void } -> void
150+
#: (PrismTypes::anyScopeNode) { -> void } -> void
151151
def visit_scope(node, &block)
152152
key = node_key(node)
153153
@counters.increment(key)
@@ -216,7 +216,7 @@ def collect_last_srb_sigs
216216
sigs
217217
end
218218

219-
#: (Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode) -> String
219+
#: (PrismTypes::anyScopeNode) -> String
220220
def node_key(node)
221221
case node
222222
when Prism::ClassNode

lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs/base_translator.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def apply_overloads_strategy(signatures, method_name:, location:)
199199
end
200200
end
201201

202-
#: (Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode) -> void
202+
#: (PrismTypes::anyScopeNode) -> void
203203
def apply_class_annotations(node)
204204
comments = node_rbs_comments(node)
205205
return if comments.empty?
@@ -324,7 +324,7 @@ def apply_member_annotations(annotations, sig)
324324
end
325325
end
326326

327-
#: (Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode, Regexp) -> bool
327+
#: (PrismTypes::anyScopeNode, Regexp) -> bool
328328
def already_extends?(node, constant_regex)
329329
node.child_nodes.any? do |c|
330330
next false unless c.is_a?(Prism::CallNode)

lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def visit_constant_write_node(node)
134134

135135
private
136136

137-
#: (Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode) { -> void } -> void
137+
#: (PrismTypes::anyScopeNode) { -> void } -> void
138138
def visit_scope(node, &block)
139139
old_class_annotations = @class_annotations
140140
@class_annotations = []
@@ -229,7 +229,7 @@ def visit_extend(node)
229229
end
230230
end
231231

232-
#: (Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode, Prism::CallNode) -> void
232+
#: (PrismTypes::anyScopeNode, Prism::CallNode) -> void
233233
def apply_class_annotation(parent, node)
234234
unless node.message == "abstract!" || node.message == "interface!" || node.message == "sealed!" ||
235235
node.message == "final!" || node.message == "requires_ancestor"

rbi/spoom.rbi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,6 +2572,8 @@ class Spoom::Printer
25722572
def printt; end
25732573
end
25742574

2575+
module Spoom::PrismTypes; end
2576+
Spoom::PrismTypes::AnyScopeNode = T.type_alias { T.any(::Prism::ClassNode, ::Prism::ModuleNode, ::Prism::SingletonClassNode) }
25752577
module Spoom::RBS; end
25762578
class Spoom::RBS::Annotation < ::Spoom::RBS::Comment; end
25772579

0 commit comments

Comments
 (0)