blob: dce039fdc58ee19292f3e84c1f298f3a877bd4a6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 BEA Systems, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* tyeung@bea.com - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.apt.core.internal.declaration;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.apt.core.internal.env.BaseProcessorEnv;
import org.eclipse.jdt.apt.core.internal.util.Factory;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import org.eclipse.jdt.core.dom.ITypeBinding;
import com.sun.mirror.declaration.MemberDeclaration;
import com.sun.mirror.declaration.TypeDeclaration;
import com.sun.mirror.util.DeclarationVisitor;
public abstract class ASTBasedMemberDeclarationImpl
extends ASTBasedDeclarationImpl implements MemberDeclaration{
public ASTBasedMemberDeclarationImpl(
ASTNode astNode,
IFile file,
BaseProcessorEnv env)
{
super(astNode, file, env);
}
public void accept(DeclarationVisitor visitor) {
visitor.visitMemberDeclaration(this);
}
public TypeDeclaration getDeclaringType()
{
final AbstractTypeDeclaration parentType = getContainingTypeAstNode();
// most likely a mal-formed text.
if( parentType == null )
return null;
final ITypeBinding parentTypeBinding = parentType.resolveBinding();
if( parentTypeBinding == null )
throw new UnsupportedOperationException("Type declaration that doesn't have binding"); //$NON-NLS-1$
return Factory.createReferenceType(parentTypeBinding, _env);
}
public String getDocComment()
{
final ASTNode node = getAstNode();
if( node instanceof BodyDeclaration )
return getDocComment((BodyDeclaration)node);
else if( node.getNodeType() == ASTNode.VARIABLE_DECLARATION_FRAGMENT ){
final ASTNode parent = node.getParent();
// a field declaration
if( parent instanceof BodyDeclaration )
return getDocComment((BodyDeclaration)parent);
}
return EMPTY_STRING;
}
/**
* @return the closest ancestor to the ast node in this instance that
* is a type declaration node or <code>null</code> if none is found.
*/
protected AbstractTypeDeclaration getContainingTypeAstNode()
{
ASTNode cur = _astNode;
while(cur != null){
switch(cur.getNodeType()){
case ASTNode.ANNOTATION_TYPE_DECLARATION:
case ASTNode.ENUM_DECLARATION:
case ASTNode.TYPE_DECLARATION:
return (AbstractTypeDeclaration)cur;
}
cur = cur.getParent();
}
return null;
}
}