aboutsummaryrefslogtreecommitdiffstats
path: root/jlox/src/com/craftinginterpreters/lox/LoxClass.java
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-07-08 00:14:31 -0700
committerGravatar Tom Willemse2021-07-08 02:25:13 -0700
commit68a2ebd34fc94488e89ffb82b359ec6e7e152ae9 (patch)
tree0dbbe26aff8fc38805b4b3780ae7842c433b9522 /jlox/src/com/craftinginterpreters/lox/LoxClass.java
parent62bd0f83dc909547a69abb8b0aed40cf098b4c95 (diff)
downloadcrafting-interpreters-68a2ebd34fc94488e89ffb82b359ec6e7e152ae9.tar.gz
crafting-interpreters-68a2ebd34fc94488e89ffb82b359ec6e7e152ae9.zip
Restructure project to make room for clox
Diffstat (limited to 'jlox/src/com/craftinginterpreters/lox/LoxClass.java')
-rw-r--r--jlox/src/com/craftinginterpreters/lox/LoxClass.java51
1 files changed, 51 insertions, 0 deletions
diff --git a/jlox/src/com/craftinginterpreters/lox/LoxClass.java b/jlox/src/com/craftinginterpreters/lox/LoxClass.java
new file mode 100644
index 0000000..5d1c136
--- /dev/null
+++ b/jlox/src/com/craftinginterpreters/lox/LoxClass.java
@@ -0,0 +1,51 @@
+package com.craftinginterpreters.lox;
+
+import java.util.List;
+import java.util.Map;
+
+class LoxClass implements LoxCallable {
+ final String name;
+ final LoxClass superclass;
+ private final Map<String, LoxFunction> methods;
+
+ LoxClass(String name, LoxClass superclass, Map<String, LoxFunction> methods) {
+ this.superclass = superclass;
+ this.name = name;
+ this.methods = methods;
+ }
+
+ LoxFunction findMethod(String name) {
+ if (methods.containsKey(name)) {
+ return methods.get(name);
+ }
+
+ if (superclass != null) {
+ return superclass.findMethod(name);
+ }
+
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ @Override
+ public Object call(Interpreter interpreter, List<Object> arguments) {
+ LoxInstance instance = new LoxInstance(this);
+ LoxFunction initializer = findMethod("init");
+ if (initializer != null) {
+ initializer.bind(instance).call(interpreter, arguments);
+ }
+ return instance;
+ }
+
+
+ @Override
+ public int arity() {
+ LoxFunction initializer = findMethod("init");
+ if (initializer == null) return 0;
+ return initializer.arity();
+ }
+}