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

docgen: Replace doctrine with comment-parser #28615

Merged
merged 10 commits into from
Feb 15, 2021

Conversation

sarayourfriend
Copy link
Contributor

@sarayourfriend sarayourfriend commented Jan 30, 2021

Description

Replaces the usage of doctrine with comment-parser.

Notable differences:

  1. Tuples are no longer surrounded by parens, they switch from (string|Object) to string|Object.
  2. Arrays switch from Array<Object> to Object[].
  3. No types are normalized, they're left the way they are in the declaration rather than being parsed and then normalized. Examples of some changes related to this: nullable types can be either ?type to type? and that optional types can be either [type] or type=, depending on how the author declared them in the JSDoc source comment.

Notable issues with comment-parser.

  1. The library parses the following:
/**
 * @return {string} The description for a return.
 */

as

{
        "tag": "return",
        "name": "The",
        "type": "string",
        "optional": false,
        "description": "description for a return.",
}

Note that the description of the return is split into two... this appears to be a difference in convention, some folks name their return values. We tend not to do so. Regardless, the library does this for all tags so you'll see something resembling `${tag.name} ${tag.description}` places where previously we could just use the description. I don't personally see this as an issue, it's just a quirk of the library, but I could see this getting in the way of adopting this approach if folks think it's too fragile or something like that.

Notable is that I don't think this is a bug in the library, I think it's just the way it parses based on some conventions. It's a little silly for tags like @see but I think it's livable.

How has this been tested?

Tests pass and documentation generation still works as expected (with some minor changes given the new parser)

Types of changes

Non-breaking changes

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

Fixes #26971
Fixes #18045

@github-actions
Copy link

github-actions bot commented Jan 30, 2021

Size Change: 0 B

Total Size: 1.38 MB

ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.78 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/index.js 9.1 kB 0 B
build/block-directory/style-rtl.css 1.01 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-editor/index.js 124 kB 0 B
build/block-editor/style-rtl.css 12.1 kB 0 B
build/block-editor/style.css 12.1 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 103 B 0 B
build/block-library/blocks/audio/style.css 103 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 465 B 0 B
build/block-library/blocks/button/style.css 464 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 233 B 0 B
build/block-library/blocks/buttons/editor.css 233 B 0 B
build/block-library/blocks/buttons/style-rtl.css 303 B 0 B
build/block-library/blocks/buttons/style.css 303 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 421 B 0 B
build/block-library/blocks/columns/style.css 421 B 0 B
build/block-library/blocks/cover/editor-rtl.css 390 B 0 B
build/block-library/blocks/cover/editor.css 389 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.25 kB 0 B
build/block-library/blocks/cover/style.css 1.25 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 396 B 0 B
build/block-library/blocks/embed/style.css 395 B 0 B
build/block-library/blocks/file/editor-rtl.css 199 B 0 B
build/block-library/blocks/file/editor.css 198 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 689 B 0 B
build/block-library/blocks/gallery/editor.css 690 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.07 kB 0 B
build/block-library/blocks/gallery/style.css 1.06 kB 0 B
build/block-library/blocks/group/editor-rtl.css 318 B 0 B
build/block-library/blocks/group/editor.css 317 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 477 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/editor-rtl.css 159 B 0 B
build/block-library/blocks/latest-comments/editor.css 158 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/list/editor-rtl.css 65 B 0 B
build/block-library/blocks/list/editor.css 65 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 395 B 0 B
build/block-library/blocks/navigation-link/editor.css 397 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 704 B 0 B
build/block-library/blocks/navigation-link/style.css 702 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.34 kB 0 B
build/block-library/blocks/navigation/editor.css 1.34 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 195 B 0 B
build/block-library/blocks/navigation/style.css 195 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 214 B 0 B
build/block-library/blocks/page-list/editor.css 214 B 0 B
build/block-library/blocks/page-list/style-rtl.css 527 B 0 B
build/block-library/blocks/page-list/style.css 526 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 109 B 0 B
build/block-library/blocks/paragraph/editor.css 109 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 273 B 0 B
build/block-library/blocks/paragraph/style.css 273 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 316 B 0 B
build/block-library/blocks/pullquote/style.css 316 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 90 B 0 B
build/block-library/blocks/query-loop/editor.css 89 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query/editor-rtl.css 159 B 0 B
build/block-library/blocks/query/editor.css 160 B 0 B
build/block-library/blocks/quote/editor-rtl.css 61 B 0 B
build/block-library/blocks/quote/editor.css 61 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 504 B 0 B
build/block-library/blocks/shortcode/editor.css 504 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 117 B 0 B
build/block-library/blocks/site-logo/style.css 117 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 696 B 0 B
build/block-library/blocks/social-links/editor.css 696 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB 0 B
build/block-library/blocks/social-links/style.css 1.37 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 302 B 0 B
build/block-library/blocks/spacer/editor.css 302 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/subhead/editor-rtl.css 99 B 0 B
build/block-library/blocks/subhead/editor.css 99 B 0 B
build/block-library/blocks/subhead/style-rtl.css 80 B 0 B
build/block-library/blocks/subhead/style.css 80 B 0 B
build/block-library/blocks/table/editor-rtl.css 489 B 0 B
build/block-library/blocks/table/editor.css 489 B 0 B
build/block-library/blocks/table/style-rtl.css 386 B 0 B
build/block-library/blocks/table/style.css 386 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 557 B 0 B
build/block-library/blocks/template-part/editor.css 556 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 62 B 0 B
build/block-library/blocks/verse/editor.css 62 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 193 B 0 B
build/block-library/blocks/video/style.css 193 B 0 B
build/block-library/common-rtl.css 1.01 kB 0 B
build/block-library/common.css 1.01 kB 0 B
build/block-library/editor-rtl.css 9.05 kB 0 B
build/block-library/editor.css 9.04 kB 0 B
build/block-library/index.js 144 kB 0 B
build/block-library/style-rtl.css 8.8 kB 0 B
build/block-library/style.css 8.8 kB 0 B
build/block-library/theme-rtl.css 748 B 0 B
build/block-library/theme.css 748 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 48.3 kB 0 B
build/components/index.js 272 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/compose/index.js 11 kB 0 B
build/core-data/index.js 16.8 kB 0 B
build/customize-widgets/index.js 4.08 kB 0 B
build/customize-widgets/style-rtl.css 168 B 0 B
build/customize-widgets/style.css 168 B 0 B
build/data-controls/index.js 830 B 0 B
build/data/index.js 8.86 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 768 B 0 B
build/dom-ready/index.js 571 B 0 B
build/dom/index.js 4.94 kB 0 B
build/edit-navigation/index.js 11 kB 0 B
build/edit-navigation/style-rtl.css 1.26 kB 0 B
build/edit-navigation/style.css 1.25 kB 0 B
build/edit-post/index.js 307 kB 0 B
build/edit-post/style-rtl.css 6.81 kB 0 B
build/edit-post/style.css 6.8 kB 0 B
build/edit-site/index.js 25.4 kB 0 B
build/edit-site/style-rtl.css 4.37 kB 0 B
build/edit-site/style.css 4.37 kB 0 B
build/edit-widgets/index.js 20 kB 0 B
build/edit-widgets/style-rtl.css 3.2 kB 0 B
build/edit-widgets/style.css 3.2 kB 0 B
build/editor/editor-styles-rtl.css 543 B 0 B
build/editor/editor-styles.css 545 B 0 B
build/editor/index.js 41.9 kB 0 B
build/editor/style-rtl.css 3.89 kB 0 B
build/editor/style.css 3.89 kB 0 B
build/element/index.js 4.61 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/index.js 6.77 kB 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 2.28 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 4.01 kB 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keyboard-shortcuts/index.js 2.54 kB 0 B
build/keycodes/index.js 1.93 kB 0 B
build/list-reusable-blocks/index.js 3.15 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 5.35 kB 0 B
build/notices/index.js 1.85 kB 0 B
build/nux/index.js 3.41 kB 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/plugins/index.js 2.55 kB 0 B
build/primitives/index.js 1.42 kB 0 B
build/priority-queue/index.js 790 B 0 B
build/react-i18n/index.js 1.45 kB 0 B
build/redux-routine/index.js 2.83 kB 0 B
build/reusable-blocks/index.js 2.92 kB 0 B
build/rich-text/index.js 13.4 kB 0 B
build/server-side-render/index.js 2.76 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 3.02 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

Awesome work. It looks very promising. There are still some issues to resolve but overall it'd be a great improvement as we start using more TypeScript syntax for types.

I left some comments where I could spot something that concerns me and places where you can see TS types properly included.

I would love to hear also from @nosolosw how does he feel about the changes proposed since he authored @wordpress/docgen and he has the most experience here.

@@ -74,7 +74,7 @@ resolvers,

_Parameters_

- _paths_ (unknown type):
- _paths_ ``:
Copy link
Member

@gziolo gziolo Feb 1, 2021

Choose a reason for hiding this comment

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

It still isn't working or it's missing a type or it has wrong type.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It is missing the type:

Copy link
Member

Choose a reason for hiding this comment

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

Can we remove the @param paths from here? I'm not familiar with this part of the code but the param doesn't make sense as it is.

packages/date/README.md Outdated Show resolved Hide resolved
packages/deprecated/README.md Show resolved Hide resolved
packages/edit-post/README.md Outdated Show resolved Hide resolved
packages/edit-post/README.md Outdated Show resolved Hide resolved
packages/edit-post/README.md Outdated Show resolved Hide resolved
packages/element/README.md Show resolved Hide resolved
- <https://facebook.github.io/react-native/docs/platform-specific-code#platform-module>

Here is an example of how to use the select method:
- <https://facebook.github.io/react-native/docs/platform-specific-code#platform-module> Here is an example of how to use the select method:
Copy link
Member

Choose a reason for hiding this comment

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

Line breaks get removed.

Copy link
Member

Choose a reason for hiding this comment

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

The example intro is bundled as part of the @see tag description while is a separate thing. I presume comment-parser assigns all the text within tags to the previous tag, hence the error.

One thing we can do to fix this is moving the intro text Here is an example of how to use the select method: below the @example tag. That way it works fine.

packages/keycodes/README.md Show resolved Hide resolved
@sirreal
Copy link
Member

sirreal commented Feb 1, 2021

I've only scanned this but it looks really promising. I wanted to share TSDoc which is worth testing and exploring. It may either be usable directly or a good source of inspiration. I think this line is important and represents some common frustrations with JSDoc:

Why can’t JSDoc be the standard? The JSDoc grammar is not rigorously specified, but rather inferred from the behavior of a particular implementation. The majority of the standard JSDoc tags are preoccupied with providing type annotations for plain JavaScript, which is not a primary concern for a strongly-typed language such as TypeScript.

@sarayourfriend
Copy link
Contributor Author

sarayourfriend commented Feb 1, 2021

I wanted to share TSDoc which is worth testing and exploring.

Ooooo, I originally started to re-write docgen using typescript as the parser instead of babel because I didn't realize there was a way to just parse the doc comments with the TS parser, but the TSDocParser class looks perfect for that. I'll do some tests and see if I can make it work. It may help resolve some of the strange issues that comment-parser has too.

Update: @sirreal Unfortunately TSDoc is a standard only usable in TypeScript itself as it completely bans and ignores type definitions in the documentation comment itself. When parsing one of our test examples, it emits the following debugger warning:

"The @param block should not include a JSDoc-style '{type}'"

Inspecting the result of parsing the comment also reveals that while the parameter is there by name, its type is completely ignored and thrown out.

Therefore, it is not possible to use TSDoc, even with significant refactor, for our purposes here.

I think the actually very powerful alternative approach for docgen to consider is using typescript as the full parser. That would remove babel and and the independent documentation parser as the typescript parser already parses JSDoc comments cleverly: https://astexplorer.net/#/gist/5931456cb14f4dfbeef6a824c04cacce/2ae696cccaedc016a032ff636f4b2aaf977f2514

I began exploring this avenue but it would require a significant refactor re-write of most of docgen to work. It didn't seem worth it when there was a much simpler interim solution (though I would love to dive into the work of re-writing docgen with TypeScript, I unfortunately do not have that kind of time on my hands at the moment).

@gziolo gziolo added the [Status] In Progress Tracking issues with work in progress label Feb 2, 2021
@oandregal
Copy link
Member

oandregal commented Feb 3, 2021

I've updated the issue description with other cases in which the docs changed (nullable and optional types, arrays). I wonder if these changes should make it to https://developer.wordpress.org/block-editor/contributors/develop/coding-guidelines/#javascript-documentation-using-jsdoc

@oandregal
Copy link
Member

oandregal commented Feb 3, 2021

This is promising! Thanks for taking up on replacing doctrine. I've done a first pass at this and left some comments in addition to what Greg already mentioned. Can do a second pass when you're ready.


I began exploring this avenue but it would require a significant refactor re-write of most of docgen to work. It didn't seem worth it when there was a much simpler interim solution (though I would love to dive into the work of re-writing docgen with TypeScript, I unfortunately do not have that kind of time on my hands at the moment).

Not for this PR, but I have some thoughts on the topic of upgrading / creating a replacement for docgen that is based on TSDoc instead of JSDoc. I thought it'd be useful to share, in case you have time to work on this in the future:

  • We've experienced problems in the past when using different parsers for documentation (espree) and code (babel), hence why we switched to use the same everywhere. It was almost a one-liner change. If we were to split paths again, we should be aware of potential issues (one parser introduces support for some things unsupported by the other) and making sure the code is organized in a way that merging paths is easy, should we need it.

  • The current approach is based on parsing individual files. Other approaches, like the jsdoc tool, parse the whole codebase instead. I believe the typescript parser does the same? Parsing individual files fails to integrate types that are defined in a different file, see docgen: pull type definitions from @typedef #15186 I think solving this long-standing issue could be one of the best use cases to address if we're thinking about major changes to this package.

@sarayourfriend
Copy link
Contributor Author

I've updated the issue description with other cases in which the docs changed (nullable and optional types, arrays).

FWIW, these changes are due to differences in how the types are documented, all the library does is copy the type out of the curly braces (unlike the previous library which attempted to normalize them).

If we want to normalize these types, we could add that too but it would take significant work. There's an issue (#22062) to make these decisions that has almost no activity.

Personally I think it's a lost cause to try to normalize them during parse time, we might be better off spending that time normalizing the way they're actually recorded in the annotations themselves.

@sarayourfriend
Copy link
Contributor Author

@nosolosw and @gziolo, do y'all have time to give this another peek sometime soon? I think it's ready for another review (all the feedback has been addressed).

Copy link
Member

@oandregal oandregal left a comment

Choose a reason for hiding this comment

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

Thanks for working on this @saramarcondes! This is ready in my view.

There are a few weird cases in which the spacing is removed or the text added to the previous tag. Added some suggestions to fix this, it can be done here or in follow-ups.

We also need to update the changelog for the package release. Sharing my thoughts on this:

This PR replaces doctrine, a deprecated library, with comment-parser. The major change to our public API is that docgen no longer parses and structures the types (because comment-parser doesn't do it), it passes through whatever the author has written:

  • This flexibility works great for types that aren't part of the JSDoc spec. For example, adding some typescript import syntax.

  • It has the drawback of inconsistency: we are already seeing the effects of this with nullable or optional types, that different people write differently. Those differences are going to increase over time: I wonder if we can do anything to converge syntaxes (lint rule, etc?).

Given this context, it seems to me we should do a major release for docgen. @gziolo @saramarcondes thoughts?

@gziolo
Copy link
Member

gziolo commented Feb 9, 2021

We also need to update the changelog for the package release.

It definitely should be a major version bump. It's a different parser now and it will produce different output in most of the cases 👍🏻

There is one failing unit test that needs to be fixed to unblock merging:

Summary of all failing tests
FAIL packages/docgen/src/test/get-jsdoc-from-token.js
  ● JSDoc › extracts description and tags

    expect(received).toMatchObject(expected)

    - Expected  - 3
    + Received  + 7

    @@ -25,20 +25,24 @@
            "optional": false,
            "tag": "param",
            "type": "number",
          },
          Object {
    -       "description": "The second param to add.",
    +       "description": "The second param to add.
    + ",
            "name": "secondParam",
            "tag": "param",
            "type": "number",
          },
          Object {
    -       "description": "```js
    +       "description": " 
    +
    + ```js
      const addResult = sum( 1, 3 );
      console.log( addResult ); // will yield 4
    - ```",
    + ```
    + ",
            "tag": "example",
          },
          Object {
            "description": "result of adding the two params.",
            "name": "The",

      15 | 				],
      16 | 			} )
    > 17 | 		).toMatchObject( {
         | 		  ^
      18 | 			description: 'A function that adds two parameters.\n',
      19 | 			tags: [
      20 | 				{

      at Object.<anonymous> (packages/docgen/src/test/get-jsdoc-from-token.js:17:5)

@@ -40,7 +40,6 @@ const shouldRenderItem = ( selectedBlocks, allowedBlocks ) =>
* @param {string} [props.role] The ARIA role for the menu item.
*
* @example
* <caption>ES5</caption>
Copy link
Member

Choose a reason for hiding this comment

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

@nosolosw, wasn't it necessary for the Block Editor Handbook to add tabs to switch between two versions of the example?

Copy link
Member

Choose a reason for hiding this comment

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

Hmm, I don't see it having any impact on the generated output. So it looks like it was obsolete 😄

Copy link
Member

Choose a reason for hiding this comment

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

I commented in another thread above I can't find now 😅 That was the original goal but don't remember we ever implemented it.

@sarayourfriend sarayourfriend force-pushed the try/comment-parser-for-docgen branch 2 times, most recently from 5256c2d to 1bda459 Compare February 9, 2021 14:19
@sarayourfriend
Copy link
Contributor Author

@gziolo @nosolosw Is this PR ready to merge for y'all? I'd like to avoid any more merge conflicts if possible 😁

@gziolo
Copy link
Member

gziolo commented Feb 15, 2021

I like all the fixes, I'm happy to approve 😃

@nosolosw, any blockers?

@oandregal
Copy link
Member

Please, do merge! I had already approved a week ago :D

@oandregal oandregal merged commit 9eef39b into master Feb 15, 2021
@oandregal oandregal deleted the try/comment-parser-for-docgen branch February 15, 2021 15:51
@github-actions github-actions bot added this to the Gutenberg 10.1 milestone Feb 15, 2021
@mkaz mkaz added the [Type] Developer Documentation Documentation for developers label Nov 24, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Status] In Progress Tracking issues with work in progress [Tool] Docgen /packages/docgen [Type] Developer Documentation Documentation for developers
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Docgen: Some types omitted docgen: remove doctrine
6 participants