From f431da2a665369f95b987e0a59ee29bc4318f796 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Mon, 10 Aug 2020 12:14:01 +0300 Subject: [PATCH] Reapply "Introduce @FrontendInternals annotation"" This reverts commit 9ca4717d112f1a935c989bfe93acf0532e500fa5. ^KT-39643 Fixed --- .../org/jetbrains/kotlin/idea/apiMarkers.kt | 16 +++++++++++++ .../kotlin/idea/analysis/AnalyzerUtil.kt | 3 +++ .../idea/caches/resolve/resolutionApi.kt | 2 ++ .../codeInsight/ReferenceVariantsHelper.kt | 3 +++ .../idea/imports/OptimizedImportsBuilder.kt | 2 ++ .../kotlin/idea/kdoc/resolveKDocLink.kt | 3 +++ .../introduce/ExtractableSubstringInfo.kt | 4 ++-- .../kotlin/idea/resolve/ResolutionFacade.kt | 7 ++++++ .../idea/resolve/frontendServiceHelpers.kt | 24 +++++++++++++++++++ .../jetbrains/kotlin/idea/util/CallType.kt | 10 +++++--- .../idea/util/ShadowedDeclarationsFilter.kt | 10 +++++--- .../jetbrains/kotlin/idea/util/TypeUtils.kt | 2 ++ .../jetbrains/kotlin/idea/util/scopeUtils.kt | 2 ++ .../lightClasses/IDELightClassContexts.kt | 3 +++ .../resolve/IDELightClassGenerationSupport.kt | 6 ++++- .../resolve/ModuleResolutionFacadeImpl.kt | 6 +++++ .../resolve/ResolutionFacadeWithDebugInfo.kt | 5 ++++ .../resolve/util/JavaResolveExtension.kt | 2 ++ .../kotlin/idea/completion/KeywordValues.kt | 3 +++ .../kotlin/idea/completion/smart/Utils.kt | 2 ++ .../kotlin/idea/core/KotlinIndicesHelper.kt | 3 +++ .../kotlin/idea/core/SmartCastCalculator.kt | 4 ++-- .../org/jetbrains/kotlin/idea/core/Utils.kt | 9 +++++-- .../kotlin/idea/core/psiModificationUtils.kt | 5 +++- .../compilation/CodeFragmentCompiler.kt | 3 +++ .../idea/KotlinDocumentationProvider.kt | 1 + .../KotlinExpressionTypeProvider.kt | 5 ++-- .../ConflictingExtensionPropertyInspection.kt | 2 ++ .../OverridingDeprecatedMemberInspection.kt | 2 ++ ...formExtensionReceiverOfInlineInspection.kt | 7 +++--- .../RedundantRequireNotNullCallInspection.kt | 17 +++++++++---- .../RedundantSamConstructorInspection.kt | 4 ++++ ...ReplaceCallWithBinaryOperatorInspection.kt | 7 +++--- .../UsePropertyAccessSyntaxIntention.kt | 10 ++++++-- .../branchedTransformations/IfThenUtils.kt | 6 ++--- .../KotlinFunctionParameterInfoHandler.kt | 6 +++-- .../kotlin/idea/quickfix/ExclExclCallFixes.kt | 5 ++-- .../quickfix/RemovePartsFromPropertyFix.kt | 2 ++ .../callableBuilder/CallableBuilder.kt | 3 +++ ...peParameterByUnresolvedRefActionFactory.kt | 2 ++ ...meterUnmatchedTypeArgumentActionFactory.kt | 2 ++ .../ReplaceWithAnnotationAnalyzer.kt | 5 +++- .../extractionEngine/ExtractionData.kt | 5 ++-- .../extractionEngine/inferParameterInfo.kt | 5 ++-- .../memberInfo/KotlinMemberInfoStorage.kt | 3 +++ .../refactoring/rename/renameConflictUtils.kt | 3 +++ .../idea/util/ImportInsertHelperImpl.kt | 5 ++-- .../kotlin/idea/util/quickfixUtil.kt | 5 ++-- .../AbstractMultiModuleIdeResolveTest.kt | 7 +++--- .../AbstractOutOfBlockModificationTest.kt | 3 +++ .../NullabilityBoundTypeEnhancer.kt | 5 ++-- .../impl/KotlinResolutionFacadeForRepl.kt | 5 ++++ 52 files changed, 214 insertions(+), 57 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/idea/apiMarkers.kt create mode 100644 idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/frontendServiceHelpers.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/idea/apiMarkers.kt b/compiler/frontend/src/org/jetbrains/kotlin/idea/apiMarkers.kt new file mode 100644 index 00000000000..c6b354b73e4 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/idea/apiMarkers.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea + +/** + * Indicates sensitive frontend API, which should be used with caution to avoid invariant violation. + * Use sites of this annotation include all methods for direct access to frontend components. + * Please make sure that components don't receive resolution results (descriptors etc.) from different resolution facade for processing. + * The simplest way to do so is to explicitly provide the same resolution facade to all related computations. + * Not following this rule may lead to obscure memory leaks and other potential problems. + */ +@RequiresOptIn +annotation class FrontendInternals diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/analysis/AnalyzerUtil.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/analysis/AnalyzerUtil.kt index 9661e14ff21..a6648b029c6 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/analysis/AnalyzerUtil.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/analysis/AnalyzerUtil.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.analysis +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService @@ -27,6 +28,7 @@ import org.jetbrains.kotlin.types.expressions.KotlinTypeInfo import org.jetbrains.kotlin.types.expressions.PreliminaryDeclarationVisitor @JvmOverloads +@OptIn(FrontendInternals::class) fun KtExpression.computeTypeInfoInContext( scope: LexicalScope, contextExpression: KtExpression = this, @@ -44,6 +46,7 @@ fun KtExpression.computeTypeInfoInContext( } @JvmOverloads +@OptIn(FrontendInternals::class) fun KtExpression.analyzeInContext( scope: LexicalScope, contextExpression: KtExpression = this, diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt index 865bc68983b..5c4e2c629a3 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* @@ -188,6 +189,7 @@ fun KtFile.analyzeWithAllCompilerChecks(vararg extraFiles: KtFile): AnalysisResu fun KtElement.analyzeWithAllCompilerChecks(): AnalysisResult = getResolutionFacade().analyzeWithAllCompilerChecks(listOf(this)) // this method don't check visibility and collect all descriptors with given fqName +@OptIn(FrontendInternals::class) fun ResolutionFacade.resolveImportReference( moduleDescriptor: ModuleDescriptor, fqName: FqName diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index e53289ab831..27fc58cf734 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.idea.util.* @@ -40,6 +41,7 @@ import org.jetbrains.kotlin.types.expressions.DoubleColonLHS import org.jetbrains.kotlin.types.typeUtil.isUnit import java.util.* +@OptIn(FrontendInternals::class) class ReferenceVariantsHelper( private val bindingContext: BindingContext, private val resolutionFacade: ResolutionFacade, @@ -463,6 +465,7 @@ private fun MemberScope.collectStaticMembers( ) } +@OptIn(FrontendInternals::class) fun ResolutionScope.collectSyntheticStaticMembersAndConstructors( resolutionFacade: ResolutionFacade, kindFilter: DescriptorKindFilter, diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt index 523fd8caef4..3d096b217ae 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.analysis.analyzeAsReplacement import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -288,6 +289,7 @@ class OptimizedImportsBuilder( return fileWithImports.getFileResolutionScope() } + @OptIn(FrontendInternals::class) private fun KtFile.getFileResolutionScope() = getResolutionFacade().frontendService().getFileScopes(this).importingScope diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt index 6d79ab5ee2f..cb6eba64a01 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.kdoc import com.intellij.openapi.components.ServiceManager import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.getFileResolutionScope @@ -119,6 +120,8 @@ private fun resolveDefaultKDocLink( } val moduleDescriptor = fromDescriptor.module + + @OptIn(FrontendInternals::class) val qualifiedExpressionResolver = resolutionFacade.getFrontendService(moduleDescriptor, QualifiedExpressionResolver::class.java) val contextElement = DescriptorToSourceUtils.descriptorToDeclaration(fromDescriptor) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractableSubstringInfo.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractableSubstringInfo.kt index 2316e1331c0..b586a5e1832 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractableSubstringInfo.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractableSubstringInfo.kt @@ -9,9 +9,9 @@ import com.intellij.openapi.util.Key import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset @@ -44,7 +44,7 @@ class ExtractableSubstringInfo( val tempContext = expr.analyzeInContext(scope, template) val trace = DelegatingBindingTrace(tempContext, "Evaluate '$literal'") - val languageVersionSettings = facade.getFrontendService(LanguageVersionSettings::class.java) + val languageVersionSettings = facade.getLanguageVersionSettings() val value = ConstantExpressionEvaluator(module, languageVersionSettings, facade.project).evaluateExpression(expr, trace) if (value == null || value.isError) return stringType diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt index 6e7199767ec..91b8fb6c346 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ResolverForProject import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.BindingContext @@ -30,19 +31,25 @@ interface ResolutionFacade { val moduleDescriptor: ModuleDescriptor // get service for the module this resolution was created for + @FrontendInternals fun getFrontendService(serviceClass: Class): T fun getIdeService(serviceClass: Class): T // get service for the module defined by PsiElement/ModuleDescriptor passed as parameter + @FrontendInternals fun getFrontendService(element: PsiElement, serviceClass: Class): T + + @FrontendInternals fun tryGetFrontendService(element: PsiElement, serviceClass: Class): T? + @FrontendInternals fun getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class): T fun getResolverForProject(): ResolverForProject } +@FrontendInternals inline fun ResolutionFacade.frontendService(): T = this.getFrontendService(T::class.java) inline fun ResolutionFacade.ideService(): T = this.getIdeService(T::class.java) \ No newline at end of file diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/frontendServiceHelpers.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/frontendServiceHelpers.kt new file mode 100644 index 00000000000..b356ba2ea91 --- /dev/null +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/frontendServiceHelpers.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.resolve + +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.idea.FrontendInternals +import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory + +/** + * Helper methods for commonly used frontend components. + * Use them to avoid explicit opt-ins. + * Before adding a new helper method please make sure component doesn't have fragile invariants that can be violated by external use. + */ + +@OptIn(FrontendInternals::class) +fun ResolutionFacade.getLanguageVersionSettings(): LanguageVersionSettings = + frontendService() + +@OptIn(FrontendInternals::class) +fun ResolutionFacade.getDataFlowValueFactory(): DataFlowValueFactory = + frontendService() diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt index fc235c90576..a3bbaedede7 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt @@ -9,8 +9,11 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression @@ -251,7 +254,7 @@ fun CallTypeAndReceiver<*, *>.receiverTypesWithIndex( stableSmartCastsOnly: Boolean, withImplicitReceiversWhenExplicitPresent: Boolean = false ): List? { - val languageVersionSettings = resolutionFacade.frontendService() + val languageVersionSettings = resolutionFacade.getLanguageVersionSettings() val receiverExpression: KtExpression? when (this) { @@ -345,6 +348,7 @@ fun CallTypeAndReceiver<*, *>.receiverTypesWithIndex( return result } +@OptIn(FrontendInternals::class) private fun receiverValueTypes( receiverValue: ReceiverValue, dataFlowInfo: DataFlowInfo, @@ -353,8 +357,8 @@ private fun receiverValueTypes( stableSmartCastsOnly: Boolean, resolutionFacade: ResolutionFacade ): List { - val languageVersionSettings = resolutionFacade.frontendService() - val dataFlowValueFactory = resolutionFacade.frontendService() + val languageVersionSettings = resolutionFacade.getLanguageVersionSettings() + val dataFlowValueFactory = resolutionFacade.getDataFlowValueFactory() val smartCastManager = resolutionFacade.frontendService() val dataFlowValue = dataFlowValueFactory.createDataFlowValue(receiverValue, bindingContext, moduleDescriptor) return if (dataFlowValue.isStable || !stableSmartCastsOnly) { // we don't include smart cast receiver types for "unstable" receiver value to mark members grayed diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index 7900d7274c2..41b3af83645 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -7,9 +7,12 @@ package org.jetbrains.kotlin.idea.util import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace @@ -18,7 +21,6 @@ import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode import org.jetbrains.kotlin.resolve.calls.context.ContextDependency -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.scopes.ExplicitImportsScope import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue @@ -192,9 +194,11 @@ class ShadowedDeclarationsFilter( val context = BasicCallResolutionContext.create( bindingTrace, scope, newCall, TypeUtils.NO_EXPECTED_TYPE, dataFlowInfo, ContextDependency.INDEPENDENT, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, - false, /* languageVersionSettings */ resolutionFacade.frontendService(), - resolutionFacade.frontendService() + false, resolutionFacade.getLanguageVersionSettings(), + resolutionFacade.getDataFlowValueFactory() ) + + @OptIn(FrontendInternals::class) val callResolver = resolutionFacade.frontendService() val results = if (isFunction) callResolver.resolveFunctionCall(context) else callResolver.resolveSimpleProperty(context) val resultingDescriptors = results.resultingCalls.map { it.resultingDescriptor } diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt index c71b07cc15e..bbc28ba809d 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.builtins.replaceReturnType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -204,6 +205,7 @@ fun KotlinType.isAbstract(): Boolean { * NOTE: this is a very shaky implementation of [PsiType] to [KotlinType] conversion, * produced types are fakes and are usable only for code generation. Please be careful using this method. */ +@OptIn(FrontendInternals::class) fun PsiType.resolveToKotlinType(resolutionFacade: ResolutionFacade): KotlinType { if (this == PsiType.NULL) { return resolutionFacade.moduleDescriptor.builtIns.nullableAnyType diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/scopeUtils.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/scopeUtils.kt index 693bc6e5679..652b9ebd7e4 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/scopeUtils.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/scopeUtils.kt @@ -11,6 +11,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService @@ -85,6 +86,7 @@ fun KtElement.getResolutionScope(): LexicalScope { return getResolutionScope(context, resolutionFacade) } +@OptIn(FrontendInternals::class) fun ResolutionFacade.getFileResolutionScope(file: KtFile): LexicalScope { return frontendService().getFileResolutionScope(file) } \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt index 1dce10cc689..0189152cb63 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.frontend.di.configureModule +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.lightClasses.IDELightClassConstructionContext.Mode.EXACT import org.jetbrains.kotlin.idea.caches.lightClasses.IDELightClassConstructionContext.Mode.LIGHT import org.jetbrains.kotlin.idea.caches.lightClasses.annotations.KOTLINX_SERIALIZABLE_FQ_NAME @@ -91,6 +92,7 @@ internal object IDELightClassContexts { val bindingContext = if (classOrObject is KtClass && classOrObject.isAnnotation()) { // need to make sure default values for parameters are resolved // because java resolve depends on whether there is a default value for an annotation attribute + @OptIn(FrontendInternals::class) resolutionFacade.getFrontendService(ResolveElementCache::class.java) .resolvePrimaryConstructorParametersDefaultValues(classOrObject) } else { @@ -136,6 +138,7 @@ internal object IDELightClassContexts { fun contextForFacade(files: List): LightClassConstructionContext { + @OptIn(FrontendInternals::class) val resolveSession = files.first().getResolutionFacade().getFrontendService(ResolveSession::class.java) forceResolvePackageDeclarations(files, resolveSession) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index d839df3456e..77610dbee8e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.lightClasses.IDELightClassContexts import org.jetbrains.kotlin.idea.caches.lightClasses.LazyLightClassDataHolder import org.jetbrains.kotlin.idea.project.languageVersionSettings @@ -90,7 +91,9 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG return null } - override val deprecationResolver: DeprecationResolver get() = resolutionFacade.getFrontendService(DeprecationResolver::class.java) + @OptIn(FrontendInternals::class) + override val deprecationResolver: DeprecationResolver + get() = resolutionFacade.getFrontendService(DeprecationResolver::class.java) override val typeMapper: KotlinTypeMapper by lazyPub { @@ -205,6 +208,7 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG ) } + @OptIn(FrontendInternals::class) private fun KtElement.getDiagnosticsHolder() = getResolutionFacade().frontendService() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleResolutionFacadeImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleResolutionFacadeImpl.kt index 916f0b94375..ec92de74a0e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleResolutionFacadeImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleResolutionFacadeImpl.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.container.getService import org.jetbrains.kotlin.container.tryGetService import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.project.ResolveElementCache import org.jetbrains.kotlin.idea.resolve.ResolutionFacade @@ -67,6 +68,7 @@ internal class ModuleResolutionFacadeImpl( } } + @OptIn(FrontendInternals::class) val resolveElementCache = getFrontendService(elements.first(), ResolveElementCache::class.java) return runWithCancellationCheck { resolveElementCache.resolveToElements(elements, bodyResolveMode) @@ -95,16 +97,19 @@ internal class ModuleResolutionFacadeImpl( } } + @FrontendInternals override fun getFrontendService(serviceClass: Class): T = getFrontendService(moduleInfo, serviceClass) override fun getIdeService(serviceClass: Class): T { return projectFacade.resolverForModuleInfo(moduleInfo).componentProvider.create(serviceClass) } + @FrontendInternals override fun getFrontendService(element: PsiElement, serviceClass: Class): T { return projectFacade.resolverForElement(element).componentProvider.getService(serviceClass) } + @FrontendInternals override fun tryGetFrontendService(element: PsiElement, serviceClass: Class): T? { return projectFacade.resolverForElement(element).componentProvider.tryGetService(serviceClass) } @@ -113,6 +118,7 @@ internal class ModuleResolutionFacadeImpl( return projectFacade.resolverForModuleInfo(ideaModuleInfo).componentProvider.getService(serviceClass) } + @FrontendInternals override fun getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class): T { return projectFacade.resolverForDescriptor(moduleDescriptor).componentProvider.getService(serviceClass) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeWithDebugInfo.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeWithDebugInfo.kt index 6d8b909184d..685dd37ef16 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeWithDebugInfo.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeWithDebugInfo.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ResolverForProject import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.getNullableModuleInfo import org.jetbrains.kotlin.idea.resolve.ResolutionFacade @@ -66,6 +67,7 @@ private class ResolutionFacadeWithDebugInfo( override val moduleDescriptor: ModuleDescriptor get() = delegate.moduleDescriptor + @FrontendInternals override fun getFrontendService(serviceClass: Class): T { return wrapExceptions({ ResolvingWhat(serviceClass = serviceClass) }) { delegate.getFrontendService(serviceClass) @@ -78,12 +80,14 @@ private class ResolutionFacadeWithDebugInfo( } } + @FrontendInternals override fun getFrontendService(element: PsiElement, serviceClass: Class): T { return wrapExceptions({ ResolvingWhat(listOf(element), serviceClass = serviceClass) }) { delegate.getFrontendService(element, serviceClass) } } + @FrontendInternals override fun tryGetFrontendService(element: PsiElement, serviceClass: Class): T? { return wrapExceptions({ ResolvingWhat(listOf(element), serviceClass = serviceClass) }) { delegate.tryGetFrontendService(element, serviceClass) @@ -94,6 +98,7 @@ private class ResolutionFacadeWithDebugInfo( return delegate.getResolverForProject() } + @FrontendInternals override fun getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class): T { return wrapExceptions({ ResolvingWhat(serviceClass = serviceClass, moduleDescriptor = moduleDescriptor) }) { delegate.getFrontendService(moduleDescriptor, serviceClass) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt index 15dbd24f8d6..3f42f5ddaa9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.lightClasses.KtLightClassForDecompiledDeclaration import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.application.runReadAction @@ -111,6 +112,7 @@ fun PsiClass.resolveToDescriptor( } as? ClassDescriptor } +@OptIn(FrontendInternals::class) private fun PsiElement.getJavaDescriptorResolver(resolutionFacade: ResolutionFacade): JavaDescriptorResolver? { return resolutionFacade.tryGetFrontendService(this, JavaDescriptorResolver::class.java) } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordValues.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordValues.kt index 285a9025557..8fc808abd49 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordValues.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordValues.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.completion.smart.ExpectedInfoMatch import org.jetbrains.kotlin.idea.completion.smart.SmartCompletionItemPriority @@ -86,6 +87,8 @@ object KeywordValues { if (callTypeAndReceiver is CallTypeAndReceiver.CALLABLE_REFERENCE && callTypeAndReceiver.receiver != null) { val qualifierType = bindingContext.get(BindingContext.DOUBLE_COLON_LHS, callTypeAndReceiver.receiver!!)?.type if (qualifierType != null) { + + @OptIn(FrontendInternals::class) val kClassDescriptor = resolutionFacade.getFrontendService(ReflectionTypes::class.java).kClass val classLiteralType = KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, kClassDescriptor, listOf(TypeProjectionImpl(qualifierType))) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt index 939b571c0c9..082c8367005 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt @@ -14,6 +14,7 @@ import com.intellij.openapi.util.Key import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.completion.handlers.WithExpressionPrefixInsertHandler import org.jetbrains.kotlin.idea.completion.handlers.WithTailInsertHandler import org.jetbrains.kotlin.idea.completion.shortenReferences @@ -245,6 +246,7 @@ private fun MutableCollection.addLookupElementsForNullable( } } +@OptIn(FrontendInternals::class) fun CallableDescriptor.callableReferenceType(resolutionFacade: ResolutionFacade, lhs: DoubleColonLHS?): FuzzyType? { if (!CallType.CALLABLE_REFERENCE.descriptorKindFilter.accepts(this)) return null // not supported by callable references diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt index bddfd30a5f0..4cc0f7fdcea 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt @@ -25,6 +25,7 @@ import com.intellij.psi.stubs.StringStubIndexExtension import com.intellij.util.indexing.IdFilter import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.KotlinShortNamesCache import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMemberDescriptor @@ -72,6 +73,7 @@ class KotlinIndicesHelper( private val project = resolutionFacade.project private val scopeWithoutKotlin = scope.excludeKotlinSources() as GlobalSearchScope + @OptIn(FrontendInternals::class) private val descriptorFilter: (DeclarationDescriptor) -> Boolean = filter@{ if (resolutionFacade.frontendService().isHiddenInResolution(it)) return@filter false if (!visibilityFilter(it)) return@filter false @@ -471,6 +473,7 @@ class KotlinIndicesHelper( processor(descriptor) // SAM-adapter + @OptIn(FrontendInternals::class) val syntheticScopes = resolutionFacade.getFrontendService(SyntheticScopes::class.java).forceEnableSamAdapters() val contributedFunctions = container.staticScope.getContributedFunctions(descriptor.name, NoLookupLocation.FROM_IDE) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SmartCastCalculator.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SmartCastCalculator.kt index 155f75bf36e..4648fdff714 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SmartCastCalculator.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SmartCastCalculator.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.resolve.ResolutionFacade -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstance import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.psi.KtExpression @@ -34,7 +34,7 @@ class SmartCastCalculator( receiver: KtExpression?, resolutionFacade: ResolutionFacade ) { - private val dataFlowValueFactory = resolutionFacade.frontendService() + private val dataFlowValueFactory = resolutionFacade.getDataFlowValueFactory() // keys are VariableDescriptor's and ThisReceiver's private val entityToSmartCastInfo: Map = processDataFlowInfo( diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt index 43563807e83..b01f70fae0c 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.core import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.analysis.computeTypeInContext import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -15,6 +16,8 @@ import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.resolveToDescriptors import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstanceToExpression import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.name.FqName @@ -115,9 +118,11 @@ fun Call.resolveCandidates( val callResolutionContext = BasicCallResolutionContext.create( bindingTrace, resolutionScope, this, expectedType, dataFlowInfo, ContextDependency.INDEPENDENT, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, - false, resolutionFacade.frontendService(), - resolutionFacade.frontendService() + false, resolutionFacade.getLanguageVersionSettings(), + resolutionFacade.getDataFlowValueFactory() ).replaceCollectAllCandidates(true) + + @OptIn(FrontendInternals::class) val callResolver = resolutionFacade.frontendService() val results = callResolver.resolveFunctionCall(callResolutionContext) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt index 6317d4ea5ad..8e6c6f2899b 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt @@ -15,11 +15,13 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.extensions.DeclarationAttributeAltererExtension +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.hasJvmFieldAnnotation import org.jetbrains.kotlin.idea.util.isExpectDeclaration @@ -113,6 +115,7 @@ fun KtCallExpression.getLastLambdaExpression(): KtLambdaExpression? { return valueArguments.lastOrNull()?.getArgumentExpression()?.unpackFunctionLiteral() } +@OptIn(FrontendInternals::class) fun KtCallExpression.canMoveLambdaOutsideParentheses(): Boolean { if (getStrictParentOfType() != null) return false if (getLastLambdaExpression() == null) return false @@ -125,7 +128,7 @@ fun KtCallExpression.canMoveLambdaOutsideParentheses(): Boolean { val resolutionFacade = getResolutionFacade() val samConversionTransformer = resolutionFacade.frontendService() val samConversionOracle = resolutionFacade.frontendService() - val languageVersionSettings = resolutionFacade.frontendService() + val languageVersionSettings = resolutionFacade.getLanguageVersionSettings() val bindingContext = analyze(resolutionFacade, BodyResolveMode.PARTIAL) val targets = bindingContext[BindingContext.REFERENCE_TARGET, callee]?.let { listOf(it) } diff --git a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentCompiler.kt b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentCompiler.kt index ed809639b90..eb25bff6020 100644 --- a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentCompiler.kt +++ b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/CodeFragmentCompiler.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.debugger.evaluate.EvaluationStatus import org.jetbrains.kotlin.idea.debugger.evaluate.ExecutionContext import org.jetbrains.kotlin.idea.debugger.evaluate.classLoading.ClassToLoad @@ -69,6 +70,8 @@ class CodeFragmentCompiler(private val executionContext: ExecutionContext, priva val project = codeFragment.project val resolutionFacade = getResolutionFacadeForCodeFragment(codeFragment) + + @OptIn(FrontendInternals::class) val resolveSession = resolutionFacade.getFrontendService(ResolveSession::class.java) val moduleDescriptorWrapper = EvaluatorModuleDescriptor(codeFragment, moduleDescriptor, resolveSession) diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt index bc0d7252ec9..dece2ba9491 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt @@ -373,6 +373,7 @@ open class KotlinDocumentationProviderCompatBase : AbstractDocumentationProvider } } + @OptIn(FrontendInternals::class) val deprecationProvider = resolutionFacade.frontendService() return KDocTemplate().apply { diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinExpressionTypeProvider.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinExpressionTypeProvider.kt index aa081ad7a75..93b90c8be13 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinExpressionTypeProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinExpressionTypeProvider.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector import org.jetbrains.kotlin.psi.psiUtil.parents @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getParameterForArgument import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo @@ -113,7 +112,7 @@ class KotlinExpressionTypeProvider : ExpressionTypeProvider() { val result = expressionType?.let { typeRenderer.renderType(it) } ?: return KotlinBundle.message("type.provider.unknown.type") - val dataFlowValueFactory = element.getResolutionFacade().frontendService() + val dataFlowValueFactory = element.getResolutionFacade().getDataFlowValueFactory() val dataFlowValue = dataFlowValueFactory.createDataFlowValue(element, expressionType, bindingContext, element.findModuleDescriptor()) val types = expressionTypeInfo.dataFlowInfo.getStableTypes(dataFlowValue, element.languageVersionSettings) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt index fb1e9cc8534..97ca05500fc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ConflictingExtensionPropertyInspection.kt @@ -24,6 +24,7 @@ import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.ui.GuiUtils import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall @@ -51,6 +52,7 @@ import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull class ConflictingExtensionPropertyInspection : AbstractKotlinInspection() { + @OptIn(FrontendInternals::class) override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { val file = session.file as? KtFile ?: return PsiElementVisitor.EMPTY_VISITOR val resolutionFacade = file.getResolutionFacade() diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt index 7eae573cfa3..976979c8535 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt @@ -10,6 +10,7 @@ import com.intellij.codeInspection.ProblemsHolder import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.resolve.frontendService @@ -38,6 +39,7 @@ class OverridingDeprecatedMemberInspection : AbstractKotlinInspection() { val resolutionFacade = declaration.getResolutionFacade() val accessorDescriptor = declaration.resolveToDescriptorIfAny(resolutionFacade) as? CallableMemberDescriptor ?: return + @OptIn(FrontendInternals::class) val deprecationProvider = resolutionFacade.frontendService() val message = deprecationProvider.getDeprecations(accessorDescriptor) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt index 3dd80a3bab1..2b0436ec83f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt @@ -21,12 +21,12 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.quickfix.AddExclExclCallFix +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtVisitorVoid import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.isNullabilityFlexible import org.jetbrains.kotlin.types.isNullable @@ -64,7 +64,8 @@ class PlatformExtensionReceiverOfInlineInspection : AbstractKotlinInspection() { return } - val context = expression.analyze(BodyResolveMode.PARTIAL) + val resolutionFacade = expression.getResolutionFacade() + val context = expression.analyze(resolutionFacade, BodyResolveMode.PARTIAL) val resolvedCall = expression.getResolvedCall(context) ?: return val extensionReceiverType = resolvedCall.extensionReceiver?.type ?: return if (!extensionReceiverType.isNullabilityFlexible()) return @@ -72,7 +73,7 @@ class PlatformExtensionReceiverOfInlineInspection : AbstractKotlinInspection() { if (!descriptor.isInline || descriptor.extensionReceiverParameter?.type?.isNullable() == true) return val receiverExpression = expression.receiverExpression - val dataFlowValueFactory = receiverExpression.getResolutionFacade().getFrontendService(DataFlowValueFactory::class.java) + val dataFlowValueFactory = resolutionFacade.getDataFlowValueFactory() val dataFlow = dataFlowValueFactory.createDataFlowValue(receiverExpression, extensionReceiverType, context, descriptor) val stableNullability = context.getDataFlowInfoBefore(receiverExpression).getStableNullability(dataFlow) if (!stableNullability.canBeNull()) return diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt index 127d1c53cee..453ce01b79e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt @@ -16,6 +16,8 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.inspections.collections.isCalling import org.jetbrains.kotlin.idea.project.languageVersionSettings +import org.jetbrains.kotlin.idea.resolve.ResolutionFacade +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtReferenceExpression @@ -27,7 +29,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.isNullable @@ -35,7 +36,8 @@ import org.jetbrains.kotlin.types.isNullable class RedundantRequireNotNullCallInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean) = callExpressionVisitor(fun(callExpression) { val callee = callExpression.calleeExpression ?: return - val context = callExpression.analyze(BodyResolveMode.PARTIAL) + val resolutionFacade = callExpression.getResolutionFacade() + val context = callExpression.analyze(resolutionFacade, BodyResolveMode.PARTIAL) if (!callExpression.isCalling(FqName("kotlin.requireNotNull"), context) && !callExpression.isCalling(FqName("kotlin.checkNotNull"), context) ) return @@ -43,7 +45,7 @@ class RedundantRequireNotNullCallInspection : AbstractKotlinInspection() { val argument = callExpression.valueArguments.firstOrNull()?.getArgumentExpression()?.referenceExpression() ?: return val descriptor = argument.getResolvedCall(context)?.resultingDescriptor ?: return val type = descriptor.returnType ?: return - if (argument.isNullable(descriptor, type, context)) return + if (argument.isNullable(descriptor, type, context, resolutionFacade)) return val functionName = callee.text holder.registerProblem( @@ -54,9 +56,14 @@ class RedundantRequireNotNullCallInspection : AbstractKotlinInspection() { ) }) - private fun KtReferenceExpression.isNullable(descriptor: CallableDescriptor, type: KotlinType, context: BindingContext): Boolean { + private fun KtReferenceExpression.isNullable( + descriptor: CallableDescriptor, + type: KotlinType, + context: BindingContext, + resolutionFacade: ResolutionFacade, + ): Boolean { if (!type.isNullable()) return false - val dataFlowValueFactory = this.getResolutionFacade().getFrontendService(DataFlowValueFactory::class.java) + val dataFlowValueFactory = resolutionFacade.getDataFlowValueFactory() val dataFlow = dataFlowValueFactory.createDataFlowValue(this, type, context, descriptor) val stableTypes = context.getDataFlowInfoBefore(this).getStableTypes(dataFlow, this.languageVersionSettings) return stableTypes.none { !it.isNullable() } diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt index d36153477e3..5d38a994e35 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.codegen.SamCodegenUtil import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -119,6 +120,8 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() { val originalCall = parentCall.getResolvedCall(context) ?: return false val dataFlow = context.getDataFlowInfoBefore(parentCall) + + @OptIn(FrontendInternals::class) val callResolver = parentCall.getResolutionFacade().frontendService() val newCall = CallWithConvertedArguments(originalCall.call, samConstructorCallArgumentMap) @@ -161,6 +164,7 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() { override fun getValueArguments() = newArguments } + @OptIn(FrontendInternals::class) fun samConstructorCallsToBeConverted(functionCall: KtCallExpression): Collection { val valueArguments = functionCall.valueArguments if (valueArguments.none { canBeSamConstructorCall(it) }) return emptyList() diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt index d3cef939061..8e51c693d21 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.idea.intentions.isOperatorOrCompatible import org.jetbrains.kotlin.idea.intentions.isReceiverExpressionWithValue import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.platform +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.idea.util.calleeTextRangeInThis import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtTokens @@ -49,7 +50,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.smartcasts.getKotlinTypeWithPossibleSmartCastToFP import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType @@ -203,9 +203,10 @@ class ReplaceCallWithBinaryOperatorInspection : AbstractApplicabilityBasedInspec private fun KtDotQualifiedExpression.isFloatingPointNumberEquals(): Boolean { val resolvedCall = resolveToCall() ?: return false - val context = analyze(BodyResolveMode.PARTIAL) + val resolutionFacade = getResolutionFacade() + val context = analyze(resolutionFacade, BodyResolveMode.PARTIAL) val declarationDescriptor = containingDeclarationForPseudocode?.resolveToDescriptorIfAny() - val dataFlowValueFactory = getResolutionFacade().getFrontendService(DataFlowValueFactory::class.java) + val dataFlowValueFactory = resolutionFacade.getDataFlowValueFactory() val defaultType: (KotlinType, Set) -> KotlinType = { givenType, stableTypes -> stableTypes.firstOrNull() ?: givenType } val receiverType = resolvedCall.getReceiverExpression()?.getKotlinTypeWithPossibleSmartCastToFP( context, declarationDescriptor, languageVersionSettings, dataFlowValueFactory, defaultType diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt index 9d89731e1ed..6beb57c0474 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.diagnostics.Severity +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -26,6 +27,8 @@ import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.idea.util.shouldNotConvertToProperty @@ -164,6 +167,8 @@ class UsePropertyAccessSyntaxIntention : SelfTargetingOffsetIndependentIntention if (function.shouldNotConvertToProperty(notProperties)) return null val resolutionScope = callExpression.getResolutionScope(bindingContext, resolutionFacade) + + @OptIn(FrontendInternals::class) val property = findSyntheticProperty(function, resolutionFacade.getFrontendService(SyntheticScopes::class.java)) ?: return null if (KtTokens.KEYWORDS.types.any { it.toString() == property.name.asString() }) return null @@ -244,10 +249,11 @@ class UsePropertyAccessSyntaxIntention : SelfTargetingOffsetIndependentIntention val context = BasicCallResolutionContext.create( bindingTrace, resolutionScope, newCall, expectedType, dataFlowInfo, ContextDependency.INDEPENDENT, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, - false, facade.frontendService(), - facade.frontendService() + false, facade.getLanguageVersionSettings(), + facade.getDataFlowValueFactory() ) + @OptIn(FrontendInternals::class) val callResolver = facade.frontendService() val result = callResolver.resolveSimpleProperty(context) return result.isSuccess && result.resultingDescriptor.original == property diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt index 5024d359223..f7532c08e2f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.intentions.branchedTransformations import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.TransactionGuard import com.intellij.openapi.editor.Editor -import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.util.TextRange import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.searches.ReferencesSearch @@ -24,7 +23,7 @@ import org.jetbrains.kotlin.idea.intentions.replaceFirstReceiver import org.jetbrains.kotlin.idea.refactoring.inline.KotlinInlineValHandler import org.jetbrains.kotlin.idea.refactoring.introduce.introduceVariable.KotlinIntroduceVariableHandler import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.idea.util.textRangeIn import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -40,7 +39,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getExplicitReceiverValue import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.scopes.utils.findVariable import org.jetbrains.kotlin.types.TypeUtils @@ -195,7 +193,7 @@ fun elvisPattern(newLine: Boolean): String = if (newLine) "$0\n?: $1" else "$0 ? private fun KtExpression.toDataFlowValue(context: BindingContext): DataFlowValue? { val expressionType = this.getType(context) ?: return null - val dataFlowValueFactory = this.getResolutionFacade().frontendService() + val dataFlowValueFactory = this.getResolutionFacade().getDataFlowValueFactory() return dataFlowValueFactory.createDataFlowValue(this, expressionType, context, findModuleDescriptor()) } diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt index d9a93ca3a5f..c5856e9992b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt @@ -28,6 +28,7 @@ import com.intellij.ui.JBColor import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.OptionalParametersHelper @@ -185,9 +186,9 @@ abstract class KotlinParameterInfoWithCallHandlerBase().getDeprecations(resultingDescriptor).isNotEmpty() with(info) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt index 5fd14d64a02..8f33e80febf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt @@ -35,14 +35,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpression -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver import org.jetbrains.kotlin.types.TypeUtils @@ -138,7 +137,7 @@ class AddExclExclCallFix(psiElement: PsiElement, val checkImplicitReceivers: Boo context[BindingContext.EXPRESSION_TYPE_INFO, psiElement]?.let { val type = it.type - val dataFlowValueFactory = psiElement.getResolutionFacade().frontendService() + val dataFlowValueFactory = psiElement.getResolutionFacade().getDataFlowValueFactory() if (type != null) { val nullability = it.dataFlowInfo.getStableNullability( diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt index 59b27bf5803..f63ee42f68b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil @@ -85,6 +86,7 @@ open class RemovePartsFromPropertyFix( // // But calling another type refinement also helps because it makes KotlinType instance using new module descriptor @OptIn(TypeRefinement::class) + @OptIn(FrontendInternals::class) typeToAdd = replaceElement.getResolutionFacade().frontendService().refineType(typeToAdd) SpecifyTypeExplicitlyIntention.addTypeAnnotation(editor, replaceElement, typeToAdd) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 4f2ef7a3b63..d5be2eb0f17 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithAllCompilerChecks import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent @@ -63,6 +64,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope +import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.TypeUtils @@ -391,6 +393,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { } } + @OptIn(FrontendInternals::class) private fun createFakeFunctionDescriptor(scope: HierarchicalScope, typeParameterCount: Int): FunctionDescriptor { val fakeFunction = SimpleFunctionDescriptorImpl.create( MutablePackageFragmentDescriptor(currentFileModule, FqName("fake")), diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterByUnresolvedRefActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterByUnresolvedRefActionFactory.kt index 92ac83d7457..b605ec359ed 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterByUnresolvedRefActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterByUnresolvedRefActionFactory.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionFactoryWithDelegate @@ -62,6 +63,7 @@ object CreateTypeParameterByUnresolvedRefActionFactory : KotlinIntentionActionFa return ktUserType } + @OptIn(FrontendInternals::class) fun extractFixData(element: KtTypeElement, newName: String): CreateTypeParameterData? { val declaration = element.parents.firstOrNull { it is KtProperty || it is KtNamedFunction || it is KtClass diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterUnmatchedTypeArgumentActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterUnmatchedTypeArgumentActionFactory.kt index 0c4e69eae35..04a14e567d3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterUnmatchedTypeArgumentActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterUnmatchedTypeArgumentActionFactory.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createTypeParameter import com.intellij.psi.SmartPsiElementPointer import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde @@ -42,6 +43,7 @@ object CreateTypeParameterUnmatchedTypeArgumentActionFactory : KotlinIntentionActionFactoryWithDelegate() { override fun getElementOfInterest(diagnostic: Diagnostic) = diagnostic.psiElement as? KtTypeArgumentList + @OptIn(FrontendInternals::class) override fun extractFixData(element: KtTypeArgumentList, diagnostic: Diagnostic): CreateTypeParameterData? { val project = element.project val typeArguments = element.arguments diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt index 9a9c9af8905..f2ec2281b6d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.quickfix.replaceWith import com.intellij.openapi.diagnostic.ControlFlowException import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.codeInliner.CodeToInline @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.platform.TargetPlatform @@ -38,6 +40,7 @@ import java.util.* data class ReplaceWith(val pattern: String, val imports: List, val replaceInWholeProject: Boolean) +@OptIn(FrontendInternals::class) object ReplaceWithAnnotationAnalyzer { fun analyzeCallableReplacement( annotation: ReplaceWith, @@ -128,7 +131,7 @@ object ReplaceWithAnnotationAnalyzer { ): LexicalScope? { val module = resolutionFacade.moduleDescriptor val explicitImportsScope = buildExplicitImportsScope(annotation, resolutionFacade, module) - val languageVersionSettings = resolutionFacade.frontendService() + val languageVersionSettings = resolutionFacade.getLanguageVersionSettings() val defaultImportsScopes = buildDefaultImportsScopes(resolutionFacade, module, languageVersionSettings) return getResolutionScope( diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt index e22b3a10d77..469f196cf36 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.refactoring.introduce.ExtractableSubstringInfo import org.jetbrains.kotlin.idea.refactoring.introduce.extractableSubstringInfo import org.jetbrains.kotlin.idea.refactoring.introduce.substringContextOrThis -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.idea.util.psi.patternMatching.KotlinPsiRange @@ -47,7 +47,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.hasBothReceivers -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor @@ -183,7 +182,7 @@ data class ExtractionData( } private fun getPossibleTypes(expression: KtExpression, resolvedCall: ResolvedCall<*>?, context: BindingContext): Set { - val dataFlowValueFactory = expression.getResolutionFacade().frontendService() + val dataFlowValueFactory = expression.getResolutionFacade().getDataFlowValueFactory() val dataFlowInfo = context.getDataFlowInfoAfter(expression) resolvedCall?.getImplicitReceiverValue()?.let { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt index c8337191a27..6bacf656205 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.project.languageVersionSettings -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.lexer.KtToken import org.jetbrains.kotlin.psi.* @@ -386,8 +386,7 @@ private fun suggestParameterType( val typeByDataFlowInfo = if (useSmartCastsIfPossible) { val callElement = resolvedCall!!.call.callElement val dataFlowInfo = bindingContext.getDataFlowInfoAfter(callElement) - - val dataFlowValueFactory = callElement.getResolutionFacade().frontendService() + val dataFlowValueFactory = callElement.getResolutionFacade().getDataFlowValueFactory() val possibleTypes = dataFlowInfo.getCollectedTypes( dataFlowValueFactory.createDataFlowValueForStableReceiver(receiverToExtract), callElement.languageVersionSettings diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberInfoStorage.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberInfoStorage.kt index 32a90d57384..6715e52dfee 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberInfoStorage.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberInfoStorage.kt @@ -22,6 +22,7 @@ import com.intellij.refactoring.classMembers.AbstractMemberInfoStorage import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.refactoring.isInterfaceClass @@ -39,6 +40,8 @@ class KotlinMemberInfoStorage( classOrObject: KtClassOrObject, filter: (KtNamedDeclaration) -> Boolean = { true } ) : AbstractMemberInfoStorage(classOrObject, filter) { + + @OptIn(FrontendInternals::class) override fun memberConflict(member1: KtNamedDeclaration, member: KtNamedDeclaration): Boolean { val descriptor1 = member1.resolveToDescriptorWrapperAware() val descriptor = member.resolveToDescriptorWrapperAware() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt index fdfb3889ea3..05c7bc03c85 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt @@ -11,6 +11,7 @@ import com.intellij.refactoring.util.MoveRenameUsageInfo import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageViewUtil import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -153,6 +154,8 @@ internal fun checkRedeclarations( is PropertyDescriptor, is FunctionDescriptor, is ClassifierDescriptor -> { + + @OptIn(FrontendInternals::class) val typeSpecificityComparator = resolutionFacade.getFrontendService(descriptor.module, TypeSpecificityComparator::class.java) OverloadChecker(typeSpecificityComparator) } diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt index dfc6500ec50..dcb3f072b01 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.util import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings @@ -17,7 +16,7 @@ import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.findAnalyzerServices import org.jetbrains.kotlin.idea.refactoring.fqName.isImported -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -47,7 +46,7 @@ class ImportInsertHelperImpl(private val project: Project) : ImportInsertHelper( get() = ImportPathComparator(codeStyleSettings.PACKAGES_IMPORT_LAYOUT) override fun isImportedWithDefault(importPath: ImportPath, contextFile: KtFile): Boolean { - val languageVersionSettings = contextFile.getResolutionFacade().frontendService() + val languageVersionSettings = contextFile.getResolutionFacade().getLanguageVersionSettings() val platform = TargetPlatformDetector.getPlatform(contextFile) val analyzerServices = platform.findAnalyzerServices(contextFile.project) val allDefaultImports = analyzerServices.getDefaultImports(languageVersionSettings, includeLowPriorityImports = true) diff --git a/idea/src/org/jetbrains/kotlin/idea/util/quickfixUtil.kt b/idea/src/org/jetbrains/kotlin/idea/util/quickfixUtil.kt index d7d027ff3e1..1a657ab6f02 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/quickfixUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/quickfixUtil.kt @@ -25,13 +25,13 @@ import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtPrimaryConstructor import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.utils.ifEmpty @@ -58,7 +58,8 @@ fun getDataFlowAwareTypes( ): Collection { if (originalType == null) return emptyList() val dataFlowInfo = bindingContext.getDataFlowInfoAfter(expression) - val dataFlowValueFactory = expression.getResolutionFacade().frontendService() + + val dataFlowValueFactory = expression.getResolutionFacade().getDataFlowValueFactory() val expressionType = bindingContext.getType(expression) ?: return listOf(originalType) val dataFlowValue = dataFlowValueFactory.createDataFlowValue( expression, expressionType, bindingContext, expression.getResolutionFacade().moduleDescriptor diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleIdeResolveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleIdeResolveTest.kt index 194d2bcfda0..52eedba72f1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleIdeResolveTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractMultiModuleIdeResolveTest.kt @@ -16,7 +16,8 @@ import org.jetbrains.kotlin.checkers.utils.DiagnosticsRenderingConfiguration import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromTextFile import org.jetbrains.kotlin.idea.project.KotlinMultiplatformAnalysisModeComponent -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory +import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.allKotlinFiles @@ -85,9 +86,9 @@ abstract class AbstractMultiModuleIdeResolveTest : AbstractMultiModuleTest() { configuration = DiagnosticsRenderingConfiguration( platform = null, // we don't need to attach platform-description string to diagnostic here withNewInference = false, - languageVersionSettings = resolutionFacade.frontendService(), + languageVersionSettings = resolutionFacade.getLanguageVersionSettings(), ), - dataFlowValueFactory = resolutionFacade.frontendService(), + dataFlowValueFactory = resolutionFacade.getDataFlowValueFactory(), moduleDescriptor = moduleDescriptor as ModuleDescriptorImpl ).filter { diagnosticsFilter.value(it.diagnostic) } diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOutOfBlockModificationTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOutOfBlockModificationTest.kt index 218866a981b..931eed2f9c0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOutOfBlockModificationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractOutOfBlockModificationTest.kt @@ -13,6 +13,7 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiManager import com.intellij.psi.impl.PsiModificationTrackerImpl import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithAllCompilerChecks import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.trackers.outOfBlockModificationCount @@ -88,6 +89,8 @@ abstract class AbstractOutOfBlockModificationTest : KotlinLightCodeInsightFixtur val ktDeclaration: KtDeclaration? = PsiTreeUtil.getParentOfType(updateElement, KtDeclaration::class.java, false) val ktElement = ktExpression ?: ktDeclaration ?: return val facade = ktElement.containingKtFile.getResolutionFacade() + + @OptIn(FrontendInternals::class) val session = facade.getFrontendService(ResolveSession::class.java) session.forceResolveAll() diff --git a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/inference/nullability/NullabilityBoundTypeEnhancer.kt b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/inference/nullability/NullabilityBoundTypeEnhancer.kt index 31ac5f97d52..378b095add7 100644 --- a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/inference/nullability/NullabilityBoundTypeEnhancer.kt +++ b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/inference/nullability/NullabilityBoundTypeEnhancer.kt @@ -11,14 +11,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpression import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.resolve.ResolutionFacade -import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory import org.jetbrains.kotlin.nj2k.inference.common.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.smartcasts.Nullability import org.jetbrains.kotlin.resolve.jvm.checkers.mustNotBeNull import org.jetbrains.kotlin.types.KotlinType @@ -95,7 +94,7 @@ class NullabilityBoundTypeEnhancer(private val resolutionFacade: ResolutionFacad val bindingContext = analyze(resolutionFacade) val type = getType(bindingContext) ?: return null - val dataFlowValue = resolutionFacade.frontendService() + val dataFlowValue = resolutionFacade.getDataFlowValueFactory() .createDataFlowValue(this, type, bindingContext, resolutionFacade.moduleDescriptor) val dataFlowInfo = bindingContext[BindingContext.EXPRESSION_TYPE_INFO, this]?.dataFlowInfo ?: return null return analyzer(dataFlowValue, dataFlowInfo, type) diff --git a/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/impl/KotlinResolutionFacadeForRepl.kt b/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/impl/KotlinResolutionFacadeForRepl.kt index 308eacc7c39..26020055b7c 100644 --- a/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/impl/KotlinResolutionFacadeForRepl.kt +++ b/plugins/scripting/scripting-ide-services/src/org/jetbrains/kotlin/scripting/ide_services/compiler/impl/KotlinResolutionFacadeForRepl.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.container.getService import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.FrontendInternals import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement @@ -38,6 +39,7 @@ class KotlinResolutionFacadeForRepl( override val moduleDescriptor: ModuleDescriptor = provider.getService(ModuleDescriptor::class.java) + @FrontendInternals override fun getFrontendService(serviceClass: Class): T { return provider.resolve(serviceClass)!!.getValue() as T } @@ -46,6 +48,7 @@ class KotlinResolutionFacadeForRepl( throw UnsupportedOperationException() } + @FrontendInternals override fun tryGetFrontendService(element: PsiElement, serviceClass: Class): T? { throw UnsupportedOperationException() } @@ -54,10 +57,12 @@ class KotlinResolutionFacadeForRepl( throw UnsupportedOperationException() } + @FrontendInternals override fun getFrontendService(element: PsiElement, serviceClass: Class): T { throw UnsupportedOperationException() } + @FrontendInternals override fun getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class): T { throw UnsupportedOperationException() }