diff options
author | Tom Willemse | 2021-06-12 12:17:43 -0700 |
---|---|---|
committer | Tom Willemse | 2021-06-12 12:17:43 -0700 |
commit | 958ba22a570594ed2ce60d24cd082ce3b8a6b89a (patch) | |
tree | 81c48eb2de22314be24449b2333d84e465d2c8f6 /src/com/craftinginterpreters/lox/Resolver.java | |
parent | e62d1a209e352306f36879dadd85773167e06246 (diff) | |
download | crafting-interpreters-958ba22a570594ed2ce60d24cd082ce3b8a6b89a.tar.gz crafting-interpreters-958ba22a570594ed2ce60d24cd082ce3b8a6b89a.zip |
12.7 Constructors and Initializers
Diffstat (limited to 'src/com/craftinginterpreters/lox/Resolver.java')
-rw-r--r-- | src/com/craftinginterpreters/lox/Resolver.java | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/com/craftinginterpreters/lox/Resolver.java b/src/com/craftinginterpreters/lox/Resolver.java index 70c5970..cda0f60 100644 --- a/src/com/craftinginterpreters/lox/Resolver.java +++ b/src/com/craftinginterpreters/lox/Resolver.java @@ -15,12 +15,11 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> { } private enum FunctionType { - NONE, FUNCTION, METHOD + NONE, FUNCTION, INITIALIZER, METHOD } private enum ClassType { - NONE, - CLASS + NONE, CLASS } private ClassType currentClass = ClassType.NONE; @@ -52,6 +51,9 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> { for (Stmt.Function method : stmt.methods) { FunctionType declaration = FunctionType.METHOD; + if (method.name.lexeme.equals("init")) { + declaration = FunctionType.INITIALIZER; + } resolveFunction(method, declaration); } @@ -98,6 +100,9 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> { } if (stmt.value != null) { + if (currentFunction == FunctionType.INITIALIZER) { + Lox.error(stmt.keyword, "Can't return a value from an initializer."); + } resolve(stmt.value); } @@ -173,8 +178,7 @@ 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."); + Lox.error(expr.keyword, "Can't use 'this' outside of a class."); return null; } |