aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox/Resolver.java
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-06-12 12:17:43 -0700
committerGravatar Tom Willemse2021-06-12 12:17:43 -0700
commit958ba22a570594ed2ce60d24cd082ce3b8a6b89a (patch)
tree81c48eb2de22314be24449b2333d84e465d2c8f6 /src/com/craftinginterpreters/lox/Resolver.java
parente62d1a209e352306f36879dadd85773167e06246 (diff)
downloadcrafting-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.java14
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;
}