From 5b9a7c49763f139b90fdb1f5e4f22b8c9b6db85f Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 29 Dec 2022 12:24:14 +0100 Subject: [PATCH] [FIR] do not consider delegate field as local Otherwise, lazy resolve will never resolve it --- .../checkers/declaration/FirConflictsChecker.kt | 10 +++++++--- .../fir/signaturer/FirBasedSignatureComposer.kt | 2 ++ .../converter/DeclarationsConverter.kt | 17 +++++++++++++---- .../kotlin/fir/builder/RawFirBuilder.kt | 5 +++-- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt index 34dc1cfed44..c810e1e1d67 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt @@ -7,13 +7,13 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.FirDeclarationInspector import org.jetbrains.kotlin.fir.analysis.checkers.FirDeclarationPresenter import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirOuterClassTypeParameterRef import org.jetbrains.kotlin.fir.resolve.getContainingDeclaration @@ -22,9 +22,9 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope import org.jetbrains.kotlin.fir.scopes.impl.PACKAGE_MEMBER import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.util.ListMultimap import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.name.ClassId @@ -50,6 +50,10 @@ object FirConflictsChecker : FirBasicDeclarationChecker() { private fun collectLocalConflicts(declaration: FirDeclaration, conflicting: List) { val localConflicts = SmartSet.create>() for (otherDeclaration in conflicting) { + if (otherDeclaration is FirField && otherDeclaration.source?.kind == KtFakeSourceElementKind.ClassDelegationField) { + // class delegation field will be renamed after by the IR backend in a case of a name clash + continue + } if (otherDeclaration != declaration && !isExpectAndActual(declaration, otherDeclaration)) { localConflicts.add(otherDeclaration.symbol) declarationConflictingSymbols.getOrPut(otherDeclaration) { SmartSet.create() }.add(declaration.symbol) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index 3ea2fd2d0e6..a714c30077c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.signaturer +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleConstant import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* @@ -93,6 +94,7 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirCallableDeclaration) { if (declaration.visibility == Visibilities.Local) return null + if (declaration is FirField && declaration.source?.kind == KtFakeSourceElementKind.ClassDelegationField) return null if (declaration.dispatchReceiverClassLookupTagOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 95a5a9444b9..3c700d62f22 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -28,7 +28,10 @@ import org.jetbrains.kotlin.fir.contracts.builder.buildRawContractDescription import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.impl.* -import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.declarations.utils.DanglingTypeConstraint +import org.jetbrains.kotlin.fir.declarations.utils.addDeclarations +import org.jetbrains.kotlin.fir.declarations.utils.addDefaultBoundIfNecessary +import org.jetbrains.kotlin.fir.declarations.utils.danglingTypeConstraints import org.jetbrains.kotlin.fir.diagnostics.ConeDanglingModifierOnTopLevel import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic @@ -48,9 +51,14 @@ import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* -import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.FirUserTypeRef import org.jetbrains.kotlin.fir.types.builder.* -import org.jetbrains.kotlin.fir.types.impl.* +import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl +import org.jetbrains.kotlin.fir.types.impl.FirTypeArgumentListImpl import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.name.* @@ -1887,10 +1895,11 @@ class DeclarationsConverter( origin = FirDeclarationOrigin.Synthetic name = NameUtils.delegateFieldName(delegateFieldsMap.size) returnTypeRef = firTypeRef - symbol = FirFieldSymbol(CallableId(name)) + symbol = FirFieldSymbol(CallableId(context.currentClassId, name)) isVar = false status = FirDeclarationStatusImpl(Visibilities.Private, Modality.FINAL) initializer = calculatedFirExpression + dispatchReceiverType = currentDispatchReceiverType() }.symbol ) return firTypeRef diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 2df355d7151..272cf1f222c 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -7,8 +7,8 @@ package org.jetbrains.kotlin.fir.builder import com.intellij.psi.PsiElement import com.intellij.psi.tree.IElementType -import com.intellij.util.AstLoadingFilter import com.intellij.psi.util.PsiTreeUtil +import com.intellij.util.AstLoadingFilter import org.jetbrains.kotlin.* import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames.BACKING_FIELD @@ -863,10 +863,11 @@ open class RawFirBuilder( origin = FirDeclarationOrigin.Synthetic name = NameUtils.delegateFieldName(delegateFieldsMap.size) returnTypeRef = type - symbol = FirFieldSymbol(CallableId(name)) + symbol = FirFieldSymbol(CallableId(this@RawFirBuilder.context.currentClassId, name)) isVar = false status = FirDeclarationStatusImpl(Visibilities.Private, Modality.FINAL) initializer = delegateExpression + dispatchReceiverType = currentDispatchReceiverType() } delegateFieldsMap[index] = delegateField.symbol }