[Analysis API] add info about context receivers to the Analysis API

This commit is contained in:
Ilya Kirillov
2022-06-30 17:52:10 +02:00
parent 2f822ab4d9
commit 8f89f1b368
40 changed files with 481 additions and 16 deletions
@@ -5,8 +5,10 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescMemberSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createContextReceivers
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktHasStableParameterNames
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
@@ -39,6 +41,9 @@ internal class KtFe10DescAnonymousFunctionSymbol(
override val receiverType: KtType?
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtType(analysisContext) }
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor.createContextReceivers(analysisContext) }
override fun createPointer(): KtSymbolPointer<KtAnonymousFunctionSymbol> = withValidityAssertion {
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescFunctionLikeSymbolPointer
@@ -75,6 +76,9 @@ internal class KtFe10DescFunctionSymbol private constructor(
override val receiverType: KtType?
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtType(analysisContext) }
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor.createContextReceivers(analysisContext) }
override val isExtension: Boolean
get() = withValidityAssertion { descriptor.isExtension }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
@@ -92,6 +93,9 @@ internal class KtFe10DescKotlinPropertySymbol(
override val receiverType: KtType?
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtType(analysisContext) }
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor.createContextReceivers(analysisContext) }
override val typeParameters: List<KtTypeParameterSymbol>
get() = withValidityAssertion { descriptor.typeParameters.map { it.toKtTypeParameter(analysisContext) } }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescNamedClassOrObjectSymbolSymbol
@@ -54,6 +55,9 @@ internal class KtFe10DescNamedClassOrObjectSymbol(
}
}
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor.createContextReceivers(analysisContext) }
@OptIn(KtAnalysisApiInternals::class)
override val classKind: KtClassKind
get() = withValidityAssertion {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescSamConstructorSymbolPointer
@@ -48,6 +49,9 @@ internal class KtFe10DescSamConstructorSymbol(
override val receiverType: KtType?
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtType(analysisContext) }
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor.createContextReceivers(analysisContext) }
override val isExtension: Boolean
get() = withValidityAssertion { descriptor.isExtension }
@@ -3,11 +3,14 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:OptIn(KtAnalysisApiInternals::class)
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base
import org.jetbrains.kotlin.analysis.api.*
import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
@@ -15,6 +18,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.types.*
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10Renderer
import org.jetbrains.kotlin.analysis.api.impl.base.KtContextReceiverImpl
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.types.KtType
@@ -43,6 +47,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitContextReceiver
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
import org.jetbrains.kotlin.resolve.source.getPsi
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
@@ -263,7 +268,8 @@ internal fun KotlinType.toKtType(analysisContext: Fe10AnalysisContext): KtType {
is FunctionClassDescriptor -> KtFe10FunctionalType(unwrappedType, typeDeclaration, analysisContext)
is ClassDescriptor -> KtFe10UsualClassType(unwrappedType, typeDeclaration, analysisContext)
else -> {
val errorType = ErrorUtils.createErrorType(ErrorTypeKind.UNRESOLVED_CLASS_TYPE, typeConstructor, typeDeclaration.toString())
val errorType =
ErrorUtils.createErrorType(ErrorTypeKind.UNRESOLVED_CLASS_TYPE, typeConstructor, typeDeclaration.toString())
KtFe10ClassErrorType(errorType, analysisContext)
}
}
@@ -563,3 +569,26 @@ internal fun AnnotationDescriptor.getKtNamedAnnotationArguments() =
allValueArguments.map { (name, value) ->
KtNamedAnnotationValue(name, value.toKtAnnotationValue())
}
internal fun CallableDescriptor.createContextReceivers(
analysisContext: Fe10AnalysisContext
): List<KtContextReceiver> {
return contextReceiverParameters.map { createContextReceiver(it, analysisContext) }
}
internal fun ClassDescriptor.createContextReceivers(
analysisContext: Fe10AnalysisContext
): List<KtContextReceiver> {
return contextReceivers.map { createContextReceiver(it, analysisContext) }
}
private fun createContextReceiver(
contextReceiver: ReceiverParameterDescriptor,
analysisContext: Fe10AnalysisContext
): KtContextReceiverImpl {
return KtContextReceiverImpl(
contextReceiver.value.type.toKtType(analysisContext),
(contextReceiver.value as ImplicitContextReceiver).customLabelName,
analysisContext.token
)
}
@@ -5,9 +5,11 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createContextReceivers
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
@@ -55,6 +57,9 @@ internal class KtFe10PsiAnonymousFunctionSymbol(
return extensionReceiverParameter.type.toKtType(analysisContext)
}
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor?.createContextReceivers(analysisContext) ?: emptyList() }
override val isExtension: Boolean
get() = withValidityAssertion { psi.isExtensionDeclaration() }
@@ -5,8 +5,10 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createContextReceivers
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktModality
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
@@ -89,6 +91,9 @@ internal class KtFe10PsiFunctionSymbol(
return extensionReceiverParameter.type.toKtType(analysisContext)
}
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor?.createContextReceivers(analysisContext) ?: emptyList() }
override val isExtension: Boolean
get() = withValidityAssertion { psi.isExtensionDeclaration() }
@@ -6,8 +6,10 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createKtInitializerValue
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktModality
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
@@ -116,6 +118,9 @@ internal class KtFe10PsiKotlinPropertySymbol(
}
}
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor?.createContextReceivers(analysisContext) ?: emptyList() }
override val isExtension: Boolean
get() = withValidityAssertion { psi.isExtensionDeclaration() }
@@ -5,8 +5,10 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescValueParameterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createContextReceivers
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
@@ -57,6 +59,10 @@ internal class KtFe10PsiLiteralAnonymousFunctionSymbol(
extensionReceiverParameter.type.toKtType(analysisContext)
}
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor?.createContextReceivers(analysisContext) ?: emptyList() }
override val isExtension: Boolean
get() = withValidityAssertion { psi.isExtensionDeclaration() }
@@ -6,8 +6,10 @@
package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSupertypesWithAny
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktModality
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
@@ -67,6 +69,10 @@ internal class KtFe10PsiNamedClassOrObjectSymbol(
KtFe10PsiNamedClassOrObjectSymbol(companionObject, analysisContext)
}
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion { descriptor?.createContextReceivers(analysisContext) ?: emptyList() }
@OptIn(KtAnalysisApiInternals::class)
override val classKind: KtClassKind
get() = withValidityAssertion {
@@ -243,4 +243,32 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A
public void testVarargFunctions() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.kt");
}
@Nested
@TestMetadata("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers")
@TestDataPath("$PROJECT_ROOT")
public class ContextReceivers {
@Test
public void testAllFilesPresentInContextReceivers() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("contextReceiversOnClass.kt")
public void testContextReceiversOnClass() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnClass.kt");
}
@Test
@TestMetadata("contextReceiversOnFunction.kt")
public void testContextReceiversOnFunction() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnFunction.kt");
}
@Test
@TestMetadata("contextReceiversOnProperty.kt")
public void testContextReceiversOnProperty() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt");
}
}
}