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/skyframe/SkylarkAspectFactory.java | |
parent | 50e7db642e301002642a8237a2452b52a7792216 (diff) |
Implement aspect(...) Skylark function.
--
MOS_MIGRATED_REVID=105844221
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java new file mode 100644 index 0000000000..d7bbf40ef9 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java @@ -0,0 +1,95 @@ +// Copyright 2014 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.skyframe; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.Aspect; +import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.events.Location; +import com.google.devtools.build.lib.packages.AspectDefinition; +import com.google.devtools.build.lib.packages.AspectParameters; +import com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions.SkylarkAspect; +import com.google.devtools.build.lib.rules.SkylarkRuleContext; +import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject; +import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.Mutability; + +/** + * A factory for aspects that are defined in Skylark. + */ +public class SkylarkAspectFactory implements ConfiguredAspectFactory { + + private final String name; + private final SkylarkAspect aspectFunction; + + public SkylarkAspectFactory(String name, SkylarkAspect aspectFunction) { + this.name = name; + this.aspectFunction = aspectFunction; + } + + @Override + public Aspect create(ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) + throws InterruptedException { + try (Mutability mutability = Mutability.create("aspect")) { + SkylarkRuleContext skylarkRuleContext; + try { + skylarkRuleContext = new SkylarkRuleContext(ruleContext); + } catch (EvalException e) { + ruleContext.ruleError(e.getMessage()); + return null; + } + Environment env = + Environment.builder(mutability) + .setSkylark() + .setGlobals(aspectFunction.getFuncallEnv().getGlobals()) + .setEventHandler(ruleContext.getAnalysisEnvironment().getEventHandler()) + .build(); // NB: loading phase functions are not available: this is analysis already, + // so we do *not* setLoadingPhase(). + Object aspect; + try { + aspect = + aspectFunction + .getImplementation() + .call( + ImmutableList.<Object>of(base, skylarkRuleContext), + ImmutableMap.<String, Object>of(), + /*ast=*/ null, + env); + } catch (EvalException e) { + ruleContext.ruleError(e.getMessage()); + return null; + } + // TODO(dslomov): unify this code with + // {@link com.google.devtools.build.lib.rules.SkylarkRuleConfiguredTargetBuilder} + Aspect.Builder builder = new Aspect.Builder(name); + if (aspect instanceof SkylarkClassObject) { + SkylarkClassObject struct = (SkylarkClassObject) aspect; + Location loc = struct.getCreationLoc(); + for (String key : struct.getKeys()) { + builder.addSkylarkTransitiveInfo(key, struct.getValue(key), loc); + } + } + return builder.build(); + } + } + + @Override + public AspectDefinition getDefinition() { + return new AspectDefinition.Builder(name).build(); + } +} |