Attempt #2 at adding BazelContext to the Label constructor. The first attempt broke rules_closure in CI, which was fixed by unknown commit. RELNOTES: None PiperOrigin-RevId: 229307422
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java index 682e433..689e57b 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java
@@ -42,7 +42,11 @@ this.repoMapping = repoMapping; } - /** @param toolsRepository the name of the tools repository, such as "bazel_tools" */ + /** + * @param toolsRepository the name of the tools repository, such as "@bazel_tools" + * @param repoMapping a map from RepositoryName to RepositoryName to be used for external + * repository renaming + */ public BazelStarlarkContext( String toolsRepository, ImmutableMap<RepositoryName, RepositoryName> repoMapping) { this(toolsRepository, null, repoMapping);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java index 0eac93e..4639d41 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -753,9 +753,16 @@ @Override public Label label( - String labelString, Boolean relativeToCallerRepository, Location loc, Environment env) + String labelString, + Boolean relativeToCallerRepository, + Location loc, + Environment env, + StarlarkContext context) throws EvalException { - Label parentLabel = null; + + BazelStarlarkContext bazelStarlarkContext = (BazelStarlarkContext) context; + + Label parentLabel; if (relativeToCallerRepository) { parentLabel = env.getCallerLabel(); } else { @@ -764,10 +771,9 @@ try { if (parentLabel != null) { LabelValidator.parseAbsoluteLabel(labelString); - // TODO(dannark): pass the environment here labelString = parentLabel - .getRelativeWithRemapping(labelString, ImmutableMap.of()) + .getRelativeWithRemapping(labelString, bazelStarlarkContext.getRepoMapping()) .getUnambiguousCanonicalForm(); } return labelCache.get(labelString);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java index 62f5e14..5958424 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext; import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent; import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.cmdline.LabelConstants; @@ -88,6 +89,13 @@ com.google.devtools.build.lib.syntax.Environment.builder(mutability) .setSemantics(skylarkSemantics) .setEventHandler(env.getListener()) + // The fetch phase does not need the tools repository or the fragment map because + // it happens before analysis. + .setStarlarkContext( + new BazelStarlarkContext( + /* toolsRepository = */ null, + /* fragmentNameToClass = */ null, + rule.getPackage().getRepositoryMapping())) .build(); SkylarkRepositoryContext skylarkRepositoryContext = new SkylarkRepositoryContext(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java index a849c6c..74f1453 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
@@ -496,34 +496,42 @@ @SkylarkCallable( name = "Label", - doc = "Creates a Label referring to a BUILD target. Use " - + "this function only when you want to give a default value for the label attributes. " - + "The argument must refer to an absolute label. " - + "Example: <br><pre class=language-python>Label(\"//tools:default\")</pre>", + doc = + "Creates a Label referring to a BUILD target. Use " + + "this function only when you want to give a default value for the label " + + "attributes. The argument must refer to an absolute label. " + + "Example: <br><pre class=language-python>Label(\"//tools:default\")</pre>", parameters = { - @Param(name = "label_string", type = String.class, legacyNamed = true, - doc = "the label string."), - @Param( - name = "relative_to_caller_repository", - type = Boolean.class, - defaultValue = "False", - named = true, - positional = false, - doc = "Deprecated. Do not use. " - + "When relative_to_caller_repository is True and the calling thread is a rule's " - + "implementation function, then a repo-relative label //foo:bar is resolved " - + "relative to the rule's repository. For calls to Label from any other " - + "thread, or calls in which the relative_to_caller_repository flag is False, " - + "a repo-relative label is resolved relative to the file in which the " - + "Label() call appears." - ) + @Param( + name = "label_string", + type = String.class, + legacyNamed = true, + doc = "the label string."), + @Param( + name = "relative_to_caller_repository", + type = Boolean.class, + defaultValue = "False", + named = true, + positional = false, + doc = + "Deprecated. Do not use. " + + "When relative_to_caller_repository is True and the calling thread is a " + + "rule's implementation function, then a repo-relative label //foo:bar is " + + "resolved relative to the rule's repository. For calls to Label from any " + + "other thread, or calls in which the relative_to_caller_repository flag is " + + "False, a repo-relative label is resolved relative to the file in which the " + + "Label() call appears.") }, useLocation = true, - useEnvironment = true - ) + useEnvironment = true, + useContext = true) @SkylarkConstructor(objectType = Label.class) public Label label( - String labelString, Boolean relativeToCallerRepository, Location loc, Environment env) + String labelString, + Boolean relativeToCallerRepository, + Location loc, + Environment env, + StarlarkContext context) throws EvalException; @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java index 90260c1..9690686 100644 --- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java +++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
@@ -149,8 +149,13 @@ } @Override - public Label label(String labelString, Boolean relativeToCallerRepository, Location loc, - Environment env) throws EvalException { + public Label label( + String labelString, + Boolean relativeToCallerRepository, + Location loc, + Environment env, + StarlarkContext context) + throws EvalException { try { return Label.parseAbsolute( labelString,