// 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.
//
// Protos for Stardoc data.
//
// Stardoc collects information about Starlark functions, providers, and rules.
syntax = "proto3";

package stardoc_output;

// option java_api_version = 2;
option java_package = "com.google.devtools.build.lib.starlarkdocextract";
option java_outer_classname = "StardocOutputProtos";

// The root output proto of Stardoc. An invocation of Stardoc on a single file
// will output exactly one instance of this proto, representing all
// documentation for the input Starlark file.
message ModuleInfo {
  repeated RuleInfo rule_info = 1;

  repeated ProviderInfo provider_info = 2;

  repeated StarlarkFunctionInfo func_info = 3;

  repeated AspectInfo aspect_info = 4;

  // The docstring present at the top of the input Starlark file.
  string module_docstring = 5;

  // The display form of the label of the module file (as seen from the
  // starlark_doc_extract or Stardoc target's repo). Unset when there is no
  // module file (e.g. when the module is a REPL, or in Bazel's internal tests).
  string file = 6;

  repeated ModuleExtensionInfo module_extension_info = 7;

  repeated RepositoryRuleInfo repository_rule_info = 8;

  repeated MacroInfo macro_info = 9;
}

// Representation of a Starlark rule attribute type. These generally
// have a one-to-one correspondence with functions defined at
// https://bazel.build/rules/lib/toplevel/attr.
enum AttributeType {
  UNKNOWN = 0;
  // A special case of STRING; all rules have exactly one implicit
  // attribute "name" of type NAME.
  NAME = 1;
  INT = 2;
  LABEL = 3;
  STRING = 4;
  STRING_LIST = 5;
  INT_LIST = 6;
  LABEL_LIST = 7;
  BOOLEAN = 8;
  LABEL_STRING_DICT = 9;
  STRING_DICT = 10;
  STRING_LIST_DICT = 11;
  OUTPUT = 12;
  OUTPUT_LIST = 13;
  LABEL_DICT_UNARY = 14;
  LABEL_LIST_DICT = 15;
}

// Representation of a Starlark rule definition.
message RuleInfo {
  // In Stardoc and starlark_doc_extract output, this is the name under which
  // the rule is made accessible to a user of this module, including any structs
  // it is nested in, for example "foo.foo_library".
  //
  // In query output, this is the name under which the rule was defined (which
  // might be a private symbol prefixed with "_").
  string rule_name = 1;

  // The documentation string of the rule.
  string doc_string = 2;

  // The attributes of the rule.
  repeated AttributeInfo attribute = 3;

  // Note: legacy Stardoc (0.5.x and earlier) does not set any fields below.

  // The module where and the name under which the rule was originally declared.
  OriginKey origin_key = 4;

  // The list of providers that the rule's implementation must return. Unset if
  // the rule lists no advertised providers.
  ProviderNameGroup advertised_providers = 5;

  // True if this is a test rule.
  bool test = 6;

  // True if this is an executable rule.
  //
  // Note: if test is true, executable is also true (test rules are implicitly
  // executable).
  bool executable = 7;
}

// Representation of a Starlark symbolic macro definition.
// Note: symbolic macros (and thus, their documentation format) are an
// experimental feature gated by the --experimental_enable_first_class_macros
// flag.
message MacroInfo {
  // The name under which the macro is made accessible to a user of this module,
  // including any structs it is nested in, for example "foo.foo_library".
  string macro_name = 1;

  // The documentation string of the macro.
  string doc_string = 2;

  // The attributes of the macro.
  repeated AttributeInfo attribute = 3;

  // The module where and the name under which the macro was originally
  // declared.
  OriginKey origin_key = 4;

  // True if this macro is a rule finalizer.
  bool finalizer = 5;
}

// Representation of a Starlark rule, repository rule, or module extension tag
// attribute definition, comprised of an attribute name, and a schema defined by
// a call to one of the 'attr' module methods enumerated at
// https://bazel.build/rules/lib/toplevel/attr.
message AttributeInfo {
  // The name of the attribute.
  string name = 1;

  // The documentation string of the attribute, supplied via the 'doc'
  // parameter to the schema-creation call.
  string doc_string = 2;

  // The type of the attribute, defined generally by which function is invoked
  // in the attr module.
  AttributeType type = 3;

  // If true, all targets of the rule must specify a value for this attribute.
  bool mandatory = 4;

  // The target(s) in this attribute must define all the providers of at least
  // one of the ProviderNameGroups in this list. If the Attribute Type is not a
  // label, a label list, or a label-keyed string dictionary, the field will be
  // left empty. For attributes of a repository rule or a module extension tag,
  // this attribute is meaningless and may be ignored.
  // TODO(b/290788853): ensure this field is always empty for attributes of a
  // repository rule or a module extension tag.
  repeated ProviderNameGroup provider_name_group = 5;

  // The string representation of the default value of this attribute.
  string default_value = 6;

  // If true, the attribute is non-configurable.
  bool nonconfigurable = 7;

  // If true, the attribute is defined in Bazel's native code, not in Starlark.
  bool natively_defined = 8;
}

// Representation of a set of providers.
message ProviderNameGroup {
  // The names of the providers.
  //
  // This field is only intended for rendering human-readable output.
  // Please use origin_key (a list of the same length and in the same order as
  // this field) for cross-references and tooling.
  //
  // Note: legacy Stardoc (0.5.x and earlier) is unable to extract the name in
  // some circumstances (for example, if the provider is nested in a struct),
  // and in that case, the provider name will be "Unknown Provider".
  repeated string provider_name = 1;

  // A list of unambiguous references to providers, of the same length and in
  // the same order as the provider_name list.
  //
  // For provider symbols, this means modules where and the names under which
  // the providers were originally declared.
  //
  // For legacy struct providers, origin_key.file is unset.
  //
  // Note: legacy Stardoc (0.5.x and earlier) does not set this field.
  repeated OriginKey origin_key = 2;
}

// Representation of Starlark function definition.
message StarlarkFunctionInfo {
  // The name under which the function is made accessible to a user of this
  // module, including any structs it is nested in, for example
  // "foo.frobnicate".
  string function_name = 1;

  // The parameters for the function, in the following order:
  // - positional parameters
  // - keyword-only parameters
  // - residual varargs parameter (`*args`)
  // - residual keyword arguments parameter (`**kwargs`)
  // This order differs from the order in which parameters are listed in the
  // function's declaration (where positional parameters and keyword-only
  // parameters are separated either by `*` or `*args`). The declaration order
  // can be recovered by looking for the transition from ordinary/positional to
  // keyword-only.
  repeated FunctionParamInfo parameter = 2;

  // The documented description of the function (if specified in the function's
  // docstring).
  string doc_string = 3;

  // The return value for the function.
  FunctionReturnInfo return = 4;

  // The deprecation for the function.
  FunctionDeprecationInfo deprecated = 5;

  // The module where and the name under which the function was originally
  // declared.
  //
  // Note: legacy Stardoc (0.5.x and earlier) does not set this field.
  OriginKey origin_key = 6;
}

// Representation of the syntactic role of a given function parameter.
enum FunctionParamRole {
  PARAM_ROLE_UNSPECIFIED = 0;
  // An ordinary parameter which may be used as a positional or by keyword.
  PARAM_ROLE_ORDINARY = 1;
  // A positional-only parameter; such parameters cannot be defined in pure
  // Starlark code, but exist in some natively-defined functions.
  PARAM_ROLE_POSITIONAL_ONLY = 2;
  // A keyword-only parameter, i.e. a non-vararg/kwarg parameter that follows
  // `*` or `*args` in the function's declaration.
  PARAM_ROLE_KEYWORD_ONLY = 3;
  // Residual varargs, typically `*args` in the function's declaration.
  PARAM_ROLE_VARARGS = 4;
  // Residual keyword arguments, typically `**kwargs` in the function's
  // declaration.
  PARAM_ROLE_KWARGS = 5;
}

// Representation of a Starlark function parameter definition.
message FunctionParamInfo {
  // The name of the parameter. This does *not* include the `*` or `**` prefix
  // for varargs or residual keyword argument parameters.
  string name = 1;

  // The documented description of the parameter (if specified in the function's
  // docstring).
  string doc_string = 2;

  // If not an empty string, the default value of the parameter displayed
  // as a string.
  string default_value = 3;

  // If true, the default value is unset and a value is needed for this
  // parameter. This might be false even if defaultValue is empty in the case of
  // special parameter such as *args and **kwargs"
  bool mandatory = 4;

  // The parameter's syntactic role.
  FunctionParamRole role = 5;
}

message FunctionReturnInfo {
  // The documented return value of the function (if specified in the function's
  // docstring).
  string doc_string = 1;
}

message FunctionDeprecationInfo {
  // The documented deprecation of the function (if specified in the function's
  // docstring).
  string doc_string = 1;
}

// Representation of a Starlark provider field definition, comprised of
// the field name and provider description.
message ProviderFieldInfo {
  // The name of the field.
  string name = 1;

  // The description of the provider.
  string doc_string = 2;
}

// Representation of a Starlark provider definition.
message ProviderInfo {
  // The name under which the provider is made accessible to a user of this
  // module, including any structs it is nested in, for example "foo.FooInfo".
  string provider_name = 1;

  // The description of the provider.
  string doc_string = 2;

  // The fields of the provider.
  repeated ProviderFieldInfo field_info = 3;

  // Note: legacy Stardoc (0.5.x and earlier) does not set any fields below.

  // The module where and the name under which the provider was originally
  // declared.
  OriginKey origin_key = 4;

  // The provider's init callback.
  StarlarkFunctionInfo init = 5;
}

// Representation of a Starlark aspect definition.
message AspectInfo {
  // The name under which the aspect is made accessible to a user of this
  // module, including any structs it is nested in, for example
  // "foo.foo_aspect".
  string aspect_name = 1;

  // The documentation string of the aspect.
  string doc_string = 2;

  // The rule attributes along which the aspect propagates.
  repeated string aspect_attribute = 3;

  // The attributes of the aspect.
  repeated AttributeInfo attribute = 4;

  // The module where and the name under which the aspect was originally
  // declared.
  //
  // Note: legacy Stardoc (0.5.x and earlier) does not set this field.
  OriginKey origin_key = 5;
}

// Representation of a Bazel module extension, i.e. the object returned by
// calling `module_extension(...)`.
//
// Note: legacy Stardoc (0.5.x and earlier) does not emit this message.
message ModuleExtensionInfo {
  // The name under which the extension is made accessible to a user of this
  // Starlark module.
  string extension_name = 1;

  // The documentation string of the extension.
  string doc_string = 2;

  // The tag classes of the extension.
  repeated ModuleExtensionTagClassInfo tag_class = 3;

  // The Starlark module where the Bazel module extension was originally
  // declared; origin_key.name is currently never set.
  // TODO(arostovtsev): attempt to retrieve the name under which the module
  // extension was originally declared if it was declared as a global.
  OriginKey origin_key = 4;
}

// Representation of a Bazel module extension tag class.
message ModuleExtensionTagClassInfo {
  // The name of the tag for this tag class.
  string tag_name = 1;

  // The documentation string of the tag class.
  string doc_string = 2;

  // The tag class's attributes.
  repeated AttributeInfo attribute = 3;
}

// Representation of a Bazel repository rule, i.e. the object returned by
// calling `repository_rule(...)`.
//
// Note: legacy Stardoc (0.5.x and earlier) does not emit this message, instead
// using RuleInfo.
message RepositoryRuleInfo {
  // The name under which the repository rule is made accessible to a user of
  // this Starlark module.
  string rule_name = 1;

  // The documentation string of the repository rule.
  string doc_string = 2;

  // The attributes of the repository rule.
  repeated AttributeInfo attribute = 3;

  // Environment variables that this repository rule depends on.
  repeated string environ = 4;

  // The Starlark module where and the name under which the repository rule was
  // originally declared.
  OriginKey origin_key = 5;
}

// Representation of the origin of a rule, provider, aspect, or function.
// Intended to be used for building unambiguous cross-references: for example,
// between an element of a ProviderNameGroup required by a rule attribute and
// its corresponding ProviderInfo.
message OriginKey {
  // The name under which the entity was originally exported. Unset when the
  // entity was not exported in its module.
  string name = 1;

  // The display form of the label of the module file in which the entity was
  // originally declared (as seen from the starlark_doc_extract or Stardoc
  // target's repo), or "<native>" for Bazel's built-in entities implemented in
  // Java. Unset when there is no module file (such as for legacy struct
  // providers, when the module is a REPL, or in Bazel's internal tests).
  string file = 2;
}
