[FIR IDE] Unify origin logic in AAPI/FE10

This commit is contained in:
Yan Zhulanow
2021-10-28 22:48:27 +09:00
parent e943ee1e33
commit 0099e6e81b
7 changed files with 52 additions and 37 deletions
@@ -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<KtSamConstructorSymbol> = withValidityAssertion {
val pointerByPsi = KtPsiBasedSymbolPointer.createForSymbolFromSource(this)
@@ -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<KtSyntheticJavaPropertySymbol> = withValidityAssertion {
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
}
@@ -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<KtSyntheticJavaPropertySymbol> = withValidityAssertion {
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
}
@@ -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
@@ -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<T : DeclarationDescriptor> : KtFe10Symbol, KtFe10AnnotatedSymbol {
@@ -42,21 +40,5 @@ internal interface KtFe10DescSymbol<T : DeclarationDescriptor> : 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) }
}
@@ -21,11 +21,5 @@ internal interface KtFe10PsiSymbol<P : KtElement, D : DeclarationDescriptor> : 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 }
}
@@ -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