From 88b28233e82d00768fc26ba5a42350fb4f3a857d Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 12 Oct 2016 16:20:38 +0200 Subject: [PATCH] variable array fix: don't create fix if it can't be applied when there is no variable in the context EA-54266 - ISE: VariableArrayTypeFix.getText --- .../daemon/impl/analysis/HighlightUtil.java | 2 +- .../impl/quickfix/VariableArrayTypeFix.java | 30 +++++++++++-------- .../UncheckedWarningLocalInspectionBase.java | 2 +- ...ArrayInitializerTypeCheckVariableType.java | 13 ++++++++ .../daemon/LightAdvHighlightingJdk7Test.java | 2 ++ 5 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ArrayInitializerTypeCheckVariableType.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 31d03953f15b..3b9e2ab58312 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -1807,7 +1807,7 @@ public class HighlightUtil extends HighlightUtilBase { if (!arrayTypeFixChecked) { final PsiType checkResult = JavaHighlightUtil.sameType(initializers); - fix = checkResult != null ? new VariableArrayTypeFix(arrayInitializer, checkResult) : null; + fix = checkResult != null ? VariableArrayTypeFix.createFix(arrayInitializer, checkResult) : null; arrayTypeFixChecked = true; } if (fix != null) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java index c4257b06cdb2..b3034ae7b3bf 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java @@ -36,24 +36,30 @@ public class VariableArrayTypeFix extends LocalQuickFixOnPsiElement { private final String myName; private final String myFamilyName; - public VariableArrayTypeFix(@NotNull PsiArrayInitializerExpression initializer, @NotNull PsiType componentType) { - super(getInitializer(initializer)); + private VariableArrayTypeFix(@NotNull PsiArrayInitializerExpression initializer, + @NotNull PsiArrayType arrayType, + @NotNull PsiVariable variable) { + super(initializer); + myTargetType = arrayType; + PsiExpression myNewExpression = getNewExpressionLocal(initializer); + myName = myTargetType.equals(variable.getType()) && myNewExpression != null + ? QuickFixBundle.message("change.new.operator.type.text", getNewText(myNewExpression,initializer), myTargetType.getCanonicalText(), "") + : QuickFixBundle.message("fix.variable.type.text", formatType(variable), variable.getName(), myTargetType.getCanonicalText()); + myFamilyName = QuickFixBundle.message(myTargetType.equals(variable.getType()) && myNewExpression != null ? "change.new.operator.type.family" + : "fix.variable.type.family"); + } + + @Nullable + public static VariableArrayTypeFix createFix(PsiArrayInitializerExpression initializer, @NotNull PsiType componentType) { PsiArrayType arrayType = new PsiArrayType(componentType); PsiArrayInitializerExpression arrayInitializer = initializer; while (arrayInitializer.getParent() instanceof PsiArrayInitializerExpression) { arrayInitializer = (PsiArrayInitializerExpression)arrayInitializer.getParent(); arrayType = new PsiArrayType(arrayType); } - myTargetType = arrayType; - - PsiExpression myNewExpression = getNewExpressionLocal(arrayInitializer); - PsiVariable myVariable = getVariableLocal(arrayInitializer); - myName = myVariable == null ? null : myTargetType.equals(myVariable.getType()) && myNewExpression != null ? - QuickFixBundle.message("change.new.operator.type.text", getNewText(myNewExpression,arrayInitializer), myTargetType.getCanonicalText(), "") : - QuickFixBundle.message("fix.variable.type.text", formatType(myVariable), myVariable.getName(), myTargetType.getCanonicalText()); - myFamilyName = myVariable == null ? null : myTargetType.equals(myVariable.getType()) && myNewExpression != null ? - QuickFixBundle.message("change.new.operator.type.family") : - QuickFixBundle.message("fix.variable.type.family"); + PsiVariable variable = getVariableLocal(arrayInitializer); + if (variable == null) return null; + return new VariableArrayTypeFix(arrayInitializer, arrayType, variable); } private static String formatType(@NotNull PsiVariable variable) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java index 82a3590fb259..373ec1721d2b 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java @@ -349,7 +349,7 @@ public class UncheckedWarningLocalInspectionBase extends BaseJavaBatchLocalInspe JavaHighlightUtil.formatType(componentType)); if (!arrayTypeFixChecked) { final PsiType checkResult = JavaHighlightUtil.sameType(initializers); - fix = checkResult != null ? new VariableArrayTypeFix(arrayInitializer, checkResult) : null; + fix = checkResult != null ? VariableArrayTypeFix.createFix(arrayInitializer, checkResult) : null; arrayTypeFixChecked = true; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ArrayInitializerTypeCheckVariableType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ArrayInitializerTypeCheckVariableType.java new file mode 100644 index 000000000000..a7a1a760a812 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ArrayInitializerTypeCheckVariableType.java @@ -0,0 +1,13 @@ +import java.util.*; + +class FooClass { + + { + Set[][] a = null; + a[0] = new Set[]{ fooBar(), fooBar()}; + } + + private List fooBar() { + return null; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java index 1658752c857c..4160b1981481 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java @@ -182,6 +182,8 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase { public void testTryWithResourcesWithMultipleCloseInterfaces() { doTest(false, false);} public void testIDEA138978() { doTest(false, false); } + public void testArrayInitializerTypeCheckVariableType() { doTest(false, false);} + public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); assertNotNull(collectionsClass);