K2: correctly set importedFromObjectOrStaticData for fields
#KT-59140 Fixed #KT-58980 Fixed
This commit is contained in:
committed by
Space Team
parent
18206210cf
commit
8983e3a218
+4
@@ -64,6 +64,7 @@ import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.contract
|
||||
import org.jetbrains.kotlin.analysis.api.fir.signatures.KtFirFunctionLikeSubstitutorBasedSignature
|
||||
import org.jetbrains.kotlin.analysis.api.fir.signatures.KtFirVariableLikeSubstitutorBasedSignature
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
|
||||
|
||||
/**
|
||||
* Maps FirElement to KtSymbol & ConeType to KtType, thread safe
|
||||
@@ -334,6 +335,9 @@ internal class KtSymbolByFirBuilder constructor(
|
||||
|
||||
|
||||
fun buildFieldSymbol(firSymbol: FirFieldSymbol): KtFirJavaFieldSymbol {
|
||||
if (firSymbol.origin == FirDeclarationOrigin.ImportedFromObjectOrStatic) {
|
||||
return buildFieldSymbol(firSymbol.fir.importedFromObjectOrStaticData!!.original.symbol)
|
||||
}
|
||||
checkRequirementForBuildingSymbol<KtFirJavaFieldSymbol>(firSymbol, firSymbol.fir.isJavaFieldOrSubstitutionOverrideOfJavaField())
|
||||
return symbolsCache.cache(firSymbol) { KtFirJavaFieldSymbol(firSymbol, analysisSession) }
|
||||
}
|
||||
|
||||
+24
@@ -18609,6 +18609,30 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
||||
runTest("compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnum.kt")
|
||||
public void testStaticImportFromEnum() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnum.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnumJava.kt")
|
||||
public void testStaticImportFromEnumJava() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnumJava.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromObject.kt")
|
||||
public void testStaticImportFromObject() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromObject.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportViaInheritance.kt")
|
||||
public void testStaticImportViaInheritance() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportViaInheritance.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SuspendExtension.kt")
|
||||
public void testSuspendExtension() throws Exception {
|
||||
|
||||
+24
@@ -18609,6 +18609,30 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
||||
runTest("compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnum.kt")
|
||||
public void testStaticImportFromEnum() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnum.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnumJava.kt")
|
||||
public void testStaticImportFromEnumJava() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnumJava.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromObject.kt")
|
||||
public void testStaticImportFromObject() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromObject.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportViaInheritance.kt")
|
||||
public void testStaticImportViaInheritance() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportViaInheritance.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SuspendExtension.kt")
|
||||
public void testSuspendExtension() throws Exception {
|
||||
|
||||
+34
-23
@@ -8,17 +8,17 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildFieldCopy
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyCopy
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
@@ -62,7 +62,7 @@ abstract class FirAbstractImportingScope(
|
||||
}
|
||||
}
|
||||
|
||||
private inline fun <D : FirCallableDeclaration, S : FirCallableSymbol<D>> processCallablesFromImportsByName(
|
||||
private inline fun <D : FirCallableDeclaration, S : FirCallableSymbol<out D>> processCallablesFromImportsByName(
|
||||
name: Name?,
|
||||
imports: List<FirResolvedImport>,
|
||||
crossinline processor: (S) -> Unit,
|
||||
@@ -101,7 +101,7 @@ abstract class FirAbstractImportingScope(
|
||||
name,
|
||||
imports,
|
||||
processor,
|
||||
{ classId -> fir.buildImportedCopy(classId).symbol },
|
||||
{ classId -> fir.buildImportedVersion(classId).symbol },
|
||||
FirContainingNamesAwareScope::processFunctionsByName,
|
||||
provider::getTopLevelFunctionSymbols
|
||||
)
|
||||
@@ -112,37 +112,48 @@ abstract class FirAbstractImportingScope(
|
||||
name,
|
||||
imports,
|
||||
processor,
|
||||
{ classId -> fir.buildImportedCopy(classId).symbol },
|
||||
{ importedName, importedProcessor ->
|
||||
processPropertiesByName(importedName) {
|
||||
if (it is FirPropertySymbol) {
|
||||
importedProcessor(it)
|
||||
} else {
|
||||
processor(it)
|
||||
}
|
||||
}
|
||||
},
|
||||
{ classId -> fir.buildImportedVersion(classId).symbol },
|
||||
FirContainingNamesAwareScope::processPropertiesByName,
|
||||
provider::getTopLevelPropertySymbols
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun FirSimpleFunction.buildImportedCopy(importedClassId: ClassId): FirSimpleFunction {
|
||||
internal fun FirSimpleFunction.buildImportedVersion(importedClassId: ClassId): FirSimpleFunction {
|
||||
return buildSimpleFunctionCopy(this) {
|
||||
origin = FirDeclarationOrigin.ImportedFromObjectOrStatic
|
||||
this.symbol = FirNamedFunctionSymbol(CallableId(importedClassId, name))
|
||||
}.apply {
|
||||
importedFromObjectOrStaticData = ImportedFromObjectOrStaticData(importedClassId, this@buildImportedCopy)
|
||||
importedFromObjectOrStaticData = ImportedFromObjectOrStaticData(importedClassId, this@buildImportedVersion)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun FirProperty.buildImportedCopy(importedClassId: ClassId): FirProperty {
|
||||
return buildPropertyCopy(this) {
|
||||
origin = FirDeclarationOrigin.ImportedFromObjectOrStatic
|
||||
this.symbol = FirPropertySymbol(CallableId(importedClassId, name))
|
||||
this.delegateFieldSymbol = null
|
||||
}.apply {
|
||||
importedFromObjectOrStaticData = ImportedFromObjectOrStaticData(importedClassId, this@buildImportedCopy)
|
||||
internal fun FirVariable.buildImportedVersion(importedClassId: ClassId): FirVariable {
|
||||
return when (this) {
|
||||
is FirProperty -> {
|
||||
buildPropertyCopy(this) {
|
||||
origin = FirDeclarationOrigin.ImportedFromObjectOrStatic
|
||||
this.symbol = FirPropertySymbol(CallableId(importedClassId, name))
|
||||
this.delegateFieldSymbol = null
|
||||
}.apply {
|
||||
importedFromObjectOrStaticData = ImportedFromObjectOrStaticData(importedClassId, this@buildImportedVersion)
|
||||
}
|
||||
}
|
||||
is FirField -> {
|
||||
buildFieldCopy(this) {
|
||||
origin = FirDeclarationOrigin.ImportedFromObjectOrStatic
|
||||
this.symbol = FirFieldSymbol(CallableId(importedClassId, name))
|
||||
}.apply {
|
||||
importedFromObjectOrStaticData = ImportedFromObjectOrStaticData(importedClassId, this@buildImportedVersion)
|
||||
}
|
||||
}
|
||||
is FirEnumEntry -> {
|
||||
// It's not important to create an imported copy of FirEnumEntry
|
||||
this
|
||||
}
|
||||
else -> {
|
||||
throw IllegalStateException("Unexpected variable in buildImportedCopy: ${render()} of type ${this::class.java}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+28
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.fir.declarations.UnresolvedDeprecationProvider
|
||||
import org.jetbrains.kotlin.fir.declarations.asResolveState
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirVariableBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.resolvePhase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
@@ -128,3 +129,30 @@ inline fun buildField(init: FirFieldBuilder.() -> Unit): FirField {
|
||||
}
|
||||
return FirFieldBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildFieldCopy(original: FirField, init: FirFieldBuilder.() -> Unit): FirField {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirFieldBuilder()
|
||||
copyBuilder.source = original.source
|
||||
copyBuilder.resolvePhase = original.resolvePhase
|
||||
copyBuilder.moduleData = original.moduleData
|
||||
copyBuilder.origin = original.origin
|
||||
copyBuilder.attributes = original.attributes.copy()
|
||||
copyBuilder.typeParameters.addAll(original.typeParameters)
|
||||
copyBuilder.status = original.status
|
||||
copyBuilder.returnTypeRef = original.returnTypeRef
|
||||
copyBuilder.deprecationsProvider = original.deprecationsProvider
|
||||
copyBuilder.containerSource = original.containerSource
|
||||
copyBuilder.dispatchReceiverType = original.dispatchReceiverType
|
||||
copyBuilder.contextReceivers.addAll(original.contextReceivers)
|
||||
copyBuilder.name = original.name
|
||||
copyBuilder.initializer = original.initializer
|
||||
copyBuilder.isVar = original.isVar
|
||||
copyBuilder.backingField = original.backingField
|
||||
copyBuilder.annotations.addAll(original.annotations)
|
||||
copyBuilder.symbol = original.symbol
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+1
@@ -239,6 +239,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
||||
parents += variableBuilder
|
||||
default("resolvePhase", "FirResolvePhase.DECLARATIONS")
|
||||
openBuilder()
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(typeOperatorCall) {
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
|
||||
// FILE: dependency/Base.kt
|
||||
|
||||
package dependency;
|
||||
|
||||
enum class Base(val s: String) {
|
||||
FIRST("O"),
|
||||
SECOND("K")
|
||||
}
|
||||
|
||||
// FILE: test/test.kt
|
||||
|
||||
package test
|
||||
|
||||
import dependency.Base.FIRST
|
||||
import dependency.Base.SECOND
|
||||
|
||||
fun box(): String = FIRST.s + SECOND.s
|
||||
@@ -0,0 +1,18 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
|
||||
// FILE: dependency/Base.java
|
||||
|
||||
package dependency;
|
||||
|
||||
public enum Base {
|
||||
O, K;
|
||||
}
|
||||
|
||||
// FILE: test/test.kt
|
||||
|
||||
package test
|
||||
|
||||
import dependency.Base.O
|
||||
import dependency.Base.K
|
||||
|
||||
fun box(): String = O.name + K.name
|
||||
@@ -0,0 +1,21 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// ISSUE: KT-58980
|
||||
|
||||
// FILE: dependency/Base.java
|
||||
|
||||
package dependency;
|
||||
|
||||
public class Base {
|
||||
public String string = "OK";
|
||||
}
|
||||
|
||||
// FILE: test/test.kt
|
||||
|
||||
package test
|
||||
|
||||
import dependency.Base
|
||||
import test.KtObject.string
|
||||
|
||||
object KtObject : Base()
|
||||
|
||||
fun box(): String = string
|
||||
+4
-5
@@ -1,3 +1,4 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// ISSUE: KT-59140
|
||||
|
||||
// FILE: pkg/Foo.java
|
||||
@@ -5,17 +6,15 @@
|
||||
package pkg;
|
||||
|
||||
abstract class CommonFoo {
|
||||
public static final int BAR = 1;
|
||||
public static final String BAR = "OK";
|
||||
}
|
||||
|
||||
public class Foo extends CommonFoo {}
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
import pkg.Foo
|
||||
import pkg.Foo.BAR
|
||||
|
||||
fun test() {
|
||||
val bar = <!INVISIBLE_REFERENCE!>BAR<!>
|
||||
val fooBar = Foo.BAR
|
||||
fun box(): String {
|
||||
return BAR
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// ISSUE: KT-59140
|
||||
|
||||
// FILE: pkg/Foo.java
|
||||
|
||||
+24
@@ -18609,6 +18609,30 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnum.kt")
|
||||
public void testStaticImportFromEnum() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnum.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnumJava.kt")
|
||||
public void testStaticImportFromEnumJava() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnumJava.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromObject.kt")
|
||||
public void testStaticImportFromObject() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromObject.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportViaInheritance.kt")
|
||||
public void testStaticImportViaInheritance() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportViaInheritance.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SuspendExtension.kt")
|
||||
public void testSuspendExtension() throws Exception {
|
||||
|
||||
+24
@@ -18609,6 +18609,30 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
||||
runTest("compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnum.kt")
|
||||
public void testStaticImportFromEnum() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnum.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromEnumJava.kt")
|
||||
public void testStaticImportFromEnumJava() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromEnumJava.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportFromObject.kt")
|
||||
public void testStaticImportFromObject() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportFromObject.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("staticImportViaInheritance.kt")
|
||||
public void testStaticImportViaInheritance() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/staticImportViaInheritance.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SuspendExtension.kt")
|
||||
public void testSuspendExtension() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user