@@ -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