--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 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 net.sourceforge.phpdt.internal.compiler.lookup;
+
+import net.sourceforge.phpdt.internal.compiler.ast.*;
+import net.sourceforge.phpdt.internal.compiler.classfmt.ClassFileConstants;
+import net.sourceforge.phpdt.internal.compiler.impl.Constant;
+
+public class ElementValuePair {
+ char[] name;
+ public Object value;
+ public MethodBinding binding;
+
+public static Object getValue(Expression expression) {
+ if (expression == null)
+ return null;
+ Constant constant = expression.constant;
+ // literals would hit this case.
+ if (constant != null && constant != Constant.NotAConstant)
+ return constant;
+
+ if (expression instanceof Annotation)
+ return ((Annotation) expression).getCompilerAnnotation();
+ if (expression instanceof ArrayInitializer) {
+ Expression[] exprs = ((ArrayInitializer) expression).expressions;
+ int length = exprs == null ? 0 : exprs.length;
+ Object[] values = new Object[length];
+ for (int i = 0; i < length; i++)
+ values[i] = getValue(exprs[i]);
+ return values;
+ }
+ if (expression instanceof ClassLiteralAccess)
+ return ((ClassLiteralAccess) expression).targetType;
+ if (expression instanceof Reference) {
+ FieldBinding fieldBinding = null;
+ if (expression instanceof FieldReference) {
+ fieldBinding = ((FieldReference) expression).fieldBinding();
+ } else if (expression instanceof NameReference) {
+ Binding binding = ((NameReference) expression).binding;
+ if (binding != null && binding.kind() == Binding.FIELD)
+ fieldBinding = (FieldBinding) binding;
+ }
+ if (fieldBinding != null && (fieldBinding.modifiers & ClassFileConstants.AccEnum) > 0)
+ return fieldBinding;
+ }
+ // something that isn't a compile time constant.
+ return null;
+}
+
+public ElementValuePair(char[] name, Expression expression, MethodBinding binding) {
+ this(name, ElementValuePair.getValue(expression), binding);
+}
+
+public ElementValuePair(char[] name, Object value, MethodBinding binding) {
+ this.name = name;
+ this.value = value;
+ this.binding = binding;
+}
+
+/**
+ * @return the name of the element value pair.
+ */
+public char[] getName() {
+ return this.name;
+}
+
+/**
+ * @return the method binding that defined this member value pair or null if no such binding exists.
+ */
+public MethodBinding getMethodBinding() {
+ return this.binding;
+}
+
+/**
+ * Return {@link TypeBinding} for member value of type {@link java.lang.Class}
+ * Return {@link org.eclipse.jdt.internal.compiler.impl.Constant} for member of primitive type or String
+ * Return {@link FieldBinding} for enum constant
+ * Return {@link AnnotationBinding} for annotation instance
+ * Return <code>Object[]</code> for member value of array type.
+ * @return the value of this member value pair or null if the value is missing or is not a compile-time constant
+ */
+public Object getValue() {
+ return this.value;
+}
+
+void setMethodBinding(MethodBinding binding) {
+ // lazily set after annotation type was resolved
+ this.binding = binding;
+}
+
+void setValue(Object value) {
+ // can be modified after the initialization if holding an unresolved ref
+ this.value = value;
+}
+
+public String toString() {
+ StringBuffer buffer = new StringBuffer(5);
+ buffer.append(this.name).append(" = "); //$NON-NLS-1$
+ buffer.append(this.value);
+ return buffer.toString();
+}
+}