diff --git a/compiler/testData/codegen/box/reflection/syntheticClasses/syntheticClasses.kt b/compiler/testData/codegen/box/reflection/syntheticClasses/syntheticClasses.kt index f7707ddb048..2c08b79af35 100644 --- a/compiler/testData/codegen/box/reflection/syntheticClasses/syntheticClasses.kt +++ b/compiler/testData/codegen/box/reflection/syntheticClasses/syntheticClasses.kt @@ -90,9 +90,7 @@ fun box(): String { checkMultifileClass() checkMultifileClassPart() checkKotlinLambda() - - // TODO: fails with KotlinReflectionInternalError: Unresolved class: class JavaClass$$Lambda$1166/180251002 (kind = null) - // checkJavaLambda() + checkJavaLambda() return "OK" } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index 5b9876b8db6..20f1fab6196 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -316,6 +316,15 @@ internal class KClassImpl( } private fun createSyntheticClassOrFail(classId: ClassId, moduleData: RuntimeModuleData): ClassDescriptor { + if (jClass.isSynthetic) { + // Synthetic classes, either from Java or from Kotlin, have no Kotlin metadata and no reliable way (and probably no use cases) + // to introspect, so we create an empty synthetic class descriptor for them. + // This is especially useful for Java lambdas which have names like `JavaClass$$Lambda$4711/1112495601` and are NOT recognized + // as local or anonymous classes (j.l.Class.isLocalClass/isAnonymousClass return false), which breaks some invariants in the + // subsequent code in kotlin-reflect if it tries to interpret them as normal anonymous classes and load their members. + return createSyntheticClass(classId, moduleData) + } + when (val kind = ReflectKotlinClass.create(jClass)?.classHeader?.kind) { KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.MULTIFILE_CLASS,