Document provider() calls in Stardoc

RELNOTES: None.
PiperOrigin-RevId: 217544224
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
index 8cd428e..1c3d82b 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -30,11 +31,15 @@
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkType;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeDescriptor.Type;
 import com.google.devtools.build.skydoc.rendering.AttributeInfo;
+import com.google.devtools.build.skydoc.rendering.ProviderFieldInfo;
+import com.google.devtools.build.skydoc.rendering.ProviderInfo;
 import com.google.devtools.build.skydoc.rendering.RuleInfo;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
@@ -49,20 +54,50 @@
   private static final FakeDescriptor IMPLICIT_NAME_ATTRIBUTE_DESCRIPTOR =
       new FakeDescriptor(Type.STRING, "A unique name for this target.", true);
   private final List<RuleInfo> ruleInfoList;
+  private final List<ProviderInfo> providerInfoList;
 
   /**
    * Constructor.
    *
    * @param ruleInfoList the list of {@link RuleInfo} objects to which rule() invocation information
    *     will be added
+   * @param providerInfoList the list of {@link ProviderInfo} objects to which provider()
+   *     invocation information will be added
    */
-  public FakeSkylarkRuleFunctionsApi(List<RuleInfo> ruleInfoList) {
+  public FakeSkylarkRuleFunctionsApi(List<RuleInfo> ruleInfoList,
+      List<ProviderInfo> providerInfoList) {
     this.ruleInfoList = ruleInfoList;
+    this.providerInfoList = providerInfoList;
   }
 
   @Override
   public ProviderApi provider(String doc, Object fields, Location location) throws EvalException {
-    return new FakeProviderApi();
+    FakeProviderApi fakeProvider = new FakeProviderApi();
+    // Field documentation will be output preserving the order in which the fields are listed.
+    ImmutableList.Builder<ProviderFieldInfo> providerFieldInfos = ImmutableList.builder();
+    if (fields instanceof SkylarkList) {
+      @SuppressWarnings("unchecked")
+      SkylarkList<String> fieldNames = (SkylarkList<String>)
+          SkylarkType.cast(
+              fields,
+              SkylarkList.class, String.class, location,
+              "Expected list of strings or dictionary of string -> string for 'fields'");
+      for (String fieldName : fieldNames) {
+        providerFieldInfos.add(new ProviderFieldInfo(fieldName));
+      }
+    } else if (fields instanceof SkylarkDict) {
+      Map<String, String> dict = SkylarkType.castMap(
+          fields,
+          String.class, String.class,
+          "Expected list of strings or dictionary of string -> string for 'fields'");
+      for (Map.Entry<String, String> fieldEntry : dict.entrySet()) {
+        providerFieldInfos.add(new ProviderFieldInfo(fieldEntry.getKey(), fieldEntry.getValue()));
+      }
+    } else {
+      // fields is NONE, so there is no field information to add.
+    }
+    providerInfoList.add(new ProviderInfo(fakeProvider, doc, providerFieldInfos.build()));
+    return fakeProvider;
   }
 
   @Override