From 219506dabf4c9560b1123b120dae2312e989972c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 13 Mar 2014 19:26:47 +0100 Subject: [PATCH] new inference: ignore return dependencies of a variable when proper bound is present (IDEA-119535) --- .../graphInference/InferenceVariable.java | 9 +- .../lambda/newLambda/IDEA119003.java | 84 +++++++++++++++++++ .../lambda/newLambda/IDEA119535.java | 30 +++++++ .../lambda/NewLambdaHighlightingTest.java | 4 + 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119003.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java index bb8db38e5890..0edd0a0591a4 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java @@ -74,8 +74,15 @@ public class InferenceVariable { next: for (InferenceVariable variable : session.getInferenceVariables()) { if (!dependencies.contains(variable) && variable != this) { + nextBound: for (InferenceBound inferenceBound : InferenceBound.values()) { - for (PsiType bound : getBounds(inferenceBound)) { + final List bounds = getBounds(inferenceBound); //todo + for (PsiType bound : bounds) { + if (session.isProperType(bound)) { + continue nextBound; + } + } + for (PsiType bound : bounds) { Set deps = new HashSet(); session.collectDependencies(bound, deps); if (deps.contains(this)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119003.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119003.java new file mode 100644 index 000000000000..f56af02e5dd8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119003.java @@ -0,0 +1,84 @@ +package problems; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static java.util.stream.Collectors.*; + +class Test { + + enum CaloricLevel { DIET, NORMAL, FAT } + + public static void main(String[] args) { + List menu = Arrays.asList( + new Dish("pork", false, 800, Dish.Type.MEAT), + new Dish("beef", false, 700, Dish.Type.MEAT), + new Dish("chicken", false, 400, Dish.Type.MEAT), + new Dish("french fries", true, 530, Dish.Type.OTHER), + new Dish("rice", true, 350, Dish.Type.OTHER), + new Dish("season fruit", true, 120, Dish.Type.OTHER), + new Dish("pizza", true, 550, Dish.Type.OTHER), + new Dish("prawns", false, 400, Dish.Type.FISH), + new Dish("salmon", false, 450, Dish.Type.FISH) + ); + + System.out.println( + menu.stream().collect(reducing(0, Dish::getCalories, (Integer i, Integer j) -> i + j)) + ); + + System.out.println( + menu.stream().collect( + groupingBy(Dish::getType, mapping( + dish -> { if (dish.getCalories() <= 400) return CaloricLevel.DIET; + else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; + else return CaloricLevel.FAT; }, + toSet()))) + ); + + System.out.println( + menu.stream().collect( + groupingBy(Dish::getType, + collectingAndThen( + reducing((d1, d2) -> d1.getCalories() > d2.getCalories() ? d1 : d2), + Optional::get))) + ); + } +} + +class Dish { + private final String name; + private final boolean vegetarian; + private final int calories; + private final Type type; + + public Dish(String name, boolean vegetarian, int calories, Type type) { + this.name = name; + this.vegetarian = vegetarian; + this.calories = calories; + this.type = type; + } + + public String getName() { + return name; + } + + public boolean isVegetarian() { + return vegetarian; + } + + public int getCalories() { + return calories; + } + + public Type getType() { + return type; + } + + public enum Type { MEAT, FISH, OTHER } + + @Override + public String toString() { + return name; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java index 9c883308ff1a..414b2bd09cb8 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java @@ -1,3 +1,4 @@ +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Optional; @@ -5,6 +6,8 @@ import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.stream.Collector; +import static java.util.stream.Collectors.*; + class Stuff { public enum Type { A } private final int value; @@ -41,4 +44,31 @@ class FakeErrors { Collector downstream) { return null; } +} + +class FakeErrorsComplete { + public static List elems(){ + return Arrays.asList( + new Stuff(800, Stuff.Type.A)); + } + + public static void main(String ... args){ + + Map> bar = + elems() + .stream() + .collect(groupingBy(Stuff::getType, + reducing((d1, d2) -> d1.getValue() > d2.getValue() ? d1 : d2))); + + System.out.println(bar); + + Map baz = + elems() + .stream() + .collect(groupingBy(Stuff::getType, + collectingAndThen(reducing((Stuff d1, Stuff d2) -> d1.getValue() > d2.getValue() ? d1 : d2), + Optional::get))); + + System.out.println(baz); + } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index 3401e384ed3f..d05afc4b3a40 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -130,6 +130,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testIDEA119003() throws Exception { + doTest(); + } + public void testIDEA117124() throws Exception { doTest(); }