## What’s this?

A tool to validate the documentation comments for the `dart:` libraries.

## Running the tool

To validate all the `dart:` libraries, run:

```
dart tools/verify_docs/bin/verify_docs.dart
```

Or to validate an individual library (async, collection, js_util, ...), run either of:

```
dart tools/verify_docs/bin/verify_docs.dart sdk/lib/<lib-name>
dart tools/verify_docs/bin/verify_docs.dart dart:<lib-name>
```

The tool should be run from the root of the sdk repository.

## Authoring code samples

### What gets analyzed

This tool will walk all DartDoc API docs looking for code samples in doc comments.
It will analyze any code sample in a `dart` code fence. For example:

> ````dart
> /// ```dart
> /// print('hello world!');
> /// ```
> ````

By default, an import for that library is added to the sample being analyzed, e.g., `import 'dart:async";`.

### Excluding code samples from analysis

In order to exclude a code sample from analysis, change it to a plain code fence style:

> ````dart
> /// ```
> /// print("I'm not analyzed :(");
> /// ```
> ````

### Specifying templates

The analysis tool can inject the code sample into a template before analyzing the
sample. This allows the author to focus on the important parts of the API being
documented with less boilerplate in the generated docs.

The template includes an automatic import of the library containing the example, so an example in, say, the documentation of `StreamController.add` would have `dart:async` imported automatically.

The tool will try and automatically detect the right template to use based on
code patterns within the sample itself. In order to explicitly indicate which template
to use, you can specify it as part of the code fence line. For example:

> ```dart
> /// ```dart template:main
> /// print('hello world ${Timer()}');
> /// ```
> ```

The current templates are:

- `none`: Do not wrap the code sample in any template, including no imports.
- `top`: The code sample is top level code, preceded only by imports.
- `main`: The code sample is one or more statements in a simple asynchronous  `main()` function.
- `expression`: The code sample is an expression within a simple asynchronous `main()` method.

For most code samples, the auto-detection code will select `template:main` or
`template:expression`.

If the example contains any `library` declarations, the template becomes `none`.

### Specifying additional imports

If your example contains any `library`, the default import of the current library is omitted. To avoid that, you can declare extra automatic imports in the code fence like:

> ````dart
> /// ```dart import:async
> /// print('hello world ${Timer()}');
> /// ```
> ````

Multiple imports can be specified like this if desired, e.g., "```` ```dart import:async import:convert````".

Does not work if combined with `template:none`, whether the `none` template is specified explicitly or auto-detected.

### Splitting examples

Some examples may be split into separate code blocks, but should be seen
as continuing the same running example.

If the following code blocks are marked as `continued` as shown below, they
are included into the previous code block instead of being treated as a new
example.

> ````dart
> /// ```dart
> /// var list = [1, 2, 3];
> /// ```
> /// And then you can also do the following:
> /// ```dart continued
> /// list.forEach(print);
> /// ```
> ````

A `continued` code block cannot have any other flags in the fence.

### Including additional code for analysis

You can declare code that should be included in the analysis but not shown in
the API docs by adding a comment "// Examples can assume:" to the file (usually
at the top of the file, after the imports), following by one or more
commented-out lines of code. That code is included verbatim in the analysis, at top-level after the automatic imports. Does not work with `template:none`.

For example:

```dart
// Examples can assume:
// final BuildContext context;
// final String userAvatarUrl;
```
