Refactor FunctionParamInfo into a proto.

PiperOrigin-RevId: 251708686
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/UserDefinedFunctionInfo.java b/src/main/java/com/google/devtools/build/skydoc/rendering/UserDefinedFunctionInfo.java
index afe3f3e..2e7c9df 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/UserDefinedFunctionInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/UserDefinedFunctionInfo.java
@@ -19,9 +19,12 @@
 import com.google.common.collect.Maps;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.FunctionSignature;
+import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.Printer.BasePrinter;
 import com.google.devtools.build.lib.syntax.SkylarkType;
 import com.google.devtools.build.lib.syntax.StringLiteral;
 import com.google.devtools.build.lib.syntax.UserDefinedFunction;
+import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.FunctionParamInfo;
 import com.google.devtools.skylark.common.DocstringUtils;
 import com.google.devtools.skylark.common.DocstringUtils.DocstringInfo;
 import com.google.devtools.skylark.common.DocstringUtils.DocstringParseError;
@@ -29,6 +32,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import javax.annotation.Nullable;
 
 /** Encapsulates information about a user-defined Starlark function. */
 public class UserDefinedFunctionInfo {
@@ -108,6 +112,35 @@
         functionDescription);
   }
 
+  /** Constructor to be used for normal parameters. */
+  public static FunctionParamInfo forParam(
+      String name, String docString, @Nullable Object defaultValue) {
+    FunctionParamInfo.Builder paramBuilder =
+        FunctionParamInfo.newBuilder().setName(name).setDocString(docString);
+    if (defaultValue == null) {
+      paramBuilder.setMandatory(true);
+    } else {
+      BasePrinter printer = Printer.getSimplifiedPrinter();
+      printer.repr(defaultValue);
+      String defaultValueString = printer.toString();
+
+      if (defaultValueString.isEmpty()) {
+        defaultValueString = "{unknown object}";
+      }
+      paramBuilder.setDefaultValue(defaultValueString).setMandatory(false);
+    }
+    return paramBuilder.build();
+  }
+
+  /** Constructor to be used for *args or **kwargs. */
+  public static FunctionParamInfo forSpecialParam(String name, String docString) {
+    return FunctionParamInfo.newBuilder()
+        .setName(name)
+        .setDocString(docString)
+        .setMandatory(false)
+        .build();
+  }
+
   private static List<FunctionParamInfo> parameterInfos(
       UserDefinedFunction userDefinedFunction,
       Map<String, String> paramNameToDocMap)  {
@@ -126,7 +159,7 @@
     for (paramIndex = 0; paramIndex < numMandatoryParams; paramIndex++) {
       String paramName = paramNames.get(paramIndex);
       String paramDoc = paramNameToDocMap.getOrDefault(paramName, "");
-      parameterInfos.add(FunctionParamInfo.forParam(paramName, paramDoc, /*default param*/ null));
+      parameterInfos.add(forParam(paramName, paramDoc, /*default param*/ null));
     }
 
     // Parameters with defaults.
@@ -138,7 +171,7 @@
         if (paramNameToDocMap.containsKey(paramName)) {
           paramDoc = paramNameToDocMap.get(paramName);
         }
-        parameterInfos.add(FunctionParamInfo.forParam(paramName, paramDoc, defaultParamValue));
+        parameterInfos.add(forParam(paramName, paramDoc, defaultParamValue));
         paramIndex++;
       }
     }
@@ -152,7 +185,7 @@
       } else if (paramNameToDocMap.containsKey("*" + paramName)) {
         paramDoc = paramNameToDocMap.get("*" + paramName);
       }
-      parameterInfos.add(FunctionParamInfo.forSpecialParam(paramName, paramDoc));
+      parameterInfos.add(forSpecialParam(paramName, paramDoc));
       paramIndex++;
     }
 
@@ -165,7 +198,7 @@
       } else if (paramNameToDocMap.containsKey("**" + paramName)) {
         paramDoc = paramNameToDocMap.get("**" + paramName);
       }
-      parameterInfos.add(FunctionParamInfo.forSpecialParam(paramName, paramDoc));
+      parameterInfos.add(forSpecialParam(paramName, paramDoc));
       paramIndex++;
     }
     return parameterInfos.build();