aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-04-18 17:29:25 -0700
committerGravatar Tom Willemse2021-04-18 17:29:25 -0700
commite62d1a209e352306f36879dadd85773167e06246 (patch)
treed7aa07b0b6dc303a30196f0c38d1e84f15f13334 /src/com/craftinginterpreters/lox
parent21a58ffb202531d6ac74702648ad1c168f279a6d (diff)
downloadcrafting-interpreters-e62d1a209e352306f36879dadd85773167e06246.tar.gz
crafting-interpreters-e62d1a209e352306f36879dadd85773167e06246.zip
12.5.1 Invalid uses of this
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;
}