protected override ICode VisitAssignment(ExprAssignment e) {
     var expr = (Expr)this.Visit(e.Expr);
     if (expr != e.Expr) {
         return new ExprAssignment(e.Ctx, e.Target, expr);
     } else {
         return e;
     }
 }
 protected override ICode VisitAssignment(ExprAssignment e) {
     var expr = (Expr)this.Visit(e.Expr);
     var type = expr.Type;
     if (type.IsNonPrimitiveValueType()) {
         if (expr.ExprType != Expr.NodeType.VarThis && !type.IsRuntimeHandle() && !type.IsEnum()) {
             // This will not copy pointers to value-types, which is correct.
             // It will only copy actual value-types, except 'this' and runtime handles and enums
             expr = InternalFunctions.ValueTypeDeepCopyIfRequired(expr.Type, () => expr) ?? expr;
         }
     }
     if (expr != e.Expr) {
         return new StmtAssignment(e.Ctx, e.Target, expr);
     } else {
         return e;
     }
 }
 protected override ICode VisitAssignment(ExprAssignment e) {
     var ctx = e.Ctx;
     var expr = (Expr)this.Visit(e.Expr);
     var target = (ExprVar)this.Visit(e.Target);
     if (target.Type.IsBoolean() && expr.Type.IsInteger()) {
         expr = new ExprJsExplicit(ctx, "!!expr", ctx.Boolean, expr.Named("expr"));
     } else if (target.Type.IsUnsignedInteger() && expr.Type.IsSignedInteger()) {
         expr = new ExprConv(ctx, expr, expr.Type.UnsignedEquivilent(ctx.TypeSystem), false);
     }
     if (expr != e.Expr || target != e.Target) {
         return new ExprAssignment(ctx, target, expr);
     } else {
         return e;
     }
 }
 protected override ICode VisitAssignment(ExprAssignment e) {
     this.js.Append("(");
     this.Visit(e.Target);
     this.js.Append(" = ");
     this.Visit(e.Expr);
     this.js.Append(")");
     return e;
 }
 protected override ICode VisitAssignment(ExprAssignment e) {
     this.NewLine();
     this.Visit(e.Target);
     this.code.Append(" = ");
     this.Visit(e.Expr);
     return e;
 }
 protected override ICode VisitAssignment(ExprAssignment e) {
     this.stack.Peek().Add(e.Target);
     this.Visit(e.Expr);
     return e;
 }