Skip to content

Commit 33e987b

Browse files
committed
Add a simple way to check field kinds are correct by setting $CHECK_FIELD_KIND
1 parent f3e3310 commit 33e987b

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ jobs:
5252
bundle exec rake compile
5353
bundle exec rake check_annotations
5454
bundle exec rake typecheck:steep
55+
rm lib/prism/node.rb && CHECK_FIELD_KIND=true bundle exec rake
5556
5657
build:
5758
strategy:

templates/lib/prism/node.rb.erb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ module Prism
9898
raise NoMethodError, "undefined method `type' for #{inspect}"
9999
end
100100
end
101+
<%- if ENV["CHECK_FIELD_KIND"] -%>
102+
CHECK_FIELD_KIND = ENV["CHECK_FIELD_KIND"]
103+
<%- end -%>
101104
<%- nodes.each do |node| -%>
102105

103106
<%- node.each_comment_line do |line| -%>
@@ -110,6 +113,27 @@ module Prism
110113
@newline = false
111114
@location = location
112115
<%- node.fields.each do |field| -%>
116+
<%- if ENV["CHECK_FIELD_KIND"] -%>
117+
<%- if field.respond_to?(:union_kind) && field.union_kind -%>
118+
<%- case field -%>
119+
<%- when Prism::NodeField -%>
120+
raise <%= field.name %>.inspect if CHECK_FIELD_KIND && ![<%= field.union_kind.join(', ') %>].include?(<%= field.name %>.class)
121+
<%- when Prism::OptionalNodeField -%>
122+
raise <%= field.name %>.inspect if CHECK_FIELD_KIND && ![<%= field.union_kind.join(', ') %>, NilClass].include?(<%= field.name %>.class)
123+
<%- when Prism::NodeListField -%>
124+
raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.all? { |n| [<%= field.union_kind.join(', ') %>].include?(n.class) }
125+
<%- end -%>
126+
<%- elsif field.respond_to?(:specific_kind) && field.specific_kind -%>
127+
<%- case field -%>
128+
<%- when Prism::NodeField -%>
129+
raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.is_a?(<%= field.specific_kind %>)
130+
<%- when Prism::OptionalNodeField -%>
131+
raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.nil? && !<%= field.name %>.is_a?(<%= field.specific_kind %>)
132+
<%- when Prism::NodeListField -%>
133+
raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.all? { |n| n.is_a?(<%= field.specific_kind %>) }
134+
<%- end -%>
135+
<%- end -%>
136+
<%- end -%>
113137
@<%= field.name %> = <%= field.name %>
114138
<%- end -%>
115139
end

0 commit comments

Comments
 (0)