From a0e28972d5152d6d03aa81df443b12d41c81bd1f Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 28 Oct 2021 22:50:25 +0900 Subject: [PATCH] [FIR IDE] Always provide accessors from property symbols in AAPI/FE10 --- .../KtFe10DescDefaultPropertyGetterSymbol.kt | 99 +++++++++++ .../KtFe10DescDefaultPropertySetterSymbol.kt | 138 +++++++++++++++ .../KtFe10DescKotlinPropertySymbol.kt | 14 +- .../KtFe10DescPropertySetterSymbol.kt | 4 +- .../KtFe10DescSyntheticJavaPropertySymbol.kt | 86 ++------- ...cSyntheticJavaPropertySymbolForOverride.kt | 81 +-------- .../KtFe10PsiDefaultPropertyGetterSymbol.kt | 119 +++++++++++++ .../KtFe10PsiDefaultPropertySetterSymbol.kt | 165 ++++++++++++++++++ .../psiBased/KtFe10PsiKotlinPropertySymbol.kt | 22 ++- 9 files changed, 563 insertions(+), 165 deletions(-) create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertyGetterSymbol.kt create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertyGetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertyGetterSymbol.kt new file mode 100644 index 00000000000..6d5de2336f8 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertyGetterSymbol.kt @@ -0,0 +1,99 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.isExplicitOverride +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId + +class KtFe10DescDefaultPropertyGetterSymbol( + private val propertyDescriptor: PropertyDescriptor, + override val analysisContext: Fe10AnalysisContext +) : KtPropertyGetterSymbol(), KtFe10Symbol { + override val isDefault: Boolean + get() = withValidityAssertion { true } + + override val isInline: Boolean + get() = withValidityAssertion { false } + + override val isOverride: Boolean + get() = withValidityAssertion { propertyDescriptor.isExplicitOverride } + + override val hasBody: Boolean + get() = withValidityAssertion { false } + + override val valueParameters: List + get() = withValidityAssertion { emptyList() } + + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { true } + + override val callableIdIfNonLocal: CallableId? + get() = withValidityAssertion { null } + + override val annotatedType: KtTypeAndAnnotations + get() = withValidityAssertion { propertyDescriptor.type.toKtTypeAndAnnotations(analysisContext) } + + override val origin: KtSymbolOrigin + get() = withValidityAssertion { propertyDescriptor.getSymbolOrigin(analysisContext) } + + override val psi: PsiElement? + get() = withValidityAssertion { null } + + override val receiverType: KtTypeAndAnnotations? + get() = withValidityAssertion { propertyDescriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisContext) } + + override val dispatchType: KtType? + get() = withValidityAssertion { propertyDescriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext) } + + override val modality: Modality + get() = withValidityAssertion { propertyDescriptor.modality } + + override val visibility: Visibility + get() = withValidityAssertion { propertyDescriptor.ktVisibility } + + override val annotations: List + get() = withValidityAssertion { emptyList() } + + override fun containsAnnotation(classId: ClassId): Boolean { + withValidityAssertion { + return false + } + } + + override val annotationClassIds: Collection + get() = withValidityAssertion { emptyList() } + + override fun createPointer(): KtSymbolPointer { + withValidityAssertion { + return KtFe10NeverRestoringSymbolPointer() + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt new file mode 100644 index 00000000000..4df96d69941 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt @@ -0,0 +1,138 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer +import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns + +class KtFe10DescDefaultPropertySetterSymbol( + private val propertyDescriptor: PropertyDescriptor, + override val analysisContext: Fe10AnalysisContext +) : KtPropertySetterSymbol(), KtFe10Symbol { + override val parameter: KtValueParameterSymbol by cached { + DefaultKtValueParameterSymbol(propertyDescriptor, analysisContext) + } + + override val isDefault: Boolean + get() = withValidityAssertion { true } + + override val isInline: Boolean + get() = withValidityAssertion { false } + + override val isOverride: Boolean + get() = withValidityAssertion { propertyDescriptor.isExplicitOverride } + + override val hasBody: Boolean + get() = withValidityAssertion { false } + + override val valueParameters: List + get() = withValidityAssertion { listOf(parameter) } + + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { true } + + override val callableIdIfNonLocal: CallableId? + get() = withValidityAssertion { null } + + override val annotatedType: KtTypeAndAnnotations + get() = withValidityAssertion { propertyDescriptor.builtIns.unitType.toKtTypeAndAnnotations(analysisContext) } + + override val origin: KtSymbolOrigin + get() = withValidityAssertion { propertyDescriptor.getSymbolOrigin(analysisContext) } + + override val psi: PsiElement? + get() = withValidityAssertion { null } + + override val receiverType: KtTypeAndAnnotations? + get() = withValidityAssertion { propertyDescriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisContext) } + + override val dispatchType: KtType? + get() = withValidityAssertion { propertyDescriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext) } + + override val modality: Modality + get() = withValidityAssertion { propertyDescriptor.modality } + + override val visibility: Visibility + get() = withValidityAssertion { propertyDescriptor.ktVisibility } + + override val annotations: List + get() = withValidityAssertion { emptyList() } + + override fun containsAnnotation(classId: ClassId): Boolean { + withValidityAssertion { + return false + } + } + + override val annotationClassIds: Collection + get() = withValidityAssertion { emptyList() } + + override fun createPointer(): KtSymbolPointer { + withValidityAssertion { + return KtFe10NeverRestoringSymbolPointer() + } + } + + private class DefaultKtValueParameterSymbol( + private val propertyDescriptor: PropertyDescriptor, + override val analysisContext: Fe10AnalysisContext + ) : KtValueParameterSymbol(), KtFe10Symbol { + override val hasDefaultValue: Boolean + get() = withValidityAssertion { false } + + override val isVararg: Boolean + get() = withValidityAssertion { false } + + override val name: Name + get() = withValidityAssertion { Name.identifier("value") } + + override val annotatedType: KtTypeAndAnnotations + get() = withValidityAssertion { propertyDescriptor.type.toKtTypeAndAnnotations(analysisContext) } + + override val origin: KtSymbolOrigin + get() = withValidityAssertion { propertyDescriptor.getSymbolOrigin(analysisContext) } + + override val psi: PsiElement? + get() = withValidityAssertion { null } + + override val annotations: List + get() = withValidityAssertion { emptyList() } + + override fun containsAnnotation(classId: ClassId): Boolean { + withValidityAssertion { + return false + } + } + + override val annotationClassIds: Collection + get() = withValidityAssertion { emptyList() } + + override fun createPointer(): KtSymbolPointer { + withValidityAssertion { + return KtFe10NeverRestoringSymbolPointer() + } + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt index 51a0ff23cc4..9303ac40676 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt @@ -58,10 +58,10 @@ internal class KtFe10DescKotlinPropertySymbol( get() = withValidityAssertion { descriptor.isExplicitOverride } override val hasGetter: Boolean - get() = withValidityAssertion { descriptor.getter != null } + get() = withValidityAssertion { true } override val hasSetter: Boolean - get() = withValidityAssertion { descriptor.setter != null } + get() = withValidityAssertion { descriptor.isVar } override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { descriptor.callableIdIfNotLocal } @@ -69,15 +69,19 @@ internal class KtFe10DescKotlinPropertySymbol( override val initializer: KtConstantValue? get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() } - override val getter: KtPropertyGetterSymbol? + override val getter: KtPropertyGetterSymbol get() = withValidityAssertion { - val getter = descriptor.getter ?: return null + val getter = descriptor.getter ?: return KtFe10DescDefaultPropertyGetterSymbol(descriptor, analysisContext) return KtFe10DescPropertyGetterSymbol(getter, analysisContext) } override val setter: KtPropertySetterSymbol? get() = withValidityAssertion { - val setter = descriptor.setter ?: return null + if (!descriptor.isVar) { + return null + } + + val setter = descriptor.setter ?: return KtFe10DescDefaultPropertySetterSymbol(descriptor, analysisContext) return KtFe10DescPropertySetterSymbol(setter, analysisContext) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescPropertySetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescPropertySetterSymbol.kt index aeaac380fc6..4d51c7df975 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescPropertySetterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescPropertySetterSymbol.kt @@ -19,14 +19,14 @@ import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor import org.jetbrains.kotlin.descriptors.SyntheticPropertyDescriptor import org.jetbrains.kotlin.descriptors.hasBody import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns internal class KtFe10DescPropertySetterSymbol( override val descriptor: PropertySetterDescriptor, override val analysisContext: Fe10AnalysisContext ) : KtPropertySetterSymbol(), KtFe10DescMemberSymbol { override val annotatedType: KtTypeAndAnnotations - get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisContext) } + get() = withValidityAssertion { descriptor.builtIns.unitType.toKtTypeAndAnnotations(analysisContext) } override val isDefault: Boolean get() = withValidityAssertion { descriptor.isDefault } 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 d46a499aa0e..5057aebf0ef 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 @@ -5,14 +5,13 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext -import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession -import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer -import org.jetbrains.kotlin.analysis.api.symbols.* -import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSyntheticJavaPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer @@ -20,10 +19,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.descriptors.ConstructorDescriptor -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension @@ -53,9 +49,10 @@ internal class KtFe10DescSyntheticJavaPropertySymbol( override val getter: KtPropertyGetterSymbol get() = withValidityAssertion { - val getter = descriptor.getter ?: return EmptyGetterSymbol(descriptor, analysisContext) + val getter = descriptor.getter ?: return KtFe10DescDefaultPropertyGetterSymbol(descriptor, analysisContext) return KtFe10DescPropertyGetterSymbol(getter, analysisContext) } + override val javaGetterSymbol: KtFunctionSymbol get() = withValidityAssertion { KtFe10DescFunctionSymbol(descriptor.getMethod, analysisContext) } @@ -70,7 +67,11 @@ internal class KtFe10DescSyntheticJavaPropertySymbol( override val setter: KtPropertySetterSymbol? get() = withValidityAssertion { - val setter = descriptor.setter ?: return null + if (!descriptor.isVar) { + return null + } + + val setter = descriptor.setter ?: return KtFe10DescDefaultPropertySetterSymbol(descriptor, analysisContext) KtFe10DescPropertySetterSymbol(setter, analysisContext) } @@ -92,69 +93,4 @@ internal class KtFe10DescSyntheticJavaPropertySymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() } - - private class EmptyGetterSymbol( - private val descriptor: SyntheticJavaPropertyDescriptor, - override val analysisContext: Fe10AnalysisContext - ) : KtPropertyGetterSymbol(), KtFe10Symbol { - override val isDefault: Boolean - get() = withValidityAssertion { false } - - override val isInline: Boolean - get() = withValidityAssertion { false } - - override val isOverride: Boolean - get() = withValidityAssertion { descriptor.isExplicitOverride } - - override val hasBody: Boolean - get() = withValidityAssertion { false } - - override val valueParameters: List - get() = withValidityAssertion { emptyList() } - - override val hasStableParameterNames: Boolean - get() = withValidityAssertion { true } - - override val callableIdIfNonLocal: CallableId? - get() = withValidityAssertion { null } - - override val annotatedType: KtTypeAndAnnotations - get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisContext) } - - override val origin: KtSymbolOrigin - get() = withValidityAssertion { KtSymbolOrigin.JAVA } - - override val psi: PsiElement? - get() = withValidityAssertion { null } - - override val receiverType: KtTypeAndAnnotations? - get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisContext) } - - override val dispatchType: KtType? - get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext) } - - override val modality: Modality - get() = withValidityAssertion { Modality.FINAL } - - override val visibility: Visibility - get() = withValidityAssertion { descriptor.ktVisibility } - - override val annotations: List - get() = withValidityAssertion { emptyList() } - - override fun containsAnnotation(classId: ClassId): Boolean { - withValidityAssertion { - return false - } - } - - override val annotationClassIds: Collection - get() = withValidityAssertion { emptyList() } - - override fun createPointer(): KtSymbolPointer { - withValidityAssertion { - return KtFe10NeverRestoringSymbolPointer() - } - } - } } \ No newline at end of file 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 70de121cb10..9c3249ab89a 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 @@ -5,14 +5,10 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext -import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession -import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.* -import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer @@ -20,11 +16,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.descriptors.ConstructorDescriptor -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension @@ -53,9 +46,10 @@ internal class KtFe10DescSyntheticJavaPropertySymbolForOverride( override val getter: KtPropertyGetterSymbol get() = withValidityAssertion { - val getter = descriptor.getter ?: return EmptyGetterSymbol(descriptor, analysisContext) + val getter = descriptor.getter ?: return KtFe10DescDefaultPropertyGetterSymbol(descriptor, analysisContext) return KtFe10DescPropertyGetterSymbol(getter, analysisContext) } + override val javaGetterSymbol: KtFunctionSymbol get() = withValidityAssertion { KtFe10DescFunctionSymbol(descriptor.getterMethod, analysisContext) } @@ -70,7 +64,11 @@ internal class KtFe10DescSyntheticJavaPropertySymbolForOverride( override val setter: KtPropertySetterSymbol? get() = withValidityAssertion { - val setter = descriptor.setter ?: return null + if (!descriptor.isVar) { + return null + } + + val setter = descriptor.setter ?: return KtFe10DescDefaultPropertySetterSymbol(descriptor, analysisContext) KtFe10DescPropertySetterSymbol(setter, analysisContext) } @@ -92,69 +90,4 @@ internal class KtFe10DescSyntheticJavaPropertySymbolForOverride( override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() } - - private class EmptyGetterSymbol( - private val descriptor: JavaForKotlinOverridePropertyDescriptor, - override val analysisContext: Fe10AnalysisContext - ) : KtPropertyGetterSymbol(), KtFe10Symbol { - override val isDefault: Boolean - get() = withValidityAssertion { false } - - override val isInline: Boolean - get() = withValidityAssertion { false } - - override val isOverride: Boolean - get() = withValidityAssertion { descriptor.isExplicitOverride } - - override val hasBody: Boolean - get() = withValidityAssertion { false } - - override val valueParameters: List - get() = withValidityAssertion { emptyList() } - - override val hasStableParameterNames: Boolean - get() = withValidityAssertion { true } - - override val callableIdIfNonLocal: CallableId? - get() = withValidityAssertion { null } - - override val annotatedType: KtTypeAndAnnotations - get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisContext) } - - override val origin: KtSymbolOrigin - get() = withValidityAssertion { KtSymbolOrigin.JAVA } - - override val psi: PsiElement? - get() = withValidityAssertion { null } - - override val receiverType: KtTypeAndAnnotations? - get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisContext) } - - override val dispatchType: KtType? - get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext) } - - override val modality: Modality - get() = withValidityAssertion { Modality.FINAL } - - override val visibility: Visibility - get() = withValidityAssertion { descriptor.ktVisibility } - - override val annotations: List - get() = withValidityAssertion { emptyList() } - - override fun containsAnnotation(classId: ClassId): Boolean { - withValidityAssertion { - return false - } - } - - override val annotationClassIds: Collection - get() = withValidityAssertion { emptyList() } - - override fun createPointer(): KtSymbolPointer { - withValidityAssertion { - return KtFe10NeverRestoringSymbolPointer() - } - } - } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt new file mode 100644 index 00000000000..d3ac9ec47a2 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt @@ -0,0 +1,119 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.* +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktModality +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktSymbolOrigin +import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration +import org.jetbrains.kotlin.resolve.BindingContext + +class KtFe10PsiDefaultPropertyGetterSymbol( + private val propertyPsi: KtProperty, + override val analysisContext: Fe10AnalysisContext +) : KtPropertyGetterSymbol(), KtFe10Symbol { + private val descriptor: PropertyDescriptor? by cached { + val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL) + bindingContext[BindingContext.VARIABLE, psi] as? PropertyDescriptor + } + + override val origin: KtSymbolOrigin + get() = withValidityAssertion { propertyPsi.ktSymbolOrigin } + + override val psi: PsiElement? + get() = withValidityAssertion { null } + + override val isDefault: Boolean + get() = withValidityAssertion { true } + + override val isInline: Boolean + get() = withValidityAssertion { propertyPsi.hasModifier(KtTokens.OVERRIDE_KEYWORD) } + + override val isOverride: Boolean + get() = withValidityAssertion { propertyPsi.hasModifier(KtTokens.OVERRIDE_KEYWORD) } + + override val hasBody: Boolean + get() = withValidityAssertion { false } + + override val valueParameters: List + get() = withValidityAssertion { emptyList() } + + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { true } + + override val callableIdIfNonLocal: CallableId? + get() = withValidityAssertion { null } + + override val annotatedType: KtTypeAndAnnotations + get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() } + + override val receiverType: KtTypeAndAnnotations? + get() = withValidityAssertion { + return if (propertyPsi.isExtensionDeclaration()) { + descriptor?.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() + } else { + null + } + } + + override val dispatchType: KtType? + get() = withValidityAssertion { + if (propertyPsi.isTopLevel) { + return null + } + + return descriptor?.dispatchReceiverParameter?.type?.toKtType(analysisContext) ?: createErrorType() + } + + override val modality: Modality + get() = withValidityAssertion { propertyPsi.ktModality ?: descriptor?.modality ?: Modality.FINAL } + + override val visibility: Visibility + get() = withValidityAssertion { propertyPsi.ktVisibility ?: descriptor?.ktVisibility ?: Visibilities.Public } + + override val annotations: List + get() = withValidityAssertion { emptyList() } + + override fun containsAnnotation(classId: ClassId): Boolean { + withValidityAssertion { + return false + } + } + + override val annotationClassIds: Collection + get() = withValidityAssertion { emptyList() } + + override fun createPointer(): KtSymbolPointer = withValidityAssertion { + return KtFe10NeverRestoringSymbolPointer() + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt new file mode 100644 index 00000000000..5e00d1f380d --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt @@ -0,0 +1,165 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.* +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorType +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktModality +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility +import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration +import org.jetbrains.kotlin.resolve.BindingContext + +class KtFe10PsiDefaultPropertySetterSymbol( + private val propertyPsi: KtProperty, + override val analysisContext: Fe10AnalysisContext +) : KtPropertySetterSymbol(), KtFe10Symbol { + private val descriptor: PropertyDescriptor? by cached { + val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL) + bindingContext[BindingContext.VARIABLE, psi] as? PropertyDescriptor + } + + override val origin: KtSymbolOrigin + get() = withValidityAssertion { propertyPsi.ktSymbolOrigin } + + override val psi: PsiElement? + get() = withValidityAssertion { null } + + override val isDefault: Boolean + get() = withValidityAssertion { true } + + override val isInline: Boolean + get() = withValidityAssertion { propertyPsi.hasModifier(KtTokens.OVERRIDE_KEYWORD) } + + override val isOverride: Boolean + get() = withValidityAssertion { propertyPsi.hasModifier(KtTokens.OVERRIDE_KEYWORD) } + + override val hasBody: Boolean + get() = withValidityAssertion { false } + + override val parameter: KtValueParameterSymbol by cached { + DefaultKtValueParameterSymbol(propertyPsi, descriptor, analysisContext) + } + + override val valueParameters: List + get() = withValidityAssertion { listOf(parameter) } + + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { true } + + override val callableIdIfNonLocal: CallableId? + get() = withValidityAssertion { null } + + override val annotatedType: KtTypeAndAnnotations + get() = withValidityAssertion { + val builtIns = analysisContext.resolveSession.moduleDescriptor.builtIns + return builtIns.unitType.toKtTypeAndAnnotations(analysisContext) + } + + override val receiverType: KtTypeAndAnnotations? + get() = withValidityAssertion { + return if (propertyPsi.isExtensionDeclaration()) { + descriptor?.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() + } else { + null + } + } + + override val dispatchType: KtType? + get() = withValidityAssertion { + if (propertyPsi.isTopLevel) { + return null + } + + return descriptor?.dispatchReceiverParameter?.type?.toKtType(analysisContext) ?: createErrorType() + } + + override val modality: Modality + get() = withValidityAssertion { propertyPsi.ktModality ?: descriptor?.modality ?: Modality.FINAL } + + override val visibility: Visibility + get() = withValidityAssertion { propertyPsi.ktVisibility ?: descriptor?.ktVisibility ?: Visibilities.Public } + + override val annotations: List + get() = withValidityAssertion { emptyList() } + + override fun containsAnnotation(classId: ClassId): Boolean { + withValidityAssertion { + return false + } + } + + override val annotationClassIds: Collection + get() = withValidityAssertion { emptyList() } + + override fun createPointer(): KtSymbolPointer = withValidityAssertion { + return KtFe10NeverRestoringSymbolPointer() + } + + private class DefaultKtValueParameterSymbol( + private val propertyPsi: KtProperty, + private val descriptor: PropertyDescriptor?, + override val analysisContext: Fe10AnalysisContext + ) : KtValueParameterSymbol(), KtFe10Symbol { + override val hasDefaultValue: Boolean + get() = withValidityAssertion { false } + + override val isVararg: Boolean + get() = withValidityAssertion { false } + + override val name: Name + get() = withValidityAssertion { Name.identifier("value") } + + override val annotatedType: KtTypeAndAnnotations + get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() } + + override val origin: KtSymbolOrigin + get() = withValidityAssertion { propertyPsi.ktSymbolOrigin } + + override val psi: PsiElement? + get() = withValidityAssertion { null } + + override val annotations: List + get() = withValidityAssertion { emptyList() } + + override fun containsAnnotation(classId: ClassId): Boolean = withValidityAssertion { + return false + } + + override val annotationClassIds: Collection + get() = withValidityAssertion { emptyList() } + + override fun createPointer(): KtSymbolPointer = withValidityAssertion { + return KtFe10NeverRestoringSymbolPointer() + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt index 407477f3c65..41078df4c3b 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt @@ -52,20 +52,24 @@ internal class KtFe10PsiKotlinPropertySymbol( get() = withValidityAssertion { psi.hasModifier(KtTokens.CONST_KEYWORD) } override val hasGetter: Boolean - get() = withValidityAssertion { psi.getter != null } + get() = withValidityAssertion { true } override val hasSetter: Boolean - get() = withValidityAssertion { psi.setter != null } + get() = withValidityAssertion { psi.isVar } - override val getter: KtPropertyGetterSymbol? + override val getter: KtPropertyGetterSymbol get() = withValidityAssertion { - val getter = psi.getter ?: return null + val getter = psi.getter ?: return KtFe10PsiDefaultPropertyGetterSymbol(psi, analysisContext) return KtFe10PsiPropertyGetterSymbol(getter, analysisContext) } override val setter: KtPropertySetterSymbol? get() = withValidityAssertion { - val setter = psi.setter ?: return null + if (!psi.isVar) { + return null + } + + val setter = psi.setter ?: return KtFe10PsiDefaultPropertySetterSymbol(psi, analysisContext) return KtFe10PsiPropertySetterSymbol(setter, analysisContext) } @@ -121,11 +125,11 @@ internal class KtFe10PsiKotlinPropertySymbol( override val dispatchType: KtType? get() = withValidityAssertion { - return if (!isStatic) { - descriptor?.dispatchReceiverParameter?.type?.toKtType(analysisContext) ?: createErrorType() - } else { - null + if (psi.isTopLevel) { + return null } + + return descriptor?.dispatchReceiverParameter?.type?.toKtType(analysisContext) ?: createErrorType() } override val modality: Modality