001: /*******************************************************************************
002: * Copyright (c) 2005, 2007 BEA Systems, Inc.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * tyeung@bea.com - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.apt.core.internal.declaration;
011:
012: import java.lang.annotation.Annotation;
013: import java.util.Collection;
014:
015: import org.eclipse.jdt.apt.core.internal.env.BaseProcessorEnv;
016: import org.eclipse.jdt.apt.core.internal.util.SourcePositionImpl;
017: import org.eclipse.jdt.core.dom.*;
018:
019: import com.sun.mirror.declaration.AnnotationMirror;
020: import com.sun.mirror.declaration.MemberDeclaration;
021: import com.sun.mirror.util.DeclarationVisitor;
022: import com.sun.mirror.util.SourcePosition;
023:
024: public abstract class MemberDeclarationImpl extends DeclarationImpl
025: implements MemberDeclaration, EclipseMirrorObject {
026: MemberDeclarationImpl(final IBinding binding, BaseProcessorEnv env) {
027: super (binding, env);
028: }
029:
030: public void accept(DeclarationVisitor visitor) {
031: visitor.visitMemberDeclaration(this );
032: }
033:
034: public <A extends Annotation> A getAnnotation(
035: Class<A> annotationClass) {
036: final IAnnotationBinding[] instances = getAnnotationInstances();
037: return _getAnnotation(annotationClass, instances);
038: }
039:
040: public Collection<AnnotationMirror> getAnnotationMirrors() {
041: final IAnnotationBinding[] instances = getAnnotationInstances();
042: return _getAnnotationMirrors(instances);
043: }
044:
045: private IAnnotationBinding[] getAnnotationInstances() {
046: final IBinding binding = getDeclarationBinding();
047: final IAnnotationBinding[] instances;
048: switch (binding.getKind()) {
049: case IBinding.TYPE:
050: instances = ((ITypeBinding) binding).getAnnotations();
051: break;
052: case IBinding.METHOD:
053: instances = ((IMethodBinding) binding).getAnnotations();
054: break;
055: case IBinding.VARIABLE:
056: instances = ((IVariableBinding) binding).getAnnotations();
057: break;
058: case IBinding.PACKAGE:
059: // TODO: support package annotation
060: return null;
061: default:
062: throw new IllegalStateException();
063: }
064: return instances;
065: }
066:
067: public String getDocComment() {
068: if (isFromSource()) {
069: final ASTNode node = getAstNode();
070: if (node != null) {
071: if (node instanceof BodyDeclaration)
072:
073: return getDocComment((BodyDeclaration) node);
074:
075: else if (node.getNodeType() == ASTNode.VARIABLE_DECLARATION_FRAGMENT) {
076: final ASTNode parent = node.getParent();
077: // a field declaration
078: if (parent instanceof BodyDeclaration)
079: return getDocComment((BodyDeclaration) parent);
080:
081: }
082: return ""; //$NON-NLS-1$
083: }
084: }
085: return null;
086: }
087:
088: /**
089: * @return the source position of this declaration.
090: * Return null if this declaration did not come from source or
091: * if the declaration is (or is part of) a secondary type that is defined
092: * outside of the file associated with the environment.
093: */
094: public SourcePosition getPosition() {
095: if (isFromSource()) {
096: final ASTNode node = getRangeNode();
097: if (node == null)
098: return null;
099: final CompilationUnit unit = getCompilationUnit();
100: final int start = node.getStartPosition();
101: return new SourcePositionImpl(start, node.getLength(), unit
102: .getLineNumber(start), unit.getColumnNumber(start),
103: this);
104: }
105: return null;
106: }
107: }
|