Added information about function params in builtin proto file.

RELNOTES: None
PiperOrigin-RevId: 212796678
diff --git a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
index c4b9327..af055ae 100644
--- a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
+++ b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
@@ -140,11 +140,41 @@
     Value.Builder value = Value.newBuilder();
     value.setName(func.getName());
     Callable.Builder callable = Callable.newBuilder();
-    ImmutableList<String> paramNames = func.getSignature().getSignature().getNames();
 
-    for (int i = 0; i < paramNames.size(); i++) {
+    ImmutableList<String> paramNames = func.getSignature().getSignature().getNames();
+    List<Object> defaultValues = func.getSignature().getDefaultValues();
+    int positionals = func.getSignature().getSignature().getShape().getMandatoryPositionals();
+    int optionals = func.getSignature().getSignature().getShape().getOptionals();
+    int nameIndex = 0;
+
+    for (int i = 0; i < positionals; i++) {
       Param.Builder param = Param.newBuilder();
-      param.setName(paramNames.get(i));
+      param.setName(paramNames.get(nameIndex));
+      param.setIsMandatory(true);
+      callable.addParam(param);
+      nameIndex++;
+    }
+
+    for (int i = 0; i < optionals; i++) {
+      Param.Builder param = Param.newBuilder();
+      param.setName(paramNames.get(nameIndex));
+      param.setIsMandatory(false);
+      param.setDefaultValue(defaultValues.get(i).toString());
+      callable.addParam(param);
+      nameIndex++;
+    }
+
+    if (func.getSignature().getSignature().getShape().hasStarArg()) {
+      Param.Builder param = Param.newBuilder();
+      param.setName("*" + paramNames.get(nameIndex));
+      param.setIsMandatory(false);
+      nameIndex++;
+      callable.addParam(param);
+    }
+    if (func.getSignature().getSignature().getShape().hasKwArg()) {
+      Param.Builder param = Param.newBuilder();
+      param.setIsMandatory(false);
+      param.setName("**" + paramNames.get(nameIndex));
       callable.addParam(param);
     }
     if (func.getObjectType() != null) {
@@ -165,6 +195,7 @@
         param.setName(par.getName());
         param.setType(par.getType());
         param.setDoc(par.getDocumentation());
+        param.setIsMandatory(par.getDefaultValue().isEmpty());
         param.setDefaultValue(par.getDefaultValue());
         callable.addParam(param);
       }
@@ -185,6 +216,7 @@
     for (RuleDocumentationAttribute attr : rule.getAttributes()) {
       Param.Builder param = Param.newBuilder();
       param.setName(attr.getAttributeName());
+      param.setIsMandatory(attr.isMandatory());
       callable.addParam(param);
     }
     value.setCallable(callable);
diff --git a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
index 5f543f9..cac1303 100644
--- a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
+++ b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
@@ -147,6 +147,14 @@
     return expandedHtmlDoc;
   }
 
+  /** Returns whether the param is required or optional. */
+  public boolean isMandatory() {
+    if (attribute == null) {
+      return false;
+    }
+    return attribute.isMandatory();
+  }
+
   private String getDefaultValue() {
     if (attribute == null) {
       return "";
diff --git a/src/main/protobuf/builtin.proto b/src/main/protobuf/builtin.proto
index 9ca7f54..10e3711 100644
--- a/src/main/protobuf/builtin.proto
+++ b/src/main/protobuf/builtin.proto
@@ -96,4 +96,7 @@
   // Default value for the parameter, written as Skylark expression (e.g.
   // "False", "True", "[]", "None")
   string default_value = 4;
+
+  // Whether the param is mandatory or optional.
+  bool is_mandatory = 5;
 }