From 6ca671827152ede994ea2b039dd80ea37f4ebd44 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Sat, 24 Oct 2015 14:15:11 +0300 Subject: [PATCH] Dropped BindingContext.RESOLUTION_SCOPE --- .../compiler/CliLightClassGenerationSupport.kt | 2 +- .../jetbrains/kotlin/resolve/BindingContext.java | 1 - .../kotlin/resolve/BindingContextUtils.kt | 15 +++------------ .../kotlin/idea/project/ResolveElementCache.kt | 5 +++-- .../kotlin/idea/completion/ExpectedInfos.kt | 2 +- .../idea/completion/smart/SmartCompletion.kt | 3 ++- .../kotlin/idea/completion/smart/StaticMembers.kt | 11 +++++++---- .../completion/smart/TypesWithContainsDetector.kt | 8 +++++--- .../jetbrains/kotlin/idea/core/descriptorUtils.kt | 14 +++++++------- 9 files changed, 29 insertions(+), 32 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt index 7c3d6e74462..f6847888e2d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt @@ -172,7 +172,7 @@ public class CliLightClassGenerationSupport(project: Project) : LightClassGenera public class NoScopeRecordCliBindingTrace : CliBindingTrace() { override fun record(slice: WritableSlice, key: K, value: V) { - if (slice === BindingContext.RESOLUTION_SCOPE || slice === BindingContext.LEXICAL_SCOPE) { + if (slice === BindingContext.LEXICAL_SCOPE) { // In the compiler there's no need to keep scopes return } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java index fff233154d0..387e4e65a12 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java @@ -135,7 +135,6 @@ public interface BindingContext { WritableSlice EXHAUSTIVE_WHEN = Slices.createSimpleSlice(); - @Deprecated WritableSlice RESOLUTION_SCOPE = Slices.createSimpleSlice(); WritableSlice LEXICAL_SCOPE = Slices.createSimpleSlice(); WritableSlice SCRIPT_SCOPE = Slices.createSimpleSlice(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt index 8869abd075c..687edbb990c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt @@ -22,16 +22,13 @@ import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR -import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION -import org.jetbrains.kotlin.resolve.BindingContext.LABEL_TARGET +import org.jetbrains.kotlin.resolve.BindingContext.* import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.resolve.scopes.utils.asKtScope import org.jetbrains.kotlin.resolve.scopes.utils.takeSnapshot import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice @@ -73,14 +70,8 @@ public fun > ResolutionContext.recordDataFlowInfo(ex } public fun BindingTrace.recordScope(scope: LexicalScope, element: KtElement?) { - if (element == null) return - - val scopeToRecord = scope.takeSnapshot() - record(BindingContext.LEXICAL_SCOPE, element, scopeToRecord) - - // todo: remove it later - if (element is KtExpression) { - record(BindingContext.RESOLUTION_SCOPE, element, scopeToRecord.asKtScope()) + if (element != null) { + record(BindingContext.LEXICAL_SCOPE, element, scope.takeSnapshot()) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index 0a70f32fab1..956d52a42cd 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.lazy.* import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.kotlin.resolve.scopes.LexicalScope +import org.jetbrains.kotlin.resolve.scopes.utils.asLexicalScope import org.jetbrains.kotlin.utils.addToStdlib.check public class ResolveElementCache( @@ -308,9 +309,9 @@ public class ResolveElementCache( if (ktElement is KtSimpleNameExpression) { val header = ktElement.getParentOfType(true)!! - if (trace.getBindingContext()[BindingContext.RESOLUTION_SCOPE, ktElement] == null) { + if (trace.getBindingContext()[BindingContext.LEXICAL_SCOPE, ktElement] == null) { val scope = resolveSession.getModuleDescriptor().getPackage(header.getFqName(ktElement).parent()).memberScope - trace.record(BindingContext.RESOLUTION_SCOPE, ktElement, scope) + trace.record(BindingContext.LEXICAL_SCOPE, ktElement, scope.asLexicalScope()) } if (Name.isValidIdentifier(ktElement.getReferencedName())) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt index 7b54e9b049a..5775bf5ff16 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ExpectedInfos.kt @@ -573,7 +573,7 @@ class ExpectedInfos( if (operationToken != KtTokens.IN_KEYWORD && operationToken != KtTokens.NOT_IN || expressionWithType != binaryExpression.right) return null val leftOperandType = binaryExpression.left?.let { bindingContext.getType(it) } ?: return null - val scope = bindingContext.get(BindingContext.RESOLUTION_SCOPE, expressionWithType)!! + val scope = expressionWithType.getResolutionScope(bindingContext, resolutionFacade) val detector = TypesWithContainsDetector(scope, leftOperandType, resolutionFacade) val byTypeFilter = object : ByTypeFilter { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt index 6af61fb70ab..c9ec85a1200 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt @@ -204,7 +204,8 @@ class SmartCompletion( .addTo(items, inheritanceSearchers, expectedInfos) if (expression is KtSimpleNameExpression) { - StaticMembers(bindingContext, lookupElementFactory).addToCollection(items, expectedInfos, expression, descriptorsToSkip) + StaticMembers(bindingContext, lookupElementFactory, resolutionFacade) + .addToCollection(items, expectedInfos, expression, descriptorsToSkip) } ClassLiteralItems.addToCollection(items, expectedInfos, lookupElementFactory, isJvmModule) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt index 4196c857335..1c87f22c976 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt @@ -27,7 +27,9 @@ import org.jetbrains.kotlin.idea.completion.ExpectedInfo import org.jetbrains.kotlin.idea.completion.LookupElementFactory import org.jetbrains.kotlin.idea.completion.fuzzyType import org.jetbrains.kotlin.idea.completion.shortenReferences +import org.jetbrains.kotlin.idea.core.getResolutionScope import org.jetbrains.kotlin.idea.core.isVisible +import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.fuzzyReturnType import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -40,8 +42,9 @@ import org.jetbrains.kotlin.types.TypeUtils // adds java static members, enum members and members from companion object class StaticMembers( - val bindingContext: BindingContext, - val lookupElementFactory: LookupElementFactory + private val bindingContext: BindingContext, + private val lookupElementFactory: LookupElementFactory, + private val resolutionFacade: ResolutionFacade ) { public fun addToCollection(collection: MutableCollection, expectedInfos: Collection, @@ -65,10 +68,10 @@ class StaticMembers( context: KtSimpleNameExpression, enumEntriesToSkip: Set) { - val scope = bindingContext[BindingContext.RESOLUTION_SCOPE, context] ?: return + val containingDescriptor = context.getResolutionScope(bindingContext, resolutionFacade).ownerDescriptor fun processMember(descriptor: DeclarationDescriptor) { - if (descriptor is DeclarationDescriptorWithVisibility && !descriptor.isVisible(scope.getContainingDeclaration(), bindingContext, context)) return + if (descriptor is DeclarationDescriptorWithVisibility && !descriptor.isVisible(containingDescriptor, bindingContext, context)) return val matcher: (ExpectedInfo) -> ExpectedInfoMatch if (descriptor is CallableDescriptor) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypesWithContainsDetector.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypesWithContainsDetector.kt index d8501677e42..742a4150f5d 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypesWithContainsDetector.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypesWithContainsDetector.kt @@ -25,14 +25,15 @@ import org.jetbrains.kotlin.idea.util.FuzzyType import org.jetbrains.kotlin.idea.util.nullability import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.scopes.KtScope +import org.jetbrains.kotlin.resolve.scopes.LexicalScope +import org.jetbrains.kotlin.resolve.scopes.utils.collectAllFromMeAndParent import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.typeUtil.TypeNullability import java.util.* class TypesWithContainsDetector( - private val scope: KtScope, + private val scope: LexicalScope, private val argumentType: KotlinType, private val resolutionFacade: ResolutionFacade ) { @@ -41,7 +42,8 @@ class TypesWithContainsDetector( private val booleanType = resolutionFacade.moduleDescriptor.builtIns.booleanType private val heuristicSignatures = resolutionFacade.ideService() - private val typesWithExtensionContains: Collection = scope.getFunctions(containsName, NoLookupLocation.FROM_IDE) + private val typesWithExtensionContains: Collection = scope + .collectAllFromMeAndParent { it.getDeclaredFunctions(containsName, NoLookupLocation.FROM_IDE) } .filter { it.getExtensionReceiverParameter() != null && isGoodContainsFunction(it, listOf()) } .map { it.getExtensionReceiverParameter()!!.getType() } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt index 47d25f5745f..17ff1301784 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.core import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.lexer.KtModifierKeywordToken @@ -28,6 +29,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.getOriginalTopmostOverriddenDescriptors import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue +import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils @@ -48,13 +50,11 @@ fun DeclarationDescriptorWithVisibility.isVisible( return Visibilities.isVisible(normalizeReceiver, this, from) } - val jetScope = bindingContext[BindingContext.RESOLUTION_SCOPE, element] - val implicitReceivers = jetScope?.getImplicitReceiversHierarchy() - if (implicitReceivers != null) { - for (implicitReceiver in implicitReceivers) { - val normalizeReceiver = ExpressionTypingUtils.normalizeReceiverValueForVisibility(implicitReceiver.getValue(), bindingContext) - if (Visibilities.isVisible(normalizeReceiver, this, from)) return true - } + val resolutionScope = element.getResolutionScope(bindingContext, element.getResolutionFacade()) + val implicitReceivers = resolutionScope.getImplicitReceiversHierarchy() + for (implicitReceiver in implicitReceivers) { + val normalizeReceiver = ExpressionTypingUtils.normalizeReceiverValueForVisibility(implicitReceiver.getValue(), bindingContext) + if (Visibilities.isVisible(normalizeReceiver, this, from)) return true } return false }