public virtual void VisitUnaryExpression(BoundUnaryEx x) { Accept(x.Operand); }
public virtual TResult VisitUnaryExpression(BoundUnaryEx x) => DefaultVisitOperation(x);
protected virtual void Visit(BoundUnaryEx x, ConditionBranch branch) { base.VisitUnaryExpression(x); }
public sealed override void VisitUnaryExpression(BoundUnaryEx x) => Visit(x, ConditionBranch.Default);
TypeRefMask ResolveUnaryOperatorExpression(BoundUnaryEx x, ConditionBranch branch) { // Accept(x.Operand); // switch (x.Operation) { case Operations.AtSign: return x.Operand.TypeRefMask; case Operations.BitNegation: return TypeCtx.GetLongTypeMask(); // TODO: or byte[] case Operations.Clone: return x.Operand.TypeRefMask; case Operations.LogicNegation: return TypeCtx.GetBooleanTypeMask(); case Operations.Minus: if (IsDoubleOnly(x.Operand)) return TypeCtx.GetDoubleTypeMask(); // double in case operand is double return TypeCtx.GetNumberTypeMask(); // TODO: long in case operand is not a number case Operations.ObjectCast: if (IsClassOnly(x.Operand.TypeRefMask)) return x.Operand.TypeRefMask; // (object)<object> return TypeCtx.GetSystemObjectTypeMask(); // TODO: return the exact type in case we know, return stdClass in case of a scalar case Operations.Plus: if (IsNumberOnly(x.Operand.TypeRefMask)) return x.Operand.TypeRefMask; return TypeCtx.GetNumberTypeMask(); case Operations.Print: return TypeCtx.GetLongTypeMask(); case Operations.BoolCast: return TypeCtx.GetBooleanTypeMask(); case Operations.Int8Cast: case Operations.Int16Cast: case Operations.Int32Cast: case Operations.UInt8Cast: case Operations.UInt16Cast: // --> case Operations.UInt64Cast: case Operations.UInt32Cast: case Operations.Int64Cast: return TypeCtx.GetLongTypeMask(); case Operations.DecimalCast: case Operations.DoubleCast: case Operations.FloatCast: return TypeCtx.GetDoubleTypeMask(); case Operations.UnicodeCast: // TODO case Operations.StringCast: return TypeCtx.GetStringTypeMask(); // binary | unicode | both case Operations.BinaryCast: return TypeCtx.GetWritableStringTypeMask(); // binary string builder case Operations.ArrayCast: return TypeCtx.GetArrayTypeMask(); // TODO: can we be more specific? case Operations.UnsetCast: return TypeCtx.GetNullTypeMask(); // null default: throw ExceptionUtilities.Unreachable; } }
protected override void Visit(BoundUnaryEx x, ConditionBranch branch) { x.TypeRefMask = ResolveUnaryOperatorExpression(x, branch); }