aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java
diff options
context:
space:
mode:
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.java150
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);
- }
- }
}