Add instances creation

main
Olivier Abrivard 1 year ago
parent 85c850a16d
commit 3e9fca6593

@ -1,5 +1,12 @@
package fr.celticinfo.lox
class LoxClass(val name: String) {
class LoxClass(private val name: String) : LoxCallable {
override fun call(interpreter: Interpreter, arguments: List<Any?>): Any? {
val instance = LoxInstance(this)
return instance
}
override fun arity() = 0
override fun toString() = name
}

@ -0,0 +1,5 @@
package fr.celticinfo.lox
class LoxInstance(private val klass: LoxClass) {
override fun toString() = "$klass instance"
}

@ -805,4 +805,36 @@ var a = "global";
System.setOut(standardOut)
}
}
@Test
fun `valid code with class declaration and instantiation`() {
val standardOut = System.out
val outputStreamCaptor = ByteArrayOutputStream()
System.setOut(PrintStream(outputStreamCaptor))
try {
val code = """
class DevonshireCream {}
var cream = DevonshireCream();
print cream;
""".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("DevonshireCream instance", output)
} finally {
System.setOut(standardOut)
}
}
}

@ -254,4 +254,20 @@ class ParserTest {
val stmt = statements[0]
assertTrue(stmt is ClassStmt)
}
@Test
fun `valid code with class instantiation`() {
val code = """
class DevonshireCream {}
var cream = DevonshireCream();
print cream;
""".trimIndent()
val scanner = Scanner(code)
val tokens = scanner.scanTokens()
val parser = Parser(tokens)
val statements = parser.parse()
assertEquals(3,statements.size)
val stmt = statements[1]
assertTrue(stmt is Var)
}
}
Loading…
Cancel
Save