Fixes another problem with JSNI method signatures introduced in r2090. Decided to maintain information about whether a type bound was implicit (i.e. ?) or explicit ? (extends | super) T.
Added a test case to JWildcardTypeTest to make sure that we don't break JSNI again.
Review by: spoon (desk check)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2110 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/typeinfo/JParameterizedType.java b/dev/core/src/com/google/gwt/core/ext/typeinfo/JParameterizedType.java
index 5fb3d07..994a427 100644
--- a/dev/core/src/com/google/gwt/core/ext/typeinfo/JParameterizedType.java
+++ b/dev/core/src/com/google/gwt/core/ext/typeinfo/JParameterizedType.java
@@ -15,6 +15,8 @@
*/
package com.google.gwt.core.ext.typeinfo;
+import com.google.gwt.core.ext.typeinfo.JWildcardType.BoundType;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IdentityHashMap;
@@ -51,7 +53,7 @@
for (int i = 0; i < newTypeArgs.length; ++i) {
JClassType newTypeArg = substitutionMap.get(typeParameters[i]);
if (newTypeArg == null) {
- newTypeArg = oracle.getWildcardType(true,
+ newTypeArg = oracle.getWildcardType(BoundType.EXTENDS,
typeParameters[i].getFirstBound());
}
diff --git a/dev/core/src/com/google/gwt/core/ext/typeinfo/JWildcardType.java b/dev/core/src/com/google/gwt/core/ext/typeinfo/JWildcardType.java
index b25cf49..bb5a33e 100644
--- a/dev/core/src/com/google/gwt/core/ext/typeinfo/JWildcardType.java
+++ b/dev/core/src/com/google/gwt/core/ext/typeinfo/JWildcardType.java
@@ -19,13 +19,32 @@
* Represents a wildcard type argument to a parameterized type.
*/
public class JWildcardType extends JDelegatingClassType {
- private boolean isUpperBound;
+ /**
+ * Type of wildcard bound.
+ */
+ public enum BoundType {
+ /**
+ * Used when the declaration explicitly used ? extends Type.
+ */
+ EXTENDS,
+
+ /**
+ * Used when the declaration explicitly used ? super Type.
+ */
+ SUPER,
+
+ /**
+ * Used when the declaration did not specify a bound.
+ */
+ UNBOUND
+ }
private JClassType[] lazyLowerBounds;
private JClassType[] lazyUpperBounds;
+ private final BoundType boundType;
- public JWildcardType(boolean isUpperBound, JClassType typeBound) {
- this.isUpperBound = isUpperBound;
+ public JWildcardType(BoundType boundType, JClassType typeBound) {
+ this.boundType = boundType;
super.setBaseType(typeBound);
}
@@ -41,7 +60,7 @@
@Override
public JClassType getErasedType() {
- if (isUpperBound) {
+ if (isUpperBound()) {
// ? extends T erases to T
return getFirstBound().getErasedType();
}
@@ -72,7 +91,7 @@
*/
public JClassType[] getLowerBounds() {
if (lazyLowerBounds == null) {
- if (isUpperBound) {
+ if (isUpperBound()) {
lazyLowerBounds = TypeOracle.NO_JCLASSES;
} else {
lazyLowerBounds = new JClassType[] {getFirstBound()};
@@ -104,7 +123,7 @@
@Override
public JClassType[] getSubtypes() {
- if (isUpperBound) {
+ if (isUpperBound()) {
return getFirstBound().getSubtypes();
}
@@ -117,7 +136,7 @@
@Override
public JClassType getSuperclass() {
- if (isUpperBound) {
+ if (isUpperBound()) {
// The superclass of an upper bound is the upper bound.
return getFirstBound();
}
@@ -134,7 +153,7 @@
*/
public JClassType[] getUpperBounds() {
if (lazyUpperBounds == null) {
- if (isUpperBound) {
+ if (isUpperBound()) {
lazyUpperBounds = new JClassType[] {getFirstBound()};
} else {
// Object is the default upper bound.
@@ -174,22 +193,35 @@
* requested
*/
boolean boundsMatch(JWildcardType otherWildcard) {
- return isUpperBound == otherWildcard.isUpperBound
+ return isUpperBound() == otherWildcard.isUpperBound()
&& getFirstBound() == otherWildcard.getFirstBound();
}
@Override
JClassType getSubstitutedType(JParameterizedType parameterizedType) {
- return getOracle().getWildcardType(isUpperBound,
+ return getOracle().getWildcardType(boundType,
getFirstBound().getSubstitutedType(parameterizedType));
}
+ private boolean isUnbound() {
+ return boundType == BoundType.UNBOUND;
+ }
+
+ private boolean isUpperBound() {
+ return boundType != BoundType.SUPER;
+ }
+
private String toString(boolean simpleName) {
- String str = "?" + (isUpperBound ? " super " : " extends ");
- if (simpleName) {
- return str + getFirstBound().getSimpleSourceName();
+ String str = "?";
+ if (isUnbound()) {
+ return str;
} else {
- return str + getFirstBound().getParameterizedQualifiedSourceName();
+ str += (isUpperBound() ? " extends " : " super ");
+ if (simpleName) {
+ return str + getFirstBound().getSimpleSourceName();
+ } else {
+ return str + getFirstBound().getParameterizedQualifiedSourceName();
+ }
}
}
}
diff --git a/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java b/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java
index 6a0e534..a4a53c3 100644
--- a/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java
+++ b/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java
@@ -467,9 +467,9 @@
}
}
- public JWildcardType getWildcardType(boolean isUpperBound,
+ public JWildcardType getWildcardType(JWildcardType.BoundType boundType,
JClassType typeBound) {
- JWildcardType wildcardType = new JWildcardType(isUpperBound, typeBound);
+ JWildcardType wildcardType = new JWildcardType(boundType, typeBound);
String sig = wildcardType.getQualifiedSourceName();
List<JWildcardType> candidates = wildcardTypes.get(sig);
if (candidates == null) {
diff --git a/dev/core/src/com/google/gwt/dev/jdt/TypeOracleBuilder.java b/dev/core/src/com/google/gwt/dev/jdt/TypeOracleBuilder.java
index 6726d88..cfc615c 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/TypeOracleBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/TypeOracleBuilder.java
@@ -39,6 +39,7 @@
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.JTypeParameter;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.core.ext.typeinfo.JWildcardType.BoundType;
import com.google.gwt.dev.jdt.CacheManager.Mapper;
import com.google.gwt.dev.util.Empty;
import com.google.gwt.dev.util.PerfLogger;
@@ -1527,24 +1528,24 @@
assert (wcBinding.otherBounds == null);
- boolean isUpperBound;
+ BoundType boundType;
JClassType typeBound;
switch (wcBinding.boundKind) {
case Wildcard.EXTENDS: {
assert (wcBinding.bound != null);
- isUpperBound = true;
+ boundType = BoundType.EXTENDS;
typeBound = (JClassType) resolveType(logger, wcBinding.bound);
}
break;
case Wildcard.SUPER: {
assert (wcBinding.bound != null);
- isUpperBound = false;
+ boundType = BoundType.SUPER;
typeBound = (JClassType) resolveType(logger, wcBinding.bound);
}
break;
case Wildcard.UNBOUND: {
- isUpperBound = true;
+ boundType = BoundType.UNBOUND;
typeBound = (JClassType) resolveType(logger, wcBinding.erasure());
}
break;
@@ -1553,7 +1554,7 @@
return null;
}
- return oracle.getWildcardType(isUpperBound, typeBound);
+ return oracle.getWildcardType(boundType, typeBound);
}
// Log other cases we know about that don't make sense.
diff --git a/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java b/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java
index 6c10840..43eb420 100644
--- a/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java
+++ b/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JWildcardType.BoundType;
import com.google.gwt.core.ext.typeinfo.test.Base;
import com.google.gwt.core.ext.typeinfo.test.Derived;
import com.google.gwt.core.ext.typeinfo.test.ExtendsRawGenericClass;
@@ -89,7 +90,7 @@
public void testGenericClass_LowerBoundWildcard() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JGenericType genericType = getGenericTestType();
- JWildcardType lowerBoundWildcard = oracle.getWildcardType(false,
+ JWildcardType lowerBoundWildcard = oracle.getWildcardType(BoundType.SUPER,
integerType);
JClassType type = oracle.getParameterizedType(genericType,
@@ -103,8 +104,8 @@
public void testGenericClass_UnboundWildcard() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JGenericType genericType = getGenericTestType();
- JWildcardType upperBoundWildcard = oracle.getWildcardType(true,
- oracle.getJavaLangObject());
+ JWildcardType upperBoundWildcard = oracle.getWildcardType(
+ BoundType.EXTENDS, oracle.getJavaLangObject());
JClassType type = oracle.getParameterizedType(genericType,
new JClassType[] {upperBoundWildcard});
@@ -117,7 +118,8 @@
public void testGenericClass_UpperBoundWildcard() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JGenericType genericType = getGenericTestType();
- JWildcardType upperBoundWildcard = oracle.getWildcardType(true, integerType);
+ JWildcardType upperBoundWildcard = oracle.getWildcardType(
+ BoundType.EXTENDS, integerType);
JClassType type = oracle.getParameterizedType(genericType,
new JClassType[] {upperBoundWildcard});
@@ -205,7 +207,7 @@
JGenericType myCustomListType = oracle.getType(MyCustomList.class.getName()).isGenericType();
JParameterizedType parameterizedMyCustomList = oracle.getParameterizedType(
myCustomListType, new JClassType[] {
- oracle.getWildcardType(true,
+ oracle.getWildcardType(BoundType.EXTENDS,
oracle.getType(Serializable.class.getName())), integerType});
JClassType[] expected = {
oracle.getType(MyIntegerList.class.getName()),
@@ -230,12 +232,12 @@
JGenericType genericList = (JGenericType) oracle.getType(List.class.getName());
// ?
- JWildcardType unboundWildcard = oracle.getWildcardType(true,
+ JWildcardType unboundWildcard = oracle.getWildcardType(BoundType.EXTENDS,
oracle.getJavaLangObject());
// ? extends Number
- JWildcardType numUpperBoundWildcard = oracle.getWildcardType(true,
- oracle.getType(Number.class.getName()));
+ JWildcardType numUpperBoundWildcard = oracle.getWildcardType(
+ BoundType.EXTENDS, oracle.getType(Number.class.getName()));
// List<?>
JParameterizedType unboundList = oracle.getParameterizedType(genericList,
@@ -253,8 +255,8 @@
assertTrue(listOfExtendsNumber.isAssignableTo(unboundList));
// ? extends Integer
- JWildcardType intUpperBoundWildcard = oracle.getWildcardType(true,
- integerType);
+ JWildcardType intUpperBoundWildcard = oracle.getWildcardType(
+ BoundType.EXTENDS, integerType);
// List<? extends Integer>
JParameterizedType listOfExtendsInteger = oracle.getParameterizedType(
@@ -268,10 +270,10 @@
assertTrue(listOfExtendsInteger.isAssignableTo(listOfExtendsNumber));
// List<? super Integer> should be assignable from List<? super Number>
- JWildcardType numLowerBoundWildcard = oracle.getWildcardType(false,
- oracle.getType(Number.class.getName()));
- JWildcardType intLowerBoundWildcard = oracle.getWildcardType(false,
- integerType);
+ JWildcardType numLowerBoundWildcard = oracle.getWildcardType(
+ BoundType.SUPER, oracle.getType(Number.class.getName()));
+ JWildcardType intLowerBoundWildcard = oracle.getWildcardType(
+ BoundType.SUPER, integerType);
// List<? super Number>
JParameterizedType listOfSuperNumber = oracle.getParameterizedType(
diff --git a/dev/core/test/com/google/gwt/core/ext/typeinfo/JWildcardTypeTest.java b/dev/core/test/com/google/gwt/core/ext/typeinfo/JWildcardTypeTest.java
index 5fdce28..d91a1d3 100644
--- a/dev/core/test/com/google/gwt/core/ext/typeinfo/JWildcardTypeTest.java
+++ b/dev/core/test/com/google/gwt/core/ext/typeinfo/JWildcardTypeTest.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JWildcardType.BoundType;
import com.google.gwt.core.ext.typeinfo.test.CA;
import com.google.gwt.core.ext.typeinfo.test.CB;
import com.google.gwt.core.ext.typeinfo.test.CC;
@@ -63,11 +64,13 @@
JClassType numberType = oracle.getType(Number.class.getCanonicalName());
// Tests that ? extends Number erases to number.
- JWildcardType upperBoundWildcard = oracle.getWildcardType(true, numberType);
+ JWildcardType upperBoundWildcard = oracle.getWildcardType(
+ BoundType.EXTENDS, numberType);
assertEquals(numberType, upperBoundWildcard.getErasedType());
// Tests that ? super Number erases to Object
- JWildcardType lowerBoundWildcard = oracle.getWildcardType(false, numberType);
+ JWildcardType lowerBoundWildcard = oracle.getWildcardType(BoundType.SUPER,
+ numberType);
assertEquals(oracle.getJavaLangObject(), lowerBoundWildcard.getErasedType());
}
@@ -90,6 +93,32 @@
// No overridable methods
}
+ /**
+ * Tests that {@link JWildcardType#getParameterizedQualifiedSourceName()}
+ * returns the expected value. We test this because JSNI code depends on it.
+ *
+ * @throws NotFoundException
+ */
+ public void testGetParameterizedQualifiedSourceName()
+ throws NotFoundException {
+ TypeOracle oracle = moduleContext.getOracle();
+ JClassType numberType = oracle.getType(Number.class.getName());
+
+ JWildcardType numberUpperBound = oracle.getWildcardType(BoundType.EXTENDS,
+ numberType);
+ assertEquals("? extends " + Number.class.getCanonicalName(),
+ numberUpperBound.getParameterizedQualifiedSourceName());
+
+ JWildcardType numberLowerBound = oracle.getWildcardType(BoundType.SUPER,
+ numberType);
+ assertEquals("? super " + Number.class.getCanonicalName(),
+ numberLowerBound.getParameterizedQualifiedSourceName());
+
+ JWildcardType unboundWildcard = oracle.getWildcardType(BoundType.UNBOUND,
+ oracle.getJavaLangObject());
+ assertEquals("?", unboundWildcard.getParameterizedQualifiedSourceName());
+ }
+
@Override
public void testGetSubtypes() {
// Tested by testGetSubtypes_LowerBound() and testGetSubtypes_UpperBound()
@@ -98,7 +127,7 @@
public void testGetSubtypes_LowerBound() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
// <? super Number>
- JWildcardType lowerBoundWildcard = oracle.getWildcardType(false,
+ JWildcardType lowerBoundWildcard = oracle.getWildcardType(BoundType.SUPER,
oracle.getType(Number.class.getName()));
JClassType[] subtypes = lowerBoundWildcard.getSubtypes();
assertEquals(0, subtypes.length);
@@ -108,8 +137,8 @@
public void testGetSubtypes_UpperBound() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
// <? extends CA>
- JWildcardType upperBoundWildcard = oracle.getWildcardType(true,
- oracle.getType(CA.class.getName()));
+ JWildcardType upperBoundWildcard = oracle.getWildcardType(
+ BoundType.EXTENDS, oracle.getType(CA.class.getName()));
JClassType[] expected = new JClassType[] {
oracle.getType(CB.class.getName()), oracle.getType(CC.class.getName())};
@@ -134,10 +163,12 @@
JClassType numberType = oracle.getType(Number.class.getName());
// ? extends Number
- JClassType extendsNumber = oracle.getWildcardType(true, numberType);
+ JClassType extendsNumber = oracle.getWildcardType(BoundType.EXTENDS,
+ numberType);
// ? extends Integer
- JClassType extendsInteger = oracle.getWildcardType(true, integerType);
+ JClassType extendsInteger = oracle.getWildcardType(BoundType.EXTENDS,
+ integerType);
// Integer is not assignable from ? extends Number
assertFalse(integerType.isAssignableFrom(extendsNumber));
@@ -149,7 +180,8 @@
assertTrue(numberType.isAssignableFrom(extendsInteger));
// ? super Integer
- JClassType superInteger = oracle.getWildcardType(false, integerType);
+ JClassType superInteger = oracle.getWildcardType(BoundType.SUPER,
+ integerType);
// Integer is assignable from ? super Integer
assertFalse(integerType.isAssignableFrom(superInteger));
@@ -157,7 +189,7 @@
// ? super Integer is assignable from Number
assertTrue(superInteger.isAssignableFrom(numberType));
- JClassType superNumber = oracle.getWildcardType(false, numberType);
+ JClassType superNumber = oracle.getWildcardType(BoundType.SUPER, numberType);
// ? super Number is assignable from Integer
assertTrue(superNumber.isAssignableFrom(integerType));
@@ -177,8 +209,10 @@
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
- JWildcardType numberWildcard = oracle.getWildcardType(true, numberType);
- JWildcardType integerWildcard = oracle.getWildcardType(true, integerType);
+ JWildcardType numberWildcard = oracle.getWildcardType(BoundType.EXTENDS,
+ numberType);
+ JWildcardType integerWildcard = oracle.getWildcardType(BoundType.EXTENDS,
+ integerType);
assertTrue(numberWildcard.isAssignableFrom(integerWildcard));
assertFalse(integerWildcard.isAssignableFrom(numberWildcard));
@@ -193,10 +227,12 @@
JClassType javaLangObject = oracle.getJavaLangObject();
// ? super Object
- JWildcardType lowerWildcard = oracle.getWildcardType(false, javaLangObject);
+ JWildcardType lowerWildcard = oracle.getWildcardType(BoundType.SUPER,
+ javaLangObject);
// ? extends Object
- JWildcardType upperWildcard = oracle.getWildcardType(true, javaLangObject);
+ JWildcardType upperWildcard = oracle.getWildcardType(BoundType.EXTENDS,
+ javaLangObject);
// ? extends Object assignable from ? super Object
assertTrue(upperWildcard.isAssignableFrom(lowerWildcard));
@@ -214,8 +250,10 @@
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
- JWildcardType numberWildcard = oracle.getWildcardType(false, numberType);
- JWildcardType integerWildcard = oracle.getWildcardType(false, integerType);
+ JWildcardType numberWildcard = oracle.getWildcardType(BoundType.SUPER,
+ numberType);
+ JWildcardType integerWildcard = oracle.getWildcardType(BoundType.SUPER,
+ integerType);
assertTrue(numberWildcard.isAssignableFrom(integerWildcard));
assertTrue(numberWildcard.isAssignableTo(integerWildcard));
@@ -232,8 +270,10 @@
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
- JWildcardType numberWildcard = oracle.getWildcardType(false, numberType);
- JWildcardType integerWildcard = oracle.getWildcardType(false, integerType);
+ JWildcardType numberWildcard = oracle.getWildcardType(BoundType.SUPER,
+ numberType);
+ JWildcardType integerWildcard = oracle.getWildcardType(BoundType.SUPER,
+ integerType);
assertTrue(numberWildcard.isAssignableTo(integerWildcard));
assertTrue(integerWildcard.isAssignableTo(numberWildcard));
@@ -254,8 +294,10 @@
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
- JWildcardType numberWildcard = oracle.getWildcardType(true, numberType);
- JWildcardType integerWildcard = oracle.getWildcardType(true, integerType);
+ JWildcardType numberWildcard = oracle.getWildcardType(BoundType.EXTENDS,
+ numberType);
+ JWildcardType integerWildcard = oracle.getWildcardType(BoundType.EXTENDS,
+ integerType);
assertTrue(integerWildcard.isAssignableTo(numberWildcard));
assertFalse(numberWildcard.isAssignableTo(integerWildcard));
@@ -270,8 +312,10 @@
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
- JWildcardType numberWildcard = oracle.getWildcardType(false, numberType);
- JWildcardType integerWildcard = oracle.getWildcardType(false, integerType);
+ JWildcardType numberWildcard = oracle.getWildcardType(BoundType.SUPER,
+ numberType);
+ JWildcardType integerWildcard = oracle.getWildcardType(BoundType.SUPER,
+ integerType);
assertTrue(integerWildcard.isAssignableTo(numberWildcard));
assertTrue(numberWildcard.isAssignableTo(integerWildcard));
@@ -289,6 +333,7 @@
@Override
protected JWildcardType getTestType() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
- return oracle.getWildcardType(true, oracle.getType(Number.class.getName()));
+ return oracle.getWildcardType(BoundType.EXTENDS,
+ oracle.getType(Number.class.getName()));
}
}