Path: blob/dev/pkg/js/devtools/scrapefuncs/main.go
2070 views
package main12import (3"flag"4"fmt"5"go/ast"6"go/parser"7"go/token"8"os"9"path/filepath"10"sort"11"strings"1213"golang.org/x/exp/maps"14)1516var (17dir string18out string19)2021type DSLHelperFunc struct {22Name string23Description string24Signatures []string25}2627var pkg2NameMapping = map[string]string{28"code": "Code Protocol",29"javascript": "JavaScript Protocol",30"global": "Javascript Runtime",31"compiler": "Javascript Runtime",32"flow": "Template Flow",33}3435var preferredOrder = []string{"Javascript Runtime", "Template Flow", "Code Protocol", "JavaScript Protocol"}3637func main() {38flag.StringVar(&dir, "dir", "pkg/", "directory to process")39flag.StringVar(&out, "out", "", "output markdown file with helper file declarations")40flag.Parse()4142dirList := []string{}4344if err := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {45if err != nil {46return err47}4849if d.IsDir() {50dirList = append(dirList, path)51}52return nil53}); err != nil {54panic(err)55}5657dslHelpers := map[string][]DSLHelperFunc{}5859//for _, pkg := range pkgs {60for _, dir := range dirList {61fset := token.NewFileSet()62list, err := os.ReadDir(dir)63if err != nil {64fmt.Println(err)65return66}6768for _, f := range list {69if f.IsDir() {70continue71}72if !strings.HasSuffix(f.Name(), ".go") {73continue74}7576astFile, err := parser.ParseFile(fset, filepath.Join(dir, f.Name()), nil, parser.AllErrors|parser.SkipObjectResolution)77if err != nil {78fmt.Println(err)79return80}8182ast.Inspect(astFile, func(n ast.Node) bool {83switch x := n.(type) {84case *ast.CallExpr:85if sel, ok := x.Fun.(*ast.SelectorExpr); ok {86if sel.Sel.Name == "RegisterFuncWithSignature" {87hf := DSLHelperFunc{}88for _, arg := range x.Args {89if kv, ok := arg.(*ast.CompositeLit); ok {90for _, elt := range kv.Elts {91if kv, ok := elt.(*ast.KeyValueExpr); ok {92key := kv.Key.(*ast.Ident).Name93switch key {94case "Name":95hf.Name = strings.Trim(kv.Value.(*ast.BasicLit).Value, `"`)96case "Description":97hf.Description = strings.Trim(kv.Value.(*ast.BasicLit).Value, `"`)98case "Signatures":99if comp, ok := kv.Value.(*ast.CompositeLit); ok {100for _, signature := range comp.Elts {101hf.Signatures = append(hf.Signatures, strings.Trim(signature.(*ast.BasicLit).Value, `"`))102}103}104}105}106}107}108}109if hf.Name != "" {110identifier := pkg2NameMapping[astFile.Name.Name]111if identifier == "" {112identifier = astFile.Name.Name + " (" + dir + ")"113}114115if dslHelpers[identifier] == nil {116dslHelpers[identifier] = []DSLHelperFunc{}117}118dslHelpers[identifier] = append(dslHelpers[identifier], hf)119}120}121}122}123return true124})125}126}127128// DSL Helper functions stats129for pkg, funcs := range dslHelpers {130fmt.Printf("Found %d DSL Helper functions in package %s\n", len(funcs), pkg)131}132133// Generate Markdown tables with ## as package name134if out != "" {135var sb strings.Builder136sb.WriteString(`---137title: "Javascript Helper Functions"138description: "Available JS Helper Functions that can be used in global js runtime & protocol specific helpers."139icon: "function"140iconType: "solid"141---142143144`)145146actualKeys := maps.Keys(dslHelpers)147sort.Slice(actualKeys, func(i, j int) bool {148for _, preferredKey := range preferredOrder {149if actualKeys[i] == preferredKey {150return true151}152if actualKeys[j] == preferredKey {153return false154}155}156return actualKeys[i] < actualKeys[j]157})158159for _, v := range actualKeys {160pkg := v161funcs := dslHelpers[pkg]162sb.WriteString("## " + pkg + "\n\n")163sb.WriteString("| Name | Description | Signatures |\n")164sb.WriteString("|------|-------------|------------|\n")165for _, f := range funcs {166sigSlice := []string{}167for _, sig := range f.Signatures {168sigSlice = append(sigSlice, "`"+sig+"`")169}170sb.WriteString(fmt.Sprintf("| %s | %s | %s |\n", f.Name, f.Description, strings.Join(sigSlice, ", ")))171}172sb.WriteString("\n")173}174175if err := os.WriteFile(out, []byte(sb.String()), 0644); err != nil {176fmt.Println(err)177return178}179}180}181182183