예제 #1
0
        public override AstNode VisitInvocationExpression(InvocationExpression invocationExpression)
        {
            var rr = this.Resolver.ResolveNode(invocationExpression, null) as CSharpInvocationResolveResult;

            if (rr != null && rr.IsError)
            {
                var clonInvocationExpression = (InvocationExpression)base.VisitInvocationExpression(invocationExpression);

                if (clonInvocationExpression == null)
                {
                    clonInvocationExpression = (InvocationExpression)invocationExpression.Clone();
                }

                var map    = rr.GetArgumentToParameterMap();
                var orig   = clonInvocationExpression.Arguments.ToArray();
                var result = clonInvocationExpression.Arguments.ToArray();
                for (int i = 0; i < map.Count; i++)
                {
                    result[i] = orig[map[i]];
                }

                clonInvocationExpression.Arguments.ReplaceWith(result);
                return(clonInvocationExpression);
            }

            return(base.VisitInvocationExpression(invocationExpression));
        }
        void AddFormatCallToInvocation(RefactoringContext context, Script script, PrimitiveExpression pExpr, InvocationExpression invocation)
        {
            var newInvocation = (InvocationExpression)invocation.Clone();

            newInvocation.Arguments.First().ReplaceWith(CreateFormatString(context, pExpr, newInvocation.Arguments.Count() - 1));
            newInvocation.Arguments.Add(CreateFormatArgument(context));

            script.Replace(invocation, newInvocation);
        }
		void AddFormatCallToInvocation (RefactoringContext context, Script script, PrimitiveExpression pExpr, InvocationExpression invocation)
		{
			var newInvocation = (InvocationExpression)invocation.Clone ();
			
			newInvocation.Arguments.First ().ReplaceWith (CreateFormatString (context, pExpr, newInvocation.Arguments.Count () - 1));
			newInvocation.Arguments.Add (CreateFormatArgument (context));
			
			script.Replace (invocation, newInvocation);
		}
            void AddArgument(Script script, InvocationExpression invocationExpression, string stringComparison)
            {
                var astBuilder  = ctx.CreateTypeSytemAstBuilder(invocationExpression);
                var newArgument = astBuilder.ConvertType(new TopLevelTypeName("System", "StringComparison")).Member(stringComparison);
                var copy        = (InvocationExpression)invocationExpression.Clone();

                copy.Arguments.Add(newArgument);
                script.Replace(invocationExpression, copy);
            }
예제 #5
0
        public override AstNode VisitInvocationExpression(InvocationExpression invocationExpression)
        {
            try
            {
                var rr = this.Resolver.ResolveNode(invocationExpression, null) as CSharpInvocationResolveResult;

                if (rr != null && rr.IsError)
                {
                    InvocationExpression clonInvocationExpression = (InvocationExpression)base.VisitInvocationExpression(invocationExpression);
                    if (clonInvocationExpression == null)
                    {
                        clonInvocationExpression = (InvocationExpression)invocationExpression.Clone();
                    }

                    var map    = rr.GetArgumentToParameterMap();
                    var orig   = clonInvocationExpression.Arguments.ToArray();
                    var result = clonInvocationExpression.Arguments.ToArray();

                    if (rr.IsExtensionMethodInvocation)
                    {
                        for (int i = 1; i < map.Count; i++)
                        {
                            if (map[i] < 0)
                            {
                                continue;
                            }

                            result[i - 1] = orig[map[i] - 1];
                        }
                    }
                    else
                    {
                        for (int i = 0; i < map.Count; i++)
                        {
                            if (map[i] < 0)
                            {
                                continue;
                            }

                            result[i] = orig[map[i]];
                        }
                    }

                    clonInvocationExpression.Arguments.ReplaceWith(result);
                    return(clonInvocationExpression);
                }
            }
            catch (Exception e)
            {
                var fileName = invocationExpression.GetParent <SyntaxTree>()?.FileName;

                this.log.Warn(string.Format("VisitInvocationExpression fails in {0} ({1}): {2}", fileName, invocationExpression.StartLocation.ToString(), e.Message));
            }

            return(base.VisitInvocationExpression(invocationExpression));
        }
예제 #6
0
        private void AddEntityNameFilteringIfNeeded(VariableInitializer variableDeclaration, out string entityName)
        {
            entityName = null;
            var invocationExpression = ((InvocationExpression)variableDeclaration.Initializer);
            var targetExpression     = ((MemberReferenceExpression)invocationExpression.Target);

            while (targetExpression.Target is InvocationExpression)
            {
                invocationExpression = (InvocationExpression)targetExpression.Target;
                targetExpression     = (MemberReferenceExpression)invocationExpression.Target;
            }
            if (targetExpression.Target is MemberReferenceExpression)             // collection
            {
                var mre = (MemberReferenceExpression)targetExpression.Target;
                entityName = mre.MemberName;
                //doc["@metadata"]["Raven-Entity-Name"]
                var metadata = new IndexerExpression(
                    new IndexerExpression(new IdentifierExpression("__document"), new List <Expression> {
                    new StringLiteralExpression("@metadata")
                }),
                    new List <Expression> {
                    new StringLiteralExpression(Constants.RavenEntityName)
                }
                    );

                // string.Equals(doc["@metadata"]["Raven-Entity-Name"], "Blogs", StringComparison.OrdinalIgnoreCase)
                var binaryOperatorExpression =
                    new InvocationExpression(
                        new MemberReferenceExpression(new TypeReferenceExpression(new PrimitiveType("string")), "Equals"),
                        new List <Expression>
                {
                    metadata,
                    new StringLiteralExpression(mre.MemberName),
                    new MemberReferenceExpression(new TypeReferenceExpression(new SimpleType(typeof(StringComparison).FullName)), "InvariantCultureIgnoreCase")
                });
                var whereMethod = new InvocationExpression(new MemberReferenceExpression(mre.Target.Clone(), "Where"),
                                                           new List <Expression>
                {
                    new LambdaExpression
                    {
                        Parameters =
                        {
                            new ParameterDeclaration(null, "__document")
                        },
                        Body = binaryOperatorExpression.Clone()
                    }
                });

                invocationExpression.Target = new MemberReferenceExpression(whereMethod.Clone(), targetExpression.MemberName);
            }
        }
            void AddArgument(Script script, InvocationExpression invocationExpression, Expression compareArgument)
            {
                var copy = (InvocationExpression)invocationExpression.Clone();

                copy.Arguments.Clear();
                if (invocationExpression.Arguments.Count() <= 3)
                {
                    copy.Arguments.AddRange(invocationExpression.Arguments.Take(2).Select(a => a.Clone()));
                }
                else
                {
                    copy.Arguments.AddRange(invocationExpression.Arguments.Take(5).Select(a => a.Clone()));
                }
                copy.Arguments.Add(compareArgument);
                script.Replace(invocationExpression, copy);
            }
        public override object VisitInvocationExpression(InvocationExpression invocationExpression, object data)
        {
            var parentInvocationExpression = invocationExpression.Parent as InvocationExpression;

            if (parentInvocationExpression == null)
            {
                return(base.VisitInvocationExpression(invocationExpression, data));
            }

            var target = invocationExpression.Target as MemberReferenceExpression;

            if (target == null)
            {
                return(base.VisitInvocationExpression(invocationExpression, data));
            }

            switch (target.MemberName)
            {
            case "Range":
                var identifierExpression = target.Target as IdentifierExpression;
                if (identifierExpression != null && identifierExpression.Identifier == "Enumerable")
                {
                    var parentTarget = parentInvocationExpression.Target as MemberReferenceExpression;

                    if (parentTarget == null)
                    {
                        break;
                    }

                    if (parentTarget.MemberName == "ToDictionary" &&
                        parentInvocationExpression.Arguments.Count == 3 &&
                        parentInvocationExpression.Arguments.First() == invocationExpression)
                    {
                        // support for Enumerable.Range(x, y).ToDictionary(k => k, k => k) which is
                        // Enumerable.ToDictionary(Enumerable.Range(x, y), k => k, k => k) in fact

                        var toDictArguments = parentInvocationExpression.Arguments.Skip(1);     // skip first arg which is current invocationExpression

                        var containsDynamics = toDictArguments.All(x =>
                        {
                            var castExpression = x as CastExpression;
                            if (castExpression == null)
                            {
                                return(false);
                            }
                            var type = castExpression.Type as SimpleType;
                            if (type == null)
                            {
                                return(false);
                            }
                            return(type.Identifier.Contains("dynamic"));
                        });

                        if (containsDynamics == false)
                        {
                            break;
                        }

                        // convert Enumerable.Range(x, y) to Enumerable.Range(x, y).Cast<dynamic>()
                        var enumerableRange = invocationExpression.Clone();

                        var castToDynamic = new MemberReferenceExpression(enumerableRange, "Cast", new AstType[] { new SimpleType("dynamic") });

                        var dynamicEnumerable = new InvocationExpression(castToDynamic);

                        invocationExpression.ReplaceWith(dynamicEnumerable);
                    }
                }
                break;
            }

            return(base.VisitInvocationExpression(invocationExpression, data));
        }
			void AddArgument(Script script, InvocationExpression invocationExpression, string stringComparison)
			{
				var astBuilder = ctx.CreateTypeSytemAstBuilder(invocationExpression);
				var newArgument = astBuilder.ConvertType(new TopLevelTypeName("System", "StringComparison")).Member(stringComparison);
				var copy = (InvocationExpression)invocationExpression.Clone();
				copy.Arguments.Add(newArgument);
				script.Replace(invocationExpression, copy);
			}
예제 #10
0
파일: CsToTs.cs 프로젝트: RReverser/Netjs
			public override void VisitInvocationExpression (InvocationExpression invocationExpression)
			{
				base.VisitInvocationExpression (invocationExpression);

				var hasRefs = invocationExpression.Arguments.OfType<DirectionExpression> ().Any ();

				if (hasRefs) {

					var args = invocationExpression.Arguments.OfType<DirectionExpression> ().ToList ();

					var target = invocationExpression.Target;

					var lblock = new BlockStatement {

					};

					for (int i = 0; i < args.Count; i++) {
						var a = args [i];
						var vname = "_p" + i;
						var va = new VariableDeclarationStatement (AstType.Null, vname, new ArrayCreateExpression {
							Initializer = new ArrayInitializerExpression (a.Expression.Clone ())
						});
						a.ReplaceWith (new IdentifierExpression (vname));
						lblock.Add (va);
					}
					var rname = "_r";
					var ra = new VariableDeclarationStatement (AstType.Null, rname, invocationExpression.Clone ());
					lblock.Add (ra);
					for (int i = 0; i < args.Count; i++) {
						var a = args [i];
						var vname = "_p" + i;
						var va = new AssignmentExpression (a.Expression.Clone (), 
							new IndexerExpression (
								new IdentifierExpression (vname), new PrimitiveExpression (0)));
						lblock.Add (va);
					}
					lblock.Add (new ReturnStatement (new IdentifierExpression (rname)));

					var lambda = new LambdaExpression {
						Body = lblock,
					};

					var ilambda = new InvocationExpression (lambda);

					invocationExpression.ReplaceWith (ilambda);
				}
			}