Title: [1491] trunk/qdox/src: Fix QDOX-239: Type.actualArgumentTypes aren't resolved when field declared with wildcard generic
Revision
1491
Author
rfscholte
Date
2012-03-15 17:40:09 -0500 (Thu, 15 Mar 2012)

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:

http://xircles.codehaus.org/manage_email

Reply via email to