diff options
author | 2021-07-08 00:14:31 -0700 | |
---|---|---|
committer | 2021-07-08 02:25:13 -0700 | |
commit | 68a2ebd34fc94488e89ffb82b359ec6e7e152ae9 (patch) | |
tree | 0dbbe26aff8fc38805b4b3780ae7842c433b9522 /jlox/src/com/craftinginterpreters/lox/LoxClass.java | |
parent | 62bd0f83dc909547a69abb8b0aed40cf098b4c95 (diff) | |
download | crafting-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.java | 51 |
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(); + } +} |