Skip to content

Commit

Permalink
GROOVY-9974
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed Mar 10, 2021
1 parent 009ed38 commit a8c2423
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1243,4 +1243,23 @@ public void testTypeChecked9972c() {

runConformTest(sources, "");
}

@Test
public void testTypeChecked9974() {
//@formatter:off
String[] sources = {
"Main.groovy",
"boolean isBlank(String s) {\n" +
" s.isAllWhitespace()\n" +
"}\n" +
"@groovy.transform.TypeChecked\n" +
"void test() {\n" +
" print([''].removeIf(this.&isBlank))\n" +
"}\n" +
"test()\n",
};
//@formatter:on

runConformTest(sources, "true");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1790,12 +1790,21 @@ private static boolean equalIncludingGenerics(ClassNode orig, ClassNode copy) {
static void extractGenericsConnections(Map<GenericsTypeName, GenericsType> connections, ClassNode type, ClassNode target) {
if (target == null || type == target || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;

MethodNode sam;

if (type.isArray() && target.isArray()) {
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());
// GRECLIPSE add
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
// GRECLIPSE end
} else if (target.isGenericsPlaceHolder() || type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
// structural match route
if (target.isGenericsPlaceHolder()) {
connections.put(new GenericsTypeName(target.getGenericsTypes()[0].getName()), new GenericsType(type));
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));
} else {
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1715,12 +1715,21 @@ static void extractGenericsConnections(final Map<GenericsTypeName, GenericsType>
if (target == null || target == type || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;

MethodNode sam;

if (target.isGenericsPlaceHolder()) {
connections.put(new GenericsTypeName(target.getGenericsTypes()[0].getName()), new GenericsType(type));
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));

} else if (type.isArray() && target.isArray()) {
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());

// GRECLIPSE add
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
// GRECLIPSE end

} else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1713,12 +1713,21 @@ static void extractGenericsConnections(final Map<GenericsTypeName, GenericsType>
if (target == null || target == type || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;

MethodNode sam;

if (target.isGenericsPlaceHolder()) {
connections.put(new GenericsTypeName(target.getGenericsTypes()[0].getName()), new GenericsType(type));
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));

} else if (type.isArray() && target.isArray()) {
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());

// GRECLIPSE add
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
// GRECLIPSE end

} else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());

Expand Down

0 comments on commit a8c2423

Please sign in to comment.