diff --git a/language/go/generate.go b/language/go/generate.go index e0cc1c286..01326782f 100644 --- a/language/go/generate.go +++ b/language/go/generate.go @@ -329,11 +329,36 @@ func (gl *goLang) GenerateRules(args language.GenerateArgs) language.GenerateRes } } + var genGoProtoRules []string + for _, r := range rules { + if r.Kind() == "go_proto_library" { + genGoProtoRules = append(genGoProtoRules, r.Name()) + } + } + // Generate Go rules. if protoName == "" { // Empty proto rules for deletion. _, rs := g.generateProto(pcMode, []protoTarget{pkg.proto}, pkg.importPath) - rules = append(rules, rs...) + + // Do not generate empty rule if already created above + found := false + for _, r := range rs { + if r.Kind() == "go_proto_library" { + for _, pr := range genGoProtoRules { + if pr == r.Name() { + found = true + break + } + } + if found { + break + } + } + } + if !found { + rules = append(rules, rs...) + } } lib := g.generateLib(pkg, protoEmbeds) var libName string diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index 17f1aa607..15cf8d51a 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -35,6 +35,15 @@ gazelle_binary( visibility = ["//visibility:private"], ) +gazelle_binary( + name = "gazelle_with_proto_and_go_languages", + languages = [ + "//language/proto:go_default_library", + "//language/go:go_default_library", + ], + visibility = ["//visibility:private"], +) + [gazelle_generation_test( # Name the test the path to the directory containing the WORKSPACE file. name = file[0:-len("/WORKSPACE")], diff --git a/tests/fix_package_proto_name_match/BUILD.in b/tests/fix_package_proto_name_match/BUILD.in new file mode 100644 index 000000000..fe57d9d3d --- /dev/null +++ b/tests/fix_package_proto_name_match/BUILD.in @@ -0,0 +1 @@ +# gazelle:proto file diff --git a/tests/fix_package_proto_name_match/BUILD.out b/tests/fix_package_proto_name_match/BUILD.out new file mode 100644 index 000000000..fe57d9d3d --- /dev/null +++ b/tests/fix_package_proto_name_match/BUILD.out @@ -0,0 +1 @@ +# gazelle:proto file diff --git a/tests/fix_package_proto_name_match/README.md b/tests/fix_package_proto_name_match/README.md new file mode 100644 index 000000000..755e3910d --- /dev/null +++ b/tests/fix_package_proto_name_match/README.md @@ -0,0 +1,3 @@ +# Fix go_proto_library dependencies + +Fix go_proto_library dependencies when package and proto name match diff --git a/tests/fix_package_proto_name_match/WORKSPACE b/tests/fix_package_proto_name_match/WORKSPACE new file mode 100644 index 000000000..e69de29bb diff --git a/tests/fix_package_proto_name_match/example/BUILD.in b/tests/fix_package_proto_name_match/example/BUILD.in new file mode 100644 index 000000000..e69de29bb diff --git a/tests/fix_package_proto_name_match/example/BUILD.out b/tests/fix_package_proto_name_match/example/BUILD.out new file mode 100644 index 000000000..78fe2ffef --- /dev/null +++ b/tests/fix_package_proto_name_match/example/BUILD.out @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +proto_library( + name = "example_proto", + srcs = ["example.proto"], + visibility = ["//visibility:public"], + deps = ["//google/type:type_proto"], +) + +proto_library( + name = "other_proto", + srcs = ["other.proto"], + visibility = ["//visibility:public"], + deps = ["//google/type:type_proto"], +) + +go_proto_library( + name = "example_go_proto", + importpath = "github.com/bazelbuild/bazel-gazelle/fix_package_proto_name_match/example/example", + proto = ":example_proto", + visibility = ["//visibility:public"], + deps = ["//google/type:date_proto"], +) + +go_proto_library( + name = "other_go_proto", + importpath = "github.com/bazelbuild/bazel-gazelle/fix_package_proto_name_match/example/other", + proto = ":other_proto", + visibility = ["//visibility:public"], + deps = ["//google/type:date_proto"], +) diff --git a/tests/fix_package_proto_name_match/example/example.proto b/tests/fix_package_proto_name_match/example/example.proto new file mode 100644 index 000000000..645172239 --- /dev/null +++ b/tests/fix_package_proto_name_match/example/example.proto @@ -0,0 +1,12 @@ + +syntax = "proto3"; + +package proto.example.example; + +option go_package = "github.com/bazelbuild/bazel-gazelle/fix_package_proto_name_match/example/example"; + +import "google/type/date.proto"; + +message Example { + google.type.Date date = 1; +} diff --git a/tests/fix_package_proto_name_match/example/other.proto b/tests/fix_package_proto_name_match/example/other.proto new file mode 100644 index 000000000..018ec4884 --- /dev/null +++ b/tests/fix_package_proto_name_match/example/other.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +package proto.example.other; + +option go_package = "github.com/bazelbuild/bazel-gazelle/fix_package_proto_name_match/example/other"; + +import "google/type/date.proto"; + +message Other { + google.type.Date date = 1; +} diff --git a/tests/fix_package_proto_name_match/expectedStderr.txt b/tests/fix_package_proto_name_match/expectedStderr.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/tools.bzl b/tests/tools.bzl index 9869c823a..10597c641 100644 --- a/tests/tools.bzl +++ b/tests/tools.bzl @@ -20,4 +20,7 @@ def get_binary(target): if "loads_from_flag" in target: return ":gazelle_with_language_loads_from_flag" + if "fix_package_proto_name_match" in target: + return ":gazelle_with_proto_and_go_languages" + return ":gazelle"