From a16a01bf378a69a609ca409028cbdcd901a9d1c5 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 7 Jun 2022 13:27:33 +0200 Subject: [PATCH] [analysis api] fix Analysis API contracts violation --- .../api/descriptors/KtFe10AnalysisSession.kt | 8 +- .../KtFe10CompletionCandidateChecker.kt | 2 +- .../components/KtFe10DiagnosticProvider.kt | 34 +++---- .../KtFe10ExpressionInfoProvider.kt | 4 +- .../KtFe10ExpressionTypeProvider.kt | 17 ++-- .../components/KtFe10InheritorsProvider.kt | 2 +- .../components/KtFe10JvmTypeMapper.kt | 2 +- .../components/KtFe10OverrideInfoProvider.kt | 8 +- .../components/KtFe10PsiTypeProvider.kt | 3 +- .../components/KtFe10SamResolver.kt | 2 +- .../components/KtFe10ScopeProvider.kt | 39 ++++---- .../components/KtFe10SmartCastProvider.kt | 39 ++++---- .../components/KtFe10SubtypingComponent.kt | 5 +- ...tFe10SymbolDeclarationOverridesProvider.kt | 9 +- .../components/KtFe10SymbolProvider.kt | 37 ++++---- .../components/KtFe10TypeCreator.kt | 11 ++- .../components/KtFe10TypeInfoProvider.kt | 5 +- .../components/KtFe10TypeProvider.kt | 15 ++- .../components/KtFe10VisibilityChecker.kt | 5 +- .../descriptors/symbols/KtFe10FileSymbol.kt | 2 +- .../KtFe10DescFunctionSymbol.kt | 2 +- .../KtFe10DescSyntheticFieldSymbol.kt | 2 +- .../KtFe10ReceiverParameterSymbol.kt | 2 +- .../descriptorBased/base/KtFe10DescSymbol.kt | 4 +- .../KtFe10PsiClassInitializerSymbol.kt | 2 +- .../psiBased/KtFe10PsiFunctionSymbol.kt | 2 +- .../symbols/psiBased/base/KtFe10PsiSymbol.kt | 2 +- .../descriptors/types/KtFe10FunctionalType.kt | 7 +- .../analysis/api/fir/KtFirAnalysisSession.kt | 17 ++-- .../analysis/api/fir/KtSymbolByFirBuilder.kt | 4 +- .../api/fir/components/KtFirCallResolver.kt | 9 +- .../KtFirCompileTimeConstantProvider.kt | 9 +- .../KtFirCompletionCandidateChecker.kt | 19 ++-- .../fir/components/KtFirDiagnosticProvider.kt | 4 +- .../components/KtFirExpressionTypeProvider.kt | 16 ++-- .../fir/components/KtFirInheritorsProvider.kt | 11 +-- .../fir/components/KtFirPsiTypeProvider.kt | 13 ++- .../api/fir/components/KtFirScopeProvider.kt | 57 +++++------ .../fir/components/KtFirSmartcastProvider.kt | 9 +- .../fir/components/KtFirSubtypingComponent.kt | 7 +- ...tFirSymbolContainingDeclarationProvider.kt | 7 +- ...KtFirSymbolDeclarationOverridesProvider.kt | 2 +- .../KtFirSymbolDeclarationRendererProvider.kt | 2 +- .../fir/components/KtFirSymbolInfoProvider.kt | 2 +- .../api/fir/components/KtFirTypeCreator.kt | 4 +- .../fir/components/KtFirTypeInfoProvider.kt | 2 +- .../api/fir/components/KtFirTypeProvider.kt | 10 +- .../fir/scopes/KtFirDelegatedMemberScope.kt | 3 +- .../api/fir/scopes/KtFirDelegatingScope.kt | 2 +- .../analysis/api/fir/scopes/KtFirFileScope.kt | 8 +- .../fir/scopes/KtFirNonStarImportingScope.kt | 2 +- .../api/fir/scopes/KtFirStarImportingScope.kt | 2 +- .../symbols/KtFirAnonymousFunctionSymbol.kt | 6 +- .../fir/symbols/KtFirAnonymousObjectSymbol.kt | 9 +- .../symbols/KtFirClassInitializerSymbol.kt | 7 +- .../api/fir/symbols/KtFirEnumEntrySymbol.kt | 4 +- .../api/fir/symbols/KtFirFileSymbol.kt | 3 +- .../api/fir/symbols/KtFirFunctionSymbol.kt | 2 +- .../api/fir/symbols/KtFirJavaFieldSymbol.kt | 2 +- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 2 +- .../fir/symbols/KtFirLocalVariableSymbol.kt | 4 +- .../symbols/KtFirNamedClassOrObjectSymbol.kt | 10 +- .../api/fir/symbols/KtFirPackageSymbol.kt | 11 ++- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 2 +- .../fir/symbols/KtFirPropertySetterSymbol.kt | 2 +- .../symbols/KtFirReceiverParameterSymbol.kt | 2 +- .../fir/symbols/KtFirSamConstructorSymbol.kt | 2 +- .../analysis/api/fir/symbols/KtFirSymbol.kt | 3 +- .../api/fir/symbols/KtFirSymbolProvider.kt | 94 ++++++++++--------- .../KtFirSyntheticJavaPropertySymbol.kt | 6 +- .../api/fir/symbols/KtFirTypeAliasSymbol.kt | 2 +- .../fir/symbols/KtFirTypeParameterSymbol.kt | 2 +- .../fir/symbols/KtFirValueParameterSymbol.kt | 2 +- .../api/fir/symbols/firSymbolUtils.kt | 6 +- .../api/fir/types/KtFirSubstitutor.kt | 2 +- ...stractOverriddenDeclarationProviderTest.kt | 3 +- .../test/cases/symbols/AbstractSymbolTest.kt | 1 + .../kotlin/analysis/api/KtAnalysisSession.kt | 1 + .../kotlin/analysis/api/KtTypeArgument.kt | 6 +- .../api/components/KtAnalysisScopeProvider.kt | 5 +- .../components/KtAnalysisSessionComponent.kt | 4 +- .../api/components/KtAnalysisSessionMixIn.kt | 3 +- .../analysis/api/components/KtCallResolver.kt | 19 ++-- .../KtCompileTimeConstantProvider.kt | 3 +- .../KtCompletionCandidateChecker.kt | 34 +++++-- .../api/components/KtDiagnosticProvider.kt | 5 +- .../components/KtExpressionInfoProvider.kt | 6 +- .../components/KtExpressionTypeProvider.kt | 13 +-- .../api/components/KtImportOptimizer.kt | 3 +- .../api/components/KtInheritorsProvider.kt | 5 +- .../api/components/KtJvmTypeMapper.kt | 3 +- .../api/components/KtOverrideInfoProvider.kt | 9 +- .../api/components/KtPsiTypeProvider.kt | 3 +- .../api/components/KtReferenceResolveMixIn.kt | 5 +- .../api/components/KtReferenceShortener.kt | 24 +++-- .../analysis/api/components/KtSamResolver.kt | 3 +- .../api/components/KtScopeProvider.kt | 48 ++++++---- .../api/components/KtSmartCastProvider.kt | 4 +- .../api/components/KtSubtypingComponent.kt | 7 +- .../KtSymbolContainingDeclarationProvider.kt | 5 +- .../KtSymbolDeclarationOverridesProvider.kt | 11 ++- .../KtSymbolDeclarationRendererProvider.kt | 5 +- .../api/components/KtSymbolInfoProvider.kt | 25 +++-- .../analysis/api/components/KtSymbolsMixIn.kt | 3 +- .../analysis/api/components/KtTypeCreator.kt | 28 ++++-- .../api/components/KtTypeInfoProvider.kt | 91 +++++++++--------- .../analysis/api/components/KtTypeProvider.kt | 33 ++++--- .../components/KtVisibilityCheckerMixIn.kt | 4 +- .../analysis/api/diagnostics/KtDiagnostic.kt | 3 +- .../analysis/api/symbols/KtClassLikeSymbol.kt | 10 +- .../api/symbols/KtFunctionLikeSymbol.kt | 14 +-- .../api/symbols/KtPropertyAccessorSymbol.kt | 4 +- .../analysis/api/symbols/KtSymbolProvider.kt | 37 ++++---- .../api/symbols/KtVariableLikeSymbol.kt | 48 +++++----- .../analysis/api/types/KtSubstitutor.kt | 2 +- .../kotlin/analysis/api/types/KtType.kt | 3 +- 116 files changed, 666 insertions(+), 555 deletions(-) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt index 0d20ad95e3c..9e81cde20d8 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.* import org.jetbrains.kotlin.analysis.api.impl.base.components.KtAnalysisScopeProviderImpl import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.getKtModule import org.jetbrains.kotlin.psi.KtElement @@ -56,7 +57,8 @@ class KtFe10AnalysisSession( override val analysisScopeProviderImpl: KtAnalysisScopeProvider = KtAnalysisScopeProviderImpl(this, token) override val referenceResolveProviderImpl: KtReferenceResolveProvider = KtFe10ReferenceResolveProvider(this) - override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession { - return KtFe10AnalysisSession(elementToReanalyze, token) - } + override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession = + withValidityAssertion { + KtFe10AnalysisSession(elementToReanalyze, token) + } } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompletionCandidateChecker.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompletionCandidateChecker.kt index 543eb0dc9f8..c7e5c5189ff 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompletionCandidateChecker.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompletionCandidateChecker.kt @@ -27,7 +27,7 @@ internal class KtFe10CompletionCandidateChecker( originalFile: KtFile, nameExpression: KtSimpleNameExpression, possibleExplicitReceiver: KtExpression? - ): KtExtensionApplicabilityResult = withValidityAssertion { + ): KtExtensionApplicabilityResult { throw NotImplementedError("Method is not implemented for FE 1.0") } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DiagnosticProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DiagnosticProvider.kt index df739f9f0f5..5602a73d6db 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DiagnosticProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10DiagnosticProvider.kt @@ -31,36 +31,32 @@ internal class KtFe10DiagnosticProvider( get() = analysisSession.token override fun getDiagnosticsForElement(element: KtElement, filter: KtDiagnosticCheckerFilter): Collection> { - withValidityAssertion { - val bindingContext = analysisContext.analyze(element, AnalysisMode.PARTIAL_WITH_DIAGNOSTICS) - val diagnostics = bindingContext.diagnostics.forElement(element) - return diagnostics.map { KtFe10Diagnostic(it, token) } - } + val bindingContext = analysisContext.analyze(element, AnalysisMode.PARTIAL_WITH_DIAGNOSTICS) + val diagnostics = bindingContext.diagnostics.forElement(element) + return diagnostics.map { KtFe10Diagnostic(it, token) } } override fun collectDiagnosticsForFile(ktFile: KtFile, filter: KtDiagnosticCheckerFilter): Collection> { - withValidityAssertion { - val bindingContext = analysisContext.analyze(ktFile) - val result = mutableListOf>() - for (diagnostic in bindingContext.diagnostics) { - if (diagnostic.psiFile == ktFile) { - result += KtFe10Diagnostic(diagnostic, token) - } + val bindingContext = analysisContext.analyze(ktFile) + val result = mutableListOf>() + for (diagnostic in bindingContext.diagnostics) { + if (diagnostic.psiFile == ktFile) { + result += KtFe10Diagnostic(diagnostic, token) } - return result } + return result } } internal class KtFe10Diagnostic(private val diagnostic: Diagnostic, override val token: KtLifetimeToken) : KtDiagnosticWithPsi { override val severity: Severity - get() = diagnostic.severity + get() = withValidityAssertion { diagnostic.severity } override val factoryName: String - get() = diagnostic.factory.name + get() = withValidityAssertion { diagnostic.factory.name } override val defaultMessage: String - get() { + get() = withValidityAssertion { @Suppress("UNCHECKED_CAST") val factory = diagnostic.factory as DiagnosticFactory? return factory?.defaultRenderer?.render(diagnostic) @@ -69,11 +65,11 @@ internal class KtFe10Diagnostic(private val diagnostic: Diagnostic, override val } override val psi: PsiElement - get() = diagnostic.psiElement + get() = withValidityAssertion { diagnostic.psiElement } override val textRanges: Collection - get() = diagnostic.textRanges + get() = withValidityAssertion { diagnostic.textRanges } override val diagnosticClass: KClass> - get() = KtFe10Diagnostic::class + get() = withValidityAssertion { KtFe10Diagnostic::class } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionInfoProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionInfoProvider.kt index 12799bde06e..213ccf67032 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionInfoProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionInfoProvider.kt @@ -27,7 +27,7 @@ internal class KtFe10ExpressionInfoProvider( override val token: KtLifetimeToken get() = analysisSession.token - override fun getReturnExpressionTargetSymbol(returnExpression: KtReturnExpression): KtCallableSymbol? = withValidityAssertion { + override fun getReturnExpressionTargetSymbol(returnExpression: KtReturnExpression): KtCallableSymbol? { val bindingContext = analysisContext.analyze(returnExpression, AnalysisMode.PARTIAL) val targetLabel = returnExpression.getTargetLabel() ?: return returnExpression.parentOfType() @@ -36,7 +36,7 @@ internal class KtFe10ExpressionInfoProvider( return with(analysisSession) { labelTarget.getSymbol() as? KtCallableSymbol } } - override fun getWhenMissingCases(whenExpression: KtWhenExpression): List = withValidityAssertion { + override fun getWhenMissingCases(whenExpression: KtWhenExpression): List { val bindingContext = analysisContext.analyze(whenExpression) return WhenChecker.getMissingCases(whenExpression, bindingContext) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt index 82eca70f04c..67803edee55 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnaly import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.lexer.KtTokens @@ -28,10 +27,10 @@ import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.calls.util.getType import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor import org.jetbrains.kotlin.resolve.sam.getFunctionTypeForAbstractMethod -import org.jetbrains.kotlin.types.error.ErrorTypeKind -import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.checker.intersectWrappedTypes +import org.jetbrains.kotlin.types.error.ErrorTypeKind +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.typeUtil.makeNullable class KtFe10ExpressionTypeProvider( @@ -49,7 +48,7 @@ class KtFe10ExpressionTypeProvider( override val token: KtLifetimeToken get() = analysisSession.token - override fun getKtExpressionType(expression: KtExpression): KtType? = withValidityAssertion { + override fun getKtExpressionType(expression: KtExpression): KtType? { // Not sure if it's safe enough. In theory, some annotations on expressions might change its type val unwrapped = expression.unwrapParenthesesLabelsAndAnnotations() as? KtExpression ?: return null if (unwrapped.getParentOfTypes(false, *NON_EXPRESSION_CONTAINERS) != null) { @@ -66,7 +65,7 @@ class KtFe10ExpressionTypeProvider( return kotlinType.toKtType(analysisContext) } - override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType = withValidityAssertion { + override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType { // Handle callable declarations with explicit return type first if (declaration is KtCallableDeclaration) { val typeReference = declaration.typeReference @@ -134,7 +133,7 @@ class KtFe10ExpressionTypeProvider( return analysisContext.builtIns.unitType.toKtType(analysisContext) } - override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType = withValidityAssertion { + override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType { val analysisMode = if (declaration.hasDeclaredReturnType()) AnalysisMode.PARTIAL else AnalysisMode.FULL val bindingContext = analysisContext.analyze(declaration, analysisMode) val functionDescriptor = bindingContext[BindingContext.FUNCTION, declaration] @@ -155,7 +154,7 @@ class KtFe10ExpressionTypeProvider( .toKtType(analysisContext) } - override fun getExpectedType(expression: PsiElement): KtType? = withValidityAssertion { + override fun getExpectedType(expression: PsiElement): KtType? { val ktExpression = expression.getParentOfType(false) ?: return null val parentExpression = ktExpression.parent @@ -222,7 +221,7 @@ class KtFe10ExpressionTypeProvider( } } - override fun isDefinitelyNull(expression: KtExpression): Boolean = withValidityAssertion { + override fun isDefinitelyNull(expression: KtExpression): Boolean { val unwrapped = expression.unwrapParenthesesLabelsAndAnnotations() as? KtElement ?: return false val bindingContext = analysisContext.analyze(expression, AnalysisMode.PARTIAL) @@ -239,7 +238,7 @@ class KtFe10ExpressionTypeProvider( return false } - override fun isDefinitelyNotNull(expression: KtExpression): Boolean = withValidityAssertion { + override fun isDefinitelyNotNull(expression: KtExpression): Boolean { val ktExpression = expression as? KtExpression ?: return false val bindingContext = analysisContext.analyze(ktExpression) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10InheritorsProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10InheritorsProvider.kt index 75ca0b75251..e6f4311e579 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10InheritorsProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10InheritorsProvider.kt @@ -36,7 +36,7 @@ internal class KtFe10InheritorsProvider( .mapNotNull { it.toKtClassifierSymbol(analysisContext) as? KtNamedClassOrObjectSymbol } } - override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List = withValidityAssertion { + override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List { val enumDescriptor = getSymbolDescriptor(classSymbol) as? ClassDescriptor ?: return emptyList() if (enumDescriptor.kind != ClassKind.ENUM_CLASS) { return emptyList() diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt index 73d04748cfc..e62007cf593 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10JvmTypeMapper.kt @@ -24,7 +24,7 @@ internal class KtFe10JvmTypeMapper( private val typeMapper by lazy { KtFe10JvmTypeMapperContext(analysisContext.resolveSession) } - override fun mapTypeToJvmType(type: KtType, mode: TypeMappingMode): Type = withValidityAssertion { + override fun mapTypeToJvmType(type: KtType, mode: TypeMappingMode): Type { val kotlinType = (type as KtFe10Type).type return typeMapper.mapType(kotlinType, mode) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10OverrideInfoProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10OverrideInfoProvider.kt index e5f8e828d31..1a43189f0ee 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10OverrideInfoProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10OverrideInfoProvider.kt @@ -28,7 +28,7 @@ internal class KtFe10OverrideInfoProvider( override val token: KtLifetimeToken get() = analysisSession.token - override fun isVisible(memberSymbol: KtCallableSymbol, classSymbol: KtClassOrObjectSymbol): Boolean = withValidityAssertion { + override fun isVisible(memberSymbol: KtCallableSymbol, classSymbol: KtClassOrObjectSymbol): Boolean { val memberDescriptor = getSymbolDescriptor(memberSymbol) as? DeclarationDescriptorWithVisibility ?: return false val classDescriptor = getSymbolDescriptor(classSymbol) ?: return false return isVisibleWithAnyReceiver(memberDescriptor, classDescriptor, analysisSession.analysisContext.languageVersionSettings) @@ -37,17 +37,17 @@ internal class KtFe10OverrideInfoProvider( override fun getImplementationStatus( memberSymbol: KtCallableSymbol, parentClassSymbol: KtClassOrObjectSymbol - ): ImplementationStatus? = withValidityAssertion { + ): ImplementationStatus? { throw NotImplementedError("Method is not implemented for FE 1.0") } - override fun getOriginalOverriddenSymbol(symbol: KtCallableSymbol): KtCallableSymbol? = withValidityAssertion { + override fun getOriginalOverriddenSymbol(symbol: KtCallableSymbol): KtCallableSymbol? { val callableDescriptor = getSymbolDescriptor(symbol) as? CallableMemberDescriptor ?: return null val originalCallableDescriptor = callableDescriptor.findOriginalTopMostOverriddenDescriptors().firstOrNull() ?: return null return originalCallableDescriptor.toKtCallableSymbol(analysisContext) } - override fun getOriginalContainingClassForOverride(symbol: KtCallableSymbol): KtClassOrObjectSymbol? = withValidityAssertion { + override fun getOriginalContainingClassForOverride(symbol: KtCallableSymbol): KtClassOrObjectSymbol? { val callableDescriptor = getSymbolDescriptor(symbol) as? CallableMemberDescriptor ?: return null val originalCallableDescriptor = callableDescriptor.findOriginalTopMostOverriddenDescriptors().firstOrNull() ?: return null val containingClassDescriptor = originalCallableDescriptor.containingDeclaration as? ClassDescriptor ?: return null diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt index 39e0e898684..08d38b6c8ef 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10JvmTypeMapperCo import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter import org.jetbrains.kotlin.load.kotlin.TypeMappingMode import org.jetbrains.kotlin.load.kotlin.getOptimalModeForReturnType @@ -41,7 +40,7 @@ internal class KtFe10PsiTypeProvider( useSitePosition: PsiElement, mode: KtTypeMappingMode, isAnnotationMethod: Boolean, - ): PsiType? = withValidityAssertion { + ): PsiType? { val kotlinType = (type as KtFe10Type).type if (kotlinType.isError || kotlinType.arguments.any { !it.isStarProjection && it.type.isError }) { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SamResolver.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SamResolver.kt index b4787cf3d9a..fdecf71b207 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SamResolver.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SamResolver.kt @@ -25,7 +25,7 @@ internal class KtFe10SamResolver( override val token: KtLifetimeToken get() = analysisSession.token - override fun getSamConstructor(ktClassLikeSymbol: KtClassLikeSymbol): KtSamConstructorSymbol? = withValidityAssertion { + override fun getSamConstructor(ktClassLikeSymbol: KtClassLikeSymbol): KtSamConstructorSymbol? { val descriptor = getSymbolDescriptor(ktClassLikeSymbol) if (descriptor is ClassDescriptor && getSingleAbstractMethodOrNull(descriptor) != null) { val constructorDescriptor = createSamConstructorFunction( diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt index 0d4ef851184..b133fb20354 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt @@ -11,7 +11,10 @@ import org.jetbrains.kotlin.analysis.api.components.KtScopeContext import org.jetbrains.kotlin.analysis.api.components.KtScopeProvider import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent -import org.jetbrains.kotlin.analysis.api.descriptors.scopes.* +import org.jetbrains.kotlin.analysis.api.descriptors.scopes.KtFe10FileScope +import org.jetbrains.kotlin.analysis.api.descriptors.scopes.KtFe10PackageScope +import org.jetbrains.kotlin.analysis.api.descriptors.scopes.KtFe10ScopeLexical +import org.jetbrains.kotlin.analysis.api.descriptors.scopes.KtFe10ScopeMember import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10FileSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol @@ -21,16 +24,16 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.bas import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type -import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtEmptyScope import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtCompositeScope -import org.jetbrains.kotlin.analysis.api.scopes.* +import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtEmptyScope +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.scopes.KtScope import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -55,21 +58,21 @@ internal class KtFe10ScopeProvider( override val token: KtLifetimeToken get() = analysisSession.token - override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion { + override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtScope { val descriptor = getDescriptor(classSymbol) ?: return getEmptyScope() return KtFe10ScopeMember(descriptor.unsubstitutedMemberScope, analysisContext) } - override fun getDeclaredMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion { + override fun getDeclaredMemberScope(classSymbol: KtSymbolWithMembers): KtScope { val descriptor = getDescriptor(classSymbol) ?: return getEmptyScope() return KtFe10ScopeMember(DeclaredMemberScope(descriptor), analysisContext) } - override fun getDelegatedMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion { + override fun getDelegatedMemberScope(classSymbol: KtSymbolWithMembers): KtScope { val descriptor = getDescriptor(classSymbol) ?: return getEmptyScope() @@ -151,21 +154,21 @@ internal class KtFe10ScopeProvider( } - override fun getStaticMemberScope(symbol: KtSymbolWithMembers): KtScope = withValidityAssertion { + override fun getStaticMemberScope(symbol: KtSymbolWithMembers): KtScope { val descriptor = getDescriptor(symbol) ?: return getEmptyScope() return KtFe10ScopeMember(descriptor.staticScope, analysisContext) } - override fun getEmptyScope(): KtScope = withValidityAssertion { - KtEmptyScope(token) + override fun getEmptyScope(): KtScope { + return KtEmptyScope(token) } - override fun getFileScope(fileSymbol: KtFileSymbol): KtScope = withValidityAssertion { + override fun getFileScope(fileSymbol: KtFileSymbol): KtScope { require(fileSymbol is KtFe10FileSymbol) return KtFe10FileScope(fileSymbol.psi, analysisContext, token) } - override fun getPackageScope(packageSymbol: KtPackageSymbol): KtScope = withValidityAssertion { + override fun getPackageScope(packageSymbol: KtPackageSymbol): KtScope { require(packageSymbol is KtFe10PackageSymbol) val packageFragments = analysisContext.resolveSession.packageFragmentProvider.packageFragments(packageSymbol.fqName) val scopeDescription = "Compound scope for package \"${packageSymbol.fqName}\"" @@ -173,28 +176,28 @@ internal class KtFe10ScopeProvider( return KtFe10PackageScope(chainedScope, packageSymbol, analysisContext) } - override fun getCompositeScope(subScopes: List): KtScope = withValidityAssertion { + override fun getCompositeScope(subScopes: List): KtScope { return KtCompositeScope(subScopes, token) } - override fun getTypeScope(type: KtType): KtScope = withValidityAssertion { + override fun getTypeScope(type: KtType): KtScope { require(type is KtFe10Type) return KtFe10ScopeMember(type.type.memberScope, analysisContext) } - override fun getScopeContextForPosition(originalFile: KtFile, positionInFakeFile: KtElement): KtScopeContext = withValidityAssertion { + override fun getScopeContextForPosition(originalFile: KtFile, positionInFakeFile: KtElement): KtScopeContext { val elementToAnalyze = positionInFakeFile.containingNonLocalDeclaration() ?: originalFile val bindingContext = analysisContext.analyze(elementToAnalyze) val lexicalScope = positionInFakeFile.getResolutionScope(bindingContext) if (lexicalScope != null) { val compositeScope = KtCompositeScope(listOf(KtFe10ScopeLexical(lexicalScope, analysisContext)), token) - return KtScopeContext(compositeScope, collectImplicitReceivers(lexicalScope)) + return KtScopeContext(compositeScope, collectImplicitReceivers(lexicalScope), token) } val fileScope = analysisContext.resolveSession.fileScopeProvider.getFileResolutionScope(originalFile) val compositeScope = KtCompositeScope(listOf(KtFe10ScopeLexical(fileScope, analysisContext)), token) - return KtScopeContext(compositeScope, collectImplicitReceivers(fileScope)) + return KtScopeContext(compositeScope, collectImplicitReceivers(fileScope), token) } private inline fun getDescriptor(symbol: KtSymbol): T? { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SmartCastProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SmartCastProvider.kt index 2c69aded943..89e4a2381df 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SmartCastProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SmartCastProvider.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnaly import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.smartcasts.ExplicitSmartCasts @@ -28,22 +27,20 @@ internal class KtFe10SmartCastProvider( get() = analysisSession.token override fun getSmartCastedInfo(expression: KtExpression): KtSmartCastInfo? { - withValidityAssertion { - val bindingContext = analysisContext.analyze(expression) - val stableSmartCasts = bindingContext[BindingContext.SMARTCAST, expression] - val unstableSmartCasts = bindingContext[BindingContext.UNSTABLE_SMARTCAST, expression] + val bindingContext = analysisContext.analyze(expression) + val stableSmartCasts = bindingContext[BindingContext.SMARTCAST, expression] + val unstableSmartCasts = bindingContext[BindingContext.UNSTABLE_SMARTCAST, expression] - return when { - stableSmartCasts != null -> { - val type = stableSmartCasts.getKtType() ?: return null - KtSmartCastInfo(type, true, token) - } - unstableSmartCasts != null -> { - val type = unstableSmartCasts.getKtType() ?: return null - KtSmartCastInfo(type, false, token) - } - else -> null + return when { + stableSmartCasts != null -> { + val type = stableSmartCasts.getKtType() ?: return null + KtSmartCastInfo(type, true, token) } + unstableSmartCasts != null -> { + val type = unstableSmartCasts.getKtType() ?: return null + KtSmartCastInfo(type, false, token) + } + else -> null } } @@ -55,13 +52,11 @@ internal class KtFe10SmartCastProvider( } override fun getImplicitReceiverSmartCast(expression: KtExpression): Collection { - withValidityAssertion { - val bindingContext = analysisContext.analyze(expression) - val smartCasts = bindingContext[BindingContext.IMPLICIT_RECEIVER_SMARTCAST, expression] ?: return emptyList() - return smartCasts.receiverTypes.map { (_, type) -> - val kind = KtImplicitReceiverSmartCastKind.DISPATCH // TODO provide precise kind - KtImplicitReceiverSmartCast(type.toKtType(analysisContext), kind, token) - } + val bindingContext = analysisContext.analyze(expression) + val smartCasts = bindingContext[BindingContext.IMPLICIT_RECEIVER_SMARTCAST, expression] ?: return emptyList() + return smartCasts.receiverTypes.map { (_, type) -> + val kind = KtImplicitReceiverSmartCastKind.DISPATCH // TODO provide precise kind + KtImplicitReceiverSmartCast(type.toKtType(analysisContext), kind, token) } } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SubtypingComponent.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SubtypingComponent.kt index 6962e470e53..ebc62dfe100 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SubtypingComponent.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SubtypingComponent.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnaly import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion internal class KtFe10SubtypingComponent( override val analysisSession: KtFe10AnalysisSession @@ -19,13 +18,13 @@ internal class KtFe10SubtypingComponent( override val token: KtLifetimeToken get() = analysisSession.token - override fun isEqualTo(first: KtType, second: KtType): Boolean = withValidityAssertion { + override fun isEqualTo(first: KtType, second: KtType): Boolean { require(first is KtFe10Type) require(second is KtFe10Type) return analysisContext.resolveSession.kotlinTypeCheckerOfOwnerModule.equalTypes(first.type, second.type) } - override fun isSubTypeOf(subType: KtType, superType: KtType): Boolean = withValidityAssertion { + override fun isSubTypeOf(subType: KtType, superType: KtType): Boolean { require(subType is KtFe10Type) require(superType is KtFe10Type) val typeChecker = analysisContext.resolveSession.kotlinTypeCheckerOfOwnerModule diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationOverridesProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationOverridesProvider.kt index 556475e9d76..a3380c1de3e 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationOverridesProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationOverridesProvider.kt @@ -10,11 +10,10 @@ import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny @@ -66,19 +65,19 @@ internal class KtFe10SymbolDeclarationOverridesProvider( return overriddenDescriptors } - override fun isSubClassOf(subClass: KtClassOrObjectSymbol, superClass: KtClassOrObjectSymbol): Boolean = withValidityAssertion { + override fun isSubClassOf(subClass: KtClassOrObjectSymbol, superClass: KtClassOrObjectSymbol): Boolean { val subClassDescriptor = getSymbolDescriptor(subClass) as? ClassDescriptor ?: return false val superClassDescriptor = getSymbolDescriptor(superClass) as? ClassDescriptor ?: return false return subClassDescriptor.isSubclassOf(superClassDescriptor) } - override fun isDirectSubClassOf(subClass: KtClassOrObjectSymbol, superClass: KtClassOrObjectSymbol): Boolean = withValidityAssertion { + override fun isDirectSubClassOf(subClass: KtClassOrObjectSymbol, superClass: KtClassOrObjectSymbol): Boolean { val subClassDescriptor = getSymbolDescriptor(subClass) as? ClassDescriptor ?: return false val superClassDescriptor = getSymbolDescriptor(superClass) as? ClassDescriptor ?: return false return subClassDescriptor.getSuperClassOrAny() == superClassDescriptor } - override fun getIntersectionOverriddenSymbols(symbol: KtCallableSymbol): Collection = withValidityAssertion { + override fun getIntersectionOverriddenSymbols(symbol: KtCallableSymbol): Collection { throw NotImplementedError("Method is not implemented for FE 1.0") } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt index c610d37303a..31e7102f8d2 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt @@ -12,9 +12,8 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.* -import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -31,11 +30,11 @@ internal class KtFe10SymbolProvider( override val ROOT_PACKAGE_SYMBOL: KtPackageSymbol get() = KtFe10PackageSymbol(FqName.ROOT, analysisContext) - override fun getFileSymbol(psi: KtFile): KtFileSymbol = withValidityAssertion { + override fun getFileSymbol(psi: KtFile): KtFileSymbol { return KtFe10FileSymbol(psi, analysisContext) } - override fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol = withValidityAssertion { + override fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol { return when { psi.isFunctionTypeParameter -> error("Function type parameters are not supported in getParameterSymbol()") psi.isLoopParameter -> KtFe10PsiLoopParameterLocalVariableSymbol(psi, analysisContext) @@ -43,7 +42,7 @@ internal class KtFe10SymbolProvider( } } - override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol = withValidityAssertion { + override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol { return if (psi.hasBody() && (psi.funKeyword == null || psi.nameIdentifier == null)) { getAnonymousFunctionSymbol(psi) } else { @@ -51,31 +50,31 @@ internal class KtFe10SymbolProvider( } } - override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion { + override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol { return KtFe10PsiConstructorSymbol(psi, analysisContext) } - override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion { + override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol { return KtFe10PsiTypeParameterSymbol(psi, analysisContext) } - override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion { + override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol { return KtFe10PsiTypeAliasSymbol(psi, analysisContext) } - override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion { + override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol { return KtFe10PsiEnumEntrySymbol(psi, analysisContext) } - override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion { + override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol { return KtFe10PsiAnonymousFunctionSymbol(psi, analysisContext) } - override fun getAnonymousFunctionSymbol(psi: KtFunctionLiteral): KtAnonymousFunctionSymbol = withValidityAssertion { + override fun getAnonymousFunctionSymbol(psi: KtFunctionLiteral): KtAnonymousFunctionSymbol { return KtFe10PsiLiteralAnonymousFunctionSymbol(psi, analysisContext) } - override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion { + override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol { return if (psi.isLocal) { KtFe10PsiLocalVariableSymbol(psi, analysisContext) } else { @@ -83,11 +82,11 @@ internal class KtFe10SymbolProvider( } } - override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion { + override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol { return KtFe10PsiAnonymousObjectSymbol(psi.objectDeclaration, analysisContext) } - override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion { + override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol { return if (psi is KtObjectDeclaration && psi.isObjectLiteral()) { KtFe10PsiAnonymousObjectSymbol(psi, analysisContext) } else { @@ -95,7 +94,7 @@ internal class KtFe10SymbolProvider( } } - override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol? = withValidityAssertion { + override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol? { if (psi is KtEnumEntry || psi.nameIdentifier == null) { return null } @@ -103,7 +102,7 @@ internal class KtFe10SymbolProvider( return KtFe10PsiNamedClassOrObjectSymbol(psi, analysisContext) } - override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion { + override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol { return if (psi.isGetter) { KtFe10PsiPropertyGetterSymbol(psi, analysisContext) } else { @@ -111,16 +110,16 @@ internal class KtFe10SymbolProvider( } } - override fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol = withValidityAssertion { + override fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol { return KtFe10PsiClassInitializerSymbol(psi, analysisContext) } - override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion { + override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? { val descriptor = analysisContext.resolveSession.moduleDescriptor.findClassAcrossModuleDependencies(classId) ?: return null return descriptor.toKtClassSymbol(analysisContext) } - override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence = withValidityAssertion { + override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence { val packageViewDescriptor = analysisContext.resolveSession.moduleDescriptor.getPackage(packageFqName) return packageViewDescriptor.memberScope.getContributedDescriptors(DescriptorKindFilter.ALL, nameFilter = { it == name }) .asSequence() diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeCreator.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeCreator.kt index ee3abaa7224..cdbc1988059 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeCreator.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeCreator.kt @@ -21,12 +21,13 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtClassType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.analysis.api.types.KtTypeParameterType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation -import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.error.ErrorType +import org.jetbrains.kotlin.types.SimpleType +import org.jetbrains.kotlin.types.StarProjectionImpl +import org.jetbrains.kotlin.types.TypeProjectionImpl +import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.error.ErrorTypeKind import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull @@ -37,7 +38,7 @@ internal class KtFe10TypeCreator( override val token: KtLifetimeToken get() = analysisSession.token - override fun buildClassType(builder: KtClassTypeBuilder): KtClassType = withValidityAssertion { + override fun buildClassType(builder: KtClassTypeBuilder): KtClassType { val descriptor: ClassDescriptor? = when (builder) { is KtClassTypeBuilder.ByClassId -> { val fqName = builder.classId.asSingleFqName() @@ -73,7 +74,7 @@ internal class KtFe10TypeCreator( return KtFe10UsualClassType(typeWithNullability as SimpleType, descriptor, analysisContext) } - override fun buildTypeParameterType(builder: KtTypeParameterTypeBuilder): KtTypeParameterType = withValidityAssertion { + override fun buildTypeParameterType(builder: KtTypeParameterTypeBuilder): KtTypeParameterType { val descriptor = when (builder) { is KtTypeParameterTypeBuilder.BySymbol -> { getSymbolDescriptor(builder.symbol) as? TypeParameterDescriptor diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeInfoProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeInfoProvider.kt index f1b270285b5..06170b0ba5c 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeInfoProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeInfoProvider.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnaly import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.builtins.getFunctionalClassKind import org.jetbrains.kotlin.load.java.sam.JavaSingleAbstractMethodUtils @@ -26,7 +25,7 @@ internal class KtFe10TypeInfoProvider( override val token: KtLifetimeToken get() = analysisSession.token - override fun isFunctionalInterfaceType(type: KtType): Boolean = withValidityAssertion { + override fun isFunctionalInterfaceType(type: KtType): Boolean { require(type is KtFe10Type) return JavaSingleAbstractMethodUtils.isSamType(type.type) } @@ -36,7 +35,7 @@ internal class KtFe10TypeInfoProvider( return type.type.constructor.declarationDescriptor?.getFunctionalClassKind() } - override fun canBeNull(type: KtType): Boolean = withValidityAssertion { + override fun canBeNull(type: KtType): Boolean { require(type is KtFe10Type) return TypeUtils.isNullableType(type.type) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeProvider.kt index 2f9e04c1148..57f8db3ffe0 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10TypeProvider.kt @@ -65,39 +65,39 @@ internal class KtFe10TypeProvider( override val token: KtLifetimeToken get() = analysisSession.token - override val builtinTypes: KtBuiltinTypes by cached { KtFe10BuiltinTypes(analysisContext) } + override val builtinTypes: KtBuiltinTypes by lazy(LazyThreadSafetyMode.PUBLICATION) { KtFe10BuiltinTypes(analysisContext) } - override fun approximateToSuperPublicDenotableType(type: KtType): KtType? = withValidityAssertion { + override fun approximateToSuperPublicDenotableType(type: KtType): KtType? { require(type is KtFe10Type) return typeApproximator.approximateToSuperType(type.type, PublicApproximatorConfiguration)?.toKtType(analysisContext) } - override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType = withValidityAssertion { + override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType { val kotlinType = (getSymbolDescriptor(symbol) as? ClassDescriptor)?.defaultType ?: ErrorUtils.createErrorType(ErrorTypeKind.UNRESOLVED_CLASS_TYPE, symbol.nameOrAnonymous.toString()) return kotlinType.toKtType(analysisContext) } - override fun commonSuperType(types: Collection): KtType = withValidityAssertion { + override fun commonSuperType(types: Collection): KtType { val kotlinTypes = types.map { (it as KtFe10Type).type } return CommonSupertypes.commonSupertype(kotlinTypes).toKtType(analysisContext) } - override fun getKtType(ktTypeReference: KtTypeReference): KtType = withValidityAssertion { + override fun getKtType(ktTypeReference: KtTypeReference): KtType { val bindingContext = analysisContext.analyze(ktTypeReference, AnalysisMode.PARTIAL) val kotlinType = bindingContext[BindingContext.TYPE, ktTypeReference] ?: ErrorUtils.createErrorType(ErrorTypeKind.UNRESOLVED_TYPE, ktTypeReference.text) return kotlinType.toKtType(analysisContext) } - override fun getReceiverTypeForDoubleColonExpression(expression: KtDoubleColonExpression): KtType? = withValidityAssertion { + override fun getReceiverTypeForDoubleColonExpression(expression: KtDoubleColonExpression): KtType? { val bindingContext = analysisContext.analyze(expression, AnalysisMode.PARTIAL) val lhs = bindingContext[BindingContext.DOUBLE_COLON_LHS, expression] ?: return null return lhs.type.toKtType(analysisContext) } - override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType = withValidityAssertion { + override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType { require(type is KtFe10Type) return type.type.makeNullableAsSpecified(newNullability == KtTypeNullability.NULLABLE).toKtType(analysisContext) } @@ -125,7 +125,6 @@ internal class KtFe10TypeProvider( } override fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType? { - assertIsValidAndAccessible() require(symbol is KtFe10Symbol) val descriptor = when (symbol) { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10VisibilityChecker.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10VisibilityChecker.kt index b7943757f52..7d148c132b4 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10VisibilityChecker.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10VisibilityChecker.kt @@ -12,10 +12,9 @@ import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisible import org.jetbrains.kotlin.descriptors.Visibilities @@ -39,7 +38,7 @@ internal class KtFe10VisibilityChecker( useSiteFile: KtFileSymbol, position: PsiElement, receiverExpression: KtExpression? - ): Boolean = withValidityAssertion { + ): Boolean { if (candidateSymbol.visibility == Visibilities.Public) { return true } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/KtFe10FileSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/KtFe10FileSymbol.kt index c5d3e35f516..3806cbc3e7e 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/KtFe10FileSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/KtFe10FileSymbol.kt @@ -25,7 +25,7 @@ internal class KtFe10FileSymbol( get() = withValidityAssertion { file } override val annotationsObject: Annotations - get() = analysisContext.resolveSession.getFileAnnotations(file) + get() = withValidityAssertion { analysisContext.resolveSession.getFileAnnotations(file) } override val origin: KtSymbolOrigin get() = withValidityAssertion { if (file.isCompiled) KtSymbolOrigin.LIBRARY else KtSymbolOrigin.SOURCE } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt index 1d73f808ef2..2d760891088 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt @@ -58,7 +58,7 @@ internal class KtFe10DescFunctionSymbol private constructor( get() = withValidityAssertion { descriptor is JavaCallableMemberDescriptor && DescriptorUtils.isStaticDeclaration(descriptor) } override val isBuiltinFunctionInvoke: Boolean - get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds + get() = withValidityAssertion { callableIdIfNonLocal in kotlinFunctionInvokeCallableIds } override val valueParameters: List get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisContext) } } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticFieldSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticFieldSymbol.kt index 41a09d54afa..d8a8d44dc8c 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticFieldSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticFieldSymbol.kt @@ -38,7 +38,7 @@ internal class KtFe10DescSyntheticFieldSymbol( } override val annotationsObject: Annotations - get() = descriptor.annotations + get() = withValidityAssertion { descriptor.annotations } override val returnType: KtType get() = withValidityAssertion { descriptor.propertyDescriptor.type.toKtType(analysisContext) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt index 0cab594a1fc..eac2045f9b3 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt @@ -25,7 +25,7 @@ class KtFe10ReceiverParameterSymbol( override val descriptor: ReceiverParameterDescriptor get() = withValidityAssertion { _descriptor } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { TODO("Not yet implemented") } } \ No newline at end of file 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 b142e039aa2..0bc78d57039 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 @@ -21,10 +21,10 @@ internal interface KtFe10DescSymbol : KtFe10Symbol, K val descriptor: T override val annotationsObject: Annotations - get() = descriptor.annotations + get() = withValidityAssertion { descriptor.annotations } val source: SourceElement - get() { + get() = withValidityAssertion { val descriptor = this.descriptor if (descriptor is CallableMemberDescriptor && descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { val firstOverridden = descriptor.overriddenDescriptors.firstOrNull() diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiClassInitializerSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiClassInitializerSymbol.kt index f17aa24d9c8..2736f860540 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiClassInitializerSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiClassInitializerSymbol.kt @@ -33,7 +33,7 @@ class KtFe10PsiClassInitializerSymbol( override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.CLASS_MEMBER } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt index dc4dc845e79..f5d8a66f5c2 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt @@ -64,7 +64,7 @@ internal class KtFe10PsiFunctionSymbol( get() = withValidityAssertion { false } override val isBuiltinFunctionInvoke: Boolean - get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds + get() = withValidityAssertion { callableIdIfNonLocal in kotlinFunctionInvokeCallableIds } override val valueParameters: List get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisContext) } } 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 9e94e9b01f8..171cbde7414 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 @@ -18,7 +18,7 @@ internal interface KtFe10PsiSymbol

: K val descriptor: D? override val annotationsObject: Annotations - get() = descriptor?.annotations ?: Annotations.EMPTY + get() = withValidityAssertion { descriptor?.annotations ?: Annotations.EMPTY } override val origin: KtSymbolOrigin get() = withValidityAssertion { psi.ktSymbolOrigin } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt index 762f8b7eb21..813d49cfa7b 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt @@ -55,7 +55,12 @@ internal class KtFe10FunctionalType( get() = withValidityAssertion { type.getReturnTypeFromFunctionType().toKtType(analysisContext) } override val classId: ClassId - get() = ClassId(descriptor.functionKind.packageFqName, descriptor.functionKind.numberedClassName(descriptor.arity)) + get() = withValidityAssertion { + ClassId( + descriptor.functionKind.packageFqName, + descriptor.functionKind.numberedClassName(descriptor.arity) + ) + } override val classSymbol: KtClassLikeSymbol get() = withValidityAssertion { KtFe10DescNamedClassOrObjectSymbol(descriptor, analysisContext) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt index c5295c56f13..38c2d0169da 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbolProvider import org.jetbrains.kotlin.analysis.api.fir.utils.threadLocal import org.jetbrains.kotlin.analysis.api.impl.base.components.KtAnalysisScopeProviderImpl import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir import org.jetbrains.kotlin.analysis.project.structure.KtModule @@ -25,7 +26,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile - +@Suppress("AnalysisApiMissingLifetimeCheck") internal class KtFirAnalysisSession private constructor( private val project: Project, @@ -35,6 +36,7 @@ private constructor( private val mode: AnalysisSessionMode, ) : KtAnalysisSession(token) { + @Suppress("AnalysisApiMissingLifetimeCheck") override val useSiteModule: KtModule get() = firResolveSession.useSiteKtModule private enum class AnalysisSessionMode { @@ -54,10 +56,10 @@ private constructor( override val samResolverImpl = KtFirSamResolver(this, token) - override val scopeProviderImpl by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveSession, token) } + override val scopeProviderImpl by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveSession) } override val symbolProviderImpl = - KtFirSymbolProvider(this, firResolveSession.useSiteFirSession.symbolProvider, firResolveSession, firSymbolBuilder, token) + KtFirSymbolProvider(this, firResolveSession.useSiteFirSession.symbolProvider, firResolveSession, firSymbolBuilder) override val completionCandidateCheckerImpl = KtFirCompletionCandidateChecker(this, token) @@ -99,6 +101,7 @@ private constructor( override val referenceResolveProviderImpl: KtReferenceResolveProvider = KtFirReferenceResolveProvider(this) + @Suppress("AnalysisApiMissingLifetimeCheck") override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession { check(mode == AnalysisSessionMode.REGULAR) { "Cannot create context-dependent copy of KtAnalysis session from a context dependent one" @@ -120,11 +123,11 @@ private constructor( ) } - val useSiteSession: FirSession get() = firResolveSession.useSiteFirSession - val firSymbolProvider: FirSymbolProvider get() = useSiteSession.symbolProvider - val targetPlatform: TargetPlatform get() = useSiteSession.moduleData.platform + internal val useSiteSession: FirSession get() = firResolveSession.useSiteFirSession + internal val firSymbolProvider: FirSymbolProvider get() = useSiteSession.symbolProvider + internal val targetPlatform: TargetPlatform get() = useSiteSession.moduleData.platform - fun getScopeSessionFor(session: FirSession): ScopeSession = firResolveSession.getScopeSessionFor(session) + fun getScopeSessionFor(session: FirSession): ScopeSession = withValidityAssertion { firResolveSession.getScopeSessionFor(session) } companion object { internal fun createAnalysisSessionByFirResolveSession( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index 136de243973..1e1a2502395 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -55,13 +55,13 @@ import kotlin.contracts.contract internal class KtSymbolByFirBuilder private constructor( private val project: Project, private val firResolveSession: LLFirResolveSession, - override val token: KtLifetimeToken, + val token: KtLifetimeToken, val withReadOnlyCaching: Boolean, private val symbolsCache: BuilderCache, KtSymbol>, private val extensionReceiverSymbolsCache: BuilderCache, KtSymbol>, private val filesCache: BuilderCache, private val backingFieldCache: BuilderCache, -) : KtLifetimeOwner { +) { private val firProvider get() = firResolveSession.useSiteFirSession.symbolProvider val rootSession: FirSession = firResolveSession.useSiteFirSession diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt index 876b08f86a0..3a4d6017579 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt @@ -16,10 +16,9 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider. import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFunctionSymbol import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtCallResolver -import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.AllCandidatesResolver import org.jetbrains.kotlin.fir.FirElement @@ -75,7 +74,7 @@ internal class KtFirCallResolver( result } - override fun resolveCall(psi: KtElement): KtCallInfo? = withValidityAssertion { + override fun resolveCall(psi: KtElement): KtCallInfo? { val ktCallInfos = getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> listOfNotNull( toKtCallInfo( @@ -703,8 +702,8 @@ internal class KtFirCallResolver( private fun FirVariableSymbol<*>.toKtSignature(): KtVariableLikeSignature = firSymbolBuilder.variableLikeBuilder.buildVariableLikeSignature(this) - override fun collectCallCandidates(psi: KtElement): List = withValidityAssertion { - getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> + override fun collectCallCandidates(psi: KtElement): List { + return getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> collectCallCandidates( psiToResolve, resolveCalleeExpressionOfFunctionCall, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt index b1e289ff4cf..0b4aa6d28a2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError import org.jetbrains.kotlin.fir.FirElement @@ -29,16 +28,16 @@ internal class KtFirCompileTimeConstantProvider( override fun evaluate( expression: KtExpression, mode: KtConstantEvaluationMode, - ): KtConstantValue? = withValidityAssertion { - evaluateFir(expression.getOrBuildFir(firResolveSession), expression, mode) + ): KtConstantValue? { + return evaluateFir(expression.getOrBuildFir(firResolveSession), expression, mode) } private fun evaluateFir( fir: FirElement?, sourcePsi: KtExpression, mode: KtConstantEvaluationMode, - ): KtConstantValue? = withValidityAssertion { - when (fir) { + ): KtConstantValue? { + return when (fir) { is FirPropertyAccessExpression, is FirExpression, is FirNamedReference -> { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt index dbee942043b..53970100cb0 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt @@ -9,11 +9,9 @@ import org.jetbrains.kotlin.analysis.api.components.KtCompletionCandidateChecker import org.jetbrains.kotlin.analysis.api.components.KtExtensionApplicabilityResult import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol -import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef -import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.ResolutionParameters @@ -36,22 +34,19 @@ import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver internal class KtFirCompletionCandidateChecker( - analysisSession: KtFirAnalysisSession, + override val analysisSession: KtFirAnalysisSession, override val token: KtLifetimeToken, ) : KtCompletionCandidateChecker(), KtFirAnalysisSessionComponent { - override val analysisSession: KtFirAnalysisSession by weakRef(analysisSession) - override fun checkExtensionFitsCandidate( firSymbolForCandidate: KtCallableSymbol, originalFile: KtFile, nameExpression: KtSimpleNameExpression, possibleExplicitReceiver: KtExpression?, - ): KtExtensionApplicabilityResult = withValidityAssertion { + ): KtExtensionApplicabilityResult { require(firSymbolForCandidate is KtFirSymbol<*>) firSymbolForCandidate.firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) val declaration = firSymbolForCandidate.firSymbol.fir as FirCallableDeclaration - checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver) - + return checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver) } private fun checkExtension( @@ -75,15 +70,15 @@ internal class KtFirCompletionCandidateChecker( val substitutor = it.createSubstitutorFromTypeArguments() ?: return@let null return when { candidateSymbol is FirVariable && candidateSymbol.returnTypeRef.coneType.receiverType(rootModuleSession) != null -> { - KtExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall(substitutor) + KtExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall(substitutor, token) } else -> { - KtExtensionApplicabilityResult.ApplicableAsExtensionCallable(substitutor) + KtExtensionApplicabilityResult.ApplicableAsExtensionCallable(substitutor, token) } } } } - return KtExtensionApplicabilityResult.NonApplicable(KtSubstitutor.Empty(token)) + return KtExtensionApplicabilityResult.NonApplicable(KtSubstitutor.Empty(token), token) } private fun getImplicitReceivers( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDiagnosticProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDiagnosticProvider.kt index 685b5085395..12ef71f643d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDiagnosticProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirDiagnosticProvider.kt @@ -25,8 +25,8 @@ internal class KtFirDiagnosticProvider( override fun getDiagnosticsForElement( element: KtElement, filter: KtDiagnosticCheckerFilter - ): Collection> = withValidityAssertion { - element.getDiagnostics(firResolveSession, filter.asLLFilter()).map { it.asKtDiagnostic() } + ): Collection> { + return element.getDiagnostics(firResolveSession, filter.asLLFilter()).map { it.asKtDiagnostic() } } override fun collectDiagnosticsForFile(ktFile: KtFile, filter: KtDiagnosticCheckerFilter): Collection> = diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index 96063799a76..6a4f0b776dd 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt @@ -11,8 +11,8 @@ import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.utils.getReferencedElementType import org.jetbrains.kotlin.analysis.api.fir.utils.unwrap import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe @@ -37,8 +37,8 @@ internal class KtFirExpressionTypeProvider( override val token: KtLifetimeToken, ) : KtExpressionTypeProvider(), KtFirAnalysisSessionComponent { - override fun getKtExpressionType(expression: KtExpression): KtType? = withValidityAssertion { - when (val fir = expression.unwrap().getOrBuildFir(firResolveSession)) { + override fun getKtExpressionType(expression: KtExpression): KtType? { + return when (val fir = expression.unwrap().getOrBuildFir(firResolveSession)) { is FirFunctionCall -> { getReturnTypeForArrayStyleAssignmentTarget(expression, fir) ?: fir.typeRef.coneType.asKtType() @@ -94,14 +94,14 @@ internal class KtFirExpressionTypeProvider( return setTargetArgumentParameter.returnTypeRef.coneType.asKtType() } - override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType = withValidityAssertion { + override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType { val firDeclaration = declaration.getOrBuildFirOfType(firResolveSession) - firDeclaration.returnTypeRef.coneType.asKtType() + return firDeclaration.returnTypeRef.coneType.asKtType() } - override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType = withValidityAssertion { + override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType { val firFunction = declaration.getOrBuildFirOfType(firResolveSession) - firFunction.constructFunctionalType(firFunction.isSuspend).asKtType() + return firFunction.constructFunctionalType(firFunction.isSuspend).asKtType() } override fun getExpectedType(expression: PsiElement): KtType? { @@ -224,7 +224,7 @@ internal class KtFirExpressionTypeProvider( override fun isDefinitelyNotNull(expression: KtExpression): Boolean = getDefiniteNullability(expression) == DefiniteNullability.DEFINITELY_NOT_NULL - private fun getDefiniteNullability(expression: KtExpression): DefiniteNullability = withValidityAssertion { + private fun getDefiniteNullability(expression: KtExpression): DefiniteNullability { fun FirExpression.isNotNullable() = with(analysisSession.useSiteSession.typeContext) { !typeRef.coneType.isNullableType() } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt index 718ceba89ed..517461d5df3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt @@ -8,11 +8,10 @@ package org.jetbrains.kotlin.analysis.api.fir.components import org.jetbrains.kotlin.analysis.api.components.KtInheritorsProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.declarations.getSealedClassInheritors @@ -22,20 +21,20 @@ internal class KtFirInheritorsProvider( ) : KtInheritorsProvider(), KtFirAnalysisSessionComponent { override fun getInheritorsOfSealedClass( classSymbol: KtNamedClassOrObjectSymbol - ): List = withValidityAssertion { + ): List { require(classSymbol.modality == Modality.SEALED) require(classSymbol is KtFirNamedClassOrObjectSymbol) val inheritorClassIds = classSymbol.firSymbol.fir.getSealedClassInheritors(analysisSession.useSiteSession) - with(analysisSession) { + return with(analysisSession) { inheritorClassIds.mapNotNull { it.getCorrespondingToplevelClassOrObjectSymbol() as? KtNamedClassOrObjectSymbol } } } - override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List = withValidityAssertion { + override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List { require(classSymbol.classKind == KtClassKind.ENUM_CLASS) - with(analysisSession) { + return with(analysisSession) { classSymbol.getDeclaredMemberScope().getCallableSymbols().filterIsInstance().toList() } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt index 48cb17fbfd3..a7b4aad9764 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt @@ -53,13 +53,12 @@ internal class KtFirPsiTypeProvider( useSitePosition: PsiElement, mode: KtTypeMappingMode, isAnnotationMethod: Boolean, - ): PsiType? = withValidityAssertion { - type.coneType.asPsiType( - rootModuleSession, - mode.toTypeMappingMode(type, isAnnotationMethod), - useSitePosition - ) - } + ): PsiType? = type.coneType.asPsiType( + rootModuleSession, + mode.toTypeMappingMode(type, isAnnotationMethod), + useSitePosition + ) + private fun KtTypeMappingMode.toTypeMappingMode(type: KtType, isAnnotationMethod: Boolean): TypeMappingMode { require(type is KtFirType) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt index 174bb815308..ce8a0bfac4c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt @@ -46,20 +46,14 @@ import org.jetbrains.kotlin.psi.KtFile import java.util.* internal class KtFirScopeProvider( - analysisSession: KtFirAnalysisSession, - builder: KtSymbolByFirBuilder, + override val analysisSession: KtFirAnalysisSession, + private val builder: KtSymbolByFirBuilder, private val project: Project, - firResolveSession: LLFirResolveSession, - override val token: KtLifetimeToken, -) : KtScopeProvider(), KtLifetimeOwner { + private val firResolveSession: LLFirResolveSession, +) : KtScopeProvider() { // KtFirScopeProvider is thread local, so it's okay to use the same session here private val scopeSession = analysisSession.getScopeSessionFor(analysisSession.useSiteSession) - - override val analysisSession: KtFirAnalysisSession by weakRef(analysisSession) - private val builder by weakRef(builder) - private val firResolveSession by weakRef(firResolveSession) - private val memberScopeCache = IdentityHashMap() private val declaredMemberScopeCache = IdentityHashMap() private val delegatedMemberScopeCache = IdentityHashMap() @@ -67,27 +61,27 @@ internal class KtFirScopeProvider( private val packageMemberScopeCache = IdentityHashMap() private inline fun KtSymbolWithMembers.withFirForScope(crossinline body: (FirClass) -> T): T? { - when (this) { + return when (this) { is KtFirNamedClassOrObjectSymbol -> { firSymbol.ensureResolved(FirResolvePhase.TYPES) - return body(firSymbol.fir) + body(firSymbol.fir) } is KtFirAnonymousObjectSymbol -> { firSymbol.ensureResolved(FirResolvePhase.TYPES) - return body(firSymbol.fir) + body(firSymbol.fir) } is KtFirEnumEntrySymbol -> { firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) val initializer = firSymbol.fir.initializer check(initializer is FirAnonymousObjectExpression) { "Unexpected enum entry initializer: ${initializer?.javaClass}" } - return body(initializer.anonymousObject) + body(initializer.anonymousObject) } else -> error { "Unknown KtSymbolWithDeclarations implementation ${this::class.qualifiedName}" } } } - override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion { - memberScopeCache.getOrPut(classSymbol) { + override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtScope { + return memberScopeCache.getOrPut(classSymbol) { val firScope = classSymbol.withFirForScope { fir -> val firSession = analysisSession.useSiteSession fir.unsubstitutedScope( @@ -113,8 +107,8 @@ internal class KtFirScopeProvider( return KtFirDelegatingScope(firScope, builder, token) } - override fun getDeclaredMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion { - declaredMemberScopeCache.getOrPut(classSymbol) { + override fun getDeclaredMemberScope(classSymbol: KtSymbolWithMembers): KtScope { + return declaredMemberScopeCache.getOrPut(classSymbol) { val firScope = classSymbol.withFirForScope { analysisSession.useSiteSession.declaredMemberScope(it) } ?: return@getOrPut getEmptyScope() @@ -123,10 +117,10 @@ internal class KtFirScopeProvider( } } - override fun getDelegatedMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion { + override fun getDelegatedMemberScope(classSymbol: KtSymbolWithMembers): KtScope { val declaredScope = (getDeclaredMemberScope(classSymbol) as? KtFirDelegatingScope)?.firScope ?: return delegatedMemberScopeCache.getOrPut(classSymbol) { getEmptyScope() } - delegatedMemberScopeCache.getOrPut(classSymbol) { + return delegatedMemberScopeCache.getOrPut(classSymbol) { val firScope = classSymbol.withFirForScope { fir -> val delegateFields = fir.delegateFields if (delegateFields.isNotEmpty()) { @@ -145,19 +139,19 @@ internal class KtFirScopeProvider( } } - override fun getFileScope(fileSymbol: KtFileSymbol): KtScope = withValidityAssertion { - fileScopeCache.getOrPut(fileSymbol) { + override fun getFileScope(fileSymbol: KtFileSymbol): KtScope { + return fileScopeCache.getOrPut(fileSymbol) { check(fileSymbol is KtFirFileSymbol) { "KtFirScopeProvider can only work with KtFirFileSymbol, but ${fileSymbol::class} was provided" } KtFirFileScope(fileSymbol, token, builder) } } - override fun getEmptyScope(): KtScope = withValidityAssertion { - KtEmptyScope(token) + override fun getEmptyScope(): KtScope { + return KtEmptyScope(token) } - override fun getPackageScope(packageSymbol: KtPackageSymbol): KtScope = withValidityAssertion { - packageMemberScopeCache.getOrPut(packageSymbol) { + override fun getPackageScope(packageSymbol: KtPackageSymbol): KtScope { + return packageMemberScopeCache.getOrPut(packageSymbol) { KtFirPackageScope( packageSymbol.fqName, project, @@ -170,8 +164,8 @@ internal class KtFirScopeProvider( } - override fun getCompositeScope(subScopes: List): KtScope = withValidityAssertion { - KtCompositeScope(subScopes, token) + override fun getCompositeScope(subScopes: List): KtScope { + return KtCompositeScope(subScopes, token) } override fun getTypeScope(type: KtType): KtScope? { @@ -196,7 +190,7 @@ internal class KtFirScopeProvider( override fun getScopeContextForPosition( originalFile: KtFile, positionInFakeFile: KtElement - ): KtScopeContext = withValidityAssertion { + ): KtScopeContext { val towerDataContext = analysisSession.firResolveSession.getTowerContextProvider(originalFile).getClosestAvailableParentContext(positionInFakeFile) ?: error("Cannot find enclosing declaration for ${positionInFakeFile.getElementTextInContext()}") @@ -221,9 +215,10 @@ internal class KtFirScopeProvider( firLocalScopes.mapTo(this, ::convertToKtScope) } - KtScopeContext( + return KtScopeContext( getCompositeScope(allKtScopes.asReversed()), - implicitKtReceivers.asReversed() + implicitKtReceivers.asReversed(), + token ) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt index ed6de977549..43db18f2362 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.api.components.KtSmartCastInfo import org.jetbrains.kotlin.analysis.api.components.KtSmartCastProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall @@ -59,9 +58,9 @@ internal class KtFirSmartcastProvider( } } - override fun getSmartCastedInfo(expression: KtExpression): KtSmartCastInfo? = withValidityAssertion { + override fun getSmartCastedInfo(expression: KtExpression): KtSmartCastInfo? { val firSmartCastExpression = getMatchingFirExpressionWithSmartCast(expression) ?: return null - getSmartCastedInfo(firSmartCastExpression) + return getSmartCastedInfo(firSmartCastExpression) } private fun getSmartCastedInfo(expression: FirExpressionWithSmartcast): KtSmartCastInfo? { @@ -87,10 +86,10 @@ internal class KtFirSmartcastProvider( } } - override fun getImplicitReceiverSmartCast(expression: KtExpression): Collection = withValidityAssertion { + override fun getImplicitReceiverSmartCast(expression: KtExpression): Collection { val firQualifiedExpression = getMatchingFirQualifiedAccessExpression(expression) ?: return emptyList() - listOfNotNull( + return listOfNotNull( smartCastedImplicitReceiver(firQualifiedExpression, KtImplicitReceiverSmartCastKind.DISPATCH), smartCastedImplicitReceiver(firQualifiedExpression, KtImplicitReceiverSmartCastKind.EXTENSION), ) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSubtypingComponent.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSubtypingComponent.kt index 1d609a0e250..11f0b7eb993 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSubtypingComponent.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSubtypingComponent.kt @@ -5,20 +5,19 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.components.KtSubtypingComponent import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.types.KtFirType +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.assertIsValidAndAccessible import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.types.AbstractTypeChecker internal class KtFirSubtypingComponent( override val analysisSession: KtFirAnalysisSession, override val token: KtLifetimeToken, ) : KtSubtypingComponent(), KtFirAnalysisSessionComponent { - override fun isEqualTo(first: KtType, second: KtType): Boolean = withValidityAssertion { + override fun isEqualTo(first: KtType, second: KtType): Boolean { second.assertIsValidAndAccessible() check(first is KtFirType) check(second is KtFirType) @@ -29,7 +28,7 @@ internal class KtFirSubtypingComponent( ) } - override fun isSubTypeOf(subType: KtType, superType: KtType): Boolean = withValidityAssertion { + override fun isSubTypeOf(subType: KtType, superType: KtType): Boolean { superType.assertIsValidAndAccessible() check(subType is KtFirType) check(superType is KtFirType) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index 36c38fcdd03..66c665d8e35 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -26,12 +26,9 @@ import org.jetbrains.kotlin.psi.* internal class KtFirSymbolContainingDeclarationProvider( override val analysisSession: KtFirAnalysisSession, - override val token: KtLifetimeToken, + override val token: KtLifetimeToken ) : KtSymbolContainingDeclarationProvider(), KtFirAnalysisSessionComponent { - override fun getContainingDeclaration(symbol: KtSymbol): KtSymbolWithKind? { - assertIsValidAndAccessible() - - if (symbol is KtReceiverParameterSymbol) { + override fun getContainingDeclaration(symbol: KtSymbol): KtSymbolWithKind? { if (symbol is KtReceiverParameterSymbol) { return firSymbolBuilder.buildSymbol((symbol as KtFirReceiverParameterSymbol).firSymbol) as KtSymbolWithKind } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt index 687a4e99c85..0405602c392 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.fir.types.toRegularClassSymbol internal class KtFirSymbolDeclarationOverridesProvider( override val analysisSession: KtFirAnalysisSession, - override val token: KtLifetimeToken, + override val token: KtLifetimeToken ) : KtSymbolDeclarationOverridesProvider(), KtFirAnalysisSessionComponent { override fun getAllOverriddenSymbols( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt index 4f0d82b08cc..3b150fa0530 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.symbols.ensureResolved internal class KtFirSymbolDeclarationRendererProvider( override val analysisSession: KtFirAnalysisSession, - override val token: KtLifetimeToken, + override val token: KtLifetimeToken ) : KtSymbolDeclarationRendererProvider() { override fun render(type: KtType, options: KtTypeRendererOptions): String { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt index 723f2c3a721..c95836082a6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo internal class KtFirSymbolInfoProvider( override val analysisSession: KtFirAnalysisSession, - override val token: KtLifetimeToken, + override val token: KtLifetimeToken ) : KtSymbolInfoProvider(), KtFirAnalysisSessionComponent { override fun getDeprecation(symbol: KtSymbol): DeprecationInfo? { if (symbol is KtFirBackingFieldSymbol || symbol is KtFirPackageSymbol) return null diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt index b97febe27be..ff197c4a031 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt @@ -29,7 +29,7 @@ internal class KtFirTypeCreator( override val token: KtLifetimeToken ) : KtTypeCreator(), KtFirAnalysisSessionComponent { - override fun buildClassType(builder: KtClassTypeBuilder): KtClassType = withValidityAssertion { + override fun buildClassType(builder: KtClassTypeBuilder): KtClassType { val lookupTag = when (builder) { is KtClassTypeBuilder.ByClassId -> { val classSymbol = rootModuleSession.symbolProvider.getClassLikeSymbolByClassId(builder.classId) @@ -53,7 +53,7 @@ internal class KtFirTypeCreator( return coneType.asKtType() as KtClassType } - override fun buildTypeParameterType(builder: KtTypeParameterTypeBuilder): KtTypeParameterType = withValidityAssertion { + override fun buildTypeParameterType(builder: KtTypeParameterTypeBuilder): KtTypeParameterType { val coneType = when (builder) { is KtTypeParameterTypeBuilder.BySymbol -> { val symbol = builder.symbol diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt index 3a18bbf16d5..cae7d47d819 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.types.typeApproximator internal class KtFirTypeInfoProvider( override val analysisSession: KtFirAnalysisSession, - override val token: KtLifetimeToken, + override val token: KtLifetimeToken ) : KtTypeInfoProvider(), KtFirAnalysisSessionComponent { override fun isFunctionalInterfaceType(type: KtType): Boolean { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index b3755864979..e6b8882a57a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -50,7 +50,7 @@ import org.jetbrains.kotlin.util.bfs internal class KtFirTypeProvider( override val analysisSession: KtFirAnalysisSession, - override val token: KtLifetimeToken, + override val token: KtLifetimeToken ) : KtTypeProvider(), KtFirAnalysisSessionComponent { override val builtinTypes: KtBuiltinTypes = KtFirBuiltInTypes(rootModuleSession.builtinTypes, firSymbolBuilder, token) @@ -85,16 +85,16 @@ internal class KtFirTypeProvider( ?.asKtType() } - override fun getKtType(ktTypeReference: KtTypeReference): KtType = withValidityAssertion { - when (val fir = ktTypeReference.getOrBuildFir(firResolveSession)) { + override fun getKtType(ktTypeReference: KtTypeReference): KtType { + return when (val fir = ktTypeReference.getOrBuildFir(firResolveSession)) { is FirResolvedTypeRef -> fir.coneType.asKtType() is FirDelegatedConstructorCall -> fir.constructedTypeRef.coneType.asKtType() else -> throwUnexpectedFirElementError(fir, ktTypeReference) } } - override fun getReceiverTypeForDoubleColonExpression(expression: KtDoubleColonExpression): KtType? = withValidityAssertion { - when (val fir = expression.getOrBuildFir(firResolveSession)) { + override fun getReceiverTypeForDoubleColonExpression(expression: KtDoubleColonExpression): KtType? { + return when (val fir = expression.getOrBuildFir(firResolveSession)) { is FirGetClassCall -> fir.typeRef.coneType.getReceiverOfReflectionType()?.asKtType() is FirCallableReferenceAccess -> diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatedMemberScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatedMemberScope.kt index 28ee947ff35..c7cd95bb303 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatedMemberScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatedMemberScope.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.scopes.KtScopeNameFilter import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope internal class KtFirDelegatedMemberScope( @@ -18,7 +19,7 @@ internal class KtFirDelegatedMemberScope( builder: KtSymbolByFirBuilder ) : KtFirDelegatingScope(firScope, builder, token) { - override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence { + override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { return super.getCallableSymbols(nameFilter).filter { it.origin == KtSymbolOrigin.DELEGATED } } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt index 3ee15909b78..cf1fd1e5c1a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt @@ -31,7 +31,7 @@ internal open class KtFirDelegatingScope( getPossibleCallableNames() + getPossibleClassifierNames() } - override fun getAllPossibleNames(): Set = allNamesCached + override fun getAllPossibleNames(): Set = withValidityAssertion { withValidityAssertion { allNamesCached } } override fun getPossibleCallableNames(): Set = withValidityAssertion { firScope.getCallableNames() diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt index 282e4973000..dfe1aecdf36 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt @@ -32,7 +32,7 @@ internal class KtFirFileScope( _callableNames + _classifierNames } - override fun getAllPossibleNames(): Set = allNamesCached + override fun getAllPossibleNames(): Set = withValidityAssertion { allNamesCached } private val _callableNames: Set by cached { val result = mutableSetOf() @@ -48,7 +48,7 @@ internal class KtFirFileScope( result } - override fun getPossibleCallableNames(): Set = _callableNames + override fun getPossibleCallableNames(): Set = withValidityAssertion { _callableNames } private val _classifierNames: Set by cached { val result = mutableSetOf() @@ -60,7 +60,7 @@ internal class KtFirFileScope( result } - override fun getPossibleClassifierNames(): Set = _classifierNames + override fun getPossibleClassifierNames(): Set = withValidityAssertion { _classifierNames } override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { sequence { @@ -94,7 +94,7 @@ internal class KtFirFileScope( } - override fun getConstructors(): Sequence = emptySequence() + override fun getConstructors(): Sequence = withValidityAssertion { emptySequence() } override fun getPackageSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { emptySequence() diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt index 7e5738a0d08..c74b74a4ee9 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt @@ -57,7 +57,7 @@ internal class KtFirNonStarImportingScope( emptySequence() } - override fun getConstructors(): Sequence = emptySequence() + override fun getConstructors(): Sequence = withValidityAssertion { emptySequence() } override fun getPossibleCallableNames(): Set = withValidityAssertion { imports.mapNotNullTo(hashSetOf()) { it.callableName } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt index 14ccf63c777..f42cb5d327b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirStarImportingScope.kt @@ -48,7 +48,7 @@ internal class KtFirStarImportingScope( firScope.getClassifierSymbols(getPossibleClassifierNames().filter(nameFilter), builder) } - override fun getConstructors(): Sequence = emptySequence() + override fun getConstructors(): Sequence = withValidityAssertion { emptySequence() } // todo cache? @OptIn(ExperimentalStdlibApi::class) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt index 9a1334730c7..0a4b6f1341c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt @@ -11,13 +11,13 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol @@ -49,7 +49,7 @@ internal class KtFirAnonymousFunctionSymbol( override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } error("Could not create a pointer for anonymous function from library") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt index 772f6d66be1..a4bc4ed0c50 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPoin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol @@ -32,8 +33,12 @@ internal class KtFirAnonymousObjectSymbol( override val superTypes: List by cached { firSymbol.superTypesList(builder) } override fun createPointer(): KtSymbolPointer = - KtPsiBasedSymbolPointer.createForSymbolFromSource(this) - ?: throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException("Cannot create pointer for KtFirAnonymousObjectSymbol") + withValidityAssertion { + withValidityAssertion { + KtPsiBasedSymbolPointer.createForSymbolFromSource(this) + ?: throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException("Cannot create pointer for KtFirAnonymousObjectSymbol") + } + } override fun equals(other: Any?): Boolean = symbolEquals(other) override fun hashCode(): Int = symbolHashCode() diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt index aaedaeb1723..78643a4628f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt @@ -8,11 +8,12 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtClassInitializerSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousInitializerSymbol @@ -23,9 +24,9 @@ internal class KtFirClassInitializerSymbol( ) : KtClassInitializerSymbol(), KtFirSymbol { override val psi: PsiElement? by cached { firSymbol.findPsi() } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { TODO("Figure out how to create such a pointer. Should we give an index to class initializers?") } - override val symbolKind: KtSymbolKind get() = KtSymbolKind.CLASS_MEMBER + override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.CLASS_MEMBER } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt index 2a926457757..e3d41f847d0 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt @@ -40,11 +40,11 @@ internal class KtFirEnumEntrySymbol( override val name: Name get() = withValidityAssertion { firSymbol.name } override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } - override val containingEnumClassIdIfNonLocal: ClassId? get() = callableIdIfNonLocal?.classId + override val containingEnumClassIdIfNonLocal: ClassId? get() = withValidityAssertion { callableIdIfNonLocal?.classId } override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } return KtFirEnumEntrySymbolPointer( firSymbol.containingClass()?.classId ?: error("Containing class should present for enum entry"), diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt index 62334b7cc0a..b93cb9d36eb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithDeclaration import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol @@ -24,7 +25,7 @@ internal class KtFirFileSymbol( ) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol { override val psi: PsiElement? by cached { firSymbol.findPsi() } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating pointers for files from library is not supported yet") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt index 15c329c70fd..b1720a47ed3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt @@ -83,7 +83,7 @@ internal class KtFirFunctionSymbol( override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { if (firSymbol.fir.origin != FirDeclarationOrigin.SubstitutionOverride) { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt index 04139de66bb..218c037712e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt @@ -52,7 +52,7 @@ internal class KtFirJavaFieldSymbol( override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { val containingClassId = firSymbol.containingClass()?.classId ?: error("Cannot find parent class for java field $callableIdIfNonLocal") diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt index 252f57814cc..dab1b22b79b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -116,7 +116,7 @@ internal class KtFirKotlinPropertySymbol( override val hasGetter: Boolean get() = withValidityAssertion { firSymbol.getterSymbol != null } override val hasSetter: Boolean get() = withValidityAssertion { firSymbol.setterSymbol != null } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { if (firSymbol.fir.origin != FirDeclarationOrigin.SubstitutionOverride) { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt index 2977deda972..3c08a9a713d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt @@ -45,9 +45,9 @@ internal class KtFirLocalVariableSymbol( override val name: Name get() = withValidityAssertion { firSymbol.name } override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } - override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL + override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.LOCAL } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString()) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index 28a86cc36c3..f6ffa64e95a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -60,9 +60,11 @@ internal class KtFirNamedClassOrObjectSymbol( /* FirRegularClass visibility is not modified by STATUS only for Unknown, so it can be taken from RAW */ override val visibility: Visibility - get() = when (val possiblyRawVisibility = firSymbol.fir.visibility) { - Visibilities.Unknown -> if (firSymbol.fir.isLocal) Visibilities.Local else Visibilities.Public - else -> possiblyRawVisibility + get() = withValidityAssertion { + when (val possiblyRawVisibility = firSymbol.fir.visibility) { + Visibilities.Unknown -> if (firSymbol.fir.isLocal) Visibilities.Local else Visibilities.Public + else -> possiblyRawVisibility + } } override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } @@ -112,7 +114,7 @@ internal class KtFirNamedClassOrObjectSymbol( } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } if (symbolKind == KtSymbolKind.LOCAL) { throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(classIdIfNonLocal?.asString().orEmpty()) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt index c411be008dc..df563f41583 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.name.FqName @@ -33,11 +34,13 @@ class KtFirPackageSymbol( } override val origin: KtSymbolOrigin - get() = KtSymbolOrigin.SOURCE // TODO + get() = withValidityAssertion { KtSymbolOrigin.SOURCE } // TODO - override fun createPointer(): KtSymbolPointer = symbolPointer { session -> - check(session is KtFirAnalysisSession) - session.firSymbolBuilder.createPackageSymbolIfOneExists(fqName) + override fun createPointer(): KtSymbolPointer = withValidityAssertion { + symbolPointer { session -> + check(session is KtFirAnalysisSession) + session.firSymbolBuilder.createPackageSymbolIfOneExists(fqName) + } } override fun equals(other: Any?): Boolean { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt index 854bed84e53..4fdba3c6ca8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt @@ -72,7 +72,7 @@ internal class KtFirPropertyGetterSymbol( override val hasStableParameterNames: Boolean get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating pointers for getters from library is not supported yet") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt index 1cde2a99794..a6d00c07c95 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -77,7 +77,7 @@ internal class KtFirPropertySetterSymbol( override val hasStableParameterNames: Boolean get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating pointers for setters from library is not supported yet") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt index 70eaf987094..63ad7881c9d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt @@ -41,7 +41,7 @@ internal class KtFirReceiverParameterSymbol( override val origin: KtSymbolOrigin = withValidityAssertion { firSymbol.fir.ktSymbolOrigin() } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { TODO("Probably just create a pointer based on the underlying declaration") } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt index 7b185b4c361..66dfeae96f1 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt @@ -63,7 +63,7 @@ internal class KtFirSamConstructorSymbol( override val typeParameters: List get() = withValidityAssertion { firSymbol.createKtTypeParameters(builder) } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { val callableId = firSymbol.callableId return KtFirSamConstructorSymbolPointer(ClassId(callableId.packageName, callableId.callableName)) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt index 1ba391bb411..5146069b980 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession @@ -27,7 +28,7 @@ internal interface KtFirSymbol> : KtSymbol, KtLifetime val firResolveSession: LLFirResolveSession - override val origin: KtSymbolOrigin get() = firSymbol.fir.ktSymbolOrigin() + override val origin: KtSymbolOrigin get() = withValidityAssertion { firSymbol.fir.ktSymbolOrigin() } } internal fun KtFirSymbol<*>.symbolEquals(other: Any?): Boolean { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt index 9bf0188c148..95fde0cdd37 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt @@ -6,12 +6,8 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef import org.jetbrains.kotlin.analysis.api.symbols.* -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfType @@ -26,21 +22,23 @@ import org.jetbrains.kotlin.psi.* internal class KtFirSymbolProvider( override val analysisSession: KtAnalysisSession, - firSymbolProvider: FirSymbolProvider, + private val firSymbolProvider: FirSymbolProvider, private val firResolveSession: LLFirResolveSession, private val firSymbolBuilder: KtSymbolByFirBuilder, - override val token: KtLifetimeToken, -) : KtSymbolProvider(), KtLifetimeOwner { - private val firSymbolProvider by weakRef(firSymbolProvider) +) : KtSymbolProvider() { - override fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol = withValidityAssertion { - when { + override fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol { + return when { psi.isFunctionTypeParameter -> error( "Creating KtValueParameterSymbol for function type parameter is not possible. Please see the KDoc of getParameterSymbol" ) psi.isLoopParameter -> { - firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol( + psi.resolveToFirSymbolOfType( + firResolveSession + ) + ) } else -> { @@ -51,12 +49,12 @@ internal class KtFirSymbolProvider( } } - override fun getFileSymbol(psi: KtFile): KtFileSymbol = withValidityAssertion { - firSymbolBuilder.buildFileSymbol(psi.getOrBuildFirFile(firResolveSession).symbol) + override fun getFileSymbol(psi: KtFile): KtFileSymbol { + return firSymbolBuilder.buildFileSymbol(psi.getOrBuildFirFile(firResolveSession).symbol) } - override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol = withValidityAssertion { - when (val firSymbol = psi.resolveToFirSymbolOfType>(firResolveSession)) { + override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol { + return when (val firSymbol = psi.resolveToFirSymbolOfType>(firResolveSession)) { is FirNamedFunctionSymbol -> { if (firSymbol.origin == FirDeclarationOrigin.SamConstructor) { firSymbolBuilder.functionLikeBuilder.buildSamConstructorSymbol(firSymbol) @@ -69,70 +67,80 @@ internal class KtFirSymbolProvider( } } - override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion { - - firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) - + override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol { + return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol( + psi.resolveToFirSymbolOfType( + firResolveSession + ) + ) } - override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion { - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol { + return firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol( + psi.resolveToFirSymbolOfType( + firResolveSession + ) + ) } - override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion { - firSymbolBuilder.classifierBuilder.buildTypeAliasSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol { + return firSymbolBuilder.classifierBuilder.buildTypeAliasSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) } - override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion { - firSymbolBuilder.buildEnumEntrySymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol { + return firSymbolBuilder.buildEnumEntrySymbol(psi.resolveToFirSymbolOfType(firResolveSession)) } - override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion { - firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol( + override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol { + return firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol( psi.resolveToFirSymbolOfType(firResolveSession) ) } - override fun getAnonymousFunctionSymbol(psi: KtFunctionLiteral): KtAnonymousFunctionSymbol = withValidityAssertion { - firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol( + override fun getAnonymousFunctionSymbol(psi: KtFunctionLiteral): KtAnonymousFunctionSymbol { + return firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol( psi.resolveToFirSymbolOfType(firResolveSession) ) } - override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion { - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol { + return firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) } - override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion { - firSymbolBuilder.classifierBuilder.buildAnonymousObjectSymbol( + override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol { + return firSymbolBuilder.classifierBuilder.buildAnonymousObjectSymbol( psi.objectDeclaration.resolveToFirSymbolOfType(firResolveSession) ) } - override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion { - firSymbolBuilder.classifierBuilder.buildClassOrObjectSymbol(psi.resolveToFirSymbolOfType>(firResolveSession)) + override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol { + return firSymbolBuilder.classifierBuilder.buildClassOrObjectSymbol(psi.resolveToFirSymbolOfType>(firResolveSession)) } - override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol? = withValidityAssertion { + override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol? { require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression) // A KtClassOrObject may also map to an FirEnumEntry. Hence, we need to return null in this case. if (psi is KtEnumEntry) return null - firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + return firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol( + psi.resolveToFirSymbolOfType(firResolveSession) + ) } - override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion { - firSymbolBuilder.callableBuilder.buildPropertyAccessorSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol { + return firSymbolBuilder.callableBuilder.buildPropertyAccessorSymbol( + psi.resolveToFirSymbolOfType(firResolveSession) + ) } - override fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol = withValidityAssertion { - firSymbolBuilder.anonymousInitializerBuilder.buildClassInitializer( + override fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol { + return firSymbolBuilder.anonymousInitializerBuilder.buildClassInitializer( psi.resolveToFirSymbolOfType(firResolveSession) ) } - override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion { + override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? { val symbol = firSymbolProvider.getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol ?: return null - firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol) + return firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol) } override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index fc21f1b41d4..d19200efcaf 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -65,12 +65,12 @@ internal class KtFirSyntheticJavaPropertySymbol( builder.callableBuilder.buildGetterSymbol(firSymbol.getterSymbol!!) } override val javaGetterSymbol: KtFunctionSymbol - get() { + get() = withValidityAssertion { val fir = firSymbol.fir as FirSyntheticProperty return builder.functionLikeBuilder.buildFunctionSymbol(fir.getter.delegate.symbol) } override val javaSetterSymbol: KtFunctionSymbol? - get() { + get() = withValidityAssertion { val fir = firSymbol.fir as FirSyntheticProperty return fir.setter?.delegate?.let { builder.functionLikeBuilder.buildFunctionSymbol(it.symbol) } } @@ -88,7 +88,7 @@ internal class KtFirSyntheticJavaPropertySymbol( override val origin: KtSymbolOrigin get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { val containingClassId = firSymbol.containingClass()?.classId ?: error("Cannot find parent class for synthetic java property $callableIdIfNonLocal") diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt index 2f998f436c9..3356cbf669c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt @@ -52,7 +52,7 @@ internal class KtFirTypeAliasSymbol( KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating symbols for library typealiases is not supported yet") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt index 47a24d5c6e3..3df595ae397 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt @@ -44,7 +44,7 @@ internal class KtFirTypeParameterSymbol( override val variance: Variance get() = withValidityAssertion { firSymbol.variance } override val isReified: Boolean get() = withValidityAssertion { firSymbol.isReified } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating symbols for library type parameters is not supported yet") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt index 1a979238542..38e18ee00c3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt @@ -66,7 +66,7 @@ internal class KtFirValueParameterSymbol( ktPropertySymbol } - override fun createPointer(): KtSymbolPointer { + override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating pointers for functions parameters from library is not supported yet") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt index e111f986939..ce86a4c049e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt @@ -5,9 +5,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext @@ -69,4 +73,4 @@ internal fun FirVariableSymbol<*>.getKtConstantInitializer(): KtInitializerValue ensureResolved(FirResolvePhase.BODY_RESOLVE) val firInitializer = fir.initializer ?: return null return firInitializer.asKtInitializerValue() -} +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt index cfcb9649576..e4fcc5b59b5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt @@ -41,7 +41,7 @@ internal class KtFirMapBackedSubstitutor( builder: KtSymbolByFirBuilder, token: KtLifetimeToken ) : AbstractKtFirSubstitutor(_substitutor, builder, token), KtMapBackedSubstitutor { - override fun getAsMap(): Map { + override fun getAsMap(): Map = withValidityAssertion { val result = mutableMapOf() for ((typeParameter, type) in substitutor.substitution) { val typeParameterSymbol = builderRef.classifierBuilder.buildTypeParameterSymbolByLookupTag(typeParameter.toLookupTag()) diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/symbolDeclarationOverridesProvider/AbstractOverriddenDeclarationProviderTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/symbolDeclarationOverridesProvider/AbstractOverriddenDeclarationProviderTest.kt index 9ed46dd4f17..311eb5d8d17 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/symbolDeclarationOverridesProvider/AbstractOverriddenDeclarationProviderTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/symbolDeclarationOverridesProvider/AbstractOverriddenDeclarationProviderTest.kt @@ -58,7 +58,8 @@ abstract class AbstractOverriddenDeclarationProviderTest : AbstractAnalysisApiBa append(symbol.returnType.render(KtTypeRendererOptions.SHORT_NAMES)) } - private fun getPath(symbol: KtCallableSymbol): String = when (symbol) { + @Suppress("unused") + private fun KtAnalysisSession.getPath(symbol: KtCallableSymbol): String = when (symbol) { is KtSyntheticJavaPropertySymbol -> symbol.callableIdIfNonLocal?.toString()!! else -> { val ktDeclaration = symbol.psi as KtDeclaration diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt index 25acf70cc7d..54ad6e729b1 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt index 7a9f8c6e078..8699b4deaca 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.psi.KtFile * * To create analysis session consider using [analyse] */ +@Suppress("AnalysisApiMissingLifetimeCheck") public abstract class KtAnalysisSession(final override val token: KtLifetimeToken) : KtLifetimeOwner, KtSmartCastProviderMixIn, KtCallResolverMixIn, diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtTypeArgument.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtTypeArgument.kt index eb8ea02334d..d0888b1d991 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtTypeArgument.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtTypeArgument.kt @@ -20,8 +20,10 @@ public class KtStarProjectionTypeArgument(override val token: KtLifetimeToken) : } public class KtTypeArgumentWithVariance( - override val type: KtType, + private val _type: KtType, public val variance: Variance, override val token: KtLifetimeToken, -) : KtTypeArgument() +) : KtTypeArgument() { + override val type: KtType get() = withValidityAssertion { _type } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisScopeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisScopeProvider.kt index cf23fdfd332..4623e0e11fd 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisScopeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisScopeProvider.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.components import com.intellij.psi.PsiElement import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion public abstract class KtAnalysisScopeProvider : KtAnalysisSessionComponent() { public abstract fun getAnalysisScope(): GlobalSearchScope @@ -21,7 +22,7 @@ public interface KtAnalysisScopeProviderMixIn : KtAnalysisSessionMixIn { * That means [org.jetbrains.kotlin.analysis.api.symbols.KtSymbol] can be built for the declarations from this scope. */ public val analysisScope: GlobalSearchScope - get() = analysisSession.analysisScopeProvider.getAnalysisScope() + get() = withValidityAssertion { analysisSession.analysisScopeProvider.getAnalysisScope() } /** @@ -31,5 +32,5 @@ public interface KtAnalysisScopeProviderMixIn : KtAnalysisSessionMixIn { * @see analysisScope */ public fun PsiElement.canBeAnalysed(): Boolean = - analysisSession.analysisScopeProvider.canBeAnalysed(this) + withValidityAssertion { analysisSession.analysisScopeProvider.canBeAnalysed(this) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionComponent.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionComponent.kt index b0e0bb83f90..8a7b8d91a9c 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionComponent.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionComponent.kt @@ -7,8 +7,10 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -public abstract class KtAnalysisSessionComponent : KtLifetimeOwner { +public abstract class KtAnalysisSessionComponent { protected abstract val analysisSession: KtAnalysisSession + protected open val token: KtLifetimeToken get() = analysisSession.token } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionMixIn.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionMixIn.kt index 6e82e99e153..91e60204958 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionMixIn.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtAnalysisSessionMixIn.kt @@ -6,7 +6,8 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner -public interface KtAnalysisSessionMixIn { +public interface KtAnalysisSessionMixIn : KtLifetimeOwner { public val analysisSession: KtAnalysisSession } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt index 4496781868b..a64f92b163a 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.calls.KtCallCandidateInfo import org.jetbrains.kotlin.analysis.api.calls.KtCallInfo +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.psi.KtArrayAccessExpression import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.kotlin.psi.KtElement @@ -20,17 +21,23 @@ public abstract class KtCallResolver : KtAnalysisSessionComponent() { public interface KtCallResolverMixIn : KtAnalysisSessionMixIn { public fun KtElement.resolveCall(): KtCallInfo? = - analysisSession.callResolver.resolveCall(this) + withValidityAssertion { withValidityAssertion { analysisSession.callResolver.resolveCall(this) } } public fun KtCallElement.resolveCall(): KtCallInfo = - analysisSession.callResolver.resolveCall(this) - ?: error("KtCallElement should always resolve to a KtCallInfo") + withValidityAssertion { + analysisSession.callResolver.resolveCall(this) + ?: error("KtCallElement should always resolve to a KtCallInfo") + } public fun KtUnaryExpression.resolveCall(): KtCallInfo = - analysisSession.callResolver.resolveCall(this) ?: error("KtUnaryExpression should always resolve to a KtCallInfo") + withValidityAssertion { + analysisSession.callResolver.resolveCall(this) ?: error("KtUnaryExpression should always resolve to a KtCallInfo") + } public fun KtArrayAccessExpression.resolveCall(): KtCallInfo = - analysisSession.callResolver.resolveCall(this) ?: error("KtArrayAccessExpression should always resolve to a KtCallInfo") + withValidityAssertion { + analysisSession.callResolver.resolveCall(this) ?: error("KtArrayAccessExpression should always resolve to a KtCallInfo") + } /** * Returns all the candidates considered during [overload resolution](https://kotlinlang.org/spec/overload-resolution.html) for the call @@ -40,5 +47,5 @@ public interface KtCallResolverMixIn : KtAnalysisSessionMixIn { * applicability and choosing the most specific candidate. */ public fun KtElement.collectCallCandidates(): List = - analysisSession.callResolver.collectCallCandidates(this) + withValidityAssertion { analysisSession.callResolver.collectCallCandidates(this) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt index 81efdd965d0..ae9d779e306 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.base.KtConstantValue +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.psi.KtExpression public enum class KtConstantEvaluationMode { @@ -35,5 +36,5 @@ public abstract class KtCompileTimeConstantProvider : KtAnalysisSessionComponent public interface KtCompileTimeConstantProviderMixIn : KtAnalysisSessionMixIn { public fun KtExpression.evaluate(mode: KtConstantEvaluationMode): KtConstantValue? = - analysisSession.compileTimeConstantProvider.evaluate(this, mode) + withValidityAssertion { analysisSession.compileTimeConstantProvider.evaluate(this, mode) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompletionCandidateChecker.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompletionCandidateChecker.kt index 195b794c074..b168eed1b63 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompletionCandidateChecker.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompletionCandidateChecker.kt @@ -5,6 +5,9 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor import org.jetbrains.kotlin.psi.KtExpression @@ -20,20 +23,34 @@ public abstract class KtCompletionCandidateChecker : KtAnalysisSessionComponent( ): KtExtensionApplicabilityResult } -public sealed class KtExtensionApplicabilityResult { + +public sealed class KtExtensionApplicabilityResult : KtLifetimeOwner { public abstract val isApplicable: Boolean public abstract val substitutor: KtSubstitutor - public class ApplicableAsExtensionCallable(override val substitutor: KtSubstitutor) : KtExtensionApplicabilityResult() { - override val isApplicable: Boolean get() = true + public class ApplicableAsExtensionCallable( + private val _substitutor: KtSubstitutor, + override val token: KtLifetimeToken + ) : KtExtensionApplicabilityResult() { + override val substitutor: KtSubstitutor = withValidityAssertion { _substitutor } + override val isApplicable: Boolean get() = withValidityAssertion { true } } - public class ApplicableAsFunctionalVariableCall(override val substitutor: KtSubstitutor) : KtExtensionApplicabilityResult() { - override val isApplicable: Boolean get() = true + public class ApplicableAsFunctionalVariableCall( + private val _substitutor: KtSubstitutor, + override val token: KtLifetimeToken + ) : KtExtensionApplicabilityResult() { + override val substitutor: KtSubstitutor get() = withValidityAssertion { _substitutor } + override val isApplicable: Boolean get() = withValidityAssertion { true } } - public class NonApplicable(override val substitutor: KtSubstitutor) : KtExtensionApplicabilityResult() { - override val isApplicable: Boolean = false + + public class NonApplicable( + private val _substitutor: KtSubstitutor, + override val token: KtLifetimeToken + ) : KtExtensionApplicabilityResult() { + override val substitutor: KtSubstitutor = withValidityAssertion { _substitutor } + override val isApplicable: Boolean get() = withValidityAssertion { false } } } @@ -42,11 +59,12 @@ public interface KtCompletionCandidateCheckerMixIn : KtAnalysisSessionMixIn { originalPsiFile: KtFile, psiFakeCompletionExpression: KtSimpleNameExpression, psiReceiverExpression: KtExpression?, - ): KtExtensionApplicabilityResult = + ): KtExtensionApplicabilityResult = withValidityAssertion { analysisSession.completionCandidateChecker.checkExtensionFitsCandidate( this, originalPsiFile, psiFakeCompletionExpression, psiReceiverExpression ) + } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDiagnosticProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDiagnosticProvider.kt index 8269286f796..41a4784eb49 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDiagnosticProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtDiagnosticProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.diagnostics.KtDiagnosticWithPsi +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile @@ -16,10 +17,10 @@ public abstract class KtDiagnosticProvider : KtAnalysisSessionComponent() { public interface KtDiagnosticProviderMixIn : KtAnalysisSessionMixIn { public fun KtElement.getDiagnostics(filter: KtDiagnosticCheckerFilter): Collection> = - analysisSession.diagnosticProvider.getDiagnosticsForElement(this, filter) + withValidityAssertion { analysisSession.diagnosticProvider.getDiagnosticsForElement(this, filter) } public fun KtFile.collectDiagnosticsForFile(filter: KtDiagnosticCheckerFilter): Collection> = - analysisSession.diagnosticProvider.collectDiagnosticsForFile(this, filter) + withValidityAssertion { analysisSession.diagnosticProvider.collectDiagnosticsForFile(this, filter) } } public enum class KtDiagnosticCheckerFilter { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionInfoProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionInfoProvider.kt index a69959b6789..bfa17980361 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionInfoProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionInfoProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.psi.KtReturnExpression @@ -17,7 +18,8 @@ public abstract class KtExpressionInfoProvider : KtAnalysisSessionComponent() { public interface KtExpressionInfoProviderMixIn : KtAnalysisSessionMixIn { public fun KtReturnExpression.getReturnTargetSymbol(): KtCallableSymbol? = - analysisSession.expressionInfoProvider.getReturnExpressionTargetSymbol(this) + withValidityAssertion { analysisSession.expressionInfoProvider.getReturnExpressionTargetSymbol(this) } - public fun KtWhenExpression.getMissingCases(): List = analysisSession.expressionInfoProvider.getWhenMissingCases(this) + public fun KtWhenExpression.getMissingCases(): List = + withValidityAssertion { analysisSession.expressionInfoProvider.getWhenMissingCases(this) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt index 39a7b518335..1da5491b782 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.components import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtExpression @@ -31,13 +32,13 @@ public interface KtExpressionTypeProviderMixIn : KtAnalysisSessionMixIn { * - `Unit` type for statements; */ public fun KtExpression.getKtType(): KtType? = - analysisSession.expressionTypeProvider.getKtExpressionType(this) + withValidityAssertion { analysisSession.expressionTypeProvider.getKtExpressionType(this) } /** * Returns the return type of the given [KtDeclaration] as [KtType] */ public fun KtDeclaration.getReturnKtType(): KtType = - analysisSession.expressionTypeProvider.getReturnTypeForKtDeclaration(this) + withValidityAssertion { analysisSession.expressionTypeProvider.getReturnTypeForKtDeclaration(this) } /** * Returns the functional type of the given [KtFunction]. @@ -50,14 +51,14 @@ public interface KtExpressionTypeProviderMixIn : KtAnalysisSessionMixIn { * such as `SuspendFunction`, `KFunction`, or `KSuspendFunction`, will be constructed. */ public fun KtFunction.getFunctionalType(): KtType = - analysisSession.expressionTypeProvider.getFunctionalTypeForKtFunction(this) + withValidityAssertion { analysisSession.expressionTypeProvider.getFunctionalTypeForKtFunction(this) } /** * Returns the expected [KtType] of this [PsiElement] if it is an expression. The returned value should not be a * [org.jetbrains.kotlin.analysis.api.types.KtClassErrorType]. */ public fun PsiElement.getExpectedType(): KtType? = - analysisSession.expressionTypeProvider.getExpectedType(this) + withValidityAssertion { analysisSession.expressionTypeProvider.getExpectedType(this) } /** * Returns `true` if this expression is definitely null, based on declared nullability and smart cast types derived from @@ -82,11 +83,11 @@ public interface KtExpressionTypeProviderMixIn : KtAnalysisSessionMixIn { * [spec](https://kotlinlang.org/spec/type-inference.html#smart-cast-sink-stability) provides an explanation on smart cast stability. */ public fun KtExpression.isDefinitelyNull(): Boolean = - analysisSession.expressionTypeProvider.isDefinitelyNull(this) + withValidityAssertion { analysisSession.expressionTypeProvider.isDefinitelyNull(this) } /** * Returns `true` if this expression is definitely not null. See [isDefinitelyNull] for examples. */ public fun KtExpression.isDefinitelyNotNull(): Boolean = - analysisSession.expressionTypeProvider.isDefinitelyNotNull(this) + withValidityAssertion { analysisSession.expressionTypeProvider.isDefinitelyNotNull(this) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt index 392bf49ee0c..9833ca6b3bf 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective @@ -21,7 +22,7 @@ public interface KtImportOptimizerMixIn : KtAnalysisSessionMixIn { * * Does **not** change the file. */ - public fun analyseImports(file: KtFile): KtImportOptimizerResult { + public fun analyseImports(file: KtFile): KtImportOptimizerResult = withValidityAssertion { return analysisSession.importOptimizer.analyseImports(file) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtInheritorsProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtInheritorsProvider.kt index d0a1fa8c0f1..60b88587822 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtInheritorsProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtInheritorsProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol @@ -15,8 +16,8 @@ public abstract class KtInheritorsProvider : KtAnalysisSessionComponent() { public interface KtInheritorsProviderMixIn : KtAnalysisSessionMixIn { public fun KtNamedClassOrObjectSymbol.getSealedClassInheritors(): List = - analysisSession.inheritorsProvider.getInheritorsOfSealedClass(this) + withValidityAssertion { analysisSession.inheritorsProvider.getInheritorsOfSealedClass(this) } public fun KtNamedClassOrObjectSymbol.getEnumEntries(): List = - analysisSession.inheritorsProvider.getEnumEntries(this) + withValidityAssertion { analysisSession.inheritorsProvider.getEnumEntries(this) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt index b6882bd30b2..fdb7d5cfa3e 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtJvmTypeMapper.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.load.kotlin.TypeMappingMode import org.jetbrains.org.objectweb.asm.Type @@ -20,5 +21,5 @@ public interface KtJvmTypeMapperMixIn : KtAnalysisSessionMixIn { * @see TypeMappingMode */ public fun KtType.mapTypeToJvmType(mode: TypeMappingMode = TypeMappingMode.DEFAULT): Type = - analysisSession.jvmTypeMapper.mapTypeToJvmType(this, mode) + withValidityAssertion { analysisSession.jvmTypeMapper.mapTypeToJvmType(this, mode) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtOverrideInfoProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtOverrideInfoProvider.kt index 9178ee3ce86..98cfccc4c4c 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtOverrideInfoProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtOverrideInfoProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.util.ImplementationStatus import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol @@ -24,14 +25,14 @@ public interface KtMemberSymbolProviderMixin : KtAnalysisSessionMixIn { /** Checks if the given symbol (possibly a symbol inherited from a super class) is visible in the given class. */ public fun KtCallableSymbol.isVisibleInClass(classSymbol: KtClassOrObjectSymbol): Boolean = - analysisSession.overrideInfoProvider.isVisible(this, classSymbol) + withValidityAssertion { analysisSession.overrideInfoProvider.isVisible(this, classSymbol) } /** * Gets the [ImplementationStatus] of the [this] member symbol in the given [parentClassSymbol]. Or null if this symbol is not a * member. */ public fun KtCallableSymbol.getImplementationStatus(parentClassSymbol: KtClassOrObjectSymbol): ImplementationStatus? = - analysisSession.overrideInfoProvider.getImplementationStatus(this, parentClassSymbol) + withValidityAssertion { analysisSession.overrideInfoProvider.getImplementationStatus(this, parentClassSymbol) } /** * Gets the original symbol for the given callable symbol. In a class scope, a symbol may be derived from symbols declared in super @@ -54,11 +55,11 @@ public interface KtMemberSymbolProviderMixin : KtAnalysisSessionMixIn { * after specialization) and delegation. */ public val KtCallableSymbol.originalOverriddenSymbol: KtCallableSymbol? - get() = analysisSession.overrideInfoProvider.getOriginalOverriddenSymbol(this) + get() = withValidityAssertion { analysisSession.overrideInfoProvider.getOriginalOverriddenSymbol(this) } /** * Gets the class symbol where the given callable symbol is declared. See [originalOverriddenSymbol] for more details. */ public val KtCallableSymbol.originalContainingClassForOverride: KtClassOrObjectSymbol? - get() = analysisSession.overrideInfoProvider.getOriginalContainingClassForOverride(this) + get() = withValidityAssertion { analysisSession.overrideInfoProvider.getOriginalContainingClassForOverride(this) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt index d60e58f88a4..1d7ed55a38b 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtPsiTypeProvider.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.components import com.intellij.psi.PsiElement import com.intellij.psi.PsiType +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode @@ -41,6 +42,6 @@ public interface KtPsiTypeProviderMixIn : KtAnalysisSessionMixIn { mode: KtTypeMappingMode = KtTypeMappingMode.DEFAULT, isAnnotationMethod: Boolean = false, ): PsiType? = - analysisSession.psiTypeProvider.asPsiType(this, useSitePosition, mode, isAnnotationMethod) + withValidityAssertion { analysisSession.psiTypeProvider.asPsiType(this, useSitePosition, mode, isAnnotationMethod) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt index 88a20e65b50..66a9c7f3bc5 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt @@ -5,15 +5,16 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.references.KtReference public interface KtReferenceResolveMixIn : KtAnalysisSessionMixIn { - public fun KtReference.resolveToSymbols(): Collection { + public fun KtReference.resolveToSymbols(): Collection = withValidityAssertion { return analysisSession.referenceResolveProvider.resolveToSymbols(this) } - public fun KtReference.resolveToSymbol(): KtSymbol? { + public fun KtReference.resolveToSymbol(): KtSymbol? = withValidityAssertion { return resolveToSymbols().singleOrNull() } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt index 88f549a6560..a8fd973c4a2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.components import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.analysis.api.components.ShortenOption.Companion.defaultCallableShortenOption import org.jetbrains.kotlin.analysis.api.components.ShortenOption.Companion.defaultClassShortenOption +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol @@ -64,19 +65,28 @@ public interface KtReferenceShortenerMixIn : KtAnalysisSessionMixIn { classShortenOption: (KtClassLikeSymbol) -> ShortenOption = defaultClassShortenOption, callableShortenOption: (KtCallableSymbol) -> ShortenOption = defaultCallableShortenOption ): ShortenCommand = - analysisSession.referenceShortener.collectShortenings(file, selection, classShortenOption, callableShortenOption) + withValidityAssertion { + analysisSession.referenceShortener.collectShortenings( + file, + selection, + classShortenOption, + callableShortenOption + ) + } public fun collectPossibleReferenceShorteningsInElement( element: KtElement, classShortenOption: (KtClassLikeSymbol) -> ShortenOption = defaultClassShortenOption, callableShortenOption: (KtCallableSymbol) -> ShortenOption = defaultCallableShortenOption ): ShortenCommand = - analysisSession.referenceShortener.collectShortenings( - element.containingKtFile, - element.textRange, - classShortenOption, - callableShortenOption - ) + withValidityAssertion { + analysisSession.referenceShortener.collectShortenings( + element.containingKtFile, + element.textRange, + classShortenOption, + callableShortenOption + ) + } } public interface ShortenCommand { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSamResolver.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSamResolver.kt index f3d6a560423..97d3a7672ae 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSamResolver.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSamResolver.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol import org.jetbrains.kotlin.name.ClassId @@ -18,5 +19,5 @@ public interface KtSamResolverMixIn : KtAnalysisSessionMixIn { * Returns [KtSamConstructorSymbol] if the given [KtClassLikeSymbol] is a functional interface type, a.k.a. SAM. */ public fun KtClassLikeSymbol.getSamConstructor(): KtSamConstructorSymbol? = - analysisSession.samResolver.getSamConstructor(this) + withValidityAssertion { analysisSession.samResolver.getSamConstructor(this) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt index 60c6d0bb2f4..d85f9c05544 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt @@ -6,12 +6,14 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner -import org.jetbrains.kotlin.analysis.api.scopes.* +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.scopes.KtScope +import org.jetbrains.kotlin.analysis.api.scopes.KtTypeScope import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile @@ -33,7 +35,7 @@ public abstract class KtScopeProvider : KtAnalysisSessionComponent() { public abstract fun getCompositeScope(subScopes: List): KtScope - public abstract fun getTypeScope(type: KtType): KtScope? + public abstract fun getTypeScope(type: KtType): KtTypeScope? public abstract fun getScopeContextForPosition( originalFile: KtFile, @@ -43,40 +45,50 @@ public abstract class KtScopeProvider : KtAnalysisSessionComponent() { public interface KtScopeProviderMixIn : KtAnalysisSessionMixIn { public fun KtSymbolWithMembers.getMemberScope(): KtScope = - analysisSession.scopeProvider.getMemberScope(this) + withValidityAssertion { analysisSession.scopeProvider.getMemberScope(this) } public fun KtSymbolWithMembers.getDeclaredMemberScope(): KtScope = - analysisSession.scopeProvider.getDeclaredMemberScope(this) + withValidityAssertion { analysisSession.scopeProvider.getDeclaredMemberScope(this) } public fun KtSymbolWithMembers.getDelegatedMemberScope(): KtScope = - analysisSession.scopeProvider.getDelegatedMemberScope(this) + withValidityAssertion { analysisSession.scopeProvider.getDelegatedMemberScope(this) } public fun KtSymbolWithMembers.getStaticMemberScope(): KtScope = - analysisSession.scopeProvider.getStaticMemberScope(this) + withValidityAssertion { analysisSession.scopeProvider.getStaticMemberScope(this) } public fun KtFileSymbol.getFileScope(): KtScope = - analysisSession.scopeProvider.getFileScope(this) + withValidityAssertion { analysisSession.scopeProvider.getFileScope(this) } public fun KtPackageSymbol.getPackageScope(): KtScope = - analysisSession.scopeProvider.getPackageScope(this) + withValidityAssertion { analysisSession.scopeProvider.getPackageScope(this) } public fun List.asCompositeScope(): KtScope = - analysisSession.scopeProvider.getCompositeScope(this) + withValidityAssertion { analysisSession.scopeProvider.getCompositeScope(this) } - public fun KtType.getTypeScope(): KtScope? = - analysisSession.scopeProvider.getTypeScope(this) + public fun KtType.getTypeScope(): KtTypeScope? = + withValidityAssertion { analysisSession.scopeProvider.getTypeScope(this) } public fun KtFile.getScopeContextForPosition(positionInFakeFile: KtElement): KtScopeContext = - analysisSession.scopeProvider.getScopeContextForPosition(this, positionInFakeFile) + withValidityAssertion { analysisSession.scopeProvider.getScopeContextForPosition(this, positionInFakeFile) } public fun KtFile.getScopeContextForFile(): KtScopeContext = - analysisSession.scopeProvider.getScopeContextForPosition(this, this) + withValidityAssertion { analysisSession.scopeProvider.getScopeContextForPosition(this, this) } } -public data class KtScopeContext(val scopes: KtScope, val implicitReceivers: List) +public class KtScopeContext( + private val _scopes: KtScope, + private val _implicitReceivers: List, + override val token: KtLifetimeToken +) : KtLifetimeOwner { + public val implicitReceivers: List get() = withValidityAssertion { _implicitReceivers } + public val scopes: KtScope get() = withValidityAssertion { _scopes } +} public class KtImplicitReceiver( override val token: KtLifetimeToken, - public val type: KtType, - public val ownerSymbol: KtSymbol -) : KtLifetimeOwner + private val _type: KtType, + private val _ownerSymbol: KtSymbol +) : KtLifetimeOwner { + public val ownerSymbol: KtSymbol get() = withValidityAssertion { _ownerSymbol } + public val type: KtType get() = withValidityAssertion { _type } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSmartCastProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSmartCastProvider.kt index 6c95d402dcd..25f427bfacb 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSmartCastProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSmartCastProvider.kt @@ -21,7 +21,7 @@ public interface KtSmartCastProviderMixIn : KtAnalysisSessionMixIn { * Gets the smart-cast information of the given expression or null if the expression is not smart casted. */ public fun KtExpression.getSmartCastInfo(): KtSmartCastInfo? = - analysisSession.smartCastProvider.getSmartCastedInfo(this) + withValidityAssertion { analysisSession.smartCastProvider.getSmartCastedInfo(this) } /** * Returns the list of implicit smart-casts which are required for the expression to be called. Includes only implicit @@ -36,7 +36,7 @@ public interface KtSmartCastProviderMixIn : KtAnalysisSessionMixIn { * ``` */ public fun KtExpression.getImplicitReceiverSmartCast(): Collection = - analysisSession.smartCastProvider.getImplicitReceiverSmartCast(this) + withValidityAssertion { analysisSession.smartCastProvider.getImplicitReceiverSmartCast(this) } } public data class KtSmartCastInfo( diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSubtypingComponent.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSubtypingComponent.kt index 2f4388ec126..c697315406d 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSubtypingComponent.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSubtypingComponent.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.types.KtType public abstract class KtSubtypingComponent : KtAnalysisSessionComponent() { @@ -14,11 +15,11 @@ public abstract class KtSubtypingComponent : KtAnalysisSessionComponent() { public interface KtSubtypingComponentMixIn : KtAnalysisSessionMixIn { infix public fun KtType.isEqualTo(other: KtType): Boolean = - analysisSession.subtypingComponent.isEqualTo(this, other) + withValidityAssertion { analysisSession.subtypingComponent.isEqualTo(this, other) } infix public fun KtType.isSubTypeOf(superType: KtType): Boolean = - analysisSession.subtypingComponent.isSubTypeOf(this, superType) + withValidityAssertion { analysisSession.subtypingComponent.isSubTypeOf(this, superType) } infix public fun KtType.isNotSubTypeOf(superType: KtType): Boolean = - !analysisSession.subtypingComponent.isSubTypeOf(this, superType) + withValidityAssertion { !analysisSession.subtypingComponent.isSubTypeOf(this, superType) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolContainingDeclarationProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolContainingDeclarationProvider.kt index c6e84f4b1cf..8327f3b9fc5 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolContainingDeclarationProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.analysis.project.structure.KtModule @@ -23,8 +24,8 @@ public interface KtSymbolContainingDeclarationProviderMixIn : KtAnalysisSessionM * for local declaration returns declaration it was declared it */ public fun KtSymbol.getContainingSymbol(): KtSymbolWithKind? = - analysisSession.containingDeclarationProvider.getContainingDeclaration(this) + withValidityAssertion { analysisSession.containingDeclarationProvider.getContainingDeclaration(this) } public fun KtSymbol.getContainingModule(): KtModule = - analysisSession.containingDeclarationProvider.getContainingModule(this) + withValidityAssertion { analysisSession.containingDeclarationProvider.getContainingModule(this) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt index d8e095e1340..d6923640bf0 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol @@ -30,7 +31,7 @@ public interface KtSymbolDeclarationOverridesProviderMixIn : KtAnalysisSessionMi * @see getDirectlyOverriddenSymbols */ public fun KtCallableSymbol.getAllOverriddenSymbols(): List = - analysisSession.symbolDeclarationOverridesProvider.getAllOverriddenSymbols(this) + withValidityAssertion { analysisSession.symbolDeclarationOverridesProvider.getAllOverriddenSymbols(this) } /** * Return a list of symbols which are **directly** overridden by symbol @@ -42,14 +43,14 @@ public interface KtSymbolDeclarationOverridesProviderMixIn : KtAnalysisSessionMi * @see getAllOverriddenSymbols */ public fun KtCallableSymbol.getDirectlyOverriddenSymbols(): List = - analysisSession.symbolDeclarationOverridesProvider.getDirectlyOverriddenSymbols(this) + withValidityAssertion { analysisSession.symbolDeclarationOverridesProvider.getDirectlyOverriddenSymbols(this) } public fun KtClassOrObjectSymbol.isSubClassOf(superClass: KtClassOrObjectSymbol): Boolean = - analysisSession.symbolDeclarationOverridesProvider.isSubClassOf(this, superClass) + withValidityAssertion { analysisSession.symbolDeclarationOverridesProvider.isSubClassOf(this, superClass) } public fun KtClassOrObjectSymbol.isDirectSubClassOf(superClass: KtClassOrObjectSymbol): Boolean = - analysisSession.symbolDeclarationOverridesProvider.isDirectSubClassOf(this, superClass) + withValidityAssertion { analysisSession.symbolDeclarationOverridesProvider.isDirectSubClassOf(this, superClass) } public fun KtCallableSymbol.getIntersectionOverriddenSymbols(): Collection = - analysisSession.symbolDeclarationOverridesProvider.getIntersectionOverriddenSymbols(this) + withValidityAssertion { analysisSession.symbolDeclarationOverridesProvider.getIntersectionOverriddenSymbols(this) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt index 223231f1580..e4c2e1ed362 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.types.KtType @@ -137,11 +138,11 @@ public interface KtSymbolDeclarationRendererMixIn : KtAnalysisSessionMixIn { * Render symbol into the representable Kotlin string */ public fun KtDeclarationSymbol.render(options: KtDeclarationRendererOptions = KtDeclarationRendererOptions.DEFAULT): String = - analysisSession.symbolDeclarationRendererProvider.renderDeclaration(this, options) + withValidityAssertion { analysisSession.symbolDeclarationRendererProvider.renderDeclaration(this, options) } /** * Render kotlin type into the representable Kotlin type string */ public fun KtType.render(options: KtTypeRendererOptions = KtTypeRendererOptions.DEFAULT): String = - analysisSession.symbolDeclarationRendererProvider.render(this, options) + withValidityAssertion { analysisSession.symbolDeclarationRendererProvider.render(this, options) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolInfoProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolInfoProvider.kt index 98c65c4e549..f5e007537c4 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolInfoProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolInfoProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol @@ -25,27 +26,39 @@ public interface KtSymbolInfoProviderMixIn : KtAnalysisSessionMixIn { /** * Gets the deprecation status of the given symbol. Returns null if the symbol it not deprecated. */ - public val KtSymbol.deprecationStatus: DeprecationInfo? get() = analysisSession.symbolInfoProvider.getDeprecation(this) + public val KtSymbol.deprecationStatus: DeprecationInfo? get() = withValidityAssertion { + analysisSession.symbolInfoProvider.getDeprecation( + this + ) + } /** * Gets the deprecation status of the given symbol. Returns null if the symbol it not deprecated. */ public fun KtSymbol.getDeprecationStatus(annotationUseSiteTarget: AnnotationUseSiteTarget?): DeprecationInfo? = - analysisSession.symbolInfoProvider.getDeprecation(this) + withValidityAssertion { analysisSession.symbolInfoProvider.getDeprecation(this) } /** * Gets the deprecation status of the getter of this property symbol. Returns null if the getter it not deprecated. */ public val KtPropertySymbol.getterDeprecationStatus: DeprecationInfo? - get() = analysisSession.symbolInfoProvider.getGetterDeprecation(this) + get() = withValidityAssertion { analysisSession.symbolInfoProvider.getGetterDeprecation(this) } /** * Gets the deprecation status of the setter of this property symbol. Returns null if the setter it not deprecated or the property does * not have a setter. */ public val KtPropertySymbol.setterDeprecationStatus: DeprecationInfo? - get() = analysisSession.symbolInfoProvider.getSetterDeprecation(this) + get() = withValidityAssertion { analysisSession.symbolInfoProvider.getSetterDeprecation(this) } - public val KtPropertySymbol.javaGetterName: Name get() = analysisSession.symbolInfoProvider.getJavaGetterName(this) - public val KtPropertySymbol.javaSetterName: Name? get() = analysisSession.symbolInfoProvider.getJavaSetterName(this) + public val KtPropertySymbol.javaGetterName: Name get() = withValidityAssertion { + analysisSession.symbolInfoProvider.getJavaGetterName( + this + ) + } + public val KtPropertySymbol.javaSetterName: Name? get() = withValidityAssertion { + analysisSession.symbolInfoProvider.getJavaSetterName( + this + ) + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolsMixIn.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolsMixIn.kt index 4ff9bd83b90..49df6957768 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolsMixIn.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolsMixIn.kt @@ -5,10 +5,11 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer public interface KtSymbolsMixIn : KtAnalysisSessionMixIn { @Suppress("DEPRECATION") - public fun KtSymbolPointer.restoreSymbol(): S? = restoreSymbol(analysisSession) + public fun KtSymbolPointer.restoreSymbol(): S? = withValidityAssertion { restoreSymbol(analysisSession) } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeCreator.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeCreator.kt index f0a0f6994fa..ed5e01a7447 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeCreator.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeCreator.kt @@ -7,6 +7,10 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.KtTypeArgument import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.assertIsValidAndAccessible +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.types.KtClassType @@ -28,44 +32,50 @@ public inline fun KtTypeCreatorMixIn.buildClassType( classId: ClassId, build: KtClassTypeBuilder.() -> Unit = {} ): KtClassType = - analysisSession.typesCreator.buildClassType(KtClassTypeBuilder.ByClassId(classId).apply(build)) + analysisSession.typesCreator.buildClassType(KtClassTypeBuilder.ByClassId(classId, token).apply(build)) public inline fun KtTypeCreatorMixIn.buildClassType( symbol: KtClassLikeSymbol, build: KtClassTypeBuilder.() -> Unit = {} ): KtClassType = - analysisSession.typesCreator.buildClassType(KtClassTypeBuilder.BySymbol(symbol).apply(build)) + analysisSession.typesCreator.buildClassType(KtClassTypeBuilder.BySymbol(symbol, token).apply(build)) public inline fun KtTypeCreatorMixIn.buildTypeParameterType( symbol: KtTypeParameterSymbol, build: KtTypeParameterTypeBuilder.() -> Unit = {} ): KtTypeParameterType = - analysisSession.typesCreator.buildTypeParameterType(KtTypeParameterTypeBuilder.BySymbol(symbol).apply(build)) + analysisSession.typesCreator.buildTypeParameterType(KtTypeParameterTypeBuilder.BySymbol(symbol, token).apply(build)) -public sealed class KtTypeBuilder +public sealed class KtTypeBuilder : KtLifetimeOwner public sealed class KtClassTypeBuilder : KtTypeBuilder() { private val _arguments = mutableListOf() public var nullability: KtTypeNullability = KtTypeNullability.NON_NULLABLE - public val arguments: List get() = _arguments + public val arguments: List get() = withValidityAssertion { _arguments } public fun argument(argument: KtTypeArgument) { + assertIsValidAndAccessible() _arguments += argument } - public fun argument(type: KtType, variance: Variance = Variance.INVARIANT) { + public fun argument(type: KtType, variance: Variance = Variance.INVARIANT) { + assertIsValidAndAccessible() _arguments += KtTypeArgumentWithVariance(type, variance, type.token) } - public class ByClassId(public val classId: ClassId) : KtClassTypeBuilder() - public class BySymbol(public val symbol: KtClassLikeSymbol) : KtClassTypeBuilder() + public class ByClassId(public val classId: ClassId, override val token: KtLifetimeToken) : KtClassTypeBuilder() + public class BySymbol(private val _symbol: KtClassLikeSymbol, override val token: KtLifetimeToken) : KtClassTypeBuilder() { + public val symbol: KtClassLikeSymbol get() = withValidityAssertion { _symbol } + } } public sealed class KtTypeParameterTypeBuilder : KtTypeBuilder() { public var nullability: KtTypeNullability = KtTypeNullability.NULLABLE - public class BySymbol(public val symbol: KtTypeParameterSymbol) : KtTypeParameterTypeBuilder() + public class BySymbol(private val _symbol: KtTypeParameterSymbol, override val token: KtLifetimeToken) : KtTypeParameterTypeBuilder() { + public val symbol: KtTypeParameterSymbol get() = withValidityAssertion { _symbol } + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt index 645882daaa0..776ba6aea3a 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeInfoProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.components +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol import org.jetbrains.kotlin.analysis.api.types.KtFlexibleType @@ -28,31 +29,31 @@ public interface KtTypeInfoProviderMixIn : KtAnalysisSessionMixIn { * https://kotlinlang.org/spec/type-system.html#type-kinds for more details. */ public val KtType.isDenotable: Boolean - get() = analysisSession.typeInfoProvider.isDenotable(this) + get() = withValidityAssertion { analysisSession.typeInfoProvider.isDenotable(this) } /** * Returns true if this type is a functional interface type, a.k.a. SAM type, e.g., Runnable. */ public val KtType.isFunctionalInterfaceType: Boolean - get() = analysisSession.typeInfoProvider.isFunctionalInterfaceType(this) + get() = withValidityAssertion { analysisSession.typeInfoProvider.isFunctionalInterfaceType(this) } /** * Returns [FunctionClassKind] of the given [KtType] */ public val KtType.functionClassKind: FunctionClassKind? - get() = analysisSession.typeInfoProvider.getFunctionClassKind(this) + get() = withValidityAssertion { analysisSession.typeInfoProvider.getFunctionClassKind(this) } public val KtType.isFunctionType: Boolean - get() = functionClassKind == FunctionClassKind.Function + get() = withValidityAssertion { functionClassKind == FunctionClassKind.Function } public val KtType.isKFunctionType: Boolean - get() = functionClassKind == FunctionClassKind.KFunction + get() = withValidityAssertion { functionClassKind == FunctionClassKind.KFunction } public val KtType.isSuspendFunctionType: Boolean - get() = functionClassKind == FunctionClassKind.SuspendFunction + get() = withValidityAssertion { functionClassKind == FunctionClassKind.SuspendFunction } public val KtType.isKSuspendFunctionType: Boolean - get() = functionClassKind == FunctionClassKind.KSuspendFunction + get() = withValidityAssertion { functionClassKind == FunctionClassKind.KSuspendFunction } /** * Returns true if a public value of this type can potentially be null. This means this type is not a subtype of [Any]. However, it does not @@ -60,36 +61,36 @@ public interface KtTypeInfoProviderMixIn : KtAnalysisSessionMixIn { * of type `T:Any?` can potentially be null. But one can not assign `null` to such a variable because the instantiated type may not be * nullable. */ - public val KtType.canBeNull: Boolean get() = analysisSession.typeInfoProvider.canBeNull(this) + public val KtType.canBeNull: Boolean get() = withValidityAssertion { analysisSession.typeInfoProvider.canBeNull(this) } /** Returns true if the type is explicitly marked as nullable. This means it's safe to assign `null` to a variable with this type. */ - public val KtType.isMarkedNullable: Boolean get() = this.nullability == KtTypeNullability.NULLABLE + public val KtType.isMarkedNullable: Boolean get() = withValidityAssertion { this.nullability == KtTypeNullability.NULLABLE } /** Returns true if the type is a platform flexible type and may or may not be marked nullable. */ - public val KtType.hasFlexibleNullability: Boolean get() = this is KtFlexibleType && this.upperBound.isMarkedNullable != this.lowerBound.isMarkedNullable + public val KtType.hasFlexibleNullability: Boolean get() = withValidityAssertion { this is KtFlexibleType && this.upperBound.isMarkedNullable != this.lowerBound.isMarkedNullable } - public val KtType.isUnit: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.UNIT) - public val KtType.isInt: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.INT) - public val KtType.isLong: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.LONG) - public val KtType.isShort: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.SHORT) - public val KtType.isByte: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.BYTE) - public val KtType.isFloat: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.FLOAT) - public val KtType.isDouble: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.DOUBLE) - public val KtType.isChar: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.CHAR) - public val KtType.isBoolean: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.BOOLEAN) - public val KtType.isString: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.STRING) - public val KtType.isCharSequence: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.CHAR_SEQUENCE) - public val KtType.isAny: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.ANY) - public val KtType.isNothing: Boolean get() = isClassTypeWithClassId(DefaultTypeClassIds.NOTHING) + public val KtType.isUnit: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.UNIT) } + public val KtType.isInt: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.INT) } + public val KtType.isLong: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.LONG) } + public val KtType.isShort: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.SHORT) } + public val KtType.isByte: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.BYTE) } + public val KtType.isFloat: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.FLOAT) } + public val KtType.isDouble: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.DOUBLE) } + public val KtType.isChar: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.CHAR) } + public val KtType.isBoolean: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.BOOLEAN) } + public val KtType.isString: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.STRING) } + public val KtType.isCharSequence: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.CHAR_SEQUENCE) } + public val KtType.isAny: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.ANY) } + public val KtType.isNothing: Boolean get() = withValidityAssertion { isClassTypeWithClassId(DefaultTypeClassIds.NOTHING) } - public val KtType.isUInt: Boolean get() = isClassTypeWithClassId(StandardNames.FqNames.uInt) - public val KtType.isULong: Boolean get() = isClassTypeWithClassId(StandardNames.FqNames.uLong) - public val KtType.isUShort: Boolean get() = isClassTypeWithClassId(StandardNames.FqNames.uShort) - public val KtType.isUByte: Boolean get() = isClassTypeWithClassId(StandardNames.FqNames.uByte) + public val KtType.isUInt: Boolean get() = withValidityAssertion { isClassTypeWithClassId(StandardNames.FqNames.uInt) } + public val KtType.isULong: Boolean get() = withValidityAssertion { isClassTypeWithClassId(StandardNames.FqNames.uLong) } + public val KtType.isUShort: Boolean get() = withValidityAssertion { isClassTypeWithClassId(StandardNames.FqNames.uShort) } + public val KtType.isUByte: Boolean get() = withValidityAssertion { isClassTypeWithClassId(StandardNames.FqNames.uByte) } /** Gets the class symbol backing the given type, if available. */ public val KtType.expandedClassSymbol: KtClassOrObjectSymbol? - get() { + get() = withValidityAssertion { return when (this) { is KtNonErrorClassType -> when (val classSymbol = classSymbol) { is KtClassOrObjectSymbol -> classSymbol @@ -99,32 +100,34 @@ public interface KtTypeInfoProviderMixIn : KtAnalysisSessionMixIn { } } - public fun KtType.isClassTypeWithClassId(classId: ClassId): Boolean { + public fun KtType.isClassTypeWithClassId(classId: ClassId): Boolean = withValidityAssertion { if (this !is KtNonErrorClassType) return false return this.classId == classId } public val KtType.isPrimitive: Boolean - get() { + get() = withValidityAssertion { if (this !is KtNonErrorClassType) return false return this.classId in DefaultTypeClassIds.PRIMITIVES } public val KtType.defaultInitializer: String? - get() = when { - isMarkedNullable -> "null" - isInt || isLong || isShort || isByte -> "0" - isFloat -> "0.0f" - isDouble -> "0.0" - isChar -> "'\\u0000'" - isBoolean -> "false" - isUnit -> "Unit" - isString -> "\"\"" - isUInt -> "0.toUInt()" - isULong -> "0.toULong()" - isUShort -> "0.toUShort()" - isUByte -> "0.toUByte()" - else -> null + get() = withValidityAssertion { + when { + isMarkedNullable -> "null" + isInt || isLong || isShort || isByte -> "0" + isFloat -> "0.0f" + isDouble -> "0.0" + isChar -> "'\\u0000'" + isBoolean -> "false" + isUnit -> "Unit" + isString -> "\"\"" + isUInt -> "0.toUInt()" + isULong -> "0.toULong()" + isUShort -> "0.toUShort()" + isUByte -> "0.toUByte()" + else -> null + } } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt index 1be058b1e4e..efee8c42fe0 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.types.KtFlexibleType @@ -43,7 +44,7 @@ public abstract class KtTypeProvider : KtAnalysisSessionComponent() { public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { public val builtinTypes: KtBuiltinTypes - get() = analysisSession.typeProvider.builtinTypes + get() = withValidityAssertion { analysisSession.typeProvider.builtinTypes } /** * Approximates [KtType] with the a supertype which can be rendered in a source code @@ -52,12 +53,13 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { * Otherwise, for type `T` return type `S` such `T <: S` and `T` and every it type argument is [org.jetbrains.kotlin.analysis.api.types.KtDenotableType]` */ public fun KtType.approximateToSuperPublicDenotable(): KtType? = - analysisSession.typeProvider.approximateToSuperPublicDenotableType(this) + withValidityAssertion { analysisSession.typeProvider.approximateToSuperPublicDenotableType(this) } - public fun KtType.approximateToSuperPublicDenotableOrSelf(): KtType = approximateToSuperPublicDenotable() ?: this + public fun KtType.approximateToSuperPublicDenotableOrSelf(): KtType = + withValidityAssertion { approximateToSuperPublicDenotable() ?: this } public fun KtNamedClassOrObjectSymbol.buildSelfClassType(): KtType = - analysisSession.typeProvider.buildSelfClassType(this) + withValidityAssertion { analysisSession.typeProvider.buildSelfClassType(this) } /** * Computes the common super type of the given collection of [KtType]. @@ -65,7 +67,7 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { * If the collection is empty, it returns `null`. */ public fun commonSuperType(types: Collection): KtType? = - analysisSession.typeProvider.commonSuperType(types) + withValidityAssertion { analysisSession.typeProvider.commonSuperType(types) } /** * Resolve [KtTypeReference] and return corresponding [KtType] if resolved. @@ -73,7 +75,7 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { * This may raise an exception if the resolution ends up with an unexpected kind. */ public fun KtTypeReference.getKtType(): KtType = - analysisSession.typeProvider.getKtType(this) + withValidityAssertion { analysisSession.typeProvider.getKtType(this) } /** * Resolve [KtDoubleColonExpression] and return [KtType] of its receiver. @@ -81,23 +83,24 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { * Return `null` if the resolution fails or the resolved callable reference is not a reflection type. */ public fun KtDoubleColonExpression.getReceiverKtType(): KtType? = - analysisSession.typeProvider.getReceiverTypeForDoubleColonExpression(this) + withValidityAssertion { analysisSession.typeProvider.getReceiverTypeForDoubleColonExpression(this) } public fun KtType.withNullability(newNullability: KtTypeNullability): KtType = - analysisSession.typeProvider.withNullability(this, newNullability) + withValidityAssertion { analysisSession.typeProvider.withNullability(this, newNullability) } - public fun KtType.upperBoundIfFlexible(): KtType = (this as? KtFlexibleType)?.upperBound ?: this - public fun KtType.lowerBoundIfFlexible(): KtType = (this as? KtFlexibleType)?.lowerBound ?: this + public fun KtType.upperBoundIfFlexible(): KtType = withValidityAssertion { (this as? KtFlexibleType)?.upperBound ?: this } + public fun KtType.lowerBoundIfFlexible(): KtType = withValidityAssertion { (this as? KtFlexibleType)?.lowerBound ?: this } /** Check whether this type is compatible with that type. If they are compatible, it means they can have a common subtype. */ - public fun KtType.hasCommonSubTypeWith(that: KtType): Boolean = analysisSession.typeProvider.haveCommonSubtype(this, that) + public fun KtType.hasCommonSubTypeWith(that: KtType): Boolean = + withValidityAssertion { analysisSession.typeProvider.haveCommonSubtype(this, that) } /** * Gets all the implicit receiver types available at the given position. The type of the outermost receiver appears at the beginning * of the returned list. */ public fun getImplicitReceiverTypesAtPosition(position: KtElement): List = - analysisSession.typeProvider.getImplicitReceiverTypesAtPosition(position) + withValidityAssertion { analysisSession.typeProvider.getImplicitReceiverTypesAtPosition(position) } /** * Gets the direct super types of the given type. For example, given `MutableList`, this returns `List` and @@ -110,7 +113,7 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { * `Collection`. With approximation set to true, `Collection` is returned instead. */ public fun KtType.getDirectSuperTypes(shouldApproximate: Boolean = false): List = - analysisSession.typeProvider.getDirectSuperTypes(this, shouldApproximate) + withValidityAssertion { analysisSession.typeProvider.getDirectSuperTypes(this, shouldApproximate) } /** * Gets all the super types of the given type. The returned result is ordered by a BFS traversal of the class hierarchy, without any @@ -119,7 +122,7 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { * @param shouldApproximate see [getDirectSuperTypes] */ public fun KtType.getAllSuperTypes(shouldApproximate: Boolean = false): List = - analysisSession.typeProvider.getAllSuperTypes(this, shouldApproximate) + withValidityAssertion { analysisSession.typeProvider.getAllSuperTypes(this, shouldApproximate) } /** * This function is provided for a few use-cases where it's hard to go without it. @@ -134,7 +137,7 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { @Suppress("DeprecatedCallableAddReplaceWith") @Deprecated("Avoid using this function") public fun KtCallableSymbol.getDispatchReceiverType(): KtType? = - analysisSession.typeProvider.getDispatchReceiverType(this) + withValidityAssertion { analysisSession.typeProvider.getDispatchReceiverType(this) } } @Suppress("PropertyName") diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtVisibilityCheckerMixIn.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtVisibilityCheckerMixIn.kt index 058d858ca39..73d3122b12a 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtVisibilityCheckerMixIn.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtVisibilityCheckerMixIn.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.components import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.psi.KtExpression @@ -25,6 +26,7 @@ public interface KtVisibilityCheckerMixIn : KtAnalysisSessionMixIn { useSiteFile: KtFileSymbol, receiverExpression: KtExpression? = null, position: PsiElement - ): Boolean = + ): Boolean = withValidityAssertion { analysisSession.visibilityChecker.isVisible(candidateSymbol, useSiteFile, position, receiverExpression) + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/diagnostics/KtDiagnostic.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/diagnostics/KtDiagnostic.kt index fa1bac2e447..d3770905470 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/diagnostics/KtDiagnostic.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/diagnostics/KtDiagnostic.kt @@ -10,6 +10,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import kotlin.reflect.KClass public interface KtDiagnostic : KtLifetimeOwner { @@ -29,7 +30,7 @@ public class KtNonBoundToPsiErrorDiagnostic( override val defaultMessage: String, override val token: KtLifetimeToken, ) : KtDiagnostic { - override val severity: Severity get() = Severity.ERROR + override val severity: Severity get() = withValidityAssertion { Severity.ERROR } } public fun KtDiagnostic.getDefaultMessageWithFactoryName(): String = diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtClassLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtClassLikeSymbol.kt index da7586d35ed..0d13e92cd43 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtClassLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtClassLikeSymbol.kt @@ -40,7 +40,7 @@ public abstract class KtTypeAliasSymbol : KtClassLikeSymbol(), KtSymbolWithVisibility, KtNamedSymbol { - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.TOP_LEVEL + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.TOP_LEVEL } /** * Returns type from right-hand site of type alias @@ -60,10 +60,10 @@ public sealed class KtClassOrObjectSymbol : KtClassLikeSymbol(), KtSymbolWithMem } public abstract class KtAnonymousObjectSymbol : KtClassOrObjectSymbol() { - final override val classKind: KtClassKind get() = KtClassKind.ANONYMOUS_OBJECT - final override val classIdIfNonLocal: ClassId? get() = null - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL - final override val name: Name? get() = null + final override val classKind: KtClassKind get() = withValidityAssertion { KtClassKind.ANONYMOUS_OBJECT } + final override val classIdIfNonLocal: ClassId? get() = withValidityAssertion { null } + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.LOCAL } + final override val name: Name? get() = withValidityAssertion { null } final override val typeParameters: List get() = withValidityAssertion { emptyList() } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt index 610ae98b383..858db808df6 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt @@ -26,8 +26,8 @@ public abstract class KtFunctionLikeSymbol : KtCallableSymbol(), KtSymbolWithKin } public abstract class KtAnonymousFunctionSymbol : KtFunctionLikeSymbol() { - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL - final override val callableIdIfNonLocal: CallableId? get() = null + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.LOCAL } + final override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { null } final override val typeParameters: List get() = withValidityAssertion { emptyList() } @@ -36,7 +36,7 @@ public abstract class KtAnonymousFunctionSymbol : KtFunctionLikeSymbol() { } public abstract class KtSamConstructorSymbol : KtFunctionLikeSymbol(), KtNamedSymbol { - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.SAM_CONSTRUCTOR + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.SAM_CONSTRUCTOR } abstract override fun createPointer(): KtSymbolPointer } @@ -70,10 +70,10 @@ public abstract class KtConstructorSymbol : KtFunctionLikeSymbol(), public abstract val isPrimary: Boolean public abstract val containingClassIdIfNonLocal: ClassId? - final override val callableIdIfNonLocal: CallableId? get() = null - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.CLASS_MEMBER - final override val isExtension: Boolean get() = false - final override val receiverType: KtType? get() = null + final override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { null } + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.CLASS_MEMBER } + final override val isExtension: Boolean get() = withValidityAssertion { false } + final override val receiverType: KtType? get() = withValidityAssertion { null } abstract override fun createPointer(): KtSymbolPointer } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtPropertyAccessorSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtPropertyAccessorSymbol.kt index 0453ff2b701..4553b7044bf 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtPropertyAccessorSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtPropertyAccessorSymbol.kt @@ -15,7 +15,7 @@ public sealed class KtPropertyAccessorSymbol : KtFunctionLikeSymbol(), KtSymbolWithVisibility, KtSymbolWithKind { - final override val isExtension: Boolean get() = false + final override val isExtension: Boolean get() = withValidityAssertion { false } final override val typeParameters: List get() = withValidityAssertion { emptyList() } @@ -25,7 +25,7 @@ public sealed class KtPropertyAccessorSymbol : KtFunctionLikeSymbol(), public abstract val isOverride: Boolean public abstract val hasBody: Boolean - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.ACCESSOR + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.ACCESSOR } abstract override fun createPointer(): KtSymbolPointer } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt index 241fd438fb8..83cdf251637 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.symbols import org.jetbrains.kotlin.analysis.api.components.KtAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.components.KtAnalysisSessionMixIn +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -57,7 +58,7 @@ public abstract class KtSymbolProvider : KtAnalysisSessionComponent() { public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn { public fun KtDeclaration.getSymbol(): KtSymbol = - analysisSession.symbolProvider.getSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getSymbol(this) } /** * Creates [KtVariableLikeSymbol] by [KtParameter]. @@ -74,7 +75,7 @@ public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn { * Otherwise, returns [KtValueParameterSymbol]. */ public fun KtParameter.getParameterSymbol(): KtVariableLikeSymbol = - analysisSession.symbolProvider.getParameterSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getParameterSymbol(this) } /** * Creates [KtFunctionLikeSymbol] by [KtNamedFunction] @@ -83,55 +84,55 @@ public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn { * Otherwise, returns [KtFunctionSymbol] */ public fun KtNamedFunction.getFunctionLikeSymbol(): KtFunctionLikeSymbol = - analysisSession.symbolProvider.getFunctionLikeSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getFunctionLikeSymbol(this) } public fun KtConstructor<*>.getConstructorSymbol(): KtConstructorSymbol = - analysisSession.symbolProvider.getConstructorSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getConstructorSymbol(this) } public fun KtTypeParameter.getTypeParameterSymbol(): KtTypeParameterSymbol = - analysisSession.symbolProvider.getTypeParameterSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getTypeParameterSymbol(this) } public fun KtTypeAlias.getTypeAliasSymbol(): KtTypeAliasSymbol = - analysisSession.symbolProvider.getTypeAliasSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getTypeAliasSymbol(this) } public fun KtEnumEntry.getEnumEntrySymbol(): KtEnumEntrySymbol = - analysisSession.symbolProvider.getEnumEntrySymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getEnumEntrySymbol(this) } public fun KtNamedFunction.getAnonymousFunctionSymbol(): KtAnonymousFunctionSymbol = - analysisSession.symbolProvider.getAnonymousFunctionSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getAnonymousFunctionSymbol(this) } public fun KtFunctionLiteral.getAnonymousFunctionSymbol(): KtAnonymousFunctionSymbol = - analysisSession.symbolProvider.getAnonymousFunctionSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getAnonymousFunctionSymbol(this) } public fun KtProperty.getVariableSymbol(): KtVariableSymbol = - analysisSession.symbolProvider.getVariableSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getVariableSymbol(this) } public fun KtObjectLiteralExpression.getAnonymousObjectSymbol(): KtAnonymousObjectSymbol = - analysisSession.symbolProvider.getAnonymousObjectSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getAnonymousObjectSymbol(this) } public fun KtClassOrObject.getClassOrObjectSymbol(): KtClassOrObjectSymbol = - analysisSession.symbolProvider.getClassOrObjectSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getClassOrObjectSymbol(this) } /** Gets the corresponding class or object symbol or null if the given [KtClassOrObject] is an enum entry. */ public fun KtClassOrObject.getNamedClassOrObjectSymbol(): KtNamedClassOrObjectSymbol? = - analysisSession.symbolProvider.getNamedClassOrObjectSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getNamedClassOrObjectSymbol(this) } public fun KtPropertyAccessor.getPropertyAccessorSymbol(): KtPropertyAccessorSymbol = - analysisSession.symbolProvider.getPropertyAccessorSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getPropertyAccessorSymbol(this) } public fun KtFile.getFileSymbol(): KtFileSymbol = - analysisSession.symbolProvider.getFileSymbol(this) + withValidityAssertion { analysisSession.symbolProvider.getFileSymbol(this) } /** * @return symbol with specified [this@getClassOrObjectSymbolByClassId] or `null` in case such symbol is not found */ public fun ClassId.getCorrespondingToplevelClassOrObjectSymbol(): KtClassOrObjectSymbol? = - analysisSession.symbolProvider.getClassOrObjectSymbolByClassId(this) + withValidityAssertion { analysisSession.symbolProvider.getClassOrObjectSymbolByClassId(this) } public fun FqName.getContainingCallableSymbolsWithName(name: Name): Sequence = - analysisSession.symbolProvider.getTopLevelCallableSymbols(this, name) + withValidityAssertion { analysisSession.symbolProvider.getTopLevelCallableSymbols(this, name) } @Suppress("PropertyName") public val ROOT_PACKAGE_SYMBOL: KtPackageSymbol - get() = analysisSession.symbolProvider.ROOT_PACKAGE_SYMBOL + get() = withValidityAssertion { analysisSession.symbolProvider.ROOT_PACKAGE_SYMBOL } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt index 84c7f42f291..11df44dd59a 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt @@ -35,13 +35,13 @@ public sealed class KtVariableLikeSymbol : KtCallableSymbol(), KtNamedSymbol, Kt public abstract class KtBackingFieldSymbol : KtVariableLikeSymbol() { public abstract val owningProperty: KtKotlinPropertySymbol - final override val name: Name get() = fieldName - final override val psi: PsiElement? get() = null - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL - override val origin: KtSymbolOrigin get() = KtSymbolOrigin.PROPERTY_BACKING_FIELD - final override val callableIdIfNonLocal: CallableId? get() = null - final override val isExtension: Boolean get() = false - final override val receiverType: KtType? get() = null + final override val name: Name get() = withValidityAssertion { fieldName } + final override val psi: PsiElement? get() = withValidityAssertion { null } + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.LOCAL } + override val origin: KtSymbolOrigin get() = withValidityAssertion { KtSymbolOrigin.PROPERTY_BACKING_FIELD } + final override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { null } + final override val isExtension: Boolean get() = withValidityAssertion { false } + final override val receiverType: KtType? get() = withValidityAssertion { null } final override val typeParameters: List get() = withValidityAssertion { emptyList() } @@ -55,9 +55,9 @@ public abstract class KtBackingFieldSymbol : KtVariableLikeSymbol() { public abstract class KtEnumEntrySymbol : KtVariableLikeSymbol(), KtSymbolWithMembers, KtSymbolWithKind { - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.CLASS_MEMBER - final override val isExtension: Boolean get() = false - final override val receiverType: KtType? get() = null + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.CLASS_MEMBER } + final override val isExtension: Boolean get() = withValidityAssertion { false } + final override val receiverType: KtType? get() = withValidityAssertion { null } final override val typeParameters: List get() = withValidityAssertion { emptyList() } @@ -79,9 +79,9 @@ public abstract class KtJavaFieldSymbol : KtSymbolWithModality, KtSymbolWithVisibility, KtSymbolWithKind { - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.CLASS_MEMBER - final override val isExtension: Boolean get() = false - final override val receiverType: KtType? get() = null + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.CLASS_MEMBER } + final override val isExtension: Boolean get() = withValidityAssertion { false } + final override val receiverType: KtType? get() = withValidityAssertion { null } final override val typeParameters: List get() = withValidityAssertion { emptyList() } @@ -133,10 +133,10 @@ public abstract class KtKotlinPropertySymbol : KtPropertySymbol() { } public abstract class KtSyntheticJavaPropertySymbol : KtPropertySymbol() { - final override val hasBackingField: Boolean get() = true - final override val isDelegatedProperty: Boolean get() = false - final override val hasGetter: Boolean get() = true - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.CLASS_MEMBER + final override val hasBackingField: Boolean get() = withValidityAssertion { true } + final override val isDelegatedProperty: Boolean get() = withValidityAssertion { false } + final override val hasGetter: Boolean get() = withValidityAssertion { true } + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.CLASS_MEMBER } abstract override val getter: KtPropertyGetterSymbol @@ -147,9 +147,9 @@ public abstract class KtSyntheticJavaPropertySymbol : KtPropertySymbol() { } public abstract class KtLocalVariableSymbol : KtVariableSymbol(), KtSymbolWithKind { - final override val callableIdIfNonLocal: CallableId? get() = null - final override val isExtension: Boolean get() = false - final override val receiverType: KtType? get() = null + final override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { null } + final override val isExtension: Boolean get() = withValidityAssertion { false } + final override val receiverType: KtType? get() = withValidityAssertion { null } final override val typeParameters: List get() = withValidityAssertion { emptyList() } @@ -158,10 +158,10 @@ public abstract class KtLocalVariableSymbol : KtVariableSymbol(), KtSymbolWithKi } public abstract class KtValueParameterSymbol : KtVariableLikeSymbol(), KtSymbolWithKind, KtAnnotatedSymbol { - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL - final override val callableIdIfNonLocal: CallableId? get() = null - final override val isExtension: Boolean get() = false - final override val receiverType: KtType? get() = null + final override val symbolKind: KtSymbolKind get() = withValidityAssertion { KtSymbolKind.LOCAL } + final override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { null } + final override val isExtension: Boolean get() = withValidityAssertion { false } + final override val receiverType: KtType? get() = withValidityAssertion { null } final override val typeParameters: List get() = withValidityAssertion { emptyList() } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtSubstitutor.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtSubstitutor.kt index ac2ad42a16a..46a91c856b2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtSubstitutor.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtSubstitutor.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion public interface KtSubstitutor : KtLifetimeOwner { - public fun substituteOrSelf(type: KtType): KtType = substituteOrNull(type) ?: type + public fun substituteOrSelf(type: KtType): KtType = withValidityAssertion { substituteOrNull(type) ?: type } public fun substituteOrNull(type: KtType): KtType? public class Empty(override val token: KtLifetimeToken) : KtSubstitutor { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt index 26f3b9ce6da..dfbc67c0343 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.types import org.jetbrains.kotlin.analysis.api.KtTypeArgument import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotated +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.name.ClassId @@ -66,7 +67,7 @@ public abstract class KtCapturedType : KtType { public abstract class KtDefinitelyNotNullType : KtType { public abstract val original: KtType - final override val nullability: KtTypeNullability get() = KtTypeNullability.NON_NULLABLE + final override val nullability: KtTypeNullability get() = withValidityAssertion { KtTypeNullability.NON_NULLABLE } override fun toString(): String = asStringForDebugging() }