groovy git commit: GROOVY-8439: @CompileStatic cannot compile generic class's static method

2018-03-10 Thread sunlan
Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_4_X c6f1a8151 -> 2f7d9ddcb


GROOVY-8439: @CompileStatic cannot compile generic class's static method


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/2f7d9ddc
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/2f7d9ddc
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/2f7d9ddc

Branch: refs/heads/GROOVY_2_4_X
Commit: 2f7d9ddcb87554ed8c158b1cd568483835367bf0
Parents: c6f1a81
Author: danielsun1106 
Authored: Sat Mar 10 22:45:53 2018 +0800
Committer: danielsun1106 
Committed: Sat Mar 10 22:45:53 2018 +0800

--
 .../codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
--


http://git-wip-us.apache.org/repos/asf/groovy/blob/2f7d9ddc/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
--
diff --git 
a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java 
b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 734e618..26cec8d 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2014,7 +2014,7 @@ public abstract class StaticTypeCheckingSupport {
 
 Map map;
 if (mn.isStatic()) {
-map = new HashMap<>();
+map = new HashMap();
 } else {
 map = getGenericsParameterMapOfThis(mn.getDeclaringClass());
 }



groovy git commit: GROOVY-8439: @CompileStatic cannot compile generic class's static method

2018-03-10 Thread sunlan
Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_4_X 96748cca8 -> c6f1a8151


GROOVY-8439: @CompileStatic cannot compile generic class's static method

(cherry picked from commit 7b73c6a)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/c6f1a815
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/c6f1a815
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/c6f1a815

Branch: refs/heads/GROOVY_2_4_X
Commit: c6f1a815133ceef9234fa2da5ccf51b4d5f82367
Parents: 96748cc
Author: danielsun1106 
Authored: Sat Mar 10 22:41:11 2018 +0800
Committer: danielsun1106 
Committed: Sat Mar 10 22:41:11 2018 +0800

--
 .../transform/stc/StaticTypeCheckingSupport.java  | 14 ++
 .../transform/stc/StaticTypeCheckingVisitor.java  |  2 ++
 2 files changed, 12 insertions(+), 4 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/groovy/blob/c6f1a815/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
--
diff --git 
a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java 
b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 0e08127..734e618 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2010,10 +2010,16 @@ public abstract class StaticTypeCheckingSupport {
 }
 
 static Map 
extractGenericsParameterMapOfThis(MethodNode mn) {
-if (mn==null) return null;
-Map map = 
getGenericsParameterMapOfThis(mn.getDeclaringClass());
-map = mergeGenerics(map, mn.getGenericsTypes());
-return map;
+if (mn == null) return null;
+
+Map map;
+if (mn.isStatic()) {
+map = new HashMap<>();
+} else {
+map = getGenericsParameterMapOfThis(mn.getDeclaringClass());
+}
+
+return mergeGenerics(map, mn.getGenericsTypes());
 }
 
 private static Map mergeGenerics(Map current, GenericsType[] newGenerics) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/c6f1a815/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
--
diff --git 
a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java 
b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 93ea99c..dbc5dc6 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2709,6 +2709,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 }
 }
 boolean lastArg = i == length - 1;
+
 if (lastArg && inferredType.isArray()) {
 if 
(inferredType.getComponentType().equals(originType)) {
 inferredType = originType;
@@ -2716,6 +2717,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 } else if 
(!typeCheckMethodArgumentWithGenerics(originType, inferredType, lastArg)) {
 addError("Expected parameter of type "+ 
inferredType.toString(false)+" but got "+originType.toString(false), 
closureParam.getType());
 }
+
 
typeCheckingContext.controlStructureVariables.put(closureParam, inferredType);
 }
 }



groovy git commit: GROOVY-8439: @CompileStatic cannot compile generic class's static method

2018-03-10 Thread sunlan
Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_5_X 92c3e4492 -> dae251c5d


GROOVY-8439: @CompileStatic cannot compile generic class's static method

(cherry picked from commit 7b73c6a)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/dae251c5
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/dae251c5
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/dae251c5

Branch: refs/heads/GROOVY_2_5_X
Commit: dae251c5d43a0b819392d6c3ce11182c5f064ecb
Parents: 92c3e44
Author: danielsun1106 
Authored: Sat Mar 10 22:16:06 2018 +0800
Committer: danielsun1106 
Committed: Sat Mar 10 22:38:43 2018 +0800

--
 .../stc/StaticTypeCheckingSupport.java  | 14 +++--
 .../stc/StaticTypeCheckingVisitor.java  |  2 +
 src/test/groovy/bugs/Groovy8439Bug.groovy   | 63 
 3 files changed, 75 insertions(+), 4 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/groovy/blob/dae251c5/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
--
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 5b9622d..c982daa 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2015,10 +2015,16 @@ public abstract class StaticTypeCheckingSupport {
 }
 
 static Map 
extractGenericsParameterMapOfThis(MethodNode mn) {
-if (mn==null) return null;
-Map map = 
getGenericsParameterMapOfThis(mn.getDeclaringClass());
-map = mergeGenerics(map, mn.getGenericsTypes());
-return map;
+if (mn == null) return null;
+
+Map map;
+if (mn.isStatic()) {
+map = new HashMap<>();
+} else {
+map = getGenericsParameterMapOfThis(mn.getDeclaringClass());
+}
+
+return mergeGenerics(map, mn.getGenericsTypes());
 }
 
 private static Map mergeGenerics(Map current, GenericsType[] newGenerics) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/dae251c5/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
--
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 8b71bda..d200fc5 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2737,6 +2737,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 }
 }
 boolean lastArg = i == length - 1;
+
 if (lastArg && inferredType.isArray()) {
 if 
(inferredType.getComponentType().equals(originType)) {
 inferredType = originType;
@@ -2744,6 +2745,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 } else if 
(!typeCheckMethodArgumentWithGenerics(originType, inferredType, lastArg)) {
 addError("Expected parameter of type "+ 
inferredType.toString(false)+" but got "+originType.toString(false), 
closureParam.getType());
 }
+
 
typeCheckingContext.controlStructureVariables.put(closureParam, inferredType);
 }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/dae251c5/src/test/groovy/bugs/Groovy8439Bug.groovy
--
diff --git a/src/test/groovy/bugs/Groovy8439Bug.groovy 
b/src/test/groovy/bugs/Groovy8439Bug.groovy
new file mode 100644
index 000..13af477
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy8439Bug.groovy
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by 

groovy git commit: GROOVY-8439: @CompileStatic cannot compile generic class's static method

2018-03-10 Thread sunlan
Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_6_X 17fb0de31 -> 7b73c6aeb


GROOVY-8439: @CompileStatic cannot compile generic class's static method


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/7b73c6ae
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/7b73c6ae
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/7b73c6ae

Branch: refs/heads/GROOVY_2_6_X
Commit: 7b73c6aeb2d399512b6cdfbb6ff4fbef59c33f9a
Parents: 17fb0de
Author: danielsun1106 
Authored: Sat Mar 10 22:16:06 2018 +0800
Committer: danielsun1106 
Committed: Sat Mar 10 22:36:38 2018 +0800

--
 .../stc/StaticTypeCheckingSupport.java  | 14 +++--
 .../stc/StaticTypeCheckingVisitor.java  |  2 +
 src/test/groovy/bugs/Groovy8439Bug.groovy   | 63 
 3 files changed, 75 insertions(+), 4 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/groovy/blob/7b73c6ae/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
--
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 5f0e983..57cec53 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2021,10 +2021,16 @@ public abstract class StaticTypeCheckingSupport {
 }
 
 static Map 
extractGenericsParameterMapOfThis(MethodNode mn) {
-if (mn==null) return null;
-Map map = 
getGenericsParameterMapOfThis(mn.getDeclaringClass());
-map = mergeGenerics(map, mn.getGenericsTypes());
-return map;
+if (mn == null) return null;
+
+Map map;
+if (mn.isStatic()) {
+map = new HashMap<>();
+} else {
+map = getGenericsParameterMapOfThis(mn.getDeclaringClass());
+}
+
+return mergeGenerics(map, mn.getGenericsTypes());
 }
 
 private static Map mergeGenerics(Map current, GenericsType[] newGenerics) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/7b73c6ae/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
--
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 28a7ca4..6ff0dd7 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2738,6 +2738,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 }
 }
 boolean lastArg = i == length - 1;
+
 if (lastArg && inferredType.isArray()) {
 if 
(inferredType.getComponentType().equals(originType)) {
 inferredType = originType;
@@ -2745,6 +2746,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 } else if 
(!typeCheckMethodArgumentWithGenerics(originType, inferredType, lastArg)) {
 addError("Expected parameter of type "+ 
inferredType.toString(false)+" but got "+originType.toString(false), 
closureParam.getType());
 }
+
 
typeCheckingContext.controlStructureVariables.put(closureParam, inferredType);
 }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/7b73c6ae/src/test/groovy/bugs/Groovy8439Bug.groovy
--
diff --git a/src/test/groovy/bugs/Groovy8439Bug.groovy 
b/src/test/groovy/bugs/Groovy8439Bug.groovy
new file mode 100644
index 000..13af477
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy8439Bug.groovy
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  

groovy git commit: GROOVY-8439: @CompileStatic cannot compile generic class's static method

2018-03-10 Thread sunlan
Repository: groovy
Updated Branches:
  refs/heads/master e154c3e56 -> 3eb491cde


GROOVY-8439: @CompileStatic cannot compile generic class's static method


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3eb491cd
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3eb491cd
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3eb491cd

Branch: refs/heads/master
Commit: 3eb491cded846c352952cdb3a6fffed817e14741
Parents: e154c3e
Author: danielsun1106 
Authored: Sat Mar 10 22:16:06 2018 +0800
Committer: danielsun1106 
Committed: Sat Mar 10 22:16:06 2018 +0800

--
 .../transform/stc/StaticTypeCheckingSupport.java  | 14 ++
 .../transform/stc/StaticTypeCheckingVisitor.java  |  6 +-
 src/test/groovy/bugs/Groovy8439Bug.groovy | 14 ++
 3 files changed, 25 insertions(+), 9 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/groovy/blob/3eb491cd/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
--
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index cd5d977..c13a163 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2021,10 +2021,16 @@ public abstract class StaticTypeCheckingSupport {
 }
 
 static Map 
extractGenericsParameterMapOfThis(MethodNode mn) {
-if (mn==null) return null;
-Map map = 
getGenericsParameterMapOfThis(mn.getDeclaringClass());
-map = mergeGenerics(map, mn.getGenericsTypes());
-return map;
+if (mn == null) return null;
+
+Map map;
+if (mn.isStatic()) {
+map = new HashMap<>();
+} else {
+map = getGenericsParameterMapOfThis(mn.getDeclaringClass());
+}
+
+return mergeGenerics(map, mn.getGenericsTypes());
 }
 
 private static Map mergeGenerics(Map current, GenericsType[] newGenerics) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/3eb491cd/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
--
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 7881176..800453f 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2744,11 +2744,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 inferredType = originType;
 }
 } else if 
(!typeCheckMethodArgumentWithGenerics(originType, inferredType, lastArg)) {
-if (!isGenericsPlaceHolderOrArrayOf(originType)) { // 
the original type is not generics placeholder, use original type directly. See 
GROOVY-8439
-inferredType = originType;
-} else {
-addError("Expected parameter of type "+ 
inferredType.toString(false)+" but got "+originType.toString(false), 
closureParam.getType());
-}
+addError("Expected parameter of type "+ 
inferredType.toString(false)+" but got "+originType.toString(false), 
closureParam.getType());
 }
 
 
typeCheckingContext.controlStructureVariables.put(closureParam, inferredType);

http://git-wip-us.apache.org/repos/asf/groovy/blob/3eb491cd/src/test/groovy/bugs/Groovy8439Bug.groovy
--
diff --git a/src/test/groovy/bugs/Groovy8439Bug.groovy 
b/src/test/groovy/bugs/Groovy8439Bug.groovy
index ccca137..13af477 100644
--- a/src/test/groovy/bugs/Groovy8439Bug.groovy
+++ b/src/test/groovy/bugs/Groovy8439Bug.groovy
@@ -46,4 +46,18 @@ class Groovy8439Bug extends GroovyTestCase {
 Test.something(null, [])
 '''
 }
+
+void testSTCGenerics2() {
+assertScript '''
+import groovy.transform.CompileStatic
+@CompileStatic
+class Test {
+static def something(List strList) {
+strList.collect { "hello,$it" } 
+}
+}
+
+assert ["hello,Jochen", "hello,Paul", 

groovy git commit: GROOVY-8439: @CompileStatic cannot compile generic class's static method

2018-03-10 Thread sunlan
Repository: groovy
Updated Branches:
  refs/heads/master a8b9be9e6 -> e154c3e56


GROOVY-8439: @CompileStatic cannot compile generic class's static method


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/e154c3e5
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/e154c3e5
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/e154c3e5

Branch: refs/heads/master
Commit: e154c3e560e998e158985316566c7e321579b193
Parents: a8b9be9
Author: danielsun1106 
Authored: Sat Mar 10 21:43:49 2018 +0800
Committer: danielsun1106 
Committed: Sat Mar 10 21:43:49 2018 +0800

--
 .../stc/StaticTypeCheckingVisitor.java  |  8 +++-
 src/test/groovy/bugs/Groovy8439Bug.groovy   | 49 
 2 files changed, 56 insertions(+), 1 deletion(-)
--


http://git-wip-us.apache.org/repos/asf/groovy/blob/e154c3e5/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
--
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index c3f0148..7881176 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2738,13 +2738,19 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 }
 }
 boolean lastArg = i == length - 1;
+
 if (lastArg && inferredType.isArray()) {
 if 
(inferredType.getComponentType().equals(originType)) {
 inferredType = originType;
 }
 } else if 
(!typeCheckMethodArgumentWithGenerics(originType, inferredType, lastArg)) {
-addError("Expected parameter of type "+ 
inferredType.toString(false)+" but got "+originType.toString(false), 
closureParam.getType());
+if (!isGenericsPlaceHolderOrArrayOf(originType)) { // 
the original type is not generics placeholder, use original type directly. See 
GROOVY-8439
+inferredType = originType;
+} else {
+addError("Expected parameter of type "+ 
inferredType.toString(false)+" but got "+originType.toString(false), 
closureParam.getType());
+}
 }
+
 
typeCheckingContext.controlStructureVariables.put(closureParam, inferredType);
 }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/e154c3e5/src/test/groovy/bugs/Groovy8439Bug.groovy
--
diff --git a/src/test/groovy/bugs/Groovy8439Bug.groovy 
b/src/test/groovy/bugs/Groovy8439Bug.groovy
new file mode 100644
index 000..ccca137
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy8439Bug.groovy
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy.bugs
+
+class Groovy8439Bug extends GroovyTestCase {
+void testSTCGenerics() {
+assertScript '''
+import groovy.transform.CompileStatic
+@CompileStatic
+class Test {
+static def something(Task task, Collection variants) {
+variants.collectMany { it.sourceFolders }.collect { 
ConfigurableFileTree tree ->
+
task.getBuildDir().toPath().relativize(tree.dir.toPath()).toString() + 
File.separator
+}
+}
+}
+
+interface BaseVariant {
+List getSourceFolders()
+}
+
+interface ConfigurableFileTree {
+File getDir()
+}
+
+interface Task {
+File getBuildDir()
+}
+
+