mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 05:00:31 +08:00
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<Error>; ``` ... because the `interaction` package starts with `int` and anything starting with `int` is interpreted as `number`.
This commit is contained in:
parent
504531f340
commit
2a20049ea7
@ -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<void>;
|
||||
|
||||
export function StartingWithInt(arg1:int_package.SomeStruct):Promise<void>;
|
||||
|
||||
export function StartingWithMap(arg1:map_package.SomeStruct):Promise<void>;
|
||||
|
||||
export function StartingWithUint(arg1:uint_package.SomeStruct):Promise<void>;
|
||||
`
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package float_package
|
||||
|
||||
type SomeStruct struct {
|
||||
Name string `json:"string"`
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package int_package
|
||||
|
||||
type SomeStruct struct {
|
||||
Name string `json:"string"`
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package map_package
|
||||
|
||||
type SomeStruct struct {
|
||||
Name string `json:"string"`
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package uint_package
|
||||
|
||||
type SomeStruct struct {
|
||||
Name string `json:"string"`
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user