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;
signature.asc
Description: Digital signature