[FE] Add missing 'ClassId' check in Kotlin class loading (KTIJ-23435)
'findKotlinClassOrContent()' does not really distinguish between outer class names and package path components, so it might return 'foo/bar/Baz.Boo' for 'foo/bar/Baz/Boo'. Possibly because 'findKotlinClassOrContent()' potentially returns a raw byte array, ClassId checking is supposed to be performed in 'extractClassMetadata()'. For Java, it happens inside 'FirJavaFacade.findClass()', yet for Kotlin the check was absent.
This commit is contained in:
+6
@@ -33763,6 +33763,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/package/packageLocalClassNotImportedWithDefaultImport.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("packageOrNestedClass.kt")
|
||||
public void testPackageOrNestedClass() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/package/packageOrNestedClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("packageQualifiedMethod.kt")
|
||||
public void testPackageQualifiedMethod() throws Exception {
|
||||
|
||||
+3
-3
@@ -108,15 +108,15 @@ class JvmClassFileBasedSymbolProvider(
|
||||
// Nested class of Kotlin class should have been a Kotlin class.
|
||||
return null
|
||||
}
|
||||
val javaClass = javaFacade.findClass(classId, (result as? KotlinClassFinder.Result.ClassFileContent)?.content)
|
||||
?: return null
|
||||
val knownContent = (result as? KotlinClassFinder.Result.ClassFileContent)?.content
|
||||
val javaClass = javaFacade.findClass(classId, knownContent) ?: return null
|
||||
return ClassMetadataFindResult.NoMetadata { symbol ->
|
||||
javaFacade.convertJavaClassToFir(symbol, classId.outerClassId?.let(::getClass), javaClass)
|
||||
}
|
||||
}
|
||||
|
||||
val kotlinClass = result.kotlinJvmBinaryClass
|
||||
if (kotlinClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
|
||||
if (kotlinClass.classHeader.kind != KotlinClassHeader.Kind.CLASS || kotlinClass.classId != classId) return null
|
||||
val data = kotlinClass.classHeader.data ?: return null
|
||||
val strings = kotlinClass.classHeader.strings ?: return null
|
||||
val (nameResolver, classProto) = JvmProtoBufUtil.readClassDataFrom(data, strings)
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MODULE: lib
|
||||
|
||||
// FILE: lib.kt
|
||||
@file:Suppress("PACKAGE_OR_CLASSIFIER_REDECLARATION")
|
||||
package lib
|
||||
|
||||
class foo {
|
||||
class bar {
|
||||
fun get(): Int = 1
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: lib_foo.kt
|
||||
@file:Suppress("PACKAGE_OR_CLASSIFIER_REDECLARATION")
|
||||
package lib.foo
|
||||
|
||||
class bar {
|
||||
fun get(): Int = 0
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
fun box(): String {
|
||||
val obj = lib.foo.bar()
|
||||
return if (obj.get() == 0) "OK" else "ERROR"
|
||||
}
|
||||
+6
@@ -33763,6 +33763,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/package/packageLocalClassNotImportedWithDefaultImport.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("packageOrNestedClass.kt")
|
||||
public void testPackageOrNestedClass() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/package/packageOrNestedClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("packageQualifiedMethod.kt")
|
||||
public void testPackageQualifiedMethod() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user