Skip to content

Commit 47fc4ae

Browse files
committed
GROOVY-10049
1 parent 6d200a4 commit 47fc4ae

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

+24
Original file line numberDiff line numberDiff line change
@@ -2223,4 +2223,28 @@ public void testTypeChecked10027() {
22232223

22242224
runConformTest(sources, "42");
22252225
}
2226+
2227+
@Test
2228+
public void testTypeChecked10049() {
2229+
if (Float.parseFloat(System.getProperty("java.specification.version")) > 8)
2230+
vmArguments = new String[] {"--add-opens", "java.base/java.util.stream=ALL-UNNAMED"};
2231+
2232+
//@formatter:off
2233+
String[] sources = {
2234+
"Main.groovy",
2235+
"def <X /*extends Number*/> Set<X> generateNumbers(Class<X> type) {\n" +
2236+
" return Collections.singleton(type.newInstance(42))\n" +
2237+
"}\n" +
2238+
"@groovy.transform.TypeChecked\n" +
2239+
"def <Y extends Number> void printNumbers(Class<Y> numberType) {\n" +
2240+
" generateNumbers(numberType).stream()\n" +
2241+
" .filter { n -> n.intValue() > 0 }\n" +
2242+
" .forEach { n -> print n }\n" +
2243+
"}\n" +
2244+
"printNumbers(Integer)\n",
2245+
};
2246+
//@formatter:on
2247+
2248+
runConformTest(sources, "42");
2249+
}
22262250
}

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -3316,11 +3316,13 @@ private void inferSAMType(Parameter param, ClassNode receiver, MethodNode method
33163316
// First we try to get as much information about the declaration
33173317
// class through the receiver
33183318
Map<GenericsTypeName, GenericsType> targetMethodDeclarationClassConnections = new HashMap<GenericsTypeName, GenericsType>();
3319-
// GRECLIPSE add -- GROOVY-9347
3319+
// GRECLIPSE add -- GROOVY-9347, GROOVY-10049
33203320
for (ClassNode face : receiver.getAllInterfaces()) {
3321-
extractGenericsConnections(targetMethodDeclarationClassConnections, StaticTypeCheckingSupport.getCorrectedClassNode(receiver, face, true), face.redirect());
3321+
if (face != receiver) {
3322+
ClassNode type = StaticTypeCheckingSupport.getCorrectedClassNode(receiver, face, true);
3323+
extractGenericsConnections(targetMethodDeclarationClassConnections, type, face.redirect());
3324+
}
33223325
}
3323-
if (!receiver.isInterface())
33243326
// GRECLIPSE end
33253327
extractGenericsConnections(targetMethodDeclarationClassConnections, receiver, receiver.redirect());
33263328
// then we use the method with the SAM parameter to get more information about the declaration

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+10
Original file line numberDiff line numberDiff line change
@@ -3018,12 +3018,22 @@ protected void inferClosureParameterTypes(final ClassNode receiver, final Expres
30183018
private void inferSAMType(final Parameter param, final ClassNode receiver, final MethodNode methodWithSAMParameter, final ArgumentListExpression originalMethodCallArguments, final ClosureExpression openBlock) {
30193019
// first we try to get as much information about the declaration class through the receiver
30203020
Map<GenericsTypeName, GenericsType> targetMethodConnections = new HashMap<>();
3021+
/* GRECLIPSE edit -- GROOVY-10049
30213022
for (ClassNode face : receiver.getAllInterfaces()) {
30223023
extractGenericsConnections(targetMethodConnections, getCorrectedClassNode(receiver, face, true), face.redirect());
30233024
}
30243025
if (!receiver.isInterface()) {
30253026
extractGenericsConnections(targetMethodConnections, receiver, receiver.redirect());
30263027
}
3028+
*/
3029+
for (ClassNode face : receiver.getAllInterfaces()) {
3030+
if (face != receiver) {
3031+
ClassNode type = getCorrectedClassNode(receiver, face, true);
3032+
extractGenericsConnections(targetMethodConnections, type, face.redirect());
3033+
}
3034+
}
3035+
extractGenericsConnections(targetMethodConnections, receiver, receiver.redirect());
3036+
// GRECLIPSE end
30273037

30283038
// then we use the method with the SAM-type parameter to get more information about the declaration
30293039
Parameter[] parametersOfMethodContainingSAM = methodWithSAMParameter.getParameters();

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+10
Original file line numberDiff line numberDiff line change
@@ -2923,12 +2923,22 @@ protected void inferClosureParameterTypes(final ClassNode receiver, final Expres
29232923
private void inferSAMType(final Parameter param, final ClassNode receiver, final MethodNode methodWithSAMParameter, final ArgumentListExpression originalMethodCallArguments, final ClosureExpression openBlock) {
29242924
// first we try to get as much information about the declaration class through the receiver
29252925
Map<GenericsTypeName, GenericsType> targetMethodConnections = new HashMap<>();
2926+
/* GRECLIPSE edit -- GROOVY-10049
29262927
for (ClassNode face : receiver.getAllInterfaces()) {
29272928
extractGenericsConnections(targetMethodConnections, getCorrectedClassNode(receiver, face, true), face.redirect());
29282929
}
29292930
if (!receiver.isInterface()) {
29302931
extractGenericsConnections(targetMethodConnections, receiver, receiver.redirect());
29312932
}
2933+
*/
2934+
for (ClassNode face : receiver.getAllInterfaces()) {
2935+
if (face != receiver) {
2936+
ClassNode type = getCorrectedClassNode(receiver, face, true);
2937+
extractGenericsConnections(targetMethodConnections, type, face.redirect());
2938+
}
2939+
}
2940+
extractGenericsConnections(targetMethodConnections, receiver, receiver.redirect());
2941+
// GRECLIPSE end
29322942

29332943
// then we use the method with the SAM-type parameter to get more information about the declaration
29342944
Parameter[] parametersOfMethodContainingSAM = methodWithSAMParameter.getParameters();

0 commit comments

Comments
 (0)