From e8ea2598f33a3d596e79b28ce3bcb8ede70e9a2f Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 11 Aug 2016 08:24:00 +0200 Subject: [PATCH] fun expr search: minor improvements after reviews --- .../JavaFunctionalExpressionSearcher.java | 7 +------ .../java/stubs/FunctionalExpressionKey.java | 18 +++++++++--------- .../findUsages/FindSubInterfaceLambdas.java | 15 +++++++++++++++ .../lambda/FindFunctionalInterfaceTest.java | 5 +++++ 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java index 89da61c79150..971534bd18ea 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java @@ -371,7 +371,7 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase { - if (candidate.isInterface() && isFunctionalCompatible(candidate)) { + if (candidate.isInterface()) { visit(candidate); } return true; @@ -381,11 +381,6 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase !m.hasModifierProperty(PsiModifier.DEFAULT)).count() == 0; - } - private static class SamDescriptor { final PsiClass samClass; final GlobalSearchScope useScope; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/FunctionalExpressionKey.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/FunctionalExpressionKey.java index 11bbffe51275..3606046a24b2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/FunctionalExpressionKey.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/FunctionalExpressionKey.java @@ -30,14 +30,14 @@ import java.io.IOException; */ public class FunctionalExpressionKey { public static final int UNKNOWN_PARAM_COUNT = -1; - public final int lambdaParameterCount; - public final CoarseType lambdaType; + private final int lambdaParameterCount; + private final CoarseType lambdaReturnType; public final Location location; - public FunctionalExpressionKey(int lambdaParameterCount, @NotNull CoarseType lambdaType, @NotNull Location location) { + public FunctionalExpressionKey(int lambdaParameterCount, @NotNull CoarseType lambdaReturnType, @NotNull Location location) { this.location = location; this.lambdaParameterCount = lambdaParameterCount; - this.lambdaType = lambdaType; + this.lambdaReturnType = lambdaReturnType; } @NotNull @@ -49,7 +49,7 @@ public class FunctionalExpressionKey { public void serializeKey(@NotNull DataOutput dataStream) throws IOException { dataStream.writeByte(lambdaParameterCount); - dataStream.writeByte(lambdaType.ordinal()); + dataStream.writeByte(lambdaReturnType.ordinal()); serializeLocation(dataStream); } @@ -78,7 +78,7 @@ public class FunctionalExpressionKey { public boolean canRepresent(int samParamCount, boolean booleanCompatible, boolean isVoid) { if (lambdaParameterCount >= 0 && samParamCount != lambdaParameterCount) return false; - switch (lambdaType) { + switch (lambdaReturnType) { case VOID: return isVoid; case NON_VOID: return !isVoid; case BOOLEAN: return booleanCompatible; @@ -98,7 +98,7 @@ public class FunctionalExpressionKey { FunctionalExpressionKey key = (FunctionalExpressionKey)o; if (lambdaParameterCount != key.lambdaParameterCount) return false; - if (lambdaType != key.lambdaType) return false; + if (lambdaReturnType != key.lambdaReturnType) return false; if (!location.equals(key.location)) return false; return true; @@ -107,7 +107,7 @@ public class FunctionalExpressionKey { @Override public int hashCode() { int result = lambdaParameterCount; - result = 31 * result + lambdaType.ordinal(); + result = 31 * result + lambdaReturnType.ordinal(); result = 31 * result + location.hashCode(); return result; } @@ -116,7 +116,7 @@ public class FunctionalExpressionKey { public String toString() { return MoreObjects.toStringHelper(this) .add("lambdaParameterCount", lambdaParameterCount) - .add("type", lambdaType) + .add("type", lambdaReturnType) .add("location", location) .toString(); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FindSubInterfaceLambdas.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FindSubInterfaceLambdas.java index 67fbed79c127..055079376e2b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FindSubInterfaceLambdas.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FindSubInterfaceLambdas.java @@ -18,9 +18,24 @@ class Foo { DumbAwareRunnable var1 = () -> "var1"; DumbAwareRunnable2 var2 = () -> "var2"; DumbAwareFunction var3 = a -> "var3"; + WithDefaultMethods var4 = () -> "var4"; foo(() -> "c1", DumbAwareRunnable2.class); bar(() -> "c2"); bar2(() -> "c3"); } +} + +interface WithManyMethods { + void run1(); + void run2(); + void run3(); +} +interface WithManyMethods2 extends WithManyMethods { +} + +interface WithDefaultMethods extends WithManyMethods2 { + default String foo() {} + default void run1(); + default void run2(); } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java index 399610f7ee27..3636b7b83727 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java @@ -101,9 +101,14 @@ public class FindFunctionalInterfaceTest extends LightCodeInsightFixtureTestCase public void testFindSubInterfaceLambdas() { configure(); + assertSize(5, FunctionalExpressionSearch.search(findClass("DumbAwareRunnable")).findAll()); assertSize(3, FunctionalExpressionSearch.search(findClass("DumbAwareRunnable2")).findAll()); assertSize(6, FunctionalExpressionSearch.search(findClass("DumbAware")).findAll()); + + assertSize(1, FunctionalExpressionSearch.search(findClass("WithDefaultMethods")).findAll()); + assertSize(1, FunctionalExpressionSearch.search(findClass("WithManyMethods")).findAll()); + assertSize(1, FunctionalExpressionSearch.search(findClass("WithManyMethods2")).findAll()); } public void testArraysStreamLikeApi() {