/*******************************************************************************
 * 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.eval;

import org.eclipse.debug.core.DebugException;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;

/**
 * An evaluation engine performs an evaluation of a code snippet or expression
 * in a specified thread of a debug target. An evaluation engine is associated
 * with a specific debug target and Java project on creation.
 *
 * @see IEvaluationResult
 * @see IEvaluationListener
 * @since 2.0
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */

public interface IEvaluationEngine {
	/**
	 * Asynchronously evaluates the given snippet in the context of the
	 * specified stack frame, reporting the result back to the given listener.
	 * The snippet is evaluated in the context of the Java project this
	 * evaluation engine was created on. If the snippet is determined to be a
	 * valid expression, the expression is evaluated in the thread associated
	 * with the given stack frame. The thread is resumed from the location at
	 * which it is currently suspended to perform the evaluation. When the
	 * evaluation completes, the thread will be suspended at this original
	 * location. The thread runs the evaluation with the given evaluation detail
	 * (@see IJavaThread#runEvaluation(IEvaluationRunnable, IProgressMonitor,
	 * int)). Compilation and runtime errors are reported in the evaluation
	 * result.
	 *
	 * @param snippet
	 *            code snippet to evaluate
	 * @param frame
	 *            the stack frame context in which to run the evaluation.
	 * @param listener
	 *            the listener that will receive notification when/if the
	 *            evaluation completes
	 * @param evaluationDetail
	 *            one of <code>DebugEvent.EVALUATION</code> or
	 *            <code>DebugEvent.EVALUATION_IMPLICIT</code>
	 * @param hitBreakpoints
	 *            whether or not breakpoints should be honored in the evaluation
	 *            thread during the evaluation. If <code>false</code>,
	 *            breakpoints hit in the evaluation thread will be ignored.
	 * @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>The associated thread is not currently suspended</li>
	 *                <li>The stack frame is not contained in the debug target
	 *                associated with this evaluation engine</li>
	 *                <li>The associated thread is suspended in the middle of an
	 *                evaluation that has not completed. It is not possible to
	 *                perform nested evaluations</li>
	 *                </ul>
	 */
	public void evaluate(String snippet, IJavaStackFrame frame,
			IEvaluationListener listener, int evaluationDetail,
			boolean hitBreakpoints) throws DebugException;

	/**
	 * Asynchronously evaluates the given snippet in the context of the
	 * specified type, reporting the result back to the given listener. The
	 * snippet is evaluated in the context of the Java project this evaluation
	 * engine was created on. If the snippet is determined to be a valid
	 * expression, the expression is evaluated in the thread associated with the
	 * given stack frame. The thread is resumed from the location at which it is
	 * currently suspended to perform the evaluation. When the evaluation
	 * completes, the thread will be suspended at this original location. The
	 * thread runs the evaluation with the given evaluation detail (@see
	 * IJavaThread#runEvaluation(IEvaluationRunnable, IProgressMonitor, int)).
	 * Compilation and runtime errors are reported in the evaluation result.
	 *
	 * @param snippet
	 *            code snippet to evaluate
	 * @param thisContext
	 *            the 'this' context for the evaluation
	 * @param thread
	 *            the thread in which to run the evaluation, which must be
	 *            suspended
	 * @param listener
	 *            the listener that will receive notification when/if the
	 *            evaluation completes
	 * @param evaluationDetail
	 *            one of <code>DebugEvent.EVALUATION</code> or
	 *            <code>DebugEvent.EVALUATION_IMPLICIT</code>
	 * @param hitBreakpoints
	 *            whether or not breakpoints should be honored in the evaluation
	 *            thread during the evaluation. If <code>false</code>,
	 *            breakpoints hit in the evaluation thread will be ignored.
	 * @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>The associated thread is not currently suspended</li>
	 *                <li>The specified thread is not contained in the debug
	 *                target associated with this evaluation engine</li>
	 *                <li>The associated thread is suspended in the middle of an
	 *                evaluation that has not completed. It is not possible to
	 *                perform nested evaluations</li>
	 *                </ul>
	 */
	public void evaluate(String snippet, IJavaObject thisContext,
			IJavaThread thread, IEvaluationListener listener,
			int evaluationDetail, boolean hitBreakpoints) throws DebugException;

	/**
	 * Returns the Java project in which expressions are compiled.
	 *
	 * @return Java project context
	 */
	public IJavaProject getJavaProject();

	/**
	 * Returns the debug target for which evaluations are executed.
	 *
	 * @return Java debug target
	 */
	public IJavaDebugTarget getDebugTarget();

	/**
	 * Disposes this evaluation engine. This causes the evaluation engine to
	 * cleanup any resources (such as threads) that it maintains. Clients should
	 * call this method when they are finished performing evaluations with this
	 * engine.
	 *
	 * This engine must not be used to perform evaluations after it has been
	 * disposed.
	 */
	public void dispose();

}
