func handleEnumCursor(cursor clang.Cursor, cname string, cnameIsTypeDef bool) *Enum { e := Enum{ CName: cname, CNameIsTypeDef: cnameIsTypeDef, Comment: CleanDoxygenComment(cursor.RawCommentText()), IncludeFiles: newIncludeFiles(), Items: []EnumItem{}, } e.Name = TrimLanguagePrefix(e.CName) e.Receiver.Name = commonReceiverName(e.Name) e.Receiver.Type.GoName = e.Name e.Receiver.Type.CGoName = e.CName if cnameIsTypeDef { e.Receiver.Type.CGoName = e.CName } else { e.Receiver.Type.CGoName = "enum_" + e.CName } enumNamePrefix := e.Name enumNamePrefix = strings.TrimSuffix(enumNamePrefix, "Kind") enumNamePrefix = strings.SplitN(enumNamePrefix, "_", 2)[0] cursor.Visit(func(cursor, parent clang.Cursor) clang.ChildVisitResult { switch cursor.Kind() { case clang.Cursor_EnumConstantDecl: ei := EnumItem{ CName: cursor.Spelling(), Comment: CleanDoxygenComment(cursor.RawCommentText()), // TODO We are always using the same comment if there is none, see "TypeKind" https://github.com/go-clang/gen/issues/58 Value: cursor.EnumConstantDeclUnsignedValue(), } ei.Name = TrimLanguagePrefix(ei.CName) // Check if the first item has an enum prefix if len(e.Items) == 0 { eis := strings.SplitN(ei.Name, "_", 2) if len(eis) == 2 { enumNamePrefix = "" } } // Add the enum prefix to the item if enumNamePrefix != "" { ei.Name = strings.TrimSuffix(ei.Name, enumNamePrefix) if !strings.HasPrefix(ei.Name, enumNamePrefix) { ei.Name = enumNamePrefix + "_" + ei.Name } } e.Items = append(e.Items, ei) default: panic(cursor.Kind()) } return clang.ChildVisit_Continue }) if strings.HasSuffix(e.Name, "Error") { e.UnderlyingType = "int32" } else { e.UnderlyingType = "uint32" } return &e }