Skip to content

Commit 46723df

Browse files
committed
New Linq Parser
1 parent 860f39d commit 46723df

35 files changed

Lines changed: 750 additions & 75 deletions
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Linq2GraphQL.Client;
2+
3+
[AttributeUsage(AttributeTargets.Parameter)]
4+
public class GraphQLArgumentAttribute(string graphQLName, string graphQLType) : Attribute
5+
{
6+
public string GraphQLType { get; private set; } = graphQLType;
7+
public string GraphQLName { get; private set; } = graphQLName;
8+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Linq2GraphQL.Client;
2+
3+
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]
4+
public class GraphQLMemberAttribute : Attribute
5+
{
6+
public GraphQLMemberAttribute(string graphQLName)
7+
{
8+
GraphQLName = graphQLName;
9+
}
10+
11+
public string GraphQLName { get; private set; }
12+
}

src/Linq2GraphQL.Client/Common/ICursorPaging.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Linq2GraphQL.Client.Common
99
{
1010
public interface ICursorPaging
1111
{
12+
[GraphQLMember("pageInfo")]
1213
public PageInfo PageInfo { get; set; }
1314

1415
}

src/Linq2GraphQL.Client/QueryNode.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,15 @@ public void AddChildNode(MemberInfo member, string name = null)
8282
public int Level => Parent?.Level + 1 ?? 1;
8383
public int Leaf { get; internal set; } = 1;
8484

85-
public void AddChildNode(QueryNode childNode)
85+
public QueryNode AddChildNode(QueryNode childNode)
8686
{
8787
var currentNode = ChildNodes.FirstOrDefault(e => e.Name == childNode.Name && e.argumentHashCodeId == childNode.argumentHashCodeId);
8888
if (currentNode == null)
8989
{
9090
childNode.Parent = this;
9191
childNode.Leaf = ChildNodes.Count + 1;
9292
ChildNodes.Add(childNode);
93-
return;
93+
return childNode;
9494
}
9595
else if (childNode.IncludePrimitive)
9696
{
@@ -101,6 +101,9 @@ public void AddChildNode(QueryNode childNode)
101101
{
102102
currentNode.AddChildNode(child);
103103
}
104+
105+
return currentNode;
106+
104107
}
105108

106109
public void SetArgumentValue(string graphName, object value)

src/Linq2GraphQL.Client/Utilities.cs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
using System.Linq.Expressions;
1+
using Linq2GraphQL.Client.Visitors;
2+
using System.Linq.Expressions;
23
using System.Reflection;
34
using System.Reflection.Metadata.Ecma335;
5+
using VisitorPlayground.Visitors;
46

57
namespace Linq2GraphQL.Client;
68

@@ -24,19 +26,30 @@ public static string GetArgumentsId(IEnumerable<object> objects)
2426
}
2527
}
2628

27-
private static bool IsSelectOrSelectMany(this MethodCallExpression methodCallExpression)
29+
30+
31+
public static void ParseExpression(Expression body, QueryNode parent)
2832
{
29-
if (methodCallExpression.Arguments.Count != 2)
30-
{
31-
return false;
32-
}
3333

34-
;
35-
var methodName = methodCallExpression.Method.Name;
36-
return (methodName == "Select" || methodName == "SelectMany");
34+
var parameterVisitor = new ParameterVisitor(new MemberNode(null, null));
35+
var topNode = parameterVisitor.ParseExpression(body);
36+
var tree = topNode.PrintMemberTree();
37+
38+
39+
40+
topNode.PopulateChildQueryNodes(parent);
41+
42+
parent.SetAddPrimitiveChildren();
43+
44+
//foreach (var childNode in node.ChildNodes)
45+
//{
46+
// parent.AddChildNode(childNode);
47+
//}
3748
}
3849

39-
public static void ParseExpression(Expression body, QueryNode parent)
50+
51+
52+
public static void ParseExpression_OLD(Expression body, QueryNode parent)
4053
{
4154
var node = new QueryNode(parent.Member);
4255
ParseExpressionInternal(body, node);
@@ -48,6 +61,19 @@ public static void ParseExpression(Expression body, QueryNode parent)
4861
}
4962
}
5063

64+
private static bool IsSelectOrSelectMany(this MethodCallExpression methodCallExpression)
65+
{
66+
if (methodCallExpression.Arguments.Count != 2)
67+
{
68+
return false;
69+
}
70+
71+
;
72+
var methodName = methodCallExpression.Method.Name;
73+
return (methodName == "Select" || methodName == "SelectMany");
74+
}
75+
76+
5177
private static void ParseExpressionInternal(Expression body, QueryNode parent)
5278
{
5379
if (body.NodeType == ExpressionType.MemberInit)
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
using Linq2GraphQL.Client;
2+
using System.Linq.Expressions;
3+
using System.Reflection;
4+
using System.Text;
5+
6+
namespace Linq2GraphQL.Client.Visitors
7+
{
8+
public class MemberNode(MemberInfo memberInfo, List<ArgumentValue> arguments = null, ParameterExpression parameterExpression = null)
9+
{
10+
11+
public string ParameterName => parameterExpression?.Name;
12+
13+
public MemberInfo MemberInfo => memberInfo;
14+
public MemberNode Parent { get; set; }
15+
public List<MemberNode> Children { get; set; } = [];
16+
public List<ArgumentValue> Arguments => arguments;
17+
18+
19+
public void SetParameterExpression(ParameterExpression param)
20+
{
21+
parameterExpression = param;
22+
}
23+
24+
25+
public bool HasArguments => arguments != null && arguments.Count > 0;
26+
27+
public MemberNode GetMemberNodeFromParameterExpression(ParameterExpression expression)
28+
{
29+
if (parameterExpression == expression || Parent == null) return this;
30+
return Parent.GetMemberNodeFromParameterExpression(expression);
31+
}
32+
33+
34+
public void AddChild(MemberNode memberNode)
35+
{
36+
memberNode.Parent = this;
37+
Children.Add(memberNode);
38+
}
39+
40+
public MemberNode AddMembers(Expression node)
41+
{
42+
var members = GetMembers(node);
43+
members.Reverse();
44+
45+
if (members.Count == 0) { return null; }
46+
47+
var topNode = new MemberNode(members[0]);
48+
var currentNode = topNode;
49+
foreach (var member in members.Skip(1))
50+
{
51+
var newNode = new MemberNode(member);
52+
currentNode.AddChild(newNode);
53+
currentNode = newNode;
54+
}
55+
AddChild(topNode);
56+
57+
return currentNode;
58+
59+
}
60+
61+
private static List<MemberInfo> GetMembers(Expression expression)
62+
{
63+
var members = new List<MemberInfo>();
64+
65+
if (expression.NodeType == ExpressionType.MemberAccess)
66+
{
67+
var memberExpression = (MemberExpression)expression;
68+
members.Add(memberExpression.Member);
69+
members.AddRange(GetMembers(memberExpression.Expression));
70+
}
71+
72+
return members;
73+
}
74+
75+
public void PopulateChildQueryNodes(QueryNode queryNode)
76+
{
77+
78+
79+
foreach (var child in Children)
80+
{
81+
82+
var childNode = new QueryNode(child.MemberInfo, null, child.Arguments);
83+
var addedNode = queryNode.AddChildNode(childNode);
84+
child.PopulateChildQueryNodes(addedNode);
85+
}
86+
87+
88+
89+
}
90+
91+
92+
public string PrintMemberTree(int level = 0)
93+
{
94+
var sb = new StringBuilder();
95+
//var cc = Children.Select(e => new { e.MemberInfo, e.Arguments, e.MemberInfo.MetadataToken }).Distinct();
96+
//var c = cc.Count();
97+
98+
sb.AppendLine($"Level: {level}");
99+
100+
level++;
101+
102+
if (HasArguments)
103+
{
104+
var argumentList = $"({string.Join(", ", Arguments.Select(e => e.Value))})";
105+
106+
sb.AppendLine($"Member: {MemberInfo?.Name ?? "--------------"}{argumentList}");
107+
}
108+
else
109+
{
110+
sb.AppendLine($"Member: {MemberInfo?.Name ?? "--------------"} ");
111+
}
112+
113+
sb.AppendLine($"Parent: {Parent?.MemberInfo?.Name}");
114+
115+
sb.AppendLine($"Parameter: {parameterExpression?.Name}");
116+
117+
sb.AppendLine("");
118+
119+
foreach (var child in Children)
120+
{
121+
sb.Append(child.PrintMemberTree(level));
122+
}
123+
124+
sb.AppendLine("");
125+
126+
return sb.ToString();
127+
128+
}
129+
130+
131+
}
132+
133+
134+
}

0 commit comments

Comments
 (0)