/* gnu.classpath.tools.gjdoc.SeeTagImpl 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 com.sun.javadoc.*; import java.util.*; import java.text.*; public class SeeTagImpl extends AbstractTagImpl implements SeeTag { protected String reference; private String referencedClassName; private String referencedMemberName; private ClassDoc referencedClass; private MemberDoc referencedMember; private PackageDoc referencedPackage; private String label; private ClassDocImpl contextClass; public SeeTagImpl(String text, ClassDocImpl contextClass) { super(text); this.contextClass=contextClass; } public void resolve() { super.resolve(); text = text.trim(); if (text.startsWith("<") || text.startsWith("\"")) { label = text; return; } int labelNdx=text.indexOf(';'); if (labelNdx>=0) { label=""; return; } for (int i=0; i<text.length(); ++i) { if (" \t\r\n".indexOf(text.charAt(i)) >= 0) { labelNdx = i; break; } } int openParenNdx = text.indexOf('('); if (openParenNdx >= 0 && openParenNdx < labelNdx) { labelNdx=text.indexOf(')', openParenNdx); if (labelNdx >= 0) { ++ labelNdx; } } if (labelNdx<0 || labelNdx>=text.length()) { reference=text.trim(); label=""; } else { reference=text.substring(0,labelNdx).trim(); label=text.substring(labelNdx).trim(); } int mspecNdx=reference.indexOf('#'); String referencedFqName; if (mspecNdx<0) { referencedFqName=reference; } else { referencedFqName=reference.substring(0,mspecNdx); referencedMemberName=reference.substring(mspecNdx+1); } // the following is in contradiction to the api docs, but // conform to sun javadoc: return fully qualified classname // with referencedClassName(). if (referencedFqName.trim().length()>0) { referencedClassName=referencedFqName; if (contextClass==null) referencedClass=Main.getRootDoc().classNamed(referencedFqName); else referencedClass=contextClass.findClass(referencedFqName); } else { referencedClassName=""; referencedClass=contextClass; } if (referencedClass==null) { referencedClass = Main.getRootDoc().classNamed("java.lang." + referencedFqName); } if (referencedClass!=null && !referencedClass.isIncluded()) referencedClass=null; if (referencedClass!=null) { referencedPackage=referencedClass.containingPackage(); referencedClassName=referencedClass.qualifiedName(); if (referencedMemberName!=null) { if (referencedMemberName.indexOf('(')<0) { referencedMember=((ClassDocImpl)referencedClass).findFieldRec(referencedMemberName); if (null == referencedMember) { MethodDoc[] methods = ((ClassDocImpl)referencedClass).methods(); for (int i=0; i<methods.length; ++i) { if (methods[i].name().equals(referencedMemberName)) { if (null == referencedMember) { referencedMember = methods[i]; } else { referencedClass = null; referencedMember = null; //print warning here break; } } } } else { referencedClass = referencedMember.containingClass(); } } else { referencedMember=((ClassDocImpl)referencedClass).findExecutableRec(referencedMemberName); if (referencedMember==null) { //System.err.println("cannot find member for '"+referencedMemberName+"'"); referencedClass = null; } } } } /* else { System.err.println("class not found: '"+referencedFqName + "' in context class " + contextClass + " in " + this); } */ } public ClassDoc referencedClass() { return referencedClass; } public String referencedClassName() { return referencedClassName; } public MemberDoc referencedMember() { return referencedMember; } public String referencedMemberName() { return referencedMemberName; } public PackageDoc referencedPackage() { return referencedPackage; } public String label() { return label; } public String kind() { return "@see"; } public String name() { return "@see"; } public Tag[] firstSentenceTags() { return inlineTags(); } public Tag[] inlineTags() { return new Tag[]{new TextTagImpl(referencedClassName)}; } }