aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/skylark
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2017-10-24 19:59:51 +0200
committerGravatar Dmitry Lomov <dslomov@google.com>2017-10-25 16:46:04 +0200
commitca77f608e486bf7aa762565d25bf7b9e30f2268c (patch)
tree9e24e39d030147864c107f539d18349aa9650278 /src/main/java/com/google/devtools/build/lib/analysis/skylark
parent94cc04f8b6ad5c39dffe91951be5c13a891e2c71 (diff)
Extend TemplateExpander to handle $(func param) expansion
Rewrite the Expander to use the new functionality; also rewrite the Skylark expand_location function to use it. PiperOrigin-RevId: 173280839
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/skylark')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleImplementationFunctions.java31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleImplementationFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleImplementationFunctions.java
index f71730b10a..53aaf47e79 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleImplementationFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleImplementationFunctions.java
@@ -20,11 +20,12 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.AliasProvider;
import com.google.devtools.build.lib.analysis.CommandHelper;
import com.google.devtools.build.lib.analysis.FileProvider;
-import com.google.devtools.build.lib.analysis.LocationExpander;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.configuredtargets.AbstractConfiguredTarget;
+import com.google.devtools.build.lib.analysis.stringtemplate.ExpansionException;
+import com.google.devtools.build.lib.analysis.stringtemplate.TemplateContext;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -318,11 +319,12 @@ public class SkylarkRuleImplementationFunctions {
throws EvalException {
ctx.checkMutable("expand_location");
try {
- return new LocationExpander(
- ctx.getRuleContext(),
- makeLabelMap(targets.getContents(TransitiveInfoCollection.class, "targets")),
- LocationExpander.Options.EXEC_PATHS)
- .expand(input);
+ return ctx
+ .getRuleContext()
+ .getExpander(new FakeTemplateContext())
+ .withExecLocations(
+ makeLabelMap(targets.getContents(TransitiveInfoCollection.class, "targets")))
+ .expand(/*attributeName=*/null, input);
} catch (IllegalStateException ise) {
throw new EvalException(loc, ise);
}
@@ -330,6 +332,23 @@ public class SkylarkRuleImplementationFunctions {
};
/**
+ * This class only exists for backwards compatibility. Previously, we were using LocationExpander
+ * directly, which passes through all unrecognized $() expressions.
+ */
+ private static final class FakeTemplateContext implements TemplateContext {
+ @Override
+ public String lookupVariable(String name) throws ExpansionException {
+ return String.format("$$(%s)", name);
+ }
+
+ @Override
+ public String lookupFunction(String name, String param) throws ExpansionException {
+ // Variables get recursively expanded, functions don't.
+ return String.format("$(%s %s)", name, param);
+ }
+ }
+
+ /**
* Builds a map: Label -> List of files from the given labels
*
* @param knownLabels List of known labels