1- using System . Linq . Expressions ;
2- using System . Reflection ;
3- using System . Reflection . Metadata . Ecma335 ;
4-
1+ using Linq2GraphQL . Client . Visitors ;
2+ using System . Linq . Expressions ;
53namespace Linq2GraphQL . Client ;
64
75public static class Utilities
@@ -24,164 +22,13 @@ public static string GetArgumentsId(IEnumerable<object> objects)
2422 }
2523 }
2624
27- private static bool IsSelectOrSelectMany ( this MethodCallExpression methodCallExpression )
28- {
29- if ( methodCallExpression . Arguments . Count != 2 )
30- {
31- return false ;
32- }
33-
34- ;
35- var methodName = methodCallExpression . Method . Name ;
36- return ( methodName == "Select" || methodName == "SelectMany" ) ;
37- }
38-
3925 public static void ParseExpression ( Expression body , QueryNode parent )
4026 {
41- var node = new QueryNode ( parent . Member ) ;
42- ParseExpressionInternal ( body , node ) ;
43- node . SetAddPrimitiveChildren ( ) ;
44-
45- foreach ( var childNode in node . ChildNodes )
46- {
47- parent . AddChildNode ( childNode ) ;
48- }
49- }
50-
51- private static void ParseExpressionInternal ( Expression body , QueryNode parent )
52- {
53- if ( body . NodeType == ExpressionType . MemberInit )
54- {
55- var exp = ( MemberInitExpression ) body ;
56- foreach ( var binding in exp . Bindings . Where ( e => e . BindingType == MemberBindingType . Assignment )
57- . Cast < MemberAssignment > ( ) )
58- {
59- ParseExpressionInternal ( binding . Expression , parent ) ;
60- }
61- }
62-
63- switch ( body )
64- {
65- case LambdaExpression lambdaExpression :
66- ParseExpressionInternal ( lambdaExpression . Body , parent ) ;
67- break ;
68-
69- case MemberExpression memberExpression :
70- var ( parentNode , _) = GetMemberQueryNode ( memberExpression ) ;
71- parent . AddChildNode ( parentNode ) ;
72- break ;
73-
74- case MethodCallExpression methodCallExp :
75- ParseMethodCallExpression ( parent , methodCallExp ) ;
76- break ;
77-
78- case NewExpression newExpression :
79- foreach ( var argument in newExpression . Arguments )
80- {
81- ParseExpression ( argument , parent ) ;
82- }
83-
84- break ;
85- }
86- }
87-
88- private static void ParseMethodCallExpression ( QueryNode parent , MethodCallExpression methodCallExp )
89- {
90- var graphInterfaceAttribute = methodCallExp . Method . GetCustomAttribute < GraphInterfaceAttribute > ( ) ;
91- if ( graphInterfaceAttribute != null )
92- {
93- var queryNode = new QueryNode ( methodCallExp . Method , methodCallExp . Method . Name , null , true ) ;
94- parent . AddChildNode ( queryNode ) ;
95- return ;
96- }
97-
98- var graphMethodAttribute = methodCallExp . Method . GetCustomAttribute < GraphMethodAttribute > ( ) ;
99- if ( graphMethodAttribute != null )
100- {
101- var arguments = new List < ArgumentValue > ( ) ;
102-
103- var i = 0 ;
104- foreach ( var parameter in methodCallExp . Method . GetParameters ( ) )
105- {
106- var graphAttribute = parameter . GetCustomAttribute < GraphArgumentAttribute > ( ) ;
107- if ( graphAttribute != null )
108- {
109- var arg = methodCallExp . Arguments [ i ] ;
110- ConstantExpression argConstant ;
111- if ( arg . NodeType == ExpressionType . Convert )
112- {
113- var unaryExpression = ( UnaryExpression ) arg ;
114- argConstant = ( ConstantExpression ) unaryExpression . Operand ;
115- }
116- else
117- {
118- argConstant = ( ConstantExpression ) arg ;
119- }
120-
121- arguments . Add ( new ArgumentValue ( parameter . Name , graphAttribute . GraphType ,
122- argConstant . Value ) ) ;
123- }
124-
125- i ++ ;
126- }
127-
128- var queryNode = new QueryNode ( methodCallExp . Method , graphMethodAttribute . GraphName , arguments ) ;
129- parent . AddChildNode ( queryNode ) ;
130- }
131- else if ( methodCallExp . IsSelectOrSelectMany ( ) )
132- {
133- if ( methodCallExp . Arguments [ 0 ] is MemberExpression memberExpr )
134- {
135- var ( ParentNode , LastNode ) = GetMemberQueryNode ( memberExpr ) ;
136- ParseExpressionInternal ( methodCallExp . Arguments [ 1 ] , LastNode ) ;
137- parent . AddChildNode ( ParentNode ) ;
138- }
139- else
140- {
141- ParseExpressionInternal ( methodCallExp . Arguments [ 1 ] , parent ) ;
142- }
143- }
144- }
145-
146- private static ( QueryNode ParentNode , QueryNode LastNode ) GetMemberQueryNode ( Expression expression )
147- {
148- var members = GetMembers ( expression ) ;
149- if ( members == null ) return ( null , null ) ;
150-
151- members . Reverse ( ) ;
152-
153- QueryNode parentNode = null ;
154- QueryNode currentNode = null ;
155-
156- foreach ( var member in members )
157- {
158- var newNode = new QueryNode ( member ) ;
159- if ( parentNode == null )
160- {
161- parentNode = newNode ;
162- }
163- else
164- {
165- currentNode . AddChildNode ( newNode ) ;
166- }
167-
168- currentNode = newNode ;
169- }
170-
171- return ( parentNode , currentNode ) ;
27+ var parameterVisitor = new ParameterVisitor ( new MemberNode ( null , null ) ) ;
28+ var topNode = parameterVisitor . ParseExpression ( body ) ;
29+
30+ topNode . PopulateChildQueryNodes ( parent ) ;
31+
17232 }
17333
174-
175- private static List < MemberInfo > GetMembers ( Expression expression )
176- {
177- var members = new List < MemberInfo > ( ) ;
178- if ( expression . NodeType == ExpressionType . MemberAccess )
179- {
180- var memberExpression = ( MemberExpression ) expression ;
181- members . Add ( memberExpression . Member ) ;
182- members . AddRange ( GetMembers ( memberExpression . Expression ) ) ;
183- }
184-
185- return members ;
186- }
18734}
0 commit comments