HighlightControlFlowUtil: disable assignment to pattern variables

GitOrigin-RevId: 09c4aa42068ce0258543a17546404fcdec952404
This commit is contained in:
Tagir Valeev
2019-12-27 09:01:34 +00:00
committed by intellij-monorepo-bot
parent 3fc9bf9589
commit 2380906af8
3 changed files with 23 additions and 9 deletions
@@ -624,19 +624,23 @@ public class HighlightControlFlowUtil {
}
PsiReferenceExpression reference = ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(operand), PsiReferenceExpression.class);
PsiVariable variable = reference == null ? null : ObjectUtils.tryCast(reference.resolve(), PsiVariable.class);
if (variable == null || !variable.hasModifierProperty(PsiModifier.FINAL)) return null;
final boolean canWrite = canWriteToFinal(variable, expression, reference, containingFile) && checkWriteToFinalInsideLambda(variable, reference) == null;
if (canWrite) return null;
if (!(variable instanceof PsiPatternVariable)) {
if (variable == null || !variable.hasModifierProperty(PsiModifier.FINAL)) return null;
final boolean canWrite = canWriteToFinal(variable, expression, reference, containingFile) && checkWriteToFinalInsideLambda(variable, reference) == null;
if (canWrite) return null;
}
final String name = variable.getName();
String description = JavaErrorMessages.message("assignment.to.final.variable", name);
final HighlightInfo highlightInfo =
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(reference).descriptionAndTooltip(description).create();
final PsiElement innerClass = getInnerClassVariableReferencedFrom(variable, expression);
if (innerClass == null || variable instanceof PsiField) {
HighlightFixUtil.registerMakeNotFinalAction(variable, highlightInfo);
}
else {
QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createVariableAccessFromInnerClassFix(variable, innerClass));
if (!(variable instanceof PsiPatternVariable)) {
final PsiElement innerClass = getInnerClassVariableReferencedFrom(variable, expression);
if (innerClass == null || variable instanceof PsiField) {
HighlightFixUtil.registerMakeNotFinalAction(variable, highlightInfo);
}
else {
QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createVariableAccessFromInnerClassFix(variable, innerClass));
}
}
return highlightInfo;
}
@@ -0,0 +1,7 @@
class X {
void expressions(Object obj) {
if (obj instanceof String s) {
<error descr="Cannot assign a value to final variable 's'">s</error> = "foo";
}
}
}
@@ -27,6 +27,9 @@ public class LightPatternsHighlightingTest extends LightJavaCodeInsightFixtureTe
public void testInstanceOfControlFlow() {
doTest();
}
public void testReassignPatternVariable() {
doTest();
}
private void doTest() {
myFixture.configureByFile(getTestName(false) + ".java");