func makeTypeRef(t schema.Type, rel *node, nodes nodeMap) (typeRef, error) { nodeRef := func(id uint64) (typeRef, error) { ni, err := nodes.mustFind(id) if err != nil { return typeRef{}, err } return makeNodeTypeRef(ni, rel) } if ref, ok := staticTypeRefs[t.Which()]; ok { return ref, nil } switch t.Which() { case schema.Type_Which_enum: return nodeRef(t.Enum().TypeId()) case schema.Type_Which_structType: return nodeRef(t.StructType().TypeId()) case schema.Type_Which_interface: return nodeRef(t.Interface().TypeId()) case schema.Type_Which_list: lt, _ := t.List().ElementType() if ref, ok := staticListTypeRefs[lt.Which()]; ok { return ref, nil } switch lt.Which() { case schema.Type_Which_enum: ref, err := nodeRef(lt.Enum().TypeId()) if err != nil { return ref, err } ref.name = ref.name + "_List" ref.newfunc = "New" + ref.name return ref, nil case schema.Type_Which_structType: ref, err := nodeRef(lt.StructType().TypeId()) if err != nil { return ref, err } ref.name = ref.name + "_List" ref.newfunc = "New" + ref.name return ref, nil case schema.Type_Which_anyPointer, schema.Type_Which_list, schema.Type_Which_interface: return typeRef{name: "PointerList", newfunc: "NewPointerList", imp: capnpImportSpec}, nil } } return typeRef{}, fmt.Errorf("unable to reference type %v", t.Which()) }