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
