cmd/compile: deduplication in the source code generated by mknode

Most types in the ir package don't have hidden children, so having
their doChildrenWithHidden and editChildrenWithHidden methods call
their own doChildren and editChildren methods can save a lot of
duplicate code.

Change-Id: Ib22a29d6a9a32855f3c3191ca2d26dff94ac556b
Reviewed-on: https://go-review.googlesource.com/c/go/+/697476
Reviewed-by: Keith Randall <khr@golang.org>
Auto-Submit: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
This commit is contained in:
Youlin Feng 2025-08-20 11:48:05 +08:00 committed by Gopher Robot
parent fa706ea50f
commit ba840c1bf9
2 changed files with 103 additions and 594 deletions

View file

@ -258,6 +258,7 @@ func processType(t *ast.TypeSpec) {
var doChildrenWithHiddenBody strings.Builder var doChildrenWithHiddenBody strings.Builder
var editChildrenBody strings.Builder var editChildrenBody strings.Builder
var editChildrenWithHiddenBody strings.Builder var editChildrenWithHiddenBody strings.Builder
var hasHidden bool
for _, f := range fields { for _, f := range fields {
names := f.Names names := f.Names
ft := f.Type ft := f.Type
@ -309,6 +310,7 @@ func processType(t *ast.TypeSpec) {
"if n.%s != nil {\nn.%s = edit(n.%s).(%s%s)\n}\n", name, name, name, ptr, ft) "if n.%s != nil {\nn.%s = edit(n.%s).(%s%s)\n}\n", name, name, name, ptr, ft)
} }
if hidden { if hidden {
hasHidden = true
continue continue
} }
if isSlice { if isSlice {
@ -327,19 +329,27 @@ func processType(t *ast.TypeSpec) {
} }
fmt.Fprintf(&buf, "func (n *%s) copy() Node {\nc := *n\n", name) fmt.Fprintf(&buf, "func (n *%s) copy() Node {\nc := *n\n", name)
buf.WriteString(copyBody.String()) buf.WriteString(copyBody.String())
fmt.Fprintf(&buf, "return &c\n}\n") buf.WriteString("return &c\n}\n")
fmt.Fprintf(&buf, "func (n *%s) doChildren(do func(Node) bool) bool {\n", name) fmt.Fprintf(&buf, "func (n *%s) doChildren(do func(Node) bool) bool {\n", name)
buf.WriteString(doChildrenBody.String()) buf.WriteString(doChildrenBody.String())
fmt.Fprintf(&buf, "return false\n}\n") buf.WriteString("return false\n}\n")
fmt.Fprintf(&buf, "func (n *%s) doChildrenWithHidden(do func(Node) bool) bool {\n", name) fmt.Fprintf(&buf, "func (n *%s) doChildrenWithHidden(do func(Node) bool) bool {\n", name)
buf.WriteString(doChildrenWithHiddenBody.String()) if hasHidden {
fmt.Fprintf(&buf, "return false\n}\n") buf.WriteString(doChildrenWithHiddenBody.String())
buf.WriteString("return false\n}\n")
} else {
buf.WriteString("return n.doChildren(do)\n}\n")
}
fmt.Fprintf(&buf, "func (n *%s) editChildren(edit func(Node) Node) {\n", name) fmt.Fprintf(&buf, "func (n *%s) editChildren(edit func(Node) Node) {\n", name)
buf.WriteString(editChildrenBody.String()) buf.WriteString(editChildrenBody.String())
fmt.Fprintf(&buf, "}\n") buf.WriteString("}\n")
fmt.Fprintf(&buf, "func (n *%s) editChildrenWithHidden(edit func(Node) Node) {\n", name) fmt.Fprintf(&buf, "func (n *%s) editChildrenWithHidden(edit func(Node) Node) {\n", name)
buf.WriteString(editChildrenWithHiddenBody.String()) if hasHidden {
fmt.Fprintf(&buf, "}\n") buf.WriteString(editChildrenWithHiddenBody.String())
} else {
buf.WriteString("n.editChildren(edit)\n")
}
buf.WriteString("}\n")
} }
func generateHelpers() { func generateHelpers() {

File diff suppressed because it is too large Load diff