@@ -315,6 +315,11 @@ func (generator *ConverterGenerator) mappingForOption(context Context, converter
315315 continue
316316 }
317317
318+ if argument , ok := generator .argumentFromTypeHintReference (converter , valuePath , assignment ); ok {
319+ optMapping .Args = append (optMapping .Args , argument )
320+ continue
321+ }
322+
318323 argument := generator .argumentForType (context , converter , argName , valuePath , valueType )
319324 optMapping .Args = append (optMapping .Args , argument )
320325 }
@@ -452,6 +457,25 @@ func (generator *ConverterGenerator) argumentForType(context Context, converter
452457 }
453458}
454459
460+ func (generator * ConverterGenerator ) argumentFromTypeHintReference (converter Converter , path ast.Path , assignment ast.Assignment ) (ArgumentMapping , bool ) {
461+ if assignment .Value .Argument == nil || assignment .Path .Last ().TypeHint == nil {
462+ return ArgumentMapping {}, false
463+ }
464+
465+ if ! assignment .Path .Last ().TypeHint .IsRef () {
466+ return ArgumentMapping {}, false
467+ }
468+
469+ return ArgumentMapping {
470+ Builder : & BuilderArgMapping {
471+ ValuePath : path ,
472+ ValueType : * assignment .Path .Last ().TypeHint ,
473+ BuilderPkg : converter .Package ,
474+ BuilderName : assignment .Value .Argument .Name ,
475+ },
476+ }, true
477+ }
478+
455479func (generator * ConverterGenerator ) isAssignmentFromDisjunctionStruct (context Context , assignment ast.Assignment ) bool {
456480 if assignment .Value .Envelope == nil {
457481 return false
@@ -557,6 +581,16 @@ func (generator *ConverterGenerator) guardForAssignments(valuesRootPath ast.Path
557581 }
558582 continue
559583 }
584+
585+ if assignment .Value .Argument != nil && assignment .Path .Last ().TypeHint != nil {
586+ assignment .Path [len (assignment .Path )- 1 ].TypeHint = & assignment .Value .Argument .Type
587+ guard := MappingGuard {
588+ Path : valuesRootPath .Append (assignment .Path ),
589+ Op : ast .NotEqualOp ,
590+ Value : nil ,
591+ }
592+ guards .Set (guard .String (), guard )
593+ }
560594 }
561595
562596 return guards .Values ()
@@ -594,5 +628,10 @@ func (generator *ConverterGenerator) assignmentKey(assignment ast.Assignment) st
594628 }
595629 }
596630
631+ // If we have an any or disjunction, some values could match the same key
632+ if assignment .Value .Argument != nil && assignment .Path .Last ().TypeHint != nil {
633+ path += fmt .Sprintf ("=%v" , assignment .Value .Argument .Name )
634+ }
635+
597636 return path
598637}
0 commit comments