diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 5eedbd9601..170938e3e2 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -225,6 +225,37 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } + existingMultiLibs := []struct { + name string + srcs *treeset.Set + }{} + if cfg.PerFileGeneration() && args.File != nil { + for _, r := range args.File.Rules { + if r.Kind() != actualPyLibraryKind { + continue + } + srcs := r.AttrStrings("srcs") + pySrcs := make([]string, 0, len(srcs)) + for _, s := range srcs { + if filepath.Ext(s) == ".py" { + pySrcs = append(pySrcs, s) + } + } + if len(pySrcs) <= 1 { + continue + } + set := treeset.NewWith(godsutils.StringComparator) + for _, s := range pySrcs { + set.Add(s) + pyLibraryFilenames.Remove(s) + } + existingMultiLibs = append(existingMultiLibs, struct { + name string + srcs *treeset.Set + }{r.Name(), set}) + } + } + parser := newPython3Parser(args.Config.RepoRoot, args.Rel, cfg.IgnoresDependency) visibility := cfg.Visibility() @@ -328,6 +359,9 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } appendPyLibrary(srcs, pyLibraryTargetName) }) + for _, lib := range existingMultiLibs { + appendPyLibrary(lib.srcs, lib.name) + } } else { appendPyLibrary(pyLibraryFilenames, cfg.RenderLibraryName(packageName)) } diff --git a/gazelle/python/testdata/per_file_respect_existing_multiple_srcs/BUILD.out b/gazelle/python/testdata/per_file_respect_existing_multiple_srcs/BUILD.out index b809be3981..5c56d141ed 100644 --- a/gazelle/python/testdata/per_file_respect_existing_multiple_srcs/BUILD.out +++ b/gazelle/python/testdata/per_file_respect_existing_multiple_srcs/BUILD.out @@ -5,10 +5,13 @@ load("@rules_python//python:defs.bzl", "py_library", "py_test") # This target should be maintained by gazelle (but should get a new deps). py_library( name = "custom", - srcs = ["bar.py", "baz.py"], + srcs = [ + "bar.py", + "baz.py", + ], + tags = ["cant_touch_this"], visibility = ["//visibility:private"], deps = [":foo"], - tags = ["cant_touch_this"], ) py_library(