/*******************************************************************************
 * 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.aspectj.org.eclipse.jdt.core;

/**
 * Represents a member-value pair of an annotation.
 * The {@link #getValue() value} is represented by an {@link Object}. To get the exact
 * type of this object, use its {@link #getValueKind() value kind}. If this value is an array,
 * {@link #getValue()} returns an instance of {@link Object}[] and the value kind returns
 * the kind of the elements in this array.
 * <p>
 * This interface is not intended to be implemented or extended by clients.
 * </p>
 *
 * @since 3.4
 */
public interface IMemberValuePair {
	/**
	 * Constant indicating that the value kind is an <code>int</code> represented by
	 * an instance of {@link Integer}.
	 */
	int K_INT = 1;

	/**
	 * Constant indicating that the value kind is a <code>byte</code> represented by
	 * an instance of {@link Byte}.
	 */
	int K_BYTE = 2;

	/**
	 * Constant indicating that the value kind is a <code>short</code> represented by
	 * an instance of {@link Short}.
	 */
	int K_SHORT = 3;

	/**
	 * Constant indicating that the value kind is a <code>char</code> represented by
	 * an instance of {@link Character}.
	 */
	int K_CHAR = 4;

	/**
	 * Constant indicating that the value kind is a <code>float</code> represented by
	 * an instance of {@link Float}.
	 */
	int K_FLOAT = 5;

	/**
	 * Constant indicating that the value kind is a <code>double</code> represented by
	 * an instance of {@link Double}.
	 */
	int K_DOUBLE = 6;

	/**
	 * Constant indicating that the value kind is a <code>long</code> represented by
	 * an instance of {@link Long}.
	 */
	int K_LONG = 7;

	/**
	 * Constant indicating that the value kind is a <code>boolean</code> represented by
	 * an instance of {@link Boolean}.
	 */
	int K_BOOLEAN = 8;

	/**
	 * Constant indicating that the value kind is a {@link String} represented by
	 * the corresponding {@link String}.
	 */
	int K_STRING = 9;

	/**
	 * Constant indicating that the value kind is an annotation represented by
	 * an instance of {@link IAnnotation}.
	 */
	int K_ANNOTATION = 10;

	/**
	 * Constant indicating that the value kind is a {@link Class} represented by
	 * the name of the class (i.e. a {@link String}. If the member-value pair is coming from
	 * a compilation unit, this is either a simple name (e.g. for <code>MyType.class</code>,
	 * the name is "MyType"), or a qualified name  (e.g. for <code>x.y.MyType.MyNestedType.class</code>,
	 * the name is "x.y.MyType.MyNestedType"). If the member-value pair is coming from a class file, this is
	 * always a fully qualified name.
	 * <p>
	 * Note that one can use {@link IType#resolveType(String)} and e.g.
	 * {@link IJavaProject#findType(String, String, org.eclipse.core.runtime.IProgressMonitor)}
	 * to find the corresponding {@link IType}.
	 * </p>
	 */
	int K_CLASS = 11;

	/**
	 * Constant indicating that the value is a qualified name represented by a
	 * {@link String}. The qualified name refers to an enum constant or another
	 * compile-time constant if the code is correct (e.g. "MyEnum.FIRST").
	 */
	int K_QUALIFIED_NAME = 12;

	/**
	 * Constant indicating that the value is a simple name represented by a
	 * {@link String}. The simple name refers to an enum constant or another
	 * compile-time constant if the code is correct (e.g. "FIRST" when there is
	 * a static import for "MyEnum.FIRST").
	 */
	int K_SIMPLE_NAME = 13;

	/**
	 * Constant indicating that the value kind is unknown at this stage. The value is unknown in the
	 * following cases:
	 * <ul>
	 * <li>the value is an expression that would need to be further analyzed to determine its kind. For
	 * example, in <code>@MyAnnot(1 + 2.3)</code> the kind of the expression "1 + 2.3" is
	 * unknown</li>
	 * <li>the value is an array of size 0, e.g. <code>@MyAnnot({})</code></li>
	 * <li>the value is an array that contains at least one expression that would need to be further
	 *      analyzed to determine its kind. For example, in <code>@MyAnnot({3.4, 1 + 2.3})</code>,
	 *      the kind of the second element "1 + 2.3" is unknown.</li>
	 * <li>the value is an array that contains heterogeneous values, e.g.
	 *      <code>@MyAnnot({1, 2.3, "abc"})</code></li>
	 * </ul>
	 * If the value kind is unknown, the returned value is always either <code>null</code>, or an
	 * array containing {@link Object}s and/or <code>null</code>s for unknown elements.
	 */
	int K_UNKNOWN = 14;

	/**
	 * Returns the member's name of this member-value pair.
	 *
	 * @return the member's name of this member-value pair.
	 */
	String getMemberName();

	/**
	 * Returns the value of this member-value pair. The type of this value
	 * is function of this member-value pair's {@link #getValueKind() value kind}. It is an
	 * instance of {@link Object}[] if the value is an array.
	 * <p>
	 * If the value kind is {@link #K_UNKNOWN} and the value is not an array, then the
	 * value is <code>null</code>.
	 * If the value kind is {@link #K_UNKNOWN} and the value is an array, then the
	 * value is an array containing {@link Object}s and/or <code>null</code>s for
	 * unknown elements.
	 * See {@link #K_UNKNOWN} for more details.
	 * </p>
	 * @return the value of this member-value pair.
	 */
	Object getValue();

	/**
	 * Returns the value kind of this member-value pair. This indicates the instance of
	 * the returned {@link #getValue() value}, or the instance of the elements if the value
	 * is an array. The value kind is one of the following constants:
	 * {@link #K_ANNOTATION}, {@link #K_BOOLEAN}, {@link #K_BYTE}, {@link #K_CHAR},
	 * {@link #K_CLASS}, {@link #K_DOUBLE}, {@link #K_FLOAT}, {@link #K_INT}, {@link #K_LONG},
	 * {@link #K_QUALIFIED_NAME}, {@link #K_SIMPLE_NAME}, {@link #K_SHORT}, {@link #K_STRING},
	 * {@link #K_UNKNOWN}.
	 *
	 * @return the value kind of this member-value pair
	 */
	int getValueKind();

}
