diff options
author | cparsons <cparsons@google.com> | 2018-07-30 14:59:43 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-07-30 15:00:58 -0700 |
commit | 3f87d1638f931d08fac0f675ad8783af8b5ce0d9 (patch) | |
tree | 3758b8f9c72469607149f4e7a09f8d4f9fadd6e0 /src/main/java/com/google/devtools/build/lib/analysis | |
parent | c80185c1b6ea5d746b4a38b8b5b8b5ad4682bc89 (diff) |
Make explicit the contract of ConfiguredTarget builders returning null when there are rule errors.
RELNOTES: None.
PiperOrigin-RevId: 206652580
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
2 files changed, 18 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java index 786dba9aeb..ddc1ad6746 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java @@ -49,6 +49,7 @@ import com.google.devtools.build.lib.syntax.Type; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; +import javax.annotation.Nullable; /** * Builder class for analyzed rule instances. @@ -79,7 +80,11 @@ public final class RuleConfiguredTargetBuilder { add(VisibilityProvider.class, new VisibilityProviderImpl(ruleContext.getVisibility())); } - /** Constructs the RuleConfiguredTarget instance based on the values set for this Builder. */ + /** + * Constructs the RuleConfiguredTarget instance based on the values set for this Builder. + * Returns null if there were rule errors reported. + */ + @Nullable public ConfiguredTarget build() throws ActionConflictException { if (ruleContext.getConfiguration().enforceConstraints()) { checkConstraints(); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java index 1f2a184844..3b150c210e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java @@ -74,7 +74,11 @@ public final class SkylarkRuleConfiguredTargetUtil { private static final ImmutableSet<String> DEFAULT_PROVIDER_FIELDS = ImmutableSet.of("files", "runfiles", "data_runfiles", "default_runfiles", "executable"); - /** Create a Rule Configured Target from the ruleContext and the ruleImplementation. */ + /** + * Create a Rule Configured Target from the ruleContext and the ruleImplementation. + * Returns null if there were errors during target creation. + */ + @Nullable public static ConfiguredTarget buildRule( RuleContext ruleContext, AdvertisedProviderSet advertisedProviders, @@ -115,8 +119,12 @@ public final class SkylarkRuleConfiguredTargetUtil { return null; } ConfiguredTarget configuredTarget = createTarget(skylarkRuleContext, target); - SkylarkProviderValidationUtil.validateArtifacts(ruleContext); - checkDeclaredProviders(configuredTarget, advertisedProviders, location); + if (configuredTarget != null) { + // If there was error creating the ConfiguredTarget, no further validation is needed. + // Null will be returned and the errors thus reported. + SkylarkProviderValidationUtil.validateArtifacts(ruleContext); + checkDeclaredProviders(configuredTarget, advertisedProviders, location); + } return configuredTarget; } catch (EvalException e) { addRuleToStackTrace(e, ruleContext.getRule(), ruleImplementation); @@ -172,6 +180,7 @@ public final class SkylarkRuleConfiguredTargetUtil { return ex.getMessage(); } + @Nullable private static ConfiguredTarget createTarget(SkylarkRuleContext context, Object target) throws EvalException, RuleErrorException, ActionConflictException { RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder( |