blob: 8fd162b532c99f164d5ffd91325c76e15e8c33a0 [file] [log] [blame]
package org.eclipse.jdt.internal.debug.core;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.Stack;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.IJavaType;
import org.eclipse.jdt.debug.core.IJavaValue;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor;
import org.eclipse.jdt.internal.compiler.IProblem;
import org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression;
import org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
import org.eclipse.jdt.internal.compiler.ast.AnonymousLocalTypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Argument;
import org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;
import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;
import org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference;
import org.eclipse.jdt.internal.compiler.ast.ArrayReference;
import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference;
import org.eclipse.jdt.internal.compiler.ast.AssertStatement;
import org.eclipse.jdt.internal.compiler.ast.Assignment;
import org.eclipse.jdt.internal.compiler.ast.AstNode;
import org.eclipse.jdt.internal.compiler.ast.BinaryExpression;
import org.eclipse.jdt.internal.compiler.ast.Block;
import org.eclipse.jdt.internal.compiler.ast.Break;
import org.eclipse.jdt.internal.compiler.ast.Case;
import org.eclipse.jdt.internal.compiler.ast.CastExpression;
import org.eclipse.jdt.internal.compiler.ast.CharLiteral;
import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;
import org.eclipse.jdt.internal.compiler.ast.Clinit;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.eclipse.jdt.internal.compiler.ast.CompoundAssignment;
import org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;
import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Continue;
import org.eclipse.jdt.internal.compiler.ast.DefaultCase;
import org.eclipse.jdt.internal.compiler.ast.DoStatement;
import org.eclipse.jdt.internal.compiler.ast.DoubleLiteral;
import org.eclipse.jdt.internal.compiler.ast.EmptyStatement;
import org.eclipse.jdt.internal.compiler.ast.EqualExpression;
import org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
import org.eclipse.jdt.internal.compiler.ast.ExtendedStringLiteral;
import org.eclipse.jdt.internal.compiler.ast.FalseLiteral;
import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
import org.eclipse.jdt.internal.compiler.ast.FieldReference;
import org.eclipse.jdt.internal.compiler.ast.FloatLiteral;
import org.eclipse.jdt.internal.compiler.ast.ForStatement;
import org.eclipse.jdt.internal.compiler.ast.IfStatement;
import org.eclipse.jdt.internal.compiler.ast.ImportReference;
import org.eclipse.jdt.internal.compiler.ast.Initializer;
import org.eclipse.jdt.internal.compiler.ast.InstanceOfExpression;
import org.eclipse.jdt.internal.compiler.ast.IntLiteral;
import org.eclipse.jdt.internal.compiler.ast.LabeledStatement;
import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
import org.eclipse.jdt.internal.compiler.ast.LocalTypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.LongLiteral;
import org.eclipse.jdt.internal.compiler.ast.MemberTypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.MessageSend;
import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.NullLiteral;
import org.eclipse.jdt.internal.compiler.ast.OR_OR_Expression;
import org.eclipse.jdt.internal.compiler.ast.PostfixExpression;
import org.eclipse.jdt.internal.compiler.ast.PrefixExpression;
import org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression;
import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;
import org.eclipse.jdt.internal.compiler.ast.QualifiedSuperReference;
import org.eclipse.jdt.internal.compiler.ast.QualifiedThisReference;
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
import org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
import org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
import org.eclipse.jdt.internal.compiler.ast.StringLiteral;
import org.eclipse.jdt.internal.compiler.ast.SuperReference;
import org.eclipse.jdt.internal.compiler.ast.SwitchStatement;
import org.eclipse.jdt.internal.compiler.ast.SynchronizedStatement;
import org.eclipse.jdt.internal.compiler.ast.ThisReference;
import org.eclipse.jdt.internal.compiler.ast.ThrowStatement;
import org.eclipse.jdt.internal.compiler.ast.TrueLiteral;
import org.eclipse.jdt.internal.compiler.ast.TryStatement;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.UnaryExpression;
import org.eclipse.jdt.internal.compiler.ast.WhileStatement;
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
import org.eclipse.jdt.internal.compiler.lookup.ClassScope;
import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
import org.eclipse.jdt.internal.compiler.lookup.MethodScope;
/**
* An evaluation visitor performs an interpretation of an abstract
* syntax tree. When an evaluation is perfomed in a stack frame,
* an AST is built for the exprression and then interpretted.
* As each node is visited, the result of evaluating that node is pushed
* onto a stack. Some nodes use values that are popped onto the
* stack. For example, when a literal node is interpretted, its
* literal value is pushed onto the stack. When a message send
* is performed, the arguments and receiver are popped off the
* stack.
* <p>
* An evaluation visitor is associted with a stack frame,
* which provides a context for resolving variables, and a
* thread in which to invoke methods.
* </p>
* <p>
* Although an AST for a complete compilation unit is provided,
* evalaution is onlhy performed in the <code>try</code> block
* of the <code>run()</code> method.
* </p>
*/
public class EvaluationVisitor implements IAbstractSyntaxTreeVisitor {
/**
* Whether to print debug messages to the console
*/
private static boolean VERBOSE = false;
/**
* The stack containing the objects/literals pushed as
* a result of interpretting an AST.
*/
private Stack fStack;
/**
* The stack frame context for this evaluation.
*/
private IJavaStackFrame fFrame;
/**
* Wether evaluation is active. Evaluation is only
* active with in the try block of the run method
* of the compilation unit being visited.
*/
private boolean fActive;
/**
* Wether currently traversing within the run method
*/
private boolean fInMethod;
/**
* Constructs an AST visitor to perform an evaluation in the
* context of the give stack frame.
*
* @param frame stack frame
*/
protected EvaluationVisitor(IJavaStackFrame frame) {
setStackFrame(frame);
fStack = new Stack();
setActive(false);
}
/**
* Prints the given message to the console if verbose
* mode is on.
*
* @param message the message to display
*/
protected void verbose(String message) {
if (VERBOSE) {
System.out.println(message);
}
}
/**
* Sets whether nodes being visited should be
* evaluated. Only nodes within the try block
* of the run method of the compilation unit
* being visited are evaluated.
*
* @param active whether nodes should be
* evaluated when entered
*/
protected void setActive(boolean active) {
fActive = active;
if (active) {
verbose("Evaluation begins");
} else {
verbose("Evaluation ends");
}
}
/**
* Returns whether nodes being visited should be
* evaluated. Only nodes within the try block of the
* run method of the compilation unit being visited
* are evaluated.
*
* @return whether nodes being visited should be
* evaluated
*/
protected boolean isActive() {
return fActive;
}
/**
* Sets whether currently traversing the run method
* of the compilation unit being visited.
*
* @param in whether currently traversing the run method
*/
protected void setInRunMethod(boolean in) {
fInMethod = in;
}
/**
* Returns whether currently traversing the run method
* of the compilation unit being visited.
*
* @return whether currently traversing the run method
*/
protected boolean isInRunMethod() {
return fInMethod;
}
/**
* Sets the stack frame context for this evalaution.
*
* @param context stack frame evaluation context
*/
protected void setStackFrame(IJavaStackFrame frame) {
fFrame = frame;
}
/**
* Returns the stack frame context for this evaluation.
*
* @return stack frame
*/
protected IJavaStackFrame getStackFrame() {
return fFrame;
}
/**
* Returns the thread in which to perform evaluations.
*
* @return the thread in which to perform evalautions
*/
protected IJavaThread getThread() {
return (IJavaThread)getStackFrame().getThread();
}
/**
* Pushes the given object onto the stack.
* The object cannot be <code>null</code>.
*
* @param object value to push
*/
protected void push(Object object) {
fStack.push(object);
verbose("Push " + object.toString());
}
/**
* Pops and returns the object on top of the stack.
*
* @return the object on top of the stack
*/
protected Object pop() {
Object top = fStack.pop();
verbose("Pop " + top.toString());
return top;
}
/**
* Called when the interpretation encounters a node that can
* not be interpretted.
*
* @exception UnsupportedOperationException
*/
protected void illegalStatement(AstNode node) {
UnsupportedOperationException ex = new UnsupportedOperationException();
if (VERBOSE) {
ex.printStackTrace();
}
throw ex;
}
/*
* @see IAbstractSyntaxTreeVisitor#acceptProblem(IProblem)
*/
public void acceptProblem(IProblem problem) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(AllocationExpression, BlockScope)
*/
public void endVisit(
AllocationExpression allocationExpression,
BlockScope scope) {
if (isActive()) {
try {
int numArgs = 0;
if (allocationExpression.arguments != null) {
numArgs = allocationExpression.arguments.length;
}
IJavaValue[] args = new IJavaValue[numArgs];
// args are in reverse order
for (int i= numArgs - 1; i >= 0; i--) {
args[i] = (IJavaValue)pop();
}
IJavaType clazz = (IJavaType)pop();
String signature = toString(allocationExpression.binding.signature());
IJavaValue result = clazz.newInstance(signature, args, getThread());
verbose("Invoked constructor: " + signature);
push(result);
} catch (DebugException e){
e.printStackTrace();
}
}
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(AND_AND_Expression, BlockScope)
*/
public void endVisit(AND_AND_Expression and_and_Expression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(AnonymousLocalTypeDeclaration, BlockScope)
*/
public void endVisit(
AnonymousLocalTypeDeclaration anonymousTypeDeclaration,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Argument, BlockScope)
*/
public void endVisit(Argument argument, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ArrayAllocationExpression, BlockScope)
*/
public void endVisit(
ArrayAllocationExpression arrayAllocationExpression,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ArrayInitializer, BlockScope)
*/
public void endVisit(ArrayInitializer arrayInitializer, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ArrayQualifiedTypeReference, BlockScope)
*/
public void endVisit(
ArrayQualifiedTypeReference arrayQualifiedTypeReference,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ArrayQualifiedTypeReference, ClassScope)
*/
public void endVisit(
ArrayQualifiedTypeReference arrayQualifiedTypeReference,
ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ArrayReference, BlockScope)
*/
public void endVisit(ArrayReference arrayReference, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ArrayTypeReference, BlockScope)
*/
public void endVisit(ArrayTypeReference arrayTypeReference, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ArrayTypeReference, ClassScope)
*/
public void endVisit(ArrayTypeReference arrayTypeReference, ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(AssertStatement, BlockScope)
*/
public void endVisit(AssertStatement assertStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Assignment, BlockScope)
*/
public void endVisit(Assignment assignment, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(BinaryExpression, BlockScope)
*/
public void endVisit(BinaryExpression binaryExpression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Block, BlockScope)
*/
public void endVisit(Block block, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Break, BlockScope)
*/
public void endVisit(Break breakStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Case, BlockScope)
*/
public void endVisit(Case caseStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(CastExpression, BlockScope)
*/
public void endVisit(CastExpression castExpression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(CharLiteral, BlockScope)
*/
public void endVisit(CharLiteral charLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ClassLiteralAccess, BlockScope)
*/
public void endVisit(ClassLiteralAccess classLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Clinit, ClassScope)
*/
public void endVisit(Clinit clinit, ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(CompilationUnitDeclaration, CompilationUnitScope)
*/
public void endVisit(
CompilationUnitDeclaration compilationUnitDeclaration,
CompilationUnitScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(CompoundAssignment, BlockScope)
*/
public void endVisit(CompoundAssignment compoundAssignment, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ConditionalExpression, BlockScope)
*/
public void endVisit(
ConditionalExpression conditionalExpression,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ConstructorDeclaration, ClassScope)
*/
public void endVisit(
ConstructorDeclaration constructorDeclaration,
ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Continue, BlockScope)
*/
public void endVisit(Continue continueStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(DefaultCase, BlockScope)
*/
public void endVisit(DefaultCase defaultCaseStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(DoStatement, BlockScope)
*/
public void endVisit(DoStatement doStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(DoubleLiteral, BlockScope)
*/
public void endVisit(DoubleLiteral doubleLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(EqualExpression, BlockScope)
*/
public void endVisit(EqualExpression equalExpression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(EmptyStatement, BlockScope)
*/
public void endVisit(EmptyStatement statement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ExplicitConstructorCall, BlockScope)
*/
public void endVisit(
ExplicitConstructorCall explicitConstructor,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ExtendedStringLiteral, BlockScope)
*/
public void endVisit(
ExtendedStringLiteral extendedStringLiteral,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(FalseLiteral, BlockScope)
*/
public void endVisit(FalseLiteral falseLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(FieldDeclaration, MethodScope)
*/
public void endVisit(FieldDeclaration fieldDeclaration, MethodScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(FieldReference, BlockScope)
*/
public void endVisit(FieldReference fieldReference, BlockScope scope) {
if (isActive()) {
try {
IJavaValue receiver = (IJavaValue)pop();
String name = toString(fieldReference.token);
IJavaVariable field = getField(receiver, name);
if (field == null) {
verbose("could not field " + name);
} else {
push(field.getValue());
}
} catch (DebugException e) {
e.printStackTrace();
}
}
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(FloatLiteral, BlockScope)
*/
public void endVisit(FloatLiteral floatLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ForStatement, BlockScope)
*/
public void endVisit(ForStatement forStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(IfStatement, BlockScope)
*/
public void endVisit(IfStatement ifStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ImportReference, CompilationUnitScope)
*/
public void endVisit(ImportReference importRef, CompilationUnitScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(Initializer, MethodScope)
*/
public void endVisit(Initializer initializer, MethodScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(InstanceOfExpression, BlockScope)
*/
public void endVisit(
InstanceOfExpression instanceOfExpression,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(IntLiteral, BlockScope)
*/
public void endVisit(IntLiteral intLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(LabeledStatement, BlockScope)
*/
public void endVisit(LabeledStatement labeledStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(LocalDeclaration, BlockScope)
*/
public void endVisit(LocalDeclaration localDeclaration, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(LocalTypeDeclaration, MethodScope)
*/
public void endVisit(
LocalTypeDeclaration localTypeDeclaration,
MethodScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(LongLiteral, BlockScope)
*/
public void endVisit(LongLiteral longLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(MemberTypeDeclaration, ClassScope)
*/
public void endVisit(
MemberTypeDeclaration memberTypeDeclaration,
ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(MessageSend, BlockScope)
*/
public void endVisit(MessageSend messageSend, BlockScope scope) {
if (isActive()) {
try {
int numArgs = 0;
if (messageSend.arguments != null) {
numArgs = messageSend.arguments.length;
}
IJavaValue[] args = new IJavaValue[numArgs];
// args are in reverse order
for (int i= numArgs - 1; i >= 0; i--) {
args[i] = (IJavaValue)pop();
}
IJavaValue receiver = (IJavaValue)pop();
String selector = toString(messageSend.selector);
String signature = toString(messageSend.binding.signature());
IJavaValue result = receiver.sendMessage(selector, signature, args, getThread(), messageSend.isSuperAccess());
verbose("Sent message: " + selector + " " + signature);
if (result != null) {
// void result is null
push(result);
}
} catch (DebugException e){
e.printStackTrace();
}
}
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(MethodDeclaration, ClassScope)
*/
public void endVisit(MethodDeclaration methodDeclaration, ClassScope scope) {
if (isInRunMethod()) {
// exiting run method
setInRunMethod(false);
}
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(NullLiteral, BlockScope)
*/
public void endVisit(NullLiteral nullLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(OR_OR_Expression, BlockScope)
*/
public void endVisit(OR_OR_Expression or_or_Expression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(PostfixExpression, BlockScope)
*/
public void endVisit(PostfixExpression postfixExpression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(PrefixExpression, BlockScope)
*/
public void endVisit(PrefixExpression prefixExpression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(QualifiedAllocationExpression, BlockScope)
*/
public void endVisit(
QualifiedAllocationExpression qualifiedAllocationExpression,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(QualifiedNameReference, BlockScope)
*/
public void endVisit(
QualifiedNameReference qualifiedNameReference,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(QualifiedSuperReference, BlockScope)
*/
public void endVisit(
QualifiedSuperReference qualifiedSuperReference,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(QualifiedThisReference, BlockScope)
*/
public void endVisit(
QualifiedThisReference qualifiedThisReference,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(QualifiedTypeReference, BlockScope)
*/
public void endVisit(
QualifiedTypeReference qualifiedTypeReference,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(QualifiedTypeReference, ClassScope)
*/
public void endVisit(
QualifiedTypeReference qualifiedTypeReference,
ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ReturnStatement, BlockScope)
*/
public void endVisit(ReturnStatement returnStatement, BlockScope scope) {
if (isActive()) {
// returning the result
setActive(false);
}
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(SingleNameReference, BlockScope)
*/
public void endVisit(
SingleNameReference singleNameReference,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(SingleTypeReference, BlockScope)
*/
public void endVisit(
SingleTypeReference singleTypeReference,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(SingleTypeReference, ClassScope)
*/
public void endVisit(
SingleTypeReference singleTypeReference,
ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(StringLiteral, BlockScope)
*/
public void endVisit(StringLiteral stringLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(SuperReference, BlockScope)
*/
public void endVisit(SuperReference superReference, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(SwitchStatement, BlockScope)
*/
public void endVisit(SwitchStatement switchStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(SynchronizedStatement, BlockScope)
*/
public void endVisit(
SynchronizedStatement synchronizedStatement,
BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ThisReference, BlockScope)
*/
public void endVisit(ThisReference thisReference, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(ThrowStatement, BlockScope)
*/
public void endVisit(ThrowStatement throwStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(TrueLiteral, BlockScope)
*/
public void endVisit(TrueLiteral trueLiteral, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(TryStatement, BlockScope)
*/
public void endVisit(TryStatement tryStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(TypeDeclaration, BlockScope)
*/
public void endVisit(TypeDeclaration typeDeclaration, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(TypeDeclaration, ClassScope)
*/
public void endVisit(TypeDeclaration typeDeclaration, ClassScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(TypeDeclaration, CompilationUnitScope)
*/
public void endVisit(
TypeDeclaration typeDeclaration,
CompilationUnitScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(UnaryExpression, BlockScope)
*/
public void endVisit(UnaryExpression unaryExpression, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#endVisit(WhileStatement, BlockScope)
*/
public void endVisit(WhileStatement whileStatement, BlockScope scope) {
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(AllocationExpression, BlockScope)
*/
public boolean visit(
AllocationExpression allocationExpression,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(AND_AND_Expression, BlockScope)
*/
public boolean visit(AND_AND_Expression and_and_Expression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(AnonymousLocalTypeDeclaration, BlockScope)
*/
public boolean visit(
AnonymousLocalTypeDeclaration anonymousTypeDeclaration,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Argument, BlockScope)
*/
public boolean visit(Argument argument, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ArrayAllocationExpression, BlockScope)
*/
public boolean visit(
ArrayAllocationExpression arrayAllocationExpression,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ArrayInitializer, BlockScope)
*/
public boolean visit(ArrayInitializer arrayInitializer, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ArrayQualifiedTypeReference, BlockScope)
*/
public boolean visit(
ArrayQualifiedTypeReference arrayQualifiedTypeReference,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ArrayQualifiedTypeReference, ClassScope)
*/
public boolean visit(
ArrayQualifiedTypeReference arrayQualifiedTypeReference,
ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ArrayReference, BlockScope)
*/
public boolean visit(ArrayReference arrayReference, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ArrayTypeReference, BlockScope)
*/
public boolean visit(ArrayTypeReference arrayTypeReference, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ArrayTypeReference, ClassScope)
*/
public boolean visit(ArrayTypeReference arrayTypeReference, ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(AssertStatement, BlockScope)
*/
public boolean visit(AssertStatement assertStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Assignment, BlockScope)
*/
public boolean visit(Assignment assignment, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(BinaryExpression, BlockScope)
*/
public boolean visit(BinaryExpression binaryExpression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Block, BlockScope)
*/
public boolean visit(Block block, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Break, BlockScope)
*/
public boolean visit(Break breakStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Case, BlockScope)
*/
public boolean visit(Case caseStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(CastExpression, BlockScope)
*/
public boolean visit(CastExpression castExpression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(CharLiteral, BlockScope)
*/
public boolean visit(CharLiteral charLiteral, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ClassLiteralAccess, BlockScope)
*/
public boolean visit(ClassLiteralAccess classLiteral, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Clinit, ClassScope)
*/
public boolean visit(Clinit clinit, ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(CompilationUnitDeclaration, CompilationUnitScope)
*/
public boolean visit(
CompilationUnitDeclaration compilationUnitDeclaration,
CompilationUnitScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(CompoundAssignment, BlockScope)
*/
public boolean visit(CompoundAssignment compoundAssignment, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ConditionalExpression, BlockScope)
*/
public boolean visit(
ConditionalExpression conditionalExpression,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ConstructorDeclaration, ClassScope)
*/
public boolean visit(
ConstructorDeclaration constructorDeclaration,
ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Continue, BlockScope)
*/
public boolean visit(Continue continueStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(DefaultCase, BlockScope)
*/
public boolean visit(DefaultCase defaultCaseStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(DoStatement, BlockScope)
*/
public boolean visit(DoStatement doStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(DoubleLiteral, BlockScope)
*/
public boolean visit(DoubleLiteral doubleLiteral, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(EqualExpression, BlockScope)
*/
public boolean visit(EqualExpression equalExpression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(EmptyStatement, BlockScope)
*/
public boolean visit(EmptyStatement statement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ExplicitConstructorCall, BlockScope)
*/
public boolean visit(
ExplicitConstructorCall explicitConstructor,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ExtendedStringLiteral, BlockScope)
*/
public boolean visit(
ExtendedStringLiteral extendedStringLiteral,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(FalseLiteral, BlockScope)
*/
public boolean visit(FalseLiteral falseLiteral, BlockScope scope) {
if (isActive()) {
push(getDebugTarget().newValue(false));
}
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(FieldDeclaration, MethodScope)
*/
public boolean visit(FieldDeclaration fieldDeclaration, MethodScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(FieldReference, BlockScope)
*/
public boolean visit(FieldReference fieldReference, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(FloatLiteral, BlockScope)
*/
public boolean visit(FloatLiteral floatLiteral, BlockScope scope) {
if (isActive()) {
// value of FloatLiteral is not visible, so must parse
// source to get the value
push(getDebugTarget().newValue(Float.parseFloat(toString(floatLiteral.source()))));
}
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ForStatement, BlockScope)
*/
public boolean visit(ForStatement forStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(IfStatement, BlockScope)
*/
public boolean visit(IfStatement ifStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ImportReference, CompilationUnitScope)
*/
public boolean visit(ImportReference importRef, CompilationUnitScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(Initializer, MethodScope)
*/
public boolean visit(Initializer initializer, MethodScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(InstanceOfExpression, BlockScope)
*/
public boolean visit(
InstanceOfExpression instanceOfExpression,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(IntLiteral, BlockScope)
*/
public boolean visit(IntLiteral intLiteral, BlockScope scope) {
if (isActive()) {
push(getDebugTarget().newValue(intLiteral.value));
}
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(LabeledStatement, BlockScope)
*/
public boolean visit(LabeledStatement labeledStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(LocalDeclaration, BlockScope)
*/
public boolean visit(LocalDeclaration localDeclaration, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(LocalTypeDeclaration, MethodScope)
*/
public boolean visit(
LocalTypeDeclaration localTypeDeclaration,
MethodScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(LongLiteral, BlockScope)
*/
public boolean visit(LongLiteral longLiteral, BlockScope scope) {
if (isActive()) {
// LongLiteral.value is not visible, so must parse its source
// to get the value
push(getDebugTarget().newValue(Long.parseLong(toString(longLiteral.source()))));
}
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(MemberTypeDeclaration, ClassScope)
*/
public boolean visit(
MemberTypeDeclaration memberTypeDeclaration,
ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(MessageSend, BlockScope)
*/
public boolean visit(MessageSend messageSend, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(MethodDeclaration, ClassScope)
*/
public boolean visit(MethodDeclaration methodDeclaration, ClassScope scope) {
if (isActive()) {
illegalStatement(methodDeclaration);
}
if (toString(methodDeclaration.selector).equals("run")) {
setInRunMethod(true);
return true;
}
return false;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(NullLiteral, BlockScope)
*/
public boolean visit(NullLiteral nullLiteral, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(OR_OR_Expression, BlockScope)
*/
public boolean visit(OR_OR_Expression or_or_Expression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(PostfixExpression, BlockScope)
*/
public boolean visit(PostfixExpression postfixExpression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(PrefixExpression, BlockScope)
*/
public boolean visit(PrefixExpression prefixExpression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(QualifiedAllocationExpression, BlockScope)
*/
public boolean visit(
QualifiedAllocationExpression qualifiedAllocationExpression,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(QualifiedNameReference, BlockScope)
*/
public boolean visit(
QualifiedNameReference qualifiedNameReference,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(QualifiedSuperReference, BlockScope)
*/
public boolean visit(
QualifiedSuperReference qualifiedSuperReference,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(QualifiedThisReference, BlockScope)
*/
public boolean visit(
QualifiedThisReference qualifiedThisReference,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(QualifiedTypeReference, BlockScope)
*/
public boolean visit(
QualifiedTypeReference qualifiedTypeReference,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(QualifiedTypeReference, ClassScope)
*/
public boolean visit(
QualifiedTypeReference qualifiedTypeReference,
ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ReturnStatement, BlockScope)
*/
public boolean visit(ReturnStatement returnStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(SingleNameReference, BlockScope)
*/
public boolean visit(
SingleNameReference singleNameReference,
BlockScope scope) {
if (isActive()) {
try {
String name = toString(singleNameReference.token);
IJavaVariable var = (IJavaVariable)getStackFrame().findVariable(name);
if (var == null) {
verbose("could not find variable named " + name);
} else {
push(var.getValue());
}
} catch (DebugException e) {
}
}
return false;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(SingleTypeReference, BlockScope)
*/
public boolean visit(
SingleTypeReference singleTypeReference,
BlockScope scope) {
if (isActive()) {
try {
String signature = toString(singleTypeReference.binding.signature());
// trim 'L' prefix and ';' suffix
signature = signature.substring(1, signature.length() - 1);
signature = signature.replace('/', '.');
IJavaType type = getDebugTarget().getJavaType(signature);
if (type == null) {
verbose("Unable to get class for name: " + signature);
return false;
}
push(type);
return true;
} catch (DebugException e) {
}
}
return false;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(SingleTypeReference, ClassScope)
*/
public boolean visit(
SingleTypeReference singleTypeReference,
ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(StringLiteral, BlockScope)
*/
public boolean visit(StringLiteral stringLiteral, BlockScope scope) {
if (isActive()) {
push(getDebugTarget().newValue(new String(stringLiteral.source())));
}
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(SuperReference, BlockScope)
*/
public boolean visit(SuperReference superReference, BlockScope scope) {
if (isActive()) {
try {
IJavaVariable var = (IJavaVariable)getStackFrame().findVariable("this");
if (var == null) {
verbose("could not find 'this'");
} else {
push(var.getValue());
}
} catch (DebugException e) {
e.printStackTrace();
}
}
return false;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(SwitchStatement, BlockScope)
*/
public boolean visit(SwitchStatement switchStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(SynchronizedStatement, BlockScope)
*/
public boolean visit(
SynchronizedStatement synchronizedStatement,
BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ThisReference, BlockScope)
*/
public boolean visit(ThisReference thisReference, BlockScope scope) {
if (isActive()) {
try {
IJavaVariable var = (IJavaVariable)getStackFrame().findVariable("this");
if (var == null) {
verbose("could not find 'this'");
} else {
push(var.getValue());
}
} catch (DebugException e) {
e.printStackTrace();
}
}
return false;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(ThrowStatement, BlockScope)
*/
public boolean visit(ThrowStatement throwStatement, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(TrueLiteral, BlockScope)
*/
public boolean visit(TrueLiteral trueLiteral, BlockScope scope) {
if (isActive()) {
push(getDebugTarget().newValue(true));
}
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(TryStatement, BlockScope)
*/
public boolean visit(TryStatement tryStatement, BlockScope scope) {
if (isActive()) {
illegalStatement(tryStatement);
}
if (isInRunMethod()) {
// entered first try block of run method, start evaluation
setActive(true);
return true;
}
return false;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(TypeDeclaration, BlockScope)
*/
public boolean visit(TypeDeclaration typeDeclaration, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(TypeDeclaration, ClassScope)
*/
public boolean visit(TypeDeclaration typeDeclaration, ClassScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(TypeDeclaration, CompilationUnitScope)
*/
public boolean visit(
TypeDeclaration typeDeclaration,
CompilationUnitScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(UnaryExpression, BlockScope)
*/
public boolean visit(UnaryExpression unaryExpression, BlockScope scope) {
return true;
}
/*
* @see IAbstractSyntaxTreeVisitor#visit(WhileStatement, BlockScope)
*/
public boolean visit(WhileStatement whileStatement, BlockScope scope) {
return true;
}
/**
* Returns a String representing the given char array.
*
* @return String
*/
private String toString(char[] chars) {
return new String(chars);
}
/**
* Returns the debug target in which the evaluation is
* being performed.
*
* @return debug target
*/
protected IJavaDebugTarget getDebugTarget() {
return (IJavaDebugTarget)getStackFrame().getDebugTarget();
}
/**
* Returns the field of the given object with the specified
* name, or <code>null</code> if not found.
*
* @param object value in which to locate field
* @param name name of field to locate
* @return the field, as a variable
* @exception DebugException if an underlying method fails
*/
protected IJavaVariable getField(IJavaValue object, String name) throws DebugException {
IVariable[] vars = object.getVariables();
for (int i = 0; i < vars.length; i ++) {
if (vars[i].getName().equals(name)) {
return (IJavaVariable)vars[i];
}
}
return null;
}
}