aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Yun Peng <pcloudy@google.com>2016-02-23 18:37:44 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-23 22:18:25 +0000
commit83fbb91a5a2afd15f0ab1e251812bd6692e0728a (patch)
tree1a402de1d2fbd15b6163b1a967c8fbede8743610 /src/main/java/com/google/devtools/build/lib
parent17129d4f838cd18b74551e0dd56e290975a6dc8c (diff)
Support "mandatoryProvidersList" in Skylark and added necessary tests
The type of attribute "providers" now is a list of lists of string. But a list of string is still supported. -- MOS_MIGRATED_REVID=115357326
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java51
1 files changed, 45 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
index f99f598d23..f2e984d3cd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
@@ -36,11 +36,13 @@ import com.google.devtools.build.lib.syntax.SkylarkCallbackFunction;
import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
+import com.google.devtools.build.lib.syntax.SkylarkType;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.syntax.Type.ConversionException;
import com.google.devtools.build.lib.syntax.UserDefinedFunction;
import com.google.devtools.build.lib.util.FileTypeSet;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -97,6 +99,11 @@ public final class SkylarkAttr {
private static final String NON_EMPTY_DOC = "True if the attribute must not be empty";
private static final String PROVIDERS_ARG = "providers";
+ private static final String PROVIDERS_DOC =
+ "mandatory providers list. It should be either a list of providers, or a "
+ + "list of lists of providers. Every dependency should provide ALL providers "
+ + "from at least ONE of these lists. A single list of providers will be "
+ + "automatically converted to a list containing one list of providers.";
private static final String SINGLE_FILE_ARG = "single_file";
@@ -180,8 +187,20 @@ public final class SkylarkAttr {
}
if (containsNonNoneKey(arguments, PROVIDERS_ARG)) {
- builder.mandatoryProviders(SkylarkList.castSkylarkListOrNoneToList(
- arguments.get(PROVIDERS_ARG), String.class, PROVIDERS_ARG));
+ Object obj = arguments.get(PROVIDERS_ARG);
+ SkylarkType.checkType(obj, SkylarkList.class, PROVIDERS_ARG);
+ boolean isSingleListOfStr = true;
+ for (Object o : (SkylarkList) obj) {
+ isSingleListOfStr = o instanceof String;
+ if (!isSingleListOfStr) {
+ break;
+ }
+ }
+ if (isSingleListOfStr) {
+ builder.mandatoryProviders(((SkylarkList<?>) obj).getContents(String.class, PROVIDERS_ARG));
+ } else {
+ builder.mandatoryProvidersList(getProvidersList((SkylarkList) obj));
+ }
}
if (containsNonNoneKey(arguments, CONFIGURATION_ARG)) {
@@ -190,6 +209,28 @@ public final class SkylarkAttr {
return builder;
}
+ private static List<List<String>> getProvidersList(SkylarkList skylarkList) throws EvalException {
+ List<List<String>> providersList = new ArrayList<>();
+ String errorMsg = "Illegal argument: element in '%s' is of unexpected type. "
+ + "Should be list of string, but got %s. "
+ + "Notice: one single list of string as 'providers' is still supported.";
+ for (Object o : skylarkList) {
+ if (!(o instanceof SkylarkList)) {
+ throw new EvalException(null, String.format(errorMsg, PROVIDERS_ARG,
+ EvalUtils.getDataTypeName(o, true)));
+ }
+ for (Object value : (SkylarkList) o) {
+ if (!(value instanceof String)) {
+ throw new EvalException(null, String.format(errorMsg, PROVIDERS_ARG,
+ "list with an element of type "
+ + EvalUtils.getDataTypeNameFromClass(value.getClass())));
+ }
+ }
+ providersList.add(((SkylarkList<?>) o).getContents(String.class, PROVIDERS_ARG));
+ }
+ return providersList;
+ }
+
private static Descriptor createAttrDescriptor(
SkylarkDict<String, Object> kwargs, Type<?> type, FuncallExpression ast, Environment env)
throws EvalException {
@@ -336,9 +377,8 @@ public final class SkylarkAttr {
@Param(
name = PROVIDERS_ARG,
type = SkylarkList.class,
- generic1 = String.class,
defaultValue = "[]",
- doc = "mandatory providers every dependency has to have"
+ doc = PROVIDERS_DOC
),
@Param(
name = ALLOW_RULES_ARG,
@@ -534,9 +574,8 @@ public final class SkylarkAttr {
@Param(
name = PROVIDERS_ARG,
type = SkylarkList.class,
- generic1 = String.class,
defaultValue = "[]",
- doc = "mandatory providers every dependency has to have"
+ doc = PROVIDERS_DOC
),
@Param(
name = FLAGS_ARG,