12.5.1 Invalid uses of this

This commit is contained in:
Tom Willemse 2021-04-18 17:29:25 -07:00
parent 21a58ffb20
commit e62d1a209e

View file

@ -18,6 +18,13 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> {
NONE, FUNCTION, METHOD
}
private enum ClassType {
NONE,
CLASS
}
private ClassType currentClass = ClassType.NONE;
public void resolve(List<Stmt> statements) {
for (Stmt statement : statements) {
resolve(statement);
@ -34,6 +41,9 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> {
@Override
public Void visitClassStmt(Stmt.Class stmt) {
ClassType enclosingClass = currentClass;
currentClass = ClassType.CLASS;
declare(stmt.name);
define(stmt.name);
@ -47,6 +57,7 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> {
endScope();
currentClass = enclosingClass;
return null;
}
@ -161,6 +172,12 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> {
@Override
public Void visitThisExpr(Expr.This expr) {
if (currentClass == ClassType.NONE) {
Lox.error(expr.keyword,
"Can't use 'this' outside of a class.");
return null;
}
resolveLocal(expr, expr.keyword);
return null;
}