Log Message
Fix QDOX-239: Type.actualArgumentTypes aren't resolved when field declared with wildcard generic
Modified Paths
Diff
Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/TypeAssembler.java (1490 => 1491)
--- trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/TypeAssembler.java 2012-03-15 20:54:14 UTC (rev 1490)
+++ trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/TypeAssembler.java 2012-03-15 22:40:09 UTC (rev 1491)
@@ -25,6 +25,7 @@
import com.thoughtworks.qdox.model.JavaType;
import com.thoughtworks.qdox.model.impl.DefaultJavaParameterizedType;
import com.thoughtworks.qdox.model.impl.DefaultJavaWildcardType;
+import com.thoughtworks.qdox.model.impl.DefaultJavaWildcardType.BoundType;
import com.thoughtworks.qdox.model.impl.JavaClassParent;
import com.thoughtworks.qdox.model.impl.DefaultJavaType;
import com.thoughtworks.qdox.parser.structs.TypeDef;
@@ -57,7 +58,24 @@
if ( typeDef instanceof WildcardTypeDef )
{
WildcardTypeDef wildcard = (WildcardTypeDef) typeDef;
- result = new DefaultJavaWildcardType( wildcard.getName(), wildcard.getWildcardExpressionType(), context );
+ if( wildcard.getTypeDef() != null )
+ {
+ JavaType type = createUnresolved( wildcard.getTypeDef(), context );
+ DefaultJavaWildcardType.BoundType boundType = null;
+ if( "extends".equals( wildcard.getWildcardExpressionType() ) )
+ {
+ boundType = BoundType.EXTENDS;
+ }
+ else if( "super".equals( wildcard.getWildcardExpressionType() ) )
+ {
+ boundType = BoundType.SUPER;
+ }
+ result = new DefaultJavaWildcardType( type , boundType );
+ }
+ else
+ {
+ result = new DefaultJavaWildcardType();
+ }
}
else
{
Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaWildcardType.java (1490 => 1491)
--- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaWildcardType.java 2012-03-15 20:54:14 UTC (rev 1490)
+++ trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaWildcardType.java 2012-03-15 22:40:09 UTC (rev 1491)
@@ -1,5 +1,9 @@
package com.thoughtworks.qdox.model.impl;
+import java.util.Collections;
+import java.util.List;
+
+import com.thoughtworks.qdox.model.JavaType;
import com.thoughtworks.qdox.model.JavaWildcardType;
/*
@@ -28,52 +32,110 @@
*
* @author Robert Scholte
*/
-public class DefaultJavaWildcardType
- extends DefaultJavaType
+public class DefaultJavaWildcardType extends DefaultJavaType
implements JavaWildcardType
{
+ public static enum BoundType { EXTENDS, SUPER }
+
+ private BoundType boundType;
+
+ private List<JavaType> bounds;
- /**
- * A wildcardExpression is either <code>super</code> or <code>extends</code> or <code>null</code>
- */
- private String wildcardExpressionType = null;
-
public DefaultJavaWildcardType()
{
super( "?" );
+ bounds = Collections.emptyList();
}
+
+ public DefaultJavaWildcardType( JavaType type, BoundType boundType )
+ {
+ this();
+ bounds = Collections.singletonList( type );
+ this.boundType = boundType;
+ }
- public DefaultJavaWildcardType( String name, String wildcardExpressionType, JavaClassParent context )
+ public String getFullyQualifiedName()
{
- super( name, context );
- this.wildcardExpressionType = wildcardExpressionType;
+ StringBuilder builder = getPreparedStringBuilder();
+ for( JavaType type : bounds )
+ {
+ builder.append( type.getFullyQualifiedName() );
+ }
+ return builder.toString();
}
- @Override
public String getGenericValue()
{
- String result = "";
- if ( wildcardExpressionType != null )
+ StringBuilder builder = getPreparedStringBuilder();
+ for( JavaType type : bounds )
{
- result += "? " + wildcardExpressionType + " ";
+ builder.append( type.getGenericValue() );
}
- return result + super.getGenericValue();
+ return builder.toString();
}
- @Override
- public String getFullyQualifiedName()
+ public String getGenericFullyQualifiedName()
{
- return "?";
+ StringBuilder builder = getPreparedStringBuilder();
+ for( JavaType type : bounds )
+ {
+ builder.append( type.getGenericFullyQualifiedName() );
+ }
+ return builder.toString();
}
+
+ public String getCanonicalName()
+ {
+ StringBuilder builder = getPreparedStringBuilder();
+ for( JavaType type : bounds )
+ {
+ builder.append( type.getCanonicalName() );
+ }
+ return builder.toString();
+ }
+
+ public String getGenericCanonicalName()
+ {
+ StringBuilder builder = getPreparedStringBuilder();
+ for( JavaType type : bounds )
+ {
+ builder.append( type.getGenericCanonicalName() );
+ }
+ return builder.toString();
+ }
- @Override
- public String getGenericFullyQualifiedName()
+ public String getValue()
{
- String result = "";
- if ( wildcardExpressionType != null )
+ StringBuilder builder = getPreparedStringBuilder();
+ for( JavaType type : bounds )
{
- result += "? " + wildcardExpressionType + " ";
+ builder.append( type.getValue() );
}
- return result + super.getFullyQualifiedName();
+ return builder.toString();
+
}
+
+ public String toGenericString()
+ {
+ StringBuilder builder = getPreparedStringBuilder();
+ for( JavaType type : bounds )
+ {
+ builder.append( type.toGenericString() );
+ }
+ return builder.toString();
+ }
+
+ private StringBuilder getPreparedStringBuilder()
+ {
+ StringBuilder builder = new StringBuilder( "?" );
+ if( BoundType.EXTENDS.equals( boundType ) )
+ {
+ builder.append( " extends " );
+ }
+ else if( BoundType.SUPER.equals( boundType ) )
+ {
+ builder.append( " super " );
+ }
+ return builder;
+ }
}
\ No newline at end of file
Modified: trunk/qdox/src/test/java/com/thoughtworks/qdox/GenericsTest.java (1490 => 1491)
--- trunk/qdox/src/test/java/com/thoughtworks/qdox/GenericsTest.java 2012-03-15 20:54:14 UTC (rev 1490)
+++ trunk/qdox/src/test/java/com/thoughtworks/qdox/GenericsTest.java 2012-03-15 22:40:09 UTC (rev 1491)
@@ -10,7 +10,9 @@
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaField;
import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaParameterizedType;
import com.thoughtworks.qdox.model.JavaType;
+import com.thoughtworks.qdox.model.JavaWildcardType;
/**
* @author <a href="" Walnes</a>
@@ -365,6 +367,22 @@
assertEquals( "Long", method.getParameterTypes( true ).get(0).getGenericValue() );
}
-
+ // for QDOX-239
+ public void testFieldWithWildcardType()
+ {
+ StringBuilder b = new StringBuilder("package test;\n");
+ b.append("import java.util.ArrayList;\n");
+ b.append("import java.util.Map;\n");
+ b.append("public class TestClass<E>{\n");
+ b.append("public ArrayList<? extends Map<String, E>> list;\n}");
+ builder.addSource(new StringReader(b.toString()));
+ JavaClass javaClass = builder.getClassByName( "test.TestClass" );
+ JavaField field = javaClass.getFields().get( 0 );
+ assertTrue( field.getType() instanceof JavaParameterizedType );
+ JavaParameterizedType paramType = (JavaParameterizedType) field.getType();
+ assertTrue( paramType.getActualTypeArguments().get( 0 ) instanceof JavaWildcardType);
+ JavaWildcardType wildcardType = (JavaWildcardType) paramType.getActualTypeArguments().get( 0 );
+ assertEquals("? extends java.util.Map<java.lang.String,E>", wildcardType.getGenericFullyQualifiedName() );
+ }
}
To unsubscribe from this list please visit:
