aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2017-10-10 17:55:12 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-10-11 10:56:51 +0200
commit00d128c6fd6d4f1f1e976c7d6f3b3c3f717431f0 (patch)
treec42f1600ab6164b13c6649be51aaa8a710683729 /src/main/java/com/google/devtools
parent0257c29f496719bb8414d012334155de6bbefa11 (diff)
Make it an error to attempt to expand an attribute that does not exist
PiperOrigin-RevId: 171684595
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/Expander.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java11
6 files changed, 47 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Expander.java b/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
index be34e5d5a7..c4eb867427 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
@@ -172,14 +172,10 @@ public final class Expander {
/**
* Obtains the value of the attribute, expands all values, and returns the resulting list. If the
- * attribute does not exist or is not of type {@link Type#STRING_LIST}, then this method returns
- * an empty list.
+ * attribute does not exist or is not of type {@link Type#STRING_LIST}, then this method throws
+ * an error.
*/
public ImmutableList<String> list(String attrName) {
- if (!ruleContext.getRule().isAttrDefined(attrName, Type.STRING_LIST)) {
- // TODO(bazel-team): This should be an error.
- return ImmutableList.of();
- }
return list(attrName, ruleContext.attributes().get(attrName, Type.STRING_LIST));
}
@@ -192,13 +188,9 @@ public final class Expander {
/**
* Obtains the value of the attribute, expands, and tokenizes all values. If the attribute does
- * not exist or is not of type {@link Type#STRING_LIST}, then this method returns an empty list.
+ * not exist or is not of type {@link Type#STRING_LIST}, then this method throws an error.
*/
public ImmutableList<String> tokenized(String attrName) {
- if (!ruleContext.getRule().isAttrDefined(attrName, Type.STRING_LIST)) {
- // TODO(bazel-team): This should be an error.
- return ImmutableList.of();
- }
return tokenized(attrName, ruleContext.attributes().get(attrName, Type.STRING_LIST));
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
index 230b1fd61e..9a935ff544 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
@@ -26,6 +26,7 @@ import com.google.devtools.build.lib.analysis.config.RunUnder;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.TargetUtils;
+import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
@@ -427,6 +428,11 @@ public final class RunfilesSupport {
private static CommandLine computeArgs(
RuleContext ruleContext,
CommandLine additionalArgs) {
+ if (!ruleContext.getRule().isAttrDefined("args", Type.STRING_LIST)) {
+ // Some non-_binary rules create RunfilesSupport instances; it is fine to not have an args
+ // attribute here.
+ return additionalArgs;
+ }
return CommandLine.concat(
ruleContext.getExpander().withDataLocations().tokenized("args"),
additionalArgs);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index adfb31054c..2e58a19123 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -193,6 +193,8 @@ public final class AndroidRuleClasses {
fromTemplates("%{name}_images/emulator-meta-data.pb");
static final FileType APK = FileType.of(".apk");
+ public static final String NOCOMPRESS_EXTENSIONS_ATTR = "nocompress_extensions";
+
/** The default label of android_sdk option */
public static LateBoundDefault<?, Label> getAndroidSdkLabel(Label androidSdk) {
return LateBoundDefault.fromTargetConfiguration(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
index 8d9d95c59a..34311624f1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
@@ -25,9 +25,11 @@ import com.google.devtools.build.lib.rules.android.AndroidConfiguration.ApkSigni
import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaHelper;
import com.google.devtools.build.lib.rules.java.JavaToolchainProvider;
+import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.PathFragment;
+import java.util.List;
/**
* A class for coordinating APK building, signing and zipaligning.
@@ -337,8 +339,18 @@ public class ApkActionsBuilder {
singleJarCommandLine.addExecPath("--sources", inputZip);
}
- ImmutableList<String> noCompressExtensions =
- ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions");
+ List<String> noCompressExtensions;
+ if (ruleContext.getRule().isAttrDefined(
+ AndroidRuleClasses.NOCOMPRESS_EXTENSIONS_ATTR, Type.STRING_LIST)) {
+ noCompressExtensions =
+ ruleContext
+ .getExpander()
+ .withDataLocations()
+ .tokenized(AndroidRuleClasses.NOCOMPRESS_EXTENSIONS_ATTR);
+ } else {
+ // This code is also used by android_test, which doesn't have this attribute.
+ noCompressExtensions = ImmutableList.of();
+ }
if (!noCompressExtensions.isEmpty()) {
compressedApkCommandLine.addAll("--nocompress_suffixes", noCompressExtensions);
singleJarCommandLine.addAll("--nocompress_suffixes", noCompressExtensions);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index bf89607b82..38e4d5713c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -804,8 +804,18 @@ public final class ApplicationManifest {
ResourceFilter resourceFilter = ResourceFilter.fromRuleContext(ruleContext);
- List<String> uncompressedExtensions =
- ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions");
+ List<String> uncompressedExtensions;
+ if (ruleContext.getRule().isAttrDefined(
+ AndroidRuleClasses.NOCOMPRESS_EXTENSIONS_ATTR, Type.STRING_LIST)) {
+ uncompressedExtensions =
+ ruleContext
+ .getExpander()
+ .withDataLocations()
+ .tokenized(AndroidRuleClasses.NOCOMPRESS_EXTENSIONS_ATTR);
+ } else {
+ // This code is also used by android_test, which doesn't have this attribute.
+ uncompressedExtensions = ImmutableList.of();
+ }
ImmutableList.Builder<String> additionalAaptOpts = ImmutableList.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
index 9e46ef9f34..5ec3bd3ab2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
@@ -40,6 +40,7 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import java.util.List;
import javax.annotation.Nullable;
@@ -511,9 +512,17 @@ public class JavaSkylarkCommon {
ConfiguredTarget javaToolchainConfigTarget =
(ConfiguredTarget) skylarkRuleContext.getAttr().getValue(javaToolchainAttr);
JavaToolchainProvider toolchain = getJavaToolchainProvider(javaToolchainConfigTarget);
+ ImmutableList<String> javacOptsFromAttr;
+ if (ruleContext.getRule().isAttrDefined("javacopts", Type.STRING_LIST)) {
+ javacOptsFromAttr = ruleContext.getExpander().withDataLocations().tokenized("javacopts");
+ } else {
+ // This can also be called from Skylark rules that may or may not have an appropriate
+ // javacopts attribute.
+ javacOptsFromAttr = ImmutableList.of();
+ }
return ImmutableList.copyOf(Iterables.concat(
toolchain.getJavacOptions(),
- ruleContext.getExpander().withDataLocations().tokenized("javacopts")));
+ javacOptsFromAttr));
}
@SkylarkCallable(