aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2015-10-20 10:03:14 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2015-10-20 16:38:08 +0000
commit0b832ce8971e28b9e8587ffe436ea6d3046851a9 (patch)
tree036c75824ada47578916a4738eb756f04c6af0bd /src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
parent50e7db642e301002642a8237a2452b52a7792216 (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.java49
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);
+ }
+ }
}