From 0099e6e81bbbbd1446baf61c705e8b17bea77f28 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 28 Oct 2021 22:48:27 +0900 Subject: [PATCH] [FIR IDE] Unify origin logic in AAPI/FE10 --- .../KtFe10DescSamConstructorSymbol.kt | 2 +- .../KtFe10DescSyntheticJavaPropertySymbol.kt | 3 -- ...cSyntheticJavaPropertySymbolForOverride.kt | 3 -- .../descriptorBased/base/Kt1DescUtils.kt | 43 +++++++++++++++++-- .../descriptorBased/base/KtFe10DescSymbol.kt | 20 +-------- .../symbols/psiBased/base/KtFe10PsiSymbol.kt | 8 +--- .../psiBased/base/KtFe10PsiSymbolUtils.kt | 10 +++++ 7 files changed, 52 insertions(+), 37 deletions(-) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSamConstructorSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSamConstructorSymbol.kt index 015e6fa263d..36d02292d14 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSamConstructorSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSamConstructorSymbol.kt @@ -48,7 +48,7 @@ internal class KtFe10DescSamConstructorSymbol( get() = withValidityAssertion { descriptor.isExtension } override val origin: KtSymbolOrigin - get() = withValidityAssertion { KtSymbolOrigin.SAM_CONSTRUCTOR } + get() = withValidityAssertion { descriptor.getSymbolOrigin(analysisContext) } override fun createPointer(): KtSymbolPointer = withValidityAssertion { val pointerByPsi = KtPsiBasedSymbolPointer.createForSymbolFromSource(this) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt index c182ac4ccc4..d46a499aa0e 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt @@ -89,9 +89,6 @@ internal class KtFe10DescSyntheticJavaPropertySymbol( override val dispatchType: KtType? get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext) } - override val origin: KtSymbolOrigin - get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY } - override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt index 3430866c8c6..70de121cb10 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt @@ -89,9 +89,6 @@ internal class KtFe10DescSyntheticJavaPropertySymbolForOverride( override val dispatchType: KtType? get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext) } - override val origin: KtSymbolOrigin - get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY } - override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt index 72a194df055..708eebbb7d7 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt @@ -22,13 +22,14 @@ import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor -import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor -import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor +import org.jetbrains.kotlin.descriptors.impl.* +import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor +import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor +import org.jetbrains.kotlin.load.java.sources.JavaSourceElement +import org.jetbrains.kotlin.load.kotlin.toSourceElement import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -38,6 +39,7 @@ import org.jetbrains.kotlin.resolve.constants.* import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor +import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.NewCapturedType @@ -188,6 +190,39 @@ internal fun TypeProjection.toKtTypeArgument(analysisContext: Fe10AnalysisContex } } +internal fun DeclarationDescriptor.getSymbolOrigin(analysisContext: Fe10AnalysisContext): KtSymbolOrigin { + when (this) { + is SyntheticJavaPropertyDescriptor -> return KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY + is SyntheticFieldDescriptor -> return KtSymbolOrigin.PROPERTY_BACKING_FIELD + is SamConstructorDescriptor -> return KtSymbolOrigin.SAM_CONSTRUCTOR + is JavaClassDescriptor, is JavaCallableMemberDescriptor -> return KtSymbolOrigin.JAVA + is DeserializedDescriptor -> return KtSymbolOrigin.LIBRARY + is EnumEntrySyntheticClassDescriptor -> return containingDeclaration.getSymbolOrigin(analysisContext) + is CallableMemberDescriptor -> when (kind) { + CallableMemberDescriptor.Kind.DELEGATION -> return KtSymbolOrigin.DELEGATED + CallableMemberDescriptor.Kind.SYNTHESIZED -> return KtSymbolOrigin.SOURCE_MEMBER_GENERATED + else -> {} + } + } + + val sourceElement = this.toSourceElement + if (sourceElement is JavaSourceElement) { + return KtSymbolOrigin.JAVA + } + + val psi = sourceElement.getPsi() + if (psi != null) { + if (psi.language != KotlinLanguage.INSTANCE) { + return KtSymbolOrigin.JAVA + } + + val virtualFile = psi.containingFile.virtualFile + return analysisContext.getOrigin(virtualFile) + } + + return KtSymbolOrigin.SOURCE +} + internal val KotlinType.ktNullability: KtTypeNullability get() = when { this.isNullabilityFlexible() -> KtTypeNullability.UNKNOWN diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/KtFe10DescSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/KtFe10DescSymbol.kt index 261540fae9e..a95d91e1ea9 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/KtFe10DescSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/KtFe10DescSymbol.kt @@ -15,8 +15,6 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.load.java.sources.JavaSourceElement -import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.resolve.source.PsiSourceElement internal interface KtFe10DescSymbol : KtFe10Symbol, KtFe10AnnotatedSymbol { @@ -42,21 +40,5 @@ internal interface KtFe10DescSymbol : KtFe10Symbol, K get() = withValidityAssertion { (source as? PsiSourceElement)?.psi } override val origin: KtSymbolOrigin - get() = withValidityAssertion { - val descriptor = this.descriptor - if (descriptor is CallableMemberDescriptor) { - // TODO: Add SUBSTITUTION_OVERRIDE when supported in HL API - when (descriptor.kind) { - CallableMemberDescriptor.Kind.FAKE_OVERRIDE -> return KtSymbolOrigin.INTERSECTION_OVERRIDE - CallableMemberDescriptor.Kind.SYNTHESIZED -> return KtSymbolOrigin.SOURCE_MEMBER_GENERATED - else -> {} - } - } - - when (source) { - is KotlinSourceElement -> KtSymbolOrigin.SOURCE - is JavaSourceElement -> KtSymbolOrigin.JAVA - else -> KtSymbolOrigin.LIBRARY - } - } + get() = withValidityAssertion { descriptor.getSymbolOrigin(analysisContext) } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbol.kt index 3f40061170f..2e00b105673 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbol.kt @@ -21,11 +21,5 @@ internal interface KtFe10PsiSymbol

: K get() = descriptor?.annotations ?: Annotations.EMPTY override val origin: KtSymbolOrigin - get() = withValidityAssertion { - return if (psi.containingKtFile.isCompiled) { - KtSymbolOrigin.LIBRARY - } else { - KtSymbolOrigin.SOURCE - } - } + get() = withValidityAssertion { psi.ktSymbolOrigin } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt index 43e2ee80097..21517d57e48 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol import org.jetbrains.kotlin.analysis.api.descriptors.types.KtFe10ClassErrorType +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations @@ -71,6 +72,15 @@ internal val KtElement.ktSymbolKind: KtSymbolKind internal val KtDeclaration.callableIdIfNonLocal: CallableId? get() = calculateCallableId(allowLocal = false) +internal val KtElement.ktSymbolOrigin: KtSymbolOrigin + get() { + return if (containingKtFile.isCompiled) { + KtSymbolOrigin.LIBRARY + } else { + KtSymbolOrigin.SOURCE + } + } + internal fun KtDeclaration.calculateCallableId(allowLocal: Boolean): CallableId? { val selfName = this.name ?: return null val containingFile = this.containingKtFile