11// Licensed to the .NET Foundation under one or more agreements. 
22// The .NET Foundation licenses this file to you under the MIT license. 
33
4+ using  System . Collections . Generic ; 
5+ using  SourceGenerators ; 
6+ 
47namespace  Microsoft . Extensions . Configuration . Binder . SourceGeneration 
58{ 
69    public  sealed  partial  class  ConfigurationBindingGenerator 
@@ -45,14 +48,14 @@ private void EmitGetMethods()
4548                if  ( ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . Get_TypeOf ) ) 
4649                { 
4750                    StartMethodDefinition ( MethodsToGen_ConfigurationBinder . Get_TypeOf ,  documentation ) ; 
48-                     _writer . WriteLine ( $ "public static object? { Identifier . Get } (this { Identifier . IConfiguration }  { Identifier . configuration } , { Identifier . Type }  { Identifier . type } ) => "+ 
51+                     _writer . WriteLine ( $ "public static object? { Identifier . Get } (this { Identifier . IConfiguration }  { Identifier . configuration } , Type { Identifier . type } ) => "+ 
4952                        $ "{ expressionForGetCore } ({ Identifier . configuration } , { Identifier . type } , { Identifier . configureOptions } : null);") ; 
5053                } 
5154
5255                if  ( ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . Get_TypeOf_BinderOptions ) ) 
5356                { 
5457                    StartMethodDefinition ( MethodsToGen_ConfigurationBinder . Get_TypeOf_BinderOptions ,  documentation ) ; 
55-                     _writer . WriteLine ( $ "public static object? { Identifier . Get } (this { Identifier . IConfiguration }  { Identifier . configuration } , { Identifier . Type }  { Identifier . type } , { TypeDisplayString . NullableActionOfBinderOptions }  { Identifier . configureOptions } ) => "+ 
58+                     _writer . WriteLine ( $ "public static object? { Identifier . Get } (this { Identifier . IConfiguration }  { Identifier . configuration } , Type { Identifier . type } , { TypeDisplayString . NullableActionOfBinderOptions }  { Identifier . configureOptions } ) => "+ 
5659                        $ "{ expressionForGetCore } ({ Identifier . configuration } , { Identifier . type } , { Identifier . configureOptions } );") ; 
5760                } 
5861            } 
@@ -79,25 +82,30 @@ private void EmitGetValueMethods()
7982                if  ( ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . GetValue_TypeOf_key ) ) 
8083                { 
8184                    StartMethodDefinition ( MethodsToGen_ConfigurationBinder . GetValue_TypeOf_key ,  documentation ) ; 
82-                     _writer . WriteLine ( $ "public static object? { Identifier . GetValue } (this { Identifier . IConfiguration }  { Identifier . configuration } , { Identifier . Type }  { Identifier . type } , string { Identifier . key } ) => "+ 
85+                     _writer . WriteLine ( $ "public static object? { Identifier . GetValue } (this { Identifier . IConfiguration }  { Identifier . configuration } , Type { Identifier . type } , string { Identifier . key } ) => "+ 
8386                        $ "{ expressionForGetValueCore } ({ Identifier . configuration } , { Identifier . type } , { Identifier . key } );") ; 
8487                } 
8588
8689                if  ( ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . GetValue_TypeOf_key_defaultValue ) ) 
8790                { 
8891                    StartMethodDefinition ( MethodsToGen_ConfigurationBinder . GetValue_TypeOf_key_defaultValue ,  documentation ) ; 
89-                     _writer . WriteLine ( $ "public static object? { Identifier . GetValue } (this { Identifier . IConfiguration }  { Identifier . configuration } , { Identifier . Type }  { Identifier . type } , string { Identifier . key } , object? { Identifier . defaultValue } ) => "+ 
92+                     _writer . WriteLine ( $ "public static object? { Identifier . GetValue } (this { Identifier . IConfiguration }  { Identifier . configuration } , Type { Identifier . type } , string { Identifier . key } , object? { Identifier . defaultValue } ) => "+ 
9093                        $ "{ expressionForGetValueCore } ({ Identifier . configuration } , { Identifier . type } , { Identifier . key } ) ?? { Identifier . defaultValue } ;") ; 
9194                } 
9295            } 
9396
9497            private  void  EmitBindMethods_ConfigurationBinder ( ) 
9598            { 
99+                 if  ( ! ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . Bind ) ) 
100+                 { 
101+                     return ; 
102+                 } 
103+ 
96104                string  objParamExpr  =  $ "object? { Identifier . obj } "; 
97105
98106                if  ( ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . Bind_instance ) ) 
99107                { 
100-                     EmitMethodImplementation ( 
108+                     EmitMethods ( 
101109                        MethodsToGen_ConfigurationBinder . Bind_instance , 
102110                        additionalParams :  objParamExpr , 
103111                        configExpression :  Identifier . configuration , 
@@ -106,7 +114,7 @@ private void EmitBindMethods_ConfigurationBinder()
106114
107115                if  ( ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . Bind_instance_BinderOptions ) ) 
108116                { 
109-                     EmitMethodImplementation ( 
117+                     EmitMethods ( 
110118                        MethodsToGen_ConfigurationBinder . Bind_instance_BinderOptions , 
111119                        additionalParams :  $ "{ objParamExpr } , { TypeDisplayString . NullableActionOfBinderOptions }  { Identifier . configureOptions } ", 
112120                        configExpression :  Identifier . configuration , 
@@ -115,21 +123,41 @@ private void EmitBindMethods_ConfigurationBinder()
115123
116124                if  ( ShouldEmitMethods ( MethodsToGen_ConfigurationBinder . Bind_key_instance ) ) 
117125                { 
118-                     EmitMethodImplementation ( 
126+                     EmitMethods ( 
119127                        MethodsToGen_ConfigurationBinder . Bind_key_instance , 
120128                        additionalParams :  $ "string { Identifier . key } , { objParamExpr } ", 
121-                         configExpression :  $ "{ Identifier . configuration } ?. { Identifier . GetSection } ({ Identifier . key } )", 
129+                         configExpression :  $ "{ Expression . configurationGetSection } ({ Identifier . key } )", 
122130                        configureOptions :  false ) ; 
123131                } 
124132
125-                 void  EmitMethodImplementation ( MethodsToGen_ConfigurationBinder  method ,  string  additionalParams ,  string  configExpression ,  bool  configureOptions ) 
133+                 void  EmitMethods ( MethodsToGen_ConfigurationBinder  method ,  string  additionalParams ,  string  configExpression ,  bool  configureOptions ) 
126134                { 
127-                     string  configureOptionsArg  =  configureOptions  ?  Identifier . configureOptions  :  $ "{ Identifier . configureOptions } : null"; 
128-                     string  returnExpression  =  $ "{ Identifier . BindCoreMain } ({ configExpression } , { Identifier . obj } , { configureOptionsArg } )"; 
129- 
130-                     StartMethodDefinition ( method ,  "Attempts to bind the given object instance to configuration values by matching property names against configuration keys recursively." ) ; 
131-                     _writer . WriteLine ( $ "public static void { Identifier . Bind } (this { Identifier . IConfiguration }  { Identifier . configuration } , { additionalParams } ) => "
132-                         +  $ "{ returnExpression } ;") ; 
135+                     foreach  ( KeyValuePair < TypeSpec ,  List < InterceptorLocationInfo > >  pair  in  _sourceGenSpec . InterceptionInfo_ConfigBinder . GetOverloadInfo ( method ) ) 
136+                     { 
137+                         ( TypeSpec  type ,  List < InterceptorLocationInfo >  interceptorInfoList )  =  ( pair . Key ,  pair . Value ) ; 
138+ 
139+                         EmitBlankLineIfRequired ( ) ; 
140+                         _writer . WriteLine ( $ "/// <summary>Attempts to bind the given object instance to configuration values by matching property names against configuration keys recursively.</summary>") ; 
141+                         EmitInterceptsLocationAnnotations ( interceptorInfoList ) ; 
142+                         EmitStartBlock ( $ "public static void { Identifier . Bind } _{ type . DisplayString . ToIdentifierSubstring ( ) } (this { Identifier . IConfiguration }  { Identifier . configuration } , { additionalParams } )") ; 
143+ 
144+                         if  ( ! EmitInitException ( type )  &&  type . NeedsMemberBinding ) 
145+                         { 
146+                             string  binderOptionsArg  =  configureOptions  ?  $ "{ Identifier . GetBinderOptions } ({ Identifier . configureOptions } )":  $ "{ Identifier . binderOptions } : null"; 
147+ 
148+                             EmitCheckForNullArgument_WithBlankLine ( Identifier . configuration ) ; 
149+                             if  ( ! type . IsValueType ) 
150+                             { 
151+                                 EmitCheckForNullArgument_WithBlankLine ( Identifier . obj ) ; 
152+                             } 
153+                             _writer . WriteLine ( $$ """ 
154+                                 var {{ Identifier . typedObj }}  = ({{ type . EffectiveType . DisplayString }} ){{ Identifier . obj }} ; 
155+                                 {{ nameof ( MethodsToGen_CoreBindingHelper . BindCore ) }} ({{ configExpression }} , ref {{ Identifier . typedObj }} , {{ binderOptionsArg }} ); 
156+                                 """  ) ; 
157+                         } 
158+ 
159+                         EmitEndBlock ( ) ; 
160+                     } 
133161                } 
134162            } 
135163
0 commit comments