func prepareStructMembers(s *gen.Struct) { for _, m := range s.Members { if (strings.HasPrefix(m.CName, "has") || strings.HasPrefix(m.CName, "is")) && m.Type.GoName == gen.GoInt16 { m.Type.GoName = gen.GoBool } // If this is an array length parameter we need to find its partner maCName := gen.ArrayNameFromLength(m.CName) if maCName != "" { for _, ma := range s.Members { if strings.ToLower(ma.CName) == strings.ToLower(maCName) { m.Type.LengthOfSlice = ma.CName ma.Type.IsSlice = true ma.Type.LengthOfSlice = m.CName // TODO wrong usage but needed for the getter generation... maybe refactor this LengthOfSlice alltogether? https://github.com/go-clang/gen/issues/49 break } } } } }
func prepareFunction(f *gen.Function) { for i := range f.Parameters { p := &f.Parameters[i] if f.CName == "clang_getRemappingsFromFileList" { switch p.CName { case "filePaths": p.Type.IsSlice = true case "numFiles": p.Type.LengthOfSlice = "filePaths" } continue } // Whiteflag types that are return arguments if p.Type.PointerLevel == 1 && (p.Type.GoName == "File" || p.Type.GoName == "FileUniqueID" || p.Type.GoName == "IdxClientFile" || p.Type.GoName == "cxstring" || p.Type.GoName == gen.GoInt32 || p.Type.GoName == gen.GoUInt32 || p.Type.GoName == "CompilationDatabase_Error" || p.Type.GoName == "PlatformAvailability" || p.Type.GoName == "SourceRange" || p.Type.GoName == "LoadDiag_Error") { p.Type.IsReturnArgument = true } if p.Type.PointerLevel == 2 && (p.Type.GoName == "Token" || p.Type.GoName == "Cursor") { p.Type.IsReturnArgument = true } if f.CName == "clang_disposeOverriddenCursors" && p.CName == "overridden" { p.Type.IsSlice = true } // If this is an array length parameter we need to find its partner paCName := gen.ArrayNameFromLength(p.CName) if paCName != "" { for j := range f.Parameters { pa := &f.Parameters[j] if strings.ToLower(pa.CName) == strings.ToLower(paCName) { if pa.Type.GoName == "struct CXUnsavedFile" || pa.Type.GoName == "UnsavedFile" { pa.Type.GoName = "UnsavedFile" pa.Type.CGoName = "struct_CXUnsavedFile" } else if pa.Type.CGoName == gen.CSChar && pa.Type.PointerLevel == 2 { } else if pa.Type.GoName == "CompletionResult" { } else if pa.Type.GoName == "Token" { } else if pa.Type.GoName == "Cursor" { } else { break } p.Type.LengthOfSlice = pa.Name pa.Type.IsSlice = true if pa.Type.IsReturnArgument && p.Type.PointerLevel > 0 { p.Type.IsReturnArgument = true } break } } } } for i := range f.Parameters { p := &f.Parameters[i] if p.Type.CGoName == gen.CSChar && p.Type.PointerLevel == 2 && !p.Type.IsSlice { p.Type.IsReturnArgument = true } } }