Remove not-quite necessary serialization bits

What we really are doing here is formatting.

--
MOS_MIGRATED_REVID=127481183
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeSerializer.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeFormatter.java
similarity index 99%
rename from src/main/java/com/google/devtools/build/lib/packages/AttributeSerializer.java
rename to src/main/java/com/google/devtools/build/lib/packages/AttributeFormatter.java
index 8487ec3..54a223f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeSerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeFormatter.java
@@ -61,7 +61,7 @@
 import javax.annotation.Nullable;
 
 /** Common utilities for serializing {@link Attribute}s as protocol buffers. */
-public class AttributeSerializer {
+public class AttributeFormatter {
 
   private static final ImmutableSet<Type<?>> depTypes =
       ImmutableSet.<Type<?>>of(
@@ -70,7 +70,7 @@
   private static final ImmutableSet<Type<?>> noDepTypes =
       ImmutableSet.<Type<?>>of(NODEP_LABEL_LIST, NODEP_LABEL);
 
-  private AttributeSerializer() {}
+  private AttributeFormatter() {}
 
   /**
    * Convert attribute value to proto representation.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java b/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
index ceb0c8b..c34ad2e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
@@ -34,31 +34,16 @@
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST_DICT;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.query2.proto.proto2api.Build;
 import com.google.devtools.build.lib.query2.proto.proto2api.Build.Attribute.Discriminator;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.Preconditions;
 
-import java.util.Set;
-
-/**
- * Shared code used in proto buffer output for rules and rule classes.
- */
+/** Shared code used in proto buffer output for rules and rule classes. */
 public class ProtoUtils {
   /**
    * This map contains all attribute types that are recognized by the protocol
    * output formatter.
-   *
-   * <p>If you modify this map, please ensure that {@link #getTypeFromDiscriminator} can still
-   * resolve a {@link Discriminator} value to exactly one {@link Type} (using an optional nodep
-   * hint, as described below).
    */
   static final ImmutableMap<Type<?>, Discriminator> TYPE_MAP =
       new ImmutableMap.Builder<Type<?>, Discriminator>()
@@ -85,90 +70,8 @@
           .put(STRING_DICT_UNARY, Discriminator.STRING_DICT_UNARY)
           .build();
 
-  static final ImmutableSet<Type<?>> NODEP_TYPES = ImmutableSet.of(NODEP_LABEL, NODEP_LABEL_LIST);
-
-  static final ImmutableSetMultimap<Discriminator, Type<?>> INVERSE_TYPE_MAP =
-      TYPE_MAP.asMultimap().inverse();
-
   /** Returns the {@link Discriminator} value corresponding to the provided {@link Type}. */
   public static Discriminator getDiscriminatorFromType(Type<?> type) {
-    Preconditions.checkArgument(TYPE_MAP.containsKey(type), type);
-    return TYPE_MAP.get(type);
-  }
-
-  /** Returns the {@link Type} associated with an {@link Build.Attribute}. */
-  static Type<?> getTypeFromAttributePb(
-      Build.Attribute attrPb, String ruleClassName, String attrName) {
-    Optional<Boolean> nodepHint =
-        attrPb.hasNodep() ? Optional.of(attrPb.getNodep()) : Optional.<Boolean>absent();
-    Discriminator attrPbDiscriminator = attrPb.getType();
-    boolean isSelectorList = attrPbDiscriminator.equals(Discriminator.SELECTOR_LIST);
-    return getTypeFromDiscriminator(
-        isSelectorList ? attrPb.getSelectorList().getType() : attrPbDiscriminator,
-        nodepHint,
-        ruleClassName,
-        attrName);
-  }
-
-  /**
-   * Returns the set of {@link Type}s associated with a {@link Discriminator} value.
-   *
-   * <p>The set will contain more than one {@link Type} when {@param discriminator} is either
-   * {@link Discriminator#STRING} or {@link Discriminator#STRING_LIST}, because each of them
-   * corresponds with two {@link Type} values. A nodeps hint is needed to determine which {@link
-   * Type} applies.
-   */
-  private static ImmutableSet<Type<?>> getTypesFromDiscriminator(Discriminator discriminator) {
-    Preconditions.checkArgument(INVERSE_TYPE_MAP.containsKey(discriminator), discriminator);
-    return INVERSE_TYPE_MAP.get(discriminator);
-  }
-
-  /**
-   * Returns the {@link Type} associated with a {@link Discriminator} value, given an optional
-   * nodeps hint.
-   */
-  private static Type<?> getTypeFromDiscriminator(
-      Discriminator discriminator,
-      Optional<Boolean> nodeps,
-      String ruleClassName,
-      String attrName) {
-    Preconditions.checkArgument(INVERSE_TYPE_MAP.containsKey(discriminator), discriminator);
-    ImmutableSet<Type<?>> possibleTypes = ProtoUtils.getTypesFromDiscriminator(discriminator);
-    Type<?> preciseType;
-    if (possibleTypes.size() == 1) {
-      preciseType = Iterables.getOnlyElement(possibleTypes);
-    } else {
-      // If there is more than one possible type associated with the discriminator, then the
-      // discriminator must be either Discriminator.STRING or Discriminator.STRING_LIST.
-      //
-      // If it is Discriminator.STRING, then its possible Type<?>s are {NODEP_LABEL, STRING}. The
-      // nodeps hint must be present in order to distinguish between them. If nodeps is true,
-      // then the Type<?> must be NODEP_LABEL, and if false, it must be STRING.
-      //
-      // A similar relation holds for the Discriminator value STRING_LIST, and its possible
-      // Type<?>s {NODEP_LABEL_LIST, STRING_LIST}.
-
-      Preconditions.checkArgument(nodeps.isPresent(),
-          "Nodeps hint is required when discriminator is associated with more than one type."
-              + " Discriminator: \"%s\", Rule class: \"%s\", Attr: \"%s\"", discriminator,
-          ruleClassName, attrName);
-      if (nodeps.get()) {
-        Set<Type<?>> nodepType = Sets.filter(possibleTypes, Predicates.in(NODEP_TYPES));
-        Preconditions.checkState(nodepType.size() == 1,
-            "There should be exactly one NODEP type associated with discriminator \"%s\""
-                + ", but found these: %s. Rule class: \"%s\", Attr: \"%s\"", discriminator,
-            nodepType, ruleClassName, attrName);
-        preciseType = Iterables.getOnlyElement(nodepType);
-      } else {
-        Set<Type<?>> notNodepType =
-            Sets.filter(possibleTypes, Predicates.not(Predicates.in(NODEP_TYPES)));
-        Preconditions.checkState(notNodepType.size() == 1,
-            "There should be exactly one non-NODEP type associated with discriminator \"%s\""
-                + ", but found these: %s. Rule class: \"%s\", Attr: \"%s\"", discriminator,
-            notNodepType, ruleClassName, attrName);
-        preciseType = Iterables.getOnlyElement(notNodepType);
-      }
-    }
-    return preciseType;
+    return Preconditions.checkNotNull(TYPE_MAP.get(type), "No discriminator found for %s", type);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleSerializer.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
similarity index 98%
rename from src/main/java/com/google/devtools/build/lib/packages/RuleSerializer.java
rename to src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
index bfdc858..4154818 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleSerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.util.Preconditions;
 
 /** Serialize a {@link Rule} as its protobuf representation. */
-public class RuleSerializer {
+public class RuleFormatter {
 
   // Skylark doesn't support defining rule classes with ComputedDefault attributes. Therefore, the
   // only ComputedDefault attributes we expect to see for Skylark-defined rule classes are
@@ -76,7 +76,7 @@
       }
 
       builder.addAttribute(
-          AttributeSerializer.getAttributeProto(
+          AttributeFormatter.getAttributeProto(
               attr,
               valueToSerialize,
               isExplicit,
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
index e51c6bf..472ae20 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.graph.Digraph;
 import com.google.devtools.build.lib.packages.AggregatingAttributeMapper;
 import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.AttributeSerializer;
+import com.google.devtools.build.lib.packages.AttributeFormatter;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.EnvironmentGroup;
 import com.google.devtools.build.lib.packages.InputFile;
@@ -151,7 +151,7 @@
             AggregatingAttributeMapper.flattenAttributeValues(
                 attr.getType(), possibleAttributeValues);
         Build.Attribute serializedAttribute =
-            AttributeSerializer.getAttributeProto(
+            AttributeFormatter.getAttributeProto(
                 attr,
                 flattenedAttributeValue,
                 rule.isAttributeValueExplicitlySpecified(attr),
@@ -186,7 +186,7 @@
         }
         Object attributeValue = getAspectAttributeValue(attribute, labels);
         Build.Attribute serializedAttribute =
-            AttributeSerializer.getAttributeProto(
+            AttributeFormatter.getAttributeProto(
                 attribute,
                 attributeValue,
                 /*explicitlySpecified=*/ false,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
index 8f15451..f9ac1c1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.packages.RuleSerializer;
+import com.google.devtools.build.lib.packages.RuleFormatter;
 import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException;
 import com.google.devtools.build.lib.skyframe.FileValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
@@ -191,7 +191,7 @@
 
   private final byte[] computeRuleKey(Rule rule, byte[] ruleSpecificData) {
     return new Fingerprint()
-        .addBytes(RuleSerializer.serializeRule(rule).build().toByteArray())
+        .addBytes(RuleFormatter.serializeRule(rule).build().toByteArray())
         .addBytes(ruleSpecificData)
         // This is to make the fingerprint different after adding names to the generated
         // WORKSPACE files so they will get re-created, because otherwise there are
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index 9d65922..b5b0152 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -28,6 +28,7 @@
 import java.io.ObjectInputStream;
 import java.io.Serializable;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -90,6 +91,15 @@
     return new PathFragment(driveLetter, isAbsolute, internedSegments);
   }
 
+  /** Same as {@link #create(char, boolean, String[])}, except for {@link List}s of segments. */
+  public static PathFragment create(char driveLetter, boolean isAbsolute, List<String> segments) {
+    String[] internedSegments = new String[segments.size()];
+    for (int i = 0; i < segments.size(); i++) {
+      internedSegments[i] = StringCanonicalizer.intern(segments.get(i));
+    }
+    return new PathFragment(driveLetter, isAbsolute, internedSegments);
+  }
+
   // We have 3 word-sized fields (segments, hashCode and path), and 2
   // byte-sized ones, which fits in 16 bytes. Object sizes are rounded
   // to 16 bytes.  Medium sized builds can easily hold millions of
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ProtoUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/ProtoUtilsTest.java
deleted file mode 100644
index a18d662..0000000
--- a/src/test/java/com/google/devtools/build/lib/packages/ProtoUtilsTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2015 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.packages;
-
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.query2.proto.proto2api.Build.Attribute.Discriminator;
-import com.google.devtools.build.lib.syntax.Type;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.Collection;
-import java.util.Map.Entry;
-
-/** Tests for values and functions in ProtoUtils. */
-@RunWith(JUnit4.class)
-public class ProtoUtilsTest {
-
-  @Test
-  public void testTypeMap() throws Exception {
-    // The ProtoUtils TYPE_MAP (and its inverse, INVERSE_TYPE_MAP) are used to translate between
-    // rule attribute types and Discriminator values used to encode them in GPB messages. For each
-    // discriminator value there must be exactly one type, or there must be exactly two types, one
-    // which is a nodep type and the other which is not.
-    ImmutableSet<Entry<Discriminator, Collection<Type<?>>>> inverseMapEntries =
-        ProtoUtils.INVERSE_TYPE_MAP.asMap().entrySet();
-    for (Entry<Discriminator, Collection<Type<?>>> entry : inverseMapEntries) {
-      ImmutableSet<Type<?>> types = ImmutableSet.copyOf(entry.getValue());
-      String assertionMessage =
-          String.format(
-              "Cannot map from discriminator \"%s\" to exactly one Type.",
-              entry.getKey().toString());
-      boolean exactlyOneType = types.size() == 1;
-      boolean twoTypesDistinguishableUsingNodepHint =
-          types.size() == 2 && Sets.difference(types, ProtoUtils.NODEP_TYPES).size() == 1;
-      assertTrue(assertionMessage, exactlyOneType || twoTypesDistinguishableUsingNodepHint);
-    }
-  }
-}