Title: [1468] trunk/qdox/src: QDOX-226: add JavaField.getEnumConstantClass()

Diff

Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/impl/ModelBuilder.java (1467 => 1468)


--- trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/impl/ModelBuilder.java	2011-12-28 20:10:26 UTC (rev 1467)
+++ trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/impl/ModelBuilder.java	2011-12-28 23:13:35 UTC (rev 1468)
@@ -191,11 +191,15 @@
         // annotations
         setAnnotations( newClass );
         
-        if ( !classStack.isEmpty() )
+        if ( currentField != null )
         {
             classStack.getFirst().addClass( newClass );
+            currentField.setEnumConstantClass( newClass );
+        }
+        else if ( !classStack.isEmpty() )
+        {
+            classStack.getFirst().addClass( newClass );
             newClass.setParentClass( classStack.getFirst() );
-            
         }
         else
         {

Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/model/JavaField.java (1467 => 1468)


--- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/JavaField.java	2011-12-28 20:10:26 UTC (rev 1467)
+++ trunk/qdox/src/main/java/com/thoughtworks/qdox/model/JavaField.java	2011-12-28 23:13:35 UTC (rev 1468)
@@ -64,5 +64,11 @@
      * @since 2.0
      */
     boolean isEnumConstant();
-
+    
+    /**
+     *  
+     * @return the classBody of the enum constant
+     * @since 2.0 
+     */
+    JavaClass getEnumConstantClass();
 }
\ No newline at end of file

Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaField.java (1467 => 1468)


--- trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaField.java	2011-12-28 20:10:26 UTC (rev 1467)
+++ trunk/qdox/src/main/java/com/thoughtworks/qdox/model/impl/DefaultJavaField.java	2011-12-28 23:13:35 UTC (rev 1468)
@@ -33,6 +33,8 @@
 
     private boolean enumConstant;
 
+    private JavaClass enumConstantClass;
+
     public DefaultJavaField()
     {
     }
@@ -116,6 +118,17 @@
     {
         this.enumConstant = enumConstant;
     }
+    
+    /** {@inheritDoc} */
+    public JavaClass getEnumConstantClass()
+    {
+        return enumConstantClass;
+    }
+    
+    public void setEnumConstantClass( JavaClass enumConstantClass )
+    {
+        this.enumConstantClass = enumConstantClass;
+    }
 
     /**
      * @see java.lang.reflect.Field#toString()

Modified: trunk/qdox/src/test/java/com/thoughtworks/qdox/parser/ParserTest.java (1467 => 1468)


--- trunk/qdox/src/test/java/com/thoughtworks/qdox/parser/ParserTest.java	2011-12-28 20:10:26 UTC (rev 1467)
+++ trunk/qdox/src/test/java/com/thoughtworks/qdox/parser/ParserTest.java	2011-12-28 23:13:35 UTC (rev 1468)
@@ -6,6 +6,7 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.LinkedList;
 
@@ -17,6 +18,7 @@
 
 import com.thoughtworks.qdox.builder.Builder;
 import com.thoughtworks.qdox.parser.impl.Parser;
+import com.thoughtworks.qdox.parser.structs.AnnoDef;
 import com.thoughtworks.qdox.parser.structs.ClassDef;
 import com.thoughtworks.qdox.parser.structs.FieldDef;
 import com.thoughtworks.qdox.parser.structs.MethodDef;
@@ -2632,6 +2634,7 @@
         verify( builder, times( 2 ) ).beginField( f.capture() );
         verify( builder, times( 2 ) ).endField();
         verify( builder ).endClass();
+        verifyNoMoreInteractions( builder );
 
         ClassDef cls = classCaptor.getValue();
         assertEquals( "x", cls.getName() );
@@ -2683,7 +2686,78 @@
         assertEquals( new TypeDef( "x" ), fld.getType() ); //bug @todo fixme
         assertEquals( null , fld.getBody() );
     }
+    
+    // QDOX-266
+    public void testEnumConstantWithClassBody() throws Exception 
+    {
+        setupLex(Parser.PUBLIC);
+        setupLex(Parser.ENUM);
+        setupLex(Parser.IDENTIFIER, "MethodLocationOfEnumMethod");
+        setupLex(Parser.BRACEOPEN);
 
+        setupLex(Parser.IDENTIFIER, "A");
+        setupLex(Parser.PARENBLOCK);
+
+        setupLex(Parser.BRACEOPEN);
+        
+        setupLex(Parser.AT);
+        setupLex(Parser.IDENTIFIER, "Override");
+        setupLex(Parser.PUBLIC);
+        setupLex(Parser.IDENTIFIER, "void" );
+        setupLex(Parser.IDENTIFIER, "method" );
+        setupLex(Parser.PARENOPEN);
+        setupLex(Parser.PARENCLOSE);
+        setupLex(Parser.CODEBLOCK);
+        setupLex(Parser.SEMI);
+        
+        setupLex(Parser.BRACECLOSE);
+
+        setupLex(Parser.BRACECLOSE);
+        setupLex(0);
+
+        // execute
+        Parser parser = new Parser(lexer, builder);
+        parser.parse();
+        
+        // expectations
+        ArgumentCaptor<ClassDef> classCaptor = ArgumentCaptor.forClass( ClassDef.class );
+        ArgumentCaptor<FieldDef> f = ArgumentCaptor.forClass(FieldDef.class);
+        ArgumentCaptor<ClassDef> enumConstantClassCaptor = ArgumentCaptor.forClass( ClassDef.class );
+        ArgumentCaptor<AnnoDef> annoCaptor = ArgumentCaptor.forClass( AnnoDef.class );
+        ArgumentCaptor<MethodDef> methodClassCaptor = ArgumentCaptor.forClass( MethodDef.class );
+
+        // verify
+        verify( builder ).beginClass( classCaptor.capture() );
+        verify( builder ).beginField( f.capture() );
+        verify( builder ).beginClass( enumConstantClassCaptor.capture() );
+        verify( builder ).addAnnotation( annoCaptor.capture() );
+        verify( builder ).beginMethod();
+        verify( builder ).endMethod( methodClassCaptor.capture() );
+        verify( builder ).endClass();
+        verify( builder ).endField();
+        verify( builder ).endClass();
+        
+        ClassDef cls = classCaptor.getValue();
+        assertEquals( true, cls.getModifiers().contains( "public" ) );
+        assertEquals( ClassDef.ENUM, cls.getType() );
+        assertEquals( "MethodLocationOfEnumMethod", cls.getName() );
+        FieldDef fld = f.getValue();
+        assertEquals( "A", fld.getName() );
+        assertEquals( new TypeDef( "MethodLocationOfEnumMethod" ), fld.getType() );
+        //ClassDef ecCls = enumConstantClassCaptor.getValue();
+        AnnoDef ann = annoCaptor.getValue();
+        assertEquals( "Override", ann.getTypeDef().getName() );
+        MethodDef mth = methodClassCaptor.getValue();
+        assertEquals( "method", mth.getName() );
+        
+//        Class methodLocationOfEnumMethod = MethodLocationOfEnumMethod.class;
+//        Field a = methodLocationOfEnumMethod.getField( "A" );
+//        assertNotNull( a );
+//        assertSame( methodLocationOfEnumMethod, a.getDeclaringClass() );
+//        assertSame( methodLocationOfEnumMethod, a.getType() );
+//        assertEquals( 2, methodLocationOfEnumMethod.getDeclaredMethods().length);
+    }
+
     private void setupLex(int token, String value) {
         lexValues.add( token );
         textValues.add( value );
@@ -2700,4 +2774,24 @@
         }
     }
 
+    private enum MethodLocationOfEnumMethod
+    {
+      A()
+      {
+        @Override
+        public void method()
+        {
+        };
+        
+        public String doThis() { return null; }
+      };
+
+      public abstract void method();
+
+      private void test()
+      {
+      };
+      
+      String name = "x";
+    }
 }
\ No newline at end of file

To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to