Clear DF info for variables assigned in 'try' #KT-17929 Fixed
This commit is contained in:
committed by
Mikhail Glukhikh
parent
0fd70df681
commit
adbece82ef
+13
-3
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||
import org.jetbrains.kotlin.config.LanguageFeature;
|
||||
import org.jetbrains.kotlin.descriptors.*;
|
||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
||||
import org.jetbrains.kotlin.psi.*;
|
||||
@@ -513,11 +514,20 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
||||
}
|
||||
}
|
||||
|
||||
KotlinTypeInfo result = TypeInfoFactoryKt.noTypeInfo(context);
|
||||
KotlinTypeInfo tryResult = facade.getTypeInfo(tryBlock, context);
|
||||
ExpressionTypingContext tryOutputContext = context.replaceExpectedType(NO_EXPECTED_TYPE);
|
||||
if (!nothingInAllCatchBranches &&
|
||||
facade.getComponents().languageVersionSettings.supportsFeature(LanguageFeature.SoundSmartCastsAfterTry)) {
|
||||
PreliminaryLoopVisitor tryVisitor = PreliminaryLoopVisitor.visitTryBlock(expression);
|
||||
tryOutputContext = tryOutputContext.replaceDataFlowInfo(
|
||||
tryVisitor.clearDataFlowInfoForAssignedLocalVariables(tryOutputContext.dataFlowInfo,
|
||||
components.languageVersionSettings)
|
||||
);
|
||||
}
|
||||
|
||||
KotlinTypeInfo result = TypeInfoFactoryKt.noTypeInfo(tryOutputContext);
|
||||
if (finallyBlock != null) {
|
||||
result = facade.getTypeInfo(finallyBlock.getFinalExpression(),
|
||||
context.replaceExpectedType(NO_EXPECTED_TYPE));
|
||||
result = facade.getTypeInfo(finallyBlock.getFinalExpression(), tryOutputContext);
|
||||
}
|
||||
else if (nothingInAllCatchBranches) {
|
||||
result = tryResult;
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.types.expressions
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtLoopExpression
|
||||
import org.jetbrains.kotlin.psi.KtTryExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.IdentifierInfo
|
||||
@@ -59,5 +60,12 @@ class PreliminaryLoopVisitor private constructor() : AssignedVariablesSearcher()
|
||||
loopExpression.accept(visitor, null)
|
||||
return visitor
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun visitTryBlock(tryExpression: KtTryExpression): PreliminaryLoopVisitor {
|
||||
val visitor = PreliminaryLoopVisitor()
|
||||
tryExpression.tryBlock.accept(visitor, null)
|
||||
return visitor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user