/******************************************************************************* * Copyright (c) 2000, 2009 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.internal.core; import org.eclipse.jdt.core.IAnnotation; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMemberValuePair; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.SourceRange; import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; import org.eclipse.jdt.internal.compiler.env.IBinaryElementValuePair; import org.eclipse.jdt.internal.core.util.Util; public class Annotation extends SourceRefElement implements IAnnotation { public static final IAnnotation[] NO_ANNOTATIONS = new IAnnotation[0]; public static final IMemberValuePair[] NO_MEMBER_VALUE_PAIRS = new IMemberValuePair[0]; protected String name; // require to distinguish same annotations in different member value pairs protected String memberValuePairName; public Annotation(JavaElement parent, String name) { this(parent, name, null); } public Annotation(JavaElement parent, String name, String memberValuePairName) { super(parent); this.name = name; this.memberValuePairName = memberValuePairName; } public boolean equals(Object o) { if (!(o instanceof Annotation)) { return false; } Annotation other = (Annotation) o; if (this.memberValuePairName == null) { if (other.memberValuePairName != null) return false; } else if (!this.memberValuePairName.equals(other.memberValuePairName)) { return false; } // name equality is checked as part of the super.equals(..) return super.equals(o); } public IMember getDeclaringMember() { return (IMember) getParent(); } public String getElementName() { return this.name; } public int getElementType() { return ANNOTATION; } protected char getHandleMementoDelimiter() { return JavaElement.JEM_ANNOTATION; } public IMemberValuePair[] getMemberValuePairs() throws JavaModelException { Object info = getElementInfo(); if (info instanceof AnnotationInfo) return ((AnnotationInfo) info).members; IBinaryElementValuePair[] binaryAnnotations = ((IBinaryAnnotation) info).getElementValuePairs(); int length = binaryAnnotations.length; IMemberValuePair[] result = new IMemberValuePair[length]; for (int i = 0; i < length; i++) { IBinaryElementValuePair binaryAnnotation = binaryAnnotations[i]; MemberValuePair memberValuePair = new MemberValuePair(new String(binaryAnnotation.getName())); memberValuePair.value = Util.getAnnotationMemberValue(this, memberValuePair, binaryAnnotation.getValue()); result[i] = memberValuePair; } return result; } public ISourceRange getNameRange() throws JavaModelException { SourceMapper mapper= getSourceMapper(); if (mapper != null) { ClassFile classFile = (ClassFile)getClassFile(); if (classFile != null) { // ensure the class file's buffer is open so that source ranges are computed classFile.getBuffer(); return mapper.getNameRange(this); } } Object info = getElementInfo(); if (info instanceof AnnotationInfo) { AnnotationInfo annotationInfo = (AnnotationInfo) info; return new SourceRange(annotationInfo.nameStart, annotationInfo.nameEnd - annotationInfo.nameStart + 1); } return null; } /* * @see ISourceReference */ public ISourceRange getSourceRange() throws JavaModelException { SourceMapper mapper= getSourceMapper(); if (mapper != null) { // ensure the class file's buffer is open so that source ranges are computed ClassFile classFile = (ClassFile)getClassFile(); if (classFile != null) { classFile.getBuffer(); return mapper.getSourceRange(this); } } return super.getSourceRange(); } public IClassFile getClassFile() { return ((JavaElement)getParent()).getClassFile(); } public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((this.memberValuePairName == null) ? 0 : this.memberValuePairName.hashCode()); result = prime * result + this.name.hashCode(); return result; } protected void toStringName(StringBuffer buffer) { buffer.append('@'); buffer.append(getElementName()); } }