private static List <StatementSyntax> HandleSyntaxInMap(FieldNamesValidator fieldValidator, MapFunctionProcessor mapRewriter, ExpressionSyntax expression, ref SyntaxList <MemberDeclarationSyntax> members) { var rewrittenExpression = (CSharpSyntaxNode)mapRewriter.Visit(expression); var optimized = new RavenLinqOptimizer(fieldValidator).Visit(new RavenLinqPrettifier().Visit(rewrittenExpression)) as StatementSyntax; var collectionName = string.IsNullOrWhiteSpace(mapRewriter.CollectionName) ? Constants.Documents.Collections.AllDocumentsCollection : mapRewriter.CollectionName; var collection = SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(collectionName)); var results = new List <StatementSyntax>(); if (optimized != null) { var method = SyntaxFactory.MethodDeclaration(SyntaxFactory.IdentifierName("IEnumerable"), SyntaxFactory.Identifier("Map_" + members.Count)) .WithParameterList( SyntaxFactory.ParameterList(SyntaxFactory.SingletonSeparatedList( SyntaxFactory.Parameter(SyntaxFactory.Identifier("docs")) .WithType( SyntaxFactory.GenericName("IEnumerable") .WithTypeArgumentList( SyntaxFactory.TypeArgumentList( SyntaxFactory.SingletonSeparatedList <TypeSyntax>(SyntaxFactory.IdentifierName("dynamic")) ) ) ) )) ) .WithBody(SyntaxFactory.Block().AddStatements(optimized)); members = members.Add(method); results.Add(RoslynHelper.This(nameof(StaticIndexBase.AddMap)).Invoke(collection, RoslynHelper.This(method.Identifier.Text)).AsExpressionStatement()); // this.AddMap("Users", docs => from doc in docs ... ) } else { var indexingFunction = SyntaxFactory.SimpleLambdaExpression(SyntaxFactory.Parameter(SyntaxFactory.Identifier("docs")), rewrittenExpression); results.Add(RoslynHelper.This(nameof(StaticIndexBase.AddMap)).Invoke(collection, indexingFunction).AsExpressionStatement()); // this.AddMap("Users", docs => from doc in docs ... ) } if (mapRewriter.ReferencedCollections != null) { foreach (var referencedCollection in mapRewriter.ReferencedCollections) { var rc = SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(referencedCollection)); results.Add(RoslynHelper.This(nameof(StaticIndexBase.AddReferencedCollection)).Invoke(collection, rc).AsExpressionStatement()); } } return(results); }
private static SyntaxNode OptimizeExpression(string str) { var expression = SyntaxFactory.ParseExpression(str.Trim()); var result = new RavenLinqPrettifier().Visit(expression); var validator = new FieldNamesValidator(); validator.Validate(str, SyntaxFactory.ParseExpression(str).NormalizeWhitespace()); var expr = new RavenLinqOptimizer(validator).Visit(result); expr = expr.ReplaceTrivia(expr.DescendantTrivia(), (t1, t2) => new SyntaxTrivia()); return(expr.NormalizeWhitespace()); }