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

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();
	
}

