FIR2IR: Support not found dependencies classes

^KT-49119 Relates
This commit is contained in:
Denis.Zharkov
2021-10-06 13:52:21 +03:00
committed by TeamCityServer
parent 9230195317
commit f5da8957b4
10 changed files with 81 additions and 7 deletions
@@ -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)
@@ -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
@@ -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))
}
@@ -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 {
@@ -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 {
+27
View File
@@ -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<A> x) {}
public static java.util.List<A> getListOfA() { return new java.util.ArrayList<A>(); }
}
// MODULE: main(lib2)
// FILE: main.kt
val a = B.getListOfA()
fun box(): String {
B.foo(emptyList())
if (!a.isEmpty()) return "fail"
return "OK"
}
@@ -1,5 +1,4 @@
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
// FILE: MySettings.java
import java.util.Collection;
@@ -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 {
@@ -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 {
@@ -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")