diff options
author | Tom Willemse | 2021-04-18 17:29:25 -0700 |
---|---|---|
committer | Tom Willemse | 2021-04-18 17:29:25 -0700 |
commit | e62d1a209e352306f36879dadd85773167e06246 (patch) | |
tree | d7aa07b0b6dc303a30196f0c38d1e84f15f13334 | |
parent | 21a58ffb202531d6ac74702648ad1c168f279a6d (diff) | |
download | crafting-interpreters-e62d1a209e352306f36879dadd85773167e06246.tar.gz crafting-interpreters-e62d1a209e352306f36879dadd85773167e06246.zip |
12.5.1 Invalid uses of this
-rw-r--r-- | src/com/craftinginterpreters/lox/Resolver.java | 17 |
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; } |