Guest User

Untitled

a guest
May 24th, 2018
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. // Generate a tags file for the Go Programming Language in the format used by
  2. // exuberant-ctags. Can be used with the VIM editor to navigate Go source code
  3. // files.
  4. //
  5. // usage: gotags filename [ filename... ] > tags
  6. //
  7. // Authors: michael.elkins@gmail.com, m.fellinger@gmail.com
  8. // Date: 2010-05-17
  9.  
  10. package main
  11.  
  12. import (
  13. "container/vector"
  14. "fmt"
  15. "go/ast"
  16. "go/parser"
  17. "os"
  18. "sort"
  19. )
  20.  
  21. var tags = vector.StringVector{}
  22.  
  23. func output_tag(name *ast.Ident, kind byte) {
  24. tags.Push(fmt.Sprintf("%s\t%s\t%d;\"\t%c",
  25. name.String(), name.Position.Filename, name.Position.Line, kind))
  26. }
  27.  
  28. func main() {
  29. parse_files()
  30.  
  31. println("!_TAG_FILE_SORTED\t1\t")
  32. sa := tags.Data()
  33. sort.SortStrings(sa)
  34. for _, s := range sa {
  35. println(s)
  36. }
  37. }
  38.  
  39. const FUNC, TYPE, VAR = 'f', 't', 'v'
  40.  
  41. func parse_files() {
  42. for i, m := 1, len(os.Args); i < m; i++ {
  43. tree, ok := parser.ParseFile(os.Args[i], nil, nil, 0)
  44. if ok != nil {
  45. panic("error parsing file" + os.Args[i] + ok.String())
  46. }
  47.  
  48. for _, node := range tree.Decls {
  49. switch n := node.(type) {
  50. case *ast.FuncDecl:
  51. output_tag(n.Name, FUNC)
  52. case *ast.GenDecl:
  53. do_gen_decl(n)
  54. }
  55. }
  56. }
  57.  
  58. }
  59.  
  60. func do_gen_decl(node *ast.GenDecl) {
  61. for _, v := range node.Specs {
  62. switch n := v.(type) {
  63. case *ast.TypeSpec:
  64. output_tag(n.Name, TYPE)
  65.  
  66. case *ast.ValueSpec:
  67. for _, vv := range n.Names {
  68. output_tag(vv, VAR)
  69. }
  70. }
  71. }
  72. }
Add Comment
Please, Sign In to add comment