@@ -62,14 +62,20 @@ public IGraphType Adapt(TypeInfo typeInfo)
62
62
63
63
private IGraphType AdaptInput ( TypeInfo typeInfo )
64
64
{
65
- var initialType = typeInfo ;
66
- typeInfo = UnwrapTypeInfo ( typeInfo ) ;
67
- var graphType = TryGetFromCache ( typeInfo , initialType ) ;
65
+ var unwrappedTypeInfo = UnwrapTypeInfo ( typeInfo ) ;
66
+ var graphType = TryGetFromCache ( unwrappedTypeInfo , typeInfo ) ;
68
67
if ( graphType != null ) return graphType ;
69
-
70
- graphType = CreateGraphType ( typeInfo , typeof ( InputObjectGraphType < > ) . MakeGenericType ( typeInfo ) ) ;
71
- _visitor ? . Visit ( ( IInputObjectGraphType ) graphType ) ;
72
- return Wrap ( initialType , graphType ) ;
68
+ if ( unwrappedTypeInfo . IsEnum )
69
+ {
70
+ graphType = CreateGraphType ( unwrappedTypeInfo ,
71
+ typeof ( EnumerationGraphType < > ) . MakeGenericType ( unwrappedTypeInfo ) ) ;
72
+ }
73
+ else
74
+ {
75
+ graphType = CreateGraphType ( unwrappedTypeInfo , typeof ( InputObjectGraphType < > ) . MakeGenericType ( unwrappedTypeInfo ) ) ;
76
+ _visitor ? . Visit ( ( IInputObjectGraphType ) graphType ) ;
77
+ }
78
+ return graphType ;
73
79
}
74
80
75
81
private void AddFields ( TypeInfo typeInfo , IComplexGraphType graphType )
@@ -99,19 +105,27 @@ private void AddFields(TypeInfo typeInfo, IComplexGraphType graphType)
99
105
private FieldType CreateField ( MemberInfo memberInfo )
100
106
{
101
107
var returnType = GetReturnType ( memberInfo ) ;
108
+ var unwrappedReturnType = UnwrapTypeInfo ( returnType ) ;
102
109
103
- var resolvedType = Adapt ( returnType ) ;
104
- if ( memberInfo . GetCustomAttribute < NonNullAttribute > ( ) != null )
105
- {
106
- resolvedType = WrapNonNull ( resolvedType ) ;
107
- }
110
+ var foundType = _typeRegistry . Get ( unwrappedReturnType ) ;
108
111
109
- if ( memberInfo . GetCustomAttribute < NonNullItemAttribute > ( ) != null &&
112
+ IGraphType resolvedType = null ;
113
+ if ( foundType == null )
114
+ resolvedType = Adapt ( returnType ) ;
115
+
116
+ var isNonNullItem = memberInfo . GetCustomAttribute < NonNullItemAttribute > ( ) != null ;
117
+ if ( isNonNullItem && resolvedType != null &&
110
118
resolvedType is ListGraphType listGraphType )
111
119
{
112
120
resolvedType = WrapList ( WrapNonNull ( listGraphType . ResolvedType ) ) ;
113
121
}
114
122
123
+ var isNonNull = memberInfo . GetCustomAttribute < NonNullAttribute > ( ) != null ;
124
+ if ( isNonNull && resolvedType != null )
125
+ {
126
+ resolvedType = WrapNonNull ( resolvedType ) ;
127
+ }
128
+
115
129
var fieldType = new FieldType
116
130
{
117
131
Arguments = CreateArguments ( memberInfo ) ,
@@ -121,9 +135,11 @@ private FieldType CreateField(MemberInfo memberInfo)
121
135
Metadata = { { nameof ( MemberInfo ) , memberInfo } } ,
122
136
Name = memberInfo . GetCustomAttribute < NameAttribute > ( ) ? . Name ?? memberInfo . Name ,
123
137
ResolvedType = resolvedType ,
124
- Resolver = new FieldResolver ( memberInfo , _dependencyResolver )
138
+ Type = WrapTypeInfo ( foundType , returnType , isNonNull , isNonNullItem )
125
139
} ;
126
140
141
+ fieldType . Resolver = new FieldResolver ( fieldType , _dependencyResolver ) ;
142
+
127
143
return fieldType ;
128
144
}
129
145
@@ -140,7 +156,22 @@ private QueryArguments CreateArguments(MemberInfo memberInfo)
140
156
141
157
private QueryArgument CreateArgument ( ParameterInfo parameterInfo )
142
158
{
143
- return new QueryArgument ( AdaptInput ( parameterInfo . ParameterType . GetTypeInfo ( ) ) )
159
+ var parameterType = parameterInfo . ParameterType ;
160
+ var hasDefaultValue = parameterInfo . HasDefaultValue ||
161
+ parameterInfo . GetCustomAttribute < DefaultValueAttribute > ( ) != null ||
162
+ parameterType . IsValueType && parameterType . IsNullable ( ) ;
163
+
164
+ var inputType = AdaptInput ( parameterType . GetTypeInfo ( ) ) ;
165
+ if ( hasDefaultValue == false && ! ( inputType is NonNullGraphType ) )
166
+ {
167
+ inputType = WrapNonNull ( inputType ) ;
168
+ }
169
+ if ( hasDefaultValue && inputType is NonNullGraphType nonNullGraphType )
170
+ {
171
+ inputType = nonNullGraphType . ResolvedType ;
172
+ }
173
+
174
+ return new QueryArgument ( inputType )
144
175
{
145
176
DefaultValue = parameterInfo . HasDefaultValue
146
177
? parameterInfo . DefaultValue
@@ -227,6 +258,26 @@ private static TypeInfo UnwrapTypeInfo(TypeInfo typeInfo)
227
258
return typeInfo ;
228
259
}
229
260
261
+ private TypeInfo WrapTypeInfo ( TypeInfo graphType , TypeInfo typeInfo , bool isNonNull , bool isNonNullItem )
262
+ {
263
+ if ( graphType == null )
264
+ return null ;
265
+
266
+ var enumerableArgument = GetEnumerableArgument ( typeInfo ) ;
267
+
268
+ if ( typeInfo . IsValueType && typeInfo . IsNullable ( ) == false || enumerableArgument != null &&
269
+ ( enumerableArgument . IsValueType && enumerableArgument . IsNullable ( ) == false || isNonNullItem ) )
270
+ graphType = typeof ( NonNullGraphType < > ) . MakeGenericType ( graphType ) . GetTypeInfo ( ) ;
271
+
272
+ if ( enumerableArgument != null )
273
+ graphType = typeof ( ListGraphType < > ) . MakeGenericType ( graphType ) . GetTypeInfo ( ) ;
274
+
275
+ if ( isNonNull )
276
+ graphType = typeof ( NonNullGraphType < > ) . MakeGenericType ( graphType ) . GetTypeInfo ( ) ;
277
+
278
+ return graphType ;
279
+ }
280
+
230
281
private IGraphType Wrap ( TypeInfo typeInfo , IGraphType graphType )
231
282
{
232
283
var enumerableArgument = GetEnumerableArgument ( typeInfo ) ;
0 commit comments