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