void Write(CiUnaryExpr expr) { switch (expr.Op) { case CiToken.Increment: Write("++"); break; case CiToken.Decrement: Write("--"); break; case CiToken.Minus: Write('-'); break; case CiToken.Not: Write('~'); break; default: throw new ArgumentException(expr.Op.ToString()); } WriteChild(expr, expr.Inner); }
CiExpr ICiExprVisitor.Visit(CiUnaryExpr expr) { CiExpr resolved; if (expr.Op == CiToken.Increment || expr.Op == CiToken.Decrement) resolved = ResolveLValue(expr.Inner); else resolved = Resolve(expr.Inner); expr.Inner = Coerce(resolved, CiIntType.Value); if (expr.Op == CiToken.Minus && expr.Inner is CiConstExpr) return new CiConstExpr(-GetConstInt(expr.Inner)); return expr; }