diff --git a/parser/prism/Translator.cc b/parser/prism/Translator.cc index 1ae362e77d3..ea99832e55d 100644 --- a/parser/prism/Translator.cc +++ b/parser/prism/Translator.cc @@ -425,6 +425,21 @@ std::unique_ptr Translator::translate(pm_node_t *node) { return make_unique(parser.translateLocation(loc)); } + case PM_SINGLETON_CLASS_NODE: { + auto classNode = reinterpret_cast(node); + pm_location_t *loc = &classNode->base.location; + pm_location_t *declLoc = &classNode->class_keyword_loc; + + auto expr = translate(classNode->expression); + unique_ptr body; + + if (classNode->body != nullptr) { + body = translate(classNode->body); + } + + return make_unique(parser.translateLocation(loc), parser.translateLocation(declLoc), + std::move(expr), std::move(body)); + } case PM_STATEMENTS_NODE: { auto inlineIfSingle = true; return translateStatements(reinterpret_cast(node), inlineIfSingle); @@ -591,7 +606,6 @@ std::unique_ptr Translator::translate(pm_node_t *node) { case PM_RESCUE_NODE: case PM_RETRY_NODE: case PM_SHAREABLE_CONSTANT_NODE: - case PM_SINGLETON_CLASS_NODE: case PM_SOURCE_ENCODING_NODE: case PM_SOURCE_FILE_NODE: case PM_SOURCE_LINE_NODE: diff --git a/test/prism_regression/class.parse-tree.exp b/test/prism_regression/class.parse-tree.exp index 5070883390f..c68f855ba46 100644 --- a/test/prism_regression/class.parse-tree.exp +++ b/test/prism_regression/class.parse-tree.exp @@ -19,5 +19,17 @@ Begin { } body = NULL } + SClass { + expr = Self { + } + body = NULL + } + SClass { + expr = Const { + scope = NULL + name = > + } + body = NULL + } ] } diff --git a/test/prism_regression/class.rb b/test/prism_regression/class.rb index b1b72630072..11543340f63 100644 --- a/test/prism_regression/class.rb +++ b/test/prism_regression/class.rb @@ -2,3 +2,8 @@ class Parent; end class Child < Parent; end + +class << self; end + +class << Parent; end +# ^^^^^^ error: `class << EXPRESSION` is only supported for `class << self`