Skip to content

Commit 62a51d0

Browse files
committed
Updated Nullable Client
1 parent 762d3f5 commit 62a51d0

20 files changed

Lines changed: 63 additions & 214 deletions

File tree

Lines changed: 0 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
using Linq2GraphQL.Client.Visitors;
22
using System.Linq.Expressions;
3-
using System.Reflection;
4-
using System.Reflection.Metadata.Ecma335;
5-
using VisitorPlayground.Visitors;
6-
73
namespace Linq2GraphQL.Client;
84

95
public static class Utilities
@@ -26,182 +22,14 @@ public static string GetArgumentsId(IEnumerable<object> objects)
2622
}
2723
}
2824

29-
30-
3125
public static void ParseExpression(Expression body, QueryNode parent)
3226
{
33-
3427
var parameterVisitor = new ParameterVisitor(new MemberNode(null, null));
3528
var topNode = parameterVisitor.ParseExpression(body);
3629
var tree = topNode.PrintMemberTree();
3730

3831
topNode.PopulateChildQueryNodes(parent);
39-
// parent.SetAddPrimitiveChildren();
40-
4132

4233
}
4334

44-
45-
46-
//public static void ParseExpression_OLD(Expression body, QueryNode parent)
47-
//{
48-
// var node = new QueryNode(parent.Member);
49-
// ParseExpressionInternal(body, node);
50-
// node.SetAddPrimitiveChildren();
51-
52-
// foreach (var childNode in node.ChildNodes)
53-
// {
54-
// parent.AddChildNode(childNode);
55-
// }
56-
//}
57-
58-
//private static bool IsSelectOrSelectMany(this MethodCallExpression methodCallExpression)
59-
//{
60-
// if (methodCallExpression.Arguments.Count != 2)
61-
// {
62-
// return false;
63-
// }
64-
65-
// ;
66-
// var methodName = methodCallExpression.Method.Name;
67-
// return (methodName == "Select" || methodName == "SelectMany");
68-
//}
69-
70-
71-
//private static void ParseExpressionInternal(Expression body, QueryNode parent)
72-
//{
73-
// if (body.NodeType == ExpressionType.MemberInit)
74-
// {
75-
// var exp = (MemberInitExpression)body;
76-
// foreach (var binding in exp.Bindings.Where(e => e.BindingType == MemberBindingType.Assignment)
77-
// .Cast<MemberAssignment>())
78-
// {
79-
// ParseExpressionInternal(binding.Expression, parent);
80-
// }
81-
// }
82-
83-
// switch (body)
84-
// {
85-
// case LambdaExpression lambdaExpression:
86-
// ParseExpressionInternal(lambdaExpression.Body, parent);
87-
// break;
88-
89-
// case MemberExpression memberExpression:
90-
// var (parentNode, _) = GetMemberQueryNode(memberExpression);
91-
// parent.AddChildNode(parentNode);
92-
// break;
93-
94-
// case MethodCallExpression methodCallExp:
95-
// ParseMethodCallExpression(parent, methodCallExp);
96-
// break;
97-
98-
// case NewExpression newExpression:
99-
// foreach (var argument in newExpression.Arguments)
100-
// {
101-
// ParseExpression(argument, parent);
102-
// }
103-
104-
// break;
105-
// }
106-
//}
107-
108-
//private static void ParseMethodCallExpression(QueryNode parent, MethodCallExpression methodCallExp)
109-
//{
110-
// var graphInterfaceAttribute = methodCallExp.Method.GetCustomAttribute<GraphInterfaceAttribute>();
111-
// if (graphInterfaceAttribute != null)
112-
// {
113-
// var queryNode = new QueryNode(methodCallExp.Method, methodCallExp.Method.Name, null, true);
114-
// parent.AddChildNode(queryNode);
115-
// return;
116-
// }
117-
118-
// var graphMethodAttribute = methodCallExp.Method.GetCustomAttribute<GraphMethodAttribute>();
119-
// if (graphMethodAttribute != null)
120-
// {
121-
// var arguments = new List<ArgumentValue>();
122-
123-
// var i = 0;
124-
// foreach (var parameter in methodCallExp.Method.GetParameters())
125-
// {
126-
// var graphAttribute = parameter.GetCustomAttribute<GraphArgumentAttribute>();
127-
// if (graphAttribute != null)
128-
// {
129-
// var arg = methodCallExp.Arguments[i];
130-
// ConstantExpression argConstant;
131-
// if (arg.NodeType == ExpressionType.Convert)
132-
// {
133-
// var unaryExpression = (UnaryExpression)arg;
134-
// argConstant = (ConstantExpression)unaryExpression.Operand;
135-
// }
136-
// else
137-
// {
138-
// argConstant = (ConstantExpression)arg;
139-
// }
140-
141-
// arguments.Add(new ArgumentValue(parameter.Name, graphAttribute.GraphType,
142-
// argConstant.Value));
143-
// }
144-
145-
// i++;
146-
// }
147-
148-
// var queryNode = new QueryNode(methodCallExp.Method, graphMethodAttribute.GraphName, arguments);
149-
// parent.AddChildNode(queryNode);
150-
// }
151-
// else if (methodCallExp.IsSelectOrSelectMany())
152-
// {
153-
// if (methodCallExp.Arguments[0] is MemberExpression memberExpr)
154-
// {
155-
// var (ParentNode, LastNode) = GetMemberQueryNode(memberExpr);
156-
// ParseExpressionInternal(methodCallExp.Arguments[1], LastNode);
157-
// parent.AddChildNode(ParentNode);
158-
// }
159-
// else
160-
// {
161-
// ParseExpressionInternal(methodCallExp.Arguments[1], parent);
162-
// }
163-
// }
164-
//}
165-
166-
//private static (QueryNode ParentNode, QueryNode LastNode) GetMemberQueryNode(Expression expression)
167-
//{
168-
// var members = GetMembers(expression);
169-
// if (members == null) return (null, null);
170-
171-
// members.Reverse();
172-
173-
// QueryNode parentNode = null;
174-
// QueryNode currentNode = null;
175-
176-
// foreach (var member in members)
177-
// {
178-
// var newNode = new QueryNode(member);
179-
// if (parentNode == null)
180-
// {
181-
// parentNode = newNode;
182-
// }
183-
// else
184-
// {
185-
// currentNode.AddChildNode(newNode);
186-
// }
187-
188-
// currentNode = newNode;
189-
// }
190-
191-
// return (parentNode, currentNode);
192-
//}
193-
194-
195-
//private static List<MemberInfo> GetMembers(Expression expression)
196-
//{
197-
// var members = new List<MemberInfo>();
198-
// if (expression.NodeType == ExpressionType.MemberAccess)
199-
// {
200-
// var memberExpression = (MemberExpression)expression;
201-
// members.Add(memberExpression.Member);
202-
// members.AddRange(GetMembers(memberExpression.Expression));
203-
// }
204-
205-
// return members;
206-
//}
20735
}

src/Linq2GraphQL.Client/Visitors/MemberNode.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,6 @@ private static List<MemberInfo> GetMembers(Expression expression)
7373

7474
public void PopulateChildQueryNodes(QueryNode queryNode)
7575
{
76-
77-
7876
foreach (var child in Children)
7977
{
8078

@@ -83,9 +81,6 @@ public void PopulateChildQueryNodes(QueryNode queryNode)
8381
var addedNode = queryNode.AddChildNode(childNode);
8482
child.PopulateChildQueryNodes(addedNode);
8583
}
86-
87-
88-
8984
}
9085

9186

src/Linq2GraphQL.Client/Visitors/ParameterVisitor.cs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
using Linq2GraphQL.Client;
2-
using Linq2GraphQL.Client.Visitors;
32
using System.Linq.Expressions;
43
using System.Reflection;
54
using System.Reflection.Metadata;
65
using System.Runtime.CompilerServices;
76
using System.Xml.Linq;
87

9-
namespace VisitorPlayground.Visitors
8+
namespace Linq2GraphQL.Client.Visitors
109
{
1110
public class ParameterVisitor(MemberNode memberNode) : ExpressionVisitor
1211
{
@@ -17,44 +16,32 @@ public MemberNode ParseExpression(Expression expression)
1716
return memberNode;
1817
}
1918

20-
21-
2219
protected override Expression VisitMember(MemberExpression node)
2320
{
2421
var attribute = node.Member.GetCustomAttribute<GraphQLMemberAttribute>();
2522

2623
if (attribute != null)
2724
{
2825
var parameter = GetParameterExpression(node);
29-
3026
AddMemberNodes(parameter, node);
31-
32-
// var targetNode = memberNode.GetMemberNodeFromParameterExpression(parameter);
33-
// targetNode.AddMembers(node);
3427
}
3528

3629
return node;
37-
3830
}
3931

40-
4132
public MemberNode AddMemberNodes(ParameterExpression targetParameter, Expression expression)
4233
{
4334
var targetNode = memberNode.GetMemberNodeFromParameterExpression(targetParameter);
4435
var newNode = targetNode.AddMembers(expression);
4536
return newNode;
46-
4737
}
4838

49-
50-
5139
protected override Expression VisitMethodCall(MethodCallExpression expression)
5240
{
5341
var attribute = expression.Method.GetCustomAttribute<GraphQLMemberAttribute>();
5442

5543
if (attribute != null)
5644
{
57-
5845
var parExp = GetParameterExpression(expression);
5946
var i = 0;
6047
var argumentValues = new List<ArgumentValue>();
@@ -72,16 +59,13 @@ protected override Expression VisitMethodCall(MethodCallExpression expression)
7259
i++;
7360
}
7461

75-
76-
7762
var targetNode = memberNode.GetMemberNodeFromParameterExpression(parExp);
7863
targetNode.AddChild(new MemberNode(expression.Method, argumentValues));
7964

8065

8166
return expression;
8267
}
8368

84-
8569
if (IsLinqOperator(expression.Method))
8670
{
8771
var memberExp = expression.Arguments[0] as MemberExpression;
@@ -93,10 +77,7 @@ protected override Expression VisitMethodCall(MethodCallExpression expression)
9377

9478
var child = memberNode.AddMembers(memberExp);
9579
child.SetParameterExpression(parameter);
96-
9780

98-
//var child = AddMemberNodes(parameter, memberExp);
99-
//child.IncludePrimitive = false;
10081

10182
var visitor = new ParameterVisitor(child);
10283
visitor.ParseExpression(expression.Arguments[1]);

src/Linq2GraphQL.Generator/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"profiles": {
33
"Linq2GraphQL.Generator": {
44
"commandName": "Project",
5-
"commandLineArgs": "https://localhost:7184/graphql/ -c=\"SampleClient\" -n=\"Linq2GraphQL.TestClient\" -o=\"C:\\Code\\Github\\Linq2GraphQL.Client\\test\\Linq2GraphQL.TestClient\\Generated\" -s=true"
5+
"commandLineArgs": "https://localhost:50741/graphql/ -c=\"SampleNullableClient\" -n=\"Linq2GraphQL.TestClientNullable\" -o=\"C:\\Code\\Github\\Linq2GraphQL.Client\\test\\Linq2GraphQL.TestClientNullable\\Generated\" -s=true -nu=true"
66
}
77
}
88
}

test/Linq2GraphQL.TestClientNullable/Generated/Client/SampleNullableClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Linq2GraphQL.TestClientNullable;
1414

1515
public class SampleNullableClient
1616
{
17-
public SampleNullableClient(HttpClient httpClient, IOptions<GraphClientOptions> options, IServiceProvider provider)
17+
public SampleNullableClient(HttpClient httpClient, [FromKeyedServices("SampleNullableClient")]IOptions<GraphClientOptions> options, IServiceProvider provider)
1818
{
1919
var client = new GraphClient(httpClient, options, provider);
2020
Query = new QueryMethods(client);

test/Linq2GraphQL.TestClientNullable/Generated/Client/SampleNullableClientExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ private static IGraphClientBuilder<SampleNullableClient> GraphClientBuilder(ISer
3333
GraphClientOptions graphClientOptions)
3434
{
3535
var opts = Options.Create(graphClientOptions);
36-
services.AddSingleton(opts);
36+
services.AddKeyedSingleton(ClientName, opts);
3737
services.AddMemoryCache();
3838
return new ClientBuilder<SampleNullableClient>(ClientName, services);
3939
}

test/Linq2GraphQL.TestClientNullable/Generated/Inputs/AddressInput.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,23 @@ namespace Linq2GraphQL.TestClientNullable;
1515
[JsonConverter(typeof(GraphInputConverter<AddressInput>))]
1616
public partial class AddressInput : GraphInputBase
1717
{
18+
[GraphQLMember("name")]
1819
[JsonPropertyName("name")]
1920
public required string Name
2021
{
2122
get => GetValue<string>("name");
2223
set => SetValue("name", value);
2324
}
2425

26+
[GraphQLMember("street")]
2527
[JsonPropertyName("street")]
2628
public required string Street
2729
{
2830
get => GetValue<string>("street");
2931
set => SetValue("street", value);
3032
}
3133

34+
[GraphQLMember("postalCode")]
3235
[JsonPropertyName("postalCode")]
3336
public required string PostalCode
3437
{

test/Linq2GraphQL.TestClientNullable/Generated/Inputs/CustomerInput.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,39 @@ namespace Linq2GraphQL.TestClientNullable;
1515
[JsonConverter(typeof(GraphInputConverter<CustomerInput>))]
1616
public partial class CustomerInput : GraphInputBase
1717
{
18+
[GraphQLMember("customerId")]
1819
[JsonPropertyName("customerId")]
1920
public required Guid CustomerId
2021
{
2122
get => GetValue<Guid>("customerId");
2223
set => SetValue("customerId", value);
2324
}
2425

26+
[GraphQLMember("customerName")]
2527
[JsonPropertyName("customerName")]
2628
public required string CustomerName
2729
{
2830
get => GetValue<string>("customerName");
2931
set => SetValue("customerName", value);
3032
}
3133

34+
[GraphQLMember("status")]
3235
[JsonPropertyName("status")]
3336
public required CustomerStatus Status
3437
{
3538
get => GetValue<CustomerStatus>("status");
3639
set => SetValue("status", value);
3740
}
3841

42+
[GraphQLMember("orders")]
3943
[JsonPropertyName("orders")]
4044
public required List<OrderInput> Orders
4145
{
4246
get => GetValue<List<OrderInput>>("orders");
4347
set => SetValue("orders", value);
4448
}
4549

50+
[GraphQLMember("address")]
4651
[JsonPropertyName("address")]
4752
public AddressInput? Address
4853
{

0 commit comments

Comments
 (0)