package coreVisitors;
import facade.Configuration;
import ast.Ast;
import ast.ExpCore;
import ast.ExpCore.ClassB;
import ast.ExpCore.WalkBy;
import ast.ExpCore.ClassB.NestedClass;
import ast.ExpCore.ClassB.MethodImplemented;
import ast.ExpCore.ClassB.MethodWithType;
import ast.ExpCore.ClassB.Member;
import programReduction.Program;
public class CloneVisitorWithProgram extends CloneVisitor{
public CloneVisitorWithProgram(Program p) {this.p = p;}
protected Program p;
private Object lastCMs=null;
public Object getLastCMs(){return lastCMs;}
public NestedClass visit(NestedClass s) {
Object aux=lastCMs;
lastCMs=s.getName();
try{return super.visit(s);}
finally{lastCMs=aux;}
}
public MethodImplemented visit(MethodImplemented s) {
Object aux=lastCMs;
lastCMs=s.getS();
try{return super.visit(s);}
finally{lastCMs=aux;}
}
public MethodWithType visit(MethodWithType s) {
Object aux=lastCMs;
lastCMs=s.getMs();
try{return super.visit(s);}
finally{lastCMs=aux;}
}
public ExpCore visit(ClassB s) {
Program aux=p;
if(lastCMs!=null && lastCMs instanceof Ast.C){
p=p.push((Ast.C)lastCMs);
}
else{
p=p.evilPush(s);
}
Object auxO=lastCMs;
lastCMs=null;
try{return super.visit(s);}
finally{p=aux; lastCMs=auxO;}
}
}