aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2016-05-23 17:39:42 +0000
committerGravatar Yue Gan <yueg@google.com>2016-05-24 11:56:43 +0000
commit4dfb22c4bad3dfa4dba46426c8587c0aa148d8d9 (patch)
tree5b09b10bef0e0ca634d237af86b6e9da7160f846 /src/main/java/com/google/devtools/build/lib
parentfe206a490a2aa48c789c0edd35383407f44bc49b (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ConfigSetting.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClass.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/Alias.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java81
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java38
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1Extension.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java3
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;