func()

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)
	}
}