Пример #1
0
        static CXXOperatorKind CheckMissingOperatorOverloadPair(Class @class, out int index,
            CXXOperatorKind op1, CXXOperatorKind op2, Type typeLeft, Type typeRight)
        {
            var first = @class.Operators.FirstOrDefault(o => o.OperatorKind == op1 &&
                o.Parameters.First().Type.Equals(typeLeft) && o.Parameters.Last().Type.Equals(typeRight));
            var second = @class.Operators.FirstOrDefault(o => o.OperatorKind == op2 &&
                o.Parameters.First().Type.Equals(typeLeft) && o.Parameters.Last().Type.Equals(typeRight));

            var hasFirst = first != null;
            var hasSecond = second != null;

            if (hasFirst && (!hasSecond || !second.IsGenerated))
            {
                index = @class.Methods.IndexOf(first);
                return op2;
            }

            if (hasSecond && (!hasFirst || !first.IsGenerated))
            {
                index = @class.Methods.IndexOf(second);
                return op1;
            }

            index = 0;
            return CXXOperatorKind.None;
        }
        static CXXOperatorKind CheckMissingOperatorOverloadPair(Class @class,
                                                                out int index, CXXOperatorKind op1, CXXOperatorKind op2, Type type)
        {
            var first = @class.Operators.FirstOrDefault(o => o.OperatorKind == op1 &&
                                                        o.Parameters.Last().Type.Equals(type));
            var second = @class.Operators.FirstOrDefault(o => o.OperatorKind == op2 &&
                                                         o.Parameters.Last().Type.Equals(type));

            var hasFirst  = first != null;
            var hasSecond = second != null;

            if (hasFirst && (!hasSecond || !second.IsGenerated))
            {
                index = @class.Methods.IndexOf(first);
                return(op2);
            }

            if (hasSecond && (!hasFirst || !first.IsGenerated))
            {
                index = @class.Methods.IndexOf(second);
                return(op1);
            }

            index = 0;
            return(CXXOperatorKind.None);
        }
Пример #3
0
        public static string GetOperatorOverloadPair(CXXOperatorKind kind)
        {
            switch (kind)
            {
            case CXXOperatorKind.EqualEqual:
                return("!=");

            case CXXOperatorKind.ExclaimEqual:
                return("==");

            case CXXOperatorKind.Less:
                return(">");

            case CXXOperatorKind.Greater:
                return("<");

            case CXXOperatorKind.LessEqual:
                return(">=");

            case CXXOperatorKind.GreaterEqual:
                return("<=");

            default:
                throw new NotSupportedException();
            }
        }
Пример #4
0
        private static void HandleMissingOperatorOverloadPair(Class @class, CXXOperatorKind op1,
            CXXOperatorKind op2)
        {
            foreach (var op in @class.Operators.Where(
                o => o.OperatorKind == op1 || o.OperatorKind == op2).ToList())
            {
                int index;
                var missingKind = CheckMissingOperatorOverloadPair(@class, out index, op1, op2,
                    op.Parameters.First().Type, op.Parameters.Last().Type);

                if (missingKind == CXXOperatorKind.None || !op.IsGenerated)
                    continue;

                var method = new Method()
                    {
                        Name = Operators.GetOperatorIdentifier(missingKind),
                        Namespace = @class,
                        SynthKind = FunctionSynthKind.ComplementOperator,
                        Kind = CXXMethodKind.Operator,
                        OperatorKind = missingKind,
                        ReturnType = op.ReturnType,
                        Parameters = op.Parameters
                    };

                @class.Methods.Insert(index, method);
            }
        }
        static void HandleMissingOperatorOverloadPair(Class @class, CXXOperatorKind op1,
                                                      CXXOperatorKind op2)
        {
            foreach (var op in @class.Operators.Where(
                         o => o.OperatorKind == op1 || o.OperatorKind == op2).ToList())
            {
                int index;
                var missingKind = CheckMissingOperatorOverloadPair(@class, out index, op1, op2,
                                                                   op.Parameters.Last().Type);

                if (missingKind == CXXOperatorKind.None || !op.IsGenerated)
                {
                    continue;
                }

                var method = new Method()
                {
                    Name         = Operators.GetOperatorIdentifier(missingKind),
                    Namespace    = @class,
                    SynthKind    = FunctionSynthKind.ComplementOperator,
                    Kind         = CXXMethodKind.Operator,
                    OperatorKind = missingKind,
                    ReturnType   = op.ReturnType,
                    Parameters   = op.Parameters
                };

                @class.Methods.Insert(index, method);
            }
        }
Пример #6
0
        public static bool IsBuiltinOperator(CXXOperatorKind kind)
        {
            bool isBuiltin;

            GetOperatorIdentifier(kind, out isBuiltin);

            return(isBuiltin);
        }
Пример #7
0
 public override IEnumerable <Function> FindOperator(CXXOperatorKind kind)
 {
     return(Methods.Where(m => m.OperatorKind == kind));
 }
Пример #8
0
        AST.CXXOperatorKind VisitCXXOperatorKind(CXXOperatorKind operatorKind)
        {
            switch (operatorKind)
            {
            case CXXOperatorKind.None:
                return(AST.CXXOperatorKind.None);

            case CXXOperatorKind.New:
                return(AST.CXXOperatorKind.New);

            case CXXOperatorKind.Delete:
                return(AST.CXXOperatorKind.Delete);

            case CXXOperatorKind.Array_New:
                return(AST.CXXOperatorKind.Array_New);

            case CXXOperatorKind.Array_Delete:
                return(AST.CXXOperatorKind.Array_Delete);

            case CXXOperatorKind.Plus:
                return(AST.CXXOperatorKind.Plus);

            case CXXOperatorKind.Minus:
                return(AST.CXXOperatorKind.Minus);

            case CXXOperatorKind.Star:
                return(AST.CXXOperatorKind.Star);

            case CXXOperatorKind.Slash:
                return(AST.CXXOperatorKind.Slash);

            case CXXOperatorKind.Percent:
                return(AST.CXXOperatorKind.Percent);

            case CXXOperatorKind.Caret:
                return(AST.CXXOperatorKind.Caret);

            case CXXOperatorKind.Amp:
                return(AST.CXXOperatorKind.Amp);

            case CXXOperatorKind.Pipe:
                return(AST.CXXOperatorKind.Pipe);

            case CXXOperatorKind.Tilde:
                return(AST.CXXOperatorKind.Tilde);

            case CXXOperatorKind.Exclaim:
                return(AST.CXXOperatorKind.Exclaim);

            case CXXOperatorKind.Equal:
                return(AST.CXXOperatorKind.Equal);

            case CXXOperatorKind.Less:
                return(AST.CXXOperatorKind.Less);

            case CXXOperatorKind.Greater:
                return(AST.CXXOperatorKind.Greater);

            case CXXOperatorKind.PlusEqual:
                return(AST.CXXOperatorKind.PlusEqual);

            case CXXOperatorKind.MinusEqual:
                return(AST.CXXOperatorKind.MinusEqual);

            case CXXOperatorKind.StarEqual:
                return(AST.CXXOperatorKind.StarEqual);

            case CXXOperatorKind.SlashEqual:
                return(AST.CXXOperatorKind.SlashEqual);

            case CXXOperatorKind.PercentEqual:
                return(AST.CXXOperatorKind.PercentEqual);

            case CXXOperatorKind.CaretEqual:
                return(AST.CXXOperatorKind.CaretEqual);

            case CXXOperatorKind.AmpEqual:
                return(AST.CXXOperatorKind.AmpEqual);

            case CXXOperatorKind.PipeEqual:
                return(AST.CXXOperatorKind.PipeEqual);

            case CXXOperatorKind.LessLess:
                return(AST.CXXOperatorKind.LessLess);

            case CXXOperatorKind.GreaterGreater:
                return(AST.CXXOperatorKind.GreaterGreater);

            case CXXOperatorKind.LessLessEqual:
                return(AST.CXXOperatorKind.LessLessEqual);

            case CXXOperatorKind.GreaterGreaterEqual:
                return(AST.CXXOperatorKind.GreaterGreaterEqual);

            case CXXOperatorKind.EqualEqual:
                return(AST.CXXOperatorKind.EqualEqual);

            case CXXOperatorKind.ExclaimEqual:
                return(AST.CXXOperatorKind.ExclaimEqual);

            case CXXOperatorKind.LessEqual:
                return(AST.CXXOperatorKind.LessEqual);

            case CXXOperatorKind.GreaterEqual:
                return(AST.CXXOperatorKind.GreaterEqual);

            case CXXOperatorKind.AmpAmp:
                return(AST.CXXOperatorKind.AmpAmp);

            case CXXOperatorKind.PipePipe:
                return(AST.CXXOperatorKind.PipePipe);

            case CXXOperatorKind.PlusPlus:
                return(AST.CXXOperatorKind.PlusPlus);

            case CXXOperatorKind.MinusMinus:
                return(AST.CXXOperatorKind.MinusMinus);

            case CXXOperatorKind.Comma:
                return(AST.CXXOperatorKind.Comma);

            case CXXOperatorKind.ArrowStar:
                return(AST.CXXOperatorKind.ArrowStar);

            case CXXOperatorKind.Arrow:
                return(AST.CXXOperatorKind.Arrow);

            case CXXOperatorKind.Call:
                return(AST.CXXOperatorKind.Call);

            case CXXOperatorKind.Subscript:
                return(AST.CXXOperatorKind.Subscript);

            case CXXOperatorKind.Conditional:
                return(AST.CXXOperatorKind.Conditional);

            default:
                throw new ArgumentOutOfRangeException("operatorKind");
            }
        }
Пример #9
0
        public static string GetOperatorIdentifier(CXXOperatorKind kind,
                                                   out bool isBuiltin)
        {
            isBuiltin = true;

            // These follow the order described in MSDN (Overloadable Operators).
            switch (kind)
            {
            // These unary operators can be overloaded
            case CXXOperatorKind.Plus: return("operator +");

            case CXXOperatorKind.Minus: return("operator -");

            case CXXOperatorKind.Exclaim: return("operator !");

            case CXXOperatorKind.Tilde: return("operator ~");

            case CXXOperatorKind.PlusPlus: return("operator ++");

            case CXXOperatorKind.MinusMinus: return("operator --");

            // These binary operators can be overloaded
            case CXXOperatorKind.Star: return("operator *");

            case CXXOperatorKind.Slash: return("operator /");

            case CXXOperatorKind.Percent: return("operator %");

            case CXXOperatorKind.Amp: return("operator &");

            case CXXOperatorKind.Pipe: return("operator |");

            case CXXOperatorKind.Caret: return("operator ^");

            case CXXOperatorKind.LessLess: return("operator <<");

            case CXXOperatorKind.GreaterGreater: return("operator >>");

            // The comparison operators can be overloaded
            case CXXOperatorKind.EqualEqual: return("operator ==");

            case CXXOperatorKind.ExclaimEqual: return("operator !=");

            case CXXOperatorKind.Less: return("operator <");

            case CXXOperatorKind.Greater: return("operator >");

            case CXXOperatorKind.LessEqual: return("operator <=");

            case CXXOperatorKind.GreaterEqual: return("operator >=");

            // Assignment operators cannot be overloaded
            case CXXOperatorKind.PlusEqual:
            case CXXOperatorKind.MinusEqual:
            case CXXOperatorKind.StarEqual:
            case CXXOperatorKind.SlashEqual:
            case CXXOperatorKind.PercentEqual:
            case CXXOperatorKind.AmpEqual:
            case CXXOperatorKind.PipeEqual:
            case CXXOperatorKind.CaretEqual:
            case CXXOperatorKind.LessLessEqual:
            case CXXOperatorKind.GreaterGreaterEqual:

            // The array indexing operator cannot be overloaded
            case CXXOperatorKind.Subscript:

            // The conditional logical operators cannot be overloaded
            case CXXOperatorKind.AmpAmp:
            case CXXOperatorKind.PipePipe:

            // These operators cannot be overloaded.
            case CXXOperatorKind.Equal:
            case CXXOperatorKind.Comma:
            case CXXOperatorKind.ArrowStar:
            case CXXOperatorKind.Arrow:
            case CXXOperatorKind.Call:
            case CXXOperatorKind.Conditional:
            case CXXOperatorKind.Coawait:
            case CXXOperatorKind.New:
            case CXXOperatorKind.Delete:
            case CXXOperatorKind.Array_New:
            case CXXOperatorKind.Array_Delete:
                isBuiltin = false;
                return("Operator" + kind.ToString());

            case CXXOperatorKind.Conversion:
                return("implicit operator");

            case CXXOperatorKind.ExplicitConversion:
                return("explicit operator");
            }

            throw new NotSupportedException();
        }
Пример #10
0
 public static string GetOperatorIdentifier(CXXOperatorKind kind)
 {
     return(GetOperatorIdentifier(kind, out _));
 }
Пример #11
0
        public static bool IsBuiltinOperator(CXXOperatorKind kind)
        {
            bool isBuiltin;
            GetOperatorIdentifier(kind, out isBuiltin);

            return isBuiltin;
        }
Пример #12
0
        public static string GetOperatorOverloadPair(CXXOperatorKind kind)
        {
            switch (kind)
            {
                case CXXOperatorKind.EqualEqual:
                    return "!=";
                case CXXOperatorKind.ExclaimEqual:
                    return "==";

                case CXXOperatorKind.Less:
                    return ">";
                case CXXOperatorKind.Greater:
                    return "<";

                case CXXOperatorKind.LessEqual:
                    return ">=";
                case CXXOperatorKind.GreaterEqual:
                    return "<=";

                default:
                    throw new NotSupportedException();
            }
        }
Пример #13
0
        public static string GetOperatorIdentifier(CXXOperatorKind kind,
            out bool isBuiltin)
        {
            isBuiltin = true;

            // These follow the order described in MSDN (Overloadable Operators).
            switch (kind)
            {
                // These unary operators can be overloaded
                case CXXOperatorKind.Plus: return "operator +";
                case CXXOperatorKind.Minus: return "operator -";
                case CXXOperatorKind.Exclaim: return "operator !";
                case CXXOperatorKind.Tilde: return "operator ~";
                case CXXOperatorKind.PlusPlus: return "operator ++";
                case CXXOperatorKind.MinusMinus: return "operator --";

                // These binary operators can be overloaded
                case CXXOperatorKind.Star: return "operator *";
                case CXXOperatorKind.Slash: return "operator /";
                case CXXOperatorKind.Percent: return "operator +";
                case CXXOperatorKind.Amp: return "operator &";
                case CXXOperatorKind.Pipe: return "operator |";
                case CXXOperatorKind.Caret: return "operator ^";
                case CXXOperatorKind.LessLess: return "operator <<";
                case CXXOperatorKind.GreaterGreater: return "operator >>";

                // The comparison operators can be overloaded
                case CXXOperatorKind.EqualEqual: return "operator ==";
                case CXXOperatorKind.ExclaimEqual: return "operator !=";
                case CXXOperatorKind.Less: return "operator <";
                case CXXOperatorKind.Greater: return "operator >";
                case CXXOperatorKind.LessEqual: return "operator <=";
                case CXXOperatorKind.GreaterEqual: return "operator >=";

                // Assignment operators cannot be overloaded
                case CXXOperatorKind.PlusEqual:
                case CXXOperatorKind.MinusEqual:
                case CXXOperatorKind.StarEqual:
                case CXXOperatorKind.SlashEqual:
                case CXXOperatorKind.PercentEqual:
                case CXXOperatorKind.AmpEqual:
                case CXXOperatorKind.PipeEqual:
                case CXXOperatorKind.CaretEqual:
                case CXXOperatorKind.LessLessEqual:
                case CXXOperatorKind.GreaterGreaterEqual:

                // The array indexing operator cannot be overloaded
                case CXXOperatorKind.Subscript:

                // The conditional logical operators cannot be overloaded
                case CXXOperatorKind.AmpAmp:
                case CXXOperatorKind.PipePipe:

                // These operators cannot be overloaded.
                case CXXOperatorKind.Equal:
                case CXXOperatorKind.Comma:
                case CXXOperatorKind.ArrowStar:
                case CXXOperatorKind.Arrow:
                case CXXOperatorKind.Call:
                case CXXOperatorKind.Conditional:
                case CXXOperatorKind.New:
                case CXXOperatorKind.Delete:
                case CXXOperatorKind.Array_New:
                case CXXOperatorKind.Array_Delete:
                    isBuiltin = false;
                    return "Operator" + kind.ToString();

                case CXXOperatorKind.Conversion:
                    return "implicit operator";
                case CXXOperatorKind.ExplicitConversion:
                    return "explicit operator";
            }

            throw new NotSupportedException();
        }
Пример #14
0
 public static string GetOperatorIdentifier(CXXOperatorKind kind)
 {
     bool isBuiltin;
     return GetOperatorIdentifier(kind, out isBuiltin);
 }
Пример #15
0
        public static string GetOperatorIdentifier(CXXOperatorKind kind)
        {
            bool isBuiltin;

            return(GetOperatorIdentifier(kind, out isBuiltin));
        }
Пример #16
0
 public virtual IEnumerable <Function> FindOperator(CXXOperatorKind kind)
 {
     return(Functions.Where(fn => fn.OperatorKind == kind));
 }
Пример #17
0
 public static IEnumerable <Method> FindOperator(this Class c, CXXOperatorKind kind)
 {
     return(c.Operators.Where(method => method.OperatorKind == kind));
 }
Пример #18
0
 public IEnumerable <Method> FindOperator(CXXOperatorKind kind)
 {
     return(Operators.Where(method => method.OperatorKind == kind));
 }