Refactor ProviderInfo into a proto

RELNOTES: None.
PiperOrigin-RevId: 252652040
diff --git a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
index b14030b..ae0d6f0 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -105,8 +105,9 @@
 import com.google.devtools.build.skydoc.rendering.DocstringParseException;
 import com.google.devtools.build.skydoc.rendering.FunctionUtil;
 import com.google.devtools.build.skydoc.rendering.MarkdownRenderer;
-import com.google.devtools.build.skydoc.rendering.ProviderInfo;
+import com.google.devtools.build.skydoc.rendering.ProviderInfoWrapper;
 import com.google.devtools.build.skydoc.rendering.RuleInfoWrapper;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.RuleInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.UserDefinedFunctionInfo;
 import com.google.devtools.common.options.OptionsParser;
@@ -204,7 +205,7 @@
     Label targetFileLabel = Label.parseAbsolute(targetFileLabelString, ImmutableMap.of());
 
     ImmutableMap.Builder<String, RuleInfo> ruleInfoMap = ImmutableMap.builder();
-    ImmutableMap.Builder<String, ProviderInfo> providerInfoMap = ImmutableMap.builder();
+    ImmutableMap.Builder<String, ProviderInfoWrapper> providerInfoMap = ImmutableMap.builder();
     ImmutableMap.Builder<String, UserDefinedFunction> userDefinedFunctions = ImmutableMap.builder();
 
     try {
@@ -226,7 +227,7 @@
         ruleInfoMap.build().entrySet().stream()
             .filter(entry -> validSymbolName(symbolNames, entry.getKey()))
             .collect(ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue));
-    Map<String, ProviderInfo> filteredProviderInfos =
+    Map<String, ProviderInfoWrapper> filteredProviderInfos =
         providerInfoMap.build().entrySet().stream()
             .filter(entry -> validSymbolName(symbolNames, entry.getKey()))
             .collect(ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue));
@@ -273,10 +274,13 @@
   }
 
   private static void printProviderInfos(
-      PrintWriter printWriter, MarkdownRenderer renderer, Map<String, ProviderInfo> providerInfos)
+      PrintWriter printWriter,
+      MarkdownRenderer renderer,
+      Map<String, ProviderInfoWrapper> providerInfos)
       throws IOException {
-    for (Entry<String, ProviderInfo> entry : providerInfos.entrySet()) {
-      printProviderInfo(printWriter, renderer, entry.getKey(), entry.getValue());
+    for (Entry<String, ProviderInfoWrapper> entry : providerInfos.entrySet()) {
+      ProviderInfoWrapper infoWrapper = entry.getValue();
+      printProviderInfo(printWriter, renderer, entry.getKey(), infoWrapper.getProviderInfo());
       printWriter.println();
     }
   }
@@ -286,6 +290,7 @@
       MarkdownRenderer renderer,
       Map<String, UserDefinedFunction> userDefinedFunctions)
       throws IOException {
+
     for (Entry<String, UserDefinedFunction> entry : userDefinedFunctions.entrySet()) {
       try {
         UserDefinedFunctionInfo functionInfo =
@@ -342,22 +347,24 @@
       StarlarkSemantics semantics,
       Label label,
       ImmutableMap.Builder<String, RuleInfo> ruleInfoMap,
-      ImmutableMap.Builder<String, ProviderInfo> providerInfoMap,
+      ImmutableMap.Builder<String, ProviderInfoWrapper> providerInfoMap,
       ImmutableMap.Builder<String, UserDefinedFunction> userDefinedFunctionMap)
       throws InterruptedException, IOException, LabelSyntaxException, EvalException,
           StarlarkEvaluationException {
 
     List<RuleInfoWrapper> ruleInfoList = new ArrayList<>();
-    List<ProviderInfo> providerInfoList = new ArrayList<>();
+
+    List<ProviderInfoWrapper> providerInfoList = new ArrayList<>();
     Environment env = recursiveEval(semantics, label, ruleInfoList, providerInfoList);
 
     Map<BaseFunction, RuleInfoWrapper> ruleFunctions =
         ruleInfoList.stream()
             .collect(
                 Collectors.toMap(RuleInfoWrapper::getIdentifierFunction, Functions.identity()));
-    Map<BaseFunction, ProviderInfo> providerInfos =
+
+    Map<BaseFunction, ProviderInfoWrapper> providerInfos =
         providerInfoList.stream()
-            .collect(Collectors.toMap(ProviderInfo::getIdentifier, Functions.identity()));
+            .collect(Collectors.toMap(ProviderInfoWrapper::getIdentifier, Functions.identity()));
 
     // Sort the bindings so their ordering is deterministic.
     TreeMap<String, Object> sortedBindings = new TreeMap<>(env.getGlobals().getExportedBindings());
@@ -368,7 +375,7 @@
         ruleInfoMap.put(envEntry.getKey(), ruleInfo);
       }
       if (providerInfos.containsKey(envEntry.getValue())) {
-        ProviderInfo providerInfo = providerInfos.get(envEntry.getValue());
+        ProviderInfoWrapper providerInfo = providerInfos.get(envEntry.getValue());
         providerInfoMap.put(envEntry.getKey(), providerInfo);
       }
       if (envEntry.getValue() instanceof UserDefinedFunction) {
@@ -403,7 +410,7 @@
       StarlarkSemantics semantics,
       Label label,
       List<RuleInfoWrapper> ruleInfoList,
-      List<ProviderInfo> providerInfoList)
+      List<ProviderInfoWrapper> providerInfoList)
       throws InterruptedException, IOException, LabelSyntaxException, StarlarkEvaluationException {
     Path path = pathOfLabel(label);
 
@@ -471,7 +478,7 @@
       BuildFileAST buildFileAST,
       Map<String, Extension> imports,
       List<RuleInfoWrapper> ruleInfoList,
-      List<ProviderInfo> providerInfoList)
+      List<ProviderInfoWrapper> providerInfoList)
       throws InterruptedException, StarlarkEvaluationException {
 
     Environment env =
@@ -496,7 +503,7 @@
    *     invocation information will be added
    */
   private static GlobalFrame globalFrame(
-      List<RuleInfoWrapper> ruleInfoList, List<ProviderInfo> providerInfoList) {
+      List<RuleInfoWrapper> ruleInfoList, List<ProviderInfoWrapper> providerInfoList) {
     TopLevelBootstrap topLevelBootstrap =
         new TopLevelBootstrap(
             new FakeBuildApiGlobals(),
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 1a3e9fc..87f63cb 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
@@ -33,12 +33,14 @@
 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.rendering.ProviderInfo;
+import com.google.devtools.build.skydoc.rendering.ProviderInfoWrapper;
 import com.google.devtools.build.skydoc.rendering.RuleInfoWrapper;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeType;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderFieldInfo;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.RuleInfo;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
@@ -56,7 +58,8 @@
   private static final FakeDescriptor IMPLICIT_NAME_ATTRIBUTE_DESCRIPTOR =
       new FakeDescriptor(AttributeType.NAME, "A unique name for this target.", true);
   private final List<RuleInfoWrapper> ruleInfoList;
-  private final List<ProviderInfo> providerInfoList;
+
+  private final List<ProviderInfoWrapper> providerInfoList;
 
   /**
    * Constructor.
@@ -67,7 +70,7 @@
    *     information will be added
    */
   public FakeSkylarkRuleFunctionsApi(
-      List<RuleInfoWrapper> ruleInfoList, List<ProviderInfo> providerInfoList) {
+      List<RuleInfoWrapper> ruleInfoList, List<ProviderInfoWrapper> providerInfoList) {
     this.ruleInfoList = ruleInfoList;
     this.providerInfoList = providerInfoList;
   }
@@ -98,7 +101,7 @@
     } else {
       // fields is NONE, so there is no field information to add.
     }
-    providerInfoList.add(new ProviderInfo(fakeProvider, doc, providerFieldInfos.build()));
+    providerInfoList.add(forProviderInfo(fakeProvider, doc, providerFieldInfos.build()));
     return fakeProvider;
   }
 
@@ -107,6 +110,12 @@
     return ProviderFieldInfo.newBuilder().setName(name).setDocString(docString).build();
   }
 
+  /** Constructor for ProviderInfoWrapper. */
+  public ProviderInfoWrapper forProviderInfo(
+      BaseFunction identifier, String docString, Collection<ProviderFieldInfo> fieldInfos) {
+    return new ProviderInfoWrapper(identifier, docString, fieldInfos);
+  }
+
   @Override
   public BaseFunction rule(
       BaseFunction implementation,
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownRenderer.java b/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownRenderer.java
index f6fd3ef..c6f8f2a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownRenderer.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownRenderer.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.skydoc.rendering;
 
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.RuleInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.UserDefinedFunctionInfo;
 import java.io.IOException;
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java b/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java
index 251b78d..fe19424 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeType;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.FunctionParamInfo;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.RuleInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.UserDefinedFunctionInfo;
 import java.util.List;
@@ -51,9 +52,10 @@
    */
   @SuppressWarnings("unused") // Used by markdown template.
   public String providerSummary(String providerName, ProviderInfo providerInfo) {
-    List<String> fieldNames = providerInfo.getFields().stream()
-        .map(field -> field.getName())
-        .collect(Collectors.toList());
+    List<String> fieldNames =
+        providerInfo.getFieldInfosList().stream()
+            .map(field -> field.getName())
+            .collect(Collectors.toList());
     return summary(providerName, fieldNames);
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfo.java b/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfo.java
deleted file mode 100644
index 34b4d8e..0000000
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfo.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 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.skydoc.rendering;
-
-import com.google.devtools.build.lib.syntax.BaseFunction;
-import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderFieldInfo;
-import java.util.Collection;
-
-/**
- * Stores information about a starlark provider definition.
- *
- * For example, in <pre>FooInfo = provider(doc = 'My provider', fields = {'bar' : 'a bar'})</pre>,
- * this contains all information about the definition of FooInfo for purposes of generating its
- * documentation.
- */
-public class ProviderInfo {
-
-  private final BaseFunction identifier;
-  private final String docString;
-  private final Collection<ProviderFieldInfo> fieldInfos;
-
-  public ProviderInfo(BaseFunction identifier,
-      String docString,
-      Collection<ProviderFieldInfo> fieldInfos) {
-    this.identifier = identifier;
-    this.docString = docString;
-    this.fieldInfos = fieldInfos;
-  }
-
-  public BaseFunction getIdentifier() {
-    return identifier;
-  }
-
-  public String getDocString() {
-    return docString;
-  }
-
-  public Collection<ProviderFieldInfo> getFields() {
-    return fieldInfos;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java b/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java
new file mode 100644
index 0000000..ed7ec25
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java
@@ -0,0 +1,52 @@
+// Copyright 2019 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.skydoc.rendering;
+
+import com.google.devtools.build.lib.syntax.BaseFunction;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderFieldInfo;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderInfo;
+import java.util.Collection;
+
+/**
+ * Stores information about a starlark provider definition, comprised of BaseFunction identifier and
+ * a {@link ProviderInfo} proto.
+ *
+ * <p>For example, in
+ *
+ * <pre>FooInfo = provider(doc = 'My provider', fields = {'bar' : 'a bar'})</pre>
+ *
+ * , this contains all information about the definition of FooInfo for purposes of generating its
+ * documentation, as well as a unique BaseFunction identifier.
+ */
+public class ProviderInfoWrapper {
+
+  private final BaseFunction identifier;
+  private final ProviderInfo providerInfo;
+
+  public ProviderInfoWrapper(
+      BaseFunction identifier, String docString, Collection<ProviderFieldInfo> fieldInfos) {
+    this.identifier = identifier;
+    this.providerInfo =
+        ProviderInfo.newBuilder().setDocString(docString).addAllFieldInfos(fieldInfos).build();
+  }
+
+  public BaseFunction getIdentifier() {
+    return identifier;
+  }
+
+  public ProviderInfo getProviderInfo() {
+    return providerInfo;
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/proto/stardoc_output.proto b/src/main/java/com/google/devtools/build/skydoc/rendering/proto/stardoc_output.proto
index fa9d011..539245a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/proto/stardoc_output.proto
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/proto/stardoc_output.proto
@@ -115,3 +115,12 @@
   // The description of the provider.
   string doc_string = 2;
 }
+
+// Representation of a Starlark provider definition.
+message ProviderInfo {
+  // The description of the provider.
+  string doc_string = 1;
+
+  // The fields of the provider.
+  repeated ProviderFieldInfo field_infos = 2;
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/templates/provider.vm b/src/main/java/com/google/devtools/build/skydoc/rendering/templates/provider.vm
index 3d13b02..2910576 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/templates/provider.vm
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/templates/provider.vm
@@ -8,7 +8,7 @@
 
 ${providerInfo.docString}
 
-#if (!$providerInfo.fields.isEmpty())
+#if (!$providerInfo.fieldInfosList.isEmpty())
 #[[###]]# Fields
 
 <table class="params-table">
@@ -17,7 +17,7 @@
     <col class="col-description" />
   </colgroup>
   <tbody>
-#foreach ($field in $providerInfo.fields)
+#foreach ($field in $providerInfo.fieldInfosList)
     <tr id="${providerName}-${field.name}">
       <td><code>${field.name}</code></td>
       <td>