| ## 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; |
| ``` |