Beispiel #1
0
        void Edit(Func <object, Tuple <bool, object> > func, ref Definition.Expression arr)
        {
            var r = func(arr);

            if (r.Item2 != null)
            {
                arr = (Definition.Expression)r.Item2;

                if (!r.Item1)
                {
                    return;
                }
            }

            var e = arr;

            if (e == null)
            {
                return;
            }

            Edit(func, ref e.SelfType);

            if (e is Definition.MemberAccessExpression)
            {
                var e_ = e as Definition.MemberAccessExpression;
                Edit(func, ref e_.Expression);

                for (int i = 0; i < e_.Types.Length; i++)
                {
                    Edit(func, ref e_.Types[i]);
                }
            }
            else if (e is Definition.GenericNameExpression)
            {
                var e_ = e as Definition.GenericNameExpression;
                for (int i = 0; i < e_.Types.Length; i++)
                {
                    Edit(func, ref e_.Types[i]);
                }
            }
            else if (e is Definition.CastExpression)
            {
                var e_ = e as Definition.CastExpression;
                Edit(func, ref e_.Type);
                Edit(func, ref e_.Expression);
            }
            else if (e is Definition.LiteralExpression)
            {
            }
            else if (e is Definition.InvocationExpression)
            {
                var e_ = e as Definition.InvocationExpression;
                Edit(func, ref e_.Method);
                for (int i = 0; i < e_.Args.Length; i++)
                {
                    Edit(func, ref e_.Args[i]);
                }
            }
            else if (e is Definition.ObjectCreationExpression)
            {
                var e_ = e as Definition.ObjectCreationExpression;
                Edit(func, ref e_.Type);
                for (int i = 0; i < e_.Args.Length; i++)
                {
                    Edit(func, ref e_.Args[i]);
                }
            }
            else if (e is Definition.AssignmentExpression)
            {
                var e_ = e as Definition.AssignmentExpression;
                Edit(func, ref e_.Target);
                Edit(func, ref e_.Expression);
            }
            else if (e is Definition.ElementAccessExpression)
            {
                var e_ = e as Definition.ElementAccessExpression;
                Edit(func, ref e_.Value);
                Edit(func, ref e_.Arg);
            }
            else if (e is Definition.ThisExpression)
            {
            }
            else if (e is Definition.IdentifierNameExpression)
            {
                var e_ = e as Definition.IdentifierNameExpression;
                Edit(func, ref e_.Type);
            }
            else if (e is Definition.BinaryExpression)
            {
                var e_ = e as Definition.BinaryExpression;
                Edit(func, ref e_.Left);
                Edit(func, ref e_.Right);
            }
            else if (e is Definition.PrefixUnaryExpression)
            {
                var e_ = e as Definition.PrefixUnaryExpression;
                Edit(func, ref e_.Expression);
            }
            else if (e is Definition.PostfixUnaryExpression)
            {
                var e_ = e as Definition.PostfixUnaryExpression;
                Edit(func, ref e_.Operand);
            }
            else if (e is Definition.BaseExpression)
            {
            }
            else if (e is Definition.ObjectArrayCreationExpression)
            {
                var e_ = e as Definition.ObjectArrayCreationExpression;
                Edit(func, ref e_.Type);
                for (int i = 0; i < e_.Args.Length; i++)
                {
                    Edit(func, ref e_.Args[i]);
                }
            }
            else if (e is Definition.TypeExpression)
            {
            }
            else if (e is Definition.InitializerExpression)
            {
                var e_ = e as Definition.InitializerExpression;
                for (int i = 0; i < e_.Expressions.Length; i++)
                {
                    Edit(func, ref e_.Expressions[i]);
                }
            }
            else
            {
                throw new Exception();
            }
        }
Beispiel #2
0
        string GetExpression(Definition.Expression e)
        {
            if (e == null)
            {
                return("");
            }
            if (e is Definition.BinaryExpression)
            {
                var e2 = (Definition.BinaryExpression)e;

                // as 対応
                if (e2.Operator == Definition.BinaryExpression.OperatorType.As)
                {
                    return(string.Format("({0} instanceof {1}? ({1}){0}: null)", GetExpression(e2.Left), GetExpression(e2.Right)));
                }

                // 文字列の比較対応
                if (
                    (e2.Left.SelfType as Definition.SimpleType)?.TypeName == "String" &&
                    (e2.Right.SelfType as Definition.SimpleType)?.TypeName == "String" &&
                    e2.Operator == Definition.BinaryExpression.OperatorType.Equals)
                {
                    return(string.Format("({0}.equals({1}))", GetExpression(e2.Left), GetExpression(e2.Right)));
                }


                return(string.Format("({0} {1} {2})", GetExpression(e2.Left), GetBinaryExpressionOperator(e2.Operator), GetExpression(e2.Right)));
            }
            else if (e is Definition.AssignmentExpression)
            {
                var e2 = (Definition.AssignmentExpression)e;

                if (e2.Type == Definition.AssignmentExpression.OperatorType.Simple)
                {
                    return(string.Format("{0} = {1}", GetExpression(e2.Target), GetExpression(e2.Expression)));
                }
                else if (e2.Type == Definition.AssignmentExpression.OperatorType.Add)
                {
                    return(string.Format("{0} += {1}", GetExpression(e2.Target), GetExpression(e2.Expression)));
                }
                else if (e2.Type == Definition.AssignmentExpression.OperatorType.Substract)
                {
                    return(string.Format("{0} -= {1}", GetExpression(e2.Target), GetExpression(e2.Expression)));
                }
                else if (e2.Type == Definition.AssignmentExpression.OperatorType.Divide)
                {
                    return(string.Format("{0} /= {1}", GetExpression(e2.Target), GetExpression(e2.Expression)));
                }
                else if (e2.Type == Definition.AssignmentExpression.OperatorType.Modulo)
                {
                    return(string.Format("{0} %= {1}", GetExpression(e2.Target), GetExpression(e2.Expression)));
                }
                else
                {
                    throw new Exception();
                }
            }
            else if (e is Definition.CastExpression)
            {
                var e2 = (Definition.CastExpression)e;
                return(string.Format("({0}){1}", GetTypeSpecifier(e2.Type), GetExpression(e2.Expression)));
            }
            else if (e is Definition.ElementAccessExpression)
            {
                var e2 = (Definition.ElementAccessExpression)e;
                return(string.Format("{0}[{1}]", GetExpression(e2.Value), GetExpression(e2.Arg)));
            }
            else if (e is Definition.IdentifierNameExpression)
            {
                var e2 = (Definition.IdentifierNameExpression)e;
                return(e2.Name);
            }
            else if (e is Definition.InvocationExpression)
            {
                var e2 = (Definition.InvocationExpression)e;
                return(string.Format("{0}({1})", GetExpression(e2.Method), string.Join(", ", Array.ConvertAll(e2.Args, GetExpression))));
            }
            else if (e is Definition.LiteralExpression)
            {
                var e2 = (Definition.LiteralExpression)e;
                return(ParseLiteralExpression(e2));
            }
            else if (e is Definition.MemberAccessExpression)
            {
                var e2 = (Definition.MemberAccessExpression)e;

                var accessed = GetExpression(e2.Expression);
                if (accessed != string.Empty)
                {
                    accessed += ".";
                }

                var generic = string.Empty;
                if (e2.Types.Count() > 0)
                {
                    generic = string.Format("<{0}>", string.Join(",", e2.Types.Select(_ => GetTypeSpecifier(_))));
                }

                if (e2.EnumMember != null)
                {
                    return(string.Format("{0}{1}.{2}", (e2.Enum.Namespace == null || e2.Enum.Namespace == "") ? "": e2.Enum.Namespace + ".", e2.Enum.Name, e2.EnumMember.Name));
                }
                else if (e2.Method != null)
                {
                    if (e2.Method.IsStatic && e2.Class != null)
                    {
                        var fullname = string.Empty;
                        if (e2.Class.Namespace != "")
                        {
                            fullname = e2.Class.Namespace + "." + e2.Class.Name;
                        }
                        else
                        {
                            fullname = e2.Class.Name;
                        }

                        return(string.Format("{0}{1}{2}{3}", accessed, fullname + ".", generic, e2.Method.Name));
                    }
                    else if (e2.Method.IsStatic && e2.Struct != null)
                    {
                        var fullname = string.Empty;
                        if (e2.Struct.Namespace != "")
                        {
                            fullname = e2.Struct.Namespace + "." + e2.Struct.Name;
                        }
                        else
                        {
                            fullname = e2.Struct.Name;
                        }

                        return(string.Format("{0}{2}{1}", accessed, fullname + "." + e2.Method.Name, generic));
                    }
                    else
                    {
                        return(string.Format("{0}{2}{1}", accessed, e2.Method.Name, generic));
                    }
                }
                else if (e2.Property != null)
                {
                    return(string.Format("{0}{2}{1}", accessed, e2.Property.Name, generic));
                }
                else if (e2.Expression != null)
                {
                    return(string.Format("{0}{2}{1}", accessed, e2.Name, generic));
                }
                else
                {
                    return(e2.Name);
                }
            }
            else if (e is Definition.ObjectCreationExpression)
            {
                var e2 = (Definition.ObjectCreationExpression)e;
                return(string.Format("new {0}({1})", GetTypeSpecifier(e2.Type), string.Join(", ", Array.ConvertAll(e2.Args, GetExpression))));
            }
            else if (e is Definition.PrefixUnaryExpression)
            {
                var e2 = (Definition.PrefixUnaryExpression)e;
                return(string.Format("{0}{1}", GetPrefixUnaryExpressionOperator(e2.Type), GetExpression(e2.Expression)));
            }
            else if (e is Definition.PostfixUnaryExpression)
            {
                var e2 = (Definition.PostfixUnaryExpression)e;
                return(string.Format("{0}{1}", GetExpression(e2.Operand), GetPostfixUnaryExpressionOperator(e2.Type)));
            }
            else if (e is Definition.ThisExpression)
            {
                return("this");
            }
            else if (e is Definition.BaseExpression)
            {
                return("super");
            }
            else if (e is Definition.ObjectCreationExpression)
            {
                var e2   = (Definition.ObjectCreationExpression)e;
                var args = e2.Args.Select(_ => GetExpression(_));

                return(string.Format("new {0}({1})", GetTypeSpecifier(e2.Type), string.Join(",", args)));
            }
            else if (e is Definition.ObjectArrayCreationExpression)
            {
                var e2   = (Definition.ObjectArrayCreationExpression)e;
                var args = e2.Args.Select(_ => GetExpression(_));

                return(string.Format("new {0}[{1}]", GetTypeSpecifier(e2.Type), string.Join(",", args)));
            }
            else if (e is Definition.GenericNameExpression)
            {
                var e2 = (Definition.GenericNameExpression)e;

                if (e2.IsMethod)
                {
                    return(string.Format("<{1}>{0}", e2.Name, string.Join(",", Array.ConvertAll(e2.Types, GetTypeSpecifier))));
                }
                else
                {
                    return(string.Format("{0}<{1}>", e2.Name, string.Join(",", Array.ConvertAll(e2.Types, GetTypeSpecifier))));
                }
            }
            else if (e is Definition.TypeExpression)
            {
                var e2 = (Definition.TypeExpression)e;
                return(string.Format("{0}", GetTypeSpecifier(e2.SelfType)));
            }
            else if (e is Definition.InitializerExpression)
            {
                var e2 = (Definition.InitializerExpression)e;
                return("{\n" + string.Format("{0}", string.Join(",\n", Array.ConvertAll(e2.Expressions, GetExpression))) + "}");
            }
            else
            {
                throw new NotImplementedException("unknown expression " + e.GetType().ToString());
            }
        }
Beispiel #3
0
        Definition.Expression ConvertTypeName(Definition.Expression e)
        {
            if (e == null)
            {
                return(e);
            }

            e.SelfType = ConvertTypeName(e.SelfType);

            if (e is Definition.MemberAccessExpression)
            {
                var e_ = e as Definition.MemberAccessExpression;
                e_.Expression = ConvertTypeName(e_.Expression);
                return(e_);
            }
            else if (e is Definition.GenericNameExpression)
            {
                var e_ = e as Definition.GenericNameExpression;
                e_.Types = e_.Types.Select(_ => ConvertTypeName(_)).ToArray();
                return(e_);
            }
            else if (e is Definition.CastExpression)
            {
                var e_ = e as Definition.CastExpression;
                e_.Type       = ConvertTypeName(e_.Type);
                e_.Expression = ConvertTypeName(e_.Expression);
                return(e_);
            }
            else if (e is Definition.LiteralExpression)
            {
                return(e);
            }
            else if (e is Definition.InvocationExpression)
            {
                var e_ = e as Definition.InvocationExpression;
                e_.Method = ConvertTypeName(e_.Method);
                e_.Args   = e_.Args.Select(_ => ConvertTypeName(_)).ToArray();
                return(e_);
            }
            else if (e is Definition.ObjectCreationExpression)
            {
                var e_ = e as Definition.ObjectCreationExpression;
                e_.Type = ConvertTypeName(e_.Type);
                e_.Args = e_.Args.Select(_ => ConvertTypeName(_)).ToArray();
                return(e_);
            }
            else if (e is Definition.AssignmentExpression)
            {
                var e_ = e as Definition.AssignmentExpression;
                e_.Target     = ConvertTypeName(e_.Target);
                e_.Expression = ConvertTypeName(e_.Expression);
                return(e_);
            }
            else if (e is Definition.ElementAccessExpression)
            {
                var e_ = e as Definition.ElementAccessExpression;
                e_.Value = ConvertTypeName(e_.Value);
                e_.Arg   = ConvertTypeName(e_.Arg);
                return(e_);
            }
            else if (e is Definition.ThisExpression)
            {
                return(e);
            }
            else if (e is Definition.IdentifierNameExpression)
            {
                var e_ = e as Definition.IdentifierNameExpression;
                e_.Type = ConvertTypeName(e_.Type);
                return(e_);
            }
            else if (e is Definition.BinaryExpression)
            {
                var e_ = e as Definition.BinaryExpression;
                e_.Left  = ConvertTypeName(e_.Left);
                e_.Right = ConvertTypeName(e_.Right);
                return(e_);
            }
            else if (e is Definition.PrefixUnaryExpression)
            {
                var e_ = e as Definition.PrefixUnaryExpression;
                e_.Expression = ConvertTypeName(e_.Expression);
                return(e_);
            }
            else if (e is Definition.PostfixUnaryExpression)
            {
                var e_ = e as Definition.PostfixUnaryExpression;
                e_.Operand = ConvertTypeName(e_.Operand);
                return(e_);
            }
            else if (e is Definition.BaseExpression)
            {
                return(e);
            }
            else if (e is Definition.ObjectArrayCreationExpression)
            {
                var e_ = e as Definition.ObjectArrayCreationExpression;
                e_.Type = ConvertTypeName(e_.Type);
                e_.Args = e_.Args.Select(_ => ConvertTypeName(_)).ToArray();
                return(e_);
            }
            else if (e is Definition.TypeExpression)
            {
                return(e);
            }
            else if (e is Definition.InitializerExpression)
            {
                var e_ = e as Definition.InitializerExpression;
                e_.Expressions = e_.Expressions.Select(_ => ConvertTypeName(_)).ToArray();
                return(e_);
            }

            throw new Exception();
        }