func (scp *schemaParser) parseAllOfMember(gofile *ast.File, schema *spec.Schema, expr ast.Expr, seenPreviously map[string]struct{}) error { // TODO: check if struct is annotated with swagger:model or known in the definitions otherwise var pkg *loader.PackageInfo var file *ast.File var gd *ast.GenDecl var ts *ast.TypeSpec var err error switch tpe := expr.(type) { case *ast.Ident: // do lookup of type // take primitives into account, they should result in an error for swagger pkg, err = scp.packageForFile(gofile) if err != nil { return err } file, gd, ts, err = findSourceFile(pkg, tpe.Name) if err != nil { return err } case *ast.SelectorExpr: // look up package, file and then type pkg, err = scp.packageForSelector(gofile, tpe.X) if err != nil { return fmt.Errorf("embedded struct: %v", err) } file, gd, ts, err = findSourceFile(pkg, tpe.Sel.Name) if err != nil { return fmt.Errorf("embedded struct: %v", err) } default: return fmt.Errorf("unable to resolve allOf member for: %v\n", expr) } sd := newSchemaDecl(file, gd, ts) if sd.hasAnnotation() { ref, err := spec.NewRef("#/definitions/" + sd.Name) if err != nil { return err } schema.Ref = ref scp.postDecls = append(scp.postDecls, *sd) } else { switch st := ts.Type.(type) { case *ast.StructType: return scp.parseStructType(file, schema, st, seenPreviously) case *ast.InterfaceType: return scp.parseInterfaceType(file, schema, st, seenPreviously) } } return nil }