From e850446f1788df73769db974ebea5855728fe1f1 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 2 Nov 2016 14:45:23 +0300 Subject: [PATCH] Introduced BindingContext.DATA_FLOW_INFO_BEFORE --- .../jvm/compiler/CliLightClassGenerationSupport.kt | 5 +++-- .../org/jetbrains/kotlin/resolve/BindingContext.java | 1 + .../jetbrains/kotlin/resolve/BindingContextUtils.kt | 11 ++++++++++- .../ExpressionTypingVisitorDispatcher.java | 3 +++ .../idea/codeInsight/ReferenceVariantsHelper.kt | 5 +++-- .../src/org/jetbrains/kotlin/idea/util/CallType.kt | 5 +++-- .../kotlin/idea/util/ShadowedDeclarationsFilter.kt | 5 +++-- .../idea/caches/resolve/CodeFragmentAnalyzer.kt | 4 ++-- .../jetbrains/kotlin/idea/core/SmartCastCalculator.kt | 5 +++-- .../src/org/jetbrains/kotlin/idea/core/Utils.kt | 5 +++-- .../kotlin/idea/codeInliner/introduceValue.kt | 4 ++-- .../inspections/RedundantSamConstructorInspection.kt | 5 +++-- .../RemoveExplicitSuperQualifierIntention.kt | 5 +++-- .../RemoveExplicitTypeArgumentsIntention.kt | 4 ++-- .../ReplaceWithOperatorAssignmentIntention.kt | 4 ++-- .../intentions/UsePropertyAccessSyntaxIntention.kt | 5 +++-- .../intentions/loopToCallChain/matchAndConvert.kt | 5 +++-- .../kotlin/idea/intentions/loopToCallChain/utils.kt | 4 ++-- .../org/jetbrains/kotlin/idea/quickfix/ImportFix.kt | 5 +++-- .../createFromUsage/callableBuilder/typeUtils.kt | 4 ++-- .../introduce/extractionEngine/ExtractionData.kt | 4 ++-- .../introduce/extractionEngine/inferParameterInfo.kt | 4 ++-- .../KotlinIntroduceVariableHandler.kt | 4 ++-- .../jetbrains/kotlin/DataFlowValueRenderingTest.kt | 4 ++-- 24 files changed, 67 insertions(+), 43 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 b491749d48f..d9e7cddec66 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 @@ -28,8 +28,8 @@ import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.builder.LightClassConstructionContext import org.jetbrains.kotlin.asJava.classes.KtLightClass -import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade +import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageViewDescriptor @@ -172,9 +172,10 @@ class CliLightClassGenerationSupport(project: Project) : LightClassGenerationSup return NoScopeRecordCliBindingTrace() } + // TODO: needs better name + list of keys to skip somewhere class NoScopeRecordCliBindingTrace : CliBindingTrace() { override fun record(slice: WritableSlice, key: K, value: V) { - if (slice === BindingContext.LEXICAL_SCOPE) { + if (slice === BindingContext.LEXICAL_SCOPE || slice == BindingContext.DATA_FLOW_INFO_BEFORE) { // 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 bce7f249edf..0d1ad78f881 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java @@ -98,6 +98,7 @@ public interface BindingContext { WritableSlice TYPE = Slices.createSimpleSlice(); WritableSlice ABBREVIATED_TYPE = Slices.createSimpleSlice(); WritableSlice EXPRESSION_TYPE_INFO = new BasicWritableSlice(DO_NOTHING); + WritableSlice DATA_FLOW_INFO_BEFORE = new BasicWritableSlice(DO_NOTHING); WritableSlice EXPECTED_EXPRESSION_TYPE = new BasicWritableSlice(DO_NOTHING); WritableSlice EXPECTED_RETURN_TYPE = new BasicWritableSlice(DO_NOTHING); WritableSlice DATAFLOW_INFO_AFTER_CONDITION = 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 cbc99e9ae26..1fcb0968d8d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt @@ -80,7 +80,7 @@ fun BindingTrace.recordScope(scope: LexicalScope, element: KtElement?) { } } -fun BindingContext.getDataFlowInfo(position: PsiElement): DataFlowInfo { +fun BindingContext.getDataFlowInfoAfter(position: PsiElement): DataFlowInfo { for (element in position.parentsWithSelf) { (element as? KtExpression)?.let { val parent = it.parent @@ -92,6 +92,15 @@ fun BindingContext.getDataFlowInfo(position: PsiElement): DataFlowInfo { return DataFlowInfo.EMPTY } +fun BindingContext.getDataFlowInfoBefore(position: PsiElement): DataFlowInfo { + for (element in position.parentsWithSelf) { + (element as? KtExpression) + ?.let { this[BindingContext.DATA_FLOW_INFO_BEFORE, it] } + ?.let { return it } + } + return DataFlowInfo.EMPTY +} + fun KtExpression.isUnreachableCode(context: BindingContext): Boolean = context[BindingContext.UNREACHABLE_CODE, this]!! fun KtExpression.getReferenceTargets(context: BindingContext): Collection { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java index 95f1a3dbb07..14eb241cbf6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java @@ -177,6 +177,9 @@ public abstract class ExpressionTypingVisitorDispatcher extends KtVisitor() 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 54c391c1d1b..043cdf8bc47 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 @@ -25,7 +25,8 @@ import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression import org.jetbrains.kotlin.psi.psiUtil.isImportDirectiveExpression import org.jetbrains.kotlin.psi.psiUtil.isPackageDirectiveExpression import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager @@ -293,7 +294,7 @@ fun CallTypeAndReceiver<*, *>.receiverTypesWithIndex( resolutionScope.getImplicitReceiversWithInstance().map { it.value } } - val dataFlowInfo = bindingContext.getDataFlowInfo(contextElement) + val dataFlowInfo = bindingContext.getDataFlowInfoBefore(contextElement) val result = ArrayList() for ((receiverIndex, receiverValue) in receiverValues.withIndex()) { 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 34144bd364a..8b5ab819940 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 @@ -24,7 +24,8 @@ import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode @@ -199,7 +200,7 @@ class ShadowedDeclarationsFilter( scope = scope.addImportingScope(ExplicitImportsScope(descriptorsToImport)) } - val dataFlowInfo = bindingContext.getDataFlowInfo(context) + val dataFlowInfo = bindingContext.getDataFlowInfoBefore(context) val context = BasicCallResolutionContext.create(bindingTrace, scope, newCall, TypeUtils.NO_EXPECTED_TYPE, dataFlowInfo, ContextDependency.INDEPENDENT, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, false) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt index 8bfaf21d727..d7d4de99847 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode import org.jetbrains.kotlin.resolve.* -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.ResolveSession @@ -122,7 +122,7 @@ class CodeFragmentAnalyzer( val contextForElement = resolveToElement(correctedContext) scopeForContextElement = contextForElement[BindingContext.LEXICAL_SCOPE, correctedContext] - dataFlowInfo = contextForElement.getDataFlowInfo(correctedContext) + dataFlowInfo = contextForElement.getDataFlowInfoAfter(correctedContext) } else -> return null } 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 58c61cb795f..3c246bff45b 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 @@ -26,7 +26,8 @@ import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstance import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.smartcasts.* import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver @@ -44,7 +45,7 @@ class SmartCastCalculator( ) { // keys are VariableDescriptor's and ThisReceiver's private val entityToSmartCastInfo: Map = processDataFlowInfo( - bindingContext.getDataFlowInfo(contextElement), + bindingContext.getDataFlowInfoBefore(contextElement), contextElement.getResolutionScope(bindingContext, resolutionFacade), receiver) 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 896fe7e4746..2dc97bf7086 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 @@ -34,7 +34,8 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode @@ -116,7 +117,7 @@ fun Call.resolveCandidates( val resolutionScope = callElement.getResolutionScope(bindingContext, resolutionFacade) val inDescriptor = resolutionScope.ownerDescriptor - val dataFlowInfo = bindingContext.getDataFlowInfo(callElement) + val dataFlowInfo = bindingContext.getDataFlowInfoBefore(callElement) val bindingTrace = DelegatingBindingTrace(bindingContext, "Temporary trace") val callResolutionContext = BasicCallResolutionContext.create( bindingTrace, resolutionScope, this, expectedType, dataFlowInfo, diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt index 4e8f2c100a1..1e0bca8e1bf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.findLocalVariable @@ -146,7 +146,7 @@ private fun variableNeedsExplicitType( val valueTypeWithoutExpectedType = initializer.computeTypeInContext( resolutionScope, context, - dataFlowInfo = bindingContext.getDataFlowInfo(context) + dataFlowInfo = bindingContext.getDataFlowInfoBefore(context) ) return valueTypeWithoutExpectedType == null || ErrorUtils.containsErrorType(valueTypeWithoutExpectedType) } diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt index 382ace006af..0603d0f3027 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSamConstructorInspection.kt @@ -36,7 +36,8 @@ import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTraceContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess @@ -120,7 +121,7 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() { val originalCall = parentCall.getResolvedCall(context) ?: return false - val dataFlow = context.getDataFlowInfo(parentCall) + val dataFlow = context.getDataFlowInfoBefore(parentCall) val callResolver = parentCall.getResolutionFacade().frontendService() val newCall = CallWithConvertedArguments(originalCall.call, samConstructorArguments) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt index 28aee1eb6d0..813e3ddae77 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt @@ -33,7 +33,8 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.ErrorUtils @@ -54,7 +55,7 @@ class RemoveExplicitSuperQualifierIntention : SelfTargetingRangeIntention() val resolutionResults = callResolver.resolveFunctionCall( BindingTraceContext(), scope, untypedCall, expectedType, dataFlow, false) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceWithOperatorAssignmentIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceWithOperatorAssignmentIntention.kt index 3e1383fba3b..d4896510ebb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceWithOperatorAssignmentIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceWithOperatorAssignmentIntention.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.doNotAnalyze import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class ReplaceWithOperatorAssignmentInspection : IntentionBasedInspection(ReplaceWithOperatorAssignmentIntention::class) @@ -53,7 +53,7 @@ class ReplaceWithOperatorAssignmentIntention : SelfTargetingOffsetIndependentInt val resolutionScope = element.getResolutionScope(bindingContext, element.getResolutionFacade()) val newBindingContext = opAssign.analyzeInContext(resolutionScope, contextExpression = element, - dataFlowInfo = bindingContext.getDataFlowInfo(element), + dataFlowInfo = bindingContext.getDataFlowInfoBefore(element), isStatement = true) return newBindingContext.diagnostics.forElement(opAssign.operationReference).isEmpty() } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt index f11ee11367d..3382d00dfc7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt @@ -36,7 +36,8 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall @@ -89,7 +90,7 @@ class UsePropertyAccessSyntaxIntention : SelfTargetingOffsetIndependentIntention val resolutionScope = callExpression.getResolutionScope(bindingContext, resolutionFacade) val property = findSyntheticProperty(function, resolutionFacade.getFrontendService(SyntheticScopes::class.java)) ?: return null - val dataFlowInfo = bindingContext.getDataFlowInfo(callee) + val dataFlowInfo = bindingContext.getDataFlowInfoBefore(callee) val qualifiedExpression = callExpression.getQualifiedExpressionForSelectorOrThis() val expectedType = bindingContext[BindingContext.EXPECTED_EXPRESSION_TYPE, qualifiedExpression] ?: TypeUtils.NO_EXPECTED_TYPE diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/matchAndConvert.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/matchAndConvert.kt index 39e514b369d..bdc97b12389 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/matchAndConvert.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/matchAndConvert.kt @@ -34,7 +34,8 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils.isSubtypeOfClass -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.smartcasts.ExplicitSmartCasts import org.jetbrains.kotlin.resolve.calls.smartcasts.ImplicitSmartCasts import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode @@ -270,7 +271,7 @@ private fun checkSmartCastsPreserved(loop: KtForExpression, matchResult: MatchRe val callChain = matchResult.generateCallChain(loop) val resolutionScope = loop.getResolutionScope(bindingContext, loop.getResolutionFacade()) - val dataFlowInfo = bindingContext.getDataFlowInfo(loop) + val dataFlowInfo = bindingContext.getDataFlowInfoBefore(loop) val newBindingContext = callChain.analyzeInContext(resolutionScope, loop, dataFlowInfo = dataFlowInfo) var preservedSmartCastCount = 0 diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/utils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/utils.kt index 5d8bd746e52..bb25826a3cd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/utils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/utils.kt @@ -38,7 +38,7 @@ import org.jetbrains.kotlin.psi.KtPsiUtil.isOrdinaryAssignment import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +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.constants.evaluate.ConstantExpressionEvaluator @@ -278,7 +278,7 @@ fun tryChangeAndCheckErrors( val resolutionScope = block.getResolutionScope(bindingContext, block.getResolutionFacade()) val newBindingContext = blockCopy.analyzeInContext(scope = resolutionScope, contextExpression = block, - dataFlowInfo = bindingContext.getDataFlowInfo(block), + dataFlowInfo = bindingContext.getDataFlowInfoBefore(block), trace = DelegatingBindingTrace(bindingContext, "Temporary trace")) return newBindingContext.diagnostics.none { it.severity == Severity.ERROR diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index bb143ff4029..f2e48477fc4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -64,7 +64,8 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.isImportDirectiveExpression import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.callUtil.getParentCall import org.jetbrains.kotlin.resolve.calls.context.ContextDependency import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe @@ -489,7 +490,7 @@ internal class ImportForMismatchingArgumentsFix( // check that this function matches all arguments val resolutionScopeWithAddedImport = resolutionScope.addImportingScope(ExplicitImportsScope(listOf(descriptor))) - val dataFlowInfo = bindingContext.getDataFlowInfo(elementToAnalyze) + val dataFlowInfo = bindingContext.getDataFlowInfoBefore(elementToAnalyze) val newBindingContext = elementToAnalyze.analyzeInContext( resolutionScopeWithAddedImport, dataFlowInfo = dataFlowInfo, diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt index fa57835d855..9eaa5320b87 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsStatement import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass @@ -127,7 +127,7 @@ fun KtExpression.guessTypes( // if we know the actual type of the expression val theType1 = context.getType(this) if (theType1 != null) { - val dataFlowInfo = context.getDataFlowInfo(this) + val dataFlowInfo = context.getDataFlowInfoAfter(this) val possibleTypes = dataFlowInfo.getCollectedTypes(DataFlowValueFactory.createDataFlowValue(this, theType1, context, module)) return if (possibleTypes.isNotEmpty()) possibleTypes.toTypedArray() else arrayOf(theType1) } 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 7975584b0d1..a29b042dea5 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 @@ -39,7 +39,7 @@ import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall @@ -179,7 +179,7 @@ data class ExtractionData( } fun getPossibleTypes(expression: KtExpression, resolvedCall: ResolvedCall<*>?, context: BindingContext): Set { - val dataFlowInfo = context.getDataFlowInfo(expression) + val dataFlowInfo = context.getDataFlowInfoAfter(expression) (resolvedCall?.getImplicitReceiverValue() as? ImplicitReceiver)?.let { return dataFlowInfo.getCollectedTypes(DataFlowValueFactory.createDataFlowValueForStableReceiver(it)) 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 2959cc64b35..13b7bfdb776 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 @@ -36,7 +36,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.psi.psiUtil.isInsideOf import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.hasBothReceivers import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory @@ -319,7 +319,7 @@ private fun suggestParameterType( receiverToExtract is ImplicitReceiver -> { val typeByDataFlowInfo = if (useSmartCastsIfPossible) { - val dataFlowInfo = bindingContext.getDataFlowInfo(resolvedCall!!.call.callElement) + val dataFlowInfo = bindingContext.getDataFlowInfoAfter(resolvedCall!!.call.callElement) val possibleTypes = dataFlowInfo.getCollectedTypes(DataFlowValueFactory.createDataFlowValueForStableReceiver(receiverToExtract)) if (possibleTypes.isNotEmpty()) CommonSupertypes.commonSupertype(possibleTypes) else null } else null diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt index 70d95740104..ce16909abd0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt @@ -62,7 +62,7 @@ import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.resolve.ObservableBindingTrace -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.source.getPsi @@ -486,7 +486,7 @@ object KotlinIntroduceVariableHandler : RefactoringActionHandler { val expressionType = substringInfo?.type ?: bindingContext.getType(physicalExpression) //can be null or error type val scope = physicalExpression.getResolutionScope(bindingContext, resolutionFacade) - val dataFlowInfo = bindingContext.getDataFlowInfo(physicalExpression) + val dataFlowInfo = bindingContext.getDataFlowInfoAfter(physicalExpression) val bindingTrace = ObservableBindingTrace(BindingTraceContext()) val typeNoExpectedType = substringInfo?.type diff --git a/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt b/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt index 8968e4aafdf..e7c80750c32 100644 --- a/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import org.jetbrains.kotlin.descriptors.PackageViewDescriptor -import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue @@ -65,7 +65,7 @@ abstract class AbstractDataFlowValueRenderingTest: KotlinLightCodeInsightFixture val jetFile = fixture.file as KtFile val element = jetFile.findElementAt(fixture.caretOffset)!! val expression = element.getStrictParentOfType()!! - val info = expression.analyze().getDataFlowInfo(expression) + val info = expression.analyze().getDataFlowInfoAfter(expression) val allValues = (info.completeTypeInfo.keySet() + info.completeNullabilityInfo.keys).toSet() val actual = allValues.mapNotNull { it.render() }.sorted().joinToString("\n")