aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/craftinginterpreters/lox')
-rw-r--r--src/com/craftinginterpreters/lox/Resolver.java17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/com/craftinginterpreters/lox/Resolver.java b/src/com/craftinginterpreters/lox/Resolver.java
index f68e4dc..70c5970 100644
--- a/src/com/craftinginterpreters/lox/Resolver.java
+++ b/src/com/craftinginterpreters/lox/Resolver.java
@@ -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;
}