| /******************************************************************************* |
| * 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; |
| } |
| } |