Skip to content

Commit 5467955

Browse files
committed
refactor(codegen): Extract V8TargetGenerators
Temporary restructure resulting in slightly better code organisation, but this needs to be restructured.
1 parent 9e4cd47 commit 5467955

File tree

2 files changed

+142
-134
lines changed

2 files changed

+142
-134
lines changed

internal/code-gen/script-wrappers/v8gen/generators.go

-134
Original file line numberDiff line numberDiff line change
@@ -34,144 +34,10 @@ func (s V8NamingStrategy) PrototypeWrapperName() string {
3434
return LowerCaseFirstLetter(s.PrototypeWrapperBaseName())
3535
}
3636

37-
type V8TargetGenerators struct{}
38-
39-
func (gen V8TargetGenerators) PlatformInfoArg() Generator { return g.Id("info") }
40-
41-
func (gen V8TargetGenerators) CreateInitFunction(data ESConstructorData) g.Generator {
42-
return g.FunctionDefinition{
43-
Name: "init",
44-
Body: g.NewValue("registerJSClass").Call(
45-
g.Lit(data.Spec.TypeName),
46-
g.Lit(data.Inheritance),
47-
g.Id(prototypeFactoryFunctionName(data))),
48-
}
49-
}
50-
51-
func (gen V8TargetGenerators) ReturnErrMsg(errGen g.Generator) g.Generator {
52-
return g.Return(g.Nil, stdgen.ErrorsNew(errGen))
53-
}
54-
55-
func (gen V8TargetGenerators) WrapperStructGenerators() wrappers.PlatformWrapperStructGenerators {
56-
return V8WrapperStructGenerators{}
57-
}
58-
59-
func (gen V8TargetGenerators) CreatePrototypeInitializer(
60-
data ESConstructorData,
61-
body g.Generator,
62-
) g.Generator {
63-
naming := V8NamingStrategy{data}
64-
receiver := g.NewValue(naming.Receiver())
65-
builder := NewConstructorBuilder()
66-
return g.FunctionDefinition{
67-
Name: "installPrototype",
68-
Receiver: g.FunctionArgument{
69-
Name: receiver,
70-
Type: g.Id(naming.PrototypeWrapperName()),
71-
},
72-
Args: g.Arg(builder.Proto, v8ObjectTemplatePtr),
73-
Body: body,
74-
}
75-
}
76-
77-
func (gen V8TargetGenerators) CreatePrototypeInitializerBody(
78-
data ESConstructorData,
79-
) g.Generator {
80-
naming := V8NamingStrategy{data}
81-
receiver := g.NewValue(naming.Receiver())
82-
builder := NewConstructorBuilder()
83-
installer := PrototypeInstaller{
84-
builder.v8Iso,
85-
builder.Proto,
86-
WrapperInstance{g.Value{Generator: receiver}},
87-
}
88-
return g.StatementList(
89-
g.Assign(g.NewValue("iso"), receiver.Field("scriptHost").Field("iso")),
90-
installer.InstallFunctionHandlers(data),
91-
installer.InstallAttributeHandlers(data),
92-
)
93-
}
94-
95-
func (gen V8TargetGenerators) CreateConstructorCallback(data ESConstructorData) g.Generator {
96-
naming := V8NamingStrategy{data}
97-
var body g.Generator
98-
if wrappers.IsNodeType(data.IdlInterfaceName) {
99-
body = CreateV8IllegalConstructorBody(data)
100-
} else {
101-
body = CreateV8ConstructorWrapperBody(data)
102-
}
103-
return g.StatementList(
104-
g.Line,
105-
g.FunctionDefinition{
106-
Name: "Constructor",
107-
Receiver: g.FunctionArgument{
108-
Name: g.Id(naming.Receiver()),
109-
Type: g.Id(naming.PrototypeWrapperName()),
110-
},
111-
Args: g.Arg(g.Id("info"), v8FunctionCallbackInfoPtr),
112-
RtnTypes: g.List(v8Value, g.Id("error")),
113-
Body: body,
114-
},
115-
)
116-
}
117-
118-
func (gen V8TargetGenerators) CreateMethodCallbackBody(
119-
data ESConstructorData,
120-
op ESOperation,
121-
) g.Generator {
122-
naming := V8NamingStrategy{data}
123-
receiver := WrapperInstance{g.NewValue(naming.Receiver())}
124-
instance := g.NewValue("instance")
125-
readArgsResult := ReadArguments(data, op)
126-
err := g.Id("err0")
127-
if len(op.Arguments) == 0 {
128-
err = g.Id("err")
129-
}
130-
requireContext := false
131-
var CreateCall = func(functionName string, argnames []g.Generator, op ESOperation) g.Generator {
132-
callInstance := V8InstanceInvocation{
133-
Name: functionName,
134-
Args: argnames,
135-
Op: op,
136-
Instance: &instance,
137-
Receiver: receiver,
138-
}.GetGenerator()
139-
requireContext = requireContext || callInstance.RequireContext
140-
return callInstance.Generator
141-
}
142-
statements := g.StatementList(
143-
AssignArgs(data, op),
144-
GetInstanceAndError(instance, err, data),
145-
readArgsResult,
146-
CreateV8WrapperMethodInstanceInvocations(
147-
data,
148-
op,
149-
idlNameToGoName(op.Name),
150-
readArgsResult.Args,
151-
err,
152-
CreateCall,
153-
true,
154-
),
155-
)
156-
if requireContext {
157-
statements.Prepend(V8RequireContext(receiver))
158-
}
159-
return statements
160-
}
161-
16237
func prototypeFactoryFunctionName(data ESConstructorData) string {
16338
return fmt.Sprintf("create%sPrototype", data.IdlInterfaceName)
16439
}
16540

166-
func (gen V8TargetGenerators) CreateHostInitializer(data ESConstructorData) g.Generator {
167-
return g.FunctionDefinition{
168-
Name: prototypeFactoryFunctionName(data),
169-
Args: g.Arg(scriptHost, scriptHostPtr),
170-
RtnTypes: g.List(v8FunctionTemplatePtr),
171-
Body: CreateV8ConstructorBody(data),
172-
}
173-
}
174-
17541
func CreateV8ConstructorBody(data ESConstructorData) g.Generator {
17642
naming := V8NamingStrategy{data}
17743
builder := NewConstructorBuilder()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package v8gen
2+
3+
import (
4+
wrappers "github.com/gost-dom/code-gen/script-wrappers"
5+
. "github.com/gost-dom/code-gen/script-wrappers/model"
6+
"github.com/gost-dom/code-gen/stdgen"
7+
g "github.com/gost-dom/generators"
8+
)
9+
10+
type V8TargetGenerators struct{}
11+
12+
func (gen V8TargetGenerators) CreateInitFunction(data ESConstructorData) g.Generator {
13+
return g.FunctionDefinition{
14+
Name: "init",
15+
Body: g.NewValue("registerJSClass").Call(
16+
g.Lit(data.Spec.TypeName),
17+
g.Lit(data.Inheritance),
18+
g.Id(prototypeFactoryFunctionName(data))),
19+
}
20+
}
21+
22+
func (gen V8TargetGenerators) ReturnErrMsg(errGen g.Generator) g.Generator {
23+
return g.Return(g.Nil, stdgen.ErrorsNew(errGen))
24+
}
25+
26+
func (gen V8TargetGenerators) WrapperStructGenerators() wrappers.PlatformWrapperStructGenerators {
27+
return V8WrapperStructGenerators{}
28+
}
29+
30+
func (gen V8TargetGenerators) CreatePrototypeInitializer(
31+
data ESConstructorData,
32+
body g.Generator,
33+
) g.Generator {
34+
naming := V8NamingStrategy{data}
35+
receiver := g.NewValue(naming.Receiver())
36+
builder := NewConstructorBuilder()
37+
return g.FunctionDefinition{
38+
Name: "installPrototype",
39+
Receiver: g.FunctionArgument{
40+
Name: receiver,
41+
Type: g.Id(naming.PrototypeWrapperName()),
42+
},
43+
Args: g.Arg(builder.Proto, v8ObjectTemplatePtr),
44+
Body: body,
45+
}
46+
}
47+
48+
func (gen V8TargetGenerators) CreatePrototypeInitializerBody(
49+
data ESConstructorData,
50+
) g.Generator {
51+
naming := V8NamingStrategy{data}
52+
receiver := g.NewValue(naming.Receiver())
53+
builder := NewConstructorBuilder()
54+
installer := PrototypeInstaller{
55+
builder.v8Iso,
56+
builder.Proto,
57+
WrapperInstance{g.Value{Generator: receiver}},
58+
}
59+
return g.StatementList(
60+
g.Assign(g.NewValue("iso"), receiver.Field("scriptHost").Field("iso")),
61+
installer.InstallFunctionHandlers(data),
62+
installer.InstallAttributeHandlers(data),
63+
)
64+
}
65+
66+
func (gen V8TargetGenerators) CreateConstructorCallback(data ESConstructorData) g.Generator {
67+
naming := V8NamingStrategy{data}
68+
var body g.Generator
69+
if wrappers.IsNodeType(data.IdlInterfaceName) {
70+
body = CreateV8IllegalConstructorBody(data)
71+
} else {
72+
body = CreateV8ConstructorWrapperBody(data)
73+
}
74+
return g.StatementList(
75+
g.Line,
76+
g.FunctionDefinition{
77+
Name: "Constructor",
78+
Receiver: g.FunctionArgument{
79+
Name: g.Id(naming.Receiver()),
80+
Type: g.Id(naming.PrototypeWrapperName()),
81+
},
82+
Args: g.Arg(g.Id("info"), v8FunctionCallbackInfoPtr),
83+
RtnTypes: g.List(v8Value, g.Id("error")),
84+
Body: body,
85+
},
86+
)
87+
}
88+
89+
func (gen V8TargetGenerators) CreateMethodCallbackBody(
90+
data ESConstructorData,
91+
op ESOperation,
92+
) g.Generator {
93+
naming := V8NamingStrategy{data}
94+
receiver := WrapperInstance{g.NewValue(naming.Receiver())}
95+
instance := g.NewValue("instance")
96+
readArgsResult := ReadArguments(data, op)
97+
err := g.Id("err0")
98+
if len(op.Arguments) == 0 {
99+
err = g.Id("err")
100+
}
101+
requireContext := false
102+
var CreateCall = func(functionName string, argnames []g.Generator, op ESOperation) g.Generator {
103+
callInstance := V8InstanceInvocation{
104+
Name: functionName,
105+
Args: argnames,
106+
Op: op,
107+
Instance: &instance,
108+
Receiver: receiver,
109+
}.GetGenerator()
110+
requireContext = requireContext || callInstance.RequireContext
111+
return callInstance.Generator
112+
}
113+
statements := g.StatementList(
114+
AssignArgs(data, op),
115+
GetInstanceAndError(instance, err, data),
116+
readArgsResult,
117+
CreateV8WrapperMethodInstanceInvocations(
118+
data,
119+
op,
120+
idlNameToGoName(op.Name),
121+
readArgsResult.Args,
122+
err,
123+
CreateCall,
124+
true,
125+
),
126+
)
127+
if requireContext {
128+
statements.Prepend(V8RequireContext(receiver))
129+
}
130+
return statements
131+
}
132+
133+
func (gen V8TargetGenerators) CreateHostInitializer(data ESConstructorData) g.Generator {
134+
return g.FunctionDefinition{
135+
Name: prototypeFactoryFunctionName(data),
136+
Args: g.Arg(scriptHost, scriptHostPtr),
137+
RtnTypes: g.List(v8FunctionTemplatePtr),
138+
Body: CreateV8ConstructorBody(data),
139+
}
140+
}
141+
142+
func (gen V8TargetGenerators) PlatformInfoArg() g.Generator { return g.Id("info") }

0 commit comments

Comments
 (0)