diff --git a/src/interpreter/resolver.py b/src/interpreter/resolver.py index c60844a..26821f8 100644 --- a/src/interpreter/resolver.py +++ b/src/interpreter/resolver.py @@ -31,6 +31,7 @@ class LoopType(Enum): class ClassType(Enum): NONE = auto() CLASS = auto() + SUBCLASS = auto() 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) 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) 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.name.lexeme == stmt.superclass.name.lexeme: Pebble.token_error(stmt.superclass.name, "A class cannot inherit from itself.") + self.current_class = ClassType.SUBCLASS self.resolve(stmt.superclass) self.begin_scope()