blob: 601edf14531cd9a59a161a7033b895861d873d8c [file] [view] [edit]
{% set rfcid = "RFC-0055" %}
{% include "docs/contribute/governance/rfcs/_common/_rfc_header.md" %}
# {{ rfc.name }}: {{ rfc.title }}
<!-- SET the `rfcid` VAR ABOVE. DO NOT EDIT ANYTHING ELSE ABOVE THIS LINE. -->
Note: Formerly known as [FTP](../deprecated-ftp-process.md)-009.
## Summary
Documenting FIDL.
### Relation to other RFCs
This RFC was amended by:
* [RFC-0043: Documentation comment format](0043_documentation_comment_format.md)
## Motivation
Not only is good documentation an important part of scaling a team, documenting
our APIs is an important part of defining a stable API. The Fuchsia API is
primarily implemented in FIDL and a large amount of documentation is being left
in comments that is hard to surface. Even worse, it is not uncommon for people
to look at generated bindings to figure out how to use an interface. This
proposal is the first step of a comprehensive documentation strategy for the
FIDL language and it's interfaces.
## Design
There are two proposed FIDL source language changes. A standard `Doc` attribute
and syntactic sugar to improve the ergonomics of writing documentation.
### Doc Attribute
Arbitrary attributes are an already supported component of the FIDL language.
Standardizing on the `Doc` attribute is for the tooling that generates the
formated documentation. Using an attribute as the basis of the documentation
tooling also allows for additional options to be added to the formatted output
without breaking changes.
```FIDL
[Discoverable, Doc = "Primary Bluetooth control service to access bluetooth"]
interface Control {
 ...
 [Doc = "Sets the public Bluetooth |name| for this device"]
 10: SetName(string? name) -> (fuchsia.bluetooth.Status status);
}
```
Currently, there can be only one `Doc` attribute per language element. This
makes it so all text must be put into the Attribute braces, which could lead to
excessively long lines.
### Syntactic Sugar
To address the poor ergonomics of using attributes, a layer of syntactic sugar
is proposed.
This involves a small change to the FIDL language specification. Comments are
currently ignored during the lexing of FIDL. This FTP does not address adding
general comments to the AST, only documentation comments.
Attributes are the primary way that the FIDL language expresses the idea of
metadata attached to structures. Having documentation comments as just a special
case of this simplifies the consumption of the metadata in the IR.
The suggested modification of the grammar is in the appendix of the FTP, but
mostly involves adding an additional rule and minor rule re-ordering.
``` documentation-comment = "///", STRING-LITERAL, "\n" ```
```
interface Control {
 /// Sent when an adapter with the given |identifier| has been
 /// removed from the system.
 10102: -> OnAdapterRemoved(string identifier);
}
```
This would de-sugar to:
```
[Doc="Sent when an adapter with the given |identifier| has been\n removed from the system\n"]
```
### Documentation comment contents
Doc comments are primarily freeform text. Any specific style of formatting is up
to the author, team, or future style guides. The only primitive added is an
identifier marker, currently proposed as pipes (|) encasing the local
identifier. Unqualified identifiers are scoped to the members beneath the object
that the attribute is attached too. A fully qualified identifier can be used
(Ex: |fuchsia.bluetooth.ErrorCode|) to refer to objects outside of the current
scope.
Eventually, fidldoc documentation generation should fail if any of the
identifiers are missing, but the attribute will still be included and passed
into language bindings. This will prevent documentation rot. Adding the
identifiers to the IR or as part of the parsing step is intentionally avoided
due to complicating these steps. Extracting the identifiers belongs in the
documentation tooling (fidldoc). Documentation generation should be added as a
mandatory part of a standard debug build and the overall build should fail if
the documentation is not successfully generated.
### Additional tooling
A standard tool, called fidldoc, should be added to the tools directory. Fidldoc
will generate markdown after consuming the FIDL JSON IR. Markdown is the current
format that we are using with the other first-class language's documentation
tooling.
### Other
The Wire format is unaffected by these changes. How language bindings chose to
surface docstrings, or if they surface them, is left as an implementation detail
for their respective communities or potentially as additional FTPs.
The style guide should be amended to prefer `///` over the doc attribute, but
otherwise is left alone.
## Documentation and examples
Triple comments are a relatively common way of denoting documentation comments
and should not be a large barrier to understanding the fidl language. Example
using triple comments should be added to the existing documentation as well as
an explanation of how to use the attribute annotations.
The primary way that people will consume this feature is in the generated
output.
Backwards Compatibility This feature is already backwards compatible with all
recent prior fidlc compilers. While the new functionality will not exist for the
triple comment syntactic sugar, they do not break earlier compilers.
Document attribute comments will work without any language changes.
## Performance
No performance changes are expected except for a small increase in the JSON IR
size. We will also generate documentation at compile time, which will slow down
the build a small amount.
## Security
n/a
## Testing
n/a
## Drawbacks, alternatives, and unknowns
General agreement of the approach and the specific syntax used are required for
adoption. The syntax is easily modified (and bikeshedded) and does alter the
core ideas of the proposal.
Potential alternatives with regards to fidldoc is that the compiler generates
the documentation itself. It may also be worth using the existing backend
generator approach for this. Output format of the generated documentation may
also be up for discussion.
Another alternative is to represent the documentation comments as first-class
citizens in the AST. While there aren't any real drawbacks to this strategy, you
lose some of the extensibility benefits of modeling it as an attribute. Someday
we may want to add additional information for our documentation tooling and the
attribute style makes this possible without breaking changes. For example, we
may want to allow specifying the markdown language of the comment. This would
then keep all of the information for generating the documentation within the
same output (the attributes). It also enforces a nice regularity where the doc
comments and attributes, which have similar placement constraints, are parsed in
the same way.
## Prior art and references
Most languages have documentation tooling. This draws from prior art of dartdoc,
rustdoc, and javadoc (mostly in what not to do)