aboutsummaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-04-11 19:55:24 -0700
committerGravatar Tom Willemse2021-04-11 19:55:24 -0700
commit591caeb216128675ce6b8ddafccb09df7f522145 (patch)
tree1f4192ef8c820d6674e8a318fbfb82e993937aac /src/com
parent580a5acb580a858c8ffa705f5f64f095cb0b4b37 (diff)
downloadcrafting-interpreters-591caeb216128675ce6b8ddafccb09df7f522145.tar.gz
crafting-interpreters-591caeb216128675ce6b8ddafccb09df7f522145.zip
12.4 Methods on Classes
Diffstat (limited to 'src/com')
-rw-r--r--src/com/craftinginterpreters/lox/Interpreter.java9
-rw-r--r--src/com/craftinginterpreters/lox/LoxClass.java13
-rw-r--r--src/com/craftinginterpreters/lox/LoxInstance.java4
-rw-r--r--src/com/craftinginterpreters/lox/Resolver.java8
4 files changed, 31 insertions, 3 deletions
diff --git a/src/com/craftinginterpreters/lox/Interpreter.java b/src/com/craftinginterpreters/lox/Interpreter.java
index 5c1ea50..fd13455 100644
--- a/src/com/craftinginterpreters/lox/Interpreter.java
+++ b/src/com/craftinginterpreters/lox/Interpreter.java
@@ -177,7 +177,14 @@ class Interpreter implements Expr.Visitor<Object>, Stmt.Visitor<Void> {
@Override
public Void visitClassStmt(Stmt.Class stmt) {
environment.define(stmt.name.lexeme, null);
- LoxClass klass = new LoxClass(stmt.name.lexeme);
+
+ Map<String, LoxFunction> methods = new HashMap<>();
+ for (Stmt.Function method : stmt.methods) {
+ LoxFunction function = new LoxFunction(method, environment);
+ methods.put(method.name.lexeme, function);
+ }
+
+ LoxClass klass = new LoxClass(stmt.name.lexeme, methods);
environment.assign(stmt.name, klass);
return null;
}
diff --git a/src/com/craftinginterpreters/lox/LoxClass.java b/src/com/craftinginterpreters/lox/LoxClass.java
index 4f7ef4f..0c0223f 100644
--- a/src/com/craftinginterpreters/lox/LoxClass.java
+++ b/src/com/craftinginterpreters/lox/LoxClass.java
@@ -1,12 +1,23 @@
package com.craftinginterpreters.lox;
import java.util.List;
+import java.util.Map;
class LoxClass implements LoxCallable {
final String name;
+ private final Map<String, LoxFunction> methods;
- LoxClass(String name) {
+ LoxClass(String name, Map<String, LoxFunction> methods) {
this.name = name;
+ this.methods = methods;
+ }
+
+ LoxFunction findMethod(String name) {
+ if (methods.containsKey(name)) {
+ return methods.get(name);
+ }
+
+ return null;
}
@Override
diff --git a/src/com/craftinginterpreters/lox/LoxInstance.java b/src/com/craftinginterpreters/lox/LoxInstance.java
index 4e5eb9e..20accaa 100644
--- a/src/com/craftinginterpreters/lox/LoxInstance.java
+++ b/src/com/craftinginterpreters/lox/LoxInstance.java
@@ -16,6 +16,10 @@ class LoxInstance {
return fields.get(name.lexeme);
}
+ LoxFunction method = klass.findMethod(name.lexeme);
+ if (method != null)
+ return method;
+
throw new RuntimeError(name, "Undefined proprety '" + name.lexeme + "'.");
}
diff --git a/src/com/craftinginterpreters/lox/Resolver.java b/src/com/craftinginterpreters/lox/Resolver.java
index a7c9911..649235a 100644
--- a/src/com/craftinginterpreters/lox/Resolver.java
+++ b/src/com/craftinginterpreters/lox/Resolver.java
@@ -15,7 +15,7 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> {
}
private enum FunctionType {
- NONE, FUNCTION
+ NONE, FUNCTION, METHOD
}
public void resolve(List<Stmt> statements) {
@@ -36,6 +36,12 @@ class Resolver implements Expr.Visitor<Void>, Stmt.Visitor<Void> {
public Void visitClassStmt(Stmt.Class stmt) {
declare(stmt.name);
define(stmt.name);
+
+ for (Stmt.Function method : stmt.methods) {
+ FunctionType declaration = FunctionType.METHOD;
+ resolveFunction(method, declaration);
+ }
+
return null;
}