-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmain.go
More file actions
103 lines (95 loc) · 2.27 KB
/
Copy pathmain.go
File metadata and controls
103 lines (95 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"encoding/json"
"flag"
"fmt"
"go/ast"
"go/parser"
"go/token"
"os"
"path/filepath"
"sort"
"strings"
)
type packageInfo struct {
Path string `json:"path"`
Function []string `json:"functions"`
}
type report struct {
Headers []string `json:"headers"`
Packages []packageInfo `json:"packages"`
}
func collectHeaders(root string) ([]string, error) {
var headers []string
err := filepath.WalkDir(filepath.Join(root, "gen"), func(path string, entry os.DirEntry, err error) error {
if err != nil {
return err
}
if !entry.IsDir() && strings.HasSuffix(entry.Name(), ".h") {
rel, err := filepath.Rel(root, path)
if err != nil {
return err
}
headers = append(headers, filepath.ToSlash(rel))
}
return nil
})
sort.Strings(headers)
return headers, err
}
func collectPackage(root, pkg string) (packageInfo, error) {
fset := token.NewFileSet()
out := packageInfo{Path: filepath.ToSlash(pkg)}
fullPath := filepath.Join(root, pkg)
entries, err := os.ReadDir(fullPath)
if err != nil {
return out, err
}
for _, entry := range entries {
if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".go") || strings.HasSuffix(entry.Name(), "_test.go") {
continue
}
file, err := parser.ParseFile(fset, filepath.Join(fullPath, entry.Name()), nil, 0)
if err != nil {
return out, err
}
for _, decl := range file.Decls {
fn, ok := decl.(*ast.FuncDecl)
if ok && fn.Name.IsExported() {
out.Function = append(out.Function, fn.Name.Name)
}
}
}
sort.Strings(out.Function)
return out, nil
}
func buildReport(root string) (report, error) {
headers, err := collectHeaders(root)
if err != nil {
return report{}, err
}
packages := make([]packageInfo, 0, 2)
for _, pkg := range []string{"pkg/mxsml", "pkg/mxsmlextension"} {
info, err := collectPackage(root, pkg)
if err != nil {
return report{}, err
}
packages = append(packages, info)
}
return report{Headers: headers, Packages: packages}, nil
}
func main() {
root := flag.String("root", ".", "repository root")
flag.Parse()
out, err := buildReport(*root)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
encoded, err := json.MarshalIndent(out, "", " ")
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
fmt.Println(string(encoded))
}