From ed51fbe99beed904caa7026a2307837f231bc732 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 24 Jan 2017 13:54:02 +0700 Subject: [PATCH] LambdaRefactoringUtil#convertToLambda: check context when deciding whether to add qualifier --- .../util/LambdaRefactoringUtil.java | 25 +++++++++++++------ .../streamToLoop/afterGenerateMr.java | 2 +- .../afterUnnecessaryQualifier.java | 22 ++++++++++++++++ .../beforeUnnecessaryQualifier.java | 16 ++++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterUnnecessaryQualifier.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeUnnecessaryQualifier.java diff --git a/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java index b8f2d39d8a45..758bc53b06fd 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -197,12 +197,7 @@ public class LambdaRefactoringUtil { buf.append(referenceElement.getReferenceName()).append("."); } } - else if (qualifier != null && - - !(qualifier instanceof PsiReferenceExpression && ((PsiReferenceExpression)qualifier).resolve() instanceof PsiClass && - ((PsiReferenceExpression)qualifier).getQualifier() == null && PsiTreeUtil.isAncestor(containingClass, referenceExpression, false) || - - qualifier instanceof PsiThisExpression && ((PsiThisExpression)qualifier).getQualifier() == null)) { + else if (qualifier != null && !isQualifierUnnecessary(qualifier, containingClass)) { buf.append(qualifier.getText()).append("."); } } @@ -263,6 +258,22 @@ public class LambdaRefactoringUtil { return buf.toString(); } + private static boolean isQualifierUnnecessary(PsiElement qualifier, PsiClass containingClass) { + if (qualifier instanceof PsiReferenceExpression) { + PsiReferenceExpression reference = (PsiReferenceExpression)qualifier; + if (reference.resolve() instanceof PsiClass && + reference.getQualifier() == null && + (PsiTreeUtil.isAncestor(containingClass, qualifier, false) || + PsiTreeUtil.isContextAncestor(containingClass, qualifier, false))) { + return true; + } + } + if (qualifier instanceof PsiThisExpression && ((PsiThisExpression)qualifier).getQualifier() == null) { + return true; + } + return false; + } + private static boolean isInferredSameTypeAfterConversion(PsiLambdaExpression lambdaExpression, PsiMethodReferenceExpression methodReferenceExpression, PsiType functionalInterfaceType) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterGenerateMr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterGenerateMr.java index 48bf24a4756a..58c3d6618265 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterGenerateMr.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterGenerateMr.java @@ -14,7 +14,7 @@ public class Main { long limit = 33; OUTER: while (true) { - Integer x = Main.getInt(); + Integer x = getInt(); for (int i = 0; i < x; i++) { if (limit-- == 0) break OUTER; stat.accept(i); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterUnnecessaryQualifier.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterUnnecessaryQualifier.java new file mode 100644 index 000000000000..383a25df933e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterUnnecessaryQualifier.java @@ -0,0 +1,22 @@ +// "Replace Stream API chain with loop" "true" + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Test { + static String doProcess(String s) { + return s; + } + + public static void main(String[] args) { + List list = new ArrayList<>(); + for (String s : Arrays.asList("a", "b", "c")) { + String doProcess = doProcess(s); + list.add(doProcess); + } + System.out.println(list); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeUnnecessaryQualifier.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeUnnecessaryQualifier.java new file mode 100644 index 000000000000..3db182c1afa9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeUnnecessaryQualifier.java @@ -0,0 +1,16 @@ +// "Replace Stream API chain with loop" "true" + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Test { + static String doProcess(String s) { + return s; + } + + public static void main(String[] args) { + List list = Stream.of("a", "b", "c").map(Test::doProcess).collect(Collectors.toList()); + System.out.println(list); + } +} \ No newline at end of file