blob: 2af2ff2aca1469a8f3c3de81a80029b459f876be [file] [log] [blame]
// Copyright 2025 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.docgen.starlark;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.starlarkdocextract.StardocOutputProtos.ModuleInfo;
import com.google.devtools.build.lib.starlarkdocextract.StardocOutputProtos.ProviderInfo;
import com.google.devtools.build.lib.starlarkdocextract.StardocOutputProtos.StarlarkOtherSymbolInfo;
/**
* A documentation page for a Starlark struct described by a Stardoc proto obtained via {@code
* starlark_doc_extract} from a .bzl file.
*/
public final class StardocProtoStructDocPage extends StarlarkDocPage {
private final String sourceFileLabel;
private final StarlarkOtherSymbolInfo structInfo;
public StardocProtoStructDocPage(
StarlarkDocExpander expander, ModuleInfo moduleInfo, StarlarkOtherSymbolInfo structInfo) {
super(expander);
this.sourceFileLabel = moduleInfo.getFile();
this.structInfo = structInfo;
}
@Override
public String getName() {
return structInfo.getName();
}
@Override
public String getRawDocumentation() {
return structInfo.getDoc();
}
@Override
public String getTitle() {
return structInfo.getName();
}
@Override
public String getSourceFile() {
return getSourceFileFromLabel(sourceFileLabel);
}
@Override
public String getLoadStatement() {
return String.format("load(\"%s\", \"%s\")", sourceFileLabel, structInfo.getName());
}
public void addProviderAlias(ProviderInfo providerInfo) {
addMember(new ProviderAliasDoc(expander, sourceFileLabel, structInfo.getName(), providerInfo));
}
private static final class ProviderAliasDoc extends MemberDoc {
private final String sourceFileLabel;
private final String structName;
private final String nameWithoutNamespace;
private final ProviderInfo providerInfo;
ProviderAliasDoc(
StarlarkDocExpander expander,
String sourceFileLabel,
String structName,
ProviderInfo providerInfo) {
super(expander);
this.sourceFileLabel = sourceFileLabel;
this.structName = structName;
this.nameWithoutNamespace =
providerInfo.getProviderName().startsWith(structName + ".")
? providerInfo.getProviderName().substring(structName.length() + 1)
: providerInfo.getProviderName();
this.providerInfo = providerInfo;
}
@Override
public String getName() {
return nameWithoutNamespace;
}
@Override
public boolean documented() {
return true;
}
@Override
public boolean isCallable() {
// For simplicity, we document a provider alias in its role as a symbol.
return false;
}
@Override
public ImmutableList<? extends ParamDoc> getParams() {
return ImmutableList.of();
}
@Override
public String getReturnType() {
return expander.getTypeParser().getHtmlForIdentifier("Provider");
}
@Override
public String getRawDocumentation() {
return String.format("A convenience alias for the %s provider symbol.", getAliasedName());
}
@Override
public String getDocumentation() {
return String.format(
"A convenience alias for the %s provider symbol.",
expander.getTypeParser().getHtmlForIdentifier(getAliasedName()));
}
/**
* Returns the documented name of the provider symbol that this one is aliasing; or this
* provider's name without the struct namespace as fallback.
*/
private String getAliasedName() {
if (expander.getTypeParser().isDocumentedIdentifier(providerInfo.getOriginKey().getName())) {
return providerInfo.getOriginKey().getName();
} else {
return getName();
}
}
@Override
public String getSignature() {
return String.format("%s %s", getReturnType(), getName());
}
@Override
public String getLoadStatement() {
return String.format("load(\"%s\", \"%s\")", sourceFileLabel, structName);
}
}
}