fun expr search: minor improvements after reviews

This commit is contained in:
peter
2016-08-11 08:24:00 +02:00
parent 7c189cba80
commit e8ea2598f3
4 changed files with 30 additions and 15 deletions

View File

@@ -371,7 +371,7 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
if (!result.add(c)) return;
DirectClassInheritorsSearch.search(c).forEach(candidate -> {
if (candidate.isInterface() && isFunctionalCompatible(candidate)) {
if (candidate.isInterface()) {
visit(candidate);
}
return true;
@@ -381,11 +381,6 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
return result;
}
private static boolean isFunctionalCompatible(PsiClass candidate) {
return LambdaUtil.isFunctionalClass(candidate) ||
Arrays.stream(candidate.getAllMethods()).filter(m -> !m.hasModifierProperty(PsiModifier.DEFAULT)).count() == 0;
}
private static class SamDescriptor {
final PsiClass samClass;
final GlobalSearchScope useScope;

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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() {