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/stop crashing on missing return types #37929

Merged
merged 10 commits into from Jan 24, 2022

Conversation

dmsnell
Copy link
Contributor

@dmsnell dmsnell commented Jan 12, 2022

Resolves #37766

Description

The docgen process currently fails in a number of circumstances where it's trying to find type information, specifically return-type information, and can't find it. As highlighted in PRs converting modules to TypeScript, this introduces a mismatch in how some idiomatic code will be written and in the case where we can't find type information we should quietly accept that and remove the type information from the generated docs.

Eventually it would be nice to get better inference from TypeScript on the types it knows, but some issues around type usefulness remain. For now, this patch makes the process more lenient so that it doesn't hold up other changes and so
that we avoid pushing developers from writing value-lacking types such as {Object} or {Function} for the sake of getting past the linter.

For example, by removing the JSDoc type annotations in #37239 we find the corresponding changes to the data package's README. The JSDoc description still provides the helpful part of documenting the types and has a lower risk chance of getting out of sync with the code than it would be to annotate Function or <InnerProps extends HOCProps>(Inner: ComponentType<InnerProps>) => {} extends HOCProps ? ComponentType<...> : ComponentType<...>

Δ packages/data/README.md
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

──────────────────────────────────────────────────────┐
• 761: const ParentProvidingRegistry = ( props ) => { │
──────────────────────────────────────────────────────┘
761 ⋮761 │
762 ⋮762 │_Returns_
763 ⋮763 │
764 ⋮    │-   `Function`: A custom react hook exposing the registry context value.
    ⋮764 │-   A custom react hook exposing the registry context value.
765 ⋮765 │
766 ⋮766 │### useSelect
767 ⋮767 │

Δ packages/data/src/components/registry-provider/use-registry.js
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

───────────────────────────────────────────┐
• 45: import { Context } from './context'; │
───────────────────────────────────────────┘
 45 ⋮ 45 │ * };
 46 ⋮ 46 │ * ```
 47 ⋮ 47 │ *
 48 ⋮    │ * @return {Function}  A custom react hook exposing the registry context value.
    ⋮ 48 │ * @return A custom react hook exposing the registry context value.
 49 ⋮ 49 │ */
 50 ⋮ 50 │export default function useRegistry() {
 51 ⋮ 51 │    return useContext( Context );

How has this been tested?

After re-building the package the reference docs were re-generated and no differences in output were found against trunk (given that we don't introduce any of the cases that would have broken the docgen in this PR we expect no changes).

Types of changes

This changes the build pipeline, namely it relaxes the requirement that a JSDoc entry for a value that has a description also has an explicit type listed.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • 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 (please manually search all *.native.js files for terms that need renaming or removal).
  • I've updated related schemas if appropriate.

@github-actions
Copy link

github-actions bot commented Jan 12, 2022

Size Change: 0 B

Total Size: 1.13 MB

ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 141 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.22 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.6 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 810 B
build/block-library/blocks/image/editor.css 809 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.99 kB
build/block-library/blocks/navigation/editor.css 2 kB
build/block-library/blocks/navigation/style-rtl.css 1.85 kB
build/block-library/blocks/navigation/style.css 1.84 kB
build/block-library/blocks/navigation/view.min.js 2.81 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 402 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 245 B
build/block-library/blocks/separator/style.css 245 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 214 B
build/block-library/blocks/tag-cloud/style.css 215 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 908 B
build/block-library/common.css 905 B
build/block-library/editor-rtl.css 10.1 kB
build/block-library/editor.css 10.1 kB
build/block-library/index.min.js 166 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.8 kB
build/block-library/style.css 10.8 kB
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 676 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.4 kB
build/components/index.min.js 214 kB
build/components/style-rtl.css 15.5 kB
build/components/style.css 15.5 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 13.3 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/data/index.min.js 7.49 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.6 kB
build/edit-post/style-rtl.css 7.15 kB
build/edit-post/style.css 7.14 kB
build/edit-site/index.min.js 37.7 kB
build/edit-site/style-rtl.css 6.85 kB
build/edit-site/style.css 6.84 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.17 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.58 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.75 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.72 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.58 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@dmsnell dmsnell marked this pull request as ready for review January 12, 2022 22:36
@gziolo gziolo added [Package] Docgen /packages/docgen [Type] Bug An existing feature does not function as intended labels Jan 14, 2022
@gziolo
Copy link
Member

gziolo commented Jan 14, 2022

One of the unit tests related to Docgen fails on CI:

https://github.com/WordPress/gutenberg/runs/4796282998?check_suite_focus=true

I’m personally fine with the changes proposed, but I don’t know the tool that wel.

@dmsnell dmsnell force-pushed the docgen/stop-crashing-on-missing-return-types branch from 400f5ed to b7228cd Compare January 19, 2022 15:01
@dmsnell
Copy link
Contributor Author

dmsnell commented Jan 19, 2022

Thanks @gziolo - one of the tests seemed to be a spurious issue with a mobile dependency; the other was a good catch. I've updated and hopefully everything will pass now.

Copy link
Contributor

@sarayourfriend sarayourfriend left a comment

Choose a reason for hiding this comment

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

Requesting that we add tests to cover the case where the code will throw. Otherwise this looks good to me. Thanks for digging into this and finding a solution.

@@ -397,7 +397,10 @@ function getFunctionToken( token ) {

function getFunctionNameForError( declarationToken ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

This particular function has been such a headache to maintain with its many edge cases. Thanks for taking the time to improve it!

`\n- ${ tag.name.trim() }${
tag.description ? ' ' : ''
}${ tag.description.trim() }`,
( tag ) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks for breaking out the conditional logic in the functions in this file. It improves the readability a lot.

Comment on lines 199 to 205
it( 'should return null if there is no return type', () => {
expect( getTypeAnnotation( returnTag, node, 0 ) ).toBeNull();
} );

it( 'should throw an error if there is no param type', () => {
expect( () => getTypeAnnotation( paramTag, node, 0 ) ).toThrow(
"Could not find type for parameter 'foo' in function 'fn'."
);
it( 'should return null if there is no param type', () => {
expect( getTypeAnnotation( paramTag, node, 0 ) ).toBeNull();
} );
Copy link
Contributor

Choose a reason for hiding this comment

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

Can we add some tests for the case where it will throw? That's still a branch in the code.

Copy link
Contributor Author

@dmsnell dmsnell Jan 19, 2022

Choose a reason for hiding this comment

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

it seems like it might be worth removing the try/catch entirely because it shouldn't crash after fixing the null-dereference bug. in fact I'm not sure how to trigger a crash because I'm having to dive deep into the other getType family functions to try and find an exploit in the code that I could trigger…

Copy link
Contributor

Choose a reason for hiding this comment

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

Okay, in that case let's just remove that try/catch altogether as you suggested. If the code fails there then we'll hopefully get a nice bug report with a more descriptive error than the one we're currently spitting out anyway 🙂

Copy link
Contributor Author

Choose a reason for hiding this comment

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

removed the try/catch and had to update other code. I did try a few types that I think should be totally invalid and they don't throw. I think the only thing that did throw was attempting to access the typeAnnotation assuming it was there, then trying to grab the name identifier on a function that doesn't exist for the sake of error reporting. without these I think we're safe apart from unlikely bugs that could always creep up

@sarayourfriend
Copy link
Contributor

Looks like with the most recent change the doc generation is printing empty type and return value descriptions for functions that don't have any type or return annotations.

For example:

/**
 * Initializes WordPress `postboxes` script and the logic for saving meta boxes.
 */
export function* initializeMetaBoxes() {
  // ...
}

Results in:

### initializeMetaBoxes

Initializes WordPress `postboxes` script and the logic for saving meta boxes.

_Type_

-

I'm curious why the unit tests didn't fail in this case. It'd be good to add a unit test to cover this case based on the already existing fixture example

@dmsnell
Copy link
Contributor Author

dmsnell commented Jan 20, 2022

Thanks for that catch @sarayourfriend. I tried adding a test case for this and it was pretty hard - I couldn't figure out the right way to do it. I also got lost in the test code.

The reason for the extra blank Type lines turned out to be a missing type error, ironically, where we were expecting an empty string specifically for the case of no found types vs. having a falsey value, which we are now returning as undefined. By relaxing the test, if ( potentialTypeAnnotation ), we capture if there's an actual match because if there is it will be a non-empty string, but undefined otherwise, potentially an empty string if we mess up elsewhere.

I'm tempted to not add a new test case because in this case it seems like code review was effective at catching this. I'm anxious about spending time working in the test code especially if, as you mentioned, we want to rip out most of this code anyway for a more robust and type-aware version.

@dmsnell
Copy link
Contributor Author

dmsnell commented Jan 20, 2022

I'm curious why the unit tests didn't fail in this case

The tests failed because they were verifying that there wasn't any type information type: undefined but not that the output didn't have the _Type_ section.

@sarayourfriend
Copy link
Contributor

Nice. At least our CI actually verifies when there is a documentation change and luckily changes to docgen that we don't catch as causing documentation changes will cause the CI to fail anyway. In a sense there are still tests guarding us from breaking docgen 🙂

@dmsnell
Copy link
Contributor Author

dmsnell commented Jan 21, 2022

I'm a bit disturbed that editor tests failed on this unrelated PR.

In certain situations if `docgen` finds a JSDoc with a description
for the return value of a function but there's no corresponding
type listed for the return value it will error out and say it's required.
This requirement introduces a mismatch with how many TypeScript functions
will be idiomatically _typed_. In this patch we're reporting those missing
types as _unknown_ and letting the `docgen` continue.

When missing return types of default exports `docgen` would silently
crash without an error message because of a bug when trying to find the
name of the surrounding function _when generating the error message_.
This is fixed by special-casing default exports alongside named exports.
In the midst of split lines and function calls I found it hard to visualize
what the output would look like given the code producing it. In this patch
we're expanding some of the inline expressions and abstracting a leading newline
in `formatTag` to make the individual formatters look more like what they produce.
@dmsnell dmsnell force-pushed the docgen/stop-crashing-on-missing-return-types branch from 123fa11 to 6a147f8 Compare January 21, 2022 14:50
dmsnell added a commit that referenced this pull request Jan 21, 2022
…FileSync())

While working through #37929 I noticed that the tests in the `docgen` package
read fixture data manually by chaining `JSON.parse()` and `fs.readFileSync()`,
often at times separated by a number of lines.

In this patch we're replacing those with the more natural `require()` statement
which removes noise from the test modules and hopefully will also remove a point
of confusion for those coming in to modify it. We shouldn't have to ask, "why is
this code doing something that looks normal but is doing it in a notably different
manner?"

After reviewing the history of the work, initially introduced in #13329, I could
find no explanation for the approach and found no discussion about it in the PR.
@dmsnell
Copy link
Contributor Author

dmsnell commented Jan 21, 2022

@sarayourfriend the tests are all passing and I think the docs are unchanged. is there anything else you would want from this PR?

@jorgefilipecosta added you here for extra eyes, but feel free to ignore if you're busy

dmsnell added a commit that referenced this pull request Jan 21, 2022
…FileSync()) (#38148)

While working through #37929 I noticed that the tests in the `docgen` package
read fixture data manually by chaining `JSON.parse()` and `fs.readFileSync()`,
often at times separated by a number of lines.

In this patch we're replacing those with the more natural `require()` statement
which removes noise from the test modules and hopefully will also remove a point
of confusion for those coming in to modify it. We shouldn't have to ask, "why is
this code doing something that looks normal but is doing it in a notably different
manner?"

After reviewing the history of the work, initially introduced in #13329, I could
find no explanation for the approach and found no discussion about it in the PR.
Copy link
Contributor

@sarayourfriend sarayourfriend left a comment

Choose a reason for hiding this comment

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

LGTM!

@dmsnell dmsnell merged commit f663f7a into trunk Jan 24, 2022
@dmsnell dmsnell deleted the docgen/stop-crashing-on-missing-return-types branch January 24, 2022 16:08
@github-actions github-actions bot added this to the Gutenberg 12.5 milestone Jan 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Docgen /packages/docgen [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Docgen: Crash for untyped @param descriptions on default re-export
3 participants