diff --git a/v3/go.sum b/v3/go.sum index d1f621455..f1235ca25 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -65,14 +65,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= -github.com/atterpac/refresh v0.1.0 h1:vFdy+4+Q4X7ENyemskVpGFCGAUt8zi0S05vX1O5tfq8= -github.com/atterpac/refresh v0.1.0/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= -github.com/atterpac/refresh v0.2.1 h1:xWI4PsP88wFJueMq8DscZg+IA3pxMoaS9g8/Gl+p85I= -github.com/atterpac/refresh v0.2.1/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= -github.com/atterpac/refresh v0.2.2 h1:PD+zKYz4LBViPzLUqLPm9p6aiRr6vNd1m1UTHsx8ln8= -github.com/atterpac/refresh v0.2.2/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= -github.com/atterpac/refresh v0.2.3 h1:bV6VGbeUTUFiTvYGKadPZIfIWKhXgUbadHSp8r86JIo= -github.com/atterpac/refresh v0.2.3/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= github.com/atterpac/refresh v0.2.4 h1:rTD9qchbLa0qPIVr+qpyqkePe6+1Cs14ETXDguEvttI= github.com/atterpac/refresh v0.2.4/go.mod h1:KiBQUk5h76Z3Yvw/k3Ys2JGDrKmKmflwS9XB6B5N9qY= github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= @@ -95,6 +87,7 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5770OhYUVes= github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= @@ -369,8 +362,6 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmclane/purego v0.0.0-20230818202843-0b72c8c9140f h1:/HXk9aFXP97CJRzOIphm4pzySmJLqIMhKu1kD5usz1E= -github.com/tmclane/purego v0.0.0-20230818202843-0b72c8c9140f/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= github.com/wailsapp/go-webview2 v1.0.9 h1:lrU+q0cf1wgLdR69rN+ZnRtMJNaJRrcQ4ELxoO7/xjs= github.com/wailsapp/go-webview2 v1.0.9/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= diff --git a/v3/internal/flags/bindings.go b/v3/internal/flags/bindings.go index 4f287461f..9bb570e72 100644 --- a/v3/internal/flags/bindings.go +++ b/v3/internal/flags/bindings.go @@ -8,5 +8,6 @@ type GenerateBindingsOptions struct { TSSuffix string `description:"The postfix for the typescript names" default:""` UseInterfaces bool `name:"i" description:"Use interfaces instead of classes"` ProjectDirectory string `name:"p" description:"The project directory" default:"."` + UseIDs bool `name:"ids" description:"Use IDs instead of names in the binding calls"` OutputDirectory string `name:"d" description:"The output directory" default:"frontend/bindings"` } diff --git a/v3/internal/parser/bindings.go b/v3/internal/parser/bindings.go index 7390c6680..656e2e113 100644 --- a/v3/internal/parser/bindings.go +++ b/v3/internal/parser/bindings.go @@ -22,7 +22,11 @@ const bindingTemplate = ` * @param names {string} * @returns {Promise} **/ - {{methodName}}: function({{inputs}}) { return wails.CallByID({{ID}}, ...Array.prototype.slice.call(arguments, 0)); }, +` + +const callByID = ` {{methodName}}: function({{inputs}}) { return wails.CallByID({{ID}}, ...Array.prototype.slice.call(arguments, 0)); }, +` +const callByName = ` {{methodName}}: function({{inputs}}) { return wails.CallByName("{{Name}}", ...Array.prototype.slice.call(arguments, 0)); }, ` const enumTemplate = ` @@ -108,12 +112,24 @@ func sanitiseJSVarName(name string) string { return name } -func GenerateBinding(structName string, method *BoundMethod) (string, []string, []string) { +func GenerateBinding(structName string, method *BoundMethod, useIDs bool) (string, []string, []string) { var namespacedStructs []string var models []string - result := strings.ReplaceAll(bindingTemplate, "{{structName}}", structName) + template := bindingTemplate + if useIDs { + template += callByID + } else { + template += callByName + } + result := strings.ReplaceAll(template, "{{structName}}", structName) result = strings.ReplaceAll(result, "{{methodName}}", method.Name) result = strings.ReplaceAll(result, "{{ID}}", fmt.Sprintf("%v", method.ID)) + + // get last part of method.Package path + parts := strings.Split(method.Package, "/") + packageName := parts[len(parts)-1] + + result = strings.ReplaceAll(result, "{{Name}}", fmt.Sprintf("%v.%v.%v", packageName, structName, method.Name)) comments := strings.TrimSpace(method.DocComment) if comments != "" { comments = " " + comments @@ -224,7 +240,7 @@ func normalisePackageNames(packageNames []string) map[string]string { return result } -func GenerateBindings(bindings map[string]map[string][]*BoundMethod) map[string]string { +func GenerateBindings(bindings map[string]map[string][]*BoundMethod, useIDs bool) map[string]string { var result = make(map[string]string) @@ -246,7 +262,7 @@ func GenerateBindings(bindings map[string]map[string][]*BoundMethod) map[string] return methods[i].Name < methods[j].Name }) for _, method := range methods { - thisBinding, models, namespacedStructs := GenerateBinding(structName, method) + thisBinding, models, namespacedStructs := GenerateBinding(structName, method, useIDs) allNamespacedStructs = append(allNamespacedStructs, namespacedStructs...) allModels = append(allModels, models...) result[normalisedPackageNames[packageName]] += thisBinding diff --git a/v3/internal/parser/bindings_test.go b/v3/internal/parser/bindings_test.go index 15c2495a6..ac2be3987 100644 --- a/v3/internal/parser/bindings_test.go +++ b/v3/internal/parser/bindings_test.go @@ -24,20 +24,39 @@ func getFile(filename string) string { func TestGenerateBindings(t *testing.T) { tests := []struct { - dir string - want map[string]string + dir string + want map[string]string + useIDs bool }{ { "testdata/enum", map[string]string{ "main": getFile("testdata/enum/bindings_main.js"), }, + true, + }, + { + "testdata/enum", + map[string]string{ + "main": getFile("testdata/enum/bindings_main.name.js"), + }, + false, + }, + // TODO: Fix this test to pull in enum + { + "testdata/enum_from_imported_package", + map[string]string{ + "main": getFile("testdata/enum_from_imported_package/bindings_main.js"), + "services": getFile("testdata/enum_from_imported_package/bindings_services.js"), + }, + true, }, { "testdata/function_single", map[string]string{ "main": getFile("testdata/function_single/bindings_main.js"), }, + true, }, { "testdata/function_from_imported_package", @@ -45,18 +64,21 @@ func TestGenerateBindings(t *testing.T) { "main": getFile("testdata/function_from_imported_package/bindings_main.js"), "services": getFile("testdata/function_from_imported_package/bindings_services.js"), }, + true, }, { "testdata/variable_single", map[string]string{ "main": getFile("testdata/variable_single/bindings_main.js"), }, + true, }, { "testdata/variable_single_from_function", map[string]string{ "main": getFile("testdata/variable_single_from_function/bindings_main.js"), }, + true, }, { "testdata/variable_single_from_other_function", @@ -64,18 +86,21 @@ func TestGenerateBindings(t *testing.T) { "main": getFile("testdata/variable_single_from_other_function/bindings_main.js"), "services": getFile("testdata/variable_single_from_other_function/bindings_services.js"), }, + true, }, { "testdata/struct_literal_single", map[string]string{ "main": getFile("testdata/struct_literal_single/bindings_main.js"), }, + true, }, { "testdata/struct_literal_multiple", map[string]string{ "main": getFile("testdata/struct_literal_multiple/bindings_main.js"), }, + true, }, { "testdata/struct_literal_multiple_other", @@ -83,12 +108,14 @@ func TestGenerateBindings(t *testing.T) { "main": getFile("testdata/struct_literal_multiple_other/bindings_main.js"), "services": getFile("testdata/struct_literal_multiple_other/bindings_services.js"), }, + true, }, { "testdata/struct_literal_multiple_files", map[string]string{ "main": getFile("testdata/struct_literal_multiple_files/bindings_main.js"), }, + true, }, } for _, tt := range tests { @@ -101,7 +128,7 @@ func TestGenerateBindings(t *testing.T) { } // Generate Bindings - got := GenerateBindings(project.BoundMethods) + got := GenerateBindings(project.BoundMethods, tt.useIDs) for name, binding := range got { // check if the binding is in the expected bindings diff --git a/v3/internal/parser/parser.go b/v3/internal/parser/parser.go index acbac3fd2..0c276d03e 100644 --- a/v3/internal/parser/parser.go +++ b/v3/internal/parser/parser.go @@ -117,6 +117,7 @@ func (p *Parameter) JSType() string { } type BoundMethod struct { + Package string Name string DocComment string Inputs []*Parameter @@ -276,7 +277,12 @@ type Stats struct { } func ParseProject(projectPath string) (*Project, error) { + absPath, err := filepath.Abs(projectPath) + if err != nil { + return nil, err + } result := &Project{ + Path: absPath, BoundMethods: make(map[packagePath]map[structName][]*BoundMethod), packageCache: make(map[string]*ParsedPackage), } @@ -314,7 +320,7 @@ func GenerateBindingsAndModels(options *flags.GenerateBindingsOptions) error { return err } p.Stats.NumMethods = len(p.BoundMethods) - generatedMethods := GenerateBindings(p.BoundMethods) + generatedMethods := GenerateBindings(p.BoundMethods, options.UseIDs) for pkg, text := range generatedMethods { // Write the file err = os.WriteFile(filepath.Join(options.OutputDirectory, pkg+".js"), []byte(text), 0644) @@ -590,8 +596,9 @@ func (p *Project) parseBoundStructMethods(name string, pkg *ParsedPackage) error if err != nil { return err } - // Add the method to the list of methods + method := &BoundMethod{ + Package: pkg.Path, ID: id, Name: funcDecl.Name.Name, DocComment: strings.TrimSpace(funcDecl.Doc.Text()), @@ -1063,6 +1070,10 @@ func (p *Project) parseConstDeclaration(decl *ast.GenDecl, pkg *ParsedPackage) { } } +func (p *Project) RelativePackageDir(path string) string { + return strings.TrimPrefix(path, p.Path) +} + func getTypeString(expr ast.Expr) string { switch t := expr.(type) { case *ast.Ident: diff --git a/v3/internal/parser/parser_enum_test.go b/v3/internal/parser/parser_enum_test.go index c08bf157f..10787cdb8 100644 --- a/v3/internal/parser/parser_enum_test.go +++ b/v3/internal/parser/parser_enum_test.go @@ -25,6 +25,7 @@ func TestParseEnum(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet does XYZ", Inputs: []*Parameter{ @@ -56,6 +57,7 @@ func TestParseEnum(t *testing.T) { ID: 1411160069, }, { + Package: "main", Name: "NewPerson", DocComment: "NewPerson creates a new person", Inputs: []*Parameter{ @@ -147,6 +149,7 @@ func TestParseEnum(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet does XYZ", Inputs: []*Parameter{ @@ -178,6 +181,7 @@ func TestParseEnum(t *testing.T) { ID: 1411160069, }, { + Package: "main", Name: "NewPerson", DocComment: "NewPerson creates a new person", Inputs: []*Parameter{ diff --git a/v3/internal/parser/parser_function_test.go b/v3/internal/parser/parser_function_test.go index f19e797f4..af1428551 100644 --- a/v3/internal/parser/parser_function_test.go +++ b/v3/internal/parser/parser_function_test.go @@ -25,6 +25,7 @@ func TestParseFunction(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet someone", Inputs: []*Parameter{ @@ -59,6 +60,7 @@ func TestParseFunction(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet does XYZ", Inputs: []*Parameter{ @@ -82,6 +84,7 @@ func TestParseFunction(t *testing.T) { ID: 1411160069, }, { + Package: "main", Name: "NewPerson", DocComment: "NewPerson creates a new person", Inputs: []*Parameter{ @@ -111,7 +114,8 @@ func TestParseFunction(t *testing.T) { "github.com/wailsapp/wails/v3/internal/parser/testdata/variable_single_from_other_function/services": { "OtherService": { { - Name: "Yay", + Package: "github.com/wailsapp/wails/v3/internal/parser/testdata/variable_single_from_other_function/services", + Name: "Yay", Outputs: []*Parameter{ { Type: &ParameterType{ diff --git a/v3/internal/parser/parser_struct_literal_multiple_test.go b/v3/internal/parser/parser_struct_literal_multiple_test.go index 59eec6f42..5a35710d0 100644 --- a/v3/internal/parser/parser_struct_literal_multiple_test.go +++ b/v3/internal/parser/parser_struct_literal_multiple_test.go @@ -24,6 +24,7 @@ func TestParseStructLiteralMultiple(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "", Inputs: []*Parameter{ @@ -49,8 +50,9 @@ func TestParseStructLiteralMultiple(t *testing.T) { }, "OtherService": { { - Name: "Hello", - ID: 4249972365, + Package: "main", + Name: "Hello", + ID: 4249972365, }, }, }, @@ -64,6 +66,7 @@ func TestParseStructLiteralMultiple(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "", Inputs: []*Parameter{ @@ -89,8 +92,9 @@ func TestParseStructLiteralMultiple(t *testing.T) { }, "OtherService": { { - Name: "Hello", - ID: 4249972365, + Package: "main", + Name: "Hello", + ID: 4249972365, }, }, }, @@ -105,6 +109,7 @@ func TestParseStructLiteralMultiple(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet does XYZ", Inputs: []*Parameter{ @@ -128,6 +133,7 @@ func TestParseStructLiteralMultiple(t *testing.T) { ID: 1411160069, }, { + Package: "main", Name: "NewPerson", DocComment: "NewPerson creates a new person", Inputs: []*Parameter{ @@ -157,7 +163,8 @@ func TestParseStructLiteralMultiple(t *testing.T) { "github.com/wailsapp/wails/v3/internal/parser/testdata/struct_literal_multiple_other/services": { "OtherService": { { - Name: "Yay", + Package: "github.com/wailsapp/wails/v3/internal/parser/testdata/struct_literal_multiple_other/services", + Name: "Yay", Outputs: []*Parameter{ { Type: &ParameterType{ diff --git a/v3/internal/parser/parser_struct_literal_non_pointer_single_test.go b/v3/internal/parser/parser_struct_literal_non_pointer_single_test.go index b99affd98..11c2ef280 100644 --- a/v3/internal/parser/parser_struct_literal_non_pointer_single_test.go +++ b/v3/internal/parser/parser_struct_literal_non_pointer_single_test.go @@ -24,6 +24,7 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet someone", Inputs: []*Parameter{ @@ -47,6 +48,7 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1411160069, }, { + Package: "main", Name: "NoInputsStringOut", DocComment: "", Inputs: nil, @@ -62,7 +64,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1075577233, }, { - Name: "StringArrayInputStringOut", + Package: "main", + Name: "StringArrayInputStringOut", Inputs: []*Parameter{ { Name: "in", @@ -84,7 +87,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1091960237, }, { - Name: "StringArrayInputStringArrayOut", + Package: "main", + Name: "StringArrayInputStringArrayOut", Inputs: []*Parameter{ { Name: "in", @@ -107,7 +111,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 383995060, }, { - Name: "StringArrayInputNamedOutput", + Package: "main", + Name: "StringArrayInputNamedOutput", Inputs: []*Parameter{ { Name: "in", @@ -131,7 +136,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 3678582682, }, { - Name: "StringArrayInputNamedOutputs", + Package: "main", + Name: "StringArrayInputNamedOutputs", Inputs: []*Parameter{ { Name: "in", @@ -162,7 +168,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 319259595, }, { - Name: "IntPointerInputNamedOutputs", + Package: "main", + Name: "IntPointerInputNamedOutputs", Inputs: []*Parameter{ { Name: "in", @@ -192,7 +199,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2718999663, }, { - Name: "UIntPointerInAndOutput", + Package: "main", + Name: "UIntPointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -215,7 +223,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1367187362, }, { - Name: "UInt8PointerInAndOutput", + Package: "main", + Name: "UInt8PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -238,7 +247,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 518250834, }, { - Name: "UInt16PointerInAndOutput", + Package: "main", + Name: "UInt16PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -261,7 +271,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1236957573, }, { - Name: "UInt32PointerInAndOutput", + Package: "main", + Name: "UInt32PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -284,7 +295,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1739300671, }, { - Name: "UInt64PointerInAndOutput", + Package: "main", + Name: "UInt64PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -307,7 +319,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1403757716, }, { - Name: "IntPointerInAndOutput", + Package: "main", + Name: "IntPointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -330,7 +343,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1066151743, }, { - Name: "Int8PointerInAndOutput", + Package: "main", + Name: "Int8PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -353,7 +367,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2189402897, }, { - Name: "Int16PointerInAndOutput", + Package: "main", + Name: "Int16PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -376,7 +391,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1754277916, }, { - Name: "Int32PointerInAndOutput", + Package: "main", + Name: "Int32PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -399,7 +415,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 4251088558, }, { - Name: "Int64PointerInAndOutput", + Package: "main", + Name: "Int64PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -422,7 +439,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2205561041, }, { - Name: "IntInIntOut", + Package: "main", + Name: "IntInIntOut", Inputs: []*Parameter{ { Name: "in", @@ -443,7 +461,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 642881729, }, { - Name: "Int8InIntOut", + Package: "main", + Name: "Int8InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -464,7 +483,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 572240879, }, { - Name: "Int16InIntOut", + Package: "main", + Name: "Int16InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -485,7 +505,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 3306292566, }, { - Name: "Int32InIntOut", + Package: "main", + Name: "Int32InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -506,7 +527,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1909469092, }, { - Name: "Int64InIntOut", + Package: "main", + Name: "Int64InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -527,7 +549,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1343888303, }, { - Name: "UIntInUIntOut", + Package: "main", + Name: "UIntInUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -548,7 +571,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2836661285, }, { - Name: "UInt8InUIntOut", + Package: "main", + Name: "UInt8InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -569,7 +593,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2988345717, }, { - Name: "UInt16InUIntOut", + Package: "main", + Name: "UInt16InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -590,7 +615,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 3401034892, }, { - Name: "UInt32InUIntOut", + Package: "main", + Name: "UInt32InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -611,7 +637,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 1160383782, }, { - Name: "UInt64InUIntOut", + Package: "main", + Name: "UInt64InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -632,7 +659,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 793803239, }, { - Name: "Float32InFloat32Out", + Package: "main", + Name: "Float32InFloat32Out", Inputs: []*Parameter{ { Name: "in", @@ -653,7 +681,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 3132595881, }, { - Name: "Float64InFloat64Out", + Package: "main", + Name: "Float64InFloat64Out", Inputs: []*Parameter{ { Name: "in", @@ -674,7 +703,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2182412247, }, { - Name: "PointerFloat32InFloat32Out", + Package: "main", + Name: "PointerFloat32InFloat32Out", Inputs: []*Parameter{ { Name: "in", @@ -697,7 +727,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 224675106, }, { - Name: "PointerFloat64InFloat64Out", + Package: "main", + Name: "PointerFloat64InFloat64Out", Inputs: []*Parameter{ { Name: "in", @@ -720,7 +751,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2124953624, }, { - Name: "BoolInBoolOut", + Package: "main", + Name: "BoolInBoolOut", Inputs: []*Parameter{ { Name: "in", @@ -741,7 +773,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2424639793, }, { - Name: "PointerBoolInBoolOut", + Package: "main", + Name: "PointerBoolInBoolOut", Inputs: []*Parameter{ { Name: "in", @@ -764,7 +797,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 3589606958, }, { - Name: "PointerStringInStringOut", + Package: "main", + Name: "PointerStringInStringOut", Inputs: []*Parameter{ { Name: "in", @@ -787,7 +821,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 229603958, }, { - Name: "StructPointerInputErrorOutput", + Package: "main", + Name: "StructPointerInputErrorOutput", Inputs: []*Parameter{ { Name: "in", @@ -810,7 +845,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2447692557, }, { - Name: "StructInputStructOutput", + Package: "main", + Name: "StructInputStructOutput", Inputs: []*Parameter{ { Name: "in", @@ -833,7 +869,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 3835643147, }, { - Name: "StructPointerInputStructPointerOutput", + Package: "main", + Name: "StructPointerInputStructPointerOutput", Inputs: []*Parameter{ { Name: "in", @@ -858,7 +895,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2943477349, }, { - Name: "MapIntInt", + Package: "main", + Name: "MapIntInt", Inputs: []*Parameter{ { Name: "in", @@ -879,7 +917,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2386486356, }, { - Name: "PointerMapIntInt", + Package: "main", + Name: "PointerMapIntInt", Inputs: []*Parameter{ { Name: "in", @@ -901,7 +940,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 3516977899, }, { - Name: "MapIntPointerInt", + Package: "main", + Name: "MapIntPointerInt", Inputs: []*Parameter{ { Name: "in", @@ -923,7 +963,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 550413585, }, { - Name: "MapIntSliceInt", + Package: "main", + Name: "MapIntSliceInt", Inputs: []*Parameter{ { Name: "in", @@ -945,7 +986,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 2900172572, }, { - Name: "MapIntSliceIntInMapIntSliceIntOut", + Package: "main", + Name: "MapIntSliceIntInMapIntSliceIntOut", Inputs: []*Parameter{ { Name: "in", @@ -985,7 +1027,8 @@ func TestParseStructLiteralNonPointerSingle(t *testing.T) { ID: 881980169, }, { - Name: "ArrayInt", + Package: "main", + Name: "ArrayInt", Inputs: []*Parameter{ { Name: "in", diff --git a/v3/internal/parser/parser_struct_literal_single_test.go b/v3/internal/parser/parser_struct_literal_single_test.go index dd3fefb3b..924eee66c 100644 --- a/v3/internal/parser/parser_struct_literal_single_test.go +++ b/v3/internal/parser/parser_struct_literal_single_test.go @@ -25,6 +25,7 @@ func TestParseStructLiteralSingle(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet someone", Inputs: []*Parameter{ @@ -48,6 +49,7 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1411160069, }, { + Package: "main", Name: "NoInputsStringOut", DocComment: "", Inputs: nil, @@ -63,7 +65,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1075577233, }, { - Name: "StringArrayInputStringOut", + Package: "main", + Name: "StringArrayInputStringOut", Inputs: []*Parameter{ { Name: "in", @@ -85,7 +88,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1091960237, }, { - Name: "StringArrayInputStringArrayOut", + Package: "main", + Name: "StringArrayInputStringArrayOut", Inputs: []*Parameter{ { Name: "in", @@ -108,7 +112,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 383995060, }, { - Name: "StringArrayInputNamedOutput", + Package: "main", + Name: "StringArrayInputNamedOutput", Inputs: []*Parameter{ { Name: "in", @@ -132,7 +137,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 3678582682, }, { - Name: "StringArrayInputNamedOutputs", + Package: "main", + Name: "StringArrayInputNamedOutputs", Inputs: []*Parameter{ { Name: "in", @@ -163,7 +169,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 319259595, }, { - Name: "IntPointerInputNamedOutputs", + Package: "main", + Name: "IntPointerInputNamedOutputs", Inputs: []*Parameter{ { Name: "in", @@ -193,7 +200,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2718999663, }, { - Name: "UIntPointerInAndOutput", + Package: "main", + Name: "UIntPointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -216,7 +224,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1367187362, }, { - Name: "UInt8PointerInAndOutput", + Package: "main", + Name: "UInt8PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -239,7 +248,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 518250834, }, { - Name: "UInt16PointerInAndOutput", + Package: "main", + Name: "UInt16PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -262,7 +272,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1236957573, }, { - Name: "UInt32PointerInAndOutput", + Package: "main", + Name: "UInt32PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -285,7 +296,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1739300671, }, { - Name: "UInt64PointerInAndOutput", + Package: "main", + Name: "UInt64PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -308,7 +320,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1403757716, }, { - Name: "IntPointerInAndOutput", + Package: "main", + Name: "IntPointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -331,7 +344,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1066151743, }, { - Name: "Int8PointerInAndOutput", + Package: "main", + Name: "Int8PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -354,7 +368,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2189402897, }, { - Name: "Int16PointerInAndOutput", + Package: "main", + Name: "Int16PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -377,7 +392,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1754277916, }, { - Name: "Int32PointerInAndOutput", + Package: "main", + Name: "Int32PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -400,7 +416,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 4251088558, }, { - Name: "Int64PointerInAndOutput", + Package: "main", + Name: "Int64PointerInAndOutput", Inputs: []*Parameter{ { Name: "in", @@ -423,7 +440,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2205561041, }, { - Name: "IntInIntOut", + Package: "main", + Name: "IntInIntOut", Inputs: []*Parameter{ { Name: "in", @@ -444,7 +462,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 642881729, }, { - Name: "Int8InIntOut", + Package: "main", + Name: "Int8InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -465,7 +484,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 572240879, }, { - Name: "Int16InIntOut", + Package: "main", + Name: "Int16InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -486,7 +506,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 3306292566, }, { - Name: "Int32InIntOut", + Package: "main", + Name: "Int32InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -507,7 +528,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1909469092, }, { - Name: "Int64InIntOut", + Package: "main", + Name: "Int64InIntOut", Inputs: []*Parameter{ { Name: "in", @@ -528,7 +550,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1343888303, }, { - Name: "UIntInUIntOut", + Package: "main", + Name: "UIntInUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -549,7 +572,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2836661285, }, { - Name: "UInt8InUIntOut", + Package: "main", + Name: "UInt8InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -570,7 +594,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2988345717, }, { - Name: "UInt16InUIntOut", + Package: "main", + Name: "UInt16InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -591,7 +616,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 3401034892, }, { - Name: "UInt32InUIntOut", + Package: "main", + Name: "UInt32InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -612,7 +638,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 1160383782, }, { - Name: "UInt64InUIntOut", + Package: "main", + Name: "UInt64InUIntOut", Inputs: []*Parameter{ { Name: "in", @@ -633,7 +660,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 793803239, }, { - Name: "Float32InFloat32Out", + Package: "main", + Name: "Float32InFloat32Out", Inputs: []*Parameter{ { Name: "in", @@ -654,7 +682,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 3132595881, }, { - Name: "Float64InFloat64Out", + Package: "main", + Name: "Float64InFloat64Out", Inputs: []*Parameter{ { Name: "in", @@ -675,7 +704,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2182412247, }, { - Name: "PointerFloat32InFloat32Out", + Package: "main", + Name: "PointerFloat32InFloat32Out", Inputs: []*Parameter{ { Name: "in", @@ -698,7 +728,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 224675106, }, { - Name: "PointerFloat64InFloat64Out", + Package: "main", + Name: "PointerFloat64InFloat64Out", Inputs: []*Parameter{ { Name: "in", @@ -721,7 +752,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2124953624, }, { - Name: "BoolInBoolOut", + Package: "main", + Name: "BoolInBoolOut", Inputs: []*Parameter{ { Name: "in", @@ -742,7 +774,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2424639793, }, { - Name: "PointerBoolInBoolOut", + Package: "main", + Name: "PointerBoolInBoolOut", Inputs: []*Parameter{ { Name: "in", @@ -765,7 +798,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 3589606958, }, { - Name: "PointerStringInStringOut", + Package: "main", + Name: "PointerStringInStringOut", Inputs: []*Parameter{ { Name: "in", @@ -788,7 +822,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 229603958, }, { - Name: "StructPointerInputErrorOutput", + Package: "main", + Name: "StructPointerInputErrorOutput", Inputs: []*Parameter{ { Name: "in", @@ -811,7 +846,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2447692557, }, { - Name: "StructInputStructOutput", + Package: "main", + Name: "StructInputStructOutput", Inputs: []*Parameter{ { Name: "in", @@ -834,7 +870,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 3835643147, }, { - Name: "StructPointerInputStructPointerOutput", + Package: "main", + Name: "StructPointerInputStructPointerOutput", Inputs: []*Parameter{ { Name: "in", @@ -859,7 +896,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2943477349, }, { - Name: "MapIntInt", + Package: "main", + Name: "MapIntInt", Inputs: []*Parameter{ { Name: "in", @@ -880,7 +918,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2386486356, }, { - Name: "PointerMapIntInt", + Package: "main", + Name: "PointerMapIntInt", Inputs: []*Parameter{ { Name: "in", @@ -902,7 +941,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 3516977899, }, { - Name: "MapIntPointerInt", + Package: "main", + Name: "MapIntPointerInt", Inputs: []*Parameter{ { Name: "in", @@ -924,7 +964,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 550413585, }, { - Name: "MapIntSliceInt", + Package: "main", + Name: "MapIntSliceInt", Inputs: []*Parameter{ { Name: "in", @@ -946,7 +987,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 2900172572, }, { - Name: "MapIntSliceIntInMapIntSliceIntOut", + Package: "main", + Name: "MapIntSliceIntInMapIntSliceIntOut", Inputs: []*Parameter{ { Name: "in", @@ -986,7 +1028,8 @@ func TestParseStructLiteralSingle(t *testing.T) { ID: 881980169, }, { - Name: "ArrayInt", + Package: "main", + Name: "ArrayInt", Inputs: []*Parameter{ { Name: "in", diff --git a/v3/internal/parser/parser_variable_single_test.go b/v3/internal/parser/parser_variable_single_test.go index 29683b470..8b5408d23 100644 --- a/v3/internal/parser/parser_variable_single_test.go +++ b/v3/internal/parser/parser_variable_single_test.go @@ -25,6 +25,7 @@ func TestParseVariableSingle(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet someone", Inputs: []*Parameter{ @@ -59,6 +60,7 @@ func TestParseVariableSingle(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet someone", Inputs: []*Parameter{ @@ -93,6 +95,7 @@ func TestParseVariableSingle(t *testing.T) { "main": { "GreetService": { { + Package: "main", Name: "Greet", DocComment: "Greet does XYZ", Inputs: []*Parameter{ @@ -116,6 +119,7 @@ func TestParseVariableSingle(t *testing.T) { ID: 1411160069, }, { + Package: "main", Name: "NewPerson", DocComment: "NewPerson creates a new person", Inputs: []*Parameter{ @@ -145,7 +149,8 @@ func TestParseVariableSingle(t *testing.T) { "github.com/wailsapp/wails/v3/internal/parser/testdata/variable_single_from_other_function/services": { "OtherService": { { - Name: "Yay", + Package: "github.com/wailsapp/wails/v3/internal/parser/testdata/variable_single_from_other_function/services", + Name: "Yay", Outputs: []*Parameter{ { Type: &ParameterType{ diff --git a/v3/internal/parser/testdata/enum-interface/bindings_main.name.js b/v3/internal/parser/testdata/enum-interface/bindings_main.name.js new file mode 100644 index 000000000..5d77e1346 --- /dev/null +++ b/v3/internal/parser/testdata/enum-interface/bindings_main.name.js @@ -0,0 +1,29 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * @typedef {import('./models').main.Title} mainTitle + * @typedef {import('./models').main.Person} mainPerson + */ + +export const GreetService = { + + /** + * GreetService.Greet + * Greet does XYZ + * @param name {string} + * @param title {mainTitle} + * @returns {Promise} + **/ + Greet: function(name, title) { return wails.CallByName("main.GreetService.Greet", ...Array.prototype.slice.call(arguments, 0)); }, + + /** + * GreetService.NewPerson + * NewPerson creates a new person + * @param name {string} + * @returns {Promise} + **/ + NewPerson: function(name) { return wails.CallByName("main.GreetService.NewPerson", ...Array.prototype.slice.call(arguments, 0)); }, +}; + diff --git a/v3/internal/parser/testdata/enum/bindings_main.name.js b/v3/internal/parser/testdata/enum/bindings_main.name.js new file mode 100644 index 000000000..5d77e1346 --- /dev/null +++ b/v3/internal/parser/testdata/enum/bindings_main.name.js @@ -0,0 +1,29 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * @typedef {import('./models').main.Title} mainTitle + * @typedef {import('./models').main.Person} mainPerson + */ + +export const GreetService = { + + /** + * GreetService.Greet + * Greet does XYZ + * @param name {string} + * @param title {mainTitle} + * @returns {Promise} + **/ + Greet: function(name, title) { return wails.CallByName("main.GreetService.Greet", ...Array.prototype.slice.call(arguments, 0)); }, + + /** + * GreetService.NewPerson + * NewPerson creates a new person + * @param name {string} + * @returns {Promise} + **/ + NewPerson: function(name) { return wails.CallByName("main.GreetService.NewPerson", ...Array.prototype.slice.call(arguments, 0)); }, +}; + diff --git a/v3/internal/parser/testdata/enum_from_imported_package/bindings_main.js b/v3/internal/parser/testdata/enum_from_imported_package/bindings_main.js index 1238a0d09..2e7716564 100644 --- a/v3/internal/parser/testdata/enum_from_imported_package/bindings_main.js +++ b/v3/internal/parser/testdata/enum_from_imported_package/bindings_main.js @@ -2,29 +2,15 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT -/** - * @typedef {import('./models').main.Person} mainPerson - */ - - -window.go = window.go || {}; -window.go.main = { - GreetService: { +export const GreetService = { /** * GreetService.Greet * Greet does XYZ - * @param name {string} + * @param name {string} + * @param title {Title} * @returns {Promise} **/ - Greet: function(name) { return wails.CallByID(1411160069, ...Array.prototype.slice.call(arguments, 0)); }, - - /** - * GreetService.NewPerson - * NewPerson creates a new person - * @param name {string} - * @returns {Promise} - **/ - NewPerson: function(name) { return wails.CallByID(1661412647, ...Array.prototype.slice.call(arguments, 0)); }, - }, + Greet: function(name, title) { return wails.CallByID(1411160069, ...Array.prototype.slice.call(arguments, 0)); }, }; + diff --git a/v3/internal/parser/testdata/enum_from_imported_package/bindings_main.name.js b/v3/internal/parser/testdata/enum_from_imported_package/bindings_main.name.js new file mode 100644 index 000000000..bf979a24c --- /dev/null +++ b/v3/internal/parser/testdata/enum_from_imported_package/bindings_main.name.js @@ -0,0 +1,16 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export const GreetService = { + + /** + * GreetService.Greet + * Greet does XYZ + * @param name {string} + * @param title {Title} + * @returns {Promise} + **/ + Greet: function(name, title) { return wails.CallByName("main.GreetService.Greet", ...Array.prototype.slice.call(arguments, 0)); }, +}; + diff --git a/v3/internal/parser/testdata/function_from_imported_package/bindings_services.got.js b/v3/internal/parser/testdata/function_from_imported_package/bindings_services.got.js new file mode 100644 index 000000000..2ea85cd1e --- /dev/null +++ b/v3/internal/parser/testdata/function_from_imported_package/bindings_services.got.js @@ -0,0 +1,19 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * @typedef {import('./models').services.Address} servicesAddress + */ + +export const OtherService = { + + /** + * OtherService.Yay + * + * + * @returns {Promise} + **/ + + Yay: function() { return wails.CallByID(302702907, ...Array.prototype.slice.call(arguments, 0)); },}; +