in processor/processor.go [394:444]
func (p *processor) processStructFields(parentType *types.Type, pkg *loader.Package, info *markers.TypeInfo, depth int) {
logger := zap.S().With("package", pkg.PkgPath, "type", parentType.String())
logger.Debugw("Processing struct fields")
parentTypeKey := types.Identifier(parentType)
for _, f := range info.Fields {
fieldDef := &types.Field{
Name: f.Name,
Markers: f.Markers,
Doc: f.Doc,
Embedded: f.Name == "",
}
if tagVal, ok := f.Tag.Lookup("json"); ok {
args := strings.Split(tagVal, ",")
if len(args) > 0 && args[0] != "" {
fieldDef.Name = args[0]
}
if len(args) > 1 && args[1] == "inline" {
fieldDef.Inlined = true
}
}
t := pkg.TypesInfo.TypeOf(f.RawField.Type)
if t == nil {
zap.S().Debugw("Failed to determine type of field", "field", fieldDef.Name)
continue
}
logger.Debugw("Loading field type", "field", fieldDef.Name)
if fieldDef.Type = p.processType(pkg, nil, t, depth); fieldDef.Type == nil {
logger.Debugw("Failed to load type for field", "field", f.Name, "type", t.String())
continue
}
// Keep old behaviour, where struct fields are never regarded as imported
fieldDef.Type.Imported = false
if fieldDef.Name == "" {
fieldDef.Name = fieldDef.Type.Name
}
if p.shouldIgnoreField(parentTypeKey, fieldDef.Name) {
zap.S().Debugw("Skipping excluded field", "type", parentType.String(), "field", fieldDef.Name)
continue
}
parentType.Fields = append(parentType.Fields, fieldDef)
p.addReference(parentType, fieldDef.Type)
}
}