Skyframe changes to support SpawnActionTemplate.
1. Adds ActionTemplateExpansion{Function, Value} for ActionTemplate expansion.
2. Changes ArtifactFunction to support evaluating TreeFileArtifacts and TreeArtifacts generated by ActionTemplate.

--
MOS_MIGRATED_REVID=124160939
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
index 28f7d0c..a72ef48 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
@@ -103,16 +103,6 @@
       new ConcurrentHashMap<>();
 
   /**
-   * Contains per-fragment FileArtifactValues when those values must be stored separately.
-   * Bona-fide Artifacts are stored in {@link #additionalOutputData} instead.
-   * See {@link #getAdditionalOutputData()} for details.
-   * Unlike additionalOutputData, this map is discarded (the relevant FileArtifactValues
-   * are stored in outputTreeArtifactData's values instead).
-   */
-  private final ConcurrentMap<TreeFileArtifact, FileArtifactValue> cachedTreeFileArtifactData =
-      new ConcurrentHashMap<>();
-
-  /**
    * Data for TreeArtifactValues, constructed from outputArtifactData and
    * additionalOutputFileData.
    */
@@ -287,8 +277,7 @@
       // We are dealing with artifacts inside a tree artifact.
       FileArtifactValue value =
           FileArtifactValue.createWithDigest(artifact.getPath(), injectedDigest, data.getSize());
-      FileArtifactValue oldValue = cachedTreeFileArtifactData.putIfAbsent(
-          (TreeFileArtifact) artifact, value);
+      FileArtifactValue oldValue = additionalOutputData.putIfAbsent(artifact, value);
       checkInconsistentData(artifact, oldValue, value);
       return new Metadata(value.getDigest());
     }
@@ -375,7 +364,7 @@
         Maps.newHashMapWithExpectedSize(contents.size());
 
     for (TreeFileArtifact treeFileArtifact : contents) {
-      FileArtifactValue cachedValue = cachedTreeFileArtifactData.get(treeFileArtifact);
+      FileArtifactValue cachedValue = additionalOutputData.get(treeFileArtifact);
       if (cachedValue == null) {
         FileValue fileValue = outputArtifactData.get(treeFileArtifact);
         // This is similar to what's present in getRealMetadataForArtifact, except
@@ -385,11 +374,11 @@
         if (fileValue == null) {
           fileValue = constructFileValue(treeFileArtifact, /*statNoFollow=*/ null);
           // A minor hack: maybeStoreAdditionalData will force the data to be stored
-          // in cachedTreeFileArtifactData.
+          // in additionalOutputData.
           maybeStoreAdditionalData(treeFileArtifact, fileValue, null);
         }
         cachedValue = Preconditions.checkNotNull(
-            cachedTreeFileArtifactData.get(treeFileArtifact), treeFileArtifact);
+            additionalOutputData.get(treeFileArtifact), treeFileArtifact);
       }
 
       values.put(treeFileArtifact, cachedValue);
@@ -500,7 +489,6 @@
     outputDirectoryListings.clear();
     outputTreeArtifactData.clear();
     additionalOutputData.clear();
-    cachedTreeFileArtifactData.clear();
   }
 
   @Override