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.