package edu.ucsd.arcum.interpreter.fragments;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.Expression;
import edu.ucsd.arcum.exceptions.ArcumError;
import edu.ucsd.arcum.interpreter.query.IEntityLookup;
import edu.ucsd.arcum.interpreter.satisfier.BindingMap;
public class FieldAssignmentPattern extends ProgramFragment
{
private FieldAccessPattern fieldAccessPattern;
private ProgramFragment rightHandSidePattern;
public FieldAssignmentPattern(FieldAccessPattern fieldAccessPattern,
ProgramFragment rightHandSidePattern)
{
this.fieldAccessPattern = fieldAccessPattern;
this.rightHandSidePattern = rightHandSidePattern;
fieldAccessPattern.setLeftHandSide(true);
}
@Override protected void buildString(StringBuilder buff) {
buff.append(getIndenter());
buff.append(String.format("(FieldAssignmentPattern%n"));
getIndenter().indent();
{
buff.append(getIndenter());
buff.append(String.format("<fieldAccessPattern>%n"));
fieldAccessPattern.buildString(buff);
buff.append(String.format("%n"));
buff.append(getIndenter());
buff.append(String.format("<rightHandSide>%n"));
rightHandSidePattern.buildString(buff);
}
buff.append(")");
getIndenter().unindent();
}
@Override public BindingMap generateNode(IEntityLookup lookup, AST ast) {
BindingMap lhs = fieldAccessPattern.generateNode(lookup, ast);
BindingMap rhs = rightHandSidePattern.generateNode(lookup, ast);
Assignment assignment = ast.newAssignment();
assignment.setLeftHandSide((Expression)lhs.getResult());//copy(ast, Expression.class, lhs.getResult()));
assignment.setRightHandSide(copy(ast, Expression.class, (ASTNode)rhs.getResult()));
BindingMap theta = bindRoot(assignment).consistentMerge(lhs, rhs);
return theta;
}
@Override protected BindingMap matchesASTNode(ASTNode node) {
if (node == null) {
ArcumError.fatalError("Gulp, this is bad");
return null;
}
if (node instanceof Assignment) {
Assignment assignment = (Assignment)node;
Expression leftHandSide = assignment.getLeftHandSide();
Expression rightHandSide = assignment.getRightHandSide();
BindingMap lhsMatches = fieldAccessPattern.matches(leftHandSide);
if (lhsMatches == null) {
return null;
}
BindingMap rhsMatches = rightHandSidePattern.matches(rightHandSide);
if (rhsMatches == null) {
return null;
}
BindingMap result = bindRoot(node);
result.addBindings(lhsMatches);
result.addBindings(rhsMatches);
return result;
}
return null;
}
}