| /******************************************************************************* |
| * Copyright (c) 2004, 2013 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.core.dom; |
| |
| /** |
| * Abstract base class of AST nodes that represent annotations. |
| * <p> |
| * <pre> |
| * Annotation: |
| * NormalAnnotation |
| * MarkerAnnotation |
| * SingleMemberAnnotation |
| * </pre> |
| * </p> |
| * @since 3.1 |
| */ |
| @SuppressWarnings("rawtypes") |
| public abstract class Annotation extends Expression implements IExtendedModifier { |
| |
| /** |
| * Returns structural property descriptor for the "typeName" property |
| * of this node (child type: {@link Name}). |
| * |
| * @return the property descriptor |
| */ |
| abstract ChildPropertyDescriptor internalTypeNameProperty(); |
| |
| /** |
| * Returns structural property descriptor for the "typeName" property |
| * of this node (child type: {@link Name}). |
| * |
| * @return the property descriptor |
| */ |
| public final ChildPropertyDescriptor getTypeNameProperty() { |
| return internalTypeNameProperty(); |
| } |
| |
| /** |
| * Creates and returns a structural property descriptor for the |
| * "typeName" property declared on the given concrete node type (child type: {@link Name}). |
| * |
| * @return the property descriptor |
| */ |
| static final ChildPropertyDescriptor internalTypeNamePropertyFactory(Class nodeClass) { |
| return new ChildPropertyDescriptor(nodeClass, "typeName", Name.class, MANDATORY, NO_CYCLE_RISK); //$NON-NLS-1$ |
| } |
| |
| /** |
| * The annotation type name; lazily initialized; defaults to an unspecified, |
| * legal Java identifier. |
| */ |
| Name typeName = null; |
| |
| /** |
| * Creates a new AST node for an annotation node owned by the |
| * given AST. |
| * <p> |
| * N.B. This constructor is package-private. |
| * </p> |
| * |
| * @param ast the AST that is to own this node |
| */ |
| Annotation(AST ast) { |
| super(ast); |
| } |
| |
| /** |
| * @see IExtendedModifier#isModifier() |
| */ |
| public boolean isModifier() { |
| return false; |
| } |
| |
| /** |
| * @see IExtendedModifier#isAnnotation() |
| */ |
| public boolean isAnnotation() { |
| return true; |
| } |
| |
| /** |
| * Returns the annotation type name of this annotation. |
| * |
| * @return the annotation type name |
| */ |
| public Name getTypeName() { |
| if (this.typeName == null) { |
| // lazy init must be thread-safe for readers |
| synchronized (this) { |
| if (this.typeName == null) { |
| preLazyInit(); |
| this.typeName = new SimpleName(this.ast); |
| postLazyInit(this.typeName, internalTypeNameProperty()); |
| } |
| } |
| } |
| return this.typeName; |
| } |
| |
| /** |
| * Sets the annotation type name of this annotation. |
| * |
| * @param typeName the annotation type name |
| * @exception IllegalArgumentException if: |
| * <ul> |
| * <li>the node belongs to a different AST</li> |
| * <li>the node already has a parent</li> |
| * </ul> |
| */ |
| public void setTypeName(Name typeName) { |
| if (typeName == null) { |
| throw new IllegalArgumentException(); |
| } |
| ChildPropertyDescriptor p = internalTypeNameProperty(); |
| ASTNode oldChild = this.typeName; |
| preReplaceChild(oldChild, typeName, p); |
| this.typeName = typeName; |
| postReplaceChild(oldChild, typeName, p); |
| } |
| |
| /** |
| * Returns whether this is a normal annotation |
| * ({@link NormalAnnotation}). |
| * |
| * @return <code>true</code> if this is a normal annotation, |
| * and <code>false</code> otherwise |
| */ |
| public boolean isNormalAnnotation() { |
| return (this instanceof NormalAnnotation); |
| } |
| |
| /** |
| * Returns whether this is a marker annotation |
| * ({@link MarkerAnnotation}). |
| * |
| * @return <code>true</code> if this is a marker annotation, |
| * and <code>false</code> otherwise |
| */ |
| public boolean isMarkerAnnotation() { |
| return (this instanceof MarkerAnnotation); |
| } |
| |
| /** |
| * Returns whether this is a single member annotation. |
| * ({@link SingleMemberAnnotation}). |
| * |
| * @return <code>true</code> if this is a single member annotation, |
| * and <code>false</code> otherwise |
| */ |
| public boolean isSingleMemberAnnotation() { |
| return (this instanceof SingleMemberAnnotation); |
| } |
| |
| /* (omit javadoc for this method) |
| * Method declared on ASTNode. |
| */ |
| int memSize() { |
| return BASE_NODE_SIZE + 1 * 4; |
| } |
| |
| /** |
| * Resolves and returns the resolved annotation for this annotation. |
| * <p> |
| * Note that bindings (which includes resolved annotations) are generally unavailable unless |
| * requested when the AST is being built. |
| * </p> |
| * |
| * @return the resolved annotation, or <code>null</code> if the annotation cannot be resolved |
| * @since 3.2 |
| */ |
| public IAnnotationBinding resolveAnnotationBinding() { |
| return this.ast.getBindingResolver().resolveAnnotation(this); |
| } |
| } |