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:
parent
7340247e25
commit
26530a0f5a
@ -61,7 +61,7 @@ var jsReservedKeywords []string = []string{
|
|||||||
"typeof",
|
"typeof",
|
||||||
"var",
|
"var",
|
||||||
"void",
|
"void",
|
||||||
"volotile",
|
"volatile",
|
||||||
"while",
|
"while",
|
||||||
"with",
|
"with",
|
||||||
"yield",
|
"yield",
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
24
v3/examples/binding/models.ts
Normal file
24
v3/examples/binding/models.ts
Normal 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"]
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user