From 17095a1640a1a644a76e1130ea9c348f7970796e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 22 Jun 2018 18:02:08 +0300 Subject: [PATCH] var -> explicit: fix lambdas with multiple parameters (IDEA-194414) --- .../VariableTypeCanBeExplicitInspection.java | 53 +++++++++++++++++-- .../afterMultipleParamsJava11.java | 9 ++++ ...ltipleParamsAnotherNonDenotableJava11.java | 13 +++++ .../beforeMultipleParamsJava11.java | 9 ++++ ...riableTypeCanBeExplicitInspectionTest.java | 6 --- 5 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/afterMultipleParamsJava11.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsAnotherNonDenotableJava11.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsJava11.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/VariableTypeCanBeExplicitInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/VariableTypeCanBeExplicitInspection.java index b4f16bad8252..cc96a647826d 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/VariableTypeCanBeExplicitInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/VariableTypeCanBeExplicitInspection.java @@ -8,6 +8,9 @@ import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; + public class VariableTypeCanBeExplicitInspection extends AbstractBaseJavaLocalInspectionTool { @NotNull @Override @@ -16,18 +19,44 @@ public class VariableTypeCanBeExplicitInspection extends AbstractBaseJavaLocalIn return PsiElementVisitor.EMPTY_VISITOR; } return new JavaElementVisitor() { + @Override + public void visitLambdaExpression(PsiLambdaExpression expression) { + List typeElements = new ArrayList<>(); + for (PsiParameter parameter: expression.getParameterList().getParameters()) { + PsiTypeElement typeElement = getTypeElementToExpand(parameter); + if (typeElement == null) return; + typeElements.add(typeElement); + } + + for (PsiTypeElement typeElement: typeElements) { + registerTypeElementProblem(typeElement); + } + } + @Override public void visitVariable(PsiVariable variable) { + PsiTypeElement typeElement = getTypeElementToExpand(variable); + if (typeElement != null) { + registerTypeElementProblem(typeElement); + } + } + + private void registerTypeElementProblem(PsiTypeElement typeElement) { + holder.registerProblem(typeElement, + "'var' can be replaced with explicit type", + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + new ReplaceVarWithExplicitTypeFix()); + } + + private PsiTypeElement getTypeElementToExpand(PsiVariable variable) { PsiTypeElement typeElement = variable.getTypeElement(); if (typeElement != null && typeElement.isInferredType()) { PsiType type = variable.getType(); if (PsiTypesUtil.isDenotableType(type, variable)) { - holder.registerProblem(typeElement, - "'var' can be replaced with explicit type", - ProblemHighlightType.GENERIC_ERROR_OR_WARNING, - new ReplaceVarWithExplicitTypeFix()); + return typeElement; } } + return null; } }; } @@ -44,7 +73,21 @@ public class VariableTypeCanBeExplicitInspection extends AbstractBaseJavaLocalIn public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiElement element = descriptor.getPsiElement(); if (element instanceof PsiTypeElement) { - PsiTypesUtil.replaceWithExplicitType((PsiTypeElement)element); + PsiElement parent = element.getParent(); + if (parent instanceof PsiParameter) { + PsiElement declarationScope = ((PsiParameter)parent).getDeclarationScope(); + if (declarationScope instanceof PsiLambdaExpression) { + for (PsiParameter parameter: ((PsiLambdaExpression)declarationScope).getParameterList().getParameters()) { + PsiTypeElement typeElement = parameter.getTypeElement(); + if (typeElement != null) { + PsiTypesUtil.replaceWithExplicitType(typeElement); + } + } + } + } + else { + PsiTypesUtil.replaceWithExplicitType((PsiTypeElement)element); + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/afterMultipleParamsJava11.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/afterMultipleParamsJava11.java new file mode 100644 index 000000000000..a5cc6471e959 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/afterMultipleParamsJava11.java @@ -0,0 +1,9 @@ +// "Replace 'var' with explicit type" "true" +import java.util.function.BiFunction; + +final class Example { + void m() { + BiFunction graph = (Integer x1, String x) -> x1*2; + } + +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsAnotherNonDenotableJava11.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsAnotherNonDenotableJava11.java new file mode 100644 index 000000000000..fb23bbe8de7c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsAnotherNonDenotableJava11.java @@ -0,0 +1,13 @@ +// "Replace 'var' with explicit type" "false" +final class Example { + + interface I { + void m(A a, B b); + } + + void m(I i) {} + + void m(Example e) { + e.m((var a, var b) -> {}); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsJava11.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsJava11.java new file mode 100644 index 000000000000..d7eb51c66a25 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit/beforeMultipleParamsJava11.java @@ -0,0 +1,9 @@ +// "Replace 'var' with explicit type" "true" +import java.util.function.BiFunction; + +final class Example { + void m() { + BiFunction graph = (var x1, var x) -> x1*2; + } + +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/VariableTypeCanBeExplicitInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/VariableTypeCanBeExplicitInspectionTest.java index 509a349d919d..c405010f0586 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/VariableTypeCanBeExplicitInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/VariableTypeCanBeExplicitInspectionTest.java @@ -4,7 +4,6 @@ package com.intellij.java.codeInsight.daemon.quickFix; import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.VariableTypeCanBeExplicitInspection; -import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.NotNull; @@ -19,11 +18,6 @@ public class VariableTypeCanBeExplicitInspectionTest extends LightQuickFixParame public void test() { doAllTests(); } - @Override - protected LanguageLevel getLanguageLevel() { - return LanguageLevel.JDK_10; - } - @Override protected String getBasePath() { return "/codeInsight/daemonCodeAnalyzer/quickFix/var2explicit";