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
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 368f373..c979b44 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.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 @@ 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 20ff73c..f7671a2 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.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 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 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 @@ } /** + * 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 331c47e..99f998c 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.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 @@ 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 c8be408..52e10c8 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.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 @@ 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 d1c03fb..6c026d6 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.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 @@ 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 1448aee..e906c11 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.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 @@ } @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 cd2a48e..6da83aa 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.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 @@ 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 9e94d45..d99aaa1 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.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 @@ 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 f01026b..78ec863 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 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; + 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. + */ + 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 11abd0e..0160940 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.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 @@ */ 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 c112969..ff71285 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 @@ 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 @@ androidCommon, javaSemantics, androidSemantics); - if (builder == null) { - return null; - } return builder.build(); } @@ -125,23 +123,22 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ false, ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"), null /* mainDexProguardConfig */); - if (ruleContext.hasErrors()) { - return null; - } + ruleContext.assertNoErrors(); } JavaTargetAttributes resourceClasses = androidCommon.init( @@ -345,9 +326,7 @@ 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 @@ 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 @@ androidCommon, resourceApk.getMainDexProguardConfig(), resourceClasses); - if (dexingOutput == null) { - return null; - } Artifact unsignedApk = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_UNSIGNED_APK); @@ -503,9 +480,7 @@ 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 @@ 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 @@ 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 e3fe0b4..8630825 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.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 @@ 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 @@ 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 a4d32e9..214797c 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.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 @@ */ 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 72f178e..469d5e7 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.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 @@ * 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 b7b1790..8c29552 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.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 @@ 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 3d5226cc..acd5cf1 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.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 @@ /** * 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 efa07cc..be3fdf5 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.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 @@ 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 b630f5d..bafddee 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.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 @@ 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 6b6b5cc..541363d 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.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 @@ } @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 bceaa59..923bc71 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.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 @@ } @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 d6a34ca..e7db2a5 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.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 @@ } @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 f6464ca..e4d312f 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 @@ 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 @@ } @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 9c184b8..a50b71a 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 @@ 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 b70bcfa..637d86a 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.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 @@ 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 0c7fbf9..02c3201 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.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 @@ */ 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 e84cbca..e1b3c11b 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.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 @@ */ 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 fb4d990..cbbc0fc 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.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 @@ 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 3e4bfbd..69e5d57 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.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 @@ @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 1b82de2..5551e21 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.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 @@ } @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 b6ac48e..7a61685 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.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 @@ } @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 3b4cc3c..a9cf0f1 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.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 @@ } @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 5466ca8..e3aa8c3 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.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 @@ } @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 51c5eba..39eedaa 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.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 @@ 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 aee8633..0e4cb61 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.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 @@ "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 @@ 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 @@ 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 5be91fa..6100bf2 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.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 @@ 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 ef86fe6..66af77d 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.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 @@ "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 @@ .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 @@ DsymOutputType.APP) .validateAttributes(); - if (ruleContext.hasErrors()) { - return null; - } - Optional<XcTestAppProvider> xcTestAppProvider; Optional<RunfilesSupport> maybeRunfilesSupport = Optional.absent(); switch (hasReleaseBundlingSupport) { @@ -191,9 +184,12 @@ 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 846d6c6..d5a3d57 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.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 @@ * 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 @@ } } + 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 f200e55..52dd30c 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.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 @@ } @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 97bfa97..1e3ad31 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.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 @@ */ 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 c21a780..062eaed 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.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 @@ * 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 2cf414f..a4a2ba5 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.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 @@ "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 2e85fb5..0dd4dc4 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.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 @@ */ 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 2fb999e..cbc74ea 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.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 @@ 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 1b86ca0..67c0fa8 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.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 @@ */ 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 c0d1801..b1c10f7 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.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 @@ */ 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 76130d9..41a0201 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.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 @@ } @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 c7b115f..a6ec22d 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.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 @@ */ 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 6e8edf0..0c6730f 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.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 @@ 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 ce6970d..8c4e911 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.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 @@ } @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 1975193..97cb0e9 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.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 @@ 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 f4e68f2..fc30ac0 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.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 @@ 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 eedef4f..ef1d40f 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.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 @@ 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 ba84123..8f8d840 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 @@ 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 @@ 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 f042902..1b89ced 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.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 @@ 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 cf7a37d..ad16ba9 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.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 @@ 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 ed333a0..581f302 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.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 @@ 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;