From fd500686ac04330a7e148c1766f5606252fe5b7d Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Wed, 21 Aug 2024 17:24:43 -0400 Subject: [PATCH 1/3] Implement translation for empty modules --- parser/prism/Translator.cc | 11 ++++++++++- test/prism_regression/module.parse-tree.exp | 7 +++++++ test/prism_regression/module.rb | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/prism_regression/module.parse-tree.exp create mode 100644 test/prism_regression/module.rb diff --git a/parser/prism/Translator.cc b/parser/prism/Translator.cc index 2f8dacfa8c3..c5a9be5ac4e 100644 --- a/parser/prism/Translator.cc +++ b/parser/prism/Translator.cc @@ -284,6 +284,16 @@ std::unique_ptr Translator::translate(pm_node_t *node) { return make_unique(parser.translateLocation(loc), gs.enterNameUTF8(name)); } + case PM_MODULE_NODE: { // Modules declarations, like `module A::B::C; ...; end` + auto moduleNode = reinterpret_cast(node); + pm_location_t *loc = &moduleNode->base.location; + pm_location_t *declLoc = &moduleNode->module_keyword_loc; + + auto name = translate(moduleNode->constant_path); + + return make_unique(parser.translateLocation(loc), parser.translateLocation(declLoc), + std::move(name), nullptr); + } case PM_NIL_NODE: { auto nilNode = reinterpret_cast(node); pm_location_t *loc = &nilNode->base.location; @@ -619,7 +629,6 @@ std::unique_ptr Translator::translate(pm_node_t *node) { case PM_MATCH_REQUIRED_NODE: case PM_MATCH_WRITE_NODE: case PM_MISSING_NODE: - case PM_MODULE_NODE: case PM_MULTI_TARGET_NODE: case PM_MULTI_WRITE_NODE: case PM_NEXT_NODE: diff --git a/test/prism_regression/module.parse-tree.exp b/test/prism_regression/module.parse-tree.exp new file mode 100644 index 00000000000..9266e533817 --- /dev/null +++ b/test/prism_regression/module.parse-tree.exp @@ -0,0 +1,7 @@ +Module { + name = Const { + scope = NULL + name = > + } + body = NULL +} diff --git a/test/prism_regression/module.rb b/test/prism_regression/module.rb new file mode 100644 index 00000000000..0316978c2e9 --- /dev/null +++ b/test/prism_regression/module.rb @@ -0,0 +1,3 @@ +# typed: strict + +module M; end From 231448c705262214872b0af69e90b4ac1cfbbb71 Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Thu, 22 Aug 2024 09:54:40 -0400 Subject: [PATCH 2/3] Implement translation for class and module bodies --- parser/prism/Translator.cc | 6 +++-- test/prism_regression/class.parse-tree.exp | 28 +++++++++++++++++++-- test/prism_regression/class.rb | 13 ++++++++-- test/prism_regression/module.parse-tree.exp | 14 ++++++++++- test/prism_regression/module.rb | 6 ++++- 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/parser/prism/Translator.cc b/parser/prism/Translator.cc index c5a9be5ac4e..508bcb47c34 100644 --- a/parser/prism/Translator.cc +++ b/parser/prism/Translator.cc @@ -135,9 +135,10 @@ std::unique_ptr Translator::translate(pm_node_t *node) { if (classNode->superclass != nullptr) { superclass = translate(reinterpret_cast(classNode->superclass)); } + auto body = translate(classNode->body); return make_unique(parser.translateLocation(loc), parser.translateLocation(declLoc), - std::move(name), std::move(superclass), nullptr); + std::move(name), std::move(superclass), std::move(body)); } case PM_CONSTANT_PATH_NODE: { // Part of a constant path, like the `A` in `A::B`. `B` is a `PM_CONSTANT_READ_NODE` @@ -290,9 +291,10 @@ std::unique_ptr Translator::translate(pm_node_t *node) { pm_location_t *declLoc = &moduleNode->module_keyword_loc; auto name = translate(moduleNode->constant_path); + auto body = translate(moduleNode->body); return make_unique(parser.translateLocation(loc), parser.translateLocation(declLoc), - std::move(name), nullptr); + std::move(name), std::move(body)); } case PM_NIL_NODE: { auto nilNode = reinterpret_cast(node); diff --git a/test/prism_regression/class.parse-tree.exp b/test/prism_regression/class.parse-tree.exp index c68f855ba46..cf1f1c20bf3 100644 --- a/test/prism_regression/class.parse-tree.exp +++ b/test/prism_regression/class.parse-tree.exp @@ -6,7 +6,19 @@ Begin { name = > } superclass = NULL - body = NULL + body = Begin { + stmts = [ + Integer { + val = "1" + } + Integer { + val = "2" + } + Integer { + val = "3" + } + ] + } } Class { name = Const { @@ -22,7 +34,19 @@ Begin { SClass { expr = Self { } - body = NULL + body = Begin { + stmts = [ + Integer { + val = "4" + } + Integer { + val = "5" + } + Integer { + val = "6" + } + ] + } } SClass { expr = Const { diff --git a/test/prism_regression/class.rb b/test/prism_regression/class.rb index 11543340f63..7298967828e 100644 --- a/test/prism_regression/class.rb +++ b/test/prism_regression/class.rb @@ -1,9 +1,18 @@ # typed: strict -class Parent; end +class Parent + 1 + 2 + 3 +end + class Child < Parent; end -class << self; end +class << self + 4 + 5 + 6 +end class << Parent; end # ^^^^^^ error: `class << EXPRESSION` is only supported for `class << self` diff --git a/test/prism_regression/module.parse-tree.exp b/test/prism_regression/module.parse-tree.exp index 9266e533817..15fdb646dba 100644 --- a/test/prism_regression/module.parse-tree.exp +++ b/test/prism_regression/module.parse-tree.exp @@ -3,5 +3,17 @@ Module { scope = NULL name = > } - body = NULL + body = Begin { + stmts = [ + Integer { + val = "1" + } + Integer { + val = "2" + } + Integer { + val = "3" + } + ] + } } diff --git a/test/prism_regression/module.rb b/test/prism_regression/module.rb index 0316978c2e9..691c35c6d8e 100644 --- a/test/prism_regression/module.rb +++ b/test/prism_regression/module.rb @@ -1,3 +1,7 @@ # typed: strict -module M; end +module M + 1 + 2 + 3 +end From 207c18229e4a163cfa0298407a195c603f02322b Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Thu, 22 Aug 2024 09:55:04 -0400 Subject: [PATCH 3/3] Misc. cleanup --- parser/prism/Translator.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/parser/prism/Translator.cc b/parser/prism/Translator.cc index 508bcb47c34..f57b2d29fc6 100644 --- a/parser/prism/Translator.cc +++ b/parser/prism/Translator.cc @@ -130,11 +130,8 @@ std::unique_ptr Translator::translate(pm_node_t *node) { pm_location_t *declLoc = &classNode->class_keyword_loc; auto name = translate(reinterpret_cast(classNode->constant_path)); - std::unique_ptr superclass; + auto superclass = translate(classNode->superclass); - if (classNode->superclass != nullptr) { - superclass = translate(reinterpret_cast(classNode->superclass)); - } auto body = translate(classNode->body); return make_unique(parser.translateLocation(loc), parser.translateLocation(declLoc), @@ -151,7 +148,7 @@ std::unique_ptr Translator::translate(pm_node_t *node) { if (constantPathNode->parent) { // This constant reference is chained onto another constant reference. // E.g. if `node` is pointing to `B`, then then `A` is the `parent` in `A::B::C`. - parent = translate(reinterpret_cast(constantPathNode->parent)); + parent = translate(constantPathNode->parent); } else { // This is a fully qualified constant reference, like `::A`. pm_location_t *delimiterLoc = &constantPathNode->delimiter_loc; // The location of the `::` parent = make_unique(parser.translateLocation(delimiterLoc));