diff options
author | Dmitry Lomov <dslomov@google.com> | 2015-10-20 10:03:14 +0000 |
---|---|---|
committer | Philipp Wollermann <philwo@google.com> | 2015-10-20 16:38:08 +0000 |
commit | 0b832ce8971e28b9e8587ffe436ea6d3046851a9 (patch) | |
tree | 036c75824ada47578916a4738eb756f04c6af0bd /src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java | |
parent | 50e7db642e301002642a8237a2452b52a7792216 (diff) |
Implement aspect(...) Skylark function.
--
MOS_MIGRATED_REVID=105844221
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java index 87b570318c..90d351859f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java @@ -69,6 +69,7 @@ import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.EvalUtils; import com.google.devtools.build.lib.syntax.FuncallExpression; import com.google.devtools.build.lib.syntax.FunctionSignature; +import com.google.devtools.build.lib.syntax.Printer; import com.google.devtools.build.lib.syntax.Runtime; import com.google.devtools.build.lib.syntax.SkylarkCallbackFunction; import com.google.devtools.build.lib.syntax.SkylarkList; @@ -76,6 +77,7 @@ import com.google.devtools.build.lib.syntax.SkylarkModuleNameResolver; import com.google.devtools.build.lib.syntax.SkylarkSignature; import com.google.devtools.build.lib.syntax.SkylarkSignature.Param; import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor; +import com.google.devtools.build.lib.syntax.SkylarkValue; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.syntax.Type.ConversionException; import com.google.devtools.build.lib.vfs.PathFragment; @@ -329,6 +331,21 @@ public class SkylarkRuleClassFunctions { } }; + @SkylarkSignature( + name = "aspect", + returnType = SkylarkAspect.class, + documented = false, // TODO(dslomov): Experimental, document later. + mandatoryPositionals = {@Param(name = "implementation", type = BaseFunction.class)}, + useEnvironment = true + ) + private static final BuiltinFunction aspect = + new BuiltinFunction("aspect") { + public SkylarkAspect invoke(BaseFunction implementation, Environment funcallEnv) { + return new SkylarkAspect(implementation, funcallEnv); + } + }; + + // This class is needed for testing public static final class RuleFunction extends BaseFunction { // Note that this means that we can reuse the same builder. @@ -516,4 +533,36 @@ public class SkylarkRuleClassFunctions { static { SkylarkSignatureProcessor.configureSkylarkFunctions(SkylarkRuleClassFunctions.class); } + + /** + * A Skylark value that is a result of 'aspect(..)' function call. + */ + public static class SkylarkAspect implements SkylarkValue { + private final BaseFunction implementation; + private final Environment funcallEnv; + + public SkylarkAspect(BaseFunction implementation, Environment funcallEnv) { + this.implementation = implementation; + this.funcallEnv = funcallEnv; + } + + public BaseFunction getImplementation() { + return implementation; + } + + public Environment getFuncallEnv() { + return funcallEnv; + } + + @Override + public boolean isImmutable() { + return implementation.isImmutable(); + } + + @Override + public void write(Appendable buffer, char quotationMark) { + Printer.append(buffer, "Aspect:"); + implementation.write(buffer, quotationMark); + } + } } |