diff options
author | ulfjack <ulfjack@google.com> | 2017-10-24 19:59:51 +0200 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2017-10-25 16:46:04 +0200 |
commit | ca77f608e486bf7aa762565d25bf7b9e30f2268c (patch) | |
tree | 9e24e39d030147864c107f539d18349aa9650278 /src/main/java/com/google/devtools/build/lib/analysis/skylark | |
parent | 94cc04f8b6ad5c39dffe91951be5c13a891e2c71 (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.java | 31 |
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 |