Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix parsing of T::Struct #343

Merged
merged 2 commits into from
Aug 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/rbi/parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,12 @@ def visit_class_node(node)
@last_node = node
superclass_name = node_string(node.superclass)
scope = case superclass_name
when /^(::)?T::Struct$/
TStruct.new(
node_string!(node.constant_path),
loc: node_loc(node),
comments: node_comments(node),
)
when /^(::)?T::Enum$/
TEnum.new(
node_string!(node.constant_path),
Expand Down
4 changes: 2 additions & 2 deletions lib/rbi/printer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ def visit_scope_header(node)
printt("module #{node.name}")
when TEnum
printt("class #{node.name} < T::Enum")
when TStruct
printt("class #{node.name} < T::Struct")
when Class
printt("class #{node.name}")
superclass = node.superclass_name
Expand All @@ -186,8 +188,6 @@ def visit_scope_header(node)
end
when SingletonClass
printt("class << self")
when TStruct
printt("class #{node.name} < T::Struct")
else
raise PrinterError, "Unhandled node: #{node.class}"
end
Expand Down
2 changes: 2 additions & 0 deletions lib/rbi/rewriters/merge_trees.rb
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,8 @@ def dup_empty
Module.new(name, loc: loc, comments: comments)
when TEnum
TEnum.new(name, loc: loc, comments: comments)
when TStruct
TStruct.new(name, loc: loc, comments: comments)
when Class
Class.new(name, superclass_name: superclass_name, loc: loc, comments: comments)
when Struct
Expand Down
4 changes: 2 additions & 2 deletions lib/rbi/visitor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ def visit(node)
visit_comment(node)
when TEnum
visit_tenum(node)
when TStruct
visit_tstruct(node)
when Module
visit_module(node)
when Class
Expand Down Expand Up @@ -83,8 +85,6 @@ def visit(node)
visit_sig(node)
when SigParam
visit_sig_param(node)
when TStruct
visit_tstruct(node)
when TStructConst
visit_tstruct_const(node)
when TStructProp
Expand Down
4 changes: 2 additions & 2 deletions test/rbi/model_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ def foo(
# comment
private

class Struct < ::T::Struct
class Struct < T::Struct
# comment
const :foo, Foo

Expand Down Expand Up @@ -457,7 +457,7 @@ def test_t_struct_with_types
node << TStructProp.new("bar", Type.simple("Bar"))

assert_equal(<<~RBI, node.string)
class MyStruct < ::T::Struct
class MyStruct < T::Struct
const :foo, Foo
prop :bar, Bar
end
Expand Down
12 changes: 8 additions & 4 deletions test/rbi/parser_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def test_parse_visibility_labels_with_comments

def test_parse_t_struct
rbi = <<~RBI
class Foo < ::T::Struct
class Foo < T::Struct
const :a, A
const :b, B, default: B.new
prop :c, C
Expand All @@ -254,8 +254,12 @@ def foo; end
RBI

tree = parse_rbi(rbi)

# Make sure the T::Struct is not parsed as a normal class
assert_equal(TStruct, tree.nodes.first.class)

assert_equal(<<~RBI, tree.string)
class Foo < ::T::Struct
class Foo < T::Struct
const :a, A
const :b, B, default: B.new
prop :c, C
Expand Down Expand Up @@ -562,7 +566,7 @@ def m3; end

def test_parse_t_struct_locations
rbi = <<~RBI
class Foo < ::T::Struct
class Foo < T::Struct
const :a, A
const :b, B, default: B.new
prop :c, C
Expand All @@ -574,7 +578,7 @@ def foo; end
tree = parse_rbi(rbi)
assert_equal(<<~RBI, tree.string(print_locs: true))
# -:1:0-7:3
class Foo < ::T::Struct
class Foo < T::Struct
# -:2:2-2:13
const :a, A
# -:3:2-3:29
Expand Down
6 changes: 3 additions & 3 deletions test/rbi/printer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ def test_print_t_structs
struct << Method.new("foo")

assert_equal(<<~RBI, struct.string)
class Foo < ::T::Struct
class Foo < T::Struct
const :a, A
const :b, B, default: B.new
prop :c, C
Expand Down Expand Up @@ -450,7 +450,7 @@ class << self; end
foo

# This is a single line comment
class Foo < ::T::Struct
class Foo < T::Struct
# This is a
# Multiline Comment
const :a, A
Expand Down Expand Up @@ -1098,7 +1098,7 @@ class << self; end
# file.rbi:1:3-2:4
class TE < T::Enum; end
# file.rbi:1:3-2:4
class TS < ::T::Struct; end
class TS < T::Struct; end
# file.rbi:1:3-2:4
C = 42
# file.rbi:1:3-2:4
Expand Down
22 changes: 11 additions & 11 deletions test/rbi/rewriters/group_nodes_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ module S1; end
class S2; end
S3 = ::Struct.new
class TE < T::Enum; end
class TS < ::T::Struct; end
class TS < T::Struct; end
RBI
end

Expand Down Expand Up @@ -172,7 +172,7 @@ module S1; end
class S2; end
S3 = ::Struct.new
class TE < T::Enum; end
class TS < ::T::Struct; end
class TS < T::Struct; end
RBI
end

Expand Down Expand Up @@ -293,7 +293,7 @@ module S1; end
class S2; end
S3 = ::Struct.new
class TE < T::Enum; end
class TS < ::T::Struct; end
class TS < T::Struct; end
end
RBI
end
Expand Down Expand Up @@ -367,8 +367,8 @@ module S2; end
S3 = ::Struct.new
class TE1 < T::Enum; end
class TE2 < T::Enum; end
class TS1 < ::T::Struct; end
class TS2 < ::T::Struct; end
class TS1 < T::Struct; end
class TS2 < T::Struct; end
RBI
end

Expand Down Expand Up @@ -502,8 +502,8 @@ module S2; end
S3 = ::Struct.new
class TE1 < T::Enum; end
class TE2 < T::Enum; end
class TS1 < ::T::Struct; end
class TS2 < ::T::Struct; end
class TS1 < T::Struct; end
class TS2 < T::Struct; end
end

class Scope2
Expand Down Expand Up @@ -571,14 +571,14 @@ module S2; end
S3 = ::Struct.new
class TE1 < T::Enum; end
class TE2 < T::Enum; end
class TS1 < ::T::Struct; end
class TS2 < ::T::Struct; end
class TS1 < T::Struct; end
class TS2 < T::Struct; end
end

class TE1 < T::Enum; end
class TE2 < T::Enum; end
class TS1 < ::T::Struct; end
class TS2 < ::T::Struct; end
class TS1 < T::Struct; end
class TS2 < T::Struct; end
end
RBI
end
Expand Down
12 changes: 6 additions & 6 deletions test/rbi/rewriters/sort_nodes_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,10 @@ def test_sort_tstructs
rbi.sort_nodes!

assert_equal(<<~RBI, rbi.string)
class A < ::T::Struct; end
class B < ::T::Struct; end
class C < ::T::Struct; end
class D < ::T::Struct; end
class A < T::Struct; end
class B < T::Struct; end
class C < T::Struct; end
class D < T::Struct; end
RBI
end

Expand Down Expand Up @@ -247,7 +247,7 @@ def self.m3; end
A = 42
module B; end
class C < T::Enum; end
class D < ::T::Struct; end
class D < T::Struct; end
class E; end
RBI
end
Expand Down Expand Up @@ -306,7 +306,7 @@ class << self; end
A = 42
module B; end
class C < T::Enum; end
class D < ::T::Struct; end
class D < T::Struct; end
class E; end
RBI
end
Expand Down
Loading