Title: [1311] trunk/qdox/src/grammar: Lexer+Parser now EnumConstant with YYINITIAL instead of just CODEBLOCK, so everything between the braces is recognized.
Revision
1311
Author
rfscholte
Date
2011-09-04 15:59:08 -0500 (Sun, 04 Sep 2011)

Log Message

Lexer+Parser now EnumConstant with YYINITIAL instead of just CODEBLOCK, so everything between the braces is recognized. Still some cleanup to do.

Modified Paths

Diff

Modified: trunk/qdox/src/grammar/lexer.flex (1310 => 1311)

--- trunk/qdox/src/grammar/lexer.flex	2011-09-04 15:22:46 UTC (rev 1310)
+++ trunk/qdox/src/grammar/lexer.flex	2011-09-04 20:59:08 UTC (rev 1311)
@@ -221,7 +221,14 @@
         }
         else {
           nestingDepth++;
-          braceMode = CODEBLOCK;
+          if (enumConstantMode && yystate() == ENUM)
+          {
+            braceMode = YYINITIAL;
+          }
+          else 
+          {
+            braceMode = CODEBLOCK;
+          }
           return Parser.BRACEOPEN;
         }
     }
@@ -229,7 +236,14 @@
         nestingDepth--;
         classDepth--;
         popState();
-        braceMode = CODEBLOCK;
+        if ( yystate() == ENUM && enumConstantMode)
+        {
+          braceMode = YYINITIAL;
+        }
+        else
+        {
+          braceMode = CODEBLOCK;
+        }
         return Parser.BRACECLOSE; 
     }
 
@@ -267,7 +281,11 @@
           }
 }
 <ENUM> {
-    ";"  { enumConstantMode = false; return Parser.SEMI; }
+    ";"  { 
+    		enumConstantMode = false; 
+    		braceMode = CODEBLOCK; 
+    		return Parser.SEMI;
+    	 }
     "("  {
             nestingDepth++;
             if(parenMode >= 0) {
@@ -276,17 +294,15 @@
               parenMode = -1;
               return Parser.PARENOPEN;
             }
-            else {
-              if(enumConstantMode) {
+            else if(enumConstantMode) {
                 parenDepth = classDepth;
                 pushState(PARENBLOCK);
                 return Parser.PARENBLOCK;
-              }
-              else {
+            }
+            else {
                 return Parser.PARENOPEN;
-              }
             }
-          }
+         }
 }
 <CODEBLOCK> {
      "{"  { 

Modified: trunk/qdox/src/grammar/parser.y (1310 => 1311)

--- trunk/qdox/src/grammar/parser.y	2011-09-04 15:22:46 UTC (rev 1310)
+++ trunk/qdox/src/grammar/parser.y	2011-09-04 20:59:08 UTC (rev 1311)
@@ -456,6 +456,8 @@
     AnyModifiers_opt Type VariableDeclaratorId {
         fieldType = $2;
         makeField($3, lexer.getCodeBody(), false);
+        builder.beginField(fd);
+        builder.endField();
     }
     extrafields SEMI {
         modifiers.clear();
@@ -464,6 +466,8 @@
 extrafields: | 
     extrafields COMMA { line = lexer.getLine(); } VariableDeclaratorId {
         makeField($4, lexer.getCodeBody(), false);
+        builder.beginField(fd);
+        builder.endField();
     }; 
 
 // 8.3 Field Declarations...
@@ -622,17 +626,21 @@
                  | EnumConstants_opt COMMA
                  | EnumConstants_opt EnumConstant;
                  
-EnumConstant: Annotations_opt IDENTIFIER Arguments_opt ClassBody_opt
+EnumConstant: Annotations_opt IDENTIFIER Arguments_opt
               { 
                 makeField(new TypeDef($2, 0), "", true); 
+                builder.beginField(fd);
+              }
+              ClassBody_opt
+              {
+                builder.endField();
               };
-
          
 Arguments_opt:
              | PARENBLOCK /* =Arguments */;
 
 ClassBody_opt:
-             | CODEBLOCK /* =ClassBody */;
+             | ClassBody;
 
 EnumBodyDeclarations_opt:
                         | SEMI ClassBodyDeclarations_opt;      
@@ -823,6 +831,7 @@
 private StringBuffer textBuffer = new StringBuffer();
 private ClassDef cls = new ClassDef();
 private MethodDef mth = new MethodDef();
+private FieldDef fd;
 private List<TypeVariableDef> typeParams = new LinkedList<TypeVariableDef>(); //for both JavaClass and JavaMethod
 private LinkedList<AnnoDef> annotationStack = new LinkedList<AnnoDef>(); // Use LinkedList instead of Stack because it is unsynchronized 
 private List<List<ElemValueDef>> annoValueListStack = new LinkedList<List<ElemValueDef>>(); // Use LinkedList instead of Stack because it is unsynchronized
@@ -904,15 +913,14 @@
 
 
 private void makeField(TypeDef field, String body, boolean enumConstant) {
-    FieldDef fd = new FieldDef( field.getName() );
+    fd = new FieldDef( field.getName() );
+    fd.setName(field.getName());
     fd.setLineNumber(line);
     fd.getModifiers().addAll(modifiers); 
     fd.setType( fieldType );
     fd.setDimensions(field.getDimensions());
     fd.setEnumConstant(enumConstant);
     fd.setBody(body);
-    builder.beginField(fd);
-    builder.endField();
 }
 
 public void onComment( String comment, int line, int column ) {

Modified: trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/ModelBuilder.java (1310 => 1311)

--- trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/ModelBuilder.java	2011-09-04 15:22:46 UTC (rev 1310)
+++ trunk/qdox/src/main/java/com/thoughtworks/qdox/builder/ModelBuilder.java	2011-09-04 20:59:08 UTC (rev 1311)
@@ -66,6 +66,7 @@
     private List<DefaultJavaParameter> parameterList = new LinkedList<DefaultJavaParameter>();
     private DefaultJavaConstructor currentConstructor;
     private DefaultJavaMethod currentMethod;
+    private DefaultJavaField currentField;
     private List<AnnoDef> currentAnnoDefs;
     private String lastComment;
     private List<TagDef> lastTagSet = new LinkedList<TagDef>();
@@ -256,17 +257,18 @@
         currentConstructor.setSourceCode(def.getBody());
     }
 
-    public void beginMethod() {
-    	currentMethod = new DefaultJavaMethod();
-    	currentMethod.setParentClass(classStack.getFirst());
-        classStack.getFirst().addMethod(currentMethod);
+    public void beginMethod()
+    {
+        currentMethod = new DefaultJavaMethod();
+        if ( currentField == null )
+        {
+            currentMethod.setParentClass( classStack.getFirst() );
+            classStack.getFirst().addMethod( currentMethod );
+        }
+        currentMethod.setModelWriterFactory( modelWriterFactory );
 
-        currentMethod.setModelWriterFactory(modelWriterFactory);
-    	
-        // javadoc
-        addJavaDoc(currentMethod);
-
-    	setAnnotations(currentMethod);
+        addJavaDoc( currentMethod );
+        setAnnotations( currentMethod );
     }
     
     public void endMethod(MethodDef def) {
@@ -324,7 +326,7 @@
     }
 
 	public void beginField(FieldDef def) {
-        DefaultJavaField currentField = new DefaultJavaField();
+        currentField = new DefaultJavaField();
         currentField.setParentClass(classStack.getFirst());
         currentField.setLineNumber(def.getLineNumber());
         currentField.setModelWriterFactory(modelWriterFactory);
@@ -347,12 +349,12 @@
         // annotations
         setAnnotations( currentField );
 
-        classStack.getFirst().addField(currentField);
     }
 	
 	public void endField() 
 	{
-	    
+        classStack.getFirst().addField(currentField);
+        currentField = null;
 	}
 	
 	public void addParameter(FieldDef fieldDef) {

Modified: trunk/qdox/src/test/java/com/thoughtworks/qdox/JavaProjectBuilderTest.java (1310 => 1311)

--- trunk/qdox/src/test/java/com/thoughtworks/qdox/JavaProjectBuilderTest.java	2011-09-04 15:22:46 UTC (rev 1310)
+++ trunk/qdox/src/test/java/com/thoughtworks/qdox/JavaProjectBuilderTest.java	2011-09-04 20:59:08 UTC (rev 1311)
@@ -1376,4 +1376,29 @@
         assertEquals( "com.foo.Outer$Inner$Core", cls.getFullyQualifiedName() );
         assertEquals( "com.foo.Outer.Inner.Core", cls.getCanonicalName() );
     }
+    
+    public void testEnumConstantMethods() {
+        String source = "public enum MethodLocationOfEnumMethod\n" + 
+        		"{\n" + 
+        		"  A()\n" + 
+        		"  {\n" + 
+        		"    @Override\n" + 
+        		"    private void method()\n" + 
+        		"    {\n" + 
+        		"    };\n" + 
+        		"  };\n" + 
+        		"  public abstract void method();\n" + 
+        		"  private void test()\n" + 
+        		"  {\n" + 
+        		"  };\n" + 
+        		"  \n" + 
+        		"  String name = \"x\";" + 
+        		"}";
+        builder.addSource( new StringReader( source ) );
+        JavaClass cls = builder.getClassByName( "MethodLocationOfEnumMethod" );
+        assertEquals( 2, cls.getMethods().size() );
+        assertEquals( "method", cls.getMethods().get( 0 ).getName() );
+        assertEquals( true, cls.getMethods().get( 0 ).isAbstract() );
+        assertEquals( "test", cls.getMethods().get( 1 ).getName() );
+    }
 }
\ No newline at end of file

Modified: trunk/qdox/src/test/java/com/thoughtworks/qdox/parser/LexerTest.java (1310 => 1311)

--- trunk/qdox/src/test/java/com/thoughtworks/qdox/parser/LexerTest.java	2011-09-04 15:22:46 UTC (rev 1310)
+++ trunk/qdox/src/test/java/com/thoughtworks/qdox/parser/LexerTest.java	2011-09-04 20:59:08 UTC (rev 1311)
@@ -490,8 +490,18 @@
         assertLex(Parser.IDENTIFIER, "Animal", lexer);
         assertLex(Parser.BRACEOPEN, lexer);
         assertLex(Parser.IDENTIFIER, "DUCK", lexer);
-        assertLex(Parser.CODEBLOCK, lexer);
+        //assertLex(Parser.CODEBLOCK, lexer);
+        assertLex( Parser.BRACEOPEN, lexer );
+        assertLex(Parser.PUBLIC, lexer);
+        assertLex(Parser.IDENTIFIER, "void", lexer);
+        assertLex( Parser.IDENTIFIER, "speak", lexer );
+        assertLex( Parser.PARENOPEN, lexer );
+        assertLex( Parser.PARENCLOSE, lexer );
+        assertLex( Parser.CODEBLOCK, lexer );
+        assertLex( Parser.BRACECLOSE, lexer );
+        
         assertLex(Parser.BRACECLOSE, lexer);
+        assertLex( 0, lexer );
     }
 
     private void assertSingleLex(String in, short expectedLex) throws Exception {


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to