package org.eclipse.jdt.internal.compiler.lookup;

import org.eclipse.jdt.internal.compiler.ast.Annotation;
import org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
import org.eclipse.jdt.internal.compiler.ast.NormalAnnotation;
import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;

/**
 * Annotation that came from source.
 * @author tyeung
 *
 */
public class SourceAnnotation implements IAnnotationInstance, TypeConstants
{	
	private ReferenceBinding type;
	private final IElementValuePair[] pairs;
	
	public SourceAnnotation(Annotation astAnnotation)
	{	
		this.type = (ReferenceBinding)astAnnotation.resolvedType;
		if( astAnnotation instanceof NormalAnnotation ){
			final MemberValuePair[] astPairs = ((NormalAnnotation)astAnnotation).memberValuePairs;
			final int numberOfPairs = astPairs == null ? 0 : astPairs.length;			
			if( numberOfPairs > 0 ){
				this.pairs = new SourceElementValuePair[numberOfPairs];
				for( int i=0; i<numberOfPairs; i++ ){
					this.pairs[i] = new SourceElementValuePair(astPairs[i]);
				}				
			}
			else
				this.pairs = NoElementValuePairs;
		}
		else if( astAnnotation instanceof SingleMemberAnnotation ){
			final MemberValuePair astPair = ((SingleMemberAnnotation)astAnnotation).singlePair;
			if( astPair != null )
				this.pairs = new SourceElementValuePair[]{ new SourceElementValuePair(astPair) };
			else
				this.pairs = NoElementValuePairs;
		}
		else 
			this.pairs = NoElementValuePairs;
	}
	
	public ReferenceBinding getAnnotationType() {	
		return this.type;
	}
	
	public IElementValuePair[] getElementValuePairs() { return this.pairs; }
}
