feat(resolver): add error for super outside of subclass
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user