static void VisitMacNamedIntroducedAttribute(LiteralExpression oldAttr, string macMinorVersion)
        {
            var newAttr = new InvocationExpression("Introduced");

            newAttr.AddArgument(new LiteralExpression("PlatformName.MacOSX"));
            newAttr.AddArgument(new LiteralExpression("10"));
            newAttr.AddArgument(new LiteralExpression(macMinorVersion));
            oldAttr.Parent.InsertChildBefore(oldAttr, newAttr);
            oldAttr.Remove();
        }
        static void VisitShorthandIntroducedAttribute(InvocationExpression invocationExpression,
                                                      string platformName)
        {
            bool isTripleVersion = invocationExpression.Arguments.Count() > 2 && invocationExpression.Arguments.Take(3).All(x => x is LiteralExpression && IsNumber(((LiteralExpression)x).Value));

            invocationExpression.Target = new LiteralExpression("Introduced");

            invocationExpression.Parent.InsertChildBefore(
                invocationExpression.FirstArgument,
                new LiteralExpression(platformName),
                InvocationExpression.ArgumentRole
                );

            foreach (var onlyOn64 in invocationExpression.Arguments.Skip(isTripleVersion ? 4 : 3).Take(2))
            {
                var onlyOn64BoolValue = onlyOn64 as LiteralExpression;
                if (onlyOn64 is NamedExpression)
                {
                    onlyOn64BoolValue = onlyOn64.GetChild <Expression> (
                        BinaryExpression.RightOperandRole) as LiteralExpression;
                }
                if (onlyOn64BoolValue != null && onlyOn64BoolValue.Value == "true")
                {
                    invocationExpression.AddArgument(
                        new LiteralExpression("PlatformArchitecture.Arch64"));
                }
                if (onlyOn64BoolValue != null)
                {
                    onlyOn64.Remove();
                }
            }
        }
        static void VisitShorthandUnavailableAttribute(LiteralExpression oldAttr, string platformName)
        {
            var newAttr = new InvocationExpression("Unavailable");

            newAttr.AddArgument(new LiteralExpression(platformName));
            oldAttr.Parent.InsertChildBefore(oldAttr, newAttr);
            oldAttr.Remove();
        }
示例#4
0
        InvocationExpression Invoke(Expression targetExpr)
        {
            try {
                trace.Enter();

                Match(TokenType.LeftParen, read: false);
                Read();

                var expr = new InvocationExpression();
                expr.AddChild(targetExpr, InvocationExpression.TargetRole);

                if (current.Type != TokenType.RightParen)
                {
                    while (true)
                    {
                        var param = Expr();
                        if (param is LiteralExpression && (current.Type == TokenType.Colon ||
                                                           current.Type == TokenType.Assign))
                        {
                            Read();
                            param = new NamedExpression(
                                param,
                                TokenType.Colon,
                                Expr()
                                );
                        }
                        expr.AddArgument(param);
                        if (current.Type != TokenType.Comma)
                        {
                            break;
                        }
                        Read();
                    }
                }

                Match(TokenType.RightParen);
                return(expr);
            } finally {
                trace.Leave();
            }
        }
            public override void VisitLiteralExpression(LiteralExpression literalExpression)
            {
                var parts = literalExpression?.Value?.Split('_');

                if (parts == null || parts.Length < 2)
                {
                    return;
                }

                string platformName;

                switch (parts [0])
                {
                case "Platform.Mac":
                    platformName = "PlatformName.MacOSX";
                    break;

                case "Platform.iOS":
                    platformName = "PlatformName.iOS";
                    break;

                default:
                    return;
                }

                if (currentAvailability == null)
                {
                    switch (originalArgIndex)
                    {
                    case 0:
                        currentAvailability = "Introduced";
                        break;

                    case 1:
                        currentAvailability = "Deprecated";
                        break;

                    case 2:
                        currentAvailability = "Obsoleted";
                        break;

                    case 3:
                        currentAvailability = "Unavailable";
                        break;
                    }
                }

                var attr = new InvocationExpression(currentAvailability);

                attr.AddArgument(new LiteralExpression(platformName));

                if (parts.Length == 2)
                {
                    switch (parts [1])
                    {
                    case "Version":
                        break;

                    case "Arch32":
                        attr.AddArgument(new LiteralExpression("PlatformArchitecture.Arch32"));
                        break;

                    case "Arch64":
                        attr.AddArgument(new LiteralExpression("PlatformArchitecture.Arch64"));
                        break;
                    }
                }
                else
                {
                    for (int i = 1; i < parts.Length; i++)
                    {
                        attr.AddArgument(new LiteralExpression(parts [i]));
                    }
                }

                invocations.Add(attr);
            }