From f0b55491d8c65dd3dbb47649268f7c51b2705cb9 Mon Sep 17 00:00:00 2001 From: ctsk <9384305+ctsk@users.noreply.github.com> Date: Tue, 11 Oct 2022 12:58:28 +0200 Subject: [PATCH] [jlox] Interpret superclasses --- jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java | 10 +++++++++- jlox/lox/src/main/java/xyz/ctsk/lox/LoxClass.java | 8 +++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java b/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java index e590564..dc32f56 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java @@ -80,6 +80,14 @@ public class Interpreter implements Expr.Visitor, Stmt.Visitor { @Override public Void visitClassStmt(Stmt.Class stmt) { + Object superclass = null; + if (stmt.superclass() != null) { + superclass = evaluate(stmt.superclass()); + if (!(superclass instanceof LoxClass)) { + throw new RuntimeError(stmt.superclass().name(), "Superclass must be a class."); + } + } + environment.define(stmt.name().lexeme(), null); Map methods = new HashMap<>(); @@ -88,7 +96,7 @@ public class Interpreter implements Expr.Visitor, Stmt.Visitor { methods.put(method.name().lexeme(), function); } - LoxClass clazz = new LoxClass(stmt.name().lexeme(), methods); + LoxClass clazz = new LoxClass(stmt.name().lexeme(), (LoxClass) superclass, methods); environment.assign(stmt.name(), clazz); return null; } diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/LoxClass.java b/jlox/lox/src/main/java/xyz/ctsk/lox/LoxClass.java index 4c04e8a..00d4888 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/LoxClass.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/LoxClass.java @@ -5,10 +5,12 @@ import java.util.Map; public class LoxClass implements LoxCallable { final String name; + private final LoxClass superclass; private final Map methods; - LoxClass(String name, Map methods) { + LoxClass(String name, LoxClass superclass, Map methods) { this.name = name; + this.superclass = superclass; this.methods = methods; } @@ -39,6 +41,10 @@ public class LoxClass implements LoxCallable { return methods.get(name); } + if (superclass != null) { + return superclass.findMethod(name); + } + return null; } }