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