Skip to content

Commit 9b79a0a

Browse files
committed
refactor(codegen): Extract engine generators
Extracts v8go and goja specific code to separate packages. Should hopefully help better structure and navigate code
1 parent b4512a6 commit 9b79a0a

19 files changed

+153
-127
lines changed

internal/code-gen/main.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import (
1111

1212
"github.com/gost-dom/code-gen/events"
1313
htmlelements "github.com/gost-dom/code-gen/html-elements"
14-
wrappers "github.com/gost-dom/code-gen/script-wrappers"
14+
"github.com/gost-dom/code-gen/script-wrappers/gojagen"
15+
"github.com/gost-dom/code-gen/script-wrappers/v8gen"
1516
)
1617

1718
func getWriter(output string) io.Writer {
@@ -38,12 +39,12 @@ func main() {
3839
flag.Parse()
3940
switch *generatorType {
4041
case "goja":
41-
gen := wrappers.NewGojaWrapperModuleGenerator()
42+
gen := gojagen.NewGojaWrapperModuleGenerator()
4243
exitOnError(gen.GenerateScriptWrappers())
4344
os.Exit(0)
4445
return
4546
case "scripting":
46-
gen := wrappers.NewScriptWrapperModulesGenerator()
47+
gen := v8gen.NewScriptWrapperModulesGenerator()
4748
exitOnError(gen.GenerateScriptWrappers())
4849
os.Exit(0)
4950
return

internal/code-gen/packagenames/packagenames.go

+5
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package packagenames
22

33
import "fmt"
44

5+
// Names that relate to the project name, which would only change if the project
6+
// is moved/renamed.
57
const (
68
NAME = "gost-dom"
79
BASE_PKG = "github.com/gost-dom/browser"
810
ISSUE_URL = "https://github.com/gost-dom/browser/issues"
11+
// alternate url: "https://github.com/gost-dom/browser/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen"
912

1013
Dom = BASE_PKG + "/dom"
1114
Events = Dom + "/event"
@@ -14,6 +17,8 @@ const (
1417
Gojahost = BASE_PKG + "/scripting/gojahost"
1518
Log = BASE_PKG + "/internal/log"
1619
UIEvents = BASE_PKG + "/internal/uievents"
20+
V8go = "github.com/gost-dom/v8go"
21+
Goja = "github.com/dop251/goja"
1722
)
1823

1924
var names = map[string]string{

internal/code-gen/script-wrappers/constants.go

-7
This file was deleted.

internal/code-gen/script-wrappers/es_wrapper_generator.go

+6-31
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,6 @@ import (
1616
"github.com/dave/jennifer/jen"
1717
)
1818

19-
var (
20-
v8FunctionTemplatePtr = g.NewTypePackage("FunctionTemplate", v8).Pointer()
21-
v8FunctionCallbackInfoPtr = g.NewTypePackage("FunctionCallbackInfo", v8).Pointer()
22-
v8ObjectTemplatePtr = g.NewTypePackage("ObjectTemplate", v8).Pointer()
23-
v8Value = g.NewTypePackage("Value", v8).Pointer()
24-
v8ReadOnly = g.Raw(jen.Qual(v8, "ReadOnly"))
25-
v8None = g.Raw(jen.Qual(v8, "None"))
26-
scriptHostPtr = g.NewType("V8ScriptHost").Pointer()
27-
)
28-
29-
const (
30-
v8 = "github.com/gost-dom/v8go"
31-
gojaSrc = "github.com/dop251/goja"
32-
)
33-
3419
func createData(
3520
spec idl.Spec,
3621
interfaceConfig *configuration.IdlInterfaceConfiguration,
@@ -104,15 +89,15 @@ func CreateAttributes(
10489
if !attribute.Readonly {
10590
setter = new(ESOperation)
10691
*setter = *getter
107-
setter.Name = fmt.Sprintf("set%s", idlNameToGoName(getter.Name))
92+
setter.Name = fmt.Sprintf("set%s", IdlNameToGoName(getter.Name))
10893
methodCustomization := interfaceConfig.GetMethodCustomization(setter.Name)
10994
setter.NotImplemented = setter.NotImplemented || methodCustomization.NotImplemented
11095
setter.CustomImplementation = setter.CustomImplementation ||
11196
methodCustomization.CustomImplementation
11297
setter.RetType = idl.NewRetTypeUndefined()
11398
setter.Arguments = []ESOperationArgument{{
11499
Name: "val",
115-
Type: idlNameToGoName(attribute.Type.Name),
100+
Type: IdlNameToGoName(attribute.Type.Name),
116101
Optional: false,
117102
Variadic: false,
118103
}}
@@ -121,7 +106,7 @@ func CreateAttributes(
121106
getter.NotImplemented = getterCustomization.NotImplemented || getter.NotImplemented
122107
getter.CustomImplementation = getterCustomization.CustomImplementation ||
123108
getter.CustomImplementation
124-
res = append(res, ESAttribute{attribute.Name, getter, setter})
109+
res = append(res, ESAttribute{Name: attribute.Name, Getter: getter, Setter: setter})
125110
}
126111
return
127112
}
@@ -188,8 +173,6 @@ func ReturnOnAnyError(errNames []g.Generator) g.Generator {
188173
)
189174
}
190175

191-
type JenGenerator = g.Generator
192-
193176
func IsNodeType(typeName string) bool {
194177
loweredName := strings.ToLower(typeName)
195178
switch loweredName {
@@ -206,12 +189,12 @@ func IsNodeType(typeName string) bool {
206189
return false
207190
}
208191

209-
// sanitizeVarName create a valid go variable name from a variable to avoid
192+
// SanitizeVarName create a valid go variable name from a variable to avoid
210193
// invalid generated code due to
211194
//
212195
// - The name is a reserved word, e.g. `type`.
213196
// - The name already an identifiers in scope (not yet implemented)
214-
func sanitizeVarName(name string) string {
197+
func SanitizeVarName(name string) string {
215198
switch name {
216199
case "type":
217200
return "type_"
@@ -221,16 +204,8 @@ func sanitizeVarName(name string) string {
221204
return name
222205
}
223206

224-
func idlNameToGoName(s string) string {
225-
words := strings.Split(s, " ")
226-
for i, word := range words {
227-
words[i] = UpperCaseFirstLetter(word)
228-
}
229-
return strings.Join(words, "")
230-
}
231-
232207
func idlNameToUnexportedGoName(s string) string {
233-
return LowerCaseFirstLetter(idlNameToGoName(s))
208+
return LowerCaseFirstLetter(IdlNameToGoName(s))
234209
}
235210

236211
type ReturnOnError struct {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package gojagen
2+
3+
import (
4+
"github.com/dave/jennifer/jen"
5+
"github.com/gost-dom/code-gen/packagenames"
6+
g "github.com/gost-dom/generators"
7+
)
8+
9+
const (
10+
gojaSrc = packagenames.Goja
11+
)
12+
13+
var (
14+
gojaFc = g.Raw(jen.Qual(gojaSrc, "FunctionCall"))
15+
gojaValue = g.Raw(jen.Qual(gojaSrc, "Value"))
16+
gojaObj = g.Raw(jen.Op("*").Qual(gojaSrc, "Object"))
17+
gojaRuntime = g.Raw(jen.Op("*").Qual(gojaSrc, "Runtime"))
18+
flagTrue = g.Raw(jen.Qual(gojaSrc, "FLAG_TRUE"))
19+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package gojagen

internal/code-gen/script-wrappers/goja_generators.go renamed to internal/code-gen/script-wrappers/gojagen/generators.go

+11-18
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1-
package wrappers
1+
package gojagen
22

33
import (
44
"fmt"
55

66
"github.com/dave/jennifer/jen"
77
. "github.com/gost-dom/code-gen/internal"
8+
wrappers "github.com/gost-dom/code-gen/script-wrappers"
89
"github.com/gost-dom/code-gen/script-wrappers/model"
910
"github.com/gost-dom/generators"
1011
g "github.com/gost-dom/generators"
1112
)
1213

13-
var (
14-
gojaFc = g.Raw(jen.Qual(gojaSrc, "FunctionCall"))
15-
gojaValue = g.Raw(jen.Qual(gojaSrc, "Value"))
16-
gojaObj = g.Raw(jen.Op("*").Qual(gojaSrc, "Object"))
17-
gojaRuntime = g.Raw(jen.Op("*").Qual(gojaSrc, "Runtime"))
18-
flagTrue = g.Raw(jen.Qual(gojaSrc, "FLAG_TRUE"))
19-
)
20-
2114
type GojaNamingStrategy struct {
2215
model.ESConstructorData
2316
}
@@ -145,7 +138,7 @@ func (gen GojaTargetGenerators) CreateMethodCallbackBody(
145138
readArgs,
146139
)
147140
if op.HasResult() {
148-
converter := fmt.Sprintf("to%s", idlNameToGoName(op.RetType.TypeName))
141+
converter := fmt.Sprintf("to%s", op.RetTypeName())
149142
if op.GetHasError() {
150143
list.Append(
151144
g.AssignMany(g.List(
@@ -177,7 +170,7 @@ func (gen GojaTargetGenerators) CreateMethodCallbackBody(
177170
return list
178171
}
179172

180-
func (g GojaTargetGenerators) WrapperStructGenerators() PlatformWrapperStructGenerators {
173+
func (g GojaTargetGenerators) WrapperStructGenerators() wrappers.PlatformWrapperStructGenerators {
181174
return g
182175
}
183176

@@ -189,32 +182,32 @@ func (g GojaTargetGenerators) WrapperStructConstructorName(interfaceName string)
189182
return fmt.Sprintf("new%sWrapper", interfaceName)
190183
}
191184

192-
func (g GojaTargetGenerators) WrapperStructConstructorRetType(string) Generator {
185+
func (g GojaTargetGenerators) WrapperStructConstructorRetType(string) g.Generator {
193186
return generators.Id("wrapper")
194187
}
195188

196-
func (g GojaTargetGenerators) EmbeddedType(wrappedType Generator) Generator {
189+
func (g GojaTargetGenerators) EmbeddedType(wrappedType g.Generator) g.Generator {
197190
return generators.NewType("baseInstanceWrapper").TypeParam(wrappedType)
198191
}
199192

200-
func (g GojaTargetGenerators) EmbeddedTypeConstructor(wrappedType Generator) generators.Value {
193+
func (g GojaTargetGenerators) EmbeddedTypeConstructor(wrappedType g.Generator) g.Value {
201194
return generators.NewValue("newBaseInstanceWrapper").TypeParam(wrappedType)
202195
}
203196

204-
func (g GojaTargetGenerators) HostArg() Generator {
197+
func (g GojaTargetGenerators) HostArg() g.Generator {
205198
return generators.Id("instance")
206199
}
207200

208-
func (g GojaTargetGenerators) HostType() Generator {
201+
func (g GojaTargetGenerators) HostType() g.Generator {
209202
return generators.NewType("GojaContext").Pointer()
210203
}
211204

212-
func (g GojaTargetGenerators) CallbackMethodArgs() generators.FunctionArgumentList {
205+
func (g GojaTargetGenerators) CallbackMethodArgs() g.FunctionArgumentList {
213206
callArgument := generators.Id("c")
214207
return generators.Arg(callArgument, gojaFc)
215208
}
216209

217-
func (g GojaTargetGenerators) CallbackMethodRetTypes() []generators.Generator {
210+
func (g GojaTargetGenerators) CallbackMethodRetTypes() []g.Generator {
218211
return []generators.Generator{gojaValue}
219212
}
220213

internal/code-gen/script-wrappers/goja_wrapper_generator.go renamed to internal/code-gen/script-wrappers/gojagen/wrapper_generator.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
package wrappers
1+
package gojagen
22

33
import (
44
"github.com/gost-dom/code-gen/packagenames"
5+
wrappers "github.com/gost-dom/code-gen/script-wrappers"
56
"github.com/gost-dom/code-gen/script-wrappers/configuration"
67
)
78

8-
func NewGojaWrapperModuleGenerator() ScriptWrapperModulesGenerator {
9+
func NewGojaWrapperModuleGenerator() wrappers.ScriptWrapperModulesGenerator {
910
specs := configuration.CreateSpecs()
1011
dom := specs.Module("dom")
1112
domNode := dom.Type("Node")
@@ -27,7 +28,7 @@ func NewGojaWrapperModuleGenerator() ScriptWrapperModulesGenerator {
2728
location.Method("replace").SetNotImplemented()
2829
location.Method("ancestorOrigins").SetNotImplemented()
2930

30-
return ScriptWrapperModulesGenerator{
31+
return wrappers.ScriptWrapperModulesGenerator{
3132
Specs: specs,
3233
PackagePath: packagenames.Gojahost,
3334
TargetGenerators: GojaTargetGenerators{},

internal/code-gen/script-wrappers/model/es_operation.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ func (o ESOperation) Encoder() string {
3535
if o.RetType.Nullable {
3636
converter += "Nullable"
3737
}
38-
converter += idlNameToGoName(o.RetType.TypeName)
38+
converter += IdlNameToGoName(o.RetType.TypeName)
3939
return converter
4040
}
41+
42+
func (o ESOperation) RetTypeName() string {
43+
return IdlNameToGoName(o.RetType.TypeName)
44+
}

internal/code-gen/script-wrappers/model/functions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
. "github.com/gost-dom/code-gen/internal"
77
)
88

9-
func idlNameToGoName(s string) string {
9+
func IdlNameToGoName(s string) string {
1010
words := strings.Split(s, " ")
1111
for i, word := range words {
1212
words[i] = UpperCaseFirstLetter(word)

internal/code-gen/script-wrappers/script_wrapper_modules_generator.go

+2-13
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ import (
1919
func writeGenerator(writer io.Writer, packagePath string, generator g.Generator) error {
2020
file := jen.NewFilePath(packagePath)
2121
file.HeaderComment("This file is generated. Do not edit.")
22-
// file.ImportName(dom, "browser")
23-
file.ImportAlias(v8, "v8")
24-
file.ImportAlias(gojaSrc, "g")
22+
file.ImportAlias(packagenames.V8go, "v8")
23+
file.ImportAlias(packagenames.Goja, "g")
2524
file.Add(generator.Generate())
2625
return file.Render(writer)
2726
}
@@ -122,13 +121,3 @@ func (gen ScriptWrapperModulesGenerator) writeModuleSingleFile(
122121
func (gen ScriptWrapperModulesGenerator) GenerateScriptWrappers() error {
123122
return gen.writeModules(gen.Specs)
124123
}
125-
126-
func NewScriptWrapperModulesGenerator() ScriptWrapperModulesGenerator {
127-
specs := configuration.CreateV8Specs()
128-
129-
return ScriptWrapperModulesGenerator{
130-
Specs: specs,
131-
PackagePath: packagenames.V8host,
132-
TargetGenerators: V8TargetGenerators{},
133-
}
134-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package v8gen
2+
3+
import (
4+
"github.com/dave/jennifer/jen"
5+
6+
g "github.com/gost-dom/generators"
7+
)
8+
9+
const v8 = "github.com/gost-dom/v8go"
10+
11+
var (
12+
v8FunctionTemplatePtr = g.NewTypePackage("FunctionTemplate", v8).Pointer()
13+
v8FunctionCallbackInfoPtr = g.NewTypePackage("FunctionCallbackInfo", v8).Pointer()
14+
v8ObjectTemplatePtr = g.NewTypePackage("ObjectTemplate", v8).Pointer()
15+
v8Value = g.NewTypePackage("Value", v8).Pointer()
16+
v8ReadOnly = g.Raw(jen.Qual(v8, "ReadOnly"))
17+
v8None = g.Raw(jen.Qual(v8, "None"))
18+
scriptHostPtr = g.NewType("V8ScriptHost").Pointer()
19+
)
20+
21+
// Provides helpers for functions that needs an iso as the first argument
22+
type v8Iso struct{ g.Value }
23+
24+
func (iso v8Iso) NewFunctionTemplate(cb g.Generator) g.Generator {
25+
return g.NewValuePackage("NewFunctionTemplateWithError", v8).Call(iso.Value, cb)
26+
}

internal/code-gen/script-wrappers/constructor_builder.go renamed to internal/code-gen/script-wrappers/v8gen/constructor_builder.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package wrappers
1+
package v8gen
22

33
import (
44
. "github.com/gost-dom/code-gen/script-wrappers/model"
@@ -36,7 +36,7 @@ type PrototypeInstaller struct {
3636

3737
func (builder PrototypeInstaller) InstallFunctionHandlers(
3838
data ESConstructorData,
39-
) JenGenerator {
39+
) g.Generator {
4040
generators := make([]g.Generator, 0, len(data.Operations))
4141
for _, op := range data.Operations {
4242
if !op.MethodCustomization.Ignored {
@@ -58,7 +58,7 @@ func (builder PrototypeInstaller) InstallAttributeHandlers(
5858
if length == 0 {
5959
return g.Noop
6060
}
61-
generators := make([]JenGenerator, 1, length+1)
61+
generators := make([]g.Generator, 1, length+1)
6262
generators[0] = g.Line
6363
for op := range data.AttributesToInstall() {
6464
generators = append(generators, builder.InstallAttributeHandler(op))

0 commit comments

Comments
 (0)