From 84aff5f63050ba24a73321e0abf1f88f4e02f8d2 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Wed, 16 Oct 2019 21:01:11 +0300 Subject: [PATCH] Add some changes to introduced extension points --- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 6 +- .../CallResolutionInterceptorExtension.kt | 46 ------------ .../TypeResolutionInterceptorExtension.kt | 31 -------- .../internal}/CandidateInterceptor.kt | 30 ++++---- .../internal/NonStableExtensionPoints.kt | 70 +++++++++++++++++++ .../internal/TypeResolutionInterceptor.kt | 47 +++++++++++++ .../jetbrains/kotlin/frontend/di/injection.kt | 3 - .../resolve/TypeResolutionInterceptor.kt | 47 ------------- .../kotlin/resolve/calls/CallResolver.java | 2 +- .../calls/tower/NewResolutionOldInference.kt | 13 ++-- .../resolve/calls/tower/PSICallResolver.kt | 8 +-- .../BasicExpressionTypingVisitor.java | 5 +- .../ExpressionTypingComponents.java | 1 + .../expressions/FunctionsTypingVisitor.kt | 2 +- .../kotlin/resolve/calls/tower/TowerLevels.kt | 2 +- .../META-INF/extensions/compiler.xml | 8 +-- 16 files changed, 158 insertions(+), 163 deletions(-) delete mode 100644 compiler/frontend/src/org/jetbrains/kotlin/extensions/CallResolutionInterceptorExtension.kt delete mode 100644 compiler/frontend/src/org/jetbrains/kotlin/extensions/TypeResolutionInterceptorExtension.kt rename compiler/frontend/src/org/jetbrains/kotlin/{resolve => extensions/internal}/CandidateInterceptor.kt (60%) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/NonStableExtensionPoints.kt create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/TypeResolutionInterceptor.kt delete mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionInterceptor.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 65be09e6961..0272f58025d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -85,6 +85,8 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.extensions.* +import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor +import org.jetbrains.kotlin.extensions.internal.TypeResolutionInterceptor import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.js.translate.extensions.JsSyntheticTranslateExtension import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache @@ -585,8 +587,8 @@ class KotlinCoreEnvironment private constructor( IrGenerationExtension.registerExtensionPoint(project) ScriptEvaluationExtension.registerExtensionPoint(project) ShellExtension.registerExtensionPoint(project) - TypeResolutionInterceptorExtension.registerExtensionPoint(project) - CallResolutionInterceptorExtension.registerExtensionPoint(project) + TypeResolutionInterceptor.registerExtensionPoint(project) + CandidateInterceptor.registerExtensionPoint(project) } internal fun registerExtensionsFromPlugins(project: MockProject, configuration: CompilerConfiguration) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/extensions/CallResolutionInterceptorExtension.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/CallResolutionInterceptorExtension.kt deleted file mode 100644 index 30c7094a7bf..00000000000 --- a/compiler/frontend/src/org/jetbrains/kotlin/extensions/CallResolutionInterceptorExtension.kt +++ /dev/null @@ -1,46 +0,0 @@ -package org.jetbrains.kotlin.extensions - -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.incremental.components.LookupLocation -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.calls.CallResolver -import org.jetbrains.kotlin.resolve.calls.CandidateResolver -import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext -import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy -import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower -import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference -import org.jetbrains.kotlin.resolve.scopes.ResolutionScope -import org.jetbrains.kotlin.types.expressions.ExpressionTypingFacade -import java.util.* - -interface CallResolutionInterceptorExtension { - companion object : ProjectExtensionDescriptor( - "org.jetbrains.kotlin.callResolutionInterceptorExtension", - CallResolutionInterceptorExtension::class.java - ) - - fun interceptCandidates( - candidates: Collection, - context: BasicCallResolutionContext, - candidateResolver: CandidateResolver, - callResolver: CallResolver?, - name: Name, - kind: NewResolutionOldInference.ResolutionKind, - tracing: TracingStrategy - ): Collection { - return candidates - } - - fun interceptCandidates( - candidates: Collection, - scopeTower: ImplicitScopeTower, - resolutionContext: BasicCallResolutionContext, - resolutionScope: ResolutionScope, - callResolver: CallResolver?, - name: Name, - location: LookupLocation - ): Collection { - return candidates - } -} - diff --git a/compiler/frontend/src/org/jetbrains/kotlin/extensions/TypeResolutionInterceptorExtension.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/TypeResolutionInterceptorExtension.kt deleted file mode 100644 index 3fac60a2ec8..00000000000 --- a/compiler/frontend/src/org/jetbrains/kotlin/extensions/TypeResolutionInterceptorExtension.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2010-2018 JetBrains s.r.o. 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.extensions - -import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtLambdaExpression -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext - -interface TypeResolutionInterceptorExtension { - companion object : ProjectExtensionDescriptor( - "org.jetbrains.kotlin.typeResolutionInterceptorExtension", - TypeResolutionInterceptorExtension::class.java - ) - - fun interceptFunctionLiteralDescriptor( - expression: KtLambdaExpression, - context: ExpressionTypingContext, - descriptor: AnonymousFunctionDescriptor - ): AnonymousFunctionDescriptor = descriptor - - fun interceptType( - element: KtElement, - context: ExpressionTypingContext, - resultType: KotlinType - ): KotlinType = resultType -} \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CandidateInterceptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/CandidateInterceptor.kt similarity index 60% rename from compiler/frontend/src/org/jetbrains/kotlin/resolve/CandidateInterceptor.kt rename to compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/CandidateInterceptor.kt index 1f24181c165..c1c0a924686 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CandidateInterceptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/CandidateInterceptor.kt @@ -3,10 +3,11 @@ * 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.resolve +package org.jetbrains.kotlin.extensions.internal +import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.extensions.CallResolutionInterceptorExtension +import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.CallResolver @@ -17,8 +18,11 @@ import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference import org.jetbrains.kotlin.resolve.scopes.ResolutionScope -class CandidateInterceptor(private val extensions: Collection) { - fun interceptCandidates( +@UseExperimental(InternalNonStableExtensionPoints::class) +class CandidateInterceptor(project: Project) { + private val extensions = getInstances(project) + + fun interceptResolvedCandidates( candidates: Collection, context: BasicCallResolutionContext, candidateResolver: CandidateResolver, @@ -26,10 +30,8 @@ class CandidateInterceptor(private val extensions: Collection { - return extensions.fold(candidates) { candidates, extension -> - extension.interceptCandidates(candidates, context, candidateResolver, callResolver, name, kind, tracing) - } + ) = extensions.fold(candidates) { it, extension -> + extension.interceptCandidates(it, context, candidateResolver, callResolver, name, kind, tracing) } fun interceptCandidates( @@ -40,10 +42,12 @@ class CandidateInterceptor(private val extensions: Collection { - return extensions.fold(candidates) { candidates, extension -> - extension.interceptCandidates(candidates, scopeTower, resolutionContext, resolutionScope, callResolver, name, location) - } - + ): Collection = extensions.fold(candidates) { it, extension -> + extension.interceptCandidates(it, scopeTower, resolutionContext, resolutionScope, callResolver, name, location) } + + companion object : ProjectExtensionDescriptor( + "org.jetbrains.kotlin.extensions.internal.callResolutionInterceptorExtension", + CallResolutionInterceptorExtension::class.java + ) } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/NonStableExtensionPoints.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/NonStableExtensionPoints.kt new file mode 100644 index 00000000000..9928eb9a7e0 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/NonStableExtensionPoints.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2010-2019 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.extensions.internal + +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor +import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtLambdaExpression +import org.jetbrains.kotlin.resolve.calls.CallResolver +import org.jetbrains.kotlin.resolve.calls.CandidateResolver +import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext +import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy +import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower +import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference +import org.jetbrains.kotlin.resolve.scopes.ResolutionScope +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext + + +/** + * This is marker for non-stable experimental extension points. + * Extension points marked with this meta-annotation will be broken in the future version. + * Please do not use them in general code. + */ +@Experimental(level = Experimental.Level.ERROR) +@Retention(AnnotationRetention.BINARY) +internal annotation class InternalNonStableExtensionPoints + +@InternalNonStableExtensionPoints +interface TypeResolutionInterceptorExtension { + fun interceptFunctionLiteralDescriptor( + expression: KtLambdaExpression, + context: ExpressionTypingContext, + descriptor: AnonymousFunctionDescriptor + ): AnonymousFunctionDescriptor = descriptor + + fun interceptType( + element: KtElement, + context: ExpressionTypingContext, + resultType: KotlinType + ): KotlinType = resultType +} + +@InternalNonStableExtensionPoints +interface CallResolutionInterceptorExtension { + fun interceptCandidates( + candidates: Collection, + context: BasicCallResolutionContext, + candidateResolver: CandidateResolver, + callResolver: CallResolver?, + name: Name, + kind: NewResolutionOldInference.ResolutionKind, + tracing: TracingStrategy + ): Collection = candidates + + fun interceptCandidates( + candidates: Collection, + scopeTower: ImplicitScopeTower, + resolutionContext: BasicCallResolutionContext, + resolutionScope: ResolutionScope, + callResolver: CallResolver?, + name: Name, + location: LookupLocation + ): Collection = candidates +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/TypeResolutionInterceptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/TypeResolutionInterceptor.kt new file mode 100644 index 00000000000..5e53bdc483a --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/extensions/internal/TypeResolutionInterceptor.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2019 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.extensions.internal + +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor +import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtLambdaExpression +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext + +@UseExperimental(InternalNonStableExtensionPoints::class) +class TypeResolutionInterceptor(project: Project) { + private val extensions = getInstances(project) + + fun interceptFunctionLiteralDescriptor( + expression: KtLambdaExpression, + context: ExpressionTypingContext, + descriptor: AnonymousFunctionDescriptor + ) = extensions.fold(descriptor) { it, extension -> + extension.interceptFunctionLiteralDescriptor(expression, context, it) + } + + fun interceptType( + element: KtElement, + context: ExpressionTypingContext, + resultType: KotlinType? + ): KotlinType? { + // null means that source code has errors and in such scenarios shouldn't be passed into extension point + if (resultType == null) return null + + return extensions.fold(resultType) { it, extension -> + extension.interceptType(element, context, it) + } + } + + fun isEmpty() = extensions.isEmpty() + + companion object : ProjectExtensionDescriptor( + "org.jetbrains.kotlin.extensions.internal.typeResolutionInterceptorExtension", + TypeResolutionInterceptorExtension::class.java + ) +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt index 67efe81c85a..2785b5e5a70 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.contracts.ContractDeserializerImpl -import org.jetbrains.kotlin.extensions.CallResolutionInterceptorExtension import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker @@ -74,8 +73,6 @@ fun StorageComponentContainer.configureModule( extension.registerModuleComponents(this, platform, moduleContext.module) } - useInstance(CandidateInterceptor(CallResolutionInterceptorExtension.getInstances(moduleContext.project))) - useImpl() if (languageVersionSettings.isTypeRefinementEnabled) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionInterceptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionInterceptor.kt deleted file mode 100644 index fcb578f6c59..00000000000 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionInterceptor.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010-2019 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.resolve - -import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor -import org.jetbrains.kotlin.extensions.TypeResolutionInterceptorExtension -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtLambdaExpression -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext - -class TypeResolutionInterceptor(private val project: Project) { - val extensions = TypeResolutionInterceptorExtension.getInstances(project) - fun interceptFunctionLiteralDescriptor( - expression: KtLambdaExpression, - context: ExpressionTypingContext, - descriptor: AnonymousFunctionDescriptor - ): AnonymousFunctionDescriptor { - var resultDescriptor = descriptor - for (extension in extensions) { - resultDescriptor = extension.interceptFunctionLiteralDescriptor( - expression, - context, - descriptor - ) - } - return resultDescriptor - } - - fun interceptType( - element: KtElement, - context: ExpressionTypingContext, - resultType: KotlinType - ): KotlinType { - var type = resultType - for (extension in extensions) { - type = extension.interceptType(element, context, type) - } - return type - } - - fun isEmpty() = extensions.isEmpty() -} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index 3b842727013..b85613e911b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -681,7 +681,7 @@ public class CallResolver { OverloadResolutionResultsImpl result; if (!(resolutionTask.resolutionKind instanceof NewResolutionOldInference.ResolutionKind.GivenCandidates)) { assert resolutionTask.name != null; - result = newResolutionOldInference.runResolution(context, resolutionTask.name, resolutionTask.resolutionKind, tracing, this); + result = newResolutionOldInference.runResolution(context, resolutionTask.name, resolutionTask.resolutionKind, tracing); } else { assert resolutionTask.givenCandidates != null; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt index dc30153123a..67f476796de 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference.kt @@ -27,7 +27,7 @@ import org.jetbrains.kotlin.psi.Call import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.CandidateInterceptor +import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor import org.jetbrains.kotlin.resolve.TemporaryBindingTrace import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.CallTransformer @@ -74,6 +74,7 @@ class NewResolutionOldInference( private val coroutineInferenceSupport: CoroutineInferenceSupport, private val deprecationResolver: DeprecationResolver, private val typeApproximator: TypeApproximator, + private val callResolver: CallResolver, private val candidateInterceptor: CandidateInterceptor ) { sealed class ResolutionKind { @@ -162,8 +163,7 @@ class NewResolutionOldInference( context: BasicCallResolutionContext, name: Name, kind: ResolutionKind, - tracing: TracingStrategy, - callResolver: CallResolver + tracing: TracingStrategy ): OverloadResolutionResultsImpl { val explicitReceiver = context.call.explicitReceiver val detailedReceiver = if (explicitReceiver is QualifierReceiver?) { @@ -208,7 +208,7 @@ class NewResolutionOldInference( ) } - candidates = candidateInterceptor.interceptCandidates(candidates, context, candidateResolver, callResolver, name, kind, tracing) + candidates = candidateInterceptor.interceptResolvedCandidates(candidates, context, candidateResolver, callResolver, name, kind, tracing) if (candidates.isEmpty()) { if (reportAdditionalDiagnosticIfNoCandidates(context, nameToResolve, kind, scopeTower, detailedReceiver)) { @@ -382,11 +382,10 @@ class NewResolutionOldInference( override fun interceptCandidates( resolutionScope: ResolutionScope, name: Name, - candidates: Collection, + initialResults: Collection, location: LookupLocation ): Collection { - val project = resolutionContext.call.callElement.project - return candidateInterceptor.interceptCandidates(candidates, this, resolutionContext, resolutionScope, callResolver, name, location) + return candidateInterceptor.interceptCandidates(initialResults, this, resolutionContext, resolutionScope, callResolver, name, location) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt index 575811059ea..330b52282d7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.contracts.EffectSystem import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.Errors -import org.jetbrains.kotlin.extensions.CallResolutionInterceptorExtension +import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* @@ -40,7 +40,6 @@ import org.jetbrains.kotlin.resolve.calls.util.CallMaker import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.scopes.* import org.jetbrains.kotlin.resolve.scopes.receivers.* import org.jetbrains.kotlin.types.* @@ -404,11 +403,10 @@ class PSICallResolver( override fun interceptCandidates( resolutionScope: ResolutionScope, name: Name, - candidates: Collection, + initialResults: Collection, location: LookupLocation ): Collection { - val project = context.call.callElement.project - return candidateInterceptor.interceptCandidates(candidates, this, context, resolutionScope, null, name, location) + return candidateInterceptor.interceptCandidates(initialResults, this, context, resolutionScope, null, name, location) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 6ae2a1e4612..4d9a156e249 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -35,7 +35,6 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0; import org.jetbrains.kotlin.diagnostics.Errors; -import org.jetbrains.kotlin.extensions.TypeResolutionInterceptorExtension; import org.jetbrains.kotlin.incremental.KotlinLookupLocation; import org.jetbrains.kotlin.lexer.KtKeywordToken; import org.jetbrains.kotlin.lexer.KtTokens; @@ -1636,10 +1635,12 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { if (baseExpression == null) { return TypeInfoFactoryKt.noTypeInfo(context); } + if (components.typeResolutionInterceptor.isEmpty()) return facade.getTypeInfo(baseExpression, context, isStatement); + KotlinType newExpectedType = components.typeResolutionInterceptor.interceptType(baseExpression, context, context.expectedType); KotlinTypeInfo resultTypeInfo = facade.getTypeInfo(baseExpression, newExpectedType == context.expectedType ? context : context.replaceExpectedType(newExpectedType), isStatement); KotlinType newResultType = components.typeResolutionInterceptor.interceptType(baseExpression, context, resultTypeInfo.getType()); - if(!components.typeResolutionInterceptor.isEmpty()) components.dataFlowAnalyzer.checkType(newResultType, expression, context); + components.dataFlowAnalyzer.checkType(newResultType, expression, context); return resultTypeInfo.getType() == newResultType ? resultTypeInfo : resultTypeInfo.replaceType(newResultType); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java index 8472f9886e9..208513313de 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.calls.checkers.RttiExpressionChecker; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory; import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator; import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver; +import org.jetbrains.kotlin.extensions.internal.TypeResolutionInterceptor; import org.jetbrains.kotlin.types.WrappedTypeFactory; import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt index d72548770a2..67d3c4ad8ed 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt @@ -178,7 +178,7 @@ internal class FunctionsTypingVisitor(facade: ExpressionTypingInternals) : Expre CallableMemberDescriptor.Kind.DECLARATION, functionLiteral.toSourceElement(), context.expectedType.isSuspendFunctionType() ).let { - TypeResolutionInterceptor(expression.project).interceptFunctionLiteralDescriptor(expression, context, it) + facade.components.typeResolutionInterceptor.interceptFunctionLiteralDescriptor(expression, context, it) } components.functionDescriptorResolver.initializeFunctionDescriptorAndExplicitReturnType( context.scope.ownerDescriptor, context.scope, functionLiteral, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index f306b2ccce6..e995f4df4da 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -380,7 +380,7 @@ private fun ResolutionScope.getContributedFunctionsAndConstructors( result.addAll(scopeTower.syntheticScopes.collectSyntheticStaticFunctions(this, name, location)) result.addAll(scopeTower.syntheticScopes.collectSyntheticConstructors(this, name, location)) - return scopeTower.interceptCandidates(this, name, result, location).toList() + return scopeTower.interceptCandidates(this, name, result, location) } private fun getConstructorsOfClassifier(classifier: ClassifierDescriptor?): List { diff --git a/idea/resources/META-INF/extensions/compiler.xml b/idea/resources/META-INF/extensions/compiler.xml index 68f90fb2c3d..ac06e4cf7ef 100644 --- a/idea/resources/META-INF/extensions/compiler.xml +++ b/idea/resources/META-INF/extensions/compiler.xml @@ -8,11 +8,11 @@ - -