summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Daloze <eregontp@gmail.com>2024-02-25 13:48:08 +0100
committergit <svn-admin@ruby-lang.org>2024-02-28 18:30:43 +0000
commit1b0a5bcb0a63f9e0f2473ab7bccdeae9fc52bb6c (patch)
treeba88ef7c41b66debe91c6c7cdd857cce7aa7dd80
parentea2cb002501425fe9a76859ac30e83dcf2fff46b (diff)
[ruby/prism] Add a simple way to check field kinds are correct by setting $CHECK_FIELD_KIND
https://github.com/ruby/prism/commit/33e987ba3c
-rw-r--r--prism/templates/lib/prism/node.rb.erb24
1 files changed, 24 insertions, 0 deletions
diff --git a/prism/templates/lib/prism/node.rb.erb b/prism/templates/lib/prism/node.rb.erb
index 32134f8820..0afaa28310 100644
--- a/prism/templates/lib/prism/node.rb.erb
+++ b/prism/templates/lib/prism/node.rb.erb
@@ -98,6 +98,9 @@ module Prism
raise NoMethodError, "undefined method `type' for #{inspect}"
end
end
+ <%- if ENV["CHECK_FIELD_KIND"] -%>
+ CHECK_FIELD_KIND = ENV["CHECK_FIELD_KIND"]
+ <%- end -%>
<%- nodes.each do |node| -%>
<%- node.each_comment_line do |line| -%>
@@ -110,6 +113,27 @@ module Prism
@newline = false
@location = location
<%- node.fields.each do |field| -%>
+ <%- if ENV["CHECK_FIELD_KIND"] -%>
+ <%- if field.respond_to?(:union_kind) && field.union_kind -%>
+ <%- case field -%>
+ <%- when Prism::NodeField -%>
+ raise <%= field.name %>.inspect if CHECK_FIELD_KIND && ![<%= field.union_kind.join(', ') %>].include?(<%= field.name %>.class)
+ <%- when Prism::OptionalNodeField -%>
+ raise <%= field.name %>.inspect if CHECK_FIELD_KIND && ![<%= field.union_kind.join(', ') %>, NilClass].include?(<%= field.name %>.class)
+ <%- when Prism::NodeListField -%>
+ raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.all? { |n| [<%= field.union_kind.join(', ') %>].include?(n.class) }
+ <%- end -%>
+ <%- elsif field.respond_to?(:specific_kind) && field.specific_kind -%>
+ <%- case field -%>
+ <%- when Prism::NodeField -%>
+ raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.is_a?(<%= field.specific_kind %>)
+ <%- when Prism::OptionalNodeField -%>
+ raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.nil? && !<%= field.name %>.is_a?(<%= field.specific_kind %>)
+ <%- when Prism::NodeListField -%>
+ raise <%= field.name %>.inspect if CHECK_FIELD_KIND && !<%= field.name %>.all? { |n| n.is_a?(<%= field.specific_kind %>) }
+ <%- end -%>
+ <%- end -%>
+ <%- end -%>
@<%= field.name %> = <%= field.name %>
<%- end -%>
end