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,