[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:
Yan Zhulanow
2022-10-28 01:30:33 +09:00
committed by teamcity
parent 04ccd3710f
commit 0a8b9c821c
4 changed files with 46 additions and 3 deletions
@@ -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 {
@@ -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"
}
@@ -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 {