public override void CaseASwitchCaseStm(ASwitchCaseStm node) { InASwitchCaseStm(node); if (node.GetBlock() != null) { node.GetBlock().Apply(this); } if (node.GetType() != null) { node.GetType().Apply(this); } OutASwitchCaseStm(node); }
//This should be done later, after type linking since we might make new variables for i++, which shouldn't clash with user definitions /*public override void OutAIncDecExp(AIncDecExp node) { //Replace with assignment //<exp>++ => <exp> + 1 //(... foo = <exp> ...)++ => (... foo = <exp> ...) = (... foo ...) + 1 //(... foo++ ...)++ => (... foo++ ...) = (... foo ...) + 1 PLvalue clone = (PLvalue) node.GetLvalue().Clone(); clone.Apply(new AssignFixup()); PBinop binop; Token token; if (node.GetIncDecOp() is APostIncIncDecOp) { APostIncIncDecOp op = (APostIncIncDecOp) node.GetIncDecOp(); token = op.GetToken(); binop = new APlusBinop(new TPlus("+", op.GetToken().Line, op.GetToken().Pos)); } else { APostDecIncDecOp op = (APostDecIncDecOp)node.GetIncDecOp(); token = op.GetToken(); binop = new AMinusBinop(new TMinus("-", op.GetToken().Line, op.GetToken().Pos)); } ABinopExp addExp = new ABinopExp(new ALvalueExp(clone), binop, new AIntConstExp(new TIntegerLiteral("1", token.Line, token.Pos))); AAssignmentExp exp = new AAssignmentExp(new TAssign("=", token.Line, token.Pos), node.GetLvalue(), addExp); node.ReplaceBy(exp); exp.Apply(this); } private class AssignFixup : DepthFirstAdapter { public override void CaseAAssignmentExp(AAssignmentExp node) { ALvalueExp replacer = new ALvalueExp(node.GetLvalue()); node.ReplaceBy(replacer); } }*/ public override void CaseASwitchCaseStm(ASwitchCaseStm node) { AABlock block = (AABlock) node.GetBlock(); Token token; if (node.GetType() is ACaseSwitchCaseType) token = ((ACaseSwitchCaseType) node.GetType()).GetToken(); else token = ((ADefaultSwitchCaseType)node.GetType()).GetToken(); block.SetToken(new TRBrace("{", token.Line, token.Pos)); base.CaseASwitchCaseStm(node); }