Skip to content

[generator] Add support for source map backed stack traces for debugging generator output#522

Draft
nikeokoronkwo wants to merge 4 commits intodart-lang:mainfrom
nikeokoronkwo:feat/stack_traces
Draft

[generator] Add support for source map backed stack traces for debugging generator output#522
nikeokoronkwo wants to merge 4 commits intodart-lang:mainfrom
nikeokoronkwo:feat/stack_traces

Conversation

@nikeokoronkwo
Copy link
Copy Markdown
Collaborator

@nikeokoronkwo nikeokoronkwo commented Mar 15, 2026

Fixes #505

This PR adds support for working with the web generator errors better using dart-style stack traces by mapping the stack trace frames from V8/NodeJS to Dart, using the related dart packages.

This makes the error messages much easier to debug and deal with, which improves debugging

Issues

  1. There are some issues mapping the frames completely, including but not limited to mapping npm dependency code in the stack frames. The major example here being that the frames occuring from the typescript package are being mapped to other unrelated packages. An example before:
    at getTypeFromTypeReference (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:65071:36)
    at getTypeFromTypeNodeWorker (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:67750:16)
    at getTypeFromTypeNode (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:67712:41)
    at Object.getTypeFromTypeNode (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:51140:21)
    at Transformer._transformType$4$isNullable$parameter$typeArg (~/web/web_generator/lib/src/dart_main.js:8064
    at Transformer._transformType$1 (~/web/web_generator/lib/src/dart_main.js:81095:19)

and after:

../../../../../../.pub-cache/hosted/pub.dev/dart_style-3.1.3/lib/src/front_end/piece_writer.dart 208:23  getTypeFromTypeReference
../../../../../../.pub-cache/hosted/pub.dev/dart_style-3.1.3/lib/src/short/rule/rule.dart 166:5          getTypeFromTypeNode
org-dartlang-sdk:///lib/_internal/js_shared/lib/js_util_patch.dart 149:10                                Transformer._transformType

commit 48b7512
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sun Mar 1 06:52:52 2026 +0000

    Bump actions/stale from 10.1.1 to 10.2.0 in the github-actions group (dart-lang#520)

    Bumps the github-actions group with 1 update: [actions/stale](https://github.com/actions/stale).

    Updates `actions/stale` from 10.1.1 to 10.2.0
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a href="https://github.com/actions/stale/releases">actions/stale's releases</a>.</em></p>
    <blockquote>
    <h2>v10.2.0</h2>
    <h2>What's Changed</h2>
    <h3>Bug Fix</h3>
    <ul>
    <li>Fix checking state cache (fix <a href="https://redirect.github.com/actions/stale/issues/1136">#1136</a>) and switch to Octokit helper methods by <a href="https://github.com/itchyny"><code>@​itchyny</code></a> in <a href="https://redirect.github.com/actions/stale/pull/1152">actions/stale#1152</a></li>
    </ul>
    <h3>Dependency Updates</h3>
    <ul>
    <li>Upgrade js-yaml from  4.1.0 to 4.1.1 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/actions/stale/pull/1304">actions/stale#1304</a></li>
    <li>Upgrade lodash from 4.17.21 to 4.17.23 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/actions/stale/pull/1313">actions/stale#1313</a></li>
    <li>Upgrade actions/cache from 4.0.3 to 5.0.2 and actions/github from 5.1.1 to 7.0.0  by <a href="https://github.com/chiranjib-swain"><code>@​chiranjib-swain</code></a> in <a href="https://redirect.github.com/actions/stale/pull/1312">actions/stale#1312</a></li>
    </ul>
    <h2>New Contributors</h2>
    <ul>
    <li><a href="https://github.com/itchyny"><code>@​itchyny</code></a> made their first contribution in <a href="https://redirect.github.com/actions/stale/pull/1152">actions/stale#1152</a></li>
    </ul>
    <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/stale/compare/v10...v10.2.0">https://github.com/actions/stale/compare/v10...v10.2.0</a></p>
    </blockquote>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a href="https://github.com/actions/stale/commit/b5d41d4e1d5dceea10e7104786b73624c18a190f"><code>b5d41d4</code></a> build(deps-dev): bump lodash from 4.17.21 to 4.17.23 (<a href="https://redirect.github.com/actions/stale/issues/1313">#1313</a>)</li>
    <li><a href="https://github.com/actions/stale/commit/dcd2b9469d2220b7e8d08aedc00c105d277fd46b"><code>dcd2b94</code></a> Fix punycode and url.parse Deprecation Warnings (<a href="https://redirect.github.com/actions/stale/issues/1312">#1312</a>)</li>
    <li><a href="https://github.com/actions/stale/commit/d6f8a33132340b15a7006f552936e4b9b39c00ec"><code>d6f8a33</code></a> build(deps-dev): bump js-yaml from 4.1.0 to 4.1.1 (<a href="https://redirect.github.com/actions/stale/issues/1304">#1304</a>)</li>
    <li><a href="https://github.com/actions/stale/commit/a21a0816299b11691f9592ef0d63d08e02f06d9d"><code>a21a081</code></a> Fix checking state cache (fix <a href="https://redirect.github.com/actions/stale/issues/1136">#1136</a>), also switch to octokit methods (<a href="https://redirect.github.com/actions/stale/issues/1152">#1152</a>)</li>
    <li>See full diff in <a href="https://github.com/actions/stale/compare/997185467fa4f803885201cee163a9f38240193d...b5d41d4e1d5dceea10e7104786b73624c18a190f">compare view</a></li>
    </ul>
    </details>
    <br />

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/stale&package-manager=github_actions&previous-version=10.1.1&new-version=10.2.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

    ---

    <details>
    <summary>Dependabot commands and options</summary>
    <br />

    You can trigger Dependabot actions by commenting on this PR:
    - `@dependabot rebase` will rebase this PR
    - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
    - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
    - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
    - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
    - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
    - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency
    - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions

    </details>

commit a6336c8
Author: Kevin Moore <kevmoo@users.noreply.github.com>
Date:   Mon Feb 23 11:09:23 2026 -0800

    remove dynamic calls from Stream helpers (dart-lang#519)

    Mode CustomEventProviders `abstract final`
    Deleted a bunch of unused code in the streams.dart internal library

commit 94d22fe
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Tue Feb 3 17:21:35 2026 -0800

    Bump actions/checkout from 6.0.1 to 6.0.2 in the github-actions group (dart-lang#515)

    Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).

    Updates `actions/checkout` from 6.0.1 to 6.0.2
    - [Release notes](https://github.com/actions/checkout/releases)
    - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
    - [Commits](actions/checkout@8e8c483...de0fac2)

    ---
    updated-dependencies:
    - dependency-name: actions/checkout
      dependency-version: 6.0.2
      dependency-type: direct:production
      update-type: version-update:semver-patch
      dependency-group: github-actions
    ...

    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

commit 5edd2dd
Author: Kevin Moore <kevmoo@users.noreply.github.com>
Date:   Tue Feb 3 17:18:04 2026 -0800

    Fix use_null_aware_elements lint (dart-lang#518)

commit d1958f8
Author: Sagar <halladakerisagar@gmail.com>
Date:   Wed Feb 4 06:29:06 2026 +0530

    Support TypeScript indexed access types in interop_gen (dart-lang#509)

    * Support TypeScript indexed access types in interop_gen

    * Fix:prevent IndexedAccessType fallback from generating unsupported bindings

    * Remove unused indexed access fallback flag and simplify resolution logic

    * fixed analyzer issue

    * fix format issue

    * Improve IndexedAccessType handling and add composed type tests

    * interop_gen: refactor indexed access resolution, remove dead code, and Add test for symbol indexed access with primitive return type

commit 2590763
Author: Harshita Yadav <seemayadavanuj123@gmail.com>
Date:   Mon Jan 26 23:40:27 2026 +0530

    docs: clarify document.cookie nullability when migrating from dart:html (dart-lang#510)

    * docs: clarify document.cookie nullability when migrating from dart:html

    * docs: organize migration notes under specific APIs

commit b9b1b38
Author: Sagar <halladakerisagar@gmail.com>
Date:   Sat Jan 17 02:31:52 2026 +0530

    Interop gen additional literal types (dart-lang#503)

    * interop_gen: support additional literal type expressions via TypeChecker

    * fixed analyzer warning

    * simplify literal parsing and improve readability

    * Refactor literal handling and expand literal tests

    Use a shared helper to reduce duplication, remove unused TSTypeFlags, and
    add integration tests for false, null, and negative numeric literals.

    * Use typed literal helpers in _transformType and add tests

    Refactor literal handling to use scoped, typed helpers instead of a
    generic value-based helper. Clean up unused TSTypeFlags and add
    integration tests for false, null, and resolved-type literals.

    * fix CI issue

    * enable fallback literal coverage and update expectations

commit 1dfcee7
Author: Harshita Yadav <seemayadavanuj123@gmail.com>
Date:   Fri Jan 16 03:21:37 2026 +0530

    docs(web_generator): document minimum supported Node.js version (dart-lang#508)

    * docs(web_generator): document minimum supported Node.js version

    * docs(web_generator): simplify Node.js version wording
Fixes dart-lang#505

This PR adds support for working with the web generator errors better using dart-style stack traces by mapping the stack trace frames from V8/NodeJS to Dart, using the related dart packages.

This makes the error messages much easier to debug and deal with, which improves debugging

## Issues
1. There are some issues mapping the frames completely, including but not limited to mapping `npm` dependency code in the stack frames. The major example here being that the frames occuring from the `typescript` package are being mapped to other unrelated packages. An example before:
```
    at getTypeFromTypeReference (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:65071:36)
    at getTypeFromTypeNodeWorker (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:67750:16)
    at getTypeFromTypeNode (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:67712:41)
    at Object.getTypeFromTypeNode (~/web/web_generator/lib/src/node_modules/typescript/lib/typescript.js:51140:21)
    at Transformer._transformType$4$isNullable$parameter$typeArg (~/web/web_generator/lib/src/dart_main.js:8064
    at Transformer._transformType$1 (~/web/web_generator/lib/src/dart_main.js:81095:19)
```

and after:
```
../../../../../../.pub-cache/hosted/pub.dev/dart_style-3.1.3/lib/src/front_end/piece_writer.dart 208:23  getTypeFromTypeReference
../../../../../../.pub-cache/hosted/pub.dev/dart_style-3.1.3/lib/src/short/rule/rule.dart 166:5          getTypeFromTypeNode
org-dartlang-sdk:///lib/_internal/js_shared/lib/js_util_patch.dart 149:10                                Transformer._transformType
```
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly improves the debugging experience for the web_generator by implementing a mechanism to map V8/NodeJS stack traces to their corresponding Dart source locations. This transformation provides more readable and actionable error messages, making it easier to identify and resolve issues within the generated code. Additionally, it includes refactoring of event handling in package:web and updates to the generator's type processing capabilities.

Highlights

  • Dart-style Stack Trace Mapping: Implemented a mechanism to map V8/NodeJS stack traces from the web generator to Dart source locations, significantly improving error readability and debugging.
  • Raw Stack Trace Option: Introduced a --raw-stack-traces flag in gen_interop_bindings.dart to allow developers to view unmapped JavaScript stack traces if needed.
  • Event Provider Refactoring in package:web: Consolidated CustomEventProviders into EventStreamProviders for a cleaner and more consistent event handling API.
  • Enhanced Type Transformation in web_generator: Improved the web_generator's ability to correctly transform TypeScript literal types and indexed access types into their Dart equivalents.
  • Node.js Requirement Update: Updated the minimum Node.js version requirement for web_generator to v22 or newer.
Changelog
  • web/CHANGELOG.md
    • Removed CustomEventProviders and noted their migration to EventStreamProviders.
  • web/README.md
    • Documented that document.cookie is now non-nullable and always returns a String in package:web.
  • web/lib/src/helpers/events/events.dart
    • Migrated custom event extensions from CustomEventProviders to EventStreamProviders.
  • web/lib/src/helpers/events/providers.dart
    • Consolidated CustomEventProviders into EventStreamProviders by moving relevant static members.
  • web/lib/src/helpers/events/streams.dart
    • Removed unused Device import and simplified event listener wrapping logic.
  • web_generator/README.md
    • Added a requirement for Node.js v22 or newer for web_generator.
  • web_generator/bin/gen_interop_bindings.dart
    • Implemented source map-based stack trace mapping for Node.js errors.
    • Added a --raw-stack-traces flag to display unmapped JavaScript stack traces.
  • web_generator/lib/src/ast/declarations.dart
    • Refactored conditional list additions for constructors and extendees using if (x != null) x to [?x].
  • web_generator/lib/src/ast/merger.dart
    • Refactored conditional list additions for extensions and enums using if (x != null) x to [?x].
  • web_generator/lib/src/cli.dart
    • Refactored conditional list additions for supertypes using if (x != null) x to [?x].
  • web_generator/lib/src/dart_main.dart
    • Added a TODO comment regarding Dart stack traces in JS.
  • web_generator/lib/src/interop_gen/parser.dart
    • Enhanced error reporting for parsing diagnostics, adding ParseError prefix and conditional handleDiagnostics calls.
  • web_generator/lib/src/interop_gen/transform/transformer.dart
    • Refactored modifier parsing for class declarations.
    • Simplified name assignment for literal expressions.
    • Introduced helper functions for literal type creation.
    • Added comprehensive logic for transforming IndexedAccessType nodes.
  • web_generator/lib/src/js/typescript.dart
    • Exposed typeToString and typeToTypeNode methods from TypeScript's TSTypeChecker for advanced type introspection.
  • web_generator/lib/src/js/typescript.types.dart
    • Defined TSTypeFlags.BooleanLiteral and TSSyntaxKind.IndexedAccessType.
    • Added new extension types for TSLiteralType, TSNumberLiteralType, and TSStringLiteralType.
  • web_generator/pubspec.yaml
    • Added new dependencies: source_map_stack_trace, source_maps, and stack_trace.
  • web_generator/test/integration/interop_gen/indexed_access_test_expected.dart
    • Added expected output for indexed access type transformation tests.
  • web_generator/test/integration/interop_gen/indexed_access_test_input.d.ts
    • Added new TypeScript declaration file for indexed access type tests.
  • web_generator/test/integration/interop_gen/literal_test_expected.dart
    • Added expected output for literal type transformation tests.
  • web_generator/test/integration/interop_gen/literal_test_input.d.ts
    • Added new TypeScript declaration file for literal type tests.
Ignored Files
  • Ignored by pattern: .github/workflows/** (4)
    • .github/workflows/js_interop.yaml
    • .github/workflows/no-response.yml
    • .github/workflows/web.yaml
    • .github/workflows/web_generator.yaml
Activity
  • The pull request addresses issue [web_generator] Improve debugging of bin scripts with better stack traces #505 by implementing Dart-style stack trace mapping for web generator errors.
  • The author has provided example stack traces to demonstrate the improvement in error messages.
  • A known issue has been identified regarding difficulties in completely mapping frames from npm dependency code, specifically the typescript package.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@nikeokoronkwo nikeokoronkwo changed the title Feat/stack traces [generator] Add support for source map backed stack traces for debugging generator output Mar 15, 2026
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request significantly improves the debugging experience for the web generator by adding support for Dart-style stack traces. My review includes a suggestion to make the stack trace parsing more robust and a minor simplification in the IndexedAccessType logic.

Comment thread web_generator/bin/gen_interop_bindings.dart Outdated
Comment on lines +1976 to +1979
} else if (t is HomogenousEnumType) {
for (final sub in t.types) {
keys.addAll(collectKeys(sub));
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

Assuming HomogenousEnumType is a subtype of UnionType, this else if block is redundant. The logic for UnionType already handles iterating through types and recursively calling collectKeys. Removing this block will simplify the code without changing its behavior.

@nikeokoronkwo nikeokoronkwo requested a review from srujzs March 16, 2026 00:08
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[web_generator] Improve debugging of bin scripts with better stack traces

1 participant