// Copyright 2026 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package noder import ( "sync" "cmd/compile/internal/base" "cmd/compile/internal/ir" "cmd/compile/internal/syntax" "cmd/compile/internal/types2" ) // MatchASTDump returns true if the fn matches the value // of the astdump debug flag. func MatchASTDump(fn *syntax.FuncDecl) bool { if len(base.Debug.AstDump) == 0 { return false } if fn.Name == nil { return false } return matchForDump(fn, base.Ctxt.Pkgpath) } // matchForDump is marked noinline to ensure that the exported // function MatchAstDump IS inlineable and is also small, because // common case is AstDump is not set. // //go:noinline func matchForDump(fn *syntax.FuncDecl, pkgPath string) bool { return ir.MatchPkgFn(pkgPath, fn.Name.Value, base.Debug.AstDump) } func escapedFileName(fn *syntax.FuncDecl, suffix string) string { return ir.EscapedFileName(base.Ctxt.Pkgpath+"."+fn.Name.Value, suffix) } var mu sync.Mutex var htmlWriters = make(map[*syntax.FuncDecl]*HTMLWriter) var orderedFuncs = []*syntax.FuncDecl{} // DumpNodeHTML dumps the node n to the HTML writer for fn. func DumpNodeHTML(pkg *types2.Package, file *syntax.File, info *types2.Info, fn *syntax.FuncDecl, why string, n syntax.Node) { mu.Lock() defer mu.Unlock() w, ok := htmlWriters[fn] if !ok { name := escapedFileName(fn, ".syntax.html") w = NewHTMLWriter(pkg, file, info, name, fn, "") htmlWriters[fn] = w orderedFuncs = append(orderedFuncs, fn) } w.WritePhase(why, why) } // CloseHTMLWriters closes the HTML writer for fn, if one exists. func CloseHTMLWriters() { mu.Lock() defer mu.Unlock() for _, fn := range orderedFuncs { if w, ok := htmlWriters[fn]; ok { w.Close("Writing html syntax output for %s to %s\n", w.pkgFuncName(), w.Path()) delete(htmlWriters, fn) } } orderedFuncs = nil }