Skip to content

Commit

Permalink
Implement support for singleton classes
Browse files Browse the repository at this point in the history
  • Loading branch information
amomchilov committed Aug 21, 2024
1 parent 1749b46 commit 7e372e6
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
16 changes: 15 additions & 1 deletion parser/prism/Translator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,21 @@ std::unique_ptr<parser::Node> Translator::translate(pm_node_t *node) {

return make_unique<parser::Self>(parser.translateLocation(loc));
}
case PM_SINGLETON_CLASS_NODE: {
auto classNode = reinterpret_cast<pm_singleton_class_node *>(node);
pm_location_t *loc = &classNode->base.location;
pm_location_t *declLoc = &classNode->class_keyword_loc;

auto expr = translate(classNode->expression);
unique_ptr<parser::Node> body;

if (classNode->body != nullptr) {
body = translate(classNode->body);
}

return make_unique<parser::SClass>(parser.translateLocation(loc), parser.translateLocation(declLoc),
std::move(expr), std::move(body));
}
case PM_STATEMENTS_NODE: {
auto inlineIfSingle = true;
return translateStatements(reinterpret_cast<pm_statements_node *>(node), inlineIfSingle);
Expand Down Expand Up @@ -591,7 +606,6 @@ std::unique_ptr<parser::Node> 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:
Expand Down
12 changes: 12 additions & 0 deletions test/prism_regression/class.parse-tree.exp
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,17 @@ Begin {
}
body = NULL
}
SClass {
expr = Self {
}
body = NULL
}
SClass {
expr = Const {
scope = NULL
name = <C <U Parent>>
}
body = NULL
}
]
}
5 changes: 5 additions & 0 deletions test/prism_regression/class.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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`

0 comments on commit 7e372e6

Please sign in to comment.