Better @AutoCodec for TransitiveInfoProviderMapImpl: avoid having to serialize offset table at the cost of some overhead reconstructing the table. Also fewer code changes, although there is a serialization-only method added as a hack.

PiperOrigin-RevId: 186808832
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
index 1e13d42..94edb16 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
@@ -33,8 +33,8 @@
 
   @VisibleForSerialization
   @AutoCodec.Instantiator
-  TransitiveInfoProviderMapImpl(OffsetTable<Object> offsetTable, Object[] values) {
-    super(offsetTable, values);
+  TransitiveInfoProviderMapImpl(Object[] keys, Object[] values) {
+    super(keys, values);
   }
 
   static TransitiveInfoProviderMapImpl create(Map<Object, Object> map) {
@@ -48,7 +48,7 @@
       ++i;
     }
     Preconditions.checkArgument(keys.length == values.length);
-    return new TransitiveInfoProviderMapImpl(ImmutableSharedKeyMap.createOffsetTable(keys), values);
+    return new TransitiveInfoProviderMapImpl(keys, values);
   }
 
   @SuppressWarnings("unchecked")
diff --git a/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java b/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java
index 42a7af8..65bb4a8 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/ImmutableSharedKeyMap.java
@@ -42,16 +42,11 @@
 public class ImmutableSharedKeyMap<K, V> extends CompactImmutableMap<K, V> {
   private static final Interner<OffsetTable> offsetTables = BlazeInterners.newWeakInterner();
 
+  private final OffsetTable<K> offsetTable;
   // Visible only for serialization.
-  protected final OffsetTable<K> offsetTable;
   protected final Object[] values;
 
-  /**
-   * Table storing {@code keys} compactly as an array, with an index lookup map for speed.
-   *
-   * <p>Only externally visible for serialization purposes.
-   */
-  public static final class OffsetTable<K> {
+  private static final class OffsetTable<K> {
     private final Object[] keys;
     // Keep a map around to speed up get lookups for larger maps.
     // We make this value lazy to avoid computing for values that end up being thrown away
@@ -104,14 +99,14 @@
     }
   }
 
-  protected ImmutableSharedKeyMap(OffsetTable<K> offsetTable, Object[] values) {
-    Preconditions.checkArgument(offsetTable.keys.length == values.length);
-    this.offsetTable = offsetTable;
+  protected ImmutableSharedKeyMap(Object[] keys, Object[] values) {
+    Preconditions.checkArgument(keys.length == values.length);
     this.values = values;
+    this.offsetTable = createOffsetTable(keys);
   }
 
   @SuppressWarnings("unchecked")
-  protected static <K> OffsetTable<K> createOffsetTable(Object[] keys) {
+  private static <K> OffsetTable<K> createOffsetTable(Object[] keys) {
     OffsetTable<K> offsetTable = new OffsetTable<>(keys);
     OffsetTable<K> internedTable = (OffsetTable<K>) offsetTables.intern(offsetTable);
     internedTable.initIndexMap();
@@ -142,6 +137,12 @@
     return (V) values[index];
   }
 
+  /** Do not use! Present only for serialization. (Annotated as @Deprecated just to prevent use.) */
+  @Deprecated
+  public Object[] getKeys() {
+    return offsetTable.keys;
+  }
+
   @Override
   @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
@@ -187,7 +188,7 @@
         keys[i] = entries.get(entryIndex++);
         values[i] = entries.get(entryIndex++);
       }
-      return new ImmutableSharedKeyMap<>(createOffsetTable(keys), values);
+      return new ImmutableSharedKeyMap<>(keys, values);
     }
   }
 }