Skip to content

Instantly share code, notes, and snippets.

@hiroakis
Created December 14, 2018 12:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hiroakis/d018eaf6bd126c67583345d4a8fb015b to your computer and use it in GitHub Desktop.
Save hiroakis/d018eaf6bd126c67583345d4a8fb015b to your computer and use it in GitHub Desktop.
ast
package main
import (
"bytes"
"fmt"
"go/ast"
"go/parser"
"go/token"
"io"
"log"
"os"
"strings"
)
func parse(src io.Reader) error {
var (
node *ast.File
err error
)
fset := token.NewFileSet()
if file, ok := src.(*os.File); ok {
node, err = parser.ParseFile(fset, file.Name(), nil, parser.Mode(0))
if err != nil {
return err
}
} else {
dst := new(bytes.Buffer)
io.Copy(dst, src)
node, err = parser.ParseFile(fset, "file.go", dst, parser.Mode(0))
if err != nil {
return err
}
}
ast.Inspect(node, func(n ast.Node) bool {
switch x := n.(type) {
case *ast.BasicLit:
if strings.HasPrefix(strings.TrimSpace(x.Value), "") {
fmt.Println("====================================")
fmt.Printf("%+v\n", strings.TrimSpace(x.Value))
}
}
return true
})
return nil
}
func main() {
if len(os.Args) < 2 {
os.Exit(1)
}
for i := 1; i < len(os.Args); i++ {
f, err := os.Open(os.Args[i])
if err != nil {
log.Fatal(err)
}
defer f.Close()
parse(f)
}
}
package main
import (
"strings"
"testing"
)
func TestParse(t *testing.T) {
r := strings.NewReader(dummyGoFile)
err := parse(r)
if err != nil {
t.Fatal(err)
}
}
var dummyGoFile = `
package main
import (
"database/sql"
"fmt"
)
func sendSQL() (int64, error) {
var id int
err := sql.DB.QueryRow("select * from table_name").Scan(&id)
if err != nil {
return 0, err
}
return id, nil
}
func main() {
fmt.Println("abcdefgh")
}
`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment