diff options
author | Chris Parsons <cparsons@google.com> | 2016-05-23 17:39:42 +0000 |
---|---|---|
committer | Yue Gan <yueg@google.com> | 2016-05-24 11:56:43 +0000 |
commit | 4dfb22c4bad3dfa4dba46426c8587c0aa148d8d9 (patch) | |
tree | 5b09b10bef0e0ca634d237af86b6e9da7160f846 /src/main/java/com/google/devtools/build/lib | |
parent | fe206a490a2aa48c789c0edd35383407f44bc49b (diff) |
Allow use of Exceptions to exit early out of configured-target creation, instead of passing and checking null in all helpers.
Demonstrates this pattern usage in a few select rules (e.g. AndroidBinary) where this was particularly egregious.
There are many places which can benefit from this pattern -- this change doesn't try to fix them all at once.
--
MOS_MIGRATED_REVID=123012378
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
56 files changed, 254 insertions, 156 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java index 368f373d27..c979b440ac 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java @@ -45,6 +45,7 @@ import com.google.devtools.build.lib.packages.PackageGroupsRuleVisibility; import com.google.devtools.build.lib.packages.PackageSpecification; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleVisibility; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.rules.SkylarkRuleConfiguredTargetBuilder; @@ -266,7 +267,15 @@ public final class ConfiguredTargetFactory { RuleClass.ConfiguredTargetFactory<ConfiguredTarget, RuleContext> factory = rule.getRuleClassObject().<ConfiguredTarget, RuleContext>getConfiguredTargetFactory(); Preconditions.checkNotNull(factory, rule.getRuleClassObject()); - return factory.create(ruleContext); + try { + return factory.create(ruleContext); + } catch (RuleErrorException ruleErrorException) { + // Returning null in this method is an indication an error occurred. Exceptions are not + // propagated, as this would show a nasty stack trace to users, and only provide info + // on one specific failure with poor messaging. By returning null, the caller can + // inspect ruleContext for multiple errors and output thorough messaging on each. + return null; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index 20ff73c903..f7671a2655 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java @@ -65,6 +65,7 @@ import com.google.devtools.build.lib.packages.PackageSpecification; import com.google.devtools.build.lib.packages.RawAttributeMapper; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.TargetUtils; @@ -289,6 +290,16 @@ public final class RuleContext extends TargetContext public boolean hasErrors() { return getAnalysisEnvironment().hasErrors(); } + + /** + * No-op if {@link #hasErrors} is false, throws {@link RuleErrorException} if it is true. + * This provides a convenience to early-exit of configured target creation if there are errors. + */ + public void assertNoErrors() throws RuleErrorException { + if (hasErrors()) { + throw new RuleErrorException(); + } + } /** * Returns an immutable map from attribute name to list of configured targets for that attribute. @@ -406,6 +417,17 @@ public final class RuleContext extends TargetContext public void ruleError(String message) { reporter.ruleError(message); } + + /** + * Convenience function to report non-attribute-specific errors in the current rule and then + * throw a {@link RuleErrorException}, immediately exiting the build invocation. Alternatively, + * invoke {@link #ruleError} instead to collect additional error information before ending the + * invocation. + */ + public void throwWithRuleError(String message) throws RuleErrorException { + reporter.ruleError(message); + throw new RuleErrorException(); + } /** * Convenience function for subclasses to report non-attribute-specific @@ -429,6 +451,20 @@ public final class RuleContext extends TargetContext } /** + * Convenience function to report attribute-specific errors in the current rule, and then throw a + * {@link RuleErrorException}, immediately exiting the build invocation. Alternatively, invoke + * {@link #attributeError} instead to collect additional error information before ending the + * invocation. + * + * <p>If the name of the attribute starts with <code>$</code> + * it is replaced with a string <code>(an implicit dependency)</code>. + */ + public void throwWithAttributeError(String attrName, String message) throws RuleErrorException { + reporter.attributeError(attrName, message); + throw new RuleErrorException(); + } + + /** * Like attributeError, but does not mark the configured target as errored. * * <p>If the name of the attribute starts with <code>$</code> diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigSetting.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigSetting.java index 331c47eba4..99f998c1d4 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigSetting.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigSetting.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.Preconditions; @@ -44,7 +45,8 @@ import java.util.Map; public class ConfigSetting implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { // Get the required flag=value settings for this rule. Map<String, String> settings = NonconfigurableAttributeMapper.of(ruleContext.getRule()) .get(ConfigRuleClasses.ConfigSettingRule.SETTINGS_ATTRIBUTE, Type.STRING_DICT); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java index c8be4087a5..52e10c8e48 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.EnvironmentGroup; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -30,7 +31,7 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class Environment implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { // The main analysis work to do here is to simply fill in SupportedEnvironmentsProvider to // pass the environment itself to depending rules. diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java index d1c03fb9c9..6c026d6d77 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.android.AndroidCommon; import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider; import com.google.devtools.build.lib.rules.android.AndroidSemantics; @@ -52,11 +53,11 @@ public class BazelAndroidSemantics implements AndroidSemantics { Artifact jarWithAllClasses) {} @Override - public ApplicationManifest getManifestForRule(RuleContext ruleContext) { + public ApplicationManifest getManifestForRule(RuleContext ruleContext) throws RuleErrorException { ApplicationManifest result = ApplicationManifest.fromRule(ruleContext); if (!result.getManifest().getExecPath().getBaseName().equals("AndroidManifest.xml")) { ruleContext.attributeError("manifest", "The manifest must be called 'AndroidManifest.xml'"); - return null; + throw new RuleErrorException(); } return result; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRule.java index 1448aee2ce..e906c11e17 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRule.java @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -62,7 +63,7 @@ public class GenRule implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { final List<Artifact> resolvedSrcs = Lists.newArrayList(); final NestedSet<Artifact> filesToBuild = diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java index cd2a48ee06..6da83aaa12 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.actions.ExecutableSymlinkAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -33,7 +34,7 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class ShBinary implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { ImmutableList<Artifact> srcs = ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list(); if (srcs.size() != 1) { ruleContext.attributeError("srcs", "you must specify exactly one file in 'srcs'"); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java index 9e94d4591a..d99aaa10ff 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -30,7 +31,7 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class ShLibrary implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { NestedSet<Artifact> filesToBuild = NestedSetBuilder.<Artifact>stableOrder() .addAll(ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list()) .addAll(ruleContext.getPrerequisiteArtifacts("deps", Mode.TARGET).list()) diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index f01026b8da..78ec863edd 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -183,8 +183,18 @@ public final class RuleClass { public interface ConfiguredTargetFactory<TConfiguredTarget, TContext> { /** * Returns a fully initialized configured target instance using the given context. + * + * @throws RuleErrorException if configured target creation could not be completed due to rule + * errors + */ + TConfiguredTarget create(TContext ruleContext) throws InterruptedException, RuleErrorException; + + /** + * Exception indicating that configured target creation could not be completed. Error messaging + * should be done via {@link RuleErrorConsumer}; this exception only interrupts configured + * target creation in cases where it can no longer continue. */ - TConfiguredTarget create(TContext ruleContext) throws InterruptedException; + public static final class RuleErrorException extends Exception {} } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/Alias.java b/src/main/java/com/google/devtools/build/lib/rules/Alias.java index 11abd0e4ea..0160940692 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/Alias.java +++ b/src/main/java/com/google/devtools/build/lib/rules/Alias.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.VisibilityProvider; import com.google.devtools.build.lib.analysis.VisibilityProviderImpl; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.util.FileTypeSet; /** @@ -35,7 +36,8 @@ import com.google.devtools.build.lib.util.FileTypeSet; */ public class Alias implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ConfiguredTarget actual = (ConfiguredTarget) ruleContext.getPrerequisite("actual", Mode.TARGET); return new AliasConfiguredTarget( ruleContext.getConfiguration(), diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index c112969e77..ff7128523d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -84,7 +84,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { protected abstract AndroidSemantics createAndroidSemantics(); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); if (!AndroidSdkProvider.verifyPresence(ruleContext)) { @@ -112,9 +113,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { androidCommon, javaSemantics, androidSemantics); - if (builder == null) { - return null; - } return builder.build(); } @@ -125,23 +123,22 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { JavaCommon javaCommon, AndroidCommon androidCommon, JavaSemantics javaSemantics, - AndroidSemantics androidSemantics) throws InterruptedException { + AndroidSemantics androidSemantics) + throws InterruptedException, RuleErrorException { if (getMultidexMode(ruleContext) != MultidexMode.LEGACY && ruleContext.attributes().isAttributeValueExplicitlySpecified( "main_dex_proguard_specs")) { - ruleContext.attributeError("main_dex_proguard_specs", "The 'main_dex_proguard_specs' " - + "attribute is only allowed if 'multidex' is set to 'legacy'"); - return null; + ruleContext.throwWithAttributeError("main_dex_proguard_specs", "The " + + "'main_dex_proguard_specs' attribute is only allowed if 'multidex' is set to 'legacy'"); } if (ruleContext.attributes().isAttributeValueExplicitlySpecified("proguard_apply_mapping") && ruleContext.attributes() .get(ProguardHelper.PROGUARD_SPECS, BuildType.LABEL_LIST) .isEmpty()) { - ruleContext.attributeError("proguard_apply_mapping", + ruleContext.throwWithAttributeError("proguard_apply_mapping", "'proguard_apply_mapping' can only be used when 'proguard_specs' is also set"); - return null; } // TODO(bazel-team): Find a way to simplify this code. @@ -188,13 +185,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ResourceApk resourceApk; if (LocalResourceContainer.definesAndroidResources(ruleContext.attributes())) { // Retrieve and compile the resources defined on the android_binary rule. - if (!LocalResourceContainer.validateRuleContext(ruleContext)) { - return null; - } + LocalResourceContainer.validateRuleContext(ruleContext); ApplicationManifest ruleManifest = androidSemantics.getManifestForRule(ruleContext); - if (ruleManifest == null) { - return null; - } String applicationId = ruleContext.attributes().get("application_id", Type.STRING); String versionCode = getExpandedMakeVarsForAttr(ruleContext, "version_code"); @@ -235,9 +227,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { createMainDexProguardSpec(ruleContext), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); incrementalResourceApk = applicationManifest.addStubApplication(ruleContext) .packWithDataAndResources(ruleContext .getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK), @@ -258,9 +248,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { null, /* mainDexProguardCfg */ null, /* manifestOut */ null /* mergedResourcesOut */); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); splitResourceApk = applicationManifest .createSplitManifest(ruleContext, "android_resources", false) .packWithDataAndResources(getDxArtifact(ruleContext, "android_resources.ap_"), @@ -281,21 +269,18 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { null, /* mainDexProguardCfg */ null, /* manifestOut */ null /* mergedResourcesOut */); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); } else { if (!ruleContext.attributes().get("crunch_png", Type.BOOLEAN)) { - ruleContext.ruleError("Setting crunch_png = 0 is not supported for android_binary" + ruleContext.throwWithRuleError("Setting crunch_png = 0 is not supported for android_binary" + " rules which depend on android_resources rules."); - return null; } // Retrieve the resources from the resources attribute on the android_binary rule // and recompile them if necessary. ApplicationManifest resourcesManifest = ApplicationManifest.fromResourcesRule(ruleContext); if (resourcesManifest == null) { - return null; + throw new RuleErrorException(); } applicationManifest = resourcesManifest.mergeWith(ruleContext, resourceDeps); // Always recompiling resources causes AndroidTest to fail in certain circumstances. @@ -322,9 +307,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { false, ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental"), null /* mainDexProguardConfig */); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); splitResourceApk = applicationManifest .createSplitManifest(ruleContext, "android_resources", false) @@ -334,9 +317,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { false, ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"), null /* mainDexProguardConfig */); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); } JavaTargetAttributes resourceClasses = androidCommon.init( @@ -345,9 +326,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { resourceApk, ruleContext.getConfiguration().isCodeCoverageEnabled(), true /* collectJavaCompilationArgs */); - if (resourceClasses == null) { - return null; - } + ruleContext.assertNoErrors(); Artifact deployJar = createDeployJar(ruleContext, javaSemantics, androidCommon, resourceClasses, ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_DEPLOY_JAR)); @@ -396,7 +375,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { JavaTargetAttributes resourceClasses, ImmutableList<Artifact> apksUnderTest, ImmutableList<Artifact> additionalMergedManifests, - Artifact proguardMapping) throws InterruptedException { + Artifact proguardMapping) + throws InterruptedException, RuleErrorException { ImmutableList<Artifact> proguardSpecs = ProguardHelper.collectTransitiveProguardSpecs( ruleContext, ImmutableList.of(resourceApk.getResourceProguardConfig())); @@ -429,9 +409,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { androidCommon, resourceApk.getMainDexProguardConfig(), resourceClasses); - if (dexingOutput == null) { - return null; - } Artifact unsignedApk = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_UNSIGNED_APK); @@ -503,9 +480,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact stubData = ruleContext.getImplicitOutputArtifact( AndroidRuleClasses.STUB_APPLICATION_DATA); Artifact stubDex = getStubDex(ruleContext, javaSemantics, false); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); ApkActionBuilder incrementalActionBuilder = new ApkActionBuilder(ruleContext, androidSemantics) .classesDex(stubDex) @@ -623,9 +598,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { NestedSet<Artifact> splitApks = splitApkSetBuilder.build(); Artifact splitMainApk = getDxArtifact(ruleContext, "split_main.apk"); Artifact splitStubDex = getStubDex(ruleContext, javaSemantics, true); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics) .resourceApk(splitMainApkResources) .classesDex(splitStubDex) @@ -1078,35 +1051,31 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { AndroidCommon common, @Nullable Artifact mainDexProguardSpec, JavaTargetAttributes attributes) - throws InterruptedException { + throws InterruptedException, RuleErrorException { boolean isFinalJarDerived = isBinaryJarFiltered || binaryJar != proguardedJar; List<String> dexopts = ruleContext.getTokenizedStringListAttr("dexopts"); MultidexMode multidexMode = getMultidexMode(ruleContext); if (!supportsMultidexMode(ruleContext, multidexMode)) { - ruleContext.ruleError("Multidex mode \"" + multidexMode.getAttributeValue() + ruleContext.throwWithRuleError("Multidex mode \"" + multidexMode.getAttributeValue() + "\" not supported by this version of the Android SDK"); - return null; } int dexShards = ruleContext.attributes().get("dex_shards", Type.INTEGER); if (dexShards > 1) { if (multidexMode == MultidexMode.OFF) { - ruleContext.ruleError(".dex sharding is only available in multidex mode"); - return null; + ruleContext.throwWithRuleError(".dex sharding is only available in multidex mode"); } if (multidexMode == MultidexMode.MANUAL_MAIN_DEX) { - ruleContext.ruleError(".dex sharding is not available in manual multidex mode"); - return null; + ruleContext.throwWithRuleError(".dex sharding is not available in manual multidex mode"); } } Artifact mainDexList = ruleContext.getPrerequisiteArtifact("main_dex_list", Mode.TARGET); if ((mainDexList != null && multidexMode != MultidexMode.MANUAL_MAIN_DEX) || (mainDexList == null && multidexMode == MultidexMode.MANUAL_MAIN_DEX)) { - ruleContext.ruleError( + ruleContext.throwWithRuleError( "Both \"main_dex_list\" and \"multidex='manual_main_dex'\" must be specified."); - return null; } // Always OFF if finalJarIsDerived diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index e3fe0b4256..8630825550 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.android.AndroidLibraryAarProvider.Aar; import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; @@ -51,7 +52,8 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { protected abstract AndroidSemantics createAndroidSemantics(); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); if (!AndroidSdkProvider.verifyPresence(ruleContext)) { @@ -70,16 +72,13 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { boolean definesLocalResources = LocalResourceContainer.definesAndroidResources(ruleContext.attributes()); - if (definesLocalResources && !LocalResourceContainer.validateRuleContext(ruleContext)) { - return null; + if (definesLocalResources) { + LocalResourceContainer.validateRuleContext(ruleContext); } final ResourceApk resourceApk; if (definesLocalResources) { ApplicationManifest applicationManifest = androidSemantics.getManifestForRule(ruleContext); - if (applicationManifest == null) { - return null; - } resourceApk = applicationManifest.packWithDataAndResources( null, /* resourceApk -- not needed for library */ ruleContext, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java index a4d32e9ec4..214797c71c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.AggregatingAttributeMapper; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.java.BaseJavaCompilationHelper; import com.google.devtools.build.lib.rules.java.JavaConfiguration; @@ -41,7 +42,8 @@ import java.util.Collection; */ public class AndroidSdk implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { // If the user didn't specify --proguard_top, go with the proguard attribute in the android_sdk // rule. Otherwise, use what she told us to. FilesToRunProvider proguard = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java index 72f178e2fa..469d5e77ec 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.OutputGroupProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts; import com.google.devtools.build.lib.rules.java.JavaSemantics; @@ -67,7 +68,8 @@ public interface AndroidSemantics { * Returns the manifest to be used when compiling a given rule. * @throws InterruptedException */ - ApplicationManifest getManifestForRule(RuleContext ruleContext) throws InterruptedException; + ApplicationManifest getManifestForRule(RuleContext ruleContext) + throws InterruptedException, RuleErrorException; /** * Returns the name of the file in which the file names of native dependencies are listed. diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java index b7b17905c6..8c29552a22 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import java.util.regex.Pattern; @@ -44,7 +45,8 @@ public class AndroidToolsDefaultsJar implements RuleConfiguredTargetFactory { Pattern.compile("android[a-zA-Z0-9_]*\\.jar$"); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { if (!ruleContext.getLabel().getPackageName().equals("tools/defaults")) { // Guard against extraordinarily inquisitive individuals. ruleContext.ruleError("The android_tools_defaults_jar rule should not be used in BUILD files." diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java b/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java index 3d5226cceb..acd5cf1aa3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.AttributeMap; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType; import com.google.devtools.build.lib.vfs.PathFragment; @@ -64,60 +65,61 @@ public final class LocalResourceContainer { /** * Checks validity of a RuleContext to produce an AndroidData. + * + * @throws RuleErrorException if the RuleContext is invalid. Accumulated errors will be available + * via {@code ruleContext} */ - public static boolean validateRuleContext(RuleContext ruleContext) { - boolean valid = validateAssetsAndAssetsDir(ruleContext); - valid = valid && validateNoResourcesAttribute(ruleContext); - valid = valid && validateNoAndroidResourcesInSources(ruleContext); - valid = valid && validateManifest(ruleContext); - return valid; + public static void validateRuleContext(RuleContext ruleContext) throws RuleErrorException { + validateAssetsAndAssetsDir(ruleContext); + validateNoResourcesAttribute(ruleContext); + validateNoAndroidResourcesInSources(ruleContext); + validateManifest(ruleContext); } - private static boolean validateAssetsAndAssetsDir(RuleContext ruleContext) { + private static void validateAssetsAndAssetsDir(RuleContext ruleContext) + throws RuleErrorException { if (ruleContext.attributes().isAttributeValueExplicitlySpecified("assets") ^ ruleContext.attributes().isAttributeValueExplicitlySpecified("assets_dir")) { ruleContext.ruleError( "'assets' and 'assets_dir' should be either both empty or both non-empty"); - return false; + throw new RuleErrorException(); } - return true; } /** * Validates that there are no resources defined if there are resource attribute defined. */ - private static boolean validateNoResourcesAttribute(RuleContext ruleContext) { + private static void validateNoResourcesAttribute(RuleContext ruleContext) + throws RuleErrorException { if (ruleContext.attributes().isAttributeValueExplicitlySpecified("resources")) { ruleContext.attributeError("resources", String.format("resources cannot be set when any of %s are defined.", Joiner.on(", ").join(RESOURCES_ATTRIBUTES))); - return false; + throw new RuleErrorException(); } - return true; } /** * Validates that there are no android_resources srcjars in the srcs, as android_resource rules * should not be used with the Android data logic. */ - private static boolean validateNoAndroidResourcesInSources(RuleContext ruleContext) { + private static void validateNoAndroidResourcesInSources(RuleContext ruleContext) + throws RuleErrorException { Iterable<AndroidResourcesProvider> resources = ruleContext.getPrerequisites("srcs", Mode.TARGET, AndroidResourcesProvider.class); for (AndroidResourcesProvider provider : resources) { ruleContext.attributeError("srcs", String.format("srcs should not contain android_resource label %s", provider.getLabel())); - return false; + throw new RuleErrorException(); } - return true; } - private static boolean validateManifest(RuleContext ruleContext) { + private static void validateManifest(RuleContext ruleContext) throws RuleErrorException { if (ruleContext.getPrerequisiteArtifact("manifest", Mode.TARGET) == null) { ruleContext.attributeError("manifest", "manifest is required when resource_files or assets are defined."); - return false; + throw new RuleErrorException(); } - return true; } public static class Builder { diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java index efa07cc3d1..be3fdf52c3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -47,7 +48,8 @@ import javax.annotation.Nullable; public class XcodeConfig implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { return new RuleConfiguredTargetBuilder(ruleContext) .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY) .build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java index b630f5de40..bafddeea75 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -26,7 +27,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class XcodeVersion implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { XcodeVersionRuleData ruleData = new XcodeVersionRuleData(ruleContext.getLabel(), ruleContext.getRule()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index 6b6b5cc042..541363d7e0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.Platform; @@ -149,7 +150,8 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext context) throws InterruptedException { + public ConfiguredTarget create(RuleContext context) + throws InterruptedException, RuleErrorException { return CcBinary.init(semantics, context, /*fake =*/ false, /*useTestOnlyFlags =*/ false); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java index bceaa59c99..923bc716a8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.actions.CreateIncSymlinkAction; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider; @@ -57,7 +58,7 @@ public abstract class CcIncLibrary implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(final RuleContext ruleContext) { + public ConfiguredTarget create(final RuleContext ruleContext) throws RuleErrorException { FeatureConfiguration featureConfiguration = CcCommon.configureFeatures(ruleContext); PathFragment packageFragment = ruleContext.getPackageDirectory(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java index d6a34ca5d2..e7db2a5273 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java @@ -34,6 +34,7 @@ import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RawAttributeMapper; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; @@ -93,7 +94,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext context) { + public ConfiguredTarget create(RuleContext context) throws RuleErrorException { RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(context); LinkTargetType linkType = getStaticLinkType(context); boolean linkStatic = context.attributes().get("linkstatic", Type.BOOLEAN); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java index f6464ca402..e4d312f833 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -30,7 +31,8 @@ public abstract class CcTest implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext context) throws InterruptedException { + public ConfiguredTarget create(RuleContext context) + throws InterruptedException, RuleErrorException { return CcBinary.init(semantics, context, /*fake =*/ false, /*useTestOnlyFlags =*/ true); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java index 9c184b82e0..a50b71a33d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java @@ -62,7 +62,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory { new PathFragment("include/stdc-predef.h"); @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { CppConfiguration cppConfiguration = Preconditions.checkNotNull(ruleContext.getFragment(CppConfiguration.class)); Path fdoZip = ruleContext.getConfiguration().getCompilationMode() == CompilationMode.OPT diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java index b70bcfa4e6..637d86a09f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -32,7 +33,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class CcToolchainSuite implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { return new RuleConfiguredTargetBuilder(ruleContext) .setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER)) .add(RunfilesProvider.class, RunfilesProvider.EMPTY) diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java index 0c7fbf950e..02c3201f58 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java +++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.collect.ImmutableSortedKeyListMultimap; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -35,7 +36,7 @@ import java.util.Set; */ public final class ActionListener implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { // This rule doesn't produce any output when listed as a build target. // Only when used via the --experimental_action_listener flag, // this rule instructs the build system to add additional outputs. diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java index e84cbcabd9..e1b3c11b99 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -38,7 +39,7 @@ import java.util.List; */ public final class ExtraActionFactory implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext context) { + public ConfiguredTarget create(RuleContext context) throws RuleErrorException { // This rule doesn't produce any output when listed as a build target. // Only when used via the --experimental_action_listener flag, // this rule instructs the build system to add additional outputs. diff --git a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java index fb4d990fcf..cbbc0fccd6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java +++ b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector; import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector.InstrumentationSpec; @@ -43,7 +44,7 @@ import java.util.Iterator; public class Filegroup implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { NestedSet<Artifact> filesToBuild = NestedSetBuilder.wrap(Order.STABLE_ORDER, ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list()); NestedSet<Artifact> middleman = CompilationHelper.getAggregatingMiddleman( diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java index 3e4bfbd349..69e5d576e3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java +++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java @@ -44,6 +44,7 @@ import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.Package; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; import com.google.devtools.build.lib.pkgcache.FilteringPolicy; @@ -102,7 +103,8 @@ public class GenQuery implements RuleConfiguredTargetFactory { @Override @Nullable - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { Artifact outputArtifact = ruleContext.createOutputArtifact(); // The query string diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java index 1b82de28fb..5551e2144f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java @@ -37,6 +37,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.cpp.CppHelper; @@ -64,7 +65,8 @@ public class JavaBinary implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { final JavaCommon common = new JavaCommon(ruleContext, semantics); DeployArchiveBuilder deployArchiveBuilder = new DeployArchiveBuilder(semantics, ruleContext); Runfiles.Builder runfilesBuilder = new Runfiles.Builder( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java index b6ac48ec1a..7a61685463 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -48,7 +49,8 @@ public class JavaImport implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ImmutableList<Artifact> srcJars = ImmutableList.of(); ImmutableList<Artifact> jars = collectJars(ruleContext); Artifact srcJar = ruleContext.getPrerequisiteArtifact("srcjar", Mode.TARGET); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java index 3b4cc3c12b..a9cf0f1786 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -43,7 +44,8 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { JavaCommon common = new JavaCommon(ruleContext, semantics); RuleConfiguredTargetBuilder builder = init(ruleContext, common); return builder != null ? builder.build() : null; diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java index 5466ca8837..e3aa8c32d0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -32,7 +33,8 @@ public class JavaPlugin implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { JavaLibrary javaLibrary = new JavaLibrary(semantics); JavaCommon common = new JavaCommon(ruleContext, semantics); RuleConfiguredTargetBuilder builder = javaLibrary.init(ruleContext, common); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java index 51c5ebae40..39eedaa78c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -38,7 +39,7 @@ import java.util.List; public final class JavaToolchain implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { final String source = ruleContext.attributes().get("source_version", Type.STRING); final String target = ruleContext.attributes().get("target_version", Type.STRING); final NestedSet<Artifact> bootclasspath = getArtifactList("bootclasspath", ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java index aee8633544..0e4cb61c1a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider; import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; @@ -59,7 +60,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory { "At least one source file is required (srcs, non_arc_srcs, or precompiled_srcs)."; @Override - public final ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public final ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ImmutableListMultimap<BuildConfiguration, ObjcProvider> configurationToNonPropagatedObjcMap = ruleContext.getPrerequisitesByConfiguration("non_propagated_deps", Mode.SPLIT, ObjcProvider.class); @@ -103,11 +105,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { J2ObjcEntryClassProvider j2ObjcEntryClassProvider = j2ObjcEntryClassProviderBuilder.build(); if (!common.getCompilationArtifacts().get().getArchive().isPresent()) { - ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_SOURCE_FILE); - return null; - } - if (ruleContext.hasErrors()) { - return null; + ruleContext.throwWithRuleError(REQUIRES_AT_LEAST_ONE_SOURCE_FILE); } archivesToLipo.add(common.getCompilationArtifacts().get().getArchive().get()); @@ -119,10 +117,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { new ExtraLinkArgs(), ImmutableList.<Artifact>of(), DsymOutputType.APP) .validateAttributes(); - - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); } AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1Extension.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1Extension.java index 5be91fa558..6100bf2d74 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1Extension.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1Extension.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; import com.google.devtools.build.lib.rules.objc.IosExtension.ExtensionSplitArchTransition; @@ -53,7 +54,8 @@ public class AppleWatch1Extension implements RuleConfiguredTargetFactory { ImmutableSet.of(new Attribute(WATCH_APP_DEPS_ATTR, Mode.SPLIT)); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ObjcProvider.Builder applicationObjcProviderBuilder = new ObjcProvider.Builder(); ObjcProvider.Builder extensionObjcProviderBuilder = new ObjcProvider.Builder(); ObjcProvider.Builder exposedObjcProviderBuilder = new ObjcProvider.Builder(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java index ef86fe6ea9..66af77d6b9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.Platform; @@ -71,14 +72,12 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory "At least one library dependency or source file is required."; @Override - public final ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public final ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ObjcCommon common = common(ruleContext); ObjcProvider objcProvider = common.getObjcProvider(); - if (!hasLibraryOrSources(objcProvider)) { - ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE); - return null; - } + assertLibraryOrSources(objcProvider, ruleContext); IntermediateArtifacts intermediateArtifacts = ObjcRuleClasses.intermediateArtifacts(ruleContext); @@ -92,9 +91,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory .validateAttributes() .addXcodeSettings(xcodeProviderBuilder); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union( ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class)); @@ -115,10 +112,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory DsymOutputType.APP) .validateAttributes(); - if (ruleContext.hasErrors()) { - return null; - } - Optional<XcTestAppProvider> xcTestAppProvider; Optional<RunfilesSupport> maybeRunfilesSupport = Optional.absent(); switch (hasReleaseBundlingSupport) { @@ -191,9 +184,12 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory return targetBuilder.build(); } - private boolean hasLibraryOrSources(ObjcProvider objcProvider) { - return !Iterables.isEmpty(objcProvider.get(LIBRARY)) // Includes sources from this target. - || !Iterables.isEmpty(objcProvider.get(IMPORTED_LIBRARY)); + private void assertLibraryOrSources(ObjcProvider objcProvider, RuleContext ruleContext) + throws RuleErrorException { + if (Iterables.isEmpty(objcProvider.get(LIBRARY)) // Includes sources from this target. + && Iterables.isEmpty(objcProvider.get(IMPORTED_LIBRARY))) { + ruleContext.throwWithRuleError(REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE); + } } private ObjcCommon common(RuleContext ruleContext) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index 846d6c6750..d5a3d570ae 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -77,6 +77,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleToolchain; @@ -1308,8 +1309,9 @@ public final class CompilationSupport { * Validates compilation-related attributes on this rule. * * @return this compilation support + * @throws RuleErrorException if there are attribute errors */ - CompilationSupport validateAttributes() { + CompilationSupport validateAttributes() throws RuleErrorException { for (PathFragment absoluteInclude : Iterables.filter(attributes.includes(), PathFragment.IS_ABSOLUTE)) { ruleContext.attributeError( @@ -1338,6 +1340,7 @@ public final class CompilationSupport { } } + ruleContext.assertNoErrors(); return this; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java index f200e5513b..52dd30ca20 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.cpp.CcLibraryHelper; @@ -83,7 +84,8 @@ public class ExperimentalObjcLibrary implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { CompilationArtifacts compilationArtifacts = CompilationSupport.compilationArtifacts(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java index 97bfa97960..1e3ad31586 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.DottedVersion; @@ -33,7 +34,8 @@ import com.google.devtools.build.lib.rules.apple.XcodeVersionProperties; */ public final class IosDevice implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext context) throws InterruptedException { + public ConfiguredTarget create(RuleContext context) + throws InterruptedException, RuleErrorException { AppleConfiguration appleConfiguration = context.getFragment(AppleConfiguration.class); String iosVersionAttribute = context.attributes().get(IosDeviceRule.IOS_VERSION_ATTR_NAME, STRING); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java index c21a7806ea..062eaed308 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.actions.ExecutionRequirements; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs; @@ -82,7 +83,8 @@ public final class IosTest implements RuleConfiguredTargetFactory { * to this method. */ @Override - public final ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public final ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ObjcCommon common = common(ruleContext); if (!common.getCompilationArtifacts().get().getArchive().isPresent()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java index 2cf414f1b4..a4a2ba5229 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.vfs.PathFragment; @@ -49,7 +50,8 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { "proto_library"); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { checkAttributes(ruleContext); if (ruleContext.hasErrors()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java index 2e85fb524a..0dd4dc4a15 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -30,7 +31,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; */ public class ObjcBundle implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ObjcCommon common = new ObjcCommon.Builder(ruleContext).build(); ImmutableList<Artifact> bundleImports = ruleContext diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java index 2fb999eaff..cbc74ea862 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; @@ -39,7 +40,8 @@ import java.util.List; public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ObjcCommon common = common(ruleContext); Bundling bundling = bundling(ruleContext, common); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java index 1b86ca0935..67c0fa80dc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.objc.ObjcCommon.Builder; import com.google.devtools.build.lib.rules.objc.ObjcSdkFrameworks.Attributes; @@ -33,7 +34,8 @@ import com.google.devtools.build.lib.syntax.Type; */ public class ObjcFramework implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { Attributes sdkFrameworkAttributes = new Attributes(ruleContext); ObjcCommon.Builder commonBuilder = diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java index c0d1801d5c..b1c10f75fc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; @@ -32,7 +33,8 @@ import com.google.devtools.build.lib.syntax.Type; */ public class ObjcImport implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ObjcCommon common = new ObjcCommon.Builder(ruleContext) .setCompilationAttributes(new CompilationAttributes(ruleContext)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index 76130d94a1..41a0201586 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -94,7 +95,8 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { final ObjcCommon common = common( ruleContext, diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java index c7b115f79a..a6ec22d9f1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -28,7 +29,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; */ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(final RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(final RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ProtoSupport protoSupport = new ProtoSupport(ruleContext); ObjcCommon.Builder commonBuilder = new ObjcCommon.Builder(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java index 6e8edf06bd..0c6730f4c6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -29,7 +30,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class ObjcXcodeproj implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder(); new XcodeSupport(ruleContext) .addFilesToBuild(filesToBuild) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java index ce6970d1c8..8c4e911b3f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; @@ -61,7 +62,8 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { validateAttributes(ruleContext); ObjcCommon common = common(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java index 197519380a..97cb0e9043 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -30,7 +31,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class BazelProtoLibrary implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { ImmutableList<Artifact> protoSources = ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list(); ImmutableList<Artifact> checkDepsProtoSources = ProtoCommon.getCheckDepsProtoSources( diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java index f4e68f26d5..fc30ac04ed 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -42,7 +43,8 @@ public abstract class PyBinary implements RuleConfiguredTargetFactory { protected abstract PythonSemantics createSemantics(); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { PyCommon common = new PyCommon(ruleContext); common.initCommon(common.getDefaultPythonVersion()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java index eedef4f38d..ef1d40f9c3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -44,7 +45,7 @@ public abstract class PyLibrary implements RuleConfiguredTargetFactory { protected abstract PythonSemantics createSemantics(); @Override - public ConfiguredTarget create(final RuleContext ruleContext) { + public ConfiguredTarget create(final RuleContext ruleContext) throws RuleErrorException { PythonSemantics semantics = createSemantics(); PyCommon common = new PyCommon(ruleContext); common.initCommon(common.getDefaultPythonVersion()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java index ba84123f17..8f8d84025a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.python; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -30,7 +31,8 @@ public abstract class PyTest implements RuleConfiguredTargetFactory { protected abstract PythonSemantics createSemantics(); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { PythonSemantics semantics = createSemantics(); PyCommon common = new PyCommon(ruleContext); common.initCommon(getDefaultPythonVersion(ruleContext)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java b/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java index f042902268..1b89cedd8d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.AliasConfiguredTarget; import com.google.devtools.build.lib.rules.AliasProvider; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; @@ -29,7 +30,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class Bind implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { if (ruleContext.getPrerequisite("actual", Mode.TARGET) == null) { ruleContext.ruleError(String.format("The external label '%s' is not bound to anything", ruleContext.getLabel())); diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java index cf7a37dc4f..ad16ba9c50 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; /** @@ -28,7 +29,8 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; public class WorkspaceConfiguredTargetFactory implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { return new RuleConfiguredTargetBuilder(ruleContext) .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY) .build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java index ed333a0058..581f302bb8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.TestTargetUtils; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.syntax.Type; @@ -38,7 +39,7 @@ import java.util.List; public class TestSuite implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { checkTestsAndSuites(ruleContext, "tests"); if (ruleContext.hasErrors()) { return null; |