func (h *HeaderFile) parse(clangArguments []string) error { if err := h.prepareFile(); err != nil { return err } // Parse the header file to analyse everything we need to know idx := clang.NewIndex(0, 1) defer idx.Dispose() tu := idx.ParseTranslationUnit(h.name, clangArguments, nil, 0) defer tu.Dispose() if !tu.IsValid() { return fmt.Errorf("Cannot parse Index.h") } for _, diag := range tu.Diagnostics() { switch diag.Severity() { case clang.Diagnostic_Error: return fmt.Errorf("Diagnostic error in Index.h: %s", diag.Spelling()) case clang.Diagnostic_Fatal: return fmt.Errorf("Diagnostic fatal in Index.h: %s", diag.Spelling()) } } h.handleFile(tu.TranslationUnitCursor()) return nil }
func main() { fmt.Printf(":: go-clang-dump...\n") flag.Parse() fmt.Printf(":: fname: %s\n", *fname) fmt.Printf(":: args: %v\n", flag.Args()) if *fname == "" { flag.Usage() fmt.Printf("please provide a file name to analyze\n") os.Exit(1) } idx := clang.NewIndex(0, 1) defer idx.Dispose() args := []string{} if len(flag.Args()) > 0 && flag.Args()[0] == "-" { args = make([]string, len(flag.Args()[1:])) copy(args, flag.Args()[1:]) } tu := idx.ParseTranslationUnit(*fname, args, nil, 0) defer tu.Dispose() fmt.Printf("tu: %s\n", tu.Spelling()) cursor := tu.TranslationUnitCursor() fmt.Printf("cursor-isnull: %v\n", cursor.IsNull()) fmt.Printf("cursor: %s\n", cursor.Spelling()) fmt.Printf("cursor-kind: %s\n", cursor.Kind().Spelling()) fmt.Printf("tu-fname: %s\n", tu.File(*fname).Name()) cursor.Visit(func(cursor, parent clang.Cursor) clang.ChildVisitResult { if cursor.IsNull() { fmt.Printf("cursor: <none>\n") return clang.ChildVisit_Continue } fmt.Printf("%s: %s (%s)\n", cursor.Kind().Spelling(), cursor.Spelling(), cursor.USR()) switch cursor.Kind() { case clang.Cursor_ClassDecl, clang.Cursor_EnumDecl, clang.Cursor_StructDecl, clang.Cursor_Namespace: return clang.ChildVisit_Recurse } return clang.ChildVisit_Continue }) fmt.Printf(":: bye.\n") }
func cmd(args []string) int { fmt.Printf(":: go-clang-dump...\n") if err := flag.CommandLine.Parse(args); err != nil { fmt.Printf("ERROR: %s", err) return 1 } fmt.Printf(":: fname: %s\n", *fname) fmt.Printf(":: args: %v\n", flag.Args()) if *fname == "" { flag.Usage() fmt.Printf("please provide a file name to analyze\n") return 1 } idx := clang.NewIndex(0, 1) defer idx.Dispose() tuArgs := []string{} if len(flag.Args()) > 0 && flag.Args()[0] == "-" { tuArgs = make([]string, len(flag.Args()[1:])) copy(tuArgs, flag.Args()[1:]) } tu := idx.ParseTranslationUnit(*fname, tuArgs, nil, 0) defer tu.Dispose() fmt.Printf("tu: %s\n", tu.Spelling()) diagnostics := tu.Diagnostics() for _, d := range diagnostics { fmt.Println("PROBLEM:", d.Spelling()) } cursor := tu.TranslationUnitCursor() fmt.Printf("cursor-isnull: %v\n", cursor.IsNull()) fmt.Printf("cursor: %s\n", cursor.Spelling()) fmt.Printf("cursor-kind: %s\n", cursor.Kind().Spelling()) fmt.Printf("tu-fname: %s\n", tu.File(*fname).Name()) cursor.Visit(func(cursor, parent clang.Cursor) clang.ChildVisitResult { if cursor.IsNull() { fmt.Printf("cursor: <none>\n") return clang.ChildVisit_Continue } fmt.Printf("%s: %s (%s)\n", cursor.Kind().Spelling(), cursor.Spelling(), cursor.USR()) switch cursor.Kind() { case clang.Cursor_ClassDecl, clang.Cursor_EnumDecl, clang.Cursor_StructDecl, clang.Cursor_Namespace: return clang.ChildVisit_Recurse } return clang.ChildVisit_Continue }) if len(diagnostics) > 0 { fmt.Println("NOTE: There were problems while analyzing the given file") } fmt.Printf(":: bye.\n") return 0 }