diff --git a/src/main/fr/celticinfo/lox/LoxClass.kt b/src/main/fr/celticinfo/lox/LoxClass.kt index 3ba047b..af39749 100644 --- a/src/main/fr/celticinfo/lox/LoxClass.kt +++ b/src/main/fr/celticinfo/lox/LoxClass.kt @@ -12,7 +12,13 @@ class LoxClass(private val name: String, private val superClass: LoxClass?, priv } fun findMethod(name: String): LoxFunction? { - return methods[name] + if (methods.containsKey(name)) { + return methods[name] + } + if (superClass != null) { + return superClass.findMethod(name) + } + return null } override fun arity() = findMethod("init")?.arity() ?: 0 diff --git a/src/test/fr/celticinfo/lox/InterpreterTest.kt b/src/test/fr/celticinfo/lox/InterpreterTest.kt index 1759c35..d3713dd 100644 --- a/src/test/fr/celticinfo/lox/InterpreterTest.kt +++ b/src/test/fr/celticinfo/lox/InterpreterTest.kt @@ -989,4 +989,41 @@ var a = "global"; System.setOut(standardOut) } } -} + + @Test + fun `Inheriting a method should work`() { + val standardOut = System.out + val outputStreamCaptor = ByteArrayOutputStream() + + System.setOut(PrintStream(outputStreamCaptor)) + + try { + val code = """ + class Doughnut { + cook() { + print "Fry until golden brown."; + } + } + + class BostonCream < Doughnut {} + + BostonCream().cook(); + """.trimIndent() + val scanner = Scanner(code) + val tokens = scanner.scanTokens() + val parser = Parser(tokens) + val statements = parser.parse() + assertEquals(3, statements.size) + + val interpreter = Interpreter() + + val resolver = Resolver(interpreter) + resolver.resolve(statements) + + interpreter.interpret(statements) + val output = outputStreamCaptor.toString().trim() + assertEquals("Fry until golden brown.", output) + } finally { + System.setOut(standardOut) + } + }}