From ba3c923024f84a3e904a9d9e692d3602ff67b791 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 10 Sep 2013 23:08:53 +0200 Subject: [PATCH] IDEA-93530 (bad code green: cannot assign a value to final variable) --- .../daemon/impl/analysis/HighlightControlFlowUtil.java | 10 +++++----- .../advHighlighting/AssignToFinal.java | 10 ++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java index 6b0ac54e43fe..fffd2cad3273 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java @@ -547,20 +547,20 @@ public class HighlightControlFlowUtil { public static HighlightInfo checkCannotWriteToFinal(PsiExpression expression, @NotNull PsiFile containingFile) { PsiReferenceExpression reference = null; if (expression instanceof PsiAssignmentExpression) { - final PsiExpression left = ((PsiAssignmentExpression)expression).getLExpression(); + final PsiExpression left = PsiUtil.skipParenthesizedExprDown(((PsiAssignmentExpression)expression).getLExpression()); if (left instanceof PsiReferenceExpression) { reference = (PsiReferenceExpression)left; } } else if (expression instanceof PsiPostfixExpression) { - final PsiExpression operand = ((PsiPostfixExpression)expression).getOperand(); + final PsiExpression operand = PsiUtil.skipParenthesizedExprDown(((PsiPostfixExpression)expression).getOperand()); final IElementType sign = ((PsiPostfixExpression)expression).getOperationTokenType(); if (operand instanceof PsiReferenceExpression && (sign == JavaTokenType.PLUSPLUS || sign == JavaTokenType.MINUSMINUS)) { reference = (PsiReferenceExpression)operand; } } else if (expression instanceof PsiPrefixExpression) { - final PsiExpression operand = ((PsiPrefixExpression)expression).getOperand(); + final PsiExpression operand = PsiUtil.skipParenthesizedExprDown(((PsiPrefixExpression)expression).getOperand()); final IElementType sign = ((PsiPrefixExpression)expression).getOperationTokenType(); if (operand instanceof PsiReferenceExpression && (sign == JavaTokenType.PLUSPLUS || sign == JavaTokenType.MINUSMINUS)) { reference = (PsiReferenceExpression)operand; @@ -569,7 +569,7 @@ public class HighlightControlFlowUtil { final PsiElement resolved = reference == null ? null : reference.resolve(); PsiVariable variable = resolved instanceof PsiVariable ? (PsiVariable)resolved : null; if (variable == null || !variable.hasModifierProperty(PsiModifier.FINAL)) return null; - if (!canWriteToFinal(variable, expression, reference,containingFile)) { + if (!canWriteToFinal(variable, expression, reference, containingFile)) { final String name = variable.getName(); String description = JavaErrorMessages.message("assignment.to.final.variable", name); final HighlightInfo highlightInfo = @@ -599,7 +599,7 @@ public class HighlightControlFlowUtil { PsiField field = (PsiField)variable; if (innerClass != null && !containingFile.getManager().areElementsEquivalent(innerClass, field.getContainingClass())) return false; final PsiMember enclosingCtrOrInitializer = PsiUtil.findEnclosingConstructorOrInitializer(expression); - return enclosingCtrOrInitializer != null && isSameField(variable, enclosingCtrOrInitializer, field, reference,containingFile); + return enclosingCtrOrInitializer != null && isSameField(variable, enclosingCtrOrInitializer, field, reference, containingFile); } if (variable instanceof PsiLocalVariable) { boolean isAccessedFromOtherClass = innerClass != null; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java index 94c279faa10e..1c3342a46009 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java @@ -32,6 +32,16 @@ public class a21 { void f4() { if (DEBUG && (fi < 3 || fi >4)) return; } + + void f5(final int i) { + (i) = 1; + } + void f6(final int i) { + (i)++; + } + void f7(final int i) { + ++(i); + } } class B extends a21 { public B() {