/******************************************************************************* * 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 java.lang.annotation.Annotation; import java.util.Collection; import org.eclipse.jdt.apt.core.internal.env.BaseProcessorEnv; import org.eclipse.jdt.apt.core.internal.util.SourcePositionImpl; import org.eclipse.jdt.core.dom.*; import com.sun.mirror.declaration.AnnotationMirror; import com.sun.mirror.declaration.MemberDeclaration; import com.sun.mirror.util.DeclarationVisitor; import com.sun.mirror.util.SourcePosition; public abstract class MemberDeclarationImpl extends DeclarationImpl implements MemberDeclaration, EclipseMirrorObject { MemberDeclarationImpl(final IBinding binding, BaseProcessorEnv env) { super(binding, env); } public void accept(DeclarationVisitor visitor) { visitor.visitMemberDeclaration(this); } public <A extends Annotation> A getAnnotation(Class<A> annotationClass) { final IAnnotationBinding[] instances = getAnnotationInstances(); return _getAnnotation(annotationClass, instances); } public Collection<AnnotationMirror> getAnnotationMirrors() { final IAnnotationBinding[] instances = getAnnotationInstances(); return _getAnnotationMirrors(instances); } private IAnnotationBinding[] getAnnotationInstances() { final IBinding binding = getDeclarationBinding(); final IAnnotationBinding[] instances; switch( binding.getKind() ) { case IBinding.TYPE: instances = ((ITypeBinding)binding).getAnnotations(); break; case IBinding.METHOD: instances = ((IMethodBinding)binding).getAnnotations(); break; case IBinding.VARIABLE: instances = ((IVariableBinding)binding).getAnnotations(); break; case IBinding.PACKAGE: // TODO: support package annotation return null; default: throw new IllegalStateException(); } return instances; } public String getDocComment() { if( isFromSource()){ final ASTNode node = getAstNode(); if(node != null){ 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 ""; //$NON-NLS-1$ } } return null; } /** * @return the source position of this declaration. * Return null if this declaration did not come from source or * if the declaration is (or is part of) a secondary type that is defined * outside of the file associated with the environment. */ public SourcePosition getPosition() { if( isFromSource() ){ final ASTNode node = getRangeNode(); if( node == null ) return null; final CompilationUnit unit = getCompilationUnit(); final int start = node.getStartPosition(); return new SourcePositionImpl(start, node.getLength(), unit.getLineNumber(start), unit.getColumnNumber(start), this); } return null; } }