diff --git a/label/BUILD.bazel b/label/BUILD.bazel index a55908508..94aaa100d 100644 --- a/label/BUILD.bazel +++ b/label/BUILD.bazel @@ -5,7 +5,10 @@ go_library( srcs = ["label.go"], importpath = "github.com/bazelbuild/bazel-gazelle/label", visibility = ["//visibility:public"], - deps = ["//pathtools"], + deps = [ + "//pathtools", + "@com_github_bazelbuild_buildtools//build", + ], ) go_test( diff --git a/label/label.go b/label/label.go index 16a3ba7be..ea2bfdd34 100644 --- a/label/label.go +++ b/label/label.go @@ -27,6 +27,7 @@ import ( "strings" "github.com/bazelbuild/bazel-gazelle/pathtools" + bzl "github.com/bazelbuild/buildtools/build" ) // A Label represents a label of a build target in Bazel. Labels have three @@ -210,6 +211,12 @@ func (l Label) Contains(other Label) bool { return result } +func (l Label) BzlExpr() bzl.Expr { + return &bzl.StringExpr { + Value: l.String(), + } +} + var nonWordRe = regexp.MustCompile(`\W+`) // ImportPathToBazelRepoName converts a Go import path into a bazel repo name diff --git a/rule/value.go b/rule/value.go index 7eb34f8fa..b0ea988df 100644 --- a/rule/value.go +++ b/rule/value.go @@ -22,7 +22,6 @@ import ( "sort" bzl "github.com/bazelbuild/buildtools/build" - "github.com/bazelbuild/bazel-gazelle/label" ) // KeyValue represents a key-value pair. This gets converted into a @@ -38,6 +37,23 @@ type GlobValue struct { Excludes []string } +func (g GlobValue) BzlExpr() bzl.Expr { + patternsValue := ExprFromValue(g.Patterns) + globArgs := []bzl.Expr{patternsValue} + if len(g.Excludes) > 0 { + excludesValue := ExprFromValue(g.Excludes) + globArgs = append(globArgs, &bzl.AssignExpr{ + LHS: &bzl.LiteralExpr{Token: "exclude"}, + Op: "=", + RHS: excludesValue, + }) + } + return &bzl.CallExpr{ + X: &bzl.LiteralExpr{Token: "glob"}, + List: globArgs, + } +} + // BzlExprValue is implemented by types that have custom translations // to Starlark values. type BzlExprValue interface { @@ -182,27 +198,6 @@ func ExprFromValue(val interface{}) bzl.Expr { args[i] = &bzl.KeyValueExpr{Key: k, Value: v} } return &bzl.DictExpr{List: args, ForceMultiLine: true} - - case reflect.Struct: - switch val := val.(type) { - case GlobValue: - patternsValue := ExprFromValue(val.Patterns) - globArgs := []bzl.Expr{patternsValue} - if len(val.Excludes) > 0 { - excludesValue := ExprFromValue(val.Excludes) - globArgs = append(globArgs, &bzl.AssignExpr{ - LHS: &bzl.LiteralExpr{Token: "exclude"}, - Op: "=", - RHS: excludesValue, - }) - } - return &bzl.CallExpr{ - X: &bzl.LiteralExpr{Token: "glob"}, - List: globArgs, - } - case label.Label: - return &bzl.StringExpr{Value: val.String()} - } } log.Panicf("type not supported: %T", val)