Skip to content

Commit fb70aca

Browse files
authored
Map disjunction arguments in converters (#822)
1 parent 06d071d commit fb70aca

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

internal/languages/converter.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
455479
func (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

Comments
 (0)