Add providerName and ruleName to output protos.

PiperOrigin-RevId: 255396190
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 2ef857b..950a5e4 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -217,7 +217,7 @@
     Label targetFileLabel = Label.parseAbsolute(targetFileLabelString, ImmutableMap.of());
 
     ImmutableMap.Builder<String, RuleInfo> ruleInfoMap = ImmutableMap.builder();
-    ImmutableMap.Builder<String, ProviderInfoWrapper> providerInfoMap = ImmutableMap.builder();
+    ImmutableMap.Builder<String, ProviderInfo> providerInfoMap = ImmutableMap.builder();
     ImmutableMap.Builder<String, UserDefinedFunction> userDefinedFunctions = ImmutableMap.builder();
 
     try {
@@ -237,7 +237,7 @@
         ruleInfoMap.build().entrySet().stream()
             .filter(entry -> validSymbolName(symbolNames, entry.getKey()))
             .collect(ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue));
-    Map<String, ProviderInfoWrapper> filteredProviderInfos =
+    Map<String, ProviderInfo> filteredProviderInfos =
         providerInfoMap.build().entrySet().stream()
             .filter(entry -> validSymbolName(symbolNames, entry.getKey()))
             .collect(ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue));
@@ -296,13 +296,11 @@
   }
 
   private static void printProviderInfos(
-      PrintWriter printWriter,
-      MarkdownRenderer renderer,
-      Map<String, ProviderInfoWrapper> providerInfos)
+      PrintWriter printWriter, MarkdownRenderer renderer, Map<String, ProviderInfo> providerInfos)
       throws IOException {
-    for (Entry<String, ProviderInfoWrapper> entry : providerInfos.entrySet()) {
-      ProviderInfoWrapper infoWrapper = entry.getValue();
-      printProviderInfo(printWriter, renderer, entry.getKey(), infoWrapper.getProviderInfo());
+    for (Entry<String, ProviderInfo> entry : providerInfos.entrySet()) {
+      ProviderInfo providerInfo = entry.getValue();
+      printProviderInfo(printWriter, renderer, entry.getKey(), providerInfo);
       printWriter.println();
     }
   }
@@ -369,7 +367,7 @@
       StarlarkSemantics semantics,
       Label label,
       ImmutableMap.Builder<String, RuleInfo> ruleInfoMap,
-      ImmutableMap.Builder<String, ProviderInfoWrapper> providerInfoMap,
+      ImmutableMap.Builder<String, ProviderInfo> providerInfoMap,
       ImmutableMap.Builder<String, UserDefinedFunction> userDefinedFunctionMap)
       throws InterruptedException, IOException, LabelSyntaxException, EvalException,
           StarlarkEvaluationException {
@@ -393,11 +391,14 @@
 
     for (Entry<String, Object> envEntry : sortedBindings.entrySet()) {
       if (ruleFunctions.containsKey(envEntry.getValue())) {
-        RuleInfo ruleInfo = ruleFunctions.get(envEntry.getValue()).getRuleInfo();
+        RuleInfo.Builder ruleInfoBuild = ruleFunctions.get(envEntry.getValue()).getRuleInfo();
+        RuleInfo ruleInfo = ruleInfoBuild.setRuleName(envEntry.getKey()).build();
         ruleInfoMap.put(envEntry.getKey(), ruleInfo);
       }
       if (providerInfos.containsKey(envEntry.getValue())) {
-        ProviderInfoWrapper providerInfo = providerInfos.get(envEntry.getValue());
+        ProviderInfo.Builder providerInfoBuild =
+            providerInfos.get(envEntry.getValue()).getProviderInfo();
+        ProviderInfo providerInfo = providerInfoBuild.setProviderName(envEntry.getKey()).build();
         providerInfoMap.put(envEntry.getKey(), providerInfo);
       }
       if (envEntry.getValue() instanceof UserDefinedFunction) {
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 bb99a4b..fa82b8a 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
@@ -155,7 +155,8 @@
 
     RuleDefinitionIdentifier functionIdentifier = new RuleDefinitionIdentifier();
 
-    RuleInfo ruleInfo = RuleInfo.newBuilder().setDocString(doc).addAllAttribute(attrInfos).build();
+    // Only the Builder is passed to RuleInfoWrapper as the rule name is not yet available.
+    RuleInfo.Builder ruleInfo = RuleInfo.newBuilder().setDocString(doc).addAllAttribute(attrInfos);
 
     ruleInfoList.add(new RuleInfoWrapper(functionIdentifier, ast.getLocation(), ruleInfo));
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
index 28b93ff..0a1ce19 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
@@ -74,7 +74,8 @@
     RepositoryRuleDefinitionIdentifier functionIdentifier =
         new RepositoryRuleDefinitionIdentifier();
 
-    RuleInfo ruleInfo = RuleInfo.newBuilder().setDocString(doc).addAllAttribute(attrInfos).build();
+    // Only the Builder is passed to RuleInfoWrapper as the rule name is not yet available.
+    RuleInfo.Builder ruleInfo = RuleInfo.newBuilder().setDocString(doc).addAllAttribute(attrInfos);
 
     ruleInfoList.add(new RuleInfoWrapper(functionIdentifier, ast.getLocation(), ruleInfo));
     return functionIdentifier;
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java b/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java
index 1d42833..5048724 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java
@@ -42,9 +42,8 @@
   }
 
   /** Appends {@link ProviderInfo} protos to a {@link ModuleInfo.Builder}. */
-  public ProtoRenderer appendProviderInfos(Collection<ProviderInfoWrapper> providerInfoWrappers) {
-    for (ProviderInfoWrapper providerInfoWrapper : providerInfoWrappers) {
-      ProviderInfo providerInfo = providerInfoWrapper.getProviderInfo();
+  public ProtoRenderer appendProviderInfos(Collection<ProviderInfo> providerInfos) {
+    for (ProviderInfo providerInfo : providerInfos) {
       moduleInfo.addProviderInfo(providerInfo);
     }
     return this;
@@ -66,4 +65,8 @@
     ModuleInfo build = moduleInfo.build();
     build.writeTo(outputStream);
   }
+
+  public ModuleInfo.Builder getModuleInfo() {
+    return moduleInfo;
+  }
 }
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
index cfec4d6..c64cfa8 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java
@@ -33,20 +33,21 @@
 public class ProviderInfoWrapper {
 
   private final BaseFunction identifier;
-  private final ProviderInfo providerInfo;
+  // Only the Builder is passed to ProviderInfoWrapper as the provider name is not yet available.
+  private final ProviderInfo.Builder providerInfo;
 
   public ProviderInfoWrapper(
       BaseFunction identifier, String docString, Collection<ProviderFieldInfo> fieldInfos) {
     this.identifier = identifier;
     this.providerInfo =
-        ProviderInfo.newBuilder().setDocString(docString).addAllFieldInfo(fieldInfos).build();
+        ProviderInfo.newBuilder().setDocString(docString).addAllFieldInfo(fieldInfos);
   }
 
   public BaseFunction getIdentifier() {
     return identifier;
   }
 
-  public ProviderInfo getProviderInfo() {
+  public ProviderInfo.Builder getProviderInfo() {
     return providerInfo;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java b/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java
index c371272..3e23416 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java
@@ -23,9 +23,11 @@
 
   private final BaseFunction identifierFunction;
   private final Location location;
-  private final RuleInfo ruleInfo;
+  // Only the Builder is passed to RuleInfoWrapper as the rule name is not yet available.
+  private final RuleInfo.Builder ruleInfo;
 
-  public RuleInfoWrapper(BaseFunction identifierFunction, Location location, RuleInfo ruleInfo) {
+  public RuleInfoWrapper(
+      BaseFunction identifierFunction, Location location, RuleInfo.Builder ruleInfo) {
     this.identifierFunction = identifierFunction;
     this.location = location;
     this.ruleInfo = ruleInfo;
@@ -39,7 +41,7 @@
     return location;
   }
 
-  public RuleInfo getRuleInfo() {
+  public RuleInfo.Builder getRuleInfo() {
     return ruleInfo;
   }
 }
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 16cdb83..9fc3be7 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
@@ -58,11 +58,14 @@
 
 // Representation of a Starlark rule definition.
 message RuleInfo {
+  // The name of the rule.
+  string rule_name = 1;
+
   // The documentation string of the rule.
-  string doc_string = 1;
+  string doc_string = 2;
 
   // The attributes of the rule.
-  repeated AttributeInfo attribute = 2;
+  repeated AttributeInfo attribute = 3;
 }
 
 // Representation of a Starlark rule attribute definition, comprised of an
@@ -129,9 +132,12 @@
 
 // Representation of a Starlark provider definition.
 message ProviderInfo {
+  // The name of the provider.
+  string provider_name = 1;
+
   // The description of the provider.
-  string doc_string = 1;
+  string doc_string = 2;
 
   // The fields of the provider.
-  repeated ProviderFieldInfo field_info = 2;
+  repeated ProviderFieldInfo field_info = 3;
 }
diff --git a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
index c120e90..7db3b9e 100644
--- a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
+++ b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
@@ -30,11 +30,13 @@
 import com.google.devtools.build.skydoc.SkydocMain.StarlarkEvaluationException;
 import com.google.devtools.build.skydoc.rendering.DocstringParseException;
 import com.google.devtools.build.skydoc.rendering.FunctionUtil;
+import com.google.devtools.build.skydoc.rendering.ProtoRenderer;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeType;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ModuleInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.RuleInfo;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.UserDefinedFunctionInfo;
 import java.io.IOException;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.stream.Collectors;
 import org.junit.Before;
 import org.junit.Test;
@@ -125,12 +127,11 @@
     Map<String, RuleInfo> ruleInfos = ruleInfoMap.build();
     assertThat(ruleInfos).hasSize(1);
 
-    Entry<String, RuleInfo> ruleInfo = Iterables.getOnlyElement(ruleInfos.entrySet());
-    assertThat(ruleInfo.getKey()).isEqualTo("my_rule");
-    assertThat(ruleInfo.getValue().getDocString()).isEqualTo("This is my rule. It does stuff.");
-    assertThat(getAttrNames(ruleInfo.getValue())).containsExactly(
-        "name", "a", "b", "c", "d").inOrder();
-    assertThat(getAttrTypes(ruleInfo.getValue()))
+    RuleInfo ruleInfo = Iterables.getOnlyElement(ruleInfos.values());
+    assertThat(ruleInfo.getRuleName()).isEqualTo("my_rule");
+    assertThat(ruleInfo.getDocString()).isEqualTo("This is my rule. It does stuff.");
+    assertThat(getAttrNames(ruleInfo)).containsExactly("name", "a", "b", "c", "d").inOrder();
+    assertThat(getAttrTypes(ruleInfo))
         .containsExactly(
             AttributeType.NAME,
             AttributeType.LABEL,
@@ -391,4 +392,45 @@
             "/test/main.bzl:1:5 line 8: invalid parameter documentation "
                 + "(expected format: \"parameter_name: documentation\").");
   }
+
+  @Test
+  public void testFuncInfoParams() throws Exception {
+    scratch.file(
+        "/test/test.bzl",
+        "def check_function(foo, bar, baz):",
+        "\"\"\"Runs some checks on the given function parameter.",
+        " ",
+        "This rule runs checks on a given function parameter.",
+        " ",
+        "Args:",
+        "foo: A unique parameter for this rule.",
+        "bar: A unique parameter for this rule.",
+        "baz: A unique parameter for this rule.",
+        "\"\"\"",
+        "pass");
+
+    ImmutableMap.Builder<String, UserDefinedFunction> funcInfoMap = ImmutableMap.builder();
+
+    skydocMain.eval(
+        StarlarkSemantics.DEFAULT_SEMANTICS,
+        Label.parseAbsoluteUnchecked("//test:test.bzl"),
+        ImmutableMap.builder(),
+        ImmutableMap.builder(),
+        funcInfoMap);
+
+    Map<String, UserDefinedFunction> functions = funcInfoMap.build();
+    assertThat(functions).hasSize(1);
+
+    ModuleInfo moduleInfo =
+        new ProtoRenderer().appendUserDefinedFunctionInfos(functions).getModuleInfo().build();
+    UserDefinedFunctionInfo funcInfo = moduleInfo.getFuncInfo(0);
+    assertThat(funcInfo.getFunctionName()).isEqualTo("check_function");
+    assertThat(getParamNames(funcInfo)).containsExactly("foo", "bar", "baz").inOrder();
+  }
+
+  private static Iterable<String> getParamNames(UserDefinedFunctionInfo funcInfo) {
+    return funcInfo.getParameterList().stream()
+        .map(param -> param.getName())
+        .collect(Collectors.toList());
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/skydoc/testdata/proto_format_test/golden.raw b/src/test/java/com/google/devtools/build/skydoc/testdata/proto_format_test/golden.raw
index f80ac07..5cb2908 100644
--- a/src/test/java/com/google/devtools/build/skydoc/testdata/proto_format_test/golden.raw
+++ b/src/test/java/com/google/devtools/build/skydoc/testdata/proto_format_test/golden.raw
@@ -1,11 +1,12 @@
 
-q
-Small example of rule.*
-nameA unique name for this target. +
-uselessThis argument will be ignored.Œ
-$Stores information about an example. 
-fooA string representing foo 
-barA string representing bar 
+}
+
+my_exampleSmall example of rule.*
+nameA unique name for this target. +
+uselessThis argument will be ignored.•
+example$Stores information about an example. 
+fooA string representing foo 
+barA string representing bar 
 bazA string representing bazÆ
 check_function%
 fooA unique name for this rule. ŒRuns some checks on the given function parameter.