| /******************************************************************************* |
| * 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()); |
| } |
| } |