func handleFunctionCursor(cursor clang.Cursor) *Function { fname := cursor.Spelling() f := Function{ Name: fname, CName: fname, Comment: CleanDoxygenComment(cursor.RawCommentText()), IncludeFiles: newIncludeFiles(), Parameters: []FunctionParameter{}, } typ, err := typeFromClangType(cursor.ResultType()) if err != nil { panic(err) } f.ReturnType = typ numParam := int(cursor.NumArguments()) for i := 0; i < numParam; i++ { param := cursor.Argument(uint16(i)) p := FunctionParameter{ CName: param.DisplayName(), } typ, err := typeFromClangType(param.Type()) if err != nil { panic(err) } p.Type = typ p.Name = p.CName if p.Name == "" { p.Name = commonReceiverName(p.Type.GoName) } else { pns := strings.Split(p.Name, "_") for i := range pns { pns[i] = UpperFirstCharacter(pns[i]) } p.Name = LowerFirstCharacter(strings.Join(pns, "")) } if r := ReplaceGoKeywords(p.Name); r != "" { p.Name = r } f.Parameters = append(f.Parameters, p) } return &f }
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 }