correct end-block token processing (detect more errors)

This commit is contained in:
Sergey Chernov 2025-08-11 22:48:43 +03:00
parent c398496ee0
commit e916d9805a
3 changed files with 41 additions and 10 deletions

View File

@ -65,9 +65,17 @@ class Compiler(
} }
} }
} }
parseStatement(braceMeansLambda = true)?.also { val s = parseStatement(braceMeansLambda = true)?.also {
statements += it statements += it
} ?: break }
if (s == null) {
when( t.type ) {
Token.Type.RBRACE, Token.Type.EOF, Token.Type.SEMICOLON -> {}
else ->
throw ScriptError(t.pos, "unexpeced `${t.value}` here")
}
break
}
} while (true) } while (true)
return Script(start, statements)//returnScope.needCatch) return Script(start, statements)//returnScope.needCatch)
@ -833,8 +841,18 @@ class Compiler(
val isExtern = cc.skipId("extern") val isExtern = cc.skipId("extern")
when { when {
cc.matchQualifiers("fun", "private") -> parseFunctionDeclaration(Visibility.Private, isExtern) cc.matchQualifiers("fun", "private") -> parseFunctionDeclaration(Visibility.Private, isExtern)
cc.matchQualifiers("fun", "private", "static") -> parseFunctionDeclaration(Visibility.Private, isExtern, isStatic = true) cc.matchQualifiers("fun", "private", "static") -> parseFunctionDeclaration(
cc.matchQualifiers("fun", "static") -> parseFunctionDeclaration(Visibility.Public, isExtern, isStatic = true) Visibility.Private,
isExtern,
isStatic = true
)
cc.matchQualifiers("fun", "static") -> parseFunctionDeclaration(
Visibility.Public,
isExtern,
isStatic = true
)
cc.matchQualifiers("fn", "private") -> parseFunctionDeclaration(Visibility.Private, isExtern) cc.matchQualifiers("fn", "private") -> parseFunctionDeclaration(Visibility.Private, isExtern)
cc.matchQualifiers("fun", "open") -> parseFunctionDeclaration(isOpen = true, isExtern = isExtern) cc.matchQualifiers("fun", "open") -> parseFunctionDeclaration(isOpen = true, isExtern = isExtern)
cc.matchQualifiers("fn", "open") -> parseFunctionDeclaration(isOpen = true, isExtern = isExtern) cc.matchQualifiers("fn", "open") -> parseFunctionDeclaration(isOpen = true, isExtern = isExtern)

View File

@ -43,4 +43,21 @@ class OOTest {
assertEquals( "foo!", Point.getData() ) assertEquals( "foo!", Point.getData() )
""".trimIndent()) """.trimIndent())
} }
// @Test
fun testDynamic() = runTest {
eval("""
println("0")
class DynamicTest : Dynamic {
fun getDynamic(name) {
if (name == "foo") "bar" else null
}
}
println("1")
val d = DynamicTest()
println(d)
println("2")
""".trimIndent())
}
} }

View File

@ -2375,8 +2375,6 @@ class ScriptTest {
x++; y++ x++; y++
} }
assertEquals(p, Point(2,3)) assertEquals(p, Point(2,3))
>>> void
""".trimIndent() """.trimIndent()
) )
} }
@ -2393,8 +2391,6 @@ class ScriptTest {
y++ y++
} }
assertEquals(p, Point(2,3)) assertEquals(p, Point(2,3))
>>> void
""".trimIndent() """.trimIndent()
) )
} }