org.eclipse.jdt.core.eval.IEvaluationContext Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* 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.
*
*
* {@code
* 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.
*
*
* {@code
* 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:
*
* - send the class files to the target VM,
*
- load them (starting with the code snippet class),
*
- create a new instance of the code snippet class,
*
- run the method
run()
of the code snippet,
* - retrieve the values of the local variables,
*
- 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;
}