001 package org.mesopotamia.lang.java; 002 003 import java.io.StringReader; 004 import java.util.ArrayList; 005 import java.util.Collections; 006 import java.util.List; 007 008 import org.mesopotamia.MesopotamiaRuntimeException; 009 import org.mesopotamia.lang.java.javadoc.JavaDocLexer; 010 import org.mesopotamia.lang.java.javadoc.JavaDocParser; 011 import org.mesopotamia.lang.java.javadoc.JavaDocTokenTypes; 012 import org.mesopotamia.lang.java.javadoc.Tag; 013 014 import antlr.ASTFactory; 015 import antlr.collections.AST; 016 017 /** 018 * 019 * @author Pavel 020 * 021 */ 022 public class JavaDocComment extends MultiLineComment { 023 024 private Exception exception; 025 private biz.hammurapi.antlr.AST ast; 026 private List<Tag> tags = new ArrayList<Tag>(); 027 private String stringDescription; 028 private List<String> description = new ArrayList<String>(); 029 030 public JavaDocComment(int line, int col, String text) { 031 super(line, col, text); 032 try { 033 StringReader r=new StringReader(text); 034 JavaDocLexer lexer=new JavaDocLexer(r); 035 lexer.setTokenObjectClass(biz.hammurapi.antlr.Token.class.getName()); 036 JavaDocParser parser=new JavaDocParser(lexer); 037 ASTFactory astFactory = new ASTFactory(); 038 astFactory.setASTNodeClass(biz.hammurapi.antlr.AST.class); 039 parser.setASTFactory(astFactory); 040 parser.specificationBlock(); 041 this.ast=(biz.hammurapi.antlr.AST) parser.getAST(); 042 // ast.showWithSiblings("JavaDoc", parser.getTokenNames()); 043 044 for (AST node=this.ast; node!=null; node=node.getNextSibling()) { 045 switch (node.getType()) { 046 case JavaDocTokenTypes.DESCRBLOCK: 047 readDescription(node); 048 break; 049 case JavaDocTokenTypes.TAGBLOCK: 050 tags.add(new Tag(node)); 051 break; 052 default: 053 throw new MesopotamiaRuntimeException("Invalid javadoc token type: "+node.getType()+" for "+text); 054 055 } 056 } 057 } catch (Exception e) { 058 this.exception=e; 059 } 060 061 } 062 063 /** 064 * @param ast 065 */ 066 private void readDescription(AST ast) { 067 StringBuffer sd=new StringBuffer(); 068 for (AST node=ast.getFirstChild(); node!=null; node=node.getNextSibling()) { 069 description .add(node.getText()); 070 sd.append(node.getText()); 071 if (node.getNextSibling()!=null) { 072 sd.append(" "); 073 } 074 } 075 stringDescription=sd.toString(); 076 } 077 078 079 public Exception getException() { 080 return exception; 081 } 082 083 public List<String> getDescription() { 084 return Collections.unmodifiableList(description); 085 } 086 087 public String getDescriptionAsString() { 088 return stringDescription; 089 } 090 091 public List<Tag> getTags() { 092 return Collections.unmodifiableList(tags); 093 } 094 }