diff --git a/v2/pkg/parser/field.go b/v2/pkg/parser/field.go index c5e792ae..6f93a517 100644 --- a/v2/pkg/parser/field.go +++ b/v2/pkg/parser/field.go @@ -147,7 +147,7 @@ func (p *Parser) parseField(file *ast.File, field *ast.Field, pkg *Package) ([]* default: spew.Dump(t) - return nil, fmt.Errorf("Unsupported field found in struct: %+v", t) + return nil, fmt.Errorf("unsupported field found in struct: %+v", t) } // Loop over names if we have diff --git a/v2/pkg/parser/findBoundStructs.go b/v2/pkg/parser/findBoundStructs.go index b2cb6ec9..dc2a8431 100644 --- a/v2/pkg/parser/findBoundStructs.go +++ b/v2/pkg/parser/findBoundStructs.go @@ -69,26 +69,33 @@ func (p *Parser) findBoundStructs(pkg *Package) error { return false } if strct == nil { - parseError = fmt.Errorf("Unable to resolve function returntype: %s", fn.Name) + parseError = fmt.Errorf("unable to resolve function returntype: %s", fn.Name) return false } - println("Found bound function return type:", strct.Name) strct.Package.boundStructs.Add(strct.Name) - // case *ast.SelectorExpr: - // ident, ok := fn.X.(*ast.Ident) - // if !ok { - // return true - // } - // packageName := ident.Name - // functionName := fn.Sel.Name - // println("Found bound function:", packageName+"."+functionName) + case *ast.SelectorExpr: + ident, ok := fn.X.(*ast.Ident) + if !ok { + return true + } + packageName := ident.Name + functionName := fn.Sel.Name + println("Found bound function:", packageName+"."+functionName) - // strct := p.getFunctionReturnType(packageName, functionName) - // if strct == nil { - // // Unable to resolve function - // return true - // } - // boundStructs = append(boundStructs, strct) + // Get package for package name + externalPackageName := pkg.getImportByName(packageName, fileAst) + externalPackage := p.getPackageByID(externalPackageName.ID) + + strct, err := p.getFunctionReturnType(externalPackage, functionName) + if err != nil { + parseError = err + return false + } + if strct == nil { + // Unable to resolve function + return true + } + externalPackage.boundStructs.Add(strct.Name) } // Binding struct pointer literals diff --git a/v2/pkg/parser/generate.go b/v2/pkg/parser/generate.go index f5176f07..219747ed 100644 --- a/v2/pkg/parser/generate.go +++ b/v2/pkg/parser/generate.go @@ -44,19 +44,13 @@ func (p *Parser) generateModule() error { for _, pkg := range packagesToGenerate { - // Calculate directory - dir := filepath.Join(moduleDir, pkg.gopackage.Name) - - // Create the directory if it doesn't exist - fs.Mkdir(dir) - - err := generatePackage(pkg, dir) + err := generatePackage(pkg, moduleDir) if err != nil { return err } } - // Copy the package file + // Copy the standard files srcFile := fs.RelativePath("./package.json") tgtFile := filepath.Join(moduleDir, "package.json") err = fs.CopyFile(srcFile, tgtFile) @@ -64,6 +58,14 @@ func (p *Parser) generateModule() error { return err } + // Copy the globals.d.ts file + srcFile = fs.RelativePath("./globals.d.ts") + tgtFile = filepath.Join(moduleDir, "globals.d.ts") + err = fs.CopyFile(srcFile, tgtFile) + if err != nil { + return err + } + // Generate the index.js file err = generateIndexJS(moduleDir, packagesToGenerate) if err != nil { @@ -97,28 +99,28 @@ func createBackendJSDirectory() (string, error) { func generatePackage(pkg *Package, moduledir string) error { - // Get path to local file - typescriptTemplateFile := fs.RelativePath("./package.d.template") + // // Get path to local file + // typescriptTemplateFile := fs.RelativePath("./package.d.template") - // Load typescript template - typescriptTemplateData := fs.MustLoadString(typescriptTemplateFile) - typescriptTemplate, err := template.New("typescript").Parse(typescriptTemplateData) - if err != nil { - return errors.Wrap(err, "Error creating template") - } + // // Load typescript template + // typescriptTemplateData := fs.MustLoadString(typescriptTemplateFile) + // typescriptTemplate, err := template.New("typescript").Parse(typescriptTemplateData) + // if err != nil { + // return errors.Wrap(err, "Error creating template") + // } // Execute javascript template var buffer bytes.Buffer - err = typescriptTemplate.Execute(&buffer, pkg) - if err != nil { - return errors.Wrap(err, "Error generating code") - } + // err = typescriptTemplate.Execute(&buffer, pkg) + // if err != nil { + // return errors.Wrap(err, "Error generating code") + // } - // Save typescript file - err = ioutil.WriteFile(filepath.Join(moduledir, "index.d.ts"), buffer.Bytes(), 0755) - if err != nil { - return errors.Wrap(err, "Error writing backend package file") - } + // // Save typescript file + // err = ioutil.WriteFile(filepath.Join(moduledir, "index.d.ts"), buffer.Bytes(), 0755) + // if err != nil { + // return errors.Wrap(err, "Error writing backend package file") + // } // Get path to local file javascriptTemplateFile := fs.RelativePath("./package.template") @@ -139,7 +141,7 @@ func generatePackage(pkg *Package, moduledir string) error { } // Save javascript file - err = ioutil.WriteFile(filepath.Join(moduledir, "index.js"), buffer.Bytes(), 0755) + err = ioutil.WriteFile(filepath.Join(moduledir, "_"+pkg.Name+".js"), buffer.Bytes(), 0755) if err != nil { return errors.Wrap(err, "Error writing backend package file") } diff --git a/v2/pkg/parser/globals.d.ts b/v2/pkg/parser/globals.d.ts new file mode 100644 index 00000000..522851a9 --- /dev/null +++ b/v2/pkg/parser/globals.d.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +interface window { + backend: any +} \ No newline at end of file diff --git a/v2/pkg/parser/index.template b/v2/pkg/parser/index.template index 22fb0f41..bf39e4ab 100644 --- a/v2/pkg/parser/index.template +++ b/v2/pkg/parser/index.template @@ -2,7 +2,7 @@ // This file is automatically generated. DO NOT EDIT {{- range .}} -const {{.Name}} = require('./{{.Name}}'); +const {{.Name}} = require('./_{{.Name}}'); {{- end}} module.exports = { diff --git a/v2/pkg/parser/package.template b/v2/pkg/parser/package.template index 2aeba33b..332adc1f 100644 --- a/v2/pkg/parser/package.template +++ b/v2/pkg/parser/package.template @@ -2,6 +2,21 @@ // This file is automatically generated. DO NOT EDIT {{- range $struct := .Structs }} +{{- if .IsUsedAsData }} +/** +{{if .Comments }}{{range .Comments}} *{{ . }}{{end}}{{end}} + * @typedef {object} {{.Name}} +{{range .Fields}} * @property {{"{"}}{{.JSType}}{{"}"}} {{.Name}} +{{- if .Comments}} - {{- range .Comments}}{{ . }}{{- end}}{{- end}} +{{end}} * + */ +export const {{.Name}} = { +{{- range .Fields}} + {{.Name}}, +{{- end}} +} + +{{- end}} {{- if .IsBound }} {{if .Methods }} {{if .Comments }}{{range .Comments}}// {{ . }}{{end}}{{end}} diff --git a/v2/pkg/parser/parser.go b/v2/pkg/parser/parser.go index 628798f7..e5d0e44e 100644 --- a/v2/pkg/parser/parser.go +++ b/v2/pkg/parser/parser.go @@ -1,3 +1,6 @@ +// Package parser provides the ability to parse the data that is bound in Wails projects. +// Using this, it can also generate a Javascript module that represents the DTOs used, as +// well as providing wrappers for bound methods. package parser import ( diff --git a/v2/pkg/parser/struct.go b/v2/pkg/parser/struct.go index 8ea8c92b..6108309b 100644 --- a/v2/pkg/parser/struct.go +++ b/v2/pkg/parser/struct.go @@ -44,7 +44,7 @@ func parseStructNameFromStarExpr(starExpr *ast.StarExpr) (string, string, error) pkg = i.Name default: // TODO: Store warnings? - return "", "", errors.WithStack(fmt.Errorf("Unknown type in selector for *ast.SelectorExpr: ", i)) + return "", "", errors.WithStack(fmt.Errorf("unknown type in selector for *ast.SelectorExpr: %+v", i)) } name = x.Sel.Name @@ -56,13 +56,13 @@ func parseStructNameFromStarExpr(starExpr *ast.StarExpr) (string, string, error) name = s.Name default: // TODO: Store warnings? - return "", "", errors.WithStack(fmt.Errorf("Unknown type in selector for *ast.StarExpr: ", s)) + return "", "", errors.WithStack(fmt.Errorf("unknown type in selector for *ast.StarExpr: %+v", s)) } case *ast.Ident: name = x.Name default: // TODO: Store warnings? - return "", "", errors.WithStack(fmt.Errorf("Unknown type in selector for *ast.StarExpr: ", starExpr)) + return "", "", errors.WithStack(fmt.Errorf("unknown type in selector for *ast.StarExpr: %+v", starExpr)) } return pkg, name, nil }