}
private IGoal[] produceNextSubgoal(IGoal previousGoal,
IEvaluatedType previousResult, GoalState goalState) {
ExpressionTypeGoal typedGoal = (ExpressionTypeGoal) goal;
Expression expression = (Expression) typedGoal.getExpression();
Expression receiver;
Expression field;
if (expression instanceof FieldAccess) {
FieldAccess fieldAccess = (FieldAccess) expression;
receiver = fieldAccess.getDispatcher();
field = fieldAccess.getField();
} else if (expression instanceof StaticFieldAccess) {
StaticFieldAccess fieldAccess = (StaticFieldAccess) expression;
receiver = fieldAccess.getDispatcher();
field = fieldAccess.getField();
} else {
return null;
}
String variableName;
int offset = 0;
if (field instanceof VariableReference) { // static access
variableName = ((VariableReference) field).getName();
offset = ((VariableReference) field).sourceStart();
} else if (field instanceof SimpleReference) { // object access
variableName = '$' + ((SimpleReference) field).getName();
offset = ((SimpleReference) field).sourceStart();
} else {
return null;
}
// just starting to evaluate method, evaluate method receiver first:
if (state == STATE_INIT) {
if (receiver == null) {
state = STATE_GOT_RECEIVER;
} else {
state = STATE_WAITING_RECEIVER;
return new IGoal[] { new ExpressionTypeGoal(goal.getContext(),
receiver) };
}
}
// receiver must been evaluated now: