/*******************************************************************************
 * Copyright (c) 2000, 2011 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.debug.core;

import java.util.List;

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDropToFrame;
import org.eclipse.debug.core.model.IFilteredStep;
import org.eclipse.debug.core.model.IStackFrame;

/**
 * A stack frame in a thread on a Java virtual machine.
 * <p>
 * Since 3.1, <code>IJavaStackFrame</code> also implements
 * {@link org.eclipse.debug.core.model.IDropToFrame}.
 * </p>
 * 
 * @see org.eclipse.debug.core.model.IStackFrame
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
@SuppressWarnings("deprecation")
public interface IJavaStackFrame extends IStackFrame, IJavaModifiers,
		IFilteredStep, IDropToFrame {

	/**
	 * Status code indicating a stack frame is invalid. A stack frame becomes
	 * invalid when the thread containing the stack frame resumes. A stack frame
	 * may or may not be valid if the thread subsequently suspends, depending on
	 * the location where the thread suspends.
	 * 
	 * @since 3.1
	 */
	public static final int ERR_INVALID_STACK_FRAME = 130;

	/**
	 * Returns whether this stack frame currently supports the drop to frame
	 * operation. Note that not all VMs support the operation.
	 * 
	 * @return whether this stack frame currently supports drop to frame
	 * @deprecated since 3.1, IJavaStackFrame extends
	 *             org.eclipse.debug.core.IDropToFrame which defines
	 *             canDropToFrame(). Use this method instead.
	 */
	@Deprecated
	boolean supportsDropToFrame();

	/**
	 * Returns whether the method associated with this stack frame is a
	 * constructor.
	 * 
	 * @return whether this stack frame is associated with a constructor
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public boolean isConstructor() throws DebugException;

	/**
	 * Returns whether the method associated with this stack frame has been
	 * declared as native.
	 * 
	 * @return whether this stack frame has been declared as native
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public boolean isNative() throws DebugException;

	/**
	 * Returns whether the method associated with this stack frame is a static
	 * initializer.
	 * 
	 * @return whether this stack frame is a static initializer
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public boolean isStaticInitializer() throws DebugException;

	/**
	 * Returns whether the method associated with this stack frame has been
	 * declared as synchronized.
	 * 
	 * @return whether this stack frame has been declared as synchronized
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public boolean isSynchronized() throws DebugException;

	/**
	 * Returns whether the method associated with this stack frame is running
	 * code in the VM that is out of synch with the code in the workspace.
	 * 
	 * @return whether this stack frame is out of synch with the workspace.
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 2.0
	 */
	public boolean isOutOfSynch() throws DebugException;

	/**
	 * Returns whether the method associated with this stack frame is obsolete,
	 * that is, it is running old byte codes that have been replaced in the VM.
	 * This can occur when a hot code replace succeeds but the VM is unable to
	 * pop a call to an affected method from the call stack.
	 * 
	 * @return whether this stack frame's method is obsolete
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 2.0
	 */
	public boolean isObsolete() throws DebugException;

	/**
	 * Returns the fully qualified name of the type that declares the method
	 * associated with this stack frame.
	 * 
	 * @return declaring type name
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public String getDeclaringTypeName() throws DebugException;

	/**
	 * Returns the fully qualified name of the type that is the receiving object
	 * associated with this stack frame
	 * 
	 * @return receiving type name
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public String getReceivingTypeName() throws DebugException;

	/**
	 * Returns the JNI signature for the method this stack frame is associated
	 * with.
	 * 
	 * @return signature
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public String getSignature() throws DebugException;

	/**
	 * Returns a list of fully qualified type names of the arguments for the
	 * method associated with this stack frame.
	 * 
	 * @return argument type names, or an empty list if this method has no
	 *         arguments
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public List<String> getArgumentTypeNames() throws DebugException;

	/**
	 * Returns the name of the method associated with this stack frame
	 * 
	 * @return method name
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public String getMethodName() throws DebugException;

	/**
	 * Returns the local, static, or "this" variable with the given name, or
	 * <code>null</code> if unable to resolve a variable with the name.
	 * 
	 * @param variableName
	 *            the name of the variable to search for
	 * @return a variable, or <code>null</code> if none
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public IJavaVariable findVariable(String variableName)
			throws DebugException;

	/**
	 * Returns the line number of the instruction pointer in this stack frame
	 * that corresponds to the line in the associated source element in the
	 * specified stratum, or <code>-1</code> if line number information is
	 * unavailable.
	 * 
	 * @param stratum
	 *            the stratum to use.
	 * @return line number of instruction pointer in this stack frame, or
	 *         <code>-1</code> if line number information is unavailable
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the debug target. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                </ul>
	 * 
	 * @since 3.0
	 */
	public int getLineNumber(String stratum) throws DebugException;

	/**
	 * Returns the source name debug attribute associated with the declaring
	 * type of this stack frame, or <code>null</code> if the source name debug
	 * attribute not present.
	 * 
	 * @return source name debug attribute, or <code>null</code>
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public String getSourceName() throws DebugException;

	/**
	 * Returns the source name debug attribute associated with the declaring
	 * type of this stack frame in the specified stratum, or <code>null</code>
	 * if the source name debug attribute not present.
	 * 
	 * @param stratum
	 *            the stratum to use.
	 * @return source name debug attribute, or <code>null</code>
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * 
	 * @since 3.0
	 */
	public String getSourceName(String stratum) throws DebugException;

	/**
	 * Returns the source path debug attribute associated with this stack frame
	 * in the specified stratum, or <code>null</code> if the source path is not
	 * known.
	 * 
	 * @param stratum
	 *            the stratum to use.
	 * @return source path debug attribute, or <code>null</code>
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 3.0
	 */
	public String getSourcePath(String stratum) throws DebugException;

	/**
	 * Returns the source path debug attribute associated with this stack frame,
	 * or <code>null</code> if the source path is not known.
	 * 
	 * @return source path debug attribute, or <code>null</code>
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 3.0
	 */
	public String getSourcePath() throws DebugException;

	/**
	 * Returns a collection of local variables that are visible at the current
	 * point of execution in this stack frame. The list includes arguments.
	 * 
	 * @return collection of locals and arguments
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 2.0
	 */
	public IJavaVariable[] getLocalVariables() throws DebugException;

	/**
	 * Returns a reference to the receiver of the method associated with this
	 * stack frame, or <code>null</code> if this stack frame represents a static
	 * method.
	 * 
	 * @return 'this' object, or <code>null</code>
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 */
	public IJavaObject getThis() throws DebugException;

	/**
	 * Returns the class in which this stack frame's method is declared.
	 * 
	 * @return the class in which this stack frame's method is declared
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 2.0
	 * @deprecated Use <code>getReferenceType()</code> instead, as a method is
	 *             not restricted to occur in a class. An interface may contain
	 *             a synthetic class initializer methods. Since 3.1, this method
	 *             throws a <code>DebugException</code> when a stack frame's
	 *             method is contained in an interface.
	 */
	@Deprecated
	public IJavaClassType getDeclaringType() throws DebugException;

	/**
	 * Returns the type in which this stack frame's method is declared.
	 * 
	 * @return the type in which this stack frame's method is declared
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 3.1
	 */
	public IJavaReferenceType getReferenceType() throws DebugException;

	/**
	 * Returns whether local variable information was available when local
	 * variables were retrieved from the target for this frame. Returns
	 * <code>true</code> if locals have never been retrieved. This data is
	 * available after the fact, since variable retrieval is expensive.
	 * 
	 * @return whether local variable information was available when variables
	 *         were retrieved from the target. Returns <code>true</code> if
	 *         locals have never been retrieved
	 * 
	 * @since 2.0
	 */
	public boolean wereLocalsAvailable();

	/**
	 * Returns whether the method associated with this stack frame accepts a
	 * variable number of arguments.
	 * 
	 * @return <code>true</code> if the method associated with this stack frame
	 *         accepts a variable number of arguments, <code>false</code>
	 *         otherwise.
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This stack frame is no longer valid. That is, the
	 *                thread containing this stack frame has since been resumed.
	 *                </li>
	 *                </ul>
	 * @since 3.1
	 */
	public boolean isVarArgs() throws DebugException;

	/**
	 * Returns whether this frame currently supports a force return operation.
	 * That is, can this method force a return before it reaches a return
	 * statement. Not all VMs support this feature.
	 * <p>
	 * Force return is only available when a thread is suspended.
	 * </p>
	 * 
	 * @return whether force return can be performed currently
	 * @since 3.3
	 */
	public boolean canForceReturn();

	/**
	 * Steps out of this frame's method returning the given value. No further
	 * instructions in the method are executed but locks acquired by entering
	 * synchronized blocks are released. The following conditions must be
	 * satisfied:
	 * <ul>
	 * <li>This frame must be suspended in a non-native method.</li>
	 * <li>The return value must be assignment compatible with this frame's
	 * method's return type. Use a void value when a method return type is void
	 * (see <code>IJavaDebugTarget.voidValue()</code>).</li>
	 * </ul>
	 * 
	 * @param value
	 *            return value that must be assignment compatible with this
	 *            frame's method's return value
	 * @throws DebugException
	 *             if the operation fails
	 * @since 3.3
	 */
	public void forceReturn(IJavaValue value) throws DebugException;
}
