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 +}