|
|
|
|
@ -47,6 +47,14 @@ class Interpreter: ExprVisitor<Any?>, StmtVisitor<Unit>{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun visitClassStmt(stmt: ClassStmt) {
|
|
|
|
|
val superClass = stmt.superClass?.let {
|
|
|
|
|
val evaluatedSuperClass = evaluate(it)
|
|
|
|
|
if (evaluatedSuperClass !is LoxClass) {
|
|
|
|
|
throw RuntimeError(it.name, "Superclass must be a class")
|
|
|
|
|
}
|
|
|
|
|
evaluatedSuperClass
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
environment.define(stmt.name.lexeme, null)
|
|
|
|
|
|
|
|
|
|
val methods = stmt.methods.associate { method ->
|
|
|
|
|
@ -54,7 +62,7 @@ class Interpreter: ExprVisitor<Any?>, StmtVisitor<Unit>{
|
|
|
|
|
method.name.lexeme to function
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val klass = LoxClass(stmt.name.lexeme, methods)
|
|
|
|
|
val klass = LoxClass(stmt.name.lexeme, superClass, methods)
|
|
|
|
|
|
|
|
|
|
environment.assign(stmt.name, klass)
|
|
|
|
|
}
|
|
|
|
|
|