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); }
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)); }
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); }
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); } }