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>