Ejemplo n.º 1
0
 private static Environment.Frame createConstantsGlobals() {
   try (Mutability mutability = Mutability.create("CONSTANTS")) {
     Environment env = Environment.builder(mutability).build();
     Runtime.setupConstants(env);
     return env.getGlobals();
   }
 }
Ejemplo n.º 2
0
 @Override
 public Environment createEnvironment(EventHandler eventHandler, Environment environment) {
   return Environment.builder(Mutability.create("build test"))
       .setGlobals(environment == null ? Environment.BUILD : environment.getGlobals())
       .setEventHandler(eventHandler)
       .build();
 }
Ejemplo n.º 3
0
 private static Environment.Frame createSkylarkGlobals() {
   try (Mutability mutability = Mutability.create("SKYLARK")) {
     Environment env = Environment.builder(mutability).setSkylark().build();
     Runtime.setupConstants(env);
     Runtime.setupMethodEnvironment(env, MethodLibrary.skylarkGlobalFunctions);
     return env.getGlobals();
   }
 }
Ejemplo n.º 4
0
 @Override
 public Environment createEnvironment(EventHandler eventHandler, Environment environment) {
   return Environment.builder(Mutability.create("skylark test"))
       .setSkylark()
       .setGlobals(environment == null ? Environment.SKYLARK : environment.getGlobals())
       .setEventHandler(eventHandler)
       .build();
 }
  /**
   * Create a Rule Configured Target from the ruleContext and the ruleImplementation. The
   * registeredProviderTypes map indicates which keys in structs returned by skylark rules should be
   * interpreted as native TransitiveInfoProvider instances of type (map value).
   */
  public static ConfiguredTarget buildRule(
      RuleContext ruleContext,
      BaseFunction ruleImplementation,
      Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes)
      throws InterruptedException {
    String expectFailure = ruleContext.attributes().get("expect_failure", Type.STRING);
    try (Mutability mutability = Mutability.create("configured target")) {
      SkylarkRuleContext skylarkRuleContext = new SkylarkRuleContext(ruleContext, Kind.RULE);
      Environment env =
          Environment.builder(mutability)
              .setSkylark()
              .setCallerLabel(ruleContext.getLabel())
              .setGlobals(
                  ruleContext
                      .getRule()
                      .getRuleClassObject()
                      .getRuleDefinitionEnvironment()
                      .getGlobals())
              .setEventHandler(ruleContext.getAnalysisEnvironment().getEventHandler())
              .build(); // NB: loading phase functions are not available: this is analysis already,
      // so we do *not* setLoadingPhase().
      Object target =
          ruleImplementation.call(
              ImmutableList.<Object>of(skylarkRuleContext),
              ImmutableMap.<String, Object>of(),
              /*ast=*/ null,
              env);

      if (ruleContext.hasErrors()) {
        return null;
      } else if (!(target instanceof SkylarkClassObject)
          && target != Runtime.NONE
          && !(target instanceof Iterable)) {
        ruleContext.ruleError(
            String.format(
                "Rule should return a return a struct or a list, but got %s",
                SkylarkType.typeOf(target)));
        return null;
      } else if (!expectFailure.isEmpty()) {
        ruleContext.ruleError("Expected failure not found: " + expectFailure);
        return null;
      }
      ConfiguredTarget configuredTarget =
          createTarget(ruleContext, target, registeredProviderTypes);
      SkylarkProviderValidationUtil.checkOrphanArtifacts(ruleContext);
      return configuredTarget;
    } catch (EvalException e) {
      addRuleToStackTrace(e, ruleContext.getRule(), ruleImplementation);
      // If the error was expected, return an empty target.
      if (!expectFailure.isEmpty() && getMessageWithoutStackTrace(e).matches(expectFailure)) {
        return new com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder(ruleContext)
            .add(RunfilesProvider.class, RunfilesProvider.EMPTY)
            .build();
      }
      ruleContext.ruleError("\n" + e.print());
      return null;
    }
  }