diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java b/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java index 79c19610e0..8ea9aa1372 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java @@ -13,21 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.syntax; -import com.google.common.base.Joiner; import com.google.common.collect.ImmutableCollection; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Ordering; -import com.google.common.collect.Sets; -import com.google.common.collect.Sets.SetView; -import com.google.devtools.build.lib.events.Location; -import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; -import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; -import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; -import com.google.devtools.build.lib.util.Preconditions; - -import java.io.Serializable; -import java.util.Map; - import javax.annotation.Nullable; /** @@ -53,140 +39,4 @@ public interface ClassObject { * of this struct, or returns null to use the default error message. */ @Nullable String errorMessage(String name); - - /** An implementation class of ClassObject for structs created in Skylark code. */ - // TODO(bazel-team): maybe move the SkylarkModule annotation to the ClassObject interface? - @SkylarkModule( - name = "struct", - category = SkylarkModuleCategory.BUILTIN, - doc = - "A special language element to support structs (i.e. simple value objects). " - + "See the global <a href=\"globals.html#struct\">struct</a> function " - + "for more details." - ) - public class SkylarkClassObject implements ClassObject, SkylarkValue, Serializable { - /** Error message to use when errorMessage argument is null. */ - private static final String DEFAULT_ERROR_MESSAGE = "'struct' object has no attribute '%s'"; - - private final ImmutableMap<String, Object> values; - private final Location creationLoc; - private final String errorMessage; - - /** - * Primarily for testing purposes where no location is available and the default - * errorMessage suffices. - */ - public SkylarkClassObject(Map<String, Object> values) { - this.values = copyValues(values); - this.creationLoc = null; - this.errorMessage = DEFAULT_ERROR_MESSAGE; - } - - /** - * Creates a built-in struct (i.e. without creation loc). The errorMessage has to have - * exactly one '%s' parameter to substitute the struct field name. - */ - public SkylarkClassObject(Map<String, Object> values, String errorMessage) { - this.values = copyValues(values); - this.creationLoc = null; - this.errorMessage = Preconditions.checkNotNull(errorMessage); - } - - public SkylarkClassObject(Map<String, Object> values, Location creationLoc) { - this.values = copyValues(values); - this.creationLoc = Preconditions.checkNotNull(creationLoc); - this.errorMessage = DEFAULT_ERROR_MESSAGE; - } - - // Ensure that values are all acceptable to Skylark before to stuff them in a ClassObject - private ImmutableMap<String, Object> copyValues(Map<String, Object> values) { - ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder(); - for (Map.Entry<String, Object> e : values.entrySet()) { - builder.put(e.getKey(), SkylarkType.convertToSkylark(e.getValue(), null)); - } - return builder.build(); - } - - @Override - public Object getValue(String name) { - return values.get(name); - } - - /** - * Returns a value and try to cast it into specified type - */ - public <TYPE> TYPE getValue(String key, Class<TYPE> type) throws EvalException { - Object obj = values.get(key); - if (obj == null) { - return null; - } - SkylarkType.checkType(obj, type, key); - return type.cast(obj); - } - - @Override - public ImmutableCollection<String> getKeys() { - return values.keySet(); - } - - public Location getCreationLoc() { - return Preconditions.checkNotNull(creationLoc, - "This struct was not created in a Skylark code"); - } - - static SkylarkClassObject concat( - SkylarkClassObject lval, SkylarkClassObject rval, Location loc) throws EvalException { - SetView<String> commonFields = Sets.intersection(lval.values.keySet(), rval.values.keySet()); - if (!commonFields.isEmpty()) { - throw new EvalException(loc, "Cannot concat structs with common field(s): " - + Joiner.on(",").join(commonFields)); - } - return new SkylarkClassObject(ImmutableMap.<String, Object>builder() - .putAll(lval.values).putAll(rval.values).build(), loc); - } - - @Override - public String errorMessage(String name) { - String suffix = - "Available attributes: " - + Joiner.on(", ").join(Ordering.natural().sortedCopy(values.keySet())); - return String.format(errorMessage, name) + "\n" + suffix; - } - - @Override - public boolean isImmutable() { - for (Object item : values.values()) { - if (!EvalUtils.isImmutable(item)) { - return false; - } - } - return true; - } - - /** - * Convert the object to string using Skylark syntax. The output tries to be - * reversible (but there is no guarantee, it depends on the actual values). - */ - @Override - public void write(Appendable buffer, char quotationMark) { - boolean first = true; - Printer.append(buffer, "struct("); - // Sort by key to ensure deterministic output. - for (String key : Ordering.natural().sortedCopy(values.keySet())) { - if (!first) { - Printer.append(buffer, ", "); - } - first = false; - Printer.append(buffer, key); - Printer.append(buffer, " = "); - Printer.write(buffer, values.get(key), quotationMark); - } - Printer.append(buffer, ")"); - } - - @Override - public String toString() { - return Printer.repr(this); - } - } } |