Skip to content

Commit b24567b

Browse files
Merge branch 'mongodb:main' into VS-153
2 parents d8b7241 + a4249bf commit b24567b

6 files changed

+63
-47
lines changed

Diff for: src/MongoDB.Analyzer/Core/Builders/AnalysisCodeGenerator.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,20 @@ public static CompilationResult Compile(MongoAnalysisContext context, Expression
6969
private static SyntaxTree GenerateMqlGeneratorSyntaxTree(ExpressionsAnalysis builderExpressionAnalysis)
7070
{
7171
var testCodeBuilder = new BuildersMqlGeneratorTemplateBuilder(s_mqlGeneratorSyntaxElements);
72+
var generatedMqlMethodDeclarations = new List<MethodDeclarationSyntax>(builderExpressionAnalysis.AnalysisNodeContexts.Length);
7273

7374
foreach (var builderContext in builderExpressionAnalysis.AnalysisNodeContexts)
7475
{
7576
var analysisNode = builderContext.Node;
76-
77-
builderContext.EvaluationMethodName = testCodeBuilder.AddBuildersExpression(
77+
var (generatedMqlMethodName, generatedMqlMethodDeclaration) = testCodeBuilder.GenerateMqlGeneratorMethod(
7878
analysisNode.ArgumentTypeName,
7979
analysisNode.RewrittenExpression);
80+
81+
builderContext.EvaluationMethodName = generatedMqlMethodName;
82+
generatedMqlMethodDeclarations.Add(generatedMqlMethodDeclaration);
8083
}
8184

85+
testCodeBuilder.AddMqlGeneratorMethods(generatedMqlMethodDeclarations.ToArray());
8286
return testCodeBuilder.GenerateSyntaxTree();
8387
}
8488
}

Diff for: src/MongoDB.Analyzer/Core/Builders/BuildersMqlGeneratorTemplateBuilder.cs

+18-16
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,8 @@ public BuildersMqlGeneratorTemplateBuilder(SyntaxElements syntaxElements)
3838
_mqlGeneratorDeclarationSyntaxNew = _syntaxElements.ClassDeclarationSyntax;
3939
}
4040

41-
public string AddBuildersExpression(string typeArgumentName, SyntaxNode buildersExpression)
42-
{
43-
var newMethodDeclaration = _syntaxElements.TestMethodNode.ReplaceNodes(_syntaxElements.NodesToReplace, (n, _) =>
44-
n switch
45-
{
46-
_ when n == _syntaxElements.BuilderDefinitionNode => buildersExpression,
47-
_ when n == _syntaxElements.CollectionTypeNode => SyntaxFactory.IdentifierName(typeArgumentName),
48-
_ => throw new Exception($"Unrecognized node {n}")
49-
});
50-
51-
var newMqlGeneratorMethodName = $"{_syntaxElements.TestMethodNode.Identifier.Value}_{_nextTestMethodIndex++}";
52-
newMethodDeclaration = newMethodDeclaration.WithIdentifier(SyntaxFactory.Identifier(newMqlGeneratorMethodName));
53-
54-
_mqlGeneratorDeclarationSyntaxNew = _mqlGeneratorDeclarationSyntaxNew.AddMembers(newMethodDeclaration);
55-
return newMqlGeneratorMethodName;
56-
}
41+
public void AddMqlGeneratorMethods(MemberDeclarationSyntax[] methodDeclarations) =>
42+
_mqlGeneratorDeclarationSyntaxNew = _mqlGeneratorDeclarationSyntaxNew.AddMembers(methodDeclarations);
5743

5844
public static SyntaxElements CreateSyntaxElements(SyntaxTree mqlGeneratorSyntaxTree)
5945
{
@@ -67,6 +53,22 @@ public static SyntaxElements CreateSyntaxElements(SyntaxTree mqlGeneratorSyntaxT
6753
return new SyntaxElements(root, classDeclarationSyntax, mainTestMethodNode, builderDefinitionNode, collectionTypeNode);
6854
}
6955

56+
public (string newMethodName, MethodDeclarationSyntax newMethodDeclaration) GenerateMqlGeneratorMethod(string typeArgumentName, SyntaxNode buildersExpression)
57+
{
58+
var newMethodDeclaration = _syntaxElements.TestMethodNode.ReplaceNodes(_syntaxElements.NodesToReplace, (n, _) =>
59+
n switch
60+
{
61+
_ when n == _syntaxElements.BuilderDefinitionNode => buildersExpression,
62+
_ when n == _syntaxElements.CollectionTypeNode => SyntaxFactory.IdentifierName(typeArgumentName),
63+
_ => throw new Exception($"Unrecognized node {n}")
64+
});
65+
66+
var newMqlGeneratorMethodName = $"{_syntaxElements.TestMethodNode.Identifier.Value}_{_nextTestMethodIndex++}";
67+
newMethodDeclaration = newMethodDeclaration.WithIdentifier(SyntaxFactory.Identifier(newMqlGeneratorMethodName));
68+
69+
return (newMqlGeneratorMethodName, newMethodDeclaration);
70+
}
71+
7072
public SyntaxTree GenerateSyntaxTree() =>
7173
_syntaxElements.Root.ReplaceNode(_syntaxElements.ClassDeclarationSyntax, _mqlGeneratorDeclarationSyntaxNew).SyntaxTree;
7274
}

Diff for: src/MongoDB.Analyzer/Core/Linq/AnalysisCodeGenerator.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,20 @@ public static CompilationResult Compile(MongoAnalysisContext context, Expression
7373
private static SyntaxTree GenerateMqlGeneratorSyntaxTree(ExpressionsAnalysis linqExpressionAnalysis)
7474
{
7575
var testCodeBuilder = new LinqMqlGeneratorTemplateBuilder(s_mqlGeneratorSyntaxElements);
76+
var generatedMqlMethodDeclarations = new List<MethodDeclarationSyntax>(linqExpressionAnalysis.AnalysisNodeContexts.Length);
7677

7778
foreach (var linqContext in linqExpressionAnalysis.AnalysisNodeContexts)
7879
{
7980
var analysisNode = linqContext.Node;
80-
81-
linqContext.EvaluationMethodName = testCodeBuilder.AddLinqExpression(
81+
var (generatedMqlMethodName, generatedMqlMethodDeclaration) = testCodeBuilder.GenerateMqlGeneratorMethod(
8282
analysisNode.ArgumentTypeName,
8383
analysisNode.RewrittenExpression);
84+
85+
linqContext.EvaluationMethodName = generatedMqlMethodName;
86+
generatedMqlMethodDeclarations.Add(generatedMqlMethodDeclaration);
8487
}
8588

89+
testCodeBuilder.AddMqlGeneratorMethods(generatedMqlMethodDeclarations.ToArray());
8690
return testCodeBuilder.GenerateSyntaxTree();
8791
}
8892
}

Diff for: src/MongoDB.Analyzer/Core/Linq/LinqMqlGeneratorTemplateBuilder.cs

+18-17
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,8 @@ public LinqMqlGeneratorTemplateBuilder(SyntaxElements syntaxElements)
3838
_mqlGeneratorDeclarationSyntaxNew = _syntaxElements.ClassDeclarationSyntax;
3939
}
4040

41-
public string AddLinqExpression(string collectionTypeName, SyntaxNode linqExpression)
42-
{
43-
var newMethodDeclaration = _syntaxElements.TestMethodNode.ReplaceNodes(_syntaxElements.NodesToReplace, (n, _) =>
44-
n.Kind() switch
45-
{
46-
_ when n == _syntaxElements.LinqExpressionNode => linqExpression,
47-
_ when n == _syntaxElements.QueryableTypeNode => SyntaxFactory.IdentifierName(collectionTypeName),
48-
_ => throw new Exception($"Unrecognized node {n}")
49-
});
50-
51-
var newMqlGeneratorMethodName = $"{_syntaxElements.TestMethodNode.Identifier.Value}_{ _nextTestMethodIndex++}";
52-
newMethodDeclaration = newMethodDeclaration.WithIdentifier(SyntaxFactory.Identifier(newMqlGeneratorMethodName));
53-
54-
_mqlGeneratorDeclarationSyntaxNew = _mqlGeneratorDeclarationSyntaxNew.AddMembers(newMethodDeclaration);
55-
56-
return newMqlGeneratorMethodName;
57-
}
41+
public void AddMqlGeneratorMethods(MemberDeclarationSyntax[] methodDeclarations) =>
42+
_mqlGeneratorDeclarationSyntaxNew = _mqlGeneratorDeclarationSyntaxNew.AddMembers(methodDeclarations);
5843

5944
public static SyntaxElements CreateSyntaxElements(SyntaxTree mqlGeneratorSyntaxTree)
6045
{
@@ -68,6 +53,22 @@ public static SyntaxElements CreateSyntaxElements(SyntaxTree mqlGeneratorSyntaxT
6853
return new SyntaxElements(root, classDeclarationSyntax, mainTestMethodNode, linqExpressionNode, queryableTypeNode);
6954
}
7055

56+
public (string newMethodName, MethodDeclarationSyntax newMethodDeclaration) GenerateMqlGeneratorMethod(string collectionTypeName, SyntaxNode linqExpression)
57+
{
58+
var newMethodDeclaration = _syntaxElements.TestMethodNode.ReplaceNodes(_syntaxElements.NodesToReplace, (n, _) =>
59+
n.Kind() switch
60+
{
61+
_ when n == _syntaxElements.LinqExpressionNode => linqExpression,
62+
_ when n == _syntaxElements.QueryableTypeNode => SyntaxFactory.IdentifierName(collectionTypeName),
63+
_ => throw new Exception($"Unrecognized node {n}")
64+
});
65+
66+
var newMqlGeneratorMethodName = $"{_syntaxElements.TestMethodNode.Identifier.Value}_{_nextTestMethodIndex++}";
67+
newMethodDeclaration = newMethodDeclaration.WithIdentifier(SyntaxFactory.Identifier(newMqlGeneratorMethodName));
68+
69+
return (newMqlGeneratorMethodName, newMethodDeclaration);
70+
}
71+
7172
public SyntaxTree GenerateSyntaxTree() =>
7273
_syntaxElements.Root.ReplaceNode(_syntaxElements.ClassDeclarationSyntax, _mqlGeneratorDeclarationSyntaxNew).SyntaxTree;
7374
}

Diff for: src/MongoDB.Analyzer/Core/Poco/AnalysisCodeGenerator.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,16 @@ public static CompilationResult Compile(MongoAnalysisContext context, Expression
6060
public static SyntaxTree GenerateJsonGeneratorSyntaxTree(ExpressionsAnalysis pocoExpressionAnalysis)
6161
{
6262
var testCodeBuilder = new PocoJsonGeneratorTemplateBuilder(s_jsonGeneratorSyntaxElements);
63+
var generatedJsonMethodDeclarations = new List<MethodDeclarationSyntax>(pocoExpressionAnalysis.AnalysisNodeContexts.Length);
6364

6465
foreach (var pocoContext in pocoExpressionAnalysis.AnalysisNodeContexts)
6566
{
66-
pocoContext.EvaluationMethodName = testCodeBuilder.AddPoco(pocoContext.Node.RewrittenExpression as ClassDeclarationSyntax);
67+
var (generatedJsonMethodName, generatedJsonMethodDeclaration) = testCodeBuilder.GenerateJsonGeneratorMethod(pocoContext.Node.RewrittenExpression as ClassDeclarationSyntax);
68+
pocoContext.EvaluationMethodName = generatedJsonMethodName;
69+
generatedJsonMethodDeclarations.Add(generatedJsonMethodDeclaration);
6770
}
6871

72+
testCodeBuilder.AddJsonGeneratorMethods(generatedJsonMethodDeclarations.ToArray());
6973
return testCodeBuilder.GenerateSyntaxTree();
7074
}
7175
}

Diff for: src/MongoDB.Analyzer/Core/Poco/PocoJsonGeneratorTemplateBuilder.cs

+10-9
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,8 @@ public PocoJsonGeneratorTemplateBuilder(SyntaxElements syntaxElements)
3737
_jsonGeneratorDeclarationSyntaxNew = _syntaxElements.ClassDeclarationSyntax;
3838
}
3939

40-
public string AddPoco(ClassDeclarationSyntax poco)
41-
{
42-
var newMethodDeclaration = _syntaxElements.TestMethodNode.ReplaceNode(_syntaxElements.PredefinedTypeNode, SyntaxFactory.IdentifierName(poco.Identifier.ValueText));
43-
var newJsonGeneratorMethodName = $"{_syntaxElements.TestMethodNode.Identifier.Value}_{_nextTestMethodIndex++}";
44-
newMethodDeclaration = newMethodDeclaration.WithIdentifier(SyntaxFactory.Identifier(newJsonGeneratorMethodName));
45-
46-
_jsonGeneratorDeclarationSyntaxNew = _jsonGeneratorDeclarationSyntaxNew.AddMembers(newMethodDeclaration);
47-
return newJsonGeneratorMethodName;
48-
}
40+
public void AddJsonGeneratorMethods(MemberDeclarationSyntax[] methodDeclarations) =>
41+
_jsonGeneratorDeclarationSyntaxNew = _jsonGeneratorDeclarationSyntaxNew.AddMembers(methodDeclarations);
4942

5043
public static SyntaxElements CreateSyntaxElements(SyntaxTree jsonGeneratorSyntaxTree)
5144
{
@@ -59,6 +52,14 @@ public static SyntaxElements CreateSyntaxElements(SyntaxTree jsonGeneratorSyntax
5952
return new(root, classDeclarationSyntax, mainTestMethodNode, predefinedType);
6053
}
6154

55+
public (string newMethodName, MethodDeclarationSyntax newMethodDeclaration) GenerateJsonGeneratorMethod(ClassDeclarationSyntax poco)
56+
{
57+
var newMethodDeclaration = _syntaxElements.TestMethodNode.ReplaceNode(_syntaxElements.PredefinedTypeNode, SyntaxFactory.IdentifierName(poco.Identifier.ValueText));
58+
var newJsonGeneratorMethodName = $"{_syntaxElements.TestMethodNode.Identifier.Value}_{_nextTestMethodIndex++}";
59+
newMethodDeclaration = newMethodDeclaration.WithIdentifier(SyntaxFactory.Identifier(newJsonGeneratorMethodName));
60+
return (newJsonGeneratorMethodName, newMethodDeclaration);
61+
}
62+
6263
public SyntaxTree GenerateSyntaxTree() =>
6364
_syntaxElements.Root.ReplaceNode(_syntaxElements.ClassDeclarationSyntax, _jsonGeneratorDeclarationSyntaxNew).SyntaxTree;
6465
}

0 commit comments

Comments
 (0)