From 2a20049ea771d93f4852f6a7697c649753a877df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Trinqu=C3=A9?= Date: Mon, 10 Oct 2022 14:50:55 +0200 Subject: [PATCH] fix: Prevent type parsing to interfere with package name in typescript generation (#1942) Before that fix: The method... ```go func (h *Handler) RespondToInteraction(interaction interactor.Interaction) {} ``` ... would generate... ```ts export function RespondToInteraction(arg1:number):Promise; ``` ... because the `interaction` package starts with `int` and anything starting with `int` is interpreted as `number`. --- .../binding_conflicting_package_name_test.go | 64 +++++++++++++++++++ .../binding_test_import/float_package/type.go | 5 ++ .../binding_test_import/int_package/type.go | 5 ++ .../binding_test_import/map_package/type.go | 5 ++ .../binding_test_import/uint_package/type.go | 5 ++ v2/internal/binding/generate.go | 15 +++-- 6 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 v2/internal/binding/binding_test/binding_conflicting_package_name_test.go create mode 100644 v2/internal/binding/binding_test/binding_test_import/float_package/type.go create mode 100644 v2/internal/binding/binding_test/binding_test_import/int_package/type.go create mode 100644 v2/internal/binding/binding_test/binding_test_import/map_package/type.go create mode 100644 v2/internal/binding/binding_test/binding_test_import/uint_package/type.go diff --git a/v2/internal/binding/binding_test/binding_conflicting_package_name_test.go b/v2/internal/binding/binding_test/binding_conflicting_package_name_test.go new file mode 100644 index 00000000..2309d6da --- /dev/null +++ b/v2/internal/binding/binding_test/binding_conflicting_package_name_test.go @@ -0,0 +1,64 @@ +package binding_test + +import ( + "io/fs" + "os" + "testing" + + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/float_package" + "github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/int_package" + "github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/map_package" + "github.com/wailsapp/wails/v2/internal/binding/binding_test/binding_test_import/uint_package" + "github.com/wailsapp/wails/v2/internal/logger" +) + +const expectedBindings = `// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT +import {float_package} from '../models'; +import {int_package} from '../models'; +import {map_package} from '../models'; +import {uint_package} from '../models'; + +export function StartingWithFloat(arg1:float_package.SomeStruct):Promise; + +export function StartingWithInt(arg1:int_package.SomeStruct):Promise; + +export function StartingWithMap(arg1:map_package.SomeStruct):Promise; + +export function StartingWithUint(arg1:uint_package.SomeStruct):Promise; +` + +type HandlerTest struct{} + +func (h *HandlerTest) StartingWithInt(_ int_package.SomeStruct) {} +func (h *HandlerTest) StartingWithFloat(_ float_package.SomeStruct) {} +func (h *HandlerTest) StartingWithUint(_ uint_package.SomeStruct) {} +func (h *HandlerTest) StartingWithMap(_ map_package.SomeStruct) {} + +func TestConflictingPackageName(t *testing.T) { + // given + generationDir := t.TempDir() + + // setup + testLogger := &logger.Logger{} + b := binding.NewBindings(testLogger, []interface{}{&HandlerTest{}}, []interface{}{}, false) + + // then + err := b.GenerateGoBindings(generationDir) + if err != nil { + t.Fatalf("could not generate the Go bindings: %v", err) + } + + // then + rawGeneratedBindings, err := fs.ReadFile(os.DirFS(generationDir), "binding_test/HandlerTest.d.ts") + if err != nil { + t.Fatalf("could not read the generated bindings: %v", err) + } + + // then + generatedBindings := string(rawGeneratedBindings) + if generatedBindings != expectedBindings { + t.Fatalf("the generated bindings does not match the expected ones.\nWanted:\n%s\n\nGot:\n%s", expectedBindings, generatedBindings) + } +} diff --git a/v2/internal/binding/binding_test/binding_test_import/float_package/type.go b/v2/internal/binding/binding_test/binding_test_import/float_package/type.go new file mode 100644 index 00000000..66a20304 --- /dev/null +++ b/v2/internal/binding/binding_test/binding_test_import/float_package/type.go @@ -0,0 +1,5 @@ +package float_package + +type SomeStruct struct { + Name string `json:"string"` +} diff --git a/v2/internal/binding/binding_test/binding_test_import/int_package/type.go b/v2/internal/binding/binding_test/binding_test_import/int_package/type.go new file mode 100644 index 00000000..bff29946 --- /dev/null +++ b/v2/internal/binding/binding_test/binding_test_import/int_package/type.go @@ -0,0 +1,5 @@ +package int_package + +type SomeStruct struct { + Name string `json:"string"` +} diff --git a/v2/internal/binding/binding_test/binding_test_import/map_package/type.go b/v2/internal/binding/binding_test/binding_test_import/map_package/type.go new file mode 100644 index 00000000..34303757 --- /dev/null +++ b/v2/internal/binding/binding_test/binding_test_import/map_package/type.go @@ -0,0 +1,5 @@ +package map_package + +type SomeStruct struct { + Name string `json:"string"` +} diff --git a/v2/internal/binding/binding_test/binding_test_import/uint_package/type.go b/v2/internal/binding/binding_test/binding_test_import/uint_package/type.go new file mode 100644 index 00000000..dd55675f --- /dev/null +++ b/v2/internal/binding/binding_test/binding_test_import/uint_package/type.go @@ -0,0 +1,5 @@ +package uint_package + +type SomeStruct struct { + Name string `json:"string"` +} diff --git a/v2/internal/binding/generate.go b/v2/internal/binding/generate.go index 6921ae34..9793e77f 100644 --- a/v2/internal/binding/generate.go +++ b/v2/internal/binding/generate.go @@ -120,6 +120,16 @@ func (b *Bindings) GenerateGoBindings(baseDir string) error { } func goTypeToJSDocType(input string, importNamespaces *slicer.StringSlicer) string { + // Verifying this first to ensure we are not converting a type + // coming from a package that has a name matching a golang type, such as: + // - interactor -> int + // - mapper -> map + if strings.ContainsRune(input, '.') { + namespace := getPackageName(input) + importNamespaces.Add(namespace) + return namespace + "." + strings.Split(input, ".")[1] + } + switch true { case input == "interface {}" || input == "interface{}": return "any" @@ -150,11 +160,6 @@ func goTypeToJSDocType(input string, importNamespaces *slicer.StringSlicer) stri arrayType := goTypeToJSDocType(input[2:], importNamespaces) return "Array<" + arrayType + ">" default: - if strings.ContainsRune(input, '.') { - namespace := getPackageName(input) - importNamespaces.Add(namespace) - return namespace + "." + strings.Split(input, ".")[1] - } return "any" } }