Skip to content

Instantly share code, notes, and snippets.

@alexeldeib
Created December 8, 2019 18:42
Show Gist options
  • Save alexeldeib/cd650b57f1ea5b9a30227ec37d6dc4cd to your computer and use it in GitHub Desktop.
Save alexeldeib/cd650b57f1ea5b9a30227ec37d6dc4cd to your computer and use it in GitHub Desktop.
ast parsing
package main
import (
"bytes"
"fmt"
"go/ast"
"go/format"
"go/parser"
"go/token"
"log"
"os"
// "go/ast"
)
func main() {
root := "../azure-sdk-for-go/services/preview/network/mgmt/2015-05-01-preview/network"
// fset := token.NewFileSet()
// if err := filepath.Walk(root, walk); err != nil {
// log.Fatal(err)
// }
// pkgs, err := parser.ParseDir(fset, root, nil, 0)
// if err != nil {
// log.Fatal(err)
// }
// for _, pkg := range pkgs {
// for name := range pkg.Files {
// fmt.Println(name)
// }
// }
path := fmt.Sprintf("%s/models.go", root)
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, path, nil, 0)
if err != nil {
log.Fatal(err)
}
structs := getTypeSpecs(fset, f)
_ = structs
for _, val := range structs {
fmt.Println(val.Name)
var buf bytes.Buffer
if err := format.Node(&buf, fset, val); err != nil {
log.Fatal(err)
}
fmt.Println(buf.String())
// os.Exit(1)
}
return
}
func walk(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// if !info.IsDir() {
// if err := parseFile(path); err != nil {
// return err
// }
// }
return nil
}
func getTypeSpecs(fset *token.FileSet, f *ast.File) []*ast.TypeSpec {
typeSpecs := make([]*ast.TypeSpec, 0)
for _, val := range f.Decls {
decl, ok := val.(*ast.GenDecl)
if !ok {
continue
}
if decl.Tok != token.TYPE {
continue
}
typeSpec, ok := decl.Specs[0].(*ast.TypeSpec)
if !ok {
continue
}
typeSpecs = append(typeSpecs, typeSpec)
}
return typeSpecs
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment