diff options
author | Vinicius Stock <[email protected]> | 2023-10-03 15:29:29 -0400 |
---|---|---|
committer | git <[email protected]> | 2023-10-06 01:57:34 +0000 |
commit | 69b024d7ccb8d42bb0387a244dce4d444f619987 (patch) | |
tree | ec96df436aaa15ee9647bda8e43e330eaceadace | |
parent | 58fc45325f25b64526ef2c467c37537a69aac4ac (diff) |
[ruby/prism] Add full_name to ConstantPathNode and ConstantPathTargetNode
https://github.com/ruby/prism/commit/b390553028
-rw-r--r-- | lib/prism/node_ext.rb | 44 | ||||
-rw-r--r-- | test/prism/constant_path_node_test.rb | 30 |
2 files changed, 74 insertions, 0 deletions
diff --git a/lib/prism/node_ext.rb b/lib/prism/node_ext.rb index 08d9e9f36a..264d3a5c1e 100644 --- a/lib/prism/node_ext.rb +++ b/lib/prism/node_ext.rb @@ -52,4 +52,48 @@ module Prism o end end + + class ConstantReadNode < Node + # Returns the list of parts for the full name of this constant. For example: [:Foo] + def full_name_parts + [name] + end + + # Returns the full name of this constant. For example: "Foo" + def full_name + name.name + end + end + + class ConstantPathNode < Node + # Returns the list of parts for the full name of this constant path. For example: [:Foo, :Bar] + def full_name_parts + parts = [child.name] + current = parent + + while current.is_a?(ConstantPathNode) + parts.unshift(current.child.name) + current = current.parent + end + + parts.unshift(current&.name || :"") + end + + # Returns the full name of this constant path. For example: "Foo::Bar" + def full_name + full_name_parts.join("::") + end + end + + class ConstantPathTargetNode < Node + # Returns the list of parts for the full name of this constant path. For example: [:Foo, :Bar] + def full_name_parts + (parent&.full_name_parts || [:""]).push(child.name) + end + + # Returns the full name of this constant path. For example: "Foo::Bar" + def full_name + full_name_parts.join("::") + end + end end diff --git a/test/prism/constant_path_node_test.rb b/test/prism/constant_path_node_test.rb new file mode 100644 index 0000000000..1a44fbaba5 --- /dev/null +++ b/test/prism/constant_path_node_test.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require_relative "test_helper" + +module Prism + class ConstantPathNodeTest < TestCase + def test_full_name_for_constant_path + source = <<~RUBY + Foo:: # comment + Bar::Baz:: + Qux + RUBY + + constant_path = Prism.parse(source).value.statements.body.first + assert_equal("Foo::Bar::Baz::Qux", constant_path.full_name) + end + + def test_full_name_for_constant_path_target + source = <<~RUBY + Foo:: # comment + Bar::Baz:: + Qux, Something = [1, 2] + RUBY + + node = Prism.parse(source).value.statements.body.first + target = node.targets.first + assert_equal("Foo::Bar::Baz::Qux", target.full_name) + end + end +end |