| // 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.base.Joiner; |
| import com.google.common.collect.ImmutableList; |
| import java.util.ArrayList; |
| import java.util.List; |
| import javax.annotation.Nullable; |
| |
| /** |
| * Documentation for a method or struct field of a Java class annotated with {@link |
| * net.starlark.java.annot.StarlarkBuiltin}, or for a field of a Starlark-defined struct. |
| */ |
| public abstract class MemberDoc extends StarlarkDoc { |
| |
| protected MemberDoc(StarlarkDocExpander expander) { |
| super(expander); |
| } |
| |
| /** Returns whether the value is documented. */ |
| public abstract boolean documented(); |
| |
| /** |
| * Returns whether the value can be called as a function. |
| * |
| * <p>For example, {@code ctx.label} is not callable. |
| */ |
| public abstract boolean isCallable(); |
| |
| /** |
| * For a callable value, returns the name for the return type; or the name of the value's own type |
| * otherwise. |
| */ |
| public abstract String getReturnType(); |
| |
| /** |
| * For a callable value, returns a short piece of additional documentation about the return value, |
| * which will be appended to the main documentation. |
| * |
| * <p>Returns an empty string by default. |
| * |
| * <p>Contrast with {@link #getReturnsStanza}, which requires formatting under a separate |
| * sub-header. |
| */ |
| public String getReturnTypeExtraMessage() { |
| return ""; |
| } |
| |
| /** |
| * Long-form HTML documentation about the return value; inserted in the output as a separate |
| * stanza with a sub-header. |
| */ |
| public String getReturnsStanza() { |
| return ""; |
| } |
| |
| /** Returns true if the value is callable and is a constructor of its type. */ |
| public boolean isConstructor() { |
| return false; |
| } |
| |
| /** |
| * Returns the value's name within its module. |
| * |
| * <p>In most cases, this is the same as {@link #getName}. The exception is for overloaded methods |
| * in a {@link net.starlark.java.annot.StarlarkBuiltin}-annotated Java class. In that case, this |
| * method would return the name of the method, while {@link #getName} would return the method |
| * signature with parameters, e.g. {@code method_name(arg1, arg2)}. |
| */ |
| public String getShortName() { |
| return getName(); |
| } |
| |
| /** |
| * For a callable value, returns a list containing the documentation for each of the method's |
| * parameters; or an empty list otherwise. |
| */ |
| public abstract ImmutableList<? extends ParamDoc> getParams(); |
| |
| /** |
| * For a callable value, returns the string representation of the parameters, for example {@code |
| * "arg1, arg2=None, **kwargs"}; or an empty string otherwise. |
| */ |
| protected String getParameterString() { |
| ImmutableList<? extends ParamDoc> params = getParams(); |
| int nparams = params.size(); |
| @Nullable ParamDoc kwargs = null; |
| if (nparams > 0 && params.get(nparams - 1).getKind().equals(ParamDoc.Kind.KWARGS)) { |
| kwargs = params.get(nparams - 1); |
| nparams--; |
| } |
| @Nullable ParamDoc varargs = null; |
| if (nparams > 0 && params.get(nparams - 1).getKind().equals(ParamDoc.Kind.VARARGS)) { |
| varargs = params.get(nparams - 1); |
| nparams--; |
| } |
| |
| List<String> argList = new ArrayList<>(params.size()); |
| int numKeywordOnly = 0; |
| for (int i = 0; i < nparams; i++) { |
| ParamDoc param = params.get(i); |
| if (param.getKind().equals(ParamDoc.Kind.KEYWORD_ONLY)) { |
| numKeywordOnly = nparams - i; |
| break; |
| } |
| argList.add(formatParameter(param)); |
| } |
| if (varargs != null) { |
| argList.add("*" + varargs.getName()); |
| } else if (numKeywordOnly > 0) { |
| argList.add("*"); |
| } |
| for (int i = nparams - numKeywordOnly; i < nparams; i++) { |
| argList.add(formatParameter(params.get(i))); |
| } |
| if (kwargs != null) { |
| argList.add("**" + kwargs.getName()); |
| } |
| return Joiner.on(", ").join(argList); |
| } |
| |
| /** |
| * For a callable value, returns the string representing the method signature of the Starlark |
| * method, which contains HTML links to the documentation of parameter types if available. For a |
| * non-callable value, returns the string representation of the value's type (with HTML links to |
| * the type's documentation, if available) and name. |
| */ |
| public abstract String getSignature(); |
| |
| private String formatParameter(ParamDoc param) { |
| if (!param.getDefaultValue().isEmpty()) { |
| return String.format("%s=%s", param.getName(), param.getDefaultValue()); |
| } else { |
| return param.getName(); |
| } |
| } |
| } |