package dk.brics.jspointers.flowgraph.analysis;
import dk.brics.jscontrolflow.statements.Assignment;
import dk.brics.jscontrolflow.statements.AssignmentQuestionAnswer;
import dk.brics.jscontrolflow.statements.BinaryOperation;
import dk.brics.jscontrolflow.statements.BooleanConst;
import dk.brics.jscontrolflow.statements.Call;
import dk.brics.jscontrolflow.statements.Catch;
import dk.brics.jscontrolflow.statements.ConstructorCall;
import dk.brics.jscontrolflow.statements.CreateFunction;
import dk.brics.jscontrolflow.statements.DeleteDynamicProperty;
import dk.brics.jscontrolflow.statements.DeleteProperty;
import dk.brics.jscontrolflow.statements.GetNextProperty;
import dk.brics.jscontrolflow.statements.NewArray;
import dk.brics.jscontrolflow.statements.NewObject;
import dk.brics.jscontrolflow.statements.NewRegexp;
import dk.brics.jscontrolflow.statements.NullConst;
import dk.brics.jscontrolflow.statements.NumberConst;
import dk.brics.jscontrolflow.statements.Phi;
import dk.brics.jscontrolflow.statements.ReadDynamicProperty;
import dk.brics.jscontrolflow.statements.ReadProperty;
import dk.brics.jscontrolflow.statements.ReadThis;
import dk.brics.jscontrolflow.statements.ReadVariable;
import dk.brics.jscontrolflow.statements.StringConst;
import dk.brics.jscontrolflow.statements.UnaryOperation;
import dk.brics.jscontrolflow.statements.UndefinedConst;
/**
* Determines whether a given assignment node is of any interest beyond
* its result. An assignment is called <em>pure</em> if it is irrelevant
* when its result is irrelevant.
* <p/>
* For example, a call node is not pure because it is important even if
* its result is discarded. A binary + node is pure, because only its
* result is of interest (because of the way we model coercion).
*/
public class IsPureAssignmentVisitor implements AssignmentQuestionAnswer<Void, Boolean> {
public static final IsPureAssignmentVisitor Instance = new IsPureAssignmentVisitor();
public static boolean isPure(Assignment asn) {
return asn.apply(Instance, null);
}
@Override
public Boolean caseBinaryOperation(BinaryOperation stm, Void arg) {
return true;
}
@Override
public Boolean caseBooleanConst(BooleanConst stm, Void arg) {
return true;
}
@Override
public Boolean caseCall(Call stm, Void arg) {
return false;
}
@Override
public Boolean caseCatch(Catch stm, Void arg) {
return false;
}
@Override
public Boolean caseConstructorCall(ConstructorCall stm, Void arg) {
return false;
}
@Override
public Boolean caseCreateFunction(CreateFunction stm, Void arg) {
return true;
}
@Override
public Boolean caseDeleteDynamicProperty(DeleteDynamicProperty stm, Void arg) {
return false;
}
@Override
public Boolean caseDeleteProperty(DeleteProperty stm, Void arg) {
return false;
}
@Override
public Boolean caseGetNextProperty(GetNextProperty stm, Void arg) {
return true;
}
@Override
public Boolean caseNewArray(NewArray stm, Void arg) {
return false;
}
@Override
public Boolean caseNewObject(NewObject stm, Void arg) {
return false;
}
@Override
public Boolean caseNewRegexp(NewRegexp stm, Void arg) {
return false;
}
@Override
public Boolean caseNullConst(NullConst stm, Void arg) {
return true;
}
@Override
public Boolean caseNumberConst(NumberConst stm, Void arg) {
return true;
}
@Override
public Boolean casePhi(Phi stm, Void arg) {
return true;
}
@Override
public Boolean caseReadDynamicProperty(ReadDynamicProperty stm, Void arg) {
return false;
}
@Override
public Boolean caseReadProperty(ReadProperty stm, Void arg) {
return false;
}
@Override
public Boolean caseStringConst(StringConst stm, Void arg) {
return true;
}
@Override
public Boolean caseUndefinedConst(UndefinedConst stm, Void arg) {
return true;
}
@Override
public Boolean caseUnaryOperation(UnaryOperation stm, Void arg) {
return true;
}
@Override
public Boolean caseReadThis(ReadThis stm, Void arg) {
return true;
}
@Override
public Boolean caseReadVariable(ReadVariable stm, Void arg) {
return true;
}
}