/*
* Copyright 2008 CoreMedia AG
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS
* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package net.jangaroo.joodoc;
import com.sun.javadoc.Type;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.ConstructorDoc;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.ParamTag;
import com.sun.javadoc.ThrowsTag;
import com.sun.javadoc.Parameter;
import com.sun.javadoc.Doc;
import com.sun.javadoc.TypeVariable;
import net.jangaroo.jooc.Parameters;
import net.jangaroo.jooc.MethodDeclaration;
import java.util.ArrayList;
/**
* Created by IntelliJ IDEA.
* User: htewis
* Date: 20.07.2004
* Time: 11:23:33
* To change this template use File | Settings | File Templates.
*/
public class MethodDocImpl extends MemberDocImpl implements MethodDoc, ConstructorDoc {
ArrayList paramList = new ArrayList();
public MethodDocImpl(MethodDeclaration declaration) {
super (declaration);
Parameters params = getMethodDeclaration().getParams();
while (params!=null) {
paramList.add(DocMap.getDoc(params.getHead()));
params=params.getTail();
}
}
private MethodDeclaration getMethodDeclaration() {
return (MethodDeclaration)getMemberDeclaration();
}
public Type returnType() {
return getType();
}
public boolean isAbstract() {
return getMethodDeclaration().isAbstract();
}
public Type overriddenType() {
ClassDoc oc = overriddenClass();
return oc==null ? null : new TypeImpl(null, oc);
}
public boolean overrides(MethodDoc doc) {
return doc.equals(overriddenMethod());
}
public ClassDoc overriddenClass() {
MethodDoc methodDoc = overriddenMethod();
return methodDoc!=null ? methodDoc.containingClass() : null;
}
public MethodDoc overriddenMethod() {
ClassDoc superClass = containingClass().superclass();
while (superClass!=null) {
MethodDoc superMethodDoc = getSuperMethodDoc(superClass);
if (superMethodDoc!=null)
return superMethodDoc;
superClass = superClass.superclass();
}
return null;
}
private MethodDoc getSuperMethodDoc(ClassDoc classDoc) {
Doc doc = DocMap.getDocByQualifiedName(classDoc.qualifiedName()+"#"+name(),false);
return doc instanceof MethodDoc ? (MethodDoc)doc : null;
}
public boolean isNative() {
return false;
}
public boolean isSynchronized() {
return false;
}
public ClassDoc[] thrownExceptions() {
return new ClassDoc[0];
}
public ParamTag[] paramTags() {
return (ParamTag[])typedTags("param",ParamTag.class);
}
public Parameter[] parameters() {
return (Parameter[]) paramList.toArray(new Parameter[0]);
}
public ThrowsTag[] throwsTags() {
return new ThrowsTag[0];
}
public String flatSignature() {
// used on the "index" page:
return "()";
}
public String signature() {
// used to define anchor (a name="...")
// since we have no overloading, can be empty.
return "";
}
public boolean isConstructor() {
return getMethodDeclaration().isConstructor();
}
public boolean isMethod() {
return !isConstructor();
}
public Type[] thrownExceptionTypes() {
return new Type[0]; //To change body of implemented methods use File | Settings | File Templates.
}
public boolean isVarArgs() {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
public ParamTag[] typeParamTags() {
return new ParamTag[0]; //To change body of implemented methods use File | Settings | File Templates.
}
public TypeVariable[] typeParameters() {
return new TypeVariable[0]; //To change body of implemented methods use File | Settings | File Templates.
}
}