diff options
author | 2016-02-23 18:37:44 +0000 | |
---|---|---|
committer | 2016-02-23 22:18:25 +0000 | |
commit | 83fbb91a5a2afd15f0ab1e251812bd6692e0728a (patch) | |
tree | 1a402de1d2fbd15b6163b1a967c8fbede8743610 /src/main/java/com/google/devtools/build/lib | |
parent | 17129d4f838cd18b74551e0dd56e290975a6dc8c (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.java | 51 |
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, |