From 86874d0883a6f8fc9006545a8c684ffb781cd4e3 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 17 Aug 2017 16:31:17 +0700 Subject: [PATCH] Fix IDEA-177668 "Replace stream chain with loop" exception on unresolved collection type --- .../codeInspection/streamToLoop/TerminalOperation.java | 6 +++++- .../quickFix/streamToLoop/afterCollector.java | 9 +++++++++ .../quickFix/streamToLoop/beforeCollector.java | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java index bfb46cff8016..56738b378e81 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java @@ -313,7 +313,11 @@ abstract class TerminalOperation extends Operation { Project project = aClass.getProject(); PsiClass baseClass = JavaPsiFacade.getInstance(project).findClass(superClass, aClass.getResolveScope()); if(baseClass == null) return type; - PsiSubstitutor superClassSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(baseClass, aClass, PsiSubstitutor.EMPTY); + PsiSubstitutor superClassSubstitutor = TypeConversionUtil.getMaybeSuperClassSubstitutor(baseClass, aClass, PsiSubstitutor.EMPTY, null); + if(superClassSubstitutor == null) { + // inconsistent class hierarchy: probably something is not resolved + superClassSubstitutor = PsiSubstitutor.EMPTY; + } for (PsiTypeParameter baseParameter : baseClass.getTypeParameters()) { PsiClass substitution = PsiUtil.resolveClassInClassTypeOnly(superClassSubstitutor.substitute(baseParameter)); if(substitution instanceof PsiTypeParameter) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterCollector.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterCollector.java index 28631f844c9a..eca0aaac5f3f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterCollector.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterCollector.java @@ -113,6 +113,15 @@ public class Main { return integers; } + // Unresolved reference + void f(Collection c) { + R treeSet = new TreeSet(); + for (Foo foo : c) { + treeSet.add(foo); + } + Set uniqueDescriptors = treeSet; + } + public static void main(String[] args) { new Main().testAveragingDouble("a", "bbb", null, "cc", "dd", "eedasfasdfs"); new Main().testAveragingInt("a", "bbb", null, "cc", "dd", "eedasfasdfs"); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeCollector.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeCollector.java index 9d5bdffc7f48..c5457e4011be 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeCollector.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeCollector.java @@ -46,6 +46,12 @@ public class Main { return IntStream.of(4, 2, 1).boxed().collect(Collectors.toCollection(TreeSet::new)); } + // Unresolved reference + void f(Collection c) { + Set uniqueDescriptors = c.stream() + .collect(Collectors.toCollection(() -> new TreeSet())); + } + public static void main(String[] args) { new Main().testAveragingDouble("a", "bbb", null, "cc", "dd", "eedasfasdfs"); new Main().testAveragingInt("a", "bbb", null, "cc", "dd", "eedasfasdfs");