You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2018/05/18 08:45:23 UTC
groovy git commit: Refine parameter type inference
Repository: groovy
Updated Branches:
refs/heads/master 7d950582f -> 3ff3111fc
Refine parameter type inference
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3ff3111f
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3ff3111f
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3ff3111f
Branch: refs/heads/master
Commit: 3ff3111fc033bf74ecdbbc4f69e0fc0f76fbdf26
Parents: 7d95058
Author: sunlan <su...@apache.org>
Authored: Fri May 18 16:45:06 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Fri May 18 16:45:17 2018 +0800
----------------------------------------------------------------------
.../codehaus/groovy/control/ResolveVisitor.java | 2 +-
.../stc/StaticTypeCheckingVisitor.java | 23 ++++++++-
src/test/groovy/bugs/Groovy6171Bug.groovy | 52 ++++++++++++++++++--
.../groovy/transform/stc/GenericsSTCTest.groovy | 4 +-
4 files changed, 72 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/3ff3111f/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index f12f65a..1b3ec1a 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -374,7 +374,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
if (genericParameterNames.get(typeName) != null) {
GenericsType gt = genericParameterNames.get(typeName);
- type.setRedirect(gt.getType()); // FIXME lost the generics type info
+ type.setRedirect(gt.getType());
type.setGenericsTypes(new GenericsType[]{ gt });
type.setGenericsPlaceHolder(true);
return true;
http://git-wip-us.apache.org/repos/asf/groovy/blob/3ff3111f/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 00b8974..10d162e 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5426,7 +5426,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
this.parameter = parameter;
ClassNode inferred = parameter.getNodeMetaData(StaticTypesMarker.INFERRED_TYPE);
if (inferred == null) {
- parameter.setNodeMetaData(StaticTypesMarker.INFERRED_TYPE, parameter.getOriginType());
+ inferred = getInferredTypeOfPlaceholder(parameter);
+
+ parameter.setNodeMetaData(StaticTypesMarker.INFERRED_TYPE, inferred);
}
}
@@ -5470,4 +5472,23 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
return parameter.equals(other);
}
}
+
+ private static ClassNode getInferredTypeOfPlaceholder(Variable variable) {
+ ClassNode originType = variable.getOriginType();
+
+ if (originType.isGenericsPlaceHolder()) {
+ GenericsType[] genericsTypes = originType.getGenericsTypes();
+
+ if (null != genericsTypes && genericsTypes.length > 0) {
+ GenericsType gt = genericsTypes[0];
+ ClassNode[] upperBounds = gt.getUpperBounds();
+
+ if (null != upperBounds && upperBounds.length > 0) {
+ return upperBounds[0];
+ }
+ }
+ }
+
+ return variable.getOriginType();
+ }
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/3ff3111f/src/test/groovy/bugs/Groovy6171Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/Groovy6171Bug.groovy b/src/test/groovy/bugs/Groovy6171Bug.groovy
index 574db5b..0d0d6d1 100644
--- a/src/test/groovy/bugs/Groovy6171Bug.groovy
+++ b/src/test/groovy/bugs/Groovy6171Bug.groovy
@@ -19,7 +19,6 @@
package groovy.bugs
import gls.CompilableTestSupport
-import groovy.transform.NotYetImplemented
class Groovy6171Bug extends CompilableTestSupport {
void testGroovy6171() {
@@ -54,8 +53,7 @@ class Groovy6171Bug extends CompilableTestSupport {
assert errMsg.contains('The type HashSet is not a valid substitute for the bounded parameter <T extends java.util.List<X>>')
}
- @NotYetImplemented
- void test2() {
+ void testParameter() {
assertScript '''
@groovy.transform.CompileStatic
public class Foo<T extends List<X>, X extends Number> {
@@ -74,8 +72,52 @@ class Groovy6171Bug extends CompilableTestSupport {
'''
}
+ void testVariable() {
+ assertScript '''
+ @groovy.transform.CompileStatic
+ public class Foo<T extends List<X>, X extends Number> {
+ X getFirstElement() {
+ def list = new ArrayList<Integer>()
+ list.add(123)
+ T t = list
+ X x = t.get(0)
+ return x
+ }
+
+ static void main(String[] args) {
+ def f = new Foo<ArrayList<Integer>, Integer>()
+ assert 123 == f.getFirstElement()
+ }
+ }
+ '''
+ }
+
+ void testField() {
+ assertScript '''
+ @groovy.transform.CompileStatic
+ public class Foo<T extends List<X>, X extends Number> {
+ T t
+
+ {
+ def list = new ArrayList<Integer>()
+ list.add(123)
+ t = list
+ }
+
+ X getFirstElement() {
+ X x = t.get(0)
+ return x
+ }
+
+ static void main(String[] args) {
+ def f = new Foo<ArrayList<Integer>, Integer>()
+ assert 123 == f.getFirstElement()
+ }
+ }
+ '''
+ }
- void test3() {
+ void testParameter2() {
assertScript '''
@groovy.transform.CompileStatic
public class Foo<T extends List<X>, X extends Number> {
@@ -101,7 +143,7 @@ class Groovy6171Bug extends CompilableTestSupport {
'''
}
- void test4() {
+ void testParameterAndVariable() {
assertScript '''
@groovy.transform.CompileStatic
public class Foo<T extends List<X>, X extends Number> {
http://git-wip-us.apache.org/repos/asf/groovy/blob/3ff3111f/src/test/groovy/transform/stc/GenericsSTCTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index fcea9d0..4b1055b 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1092,7 +1092,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
}
}
Baz.qux([new Object()])
- ''', 'Cannot call <T extends java.util.List<? extends java.lang.CharSequence>> Foo#bar(T) with arguments [T]'
+ ''', 'Cannot call <T extends java.util.List<? extends java.lang.CharSequence>> Foo#bar(T) with arguments [java.util.List <Object>]'
}
void testOutOfBoundsBySuperPlaceholderParameterType() {
@@ -1106,7 +1106,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
}
}
Baz.qux(['abc'])
- ''', 'Cannot call <T extends java.util.List<? super java.lang.CharSequence>> Foo#bar(T) with arguments [T]'
+ ''', 'Cannot call <T extends java.util.List<? super java.lang.CharSequence>> Foo#bar(T) with arguments [java.util.List <String>] '
}
// GROOVY-5721