Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial documentation for doc comment references #6080

Merged
merged 18 commits into from
Oct 10, 2024
Merged
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions src/content/tools/doc-comment-references.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
---
title: Documentation comment references
short-title: Comment references
description: Learn about doc comment references and their syntax.
---

Doc comments can contain references to various identifiers. Elements, such as
functions and classes, can be referenced by wrapping their name in square
brackets (`[...]`) in a doc comment (a comment starting with `///`). Examples:

```dart
/// Returns a [String].
String f() => 'Hello';

/// Wraps [object] with [Future.value].
Future<T> g<T>(T object) => Future.value(object);
```

These doc comments contain references to the `String` class, the `object`
parameter, and the `Future.value` constructor.

## Features of references

There are several benefits to referring to code elements with doc comment
references:

### Editor features
srawlins marked this conversation as resolved.
Show resolved Hide resolved
parlough marked this conversation as resolved.
Show resolved Hide resolved

Doc comment references enable several IDE features:

- **Code completion**
An element's name can be code-completed within square brackets.
- **Rename refactoring**
When an element is renamed via an IDE command, it can rewrite uses of that
element, including references in doc comments.
parlough marked this conversation as resolved.
Show resolved Hide resolved
- **Find references**
When an IDE lists all "references" to an element, it can include references in
doc comments.
- **Go to definition**
An IDE can also provide Go-to-definition support at the location of a doc
comment reference.

:::tip
The [comment_references](https://dart.dev/lints/comment_references) lint rule
parlough marked this conversation as resolved.
Show resolved Hide resolved
can help to ensure that doc comment references are valid, avoiding typos and
mis-uses. Keeping doc comment references valid ensures that these IDE features
are enabled for each reference.
:::

### API documentation

In API documentation generated by [`dart doc`](/tools/dart-doc), a doc comment reference is
linked, if possible, to the documentation page of the element being referenced.
If the element does not have a documentation page (for example, a function
parameter, a type variable, or a private class), then no link is created.
parlough marked this conversation as resolved.
Show resolved Hide resolved

## What can be referenced
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this section is useful but it's a bit long and will potentially be skipped over.

Could we perhaps add another (complementary) section with a quick-reference table or list? I'm happy to help experiment with some options for doing so if you think it'd be helpful. I imagine it related each type of member with an example of its doc comment reference syntax. Many can likely be grouped together as well.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great idea, I've started an attempt at this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for exploring this! It seems a bit cramped with the table formatting, so maybe let's drop the table for now. I can revisit this with some different formats or custom styles as follow up.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SG. I'm sure there's a good solution in here. Maybe just experiment with different table layouts.


Here is a quick reference of what can be referenced, and how:

<table>
<tr><th>Member</th><th>How to reference</th></tr>
<tr>
<td>
Library members (classes, constants, enums, named extensions, extension types, functions, mixins, type aliases)
</td>
<td>
Reference with their name, if they are in-scope, prefixed with an import prefix if appropriate.

```dart
/// [List] is in scope.
/// So is [math.max].
```
</td>
</tr>
</table>

Most library members can be referenced in a doc comment, including classes,
constants, enums, named extensions, extension types, functions, mixins, and
type aliases. This includes all in-scope library members, either declared
locally, or imported. Library members that are imported with an import prefix
can be referenced with the prefix. For example:

```dart
import 'dart:math' as math;

/// [List] is in scope.
/// So is [math.max].
int x = 7;
```

Most members of a class, an enum, an extension, an extension type, and a mixin
can also be referenced. A reference to a member that is not in scope must be
qualified (prefixed) with its container's name. For example the `wait` static
method on the `Future` class can be referenced in a doc comment with
`[Future.wait]`. This is true for instance members as well; the `add` method
and the `length` property on the `List` class can be referenced with
`[List.add]` and `[List.length]`. In-scope members like these can even be
referenced without the qualifying container name:
parlough marked this conversation as resolved.
Show resolved Hide resolved

```dart
abstract class MyList<E> implements List<E> {
/// Refer to [add] and [contains], which is declared on [Iterable].
void myMethod() {}
}
```

Unnamed constructors can be referenced by using the `new` name, similar to the
tear-off of an unnamed constructor. For example, `[DateTime.new]` is a
reference to the unnamed `DateTime` constructor.

Parameters of a function and parameters of a function type can be referenced in
a doc comment only when they are in scope. They can therefore only be
referenced within a doc comment on such a parameter's function or on a type
alias for such a parameter's enclosing function type.

Type parameters can be referenced in a doc comment only when they are in scope.
Therefore a type parameter of a method, top-level function, or type alias can
only be referenced within a doc comment on that element, and a type parameter
of a class, enum, extension, extension type, and mixin can only be referenced
within a doc comment on that element or on one of its members.

The doc comment for a type alias that aliases a class, enum, extension type,
or mixin can't reference any of the aliased type's members, if it has any, as
if they were in scope.
parlough marked this conversation as resolved.
Show resolved Hide resolved