blob: b019f5b0d8bd282317096a0b56cf9cb0fdc9af8d [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 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;
}
}