Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions examples/grpc_example/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ tidy(
# Ignore the Swift build folder
# gazelle:exclude .build
# gazelle:swift_module_naming_convention pascal_case
# gazelle:swift_generate_proto_libraries true
# gazelle:swift_generate_grpc_libraries_with_flavors client,client_stubs,server

gazelle_binary(
name = "gazelle_bin",
Expand Down
2 changes: 1 addition & 1 deletion examples/grpc_example/protos/echoservice/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
load("@rules_proto//proto:defs.bzl", "proto_library")
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_grpc_library", "swift_proto_library")
load("@rules_proto//proto:defs.bzl", "proto_library")

proto_library(
name = "echoservice_proto",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
load("@rules_proto//proto:defs.bzl", "proto_library")
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_proto_library")
load("@rules_proto//proto:defs.bzl", "proto_library")

proto_library(
name = "messages_proto",
Expand Down
28 changes: 25 additions & 3 deletions gazelle/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,17 @@ func (sl *swiftLang) CheckFlags(fs *flag.FlagSet, c *config.Config) error {

const moduleNamingConventionDirective = "swift_module_naming_convention"
const defaultModuleNameDirective = "swift_default_module_name"
const swiftLibraryTags = "swift_library_tags"
const swiftLibraryTagsDirective = "swift_library_tags"
const swiftGenerateProtoLibrariesDirective = "swift_generate_proto_libraries"
const swiftGenerateGRPCLibrariesWithFlavorsDirective = "swift_generate_grpc_libraries_with_flavors"

func (*swiftLang) KnownDirectives() []string {
return []string{
moduleNamingConventionDirective,
defaultModuleNameDirective,
swiftLibraryTags,
swiftLibraryTagsDirective,
swiftGenerateProtoLibrariesDirective,
swiftGenerateGRPCLibrariesWithFlavorsDirective,
}
}

Expand All @@ -151,7 +155,7 @@ func (*swiftLang) Configure(c *config.Config, rel string, f *rule.File) {
} else {
sc.ModuleNamingConvention = swiftcfg.MatchCaseModuleNamingConvention
}
case swiftLibraryTags:
case swiftLibraryTagsDirective:
var tags []string
if d.Value == "" {
// Mark swift_library targets as manual.
Expand All @@ -164,6 +168,24 @@ func (*swiftLang) Configure(c *config.Config, rel string, f *rule.File) {
tags = strings.Split(d.Value, ",")
}
sc.SwiftLibraryTags = tags
case swiftGenerateProtoLibrariesDirective:
if d.Value == "" {
// By default we generate proto libraries for compatibility with existing behavior.
sc.GenerateProtoLibraries = true
} else {
sc.GenerateProtoLibraries = d.Value == "true"
}
case swiftGenerateGRPCLibrariesWithFlavorsDirective:
var flavors []string
if d.Value == "" {
// By default we generate all flavors for compatibility with existing behavior.
flavors = []string{"client,client_stubs,server"}
} else if d.Value == "-" {
flavors = nil
} else {
flavors = strings.Split(d.Value, ",")
}
sc.GenerateGRPCLibraryFlavors = flavors
case defaultModuleNameDirective:
sc.DefaultModuleNames[rel] = d.Value
}
Expand Down
2 changes: 1 addition & 1 deletion gazelle/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func genRulesFromSrcFiles(sc *swiftcfg.SwiftConfig, args language.GenerateArgs)
result := language.GenerateResult{}

// Generate the rules from the protos (if any):
rules := swift.RulesFromProtos(args)
rules := swift.RulesFromProtos(args, sc.GenerateProtoLibraries, sc.GenerateGRPCLibraryFlavors)
result.Gen = append(result.Gen, rules...)
result.Imports = swift.Imports(result.Gen)

Expand Down
121 changes: 81 additions & 40 deletions gazelle/internal/swift/rules_from_protos.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import (
)

// RulesFromProtos returns the Bazel build rule declarations for the provided source files.
func RulesFromProtos(args language.GenerateArgs) []*rule.Rule {
func RulesFromProtos(
args language.GenerateArgs,
generateProtoLibraries bool,
generateGRPCLibraryFlavors []string,
) []*rule.Rule {

// Extract information about proto files.
// We need this to exclude .pb.go files and generate swift_proto_library rules.
Expand All @@ -34,66 +38,103 @@ func RulesFromProtos(args language.GenerateArgs) []*rule.Rule {
// Generate the rules from proto packages:
var rules []*rule.Rule
for protoPackageName, protoPackage := range protoPackages {
rs := generateRuleFromProtoPackage(args, protoPackageName, protoPackage)
rs := generateRuleFromProtoPackage(
args,
protoPackageName,
protoPackage,
generateProtoLibraries,
generateGRPCLibraryFlavors,
)
rules = append(rules, rs...)
}

return rules
}

func generateRuleFromProtoPackage(args language.GenerateArgs, protoPackageName string, protoPackage proto.Package) []*rule.Rule {
func generateRuleFromProtoPackage(
args language.GenerateArgs,
protoPackageName string,
protoPackage proto.Package,
generateProtoLibraries bool,
generateGRPCLibraryFlavors []string,
) []*rule.Rule {
protoPrefix := strings.TrimSuffix(protoPackageName, "_proto")
protoPackagePrefix := strings.ReplaceAll(args.Rel, "/", "_")
shouldSetVis := shouldSetVisibility(args)

// Generate the swift_proto_library:
rules := []*rule.Rule{}
swiftProtoLibraryName := protoPrefix + swiftProtoSuffix
swiftProtoLibraryModuleName := protoPackagePrefix + "_" + protoPackageName
swiftProtoLibrary := rule.NewRule("swift_proto_library", swiftProtoLibraryName)
swiftProtoLibrary.SetAttr("deps", []string{":" + protoPackageName})
swiftProtoLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
swiftProtoLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, swiftProtoLibraryModuleName)
setVisibilityAttr(swiftProtoLibrary, shouldSetVis, []string{"//visibility:public"})
rules := []*rule.Rule{swiftProtoLibrary}
if generateProtoLibraries {
swiftProtoLibraryModuleName := protoPackagePrefix + "_" + protoPackageName
swiftProtoLibrary := rule.NewRule("swift_proto_library", swiftProtoLibraryName)
swiftProtoLibrary.SetAttr("deps", []string{":" + protoPackageName})
swiftProtoLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
swiftProtoLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, swiftProtoLibraryModuleName)
setVisibilityAttr(swiftProtoLibrary, shouldSetVis, []string{"//visibility:public"})
rules = append(rules, swiftProtoLibrary)
}

if protoPackage.HasServices {
// GH509: Add a configuration to selectively generate specific flavors.

// Determine which swift_grpc_library flavors should be generated:
var shouldGenerateClientFlavor bool
var shouldGenerateClientStubsFlavor bool
var shouldGenerateServerFlavor bool
for _, flavor := range generateGRPCLibraryFlavors {
switch flavor {
case "client":
shouldGenerateClientFlavor = true
case "client_stubs":
shouldGenerateClientStubsFlavor = true
case "server":
shouldGenerateServerFlavor = true
default:
continue
}
}

// Generate the client flavor:
clientSwiftGRPCLibraryName := protoPrefix + "_client" + swiftGRPCSuffix
clientSwiftGRPCLibraryModuleName := protoPackagePrefix + "_" + clientSwiftGRPCLibraryName
clientSwiftGRPCLibrary := rule.NewRule("swift_grpc_library", clientSwiftGRPCLibraryName)
clientSwiftGRPCLibrary.SetAttr("srcs", []string{":" + protoPackageName})
clientSwiftGRPCLibrary.SetAttr("deps", []string{":" + swiftProtoLibraryName})
clientSwiftGRPCLibrary.SetAttr("flavor", "client")
clientSwiftGRPCLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
clientSwiftGRPCLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, clientSwiftGRPCLibraryModuleName)
setVisibilityAttr(clientSwiftGRPCLibrary, shouldSetVis, []string{"//visibility:public"})
rules = append(rules, clientSwiftGRPCLibrary)
if shouldGenerateClientFlavor {
clientSwiftGRPCLibraryModuleName := protoPackagePrefix + "_" + clientSwiftGRPCLibraryName
clientSwiftGRPCLibrary := rule.NewRule("swift_grpc_library", clientSwiftGRPCLibraryName)
clientSwiftGRPCLibrary.SetAttr("srcs", []string{":" + protoPackageName})
clientSwiftGRPCLibrary.SetAttr("deps", []string{":" + swiftProtoLibraryName})
clientSwiftGRPCLibrary.SetAttr("flavor", "client")
clientSwiftGRPCLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
clientSwiftGRPCLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, clientSwiftGRPCLibraryModuleName)
setVisibilityAttr(clientSwiftGRPCLibrary, shouldSetVis, []string{"//visibility:public"})
rules = append(rules, clientSwiftGRPCLibrary)
}

// Generate the client_stubs flavor:
clientStubsSwiftGRPCLibraryName := protoPrefix + "_client_stubs" + swiftGRPCSuffix
clientStubsSwiftGRPCLibraryModuleName := protoPackagePrefix + "_" + clientStubsSwiftGRPCLibraryName
clientStubsSwiftGRPCLibrary := rule.NewRule("swift_grpc_library", clientStubsSwiftGRPCLibraryName)
clientStubsSwiftGRPCLibrary.SetAttr("srcs", []string{":" + protoPackageName})
clientStubsSwiftGRPCLibrary.SetAttr("deps", []string{":" + clientSwiftGRPCLibraryName})
clientStubsSwiftGRPCLibrary.SetAttr("flavor", "client_stubs")
clientStubsSwiftGRPCLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
clientStubsSwiftGRPCLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, clientStubsSwiftGRPCLibraryModuleName)
setVisibilityAttr(clientStubsSwiftGRPCLibrary, shouldSetVis, []string{"//visibility:public"})
rules = append(rules, clientStubsSwiftGRPCLibrary)
if shouldGenerateClientStubsFlavor {
clientStubsSwiftGRPCLibraryName := protoPrefix + "_client_stubs" + swiftGRPCSuffix
clientStubsSwiftGRPCLibraryModuleName := protoPackagePrefix + "_" + clientStubsSwiftGRPCLibraryName
clientStubsSwiftGRPCLibrary := rule.NewRule("swift_grpc_library", clientStubsSwiftGRPCLibraryName)
clientStubsSwiftGRPCLibrary.SetAttr("srcs", []string{":" + protoPackageName})
clientStubsSwiftGRPCLibrary.SetAttr("deps", []string{":" + clientSwiftGRPCLibraryName})
clientStubsSwiftGRPCLibrary.SetAttr("flavor", "client_stubs")
clientStubsSwiftGRPCLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
clientStubsSwiftGRPCLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, clientStubsSwiftGRPCLibraryModuleName)
setVisibilityAttr(clientStubsSwiftGRPCLibrary, shouldSetVis, []string{"//visibility:public"})
rules = append(rules, clientStubsSwiftGRPCLibrary)
}

// Generate the server flavor:
serverSwiftGRPCLibraryName := protoPrefix + "_server" + swiftGRPCSuffix
serverSwiftGRPCLibraryModuleName := protoPackagePrefix + "_" + serverSwiftGRPCLibraryName
serverSwiftGRPCLibrary := rule.NewRule("swift_grpc_library", serverSwiftGRPCLibraryName)
serverSwiftGRPCLibrary.SetAttr("srcs", []string{":" + protoPackageName})
serverSwiftGRPCLibrary.SetAttr("deps", []string{":" + swiftProtoLibraryName})
serverSwiftGRPCLibrary.SetAttr("flavor", "server")
serverSwiftGRPCLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
serverSwiftGRPCLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, serverSwiftGRPCLibraryModuleName)
setVisibilityAttr(serverSwiftGRPCLibrary, shouldSetVis, []string{"//visibility:public"})
rules = append(rules, serverSwiftGRPCLibrary)
if shouldGenerateServerFlavor {
serverSwiftGRPCLibraryName := protoPrefix + "_server" + swiftGRPCSuffix
serverSwiftGRPCLibraryModuleName := protoPackagePrefix + "_" + serverSwiftGRPCLibraryName
serverSwiftGRPCLibrary := rule.NewRule("swift_grpc_library", serverSwiftGRPCLibraryName)
serverSwiftGRPCLibrary.SetAttr("srcs", []string{":" + protoPackageName})
serverSwiftGRPCLibrary.SetAttr("deps", []string{":" + swiftProtoLibraryName})
serverSwiftGRPCLibrary.SetAttr("flavor", "server")
serverSwiftGRPCLibrary.SetPrivateAttr(config.GazelleImportsKey, []string{})
serverSwiftGRPCLibrary.SetPrivateAttr(SwiftProtoModuleNameKey, serverSwiftGRPCLibraryModuleName)
setVisibilityAttr(serverSwiftGRPCLibrary, shouldSetVis, []string{"//visibility:public"})
rules = append(rules, serverSwiftGRPCLibrary)
}
}

return rules
Expand Down
7 changes: 7 additions & 0 deletions gazelle/internal/swiftcfg/swift_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ type SwiftConfig struct {
// Defaults to ["manual"]
SwiftLibraryTags []string

// Whether or not to generate swift proto library targets.
GenerateProtoLibraries bool

// The set of GRPC flavors for which swift grpc library targets will be generated.
// Defaults to ["client,client_stubs,server"]
GenerateGRPCLibraryFlavors []string

// Mapping of relative path to default module name. These values are populated from directives
// that can be applied to
DefaultModuleNames map[string]string
Expand Down