diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt
index 77a06230894..fb698aa8215 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt
@@ -135,7 +135,9 @@ fun FirClassifierSymbol<*>.toSymbol(
is FirTypeAliasSymbol -> {
handleAnnotations?.invoke(fir.expandedTypeRef.annotations)
val coneClassLikeType = fir.expandedTypeRef.coneType as ConeClassLikeType
- coneClassLikeType.lookupTag.toSymbol(session)!!.toSymbol(session, classifierStorage, typeContext, handleAnnotations)
+ coneClassLikeType.lookupTag.toSymbol(session)
+ ?.toSymbol(session, classifierStorage, typeContext, handleAnnotations)
+ ?: classifierStorage.getIrClassSymbolForNotFoundClass(coneClassLikeType.lookupTag)
}
is FirClassSymbol -> {
classifierStorage.getIrClassSymbol(this)
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt
index 279332b7cb2..998560e3ce6 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt
@@ -5,10 +5,7 @@
package org.jetbrains.kotlin.fir.backend
-import org.jetbrains.kotlin.descriptors.ClassKind
-import org.jetbrains.kotlin.descriptors.Modality
-import org.jetbrains.kotlin.descriptors.Visibilities
-import org.jetbrains.kotlin.descriptors.Visibility
+import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression
@@ -24,6 +21,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
+import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl
@@ -468,6 +466,29 @@ class Fir2IrClassifierStorage(
return symbol
}
+ fun getIrClassSymbolForNotFoundClass(classLikeLookupTag: ConeClassLikeLookupTag): IrClassSymbol {
+ val classId = classLikeLookupTag.classId
+ val signature = IdSignature.CommonSignature(
+ classId.packageFqName.asString(), classId.relativeClassName.asString(), 0, 0,
+ )
+
+ val parentId = classId.outerClassId
+ val parentClass = parentId?.let { getIrClassSymbolForNotFoundClass(ConeClassLikeLookupTagImpl(it)) }
+ val irParent = parentClass?.owner ?: declarationStorage.getIrExternalPackageFragment(classId.packageFqName)
+
+ val symbol = Fir2IrClassSymbol(signature)
+ symbolTable.declareClass(signature, { symbol }) {
+ irFactory.createClass(
+ UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, symbol, classId.shortClassName,
+ ClassKind.CLASS, DescriptorVisibilities.DEFAULT_VISIBILITY, Modality.FINAL,
+ ).apply {
+ parent = irParent
+ }
+ }
+
+ return symbol
+ }
+
fun getIrTypeParameterSymbol(
firTypeParameterSymbol: FirTypeParameterSymbol,
typeContext: ConversionTypeContext
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt
index 9e5f05ae1ed..91ffeeec91f 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt
@@ -210,7 +210,7 @@ class Fir2IrDeclarationStorage(
}
}
- private fun getIrExternalPackageFragment(fqName: FqName): IrExternalPackageFragment {
+ fun getIrExternalPackageFragment(fqName: FqName): IrExternalPackageFragment {
return fragmentCache.getOrPut(fqName) {
return symbolTable.declareExternalPackageFragment(FirPackageFragmentDescriptor(fqName, moduleDescriptor))
}
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt
index 1180f55c9cb..c2a430fef19 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.toSymbol
+import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.*
@@ -112,6 +113,7 @@ class Fir2IrTypeConverter(
?: lookupTag.toSymbol(session)?.toSymbol(session, classifierStorage, typeContext) {
typeAnnotations += with(annotationGenerator) { it.toIrAnnotations() }
}
+ ?: (lookupTag as? ConeClassLikeLookupTag)?.let(classifierStorage::getIrClassSymbolForNotFoundClass)
?: return createErrorType()
when {
diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java
index e94e089b2f0..a5d9c90b6f3 100644
--- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java
+++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java
@@ -16366,6 +16366,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.kt");
}
+ @Test
+ @TestMetadata("notFoundClasses.kt")
+ public void testNotFoundClasses() throws Exception {
+ runTest("compiler/testData/codegen/box/fir/notFoundClasses.kt");
+ }
+
@Test
@TestMetadata("SamWithReceiverMavenProjectImportHandler.kt")
public void testSamWithReceiverMavenProjectImportHandler() throws Exception {
diff --git a/compiler/testData/codegen/box/fir/notFoundClasses.kt b/compiler/testData/codegen/box/fir/notFoundClasses.kt
new file mode 100644
index 00000000000..c8ac3965353
--- /dev/null
+++ b/compiler/testData/codegen/box/fir/notFoundClasses.kt
@@ -0,0 +1,27 @@
+// WITH_RUNTIME
+// IGNORE_BACKEND: JVM_IR
+// TARGET_BACKEND: JVM
+
+// MODULE: lib1
+// FILE: A.java
+public class A {}
+
+// MODULE: lib2(lib1)
+// FILE: B.java
+public class B {
+ public static void foo(java.util.List x) {}
+ public static java.util.List getListOfA() { return new java.util.ArrayList(); }
+}
+
+// MODULE: main(lib2)
+// FILE: main.kt
+
+val a = B.getListOfA()
+
+fun box(): String {
+ B.foo(emptyList())
+
+ if (!a.isEmpty()) return "fail"
+
+ return "OK"
+}
diff --git a/compiler/testData/codegen/box/inference/manyConstraintsDueToFlexibleRawTypes.kt b/compiler/testData/codegen/box/inference/manyConstraintsDueToFlexibleRawTypes.kt
index 4ae08c0ea3b..98c877c7fef 100644
--- a/compiler/testData/codegen/box/inference/manyConstraintsDueToFlexibleRawTypes.kt
+++ b/compiler/testData/codegen/box/inference/manyConstraintsDueToFlexibleRawTypes.kt
@@ -1,5 +1,4 @@
// TARGET_BACKEND: JVM
-// IGNORE_BACKEND_FIR: JVM_IR
// FILE: MySettings.java
import java.util.Collection;
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java
index f29646f00fc..7a437fa85b6 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java
@@ -16252,6 +16252,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/fir/NameHighlighter.kt");
}
+ @Test
+ @TestMetadata("notFoundClasses.kt")
+ public void testNotFoundClasses() throws Exception {
+ runTest("compiler/testData/codegen/box/fir/notFoundClasses.kt");
+ }
+
@Test
@TestMetadata("SuspendExtension.kt")
public void testSuspendExtension() throws Exception {
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
index cf8743911e9..adb47408df1 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
@@ -16366,6 +16366,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.kt");
}
+ @Test
+ @TestMetadata("notFoundClasses.kt")
+ public void testNotFoundClasses() throws Exception {
+ runTest("compiler/testData/codegen/box/fir/notFoundClasses.kt");
+ }
+
@Test
@TestMetadata("SamWithReceiverMavenProjectImportHandler.kt")
public void testSamWithReceiverMavenProjectImportHandler() throws Exception {
diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
index 202a8b0b925..c48e76fc005 100644
--- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
+++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
@@ -13401,6 +13401,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
public void testNameHighlighter() throws Exception {
runTest("compiler/testData/codegen/box/fir/NameHighlighter.kt");
}
+
+ @TestMetadata("notFoundClasses.kt")
+ public void testNotFoundClasses() throws Exception {
+ runTest("compiler/testData/codegen/box/fir/notFoundClasses.kt");
+ }
}
@TestMetadata("compiler/testData/codegen/box/fullJdk")