@@ -48,11 +48,14 @@ var (
4848 buildFilenames = []string {"BUILD" , "BUILD.bazel" }
4949)
5050
51- func GetActualKindName (kind string , args language.GenerateArgs ) string {
52- if kindOverride , ok := args .Config .KindMap [kind ]; ok {
53- return kindOverride .KindName
54- }
55- return kind
51+ // kindMatches returns whether r matches the canonical Python rule kind `expected`, respecting `# gazelle:map_kind` and
52+ // `# gazelle:alias_kind` directives in the config.Config c.
53+ func kindMatches (r * rule.Rule , expected string , c * config.Config ) bool {
54+ k := r .Kind ()
55+ if mapped , ok := c .KindMap [expected ]; ok {
56+ return k == mapped .KindName || c .AliasMap [k ] == expected
57+ }
58+ return k == expected || c .AliasMap [k ] == expected
5659}
5760
5861func matchesAnyGlob (s string , globs []string ) bool {
@@ -112,10 +115,6 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
112115 }
113116 }
114117
115- actualPyBinaryKind := GetActualKindName (pyBinaryKind , args )
116- actualPyLibraryKind := GetActualKindName (pyLibraryKind , args )
117- actualPyTestKind := GetActualKindName (pyTestKind , args )
118-
119118 pythonProjectRoot := cfg .PythonProjectRoot ()
120119
121120 packageName := filepath .Base (args .Dir )
@@ -283,10 +282,10 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
283282 sort .Strings (mainFileNames )
284283 for _ , filename := range mainFileNames {
285284 pyBinaryTargetName := strings .TrimSuffix (filepath .Base (filename ), ".py" )
286- if err := ensureNoCollision (args .File , pyBinaryTargetName , actualPyBinaryKind ); err != nil {
285+ if err := ensureNoCollision (args .Config , args . File , pyBinaryTargetName , pyBinaryKind ); err != nil {
287286 fqTarget := label .New ("" , args .Rel , pyBinaryTargetName )
288287 log .Printf ("failed to generate target %q of kind %q: %v" ,
289- fqTarget .String (), actualPyBinaryKind , err )
288+ fqTarget .String (), pyBinaryKind , err )
290289 continue
291290 }
292291
@@ -316,7 +315,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
316315 }
317316 generateEmptyLibrary := false
318317 for _ , r := range args .File .Rules {
319- if r .Kind () == actualPyLibraryKind && r . Name () == pyLibraryTargetName {
318+ if r .Name () == pyLibraryTargetName && kindMatches ( r , pyLibraryKind , args . Config ) {
320319 generateEmptyLibrary = true
321320 }
322321 }
@@ -332,11 +331,11 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
332331 // exists, and if it is of a different kind from the one we are
333332 // generating. If so, we have to throw an error since Gazelle won't
334333 // generate it correctly.
335- if err := ensureNoCollision (args .File , pyLibraryTargetName , actualPyLibraryKind ); err != nil {
334+ if err := ensureNoCollision (args .Config , args . File , pyLibraryTargetName , pyLibraryKind ); err != nil {
336335 fqTarget := label .New ("" , args .Rel , pyLibraryTargetName )
337336 err := fmt .Errorf ("failed to generate target %q of kind %q: %w. " +
338337 "Use the '# gazelle:%s' directive to change the naming convention." ,
339- fqTarget .String (), actualPyLibraryKind , err , pythonconfig .LibraryNamingConvention )
338+ fqTarget .String (), pyLibraryKind , err , pythonconfig .LibraryNamingConvention )
340339 collisionErrors .Add (err )
341340 }
342341
@@ -386,11 +385,11 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
386385 // exists, and if it is of a different kind from the one we are
387386 // generating. If so, we have to throw an error since Gazelle won't
388387 // generate it correctly.
389- if err := ensureNoCollision (args .File , pyBinaryTargetName , actualPyBinaryKind ); err != nil {
388+ if err := ensureNoCollision (args .Config , args . File , pyBinaryTargetName , pyBinaryKind ); err != nil {
390389 fqTarget := label .New ("" , args .Rel , pyBinaryTargetName )
391390 err := fmt .Errorf ("failed to generate target %q of kind %q: %w. " +
392391 "Use the '# gazelle:%s' directive to change the naming convention." ,
393- fqTarget .String (), actualPyBinaryKind , err , pythonconfig .BinaryNamingConvention )
392+ fqTarget .String (), pyBinaryKind , err , pythonconfig .BinaryNamingConvention )
394393 collisionErrors .Add (err )
395394 }
396395
@@ -425,10 +424,10 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
425424 // exists, and if it is of a different kind from the one we are
426425 // generating. If so, we have to throw an error since Gazelle won't
427426 // generate it correctly.
428- if err := ensureNoCollision (args .File , conftestTargetname , actualPyLibraryKind ); err != nil {
427+ if err := ensureNoCollision (args .Config , args . File , conftestTargetname , pyLibraryKind ); err != nil {
429428 fqTarget := label .New ("" , args .Rel , conftestTargetname )
430429 err := fmt .Errorf ("failed to generate target %q of kind %q: %w. " ,
431- fqTarget .String (), actualPyLibraryKind , err )
430+ fqTarget .String (), pyLibraryKind , err )
432431 collisionErrors .Add (err )
433432 }
434433
@@ -462,11 +461,11 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
462461 // exists, and if it is of a different kind from the one we are
463462 // generating. If so, we have to throw an error since Gazelle won't
464463 // generate it correctly.
465- if err := ensureNoCollision (args .File , pyTestTargetName , actualPyTestKind ); err != nil {
464+ if err := ensureNoCollision (args .Config , args . File , pyTestTargetName , pyTestKind ); err != nil {
466465 fqTarget := label .New ("" , args .Rel , pyTestTargetName )
467466 err := fmt .Errorf ("failed to generate target %q of kind %q: %w. " +
468467 "Use the '# gazelle:%s' directive to change the naming convention." ,
469- fqTarget .String (), actualPyTestKind , err , pythonconfig .TestNamingConvention )
468+ fqTarget .String (), pyTestKind , err , pythonconfig .TestNamingConvention )
470469 collisionErrors .Add (err )
471470 }
472471
@@ -575,8 +574,7 @@ func (py *Python) getRulesWithInvalidSrcs(args language.GenerateArgs, validFiles
575574 return strings .HasPrefix (src , "@" ) || strings .HasPrefix (src , "//" ) || strings .HasPrefix (src , ":" )
576575 }
577576 for _ , existingRule := range args .File .Rules {
578- actualPyBinaryKind := GetActualKindName (pyBinaryKind , args )
579- if existingRule .Kind () != actualPyBinaryKind {
577+ if ! kindMatches (existingRule , pyBinaryKind , args .Config ) {
580578 continue
581579 }
582580 var hasValidSrcs bool
@@ -652,12 +650,12 @@ func isEntrypointFile(path string) bool {
652650 }
653651}
654652
655- func ensureNoCollision (file * rule.File , targetName , kind string ) error {
653+ func ensureNoCollision (c * config. Config , file * rule.File , targetName , kind string ) error {
656654 if file == nil {
657655 return nil
658656 }
659657 for _ , t := range file .Rules {
660- if t .Name () == targetName && t . Kind () != kind {
658+ if t .Name () == targetName && ! kindMatches ( t , kind , c ) {
661659 return fmt .Errorf ("a target of kind %q with the same name already exists" , t .Kind ())
662660 }
663661 }
@@ -680,7 +678,7 @@ func generateProtoLibraries(args language.GenerateArgs, cfg *pythonconfig.Config
680678 pyProtoRulesForProto := map [string ]string {}
681679 if args .File != nil {
682680 for _ , r := range args .File .Rules {
683- if r . Kind () == "py_proto_library" {
681+ if kindMatches ( r , pyProtoLibraryKind , args . Config ) {
684682 pyProtoRules [r .Name ()] = false
685683
686684 protos := r .AttrStrings ("deps" )
0 commit comments