From 591caeb216128675ce6b8ddafccb09df7f522145 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sun, 11 Apr 2021 19:55:24 -0700 Subject: 12.4 Methods on Classes --- src/com/craftinginterpreters/lox/Interpreter.java | 9 ++++++++- src/com/craftinginterpreters/lox/LoxClass.java | 13 ++++++++++++- src/com/craftinginterpreters/lox/LoxInstance.java | 4 ++++ src/com/craftinginterpreters/lox/Resolver.java | 8 +++++++- 4 files changed, 31 insertions(+), 3 deletions(-) (limited to 'src/com') 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, Stmt.Visitor { @Override public Void visitClassStmt(Stmt.Class stmt) { environment.define(stmt.name.lexeme, null); - LoxClass klass = new LoxClass(stmt.name.lexeme); + + Map 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 methods; - LoxClass(String name) { + LoxClass(String name, Map 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, Stmt.Visitor { } private enum FunctionType { - NONE, FUNCTION + NONE, FUNCTION, METHOD } public void resolve(List statements) { @@ -36,6 +36,12 @@ class Resolver implements Expr.Visitor, Stmt.Visitor { 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; } -- cgit v1.2.3-54-g00ecf