diff --git a/tools/gen_shims/main.go b/tools/gen_shims/main.go index 2ce59a0c..38fc4cc1 100644 --- a/tools/gen_shims/main.go +++ b/tools/gen_shims/main.go @@ -3,7 +3,6 @@ package main import ( "bytes" "fmt" - "github.com/go-json-experiment/json" "go/types" "log" "maps" @@ -12,6 +11,8 @@ import ( "slices" "strings" + "github.com/go-json-experiment/json" + "golang.org/x/text/cases" "golang.org/x/text/language" "golang.org/x/tools/go/packages" @@ -19,6 +20,24 @@ import ( const tsgoInternalPrefix = "github.com/microsoft/typescript-go/internal/" +func signatureHasUnexportedType(t types.Signature) bool { + if params := t.Params(); params != nil { + for i := range params.Len() { + ty := params.At(i).Type() + + if ptrType, ok := ty.(*types.Pointer); ok { + ty = ptrType.Elem() + } + if named, ok := ty.(*types.Named); ok { + if !named.Obj().Exported() { + return true + } + } + } + } + return false +} + type ExtraShim struct { ExtraFunctions []string ExtraMethods map[string]([]string) @@ -128,6 +147,10 @@ func main() { // linking to functions with generics is not supported in go:linkname return false } + if signatureHasUnexportedType(*fn.Signature()) { + fmt.Fprintf(os.Stderr, "Skipping %s.%s: references unexported types\n", fn.Pkg().Name(), fn.Name()) + return false + } name := cases.Title(language.English, cases.NoLower).String(fn.Name()) emitGoLinknameDirective(name, fn) shimBuilder.WriteString("func ")