diff --git a/rule/rule.go b/rule/rule.go index 9678bd3fc..bd51a29dd 100644 --- a/rule/rule.go +++ b/rule/rule.go @@ -880,6 +880,11 @@ func (r *Rule) Args() []bzl.Expr { return r.args } +// AddArg adds a positional argument to the rule. +func (r *Rule) AddArg(value bzl.Expr) { + r.args = append(r.args, value) +} + // Insert marks this statement for insertion at the end of the file. Multiple // statements will be inserted in the order Insert is called. func (r *Rule) Insert(f *File) { diff --git a/rule/rule_test.go b/rule/rule_test.go index 9c84c3ddf..d917cd5c5 100644 --- a/rule/rule_test.go +++ b/rule/rule_test.go @@ -58,7 +58,11 @@ y_library(name = "bar") foo.Delete() bar := f.Rules[1] bar.SetAttr("srcs", []string{"bar.y"}) - baz := NewRule("z", "baz") + loadMaybe := NewLoad("//some:maybe.bzl") + loadMaybe.Add("maybe") + loadMaybe.Insert(f, 0) + baz := NewRule("maybe", "baz") + baz.AddArg(&bzl.LiteralExpr{Token: "z"}) baz.SetAttr("srcs", GlobValue{ Patterns: []string{"**"}, Excludes: []string{"*.pem"}, @@ -67,6 +71,7 @@ y_library(name = "bar") got := strings.TrimSpace(string(f.Format())) want := strings.TrimSpace(` +load("//some:maybe.bzl", "maybe") load("b.bzl", "x_library") load( "c.bzl", @@ -79,7 +84,8 @@ y_library( srcs = ["bar.y"], ) -z( +maybe( + z, name = "baz", srcs = glob( ["**"], @@ -167,6 +173,31 @@ def foo(): } } +func TestArgsAlwaysEndUpBeforeKwargs(t *testing.T) { + f, err := LoadData(filepath.Join("old", "BUILD.bazel"), "", nil) + if err != nil { + t.Fatal(err) + } + + bar := NewRule("maybe", "bar") + bar.SetAttr("url", "https://doesnotexist.com") + bar.AddArg(&bzl.Ident{Name: "http_archive"}) + bar.Insert(f) + f.Sync() + got := strings.TrimSpace(string(f.Format())) + want := strings.TrimSpace(` +maybe( + http_archive, + name = "bar", + url = "https://doesnotexist.com", +) +`) + + if got != want { + t.Errorf("got:\n%s\nwant:%s", got, want) + } +} + func TestDeleteSyncDelete(t *testing.T) { old := []byte(` x_library(name = "foo")