diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java index b5b52b3e7c8..63f48823be3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java @@ -26,12 +26,12 @@ public class ControlFlowAnalyzer { private TopDownAnalysisContext context; private ExpressionTypingServices typeInferrerServices; private final JetControlFlowDataTraceFactory flowDataTraceFactory; - private final boolean isDeclaredLocally; + private final boolean analyzeLocalDeclaration; - public ControlFlowAnalyzer(TopDownAnalysisContext context, JetControlFlowDataTraceFactory flowDataTraceFactory, boolean declaredLocally) { + public ControlFlowAnalyzer(TopDownAnalysisContext context, JetControlFlowDataTraceFactory flowDataTraceFactory, boolean analyzeLocalDeclaration) { this.context = context; this.flowDataTraceFactory = flowDataTraceFactory; - isDeclaredLocally = declaredLocally; + this.analyzeLocalDeclaration = analyzeLocalDeclaration; this.typeInferrerServices = context.getSemanticServices().getTypeInferrerServices(context.getTrace()); } @@ -84,7 +84,7 @@ public class ControlFlowAnalyzer { private void checkClassOrObject(JetClassOrObject klass, MutableClassDescriptor classDescriptor) { JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider((JetDeclaration) klass, (JetExpression) klass, flowDataTraceFactory, context.getTrace()); - flowInformationProvider.markUninitializedVariables((JetElement) klass, true, isDeclaredLocally); + flowInformationProvider.markUninitializedVariables((JetElement) klass, true, analyzeLocalDeclaration); } private void checkFunction(JetDeclarationWithBody function, FunctionDescriptor functionDescriptor, final @NotNull JetType expectedReturnType) { @@ -138,7 +138,7 @@ public class ControlFlowAnalyzer { } }); } - flowInformationProvider.markUninitializedVariables(function.asElement(), false, isDeclaredLocally); + flowInformationProvider.markUninitializedVariables(function.asElement(), false, analyzeLocalDeclaration); if (((JetDeclaration) function).hasModifier(JetTokens.INLINE_KEYWORD)) { //inline functions after M1 // flowInformationProvider.markNotOnlyInvokedFunctionVariables(function.asElement(), functionDescriptor.getValueParameters()); diff --git a/compiler/testData/checkerWithErrorTypes/full/UnreachableCode.jet b/compiler/testData/checkerWithErrorTypes/full/UnreachableCode.jet index 432b5e53605..60efa628adf 100644 --- a/compiler/testData/checkerWithErrorTypes/full/UnreachableCode.jet +++ b/compiler/testData/checkerWithErrorTypes/full/UnreachableCode.jet @@ -158,4 +158,9 @@ fun nullIsNotNothing() : Unit { return } fail() -} \ No newline at end of file +} + +fun returnInWhile(a: Int) { + do {return} + while (1 > a) +} diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java index c974d7628f6..ace862bb542 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java @@ -8,6 +8,7 @@ import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameter; import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; @@ -18,6 +19,8 @@ import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetBundle; +import java.util.Arrays; + /** * @author svtk */ @@ -73,10 +76,12 @@ public class ChangeVariableMutabilityFix extends JetIntentionAction return new JetIntentionActionFactory() { @Override public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { - DiagnosticWithParameters diagnosticWithParameters = assertAndCastToDiagnosticWithParameters(diagnostic, DiagnosticParameters.PROPERTY); - JetProperty property = diagnosticWithParameters.getParameter(DiagnosticParameters.PROPERTY); - if (diagnostic.getPsiElement().getContainingFile() == property.getContainingFile()) { - return (JetIntentionAction) new ChangeVariableMutabilityFix(property); + if (diagnostic instanceof DiagnosticWithParameters) { + DiagnosticWithParameters diagnosticWithParameters = assertAndCastToDiagnosticWithParameters(diagnostic, DiagnosticParameters.PROPERTY); + JetProperty property = diagnosticWithParameters.getParameter(DiagnosticParameters.PROPERTY); + if (diagnostic.getPsiElement().getContainingFile() == property.getContainingFile()) { + return (JetIntentionAction) new ChangeVariableMutabilityFix(property); + } } return null; }