/* gnu.classpath.tools.gjdoc.MemberDocImpl
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
package gnu.classpath.tools.gjdoc;
import java.util.*;
import com.sun.javadoc.*;
public abstract class MemberDocImpl extends ProgramElementDocImpl implements MemberDoc {
protected String typeName;
protected Type type;
public MemberDocImpl(ClassDoc containingClass,
PackageDoc containingPackage,
SourcePosition position) {
super(containingClass,
containingPackage,
position);
}
public String qualifiedName() {
return containingClass().qualifiedName()+"."+name();
}
public boolean isSynthetic() {
return false;
}
int parseModifiers(char[] source, int startIndex, int endIndex) {
Debug.log(9,"parseModifiers '"+new String(source,startIndex,endIndex-startIndex)+"'");
final int STATE_NORMAL = 1;
final int STATE_STARC = 2;
final int STATE_SLASHC = 3;
int state = STATE_NORMAL;
StringBuffer word = new StringBuffer();
StringBuffer typeNameBuf = new StringBuffer();
int lastWordStart = startIndex;
int firstChar = 0;
int lastChar = 0;
for (; startIndex<endIndex; ++startIndex) {
if (state==STATE_STARC) {
if (startIndex<endIndex-1 && source[startIndex]=='*' && source[startIndex+1]=='/') {
++startIndex;
state=STATE_NORMAL;
}
}
else if (state==STATE_SLASHC) {
if (source[startIndex]=='\n') {
state=STATE_NORMAL;
}
}
else if (startIndex<endIndex-1 && source[startIndex]=='/' && source[startIndex+1]=='*') {
++startIndex;
state=STATE_STARC;
}
else if (source[startIndex]=='=' || source[startIndex]=='(' || source[startIndex]==';') {
typeName = typeNameBuf.toString();
return lastWordStart;
}
else if (Parser.WHITESPACE.indexOf(source[startIndex])>=0
|| (startIndex > 0 && source[startIndex-1] == ']' && source[startIndex] != '[')) {
if (word.length()>0 && lastChar != '.') {
if (processModifier(word.toString())) {
}
else if (typeNameBuf.length()==0 && !isConstructor()) {
typeNameBuf.setLength(0);
typeNameBuf.append(word);
}
else if ((firstChar=='[' || firstChar==']') && !isConstructor()) {
typeNameBuf.append(word);
}
else {
typeName = typeNameBuf.toString();
return lastWordStart;
}
word.setLength(0);
lastWordStart=startIndex;
}
}
else {
if (lastWordStart<0) lastWordStart=startIndex;
lastChar = source[startIndex];
if (0 == word.length()) {
firstChar = lastChar;
}
word.append((char)lastChar);
}
}
typeName = typeNameBuf.toString();
return startIndex;
}
public Type type() {
//public Type type() throws ParseException {
Debug.log(9,"type() called on "+containingClass()+"."+this);
if (type==null) {
try {
type=((ClassDocImpl)containingClass()).typeForString(typeName);
} catch (ParseException e) {
System.err.println("FIXME: add try-catch to force compilation");
e.printStackTrace();
}
}
return type;
}
protected void setName(String name) {
this.name=name;
}
private String name;
public String name() {
return name;
}
public void setTypeName(String typeName) {
this.typeName=typeName;
this.type=null;
}
public String getTypeName() {
return typeName;
}
// return true if this Doc is include in the active set.
public boolean isIncluded() {
return Main.getInstance().includeAccessLevel(accessLevel);
}
public int compareTo(Object o) {
if (o instanceof MemberDocImpl) {
int rc=name().compareTo(((MemberDocImpl)o).name());
if (rc==0)
rc=containingClass().qualifiedName().compareTo(((MemberDocImpl)o).containingClass().qualifiedName());
return rc;
}
else {
return super.compareTo(o);
}
}
void resolve() {
if (type==null && typeName!=null) {
Debug.log(1, "MemberDocImpl.resolve(), looking up type named "+typeName);
try {
type=((ClassDocImpl)containingClass()).typeForString(typeName);
} catch (ParseException e) {
//System.err.println("FIXME: add try-catch to force compilation");
//e.printStackTrace();
Debug.log(1, "INTERNAL WARNING: Couldn't find type for name '"+typeName+"'");
}
}
if (type instanceof ClassDocProxy) {
String className=type.qualifiedTypeName();
ClassDoc realClassDoc=((ClassDocImpl)containingClass()).findClass(className, type.dimension());
if (realClassDoc!=null) {
type=realClassDoc;
}
else {
//throw new Error("Class not found: "+className);
/*** This is not an error, the class was not included
* on the command line. Perhaps emit a notice here.
*
Main.getRootDoc().printError("Class not found '"
+ className
+ "' in class '"
+ containingClass().qualifiedName()
+ "' member '"
+ name()
+ "'");
*/
}
}
}
public void resolveComments()
{
super.resolveComments();
if (tagMap.isEmpty()) {
TagContainer inheritedTagMap = ClassDocImpl.findInheritedDoc(containingClass(),
this,
null);
if (null != inheritedTagMap) {
this.tagMap = inheritedTagMap.getTagMap();
}
}
}
}