@@ -37,6 +37,7 @@ public string WriteBeginClass(string typeName)
37
37
_writer . WriteIndentedLine ( "internal static class {0}" , typeName ) ;
38
38
_writer . WriteIndentedLine ( "{" ) ;
39
39
_writer . IncreaseIndent ( ) ;
40
+ _writer . WriteIndentedLine ( "private static readonly object _sync = new object();" ) ;
40
41
_writer . WriteIndentedLine ( "private static bool _bindingsInitialized;" ) ;
41
42
return typeName ;
42
43
}
@@ -94,15 +95,18 @@ public void AddParameterInitializer(IEnumerable<Resolver> resolvers, ILocalTypeL
94
95
95
96
if ( first )
96
97
{
97
- _writer . WriteIndentedLine ( "if (_bindingsInitialized)" ) ;
98
+ _writer . WriteIndentedLine ( "if (! _bindingsInitialized)" ) ;
98
99
_writer . WriteIndentedLine ( "{" ) ;
99
- using ( _writer . IncreaseIndent ( ) )
100
- {
101
- _writer . WriteIndentedLine ( "return;" ) ;
102
- }
100
+ _writer . IncreaseIndent ( ) ;
101
+
102
+ _writer . WriteIndentedLine ( "lock (_sync)" ) ;
103
+ _writer . WriteIndentedLine ( "{" ) ;
104
+ _writer . IncreaseIndent ( ) ;
105
+
106
+ _writer . WriteIndentedLine ( "if (!_bindingsInitialized)" ) ;
107
+ _writer . WriteIndentedLine ( "{" ) ;
108
+ _writer . IncreaseIndent ( ) ;
103
109
104
- _writer . WriteIndentedLine ( "}" ) ;
105
- _writer . WriteIndentedLine ( "_bindingsInitialized = true;" ) ;
106
110
_writer . WriteLine ( ) ;
107
111
_writer . WriteIndentedLine (
108
112
"const global::{0} bindingFlags =" ,
@@ -120,6 +124,8 @@ public void AddParameterInitializer(IEnumerable<Resolver> resolvers, ILocalTypeL
120
124
_writer . WriteIndentedLine ( "var type = typeof({0});" , method . ContainingType . ToFullyQualified ( ) ) ;
121
125
_writer . WriteIndentedLine ( "global::System.Reflection.MethodInfo resolver = default!;" ) ;
122
126
_writer . WriteIndentedLine ( "global::System.Reflection.ParameterInfo[] parameters = default!;" ) ;
127
+
128
+ _writer . WriteIndentedLine ( "_bindingsInitialized = true;" ) ;
123
129
first = false ;
124
130
}
125
131
@@ -182,8 +188,8 @@ public void AddParameterInitializer(IEnumerable<Resolver> resolvers, ILocalTypeL
182
188
using ( _writer . WriteForEach ( "binding" , $ "_args_{ resolver . TypeName } _{ resolver . Member . Name } ") )
183
189
{
184
190
using ( _writer . WriteIfClause (
185
- "binding.Kind == global::{0}.Argument" ,
186
- WellKnownTypes . ArgumentKind ) )
191
+ "binding.Kind == global::{0}.Argument" ,
192
+ WellKnownTypes . ArgumentKind ) )
187
193
{
188
194
_writer . WriteIndentedLine ( "argumentCount++;" ) ;
189
195
}
@@ -204,8 +210,8 @@ public void AddParameterInitializer(IEnumerable<Resolver> resolvers, ILocalTypeL
204
210
using ( _writer . IncreaseIndent ( ) )
205
211
{
206
212
_writer . WriteIndentedLine (
207
- ".SetMessage(\" The node resolver `{0}.{1}` mustn't have more than one " +
208
- "argument. Node resolvers can only have a single argument called `id`.\" )" ,
213
+ ".SetMessage(\" The node resolver `{0}.{1}` mustn't have more than one "
214
+ + "argument. Node resolvers can only have a single argument called `id`.\" )" ,
209
215
resolver . Member . ContainingType . ToDisplayString ( ) ,
210
216
resolver . Member . Name ) ;
211
217
_writer . WriteIndentedLine ( ".Build());" ) ;
@@ -214,6 +220,16 @@ public void AddParameterInitializer(IEnumerable<Resolver> resolvers, ILocalTypeL
214
220
}
215
221
}
216
222
}
223
+
224
+ if ( ! first )
225
+ {
226
+ _writer . DecreaseIndent ( ) ;
227
+ _writer . WriteIndentedLine ( "}" ) ;
228
+ _writer . DecreaseIndent ( ) ;
229
+ _writer . WriteIndentedLine ( "}" ) ;
230
+ _writer . DecreaseIndent ( ) ;
231
+ _writer . WriteIndentedLine ( "}" ) ;
232
+ }
217
233
}
218
234
219
235
_writer . WriteIndentedLine ( "}" ) ;
@@ -224,8 +240,7 @@ private static string ToFullyQualifiedString(
224
240
IMethodSymbol resolverMethod ,
225
241
ILocalTypeLookup typeLookup )
226
242
{
227
- if ( type . TypeKind is TypeKind . Error &&
228
- typeLookup . TryGetTypeName ( type , resolverMethod , out var typeDisplayName ) )
243
+ if ( type . TypeKind is TypeKind . Error && typeLookup . TryGetTypeName ( type , resolverMethod , out var typeDisplayName ) )
229
244
{
230
245
return typeDisplayName ;
231
246
}
@@ -269,9 +284,9 @@ private void AddStaticStandardResolver(
269
284
ILocalTypeLookup typeLookup )
270
285
{
271
286
using ( _writer . WriteMethod (
272
- "public static" ,
273
- returnType : WellKnownTypes . FieldResolverDelegates ,
274
- methodName : $ "{ resolver . TypeName } _{ resolver . Member . Name } ") )
287
+ "public static" ,
288
+ returnType : WellKnownTypes . FieldResolverDelegates ,
289
+ methodName : $ "{ resolver . TypeName } _{ resolver . Member . Name } ") )
275
290
{
276
291
using ( _writer . WriteIfClause ( condition : "!_bindingsInitialized" ) )
277
292
{
@@ -341,9 +356,9 @@ private void AddStaticStandardResolver(
341
356
private void AddStaticPureResolver( Resolver resolver , IMethodSymbol resolverMethod , ILocalTypeLookup typeLookup )
342
357
{
343
358
using ( _writer . WriteMethod (
344
- "public static" ,
345
- returnType : WellKnownTypes . FieldResolverDelegates ,
346
- methodName : $ "{ resolver . TypeName } _{ resolver . Member . Name } ") )
359
+ "public static" ,
360
+ returnType : WellKnownTypes . FieldResolverDelegates ,
361
+ methodName : $ "{ resolver . TypeName } _{ resolver . Member . Name } ") )
347
362
{
348
363
using ( _writer . WriteIfClause ( condition : "!_bindingsInitialized" ) )
349
364
{
@@ -436,9 +451,9 @@ private void AddStaticPureResolver(Resolver resolver, IMethodSymbol resolverMeth
436
451
private void AddStaticPropertyResolver( Resolver resolver )
437
452
{
438
453
using ( _writer . WriteMethod (
439
- "public static" ,
440
- returnType : WellKnownTypes . FieldResolverDelegates ,
441
- methodName : $ "{ resolver . TypeName } _{ resolver . Member . Name } ") )
454
+ "public static" ,
455
+ returnType : WellKnownTypes . FieldResolverDelegates ,
456
+ methodName : $ "{ resolver . TypeName } _{ resolver . Member . Name } ") )
442
457
{
443
458
using ( _writer . WriteIfClause ( condition : "!_bindingsInitialized" ) )
444
459
{
@@ -489,13 +504,13 @@ private void AddResolverArguments(Resolver resolver, IMethodSymbol resolverMetho
489
504
{
490
505
var parameter = resolver . Parameters [ i ] ;
491
506
492
- if ( resolver . IsNodeResolver
493
- && parameter . Kind is ResolverParameterKind . Argument or ResolverParameterKind . Unknown
494
- && ( parameter . Name == "id" || parameter . Key == "id" ) )
507
+ if ( resolver . IsNodeResolver
508
+ && parameter . Kind is ResolverParameterKind . Argument or ResolverParameterKind . Unknown
509
+ && ( parameter . Name == "id" || parameter . Key == "id" ) )
495
510
{
496
511
_writer . WriteIndentedLine (
497
- "var args{0} = context.GetLocalState<{1}>(" +
498
- "global::HotChocolate.WellKnownContextData.InternalId);" ,
512
+ "var args{0} = context.GetLocalState<{1}>("
513
+ + "global::HotChocolate.WellKnownContextData.InternalId);" ,
499
514
i ,
500
515
parameter . Type . ToFullyQualified ( ) ) ;
501
516
continue ;
@@ -524,8 +539,8 @@ private void AddResolverArguments(Resolver resolver, IMethodSymbol resolverMetho
524
539
break ;
525
540
case ResolverParameterKind . EventMessage :
526
541
_writer . WriteIndentedLine (
527
- "var args{0} = context.GetScopedState<{1}>(" +
528
- "global::HotChocolate.WellKnownContextData.EventMessage);" ,
542
+ "var args{0} = context.GetScopedState<{1}>("
543
+ + "global::HotChocolate.WellKnownContextData.EventMessage);" ,
529
544
i ,
530
545
parameter . Type . ToFullyQualified ( ) ) ;
531
546
break ;
@@ -593,8 +608,8 @@ private void AddResolverArguments(Resolver resolver, IMethodSymbol resolverMetho
593
608
}
594
609
case ResolverParameterKind . SetGlobalState :
595
610
_writer . WriteIndentedLine (
596
- "var args{0} = new HotChocolate.SetState<{1}>(" +
597
- "value => context.SetGlobalState(\" {2}\" , value));" ,
611
+ "var args{0} = new HotChocolate.SetState<{1}>("
612
+ + "value => context.SetGlobalState(\" {2}\" , value));" ,
598
613
i ,
599
614
( ( INamedTypeSymbol ) parameter . Type ) . TypeArguments [ 0 ] . ToFullyQualified ( ) ,
600
615
parameter . Key ) ;
@@ -633,8 +648,8 @@ private void AddResolverArguments(Resolver resolver, IMethodSymbol resolverMetho
633
648
}
634
649
case ResolverParameterKind . SetScopedState :
635
650
_writer . WriteIndentedLine (
636
- "var args{0} = new HotChocolate.SetState<{1}>(" +
637
- "value => context.SetScopedState(\" {2}\" , value));" ,
651
+ "var args{0} = new HotChocolate.SetState<{1}>("
652
+ + "value => context.SetScopedState(\" {2}\" , value));" ,
638
653
i ,
639
654
( ( INamedTypeSymbol ) parameter . Type ) . TypeArguments [ 0 ] . ToFullyQualified ( ) ,
640
655
parameter . Key ) ;
@@ -673,8 +688,8 @@ private void AddResolverArguments(Resolver resolver, IMethodSymbol resolverMetho
673
688
}
674
689
case ResolverParameterKind . SetLocalState :
675
690
_writer . WriteIndentedLine (
676
- "var args{0} = new HotChocolate.SetState<{1}>(" +
677
- "value => context.SetLocalState(\" {2}\" , value));" ,
691
+ "var args{0} = new HotChocolate.SetState<{1}>("
692
+ + "value => context.SetLocalState(\" {2}\" , value));" ,
678
693
i ,
679
694
( ( INamedTypeSymbol ) parameter . Type ) . TypeArguments [ 0 ] . ToFullyQualified ( ) ,
680
695
parameter . Key ) ;
0 commit comments