package sugarVisitors;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import tools.Assertions;
import tools.Map;
import ast.Ast;
import ast.Expression;
import ast.Ast.Doc;
import ast.Ast.Mdf;
import ast.Ast.NormType;
import ast.Ast.Op;
import ast.Ast.Parameters;
import ast.Ast.Path;
import ast.Ast.Position;
import ast.Ast.SignalKind;
import ast.Ast.Type;
import ast.Expression.Catch;
import ast.Expression.Catch1;
import ast.Expression.With.On;
import ast.Expression.BlockContent;
import ast.Ast.VarDec;
import ast.Ast.VarDecE;
import ast.Ast.VarDecXE;
import ast.Expression.BinOp;
import ast.Expression.ClassB;
import ast.Expression.ClassReuse;
import ast.Expression.ContextId;
import ast.Expression.CurlyBlock;
import ast.Expression.DocE;
import ast.Expression.DotDotDot;
import ast.Expression.FCall;
import ast.Expression.If;
import ast.Expression.Literal;
import ast.Expression.Loop;
import ast.Expression.MCall;
import ast.Expression.RoundBlock;
import ast.Expression.Signal;
import ast.Expression.SquareCall;
import ast.Expression.SquareWithCall;
import ast.Expression.UnOp;
import ast.Expression.UseSquare;
import ast.Expression.Using;
import ast.Expression.WalkBy;
import ast.Expression.While;
import ast.Expression.With;
import ast.Expression.X;
import ast.Expression._void;
import ast.Expression.ClassB.MethodImplemented;
import ast.Expression.ClassB.MethodWithType;
import ast.Expression.ClassB.NestedClass;
import auxiliaryGrammar.Functions;
class DesugarNormalizeReceiver extends CloneVisitor{
Set<String> usedVars=new HashSet<String>();
public static Expression of(Set<String> usedVars,Expression e){
DesugarNormalizeReceiver d=new DesugarNormalizeReceiver();
d.usedVars=usedVars;
Expression result= e.accept(d);
return result;
}
private Expression normalizeReceiver(Ast.HasReceiver s){
assert !(s.getReceiver() instanceof Ast.Atom);
String x=Functions.freshName("rcv", usedVars);
return Desugar.getBlock(s.getP(),x, s.getReceiver(),s.withReceiver(new X(s.getP(),x)));
}
public Expression visit(MCall s) {
if (s.getReceiver() instanceof Ast.Atom){ return super.visit(s);}
if (!ContextDirectlyIn.ofRestOf(s)){ return super.visit(s);}
return normalizeReceiver(s).accept(this);
}
public Expression visit(FCall s) {
if (s.getReceiver() instanceof Ast.Atom){ return super.visit(s);}
return normalizeReceiver(s).accept(this);
}
public Expression visit(SquareCall s) {
if (s.getReceiver() instanceof Ast.Atom){ return super.visit(s);}
return normalizeReceiver(s).accept(this);
}
public Expression visit(SquareWithCall s) {
if (s.getReceiver() instanceof Ast.Atom){ return super.visit(s);}
return normalizeReceiver(s).accept(this);
}
public Expression visit(Literal s) {
if (s.getReceiver() instanceof Ast.Atom){ return super.visit(s);}
return normalizeReceiver(s).accept(this);
}
}