diff options
author | Kevin Newton <kddnewton@gmail.com> | 2024-05-03 09:35:32 -0400 |
---|---|---|
committer | Kevin Newton <kddnewton@gmail.com> | 2024-05-03 11:11:57 -0400 |
commit | 5758e45657f0b2ca8725e67046a1cac92e2e6414 (patch) | |
tree | 36a1a99dbdcafc51a7a2d3f01146c9eab76de353 /lib | |
parent | 1d51e929b1b10fe9fa109f8a8ebc3b938827271c (diff) |
[ruby/prism] Change ConstantPathNode#child to ConstantPathNode#{name,name_loc}
This has been requested for a long time, and I'm finally doing it
now. Unfortunately this is a breaking change for all of the APIs.
I've added in a Ruby method for `#child` that is deprecated so that
existing usage doesn't break, but for everyone else this is going
to be a bit of a pain.
https://github.com/ruby/prism/commit/9cbe74464e
Diffstat (limited to 'lib')
-rw-r--r-- | lib/prism/node_ext.rb | 39 | ||||
-rw-r--r-- | lib/prism/pattern.rb | 15 | ||||
-rw-r--r-- | lib/prism/translation/parser/compiler.rb | 4 | ||||
-rw-r--r-- | lib/prism/translation/ripper.rb | 8 | ||||
-rw-r--r-- | lib/prism/translation/ruby_parser.rb | 4 |
5 files changed, 51 insertions, 19 deletions
diff --git a/lib/prism/node_ext.rb b/lib/prism/node_ext.rb index 8674544065..10fc1decbf 100644 --- a/lib/prism/node_ext.rb +++ b/lib/prism/node_ext.rb @@ -143,11 +143,12 @@ module Prism current = self #: node? while current.is_a?(ConstantPathNode) - child = current.child - if child.is_a?(MissingNode) + name = current.name + if name.nil? raise MissingNodesInConstantPathError, "Constant path contains missing nodes. Cannot compute full name" end - parts.unshift(child.name) + + parts.unshift(name) current = current.parent end @@ -162,6 +163,20 @@ module Prism def full_name full_name_parts.join("::") end + + # Previously, we had a child node on this class that contained either a + # constant read or a missing node. To not cause a breaking change, we + # continue to supply that API. + def child + warn(<<~MSG, category: :deprecated) + DEPRECATED: ConstantPathNode#child is deprecated and will be removed \ + in the next major version. Use \ + ConstantPathNode#name/ConstantPathNode#name_loc instead. Called from \ + #{caller(1..1).first}. + MSG + + name ? ConstantReadNode.new(source, name, name_loc) : MissingNode.new(source, location) + end end class ConstantPathTargetNode < Node @@ -179,17 +194,31 @@ module Prism raise ConstantPathNode::DynamicPartsInConstantPathError, "Constant target path contains dynamic parts. Cannot compute full name" end - if child.is_a?(MissingNode) + if name.nil? raise ConstantPathNode::MissingNodesInConstantPathError, "Constant target path contains missing nodes. Cannot compute full name" end - parts.push(child.name) + parts.push(name) end # Returns the full name of this constant path. For example: "Foo::Bar" def full_name full_name_parts.join("::") end + + # Previously, we had a child node on this class that contained either a + # constant read or a missing node. To not cause a breaking change, we + # continue to supply that API. + def child + warn(<<~MSG, category: :deprecated) + DEPRECATED: ConstantPathTargetNode#child is deprecated and will be \ + removed in the next major version. Use \ + ConstantPathTargetNode#name/ConstantPathTargetNode#name_loc instead. \ + Called from #{caller(1..1).first}. + MSG + + name ? ConstantReadNode.new(source, name, name_loc) : MissingNode.new(source, location) + end end class ConstantTargetNode < Node diff --git a/lib/prism/pattern.rb b/lib/prism/pattern.rb index e12cfd597f..91b23afe3e 100644 --- a/lib/prism/pattern.rb +++ b/lib/prism/pattern.rb @@ -149,7 +149,7 @@ module Prism parent = node.parent if parent.is_a?(ConstantReadNode) && parent.slice == "Prism" - compile_node(node.child) + compile_constant_name(node, node.name) else compile_error(node) end @@ -158,14 +158,17 @@ module Prism # in ConstantReadNode # in String def compile_constant_read_node(node) - value = node.slice + compile_constant_name(node, node.name) + end - if Prism.const_defined?(value, false) - clazz = Prism.const_get(value) + # Compile a name associated with a constant. + def compile_constant_name(node, name) + if Prism.const_defined?(name, false) + clazz = Prism.const_get(name) ->(other) { clazz === other } - elsif Object.const_defined?(value, false) - clazz = Object.const_get(value) + elsif Object.const_defined?(name, false) + clazz = Object.const_get(name) ->(other) { clazz === other } else diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb index a4aaa41d6f..c311613388 100644 --- a/lib/prism/translation/parser/compiler.rb +++ b/lib/prism/translation/parser/compiler.rb @@ -483,13 +483,13 @@ module Prism if node.parent.nil? builder.const_global( token(node.delimiter_loc), - [node.child.name, srange(node.child.location)] + [node.name, srange(node.name_loc)] ) else builder.const_fetch( visit(node.parent), token(node.delimiter_loc), - [node.child.name, srange(node.child.location)] + [node.name, srange(node.name_loc)] ) end end diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb index 4e3b1b74fd..5cb6f6715d 100644 --- a/lib/prism/translation/ripper.rb +++ b/lib/prism/translation/ripper.rb @@ -1456,16 +1456,16 @@ module Prism # ^^^^^^^^ def visit_constant_path_node(node) if node.parent.nil? - bounds(node.child.location) - child = on_const(node.child.name.to_s) + bounds(node.name_loc) + child = on_const(node.name.to_s) bounds(node.location) on_top_const_ref(child) else parent = visit(node.parent) - bounds(node.child.location) - child = on_const(node.child.name.to_s) + bounds(node.name_loc) + child = on_const(node.name.to_s) bounds(node.location) on_const_path_ref(parent, child) diff --git a/lib/prism/translation/ruby_parser.rb b/lib/prism/translation/ruby_parser.rb index f0a3bdd607..c6f741c8e5 100644 --- a/lib/prism/translation/ruby_parser.rb +++ b/lib/prism/translation/ruby_parser.rb @@ -442,9 +442,9 @@ module Prism # ^^^^^^^^ def visit_constant_path_node(node) if node.parent.nil? - s(node, :colon3, node.child.name) + s(node, :colon3, node.name) else - s(node, :colon2, visit(node.parent), node.child.name) + s(node, :colon2, visit(node.parent), node.name) end end |