Path: blob/dev/pkg/js/devtools/tsgen/astutil.go
2070 views
package tsgen12import (3"fmt"4"go/ast"5"strings"6)78// isExported checks if the given name is exported9func isExported(name string) bool {10return ast.IsExported(name)11}1213// exprToString converts an expression to a string14func exprToString(expr ast.Expr) string {15switch t := expr.(type) {16case *ast.Ident:17return toTsTypes(t.Name)18case *ast.SelectorExpr:19return exprToString(t.X) + "." + t.Sel.Name20case *ast.StarExpr:21return exprToString(t.X)22case *ast.ArrayType:23return toTsTypes("[]" + exprToString(t.Elt))24case *ast.InterfaceType:25return "interface{}"26case *ast.MapType:27return "Record<" + toTsTypes(exprToString(t.Key)) + ", " + toTsTypes(exprToString(t.Value)) + ">"28// Add more cases to handle other types29default:30return fmt.Sprintf("%T", expr)31}32}3334// toTsTypes converts Go types to TypeScript types35func toTsTypes(t string) string {36if strings.Contains(t, "interface{}") {37return "any"38}39if strings.HasPrefix(t, "map[") {40return convertMaptoRecord(t)41}42switch t {43case "string":44return "string"45case "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64":46return "number"47case "float32", "float64":48return "number"49case "bool":50return "boolean"51case "[]byte":52return "Uint8Array"53case "interface{}":54return "any"55case "time.Duration":56return "number"57case "time.Time":58return "Date"59default:60if strings.HasPrefix(t, "[]") {61return toTsTypes(strings.TrimPrefix(t, "[]")) + "[]"62}63return t64}65}6667func TsDefaultValue(t string) string {68switch t {69case "string":70return `""`71case "number":72return `0`73case "boolean":74return `false`75case "Uint8Array":76return `new Uint8Array(8)`77case "any":78return `undefined`79case "interface{}":80return `undefined`81default:82if strings.Contains(t, "[]") {83return `[]`84}85return "new " + t + "()"86}87}8889// Ternary is a ternary operator for strings90func Ternary(condition bool, trueVal, falseVal string) string {91if condition {92return trueVal93}94return falseVal95}9697// checkCanFail checks if a function can fail98func checkCanFail(fn *ast.FuncDecl) bool {99if fn.Type.Results != nil {100for _, result := range fn.Type.Results.List {101// Check if any of the return types is an error102if ident, ok := result.Type.(*ast.Ident); ok && ident.Name == "error" {103return true104}105}106}107return false108}109110111