I'm committing this on behalf of Stephan Michels
to add annotation support to gjdoc (it gets it a bit
further on classpath).
No more patches should be added without an assignment.

2007-04-09  Stephan Michels  <[EMAIL PROTECTED]>

        * src/gnu/classpath/tools/gjdoc/ClassDocImpl.java,
        * src/gnu/classpath/tools/gjdoc/Parser.java:
        Add basic annotation support.
-- 
Andrew :-)

Escape the Java Trap with GNU Classpath!
http://www.gnu.org/philosophy/java-trap.html
public class gcj extends Freedom implements Java { ... }
Index: src/gnu/classpath/tools/gjdoc/ClassDocImpl.java
===================================================================
RCS file: /sources/classpath/gjdoc/src/gnu/classpath/tools/gjdoc/ClassDocImpl.java,v
retrieving revision 1.28
diff -u -3 -p -u -r1.28 ClassDocImpl.java
--- src/gnu/classpath/tools/gjdoc/ClassDocImpl.java	27 Oct 2005 13:33:21 -0000	1.28
+++ src/gnu/classpath/tools/gjdoc/ClassDocImpl.java	9 Apr 2007 18:17:42 -0000
@@ -200,6 +200,10 @@ public class ClassDocImpl
       return isInterface;
    }
 
+   public boolean isAnnotation() {
+      return isAnnotation;
+   }
+
    // Return true if this class is abstract 
    public void setIsAbstract(boolean b) {
       this.isAbstract=b;
@@ -316,9 +320,11 @@ public class ClassDocImpl
       final int STATE_NORMAL = 1;
       final int STATE_SLASHC = 2;
       final int STATE_STARC  = 3;
+      final int STATE_ANNO   = 4;
 
       int state=STATE_NORMAL;
       int varLevel=0;
+      int parLevel=0;
       char prev=0;
       for (int ndx=startIndex; ndx<=endIndex; ++ndx) {
 	 char c=(ndx==endIndex)?10:source[ndx];
@@ -348,6 +354,20 @@ public class ClassDocImpl
 	       word=word.substring(0,word.length()-1);
 	       processWord=true;
 	    }
+	    else if (c=='@') {
+               state=STATE_ANNO;
+	       word += c;
+	    }
+	    else if (c=='(' && state==STATE_ANNO) {
+               ++parLevel;
+               word += c;
+            }
+            else if (c==')' && state==STATE_ANNO) {
+               --parLevel;
+               word += c;
+	       if (parLevel == 0)
+                   state=STATE_NORMAL;
+            }
 	    else if (c=='<')
 	      {
 		++varLevel;
@@ -358,9 +378,11 @@ public class ClassDocImpl
 		--varLevel;
 		word += c;
 	      }
-	    else if (c=='{' || c==',' && varLevel == 0 || 
-		     Parser.WHITESPACE.indexOf(c)>=0) {
+	    else if (c=='{' && parLevel == 0 || 
+	             c==',' && varLevel == 0 && parLevel == 0 || 
+		     Parser.WHITESPACE.indexOf(c)>=0 && parLevel == 0 ) {
 	       processWord=true;
+	       state=STATE_NORMAL;
 	    }
 	    else {
 	       word+=c;
@@ -381,13 +403,18 @@ public class ClassDocImpl
 		     rc.setIsInterface(true);
 		     item=1;
 		  }
+		  else if (word.equals("@interface")) {
+		     rc.setIsInterface(true);
+                     rc.setIsAnnotation(true);
+		     item=1;
+		  }
 		  else if (word.equals("strictfp")) {
 		  }
 		  else {
 		     Main.getRootDoc().printWarning("unknown modifier '"+word+"'");
 		  }
 	       }
-	       else if (word.equals("extends")) {
+	       else if (word.equals("extends") && !rc.isAnnotation()) {
                   if (rc.isInterface()) {
                      item=3;
                   }
@@ -395,7 +422,7 @@ public class ClassDocImpl
                      item=2;
                   }
 	       }
-	       else if (word.equals("implements")) {
+	       else if (word.equals("implements") && !rc.isAnnotation()) {
 		  item=3;
 	       }
 	       else if (item==1) {
@@ -433,7 +460,7 @@ public class ClassDocImpl
 	       word="";
 	    }
 
-	    if (c=='{') break;
+	    if (c=='{' && state==STATE_NORMAL) break;
 	 }
 	 prev=c;
       }
@@ -697,6 +724,7 @@ public class ClassDocImpl
 
    private boolean isAbstract;
    private boolean isInterface;
+   private boolean isAnnotation;
    private ClassDoc[] interfaces;
    private ClassDoc[] filteredInnerClasses;
    private ClassDoc[] unfilteredInnerClasses;
@@ -826,6 +854,10 @@ public class ClassDocImpl
       this.isInterface=b;
    }
 
+   public void setIsAnnotation(boolean b) {
+      this.isAnnotation=b;
+   }
+
    public ExecutableMemberDoc findExecutableRec(String nameAndSignature) {
 
       ExecutableMemberDoc rc;
Index: src/gnu/classpath/tools/gjdoc/Parser.java
===================================================================
RCS file: /sources/classpath/gjdoc/src/gnu/classpath/tools/gjdoc/Parser.java,v
retrieving revision 1.25
diff -u -3 -p -u -r1.25 Parser.java
--- src/gnu/classpath/tools/gjdoc/Parser.java	1 Jul 2005 18:38:43 -0000	1.25
+++ src/gnu/classpath/tools/gjdoc/Parser.java	9 Apr 2007 18:17:42 -0000
@@ -541,6 +541,25 @@ import gnu.classpath.tools.MalformedInpu
                   }
                }
                break;
+            case '@':  // annotation
+               index += 1;
+               while(index<source.length &&  Character.isJavaIdentifierPart(source[index])) {
+                   ++ index;
+               }
+               if (index<source.length && source[index]=='(') {
+		   int parLevel = 1;
+                   index += 1;
+                   while (index<source.length && parLevel>0) { 
+		       if (source[index] == '(')
+                          ++ parLevel;
+		       if (source[index] == ')')
+			  -- parLevel;
+                       ++ index;
+		       if (parLevel==0)
+		           break;
+                   } 
+               }
+               break;
 	    case '=':  // field
 	    case ';':  // field
 	    case '(':  // function
@@ -864,8 +883,8 @@ public class Parser {
       }
       classDoc.setImportedClasses((ClassDoc[])importedClassesList.toArray(new ClassDoc[0]));
 
-
-      currentPackage.addClass(classDoc);
+      if (classDoc.isAnnotation())
+          currentPackage.addClass(classDoc);
 
       currentClass = classDoc;
 

Attachment: signature.asc
Description: Digital signature

Reply via email to