feat(resolver): add error for super outside of subclass

This commit is contained in:
2026-02-07 00:31:08 +01:00
parent 133d332f6a
commit 1a4c90730c

View File

@@ -31,6 +31,7 @@ class LoopType(Enum):
class ClassType(Enum): class ClassType(Enum):
NONE = auto() NONE = auto()
CLASS = auto() CLASS = auto()
SUBCLASS = auto()
class Resolver(Expr.Visitor[None], Stmt.Visitor[None]): class Resolver(Expr.Visitor[None], Stmt.Visitor[None]):
@@ -124,6 +125,10 @@ class Resolver(Expr.Visitor[None], Stmt.Visitor[None]):
self.resolve_local(expr, expr.keyword) self.resolve_local(expr, expr.keyword)
def visit_super_expr(self, expr: SuperExpr) -> None: def visit_super_expr(self, expr: SuperExpr) -> None:
if self.current_class == ClassType.NONE:
Pebble.token_error(expr.keyword, "Cannot use 'super' outside of a class.")
elif self.current_class != ClassType.SUBCLASS:
Pebble.token_error(expr.keyword, "Cannot use 'super' in a class with no superclass.")
self.resolve_local(expr, expr.keyword) self.resolve_local(expr, expr.keyword)
def visit_block_stmt(self, stmt: BlockStmt) -> None: def visit_block_stmt(self, stmt: BlockStmt) -> None:
@@ -140,6 +145,7 @@ class Resolver(Expr.Visitor[None], Stmt.Visitor[None]):
if stmt.superclass is not None: if stmt.superclass is not None:
if stmt.name.lexeme == stmt.superclass.name.lexeme: if stmt.name.lexeme == stmt.superclass.name.lexeme:
Pebble.token_error(stmt.superclass.name, "A class cannot inherit from itself.") Pebble.token_error(stmt.superclass.name, "A class cannot inherit from itself.")
self.current_class = ClassType.SUBCLASS
self.resolve(stmt.superclass) self.resolve(stmt.superclass)
self.begin_scope() self.begin_scope()