From aaabea02cbc8c050f19d0cea1ba48c0d85d58b1f Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 9 Feb 2025 01:50:06 +0900 Subject: [PATCH] internal/shaderlister: bug fix: a directive in a function must be ignored Updates #3157 --- internal/shaderlister/main.go | 15 +++++++++++++++ internal/shaderlister/shaderlistertest/def.go | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/internal/shaderlister/main.go b/internal/shaderlister/main.go index 9d15907b9..0153c03e5 100644 --- a/internal/shaderlister/main.go +++ b/internal/shaderlister/main.go @@ -28,6 +28,7 @@ import ( "os" "path/filepath" "regexp" + "slices" "strings" "golang.org/x/tools/go/ast/inspector" @@ -216,8 +217,21 @@ func appendShaderSources(shaders []Shader, pkg *packages.Package) ([]Shader, err visitedPatterns := map[string]struct{}{} visitedPaths := map[string]struct{}{} for _, f := range pkg.Syntax { + var funcs []*ast.FuncDecl + for _, decl := range f.Decls { + if f, ok := decl.(*ast.FuncDecl); ok { + funcs = append(funcs, f) + } + } for _, c := range f.Comments { for _, l := range c.List { + // Ignore the line if it is in a function declaration. + if slices.ContainsFunc(funcs, func(f *ast.FuncDecl) bool { + return f.Pos() <= l.Pos() && l.Pos() < f.End() + }) { + continue + } + m := reShaderFileDirective.FindString(l.Text) if m == "" { continue @@ -293,6 +307,7 @@ func appendShaderSources(shaders []Shader, pkg *packages.Package) ([]Shader, err // Resolve ebitengine:shadersource directives. var genDeclStack []*ast.GenDecl + // inspector.Inspector doesn't iterate comments that are not attached to any other nodes. in := inspector.New(pkg.Syntax) in.Nodes([]ast.Node{ (*ast.GenDecl)(nil), diff --git a/internal/shaderlister/shaderlistertest/def.go b/internal/shaderlister/shaderlistertest/def.go index e0d22e372..540c7903c 100644 --- a/internal/shaderlister/shaderlistertest/def.go +++ b/internal/shaderlister/shaderlistertest/def.go @@ -75,3 +75,9 @@ const ( //ebitengine:shaderfile *_kage.go *_kage.go *_kage.go //ebitengine:shaderfile nonexistent.go + +func foo() { + // Non top-level files are ignored. + + //ebitengine:shaderfile *_notkage.go +}