aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox/Resolver.java
diff options
context:
space:
mode:
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;
}