All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.jdt.core.eval.IEvaluationContext Maven / Gradle / Ivy

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

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;

/**
 * An evaluation context supports evaluating code snippets.
 * 

* A code snippet is pretty much any valid piece of Java code that could be * pasted into the body of a method and compiled. However, there are two * areas where the rules are slightly more liberal. *

* First, a code snippet can return heterogeneous types. Inside the same code * snippet an int could be returned on one line, and a * String on the next, etc. For example, the following would be * considered a valid code snippet: *

 * 
 * char c = '3';
 * switch (c) {
 *   case '1': return 1;
 *   case '2': return '2';
 *   case '3': return "3";
 *   default: return null;
 * }
 * 
 * 
*

*

* Second, if the last statement is only an expression, the return * keyword is implied. For example, the following returns false: *

 * 
 * int i = 1;
 * i == 2
 * 
 * 
*

*

* Global variables are an additional feature of evaluation contexts. Within an * evaluation context, global variables maintain their value across evaluations. * These variables are particularly useful for storing the result of an * evaluation for use in subsequent evaluations. *

*

* The evaluation context remembers the name of the package in which code * snippets are run. The user can set this to any package, thereby gaining * access to types that are normally only visible within that package. *

*

* Finally, the evaluation context remembers a list of import declarations. The * user can import any packages and types so that the code snippets may refer * to types by their shorter simple names. *

*

* Example of use: *

 * 
 * IJavaProject project = getJavaProject();
 * IEvaluationContext context = project.newEvaluationContext();
 * String codeSnippet = "int i= 0; i++";
 * ICodeSnippetRequestor requestor = ...;
 * context.evaluateCodeSnippet(codeSnippet, requestor, progressMonitor);
 * 
 * 
*

*

* IJavaProject.newEvaluationContext can be used to obtain an * instance. *

* * @see IJavaProject#newEvaluationContext() * @noimplement This interface is not intended to be implemented by clients. */ public interface IEvaluationContext { /** * Returns the global variables declared in this evaluation context. * The variables are maintained in the order they are created in. * * @return the list of global variables */ public IGlobalVariable[] allVariables(); /** * Performs a code completion at the given position in the given code snippet, * reporting results to the given completion requestor. *

* Note that code completion does not involve evaluation. *

* * @param codeSnippet the code snippet to complete in * @param position the character position in the code snippet to complete at, * or -1 indicating the beginning of the snippet * @param requestor the code completion requestor capable of accepting all * possible types of completions * @exception JavaModelException if code completion could not be performed. Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @since 2.0 * @deprecated Use {@link #codeComplete(String,int,CompletionRequestor)} instead. */ public void codeComplete( String codeSnippet, int position, ICompletionRequestor requestor) throws JavaModelException; /** * Performs a code completion at the given position in the given code snippet, * reporting results to the given completion requestor. * It considers types in the working copies with the given owner first. In other words, * the owner's working copies will take precedence over their original compilation units * in the workspace. *

* Note that if a working copy is empty, it will be as if the original compilation * unit had been deleted. *

*

* Note that code completion does not involve evaluation. *

* * @param codeSnippet the code snippet to complete in * @param position the character position in the code snippet to complete at, * or -1 indicating the beginning of the snippet * @param requestor the code completion requestor capable of accepting all * possible types of completions * @param owner the owner of working copies that take precedence over their original compilation units * @exception JavaModelException if code completion could not be performed. Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @since 3.0 * @deprecated Use {@link #codeComplete(String,int,CompletionRequestor,WorkingCopyOwner)} instead. */ public void codeComplete( String codeSnippet, int position, ICompletionRequestor requestor, WorkingCopyOwner owner) throws JavaModelException; /** * Performs a code completion at the given position in the given code snippet, * reporting results to the given completion requestor. *

* Note that code completion does not involve evaluation. *

* * @param codeSnippet the code snippet to complete in * @param position the character position in the code snippet to complete at, * or -1 indicating the beginning of the snippet * @param requestor the code completion requestor capable of accepting all * possible types of completions * @exception JavaModelException if code completion could not be performed. Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @since 3.1 */ public void codeComplete( String codeSnippet, int position, CompletionRequestor requestor) throws JavaModelException; /** * Performs a code completion at the given position in the given code snippet, * reporting results to the given completion requestor. *

* Note that code completion does not involve evaluation. *

*

* If {@link IProgressMonitor} is not null then some proposals which * can be very long to compute are proposed. To avoid that the code assist operation * take too much time a {@link IProgressMonitor} which automatically cancel the code * assist operation when a specified amount of time is reached could be used. * *

	 * new IProgressMonitor() {
	 *     private final static int TIMEOUT = 500; //ms
	 *     private long endTime;
	 *     public void beginTask(String name, int totalWork) {
	 *         fEndTime= System.currentTimeMillis() + TIMEOUT;
	 *     }
	 *     public boolean isCanceled() {
	 *         return endTime <= System.currentTimeMillis();
	 *     }
	 *     ...
	 * };
	 * 
*

* * @param codeSnippet the code snippet to complete in * @param position the character position in the code snippet to complete at, * or -1 indicating the beginning of the snippet * @param requestor the code completion requestor capable of accepting all * possible types of completions * @param monitor the progress monitor used to report progress * @exception JavaModelException if code completion could not be performed. Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @since 3.5 */ public void codeComplete( String codeSnippet, int position, CompletionRequestor requestor, IProgressMonitor monitor) throws JavaModelException; /** * Performs a code completion at the given position in the given code snippet, * reporting results to the given completion requestor. * It considers types in the working copies with the given owner first. In other words, * the owner's working copies will take precedence over their original compilation units * in the workspace. *

* Note that if a working copy is empty, it will be as if the original compilation * unit had been deleted. *

*

* Note that code completion does not involve evaluation. *

* * @param codeSnippet the code snippet to complete in * @param position the character position in the code snippet to complete at, * or -1 indicating the beginning of the snippet * @param requestor the code completion requestor capable of accepting all * possible types of completions * @param owner the owner of working copies that take precedence over their original compilation units * @exception JavaModelException if code completion could not be performed. Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @since 3.1 */ public void codeComplete( String codeSnippet, int position, CompletionRequestor requestor, WorkingCopyOwner owner) throws JavaModelException; /** * Performs a code completion at the given position in the given code snippet, * reporting results to the given completion requestor. * It considers types in the working copies with the given owner first. In other words, * the owner's working copies will take precedence over their original compilation units * in the workspace. *

* Note that if a working copy is empty, it will be as if the original compilation * unit had been deleted. *

*

* Note that code completion does not involve evaluation. *

*

* If {@link IProgressMonitor} is not null then some proposals which * can be very long to compute are proposed. To avoid that the code assist operation * take too much time a {@link IProgressMonitor} which automatically cancel the code * assist operation when a specified amount of time is reached could be used. * *

	 * new IProgressMonitor() {
	 *     private final static int TIMEOUT = 500; //ms
	 *     private long endTime;
	 *     public void beginTask(String name, int totalWork) {
	 *         fEndTime= System.currentTimeMillis() + TIMEOUT;
	 *     }
	 *     public boolean isCanceled() {
	 *         return endTime <= System.currentTimeMillis();
	 *     }
	 *     ...
	 * };
	 * 
*

* * @param codeSnippet the code snippet to complete in * @param position the character position in the code snippet to complete at, * or -1 indicating the beginning of the snippet * @param requestor the code completion requestor capable of accepting all * possible types of completions * @param owner the owner of working copies that take precedence over their original compilation units * @param monitor the progress monitor used to report progress * @exception JavaModelException if code completion could not be performed. Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @since 3.5 */ public void codeComplete( String codeSnippet, int position, CompletionRequestor requestor, WorkingCopyOwner owner, IProgressMonitor monitor) throws JavaModelException; /** * Resolves and returns a collection of Java elements corresponding to the source * code at the given positions in the given code snippet. *

* Note that code select does not involve evaluation, and problems are never * reported. *

* * @param codeSnippet the code snippet to resolve in * @param offset the position in the code snippet of the first character * of the code to resolve * @param length the length of the selected code to resolve * @return the (possibly empty) list of selection Java elements * @exception JavaModelException if code resolve could not be performed. * Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
*/ public IJavaElement[] codeSelect(String codeSnippet, int offset, int length) throws JavaModelException; /** * Resolves and returns a collection of Java elements corresponding to the source * code at the given positions in the given code snippet. * It considers types in the working copies with the given owner first. In other words, * the owner's working copies will take precedence over their original compilation units * in the workspace. *

* Note that if a working copy is empty, it will be as if the original compilation * unit had been deleted. *

*

* Note that code select does not involve evaluation, and problems are never * reported. *

* * @param codeSnippet the code snippet to resolve in * @param offset the position in the code snippet of the first character * of the code to resolve * @param length the length of the selected code to resolve * @param owner the owner of working copies that take precedence over their original compilation units * @return the (possibly empty) list of selection Java elements * @exception JavaModelException if code resolve could not be performed. * Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @since 3.0 */ public IJavaElement[] codeSelect(String codeSnippet, int offset, int length, WorkingCopyOwner owner) throws JavaModelException; /** * Deletes the given variable from this evaluation context. Does nothing if * the given variable has already been deleted. * * @param variable the global variable */ public void deleteVariable(IGlobalVariable variable); /** * Evaluates the given code snippet in the context of a suspended thread. * The code snippet is compiled along with this context's package declaration, * imports, and global variables. The given requestor's * acceptProblem method is called for each compilation problem that * is detected. Then the resulting class files are handed to the given * requestor's acceptClassFiles method to deploy and run. *

* The requestor is expected to: *

    *
  1. send the class files to the target VM, *
  2. load them (starting with the code snippet class), *
  3. create a new instance of the code snippet class, *
  4. run the method run() of the code snippet, *
  5. retrieve the values of the local variables, *
  6. retrieve the returned value of the code snippet *
*

*

* This method is long-running; progress and cancellation are provided * by the given progress monitor. *

* * @param codeSnippet the code snippet * @param localVariableTypeNames the dot-separated fully qualified names of the types of the local variables. * @param localVariableNames the names of the local variables as they are declared in the user's code. * @param localVariableModifiers the modifiers of the local variables (default modifier or final modifier). * @param declaringType the type in which the code snippet is evaluated. * @param isStatic whether the code snippet is evaluated in a static member of the declaring type. * @param isConstructorCall whether the code snippet is evaluated in a constructor of the declaring type. * @param requestor the code snippet requestor * @param progressMonitor a progress monitor * @exception JavaModelException if a runtime problem occurred or if this * context's project has no build state */ public void evaluateCodeSnippet( String codeSnippet, String[] localVariableTypeNames, String[] localVariableNames, int[] localVariableModifiers, IType declaringType, boolean isStatic, boolean isConstructorCall, ICodeSnippetRequestor requestor, IProgressMonitor progressMonitor) throws JavaModelException; /** * Evaluates the given code snippet. The code snippet is * compiled along with this context's package declaration, imports, and * global variables. The given requestor's acceptProblem method * is called for each compilation problem that is detected. Then the resulting * class files are handed to the given requestor's acceptClassFiles * method to deploy and run. The requestor is also responsible for getting the * result back. *

* This method is long-running; progress and cancellation are provided * by the given progress monitor. *

* * @param codeSnippet the code snippet * @param requestor the code snippet requestor * @param progressMonitor a progress monitor * @exception JavaModelException if a runtime problem occurred or if this * context's project has no build state */ public void evaluateCodeSnippet( String codeSnippet, ICodeSnippetRequestor requestor, IProgressMonitor progressMonitor) throws JavaModelException; /** * Evaluates the given global variable. During this operation, * this context's package declaration, imports, and all its declared * variables are verified. The given requestor's acceptProblem * method will be called for each problem that is detected. *

* This method is long-running; progress and cancellation are provided * by the given progress monitor. *

* * @param variable the global variable * @param requestor the code snippet requestor * @param progressMonitor a progress monitor * @exception JavaModelException if a runtime problem occurred or if this * context's project has no build state */ public void evaluateVariable( IGlobalVariable variable, ICodeSnippetRequestor requestor, IProgressMonitor progressMonitor) throws JavaModelException; /** * Returns the import declarations for this evaluation context. Returns and empty * list if there are no imports (the default if the imports have never been set). * The syntax for the import corresponds to a fully qualified type name, or to * an on-demand package name as defined by ImportDeclaration (JLS2 7.5). For * example, "java.util.Hashtable" or "java.util.*". * * @return the list of import names */ public String[] getImports(); /** * Returns the name of the package in which code snippets are to be compiled and * run. Returns an empty string for the default package (the default if the * package name has never been set). For example, "com.example.myapp". * * @return the dot-separated package name, or the empty string indicating the * default package */ public String getPackageName(); /** * Returns the Java project this evaluation context was created for. * * @return the Java project */ public IJavaProject getProject(); /** * Creates a new global variable with the given name, type, and initializer. *

* The typeName and initializer are interpreted in * the context of this context's package and import declarations. *

*

* The syntax for a type name corresponds to Type in Field Declaration (JLS2 8.3). *

* * @param typeName the type name * @param name the name of the global variable * @param initializer the initializer expression, or null if the * variable is not initialized * @return a new global variable with the given name, type, and initializer */ public IGlobalVariable newVariable( String typeName, String name, String initializer); /** * Sets the import declarations for this evaluation context. An empty * list indicates there are no imports. The syntax for the import corresponds to a * fully qualified type name, or to an on-demand package name as defined by * ImportDeclaration (JLS2 7.5). For example, "java.util.Hashtable" * or "java.util.*". * * @param imports the list of import names */ public void setImports(String[] imports); /** * Sets the dot-separated name of the package in which code snippets are * to be compiled and run. For example, "com.example.myapp". * * @param packageName the dot-separated package name, or the empty string * indicating the default package */ public void setPackageName(String packageName); /** * Validates this evaluation context's import declarations. The given requestor's * acceptProblem method is called for each problem that is detected. * * @param requestor the code snippet requestor * @exception JavaModelException if this context's project has no build state */ public void validateImports(ICodeSnippetRequestor requestor) throws JavaModelException; /** * Performs a code completion at the given position in the given code snippet, * reporting results to the given completion requestor. *

* Note that code completion does not involve evaluation. *

* * @param codeSnippet the code snippet to complete in * @param position the character position in the code snippet to complete at, * or -1 indicating the beginning of the snippet * @param requestor the code completion requestor capable of accepting all * possible types of completions * @exception JavaModelException if code completion could not be performed. Reasons include: *

    *
  • The position specified is less than -1 or is greater than the snippet's * length (INDEX_OUT_OF_BOUNDS)
  • *
* @deprecated - use codeComplete(String, int, ICompletionRequestor) instead */ public void codeComplete( String codeSnippet, int position, org.eclipse.jdt.core.ICodeCompletionRequestor requestor) throws JavaModelException; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy