5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 07:10:40 +08:00

Fix reserve word check.

Add model generation.
Warn if field is unexported in the Go struct
This commit is contained in:
Lea Anthony 2023-03-07 19:48:30 +11:00
parent 7340247e25
commit 26530a0f5a
7 changed files with 156 additions and 11 deletions

View File

@ -61,7 +61,7 @@ var jsReservedKeywords []string = []string{
"typeof", "typeof",
"var", "var",
"void", "void",
"volotile", "volatile",
"while", "while",
"with", "with",
"yield", "yield",

View File

@ -1,8 +1,16 @@
package main package main
type Person struct {
name string
}
type GreetService struct { type GreetService struct {
} }
func (*GreetService) Greet(name string) string { func (*GreetService) Greet(name string) string {
return "Hello " + name return "Hello " + name
} }
func (*GreetService) GreetPerson(person Person) string {
return "Hello " + person.name
}

View File

@ -2,6 +2,8 @@
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT // This file is automatically generated. DO NOT EDIT
import {main} from './models';
function GreetService(method) { function GreetService(method) {
return { return {
packageName: "main", packageName: "main",
@ -21,9 +23,21 @@ function Greet(name) {
return wails.Call(GreetService("Greet", name)); return wails.Call(GreetService("Greet", name));
} }
/**
* GreetService.GreetPerson
*
* @param person {main.Person}
* @returns {Promise<string>}
**/
function GreetPerson(person) {
return wails.Call(GreetService("GreetPerson", person));
}
window.go = window.go || {}; window.go = window.go || {};
window.go.main = { window.go.main = {
GreetService: { GreetService: {
Greet, Greet,
GreetPerson,
}, },
}; };

View File

@ -0,0 +1,24 @@
// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
export namespace main {
export class Person {
name: string; // Warning: this is unexported in the Go struct.
static createFrom(source: any = {}) {
return new Person(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) {
source = JSON.parse(source);
}
this.name = source["name"]
}
}
}

View File

@ -42,10 +42,78 @@ function {{methodName}}({{inputs}}) {
} }
` `
var reservedWords = []string{
"abstract",
"arguments",
"await",
"boolean",
"break",
"byte",
"case",
"catch",
"char",
"class",
"const",
"continue",
"debugger",
"default",
"delete",
"do",
"double",
"else",
"enum",
"eval",
"export",
"extends",
"false",
"final",
"finally",
"float",
"for",
"function",
"goto",
"if",
"implements",
"import",
"in",
"instanceof",
"int",
"interface",
"let",
"long",
"native",
"new",
"null",
"package",
"private",
"protected",
"public",
"return",
"short",
"static",
"super",
"switch",
"synchronized",
"this",
"throw",
"throws",
"transient",
"true",
"try",
"typeof",
"var",
"void",
"volatile",
"while",
"with",
"yield",
"object",
}
func sanitiseJSVarName(name string) string { func sanitiseJSVarName(name string) string {
// if the name is a reserved word, prefix with an // if the name is a reserved word, prefix with an
// underscore // underscore
if strings.Contains("break,case,catch,class,const,continue,debugger,default,delete,do,else,enum,export,extends,false,finally,for,function,if,implements,import,in,instanceof,interface,let,new,null,package,private,protected,public,return,static,super,switch,this,throw,true,try,typeof,var,void,while,with,yield", name) { if lo.Contains(reservedWords, name) {
return "_" + name return "_" + name
} }
return name return name
@ -69,7 +137,6 @@ func GenerateBinding(structName string, method *BoundMethod) (string, []string)
if len(params) == 0 { if len(params) == 0 {
params = " *" params = " *"
} }
////params += "\n"
result = strings.ReplaceAll(result, " * @param name {string}", params) result = strings.ReplaceAll(result, " * @param name {string}", params)
var inputs string var inputs string
for _, input := range method.Inputs { for _, input := range method.Inputs {

View File

@ -1,17 +1,22 @@
package parser package parser
import ( import (
"bytes"
"embed"
"io" "io"
"text/template" "text/template"
) )
//go:embed templates
var templates embed.FS
type ModelDefinitions struct { type ModelDefinitions struct {
Package string Package string
Models map[string]*StructDef Models map[string]*StructDef
} }
func GenerateModel(wr io.Writer, def *ModelDefinitions) error { func GenerateModel(wr io.Writer, def *ModelDefinitions) error {
tmpl, err := template.New("model.ts.tmpl").ParseFiles("templates/model.ts.tmpl") tmpl, err := template.New("model.ts.tmpl").ParseFS(templates, "templates/model.ts.tmpl")
if err != nil { if err != nil {
println("Unable to create class template: " + err.Error()) println("Unable to create class template: " + err.Error())
return err return err
@ -25,8 +30,24 @@ func GenerateModel(wr io.Writer, def *ModelDefinitions) error {
return nil return nil
} }
func GenerateModels(models map[packagePath]map[structName]*StructDef) string { const modelsHeader = `// @ts-check
return "" // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
`
func GenerateModels(models map[packagePath]map[structName]*StructDef) (string, error) {
var buffer bytes.Buffer
buffer.WriteString(modelsHeader)
for pkg, pkgModels := range models {
err := GenerateModel(&buffer, &ModelDefinitions{
Package: pkg,
Models: pkgModels,
})
if err != nil {
return "", err
}
}
return buffer.String(), nil
} }
//func GenerateClass(wr io.Writer, def *StructDef) error { //func GenerateClass(wr io.Writer, def *StructDef) error {

View File

@ -93,12 +93,20 @@ func (f *Field) JSName() string {
func (f *Field) JSDef(pkg string) string { func (f *Field) JSDef(pkg string) string {
name := f.JSName() name := f.JSName()
var result string
if f.Type.Package == "" || f.Type.Package == pkg { if f.Type.Package == "" || f.Type.Package == pkg {
return fmt.Sprintf("%s: %s;", name, f.Type.Name) result += fmt.Sprintf("%s: %s;", name, f.Type.Name)
} else {
parts := strings.Split(f.Type.Package, "/")
result += fmt.Sprintf("%s: %s.%s;", name, parts[len(parts)-1], f.Type.Name)
} }
parts := strings.Split(f.Type.Package, "/") if !ast.IsExported(f.Name) {
return fmt.Sprintf("%s: %s.%s;", name, parts[len(parts)-1], f.Type.Name) result += " // Warning: this is unexported in the Go struct."
}
return result
} }
type ParsedPackage struct { type ParsedPackage struct {
@ -165,8 +173,11 @@ func GenerateBindingsAndModels(projectDir string, outputDir string) error {
// Generate Models // Generate Models
if len(p.Models) > 0 { if len(p.Models) > 0 {
generatedModels := GenerateModels(p.Models) generatedModels, err := GenerateModels(p.Models)
err = os.WriteFile(filepath.Join(outputDir, "models.js"), []byte(generatedModels), 0644) if err != nil {
return err
}
err = os.WriteFile(filepath.Join(outputDir, "models.ts"), []byte(generatedModels), 0644)
if err != nil { if err != nil {
return err return err
} }