/*******************************************************************************
 * Copyright (c) 2000, 2015 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.jdi.internal;

import com.sun.jdi.ClassNotLoadedException;
import com.sun.jdi.LocalVariable;
import com.sun.jdi.StackFrame;
import com.sun.jdi.Type;
import com.sun.jdi.VMMismatchException;

/**
 * this class implements the corresponding interfaces declared by the JDI
 * specification. See the com.sun.jdi package for more information.
 * 
 */
public class LocalVariableImpl extends MirrorImpl implements LocalVariable, Comparable<LocalVariable> {
	/** Method that holds local variable. */
	private MethodImpl fMethod;
	/** First code index at which the variable is visible (unsigned). */
	private long fCodeIndex;
	/** The variable's name. */
	private String fName;
	/** The variable type's JNI signature. */
	private String fSignature;
	/** The variable type generic signature. */
	private String fGenericSignature;
	/** The variable's type */
	private Type fType;
	/** The variables type name */
	private String fTypeName;
	/**
	 * Unsigned value used in conjunction with codeIndex. The variable can be
	 * get or set only when the current codeIndex <= current frame code index <
	 * code index + length.
	 * <p>
	 * The length is set to -1 when this variable represents an inferred
	 * argument (when local variable info is unavailable). We assume that such
	 * arguments are visible for the entire method.
	 * </p>
	 * */
	private int fLength;
	/** The local variable's index in its frame. */
	private int fSlot;
	/** Is the local variable an argument of its method? */
	private boolean fIsArgument;

	public LocalVariableImpl(VirtualMachineImpl vmImpl, MethodImpl method,
			long codeIndex, String name, String signature,
			String genericSignature, int length, int slot, boolean isArgument) {
		super("LocalVariable", vmImpl); //$NON-NLS-1$
		fMethod = method;
		fCodeIndex = codeIndex;
		fName = name;
		fSignature = signature;
		fGenericSignature = genericSignature;
		fLength = length;
		fSlot = slot;
		fIsArgument = isArgument;
	}
	
	/**
	 * @return Returns local variable's index in its frame.
	 */
	public int slot() {
		return fSlot;
	}

	/**
	 * @return Returns the hash code value.
	 */
	@Override
	public int hashCode() {
		return fMethod.hashCode() + (int) fCodeIndex + fSlot;
	}

	/**
	 * @return Returns true if two mirrors refer to the same entity in the
	 *         target VM.
	 * @see java.lang.Object#equals(Object).
	 */
	@Override
	public boolean equals(Object object) {
		if (object != null && object.getClass().equals(this.getClass())) {
			LocalVariableImpl loc = (LocalVariableImpl) object;
			return fMethod.equals(loc.fMethod) && fCodeIndex == loc.fCodeIndex
					&& fSlot == loc.fSlot;
		}
		return false;
	}

	/* (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	@Override
	public int compareTo(LocalVariable variable) {
		if (variable == null || !variable.getClass().equals(this.getClass()))
			throw new ClassCastException(
					JDIMessages.LocalVariableImpl_Can__t_compare_local_variable_to_given_object_1);

		// See if methods are the same, if not return comparison between
		// methods.
		LocalVariableImpl var2 = (LocalVariableImpl) variable;
		if (!method().equals(var2.method()))
			return method().compareTo(var2.method());

		// Return comparison between the index of each local variable in its
		// stack frame.
		// Code indexes must be treated as unsigned. This matters if you have to
		// compare them.
		if (fCodeIndex < 0 || var2.fCodeIndex < 0)
			throw new InternalError(
					JDIMessages.LocalVariableImpl_Code_indexes_are_assumed_to_be_always_positive_2);

		long index2 = var2.fCodeIndex;
		if (fCodeIndex < index2)
			return -1;
		else if (fCodeIndex > index2)
			return 1;
		else
			return 0;
	}

	/**
	 * @return Returns true if this variable is an argument to its method.
	 */
	@Override
	public boolean isArgument() {
		return fIsArgument;
	}

	@Override
	public boolean isVisible(StackFrame frame) throws IllegalArgumentException,
			VMMismatchException {
		checkVM(frame);
		StackFrameImpl frameImpl = (StackFrameImpl) frame;
		if (!fMethod.equals(frameImpl.location().method()))
			throw new IllegalArgumentException(
					JDIMessages.LocalVariableImpl_The_stack_frame__s_method_does_not_match_this_variable__s_method_3);

		if (fLength == -1) {
			// inferred argument - assume visible for entire method
			return true;
		}
		long currentIndex = frameImpl.location().codeIndex();

		// Code indexes must be treated as unsigned. This matters if you have to
		// compare them.
		if (currentIndex >= 0 && fCodeIndex >= 0 && fCodeIndex + fLength >= 0)
			return fCodeIndex <= currentIndex
					&& currentIndex < fCodeIndex + fLength;

		throw new InternalError(
				JDIMessages.LocalVariableImpl_Code_indexes_are_assumed_to_be_always_positive_4);
	}

	/**
	 * @return Returns the name of the local variable.
	 */
	@Override
	public String name() {
		return fName;
	}

	/**
	 * @return Returns the signature of the local variable.
	 */
	@Override
	public String signature() {
		return fSignature;
	}

	/**
	 * @return Returns the type of the this LocalVariable.
	 */
	@Override
	public Type type() throws ClassNotLoadedException {
		if (fType == null) {
			fType = TypeImpl.create(virtualMachineImpl(), fSignature, method()
					.declaringType().classLoader());
		}
		return fType;
	}

	/**
	 * @return Returns a text representation of the declared type of this
	 *         variable.
	 */
	@Override
	public String typeName() {
		if (fTypeName == null) {
			fTypeName = TypeImpl.signatureToName(fSignature);
		}
		return fTypeName;
	}

	/**
	 * @return Returns the tag of the declared type of this variable.
	 */
	public byte tag() {
		return TypeImpl.signatureToTag(fSignature);
	}

	/**
	 * @return Returns the method that holds the local variable.
	 */
	public MethodImpl method() {
		return fMethod;
	}

	/**
	 * @return Returns true if the local variable is the 'this' pointer.
	 */
	public boolean isThis() {
		return slot() == 0 && !method().isStatic();
	}

	/**
	 * @return Returns description of Mirror object.
	 */
	@Override
	public String toString() {
		return fName;
	}

	@Override
	public String genericSignature() {
		return fGenericSignature;
	}

}
