diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/SkylarkDict.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/SkylarkDict.java | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkDict.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkDict.java deleted file mode 100644 index 3a856b23ff..0000000000 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkDict.java +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2016 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.syntax; - -import com.google.common.collect.ImmutableMap; -import com.google.devtools.build.lib.events.Location; -import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; -import com.google.devtools.build.lib.syntax.SkylarkMutable.MutableMap; - -import java.util.Map; -import java.util.TreeMap; - -import javax.annotation.Nullable; - -/** - * Skylark Dict module. - */ -@SkylarkModule(name = "dict", doc = - "A language built-in type to support dicts. " - + "Example of dict literal:<br>" - + "<pre class=\"language-python\">d = {\"a\": 2, \"b\": 5}</pre>" - + "Use brackets to access elements:<br>" - + "<pre class=\"language-python\">e = d[\"a\"] # e == 2</pre>" - + "Dicts support the <code>+</code> operator to concatenate two dicts. In case of multiple " - + "keys the second one overrides the first one. Examples:<br>" - + "<pre class=\"language-python\">" - + "d = {\"a\" : 1} + {\"b\" : 2} # d == {\"a\" : 1, \"b\" : 2}\n" - + "d += {\"c\" : 3} # d == {\"a\" : 1, \"b\" : 2, \"c\" : 3}\n" - + "d = d + {\"c\" : 5} # d == {\"a\" : 1, \"b\" : 2, \"c\" : 5}</pre>" - + "Iterating on a dict is equivalent to iterating on its keys (in sorted order).<br>" - + "Dicts support the <code>in</code> operator, testing membership in the keyset of the dict. " - + "Example:<br>" - + "<pre class=\"language-python\">\"a\" in {\"a\" : 2, \"b\" : 5} # evaluates as True" - + "</pre>") -public final class SkylarkDict<K, V> - extends MutableMap<K, V> implements Map<K, V> { - - private TreeMap<K, V> contents = new TreeMap<>(EvalUtils.SKYLARK_COMPARATOR); - - private Mutability mutability; - - @Override - public Mutability mutability() { - return mutability; - } - - private SkylarkDict(@Nullable Environment env) { - mutability = env == null ? Mutability.IMMUTABLE : env.mutability(); - } - - /** @return a dict mutable in given environment only */ - public static <K, V> SkylarkDict<K, V> of(@Nullable Environment env) { - return new SkylarkDict<K, V>(env); - } - - /** @return a dict mutable in given environment only, with given initial key and value */ - public static <K, V> SkylarkDict<K, V> of(@Nullable Environment env, K k, V v) { - return SkylarkDict.<K, V>of(env).putUnsafe(k, v); - } - - /** @return a dict mutable in given environment only, with two given initial key value pairs */ - public static <K, V> SkylarkDict<K, V> of( - @Nullable Environment env, K k1, V v1, K k2, V v2) { - return SkylarkDict.<K, V>of(env).putUnsafe(k1, v1).putUnsafe(k2, v2); - } - - /** @return a dict mutable in given environment only, with contents copied from given map */ - public static <K, V> SkylarkDict<K, V> copyOf( - @Nullable Environment env, Map<? extends K, ? extends V> m) { - return SkylarkDict.<K, V>of(env).putAllUnsafe(m); - } - - private SkylarkDict<K, V> putUnsafe(K k, V v) { - contents.put(k, v); - return this; - } - - private <KK extends K, VV extends V> SkylarkDict putAllUnsafe(Map<KK, VV> m) { - for (Map.Entry<KK, VV> e : m.entrySet()) { - contents.put(e.getKey(), e.getValue()); - } - return this; - } - - /** - * The underlying contents is a (usually) mutable data structure. - * Read access is forwarded to these contents. - * This object must not be modified outside an {@link Environment} - * with a correct matching {@link Mutability}, - * which should be checked beforehand using {@link #checkMutable}. - * it need not be an instance of {@link com.google.common.collect.ImmutableMap}. - */ - @Override - protected Map<K, V> getContentsUnsafe() { - return contents; - } - - public void put(K k, V v, Location loc, Environment env) throws EvalException { - checkMutable(loc, env); - EvalUtils.checkValidDictKey(k); - contents.put(k, v); - } - - public void putAll(Map<? extends K, ? extends V> m, Location loc, Environment env) - throws EvalException { - checkMutable(loc, env); - putAllUnsafe(m); - } - - // Other methods - @Override - public void write(Appendable buffer, char quotationMark) { - Printer.printList(buffer, entrySet(), "{", ", ", "}", null, quotationMark); - } - - /** - * Cast a {@code SkylarkDict<?>} to a {@code SkylarkDict<K, V>} - * after checking its current contents. - * @param dict the SkylarkDict to cast - * @param keyType the expected class of keys - * @param valueType the expected class of values - * @param description a description of the argument being converted, or null, for debugging - */ - @SuppressWarnings("unchecked") - public static <KeyType, ValueType> SkylarkDict<KeyType, ValueType> castDict( - SkylarkDict<?, ?> dict, - Class<KeyType> keyType, - Class<ValueType> valueType, - @Nullable String description) - throws EvalException { - Object keyDescription = description == null - ? null : Printer.formattable("'%s' key", description); - Object valueDescription = description == null - ? null : Printer.formattable("'%s' value", description); - for (Map.Entry<?, ?> e : dict.entrySet()) { - SkylarkType.checkType(e.getKey(), keyType, keyDescription); - SkylarkType.checkType(e.getValue(), valueType, valueDescription); - } - return (SkylarkDict<KeyType, ValueType>) dict; - } - - /** - * Cast a SkylarkDict to a {@code Map<K, V>} after checking its current contents. - * Treat None as meaning the empty ImmutableMap. - * @param obj the Object to cast. null and None are treated as an empty list. - * @param keyType the expected class of keys - * @param valueType the expected class of values - * @param description a description of the argument being converted, or null, for debugging - */ - public static <K, V> Map<K, V> castSkylarkDictOrNoneToMap( - Object obj, Class<K> keyType, Class<V> valueType, @Nullable String description) - throws EvalException { - if (EvalUtils.isNullOrNone(obj)) { - return ImmutableMap.of(); - } - if (obj instanceof SkylarkDict) { - return ((SkylarkDict<?, ?>) obj).getContents(keyType, valueType, description); - } - throw new EvalException(null, - Printer.format("Illegal argument: %s is not of expected type dict or NoneType", - description == null ? Printer.repr(obj) : String.format("'%s'", description))); - } - - /** - * Cast a SkylarkDict to a {@code Map<K, V>} after checking its current contents. - * @param keyType the expected class of keys - * @param valueType the expected class of values - * @param description a description of the argument being converted, or null, for debugging - */ - public <KeyType, ValueType> Map<KeyType, ValueType> getContents( - Class<KeyType> keyType, Class<ValueType> valueType, @Nullable String description) - throws EvalException { - return castDict(this, keyType, valueType, description); - } - - public static <K, V> SkylarkDict<K, V> plus( - SkylarkDict<? extends K, ? extends V> left, - SkylarkDict<? extends K, ? extends V> right, - @Nullable Environment env) { - SkylarkDict<K, V> result = SkylarkDict.<K, V>of(env); - result.putAllUnsafe(left); - result.putAllUnsafe(right); - return result; - } - - private static final SkylarkDict<?, ?> EMPTY = of(null); - - public static <K, V> SkylarkDict<K, V> empty() { - return (SkylarkDict<K, V>) EMPTY; - } -} |