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")