func (cfg *Config) genAST(schema xsd.Schema, extra ...xsd.Schema) (*ast.File, error) { var errList errorList decls := make(map[string]spec) cfg.addStandardHelpers() collect := make(map[xml.Name]xsd.Type) for k, v := range schema.Types { collect[k] = v } for _, schema := range extra { for k, v := range schema.Types { collect[k] = v } } prev := schema.Types schema.Types = collect if cfg.preprocessType != nil { cfg.debugf("running user-defined pre-processing functions") for name, t := range prev { if t := cfg.preprocessType(schema, t); t != nil { prev[name] = t } } } schema.Types = prev cfg.debugf("generating Go source for schema %q", schema.TargetNS) typeList := cfg.flatten(schema.Types) for _, t := range typeList { specs, err := cfg.genTypeSpec(t) if err != nil { errList = append(errList, fmt.Errorf("generate type %q: %v", xsd.XMLName(t).Local, err)) } else { for _, s := range specs { decls[s.name] = s } } } if cfg.postprocessType != nil { cfg.debugf("running user-defined post-processing functions") for name, s := range decls { decls[name] = cfg.postprocessType(s) } } if len(errList) > 0 { return nil, errList } var result []ast.Decl keys := make([]string, 0, len(decls)) for name := range decls { keys = append(keys, name) } sort.Strings(keys) for _, name := range keys { info := decls[name] typeDecl := &ast.GenDecl{ Tok: token.TYPE, Specs: []ast.Spec{ &ast.TypeSpec{ Name: ast.NewIdent(name), Type: info.expr, }, }, } result = append(result, typeDecl) for _, f := range info.methods { result = append(result, f) } } if cfg.pkgname == "" { cfg.pkgname = "ws" } file := &ast.File{ Decls: result, Name: ast.NewIdent(cfg.pkgname), Doc: nil, } return file, nil }