Improve extern member diagnostics and cover extern generic class test
This commit is contained in:
parent
979e6ea9b7
commit
2b13fe8053
@ -7762,7 +7762,11 @@ class Compiler(
|
|||||||
nameStartPos = t.pos
|
nameStartPos = t.pos
|
||||||
}
|
}
|
||||||
if (parentClassCtx?.isExtern == true && !isExtern) {
|
if (parentClassCtx?.isExtern == true && !isExtern) {
|
||||||
throw ScriptError(nameStartPos, "members of extern classes/objects must be marked extern")
|
val owner = parentClassCtx.name
|
||||||
|
throw ScriptError(
|
||||||
|
nameStartPos,
|
||||||
|
"member '$name' in extern class/object '$owner' must be declared extern (use `extern fun $name(...)`)"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
val extensionWrapperName = extTypeName?.let { extensionCallableName(it, name) }
|
val extensionWrapperName = extTypeName?.let { extensionCallableName(it, name) }
|
||||||
val classCtx = codeContexts.asReversed().firstOrNull { it is CodeContext.ClassBody } as? CodeContext.ClassBody
|
val classCtx = codeContexts.asReversed().firstOrNull { it is CodeContext.ClassBody } as? CodeContext.ClassBody
|
||||||
@ -8788,7 +8792,12 @@ class Compiler(
|
|||||||
}
|
}
|
||||||
val parentClassCtx = codeContexts.lastOrNull() as? CodeContext.ClassBody
|
val parentClassCtx = codeContexts.lastOrNull() as? CodeContext.ClassBody
|
||||||
if (parentClassCtx?.isExtern == true && !isExtern) {
|
if (parentClassCtx?.isExtern == true && !isExtern) {
|
||||||
throw ScriptError(nameStartPos, "members of extern classes/objects must be marked extern")
|
val owner = parentClassCtx.name
|
||||||
|
val kind = if (isMutable) "var" else "val"
|
||||||
|
throw ScriptError(
|
||||||
|
nameStartPos,
|
||||||
|
"member '$name' in extern class/object '$owner' must be declared extern (use `extern $kind $name: ...`)"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val receiverNormalization = normalizeReceiverTypeDecl(receiverTypeDecl, emptySet())
|
val receiverNormalization = normalizeReceiverTypeDecl(receiverTypeDecl, emptySet())
|
||||||
|
|||||||
@ -615,6 +615,32 @@ class TypesTest {
|
|||||||
|
|
||||||
""".trimIndent())
|
""".trimIndent())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testExternGenerics() = runTest {
|
||||||
|
eval("""
|
||||||
|
extern fun f<T>(x: T): T
|
||||||
|
extern class Cell<T> {
|
||||||
|
extern var value: T
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testExternClassMemberMustBeExternMessage() = runTest {
|
||||||
|
val e = assertFailsWith<ScriptError> {
|
||||||
|
eval(
|
||||||
|
"""
|
||||||
|
extern class Cell<T> {
|
||||||
|
var value: T
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
assertTrue(e.message?.contains("must be declared extern") == true)
|
||||||
|
assertTrue(e.message?.contains("extern var value") == true)
|
||||||
|
}
|
||||||
|
|
||||||
// @Test fun nonTrivialOperatorsTest() = runTest {
|
// @Test fun nonTrivialOperatorsTest() = runTest {
|
||||||
// val s = Script.newScope()
|
// val s = Script.newScope()
|
||||||
// s.eval("""
|
// s.eval("""
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user