Skip to content

[isolatedDeclarations][5.5] Autofix does not work when JSX prop contains a dash -Β #58399

Closed

Description

πŸ”Ž Search Terms

isolated declarations, jsx, autofix

πŸ•— Version & Regression Information

⏯ Playground Link

No response

πŸ’» Code

export const x = <div aria-label="hello" />

πŸ™ Actual behavior

No autofix suggestion

πŸ™‚ Expected behavior

Autofix to add explicit type annotation

Additional information about the issue

This is with "jsx": "react-jsx" in tsconfig

Activity

  1. blickly commented on May 8, 2024

    @blickly
    Contributor

    I've started taking a look at this, and after figuring out how to repro in fourslash, it looks like there is a crash coming from pretty deep within a call to ChangeTracker.getChanges

      1) fourslash tests
           tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports47-tsx-with-dash.tsx
             fourslash test codeFixMissingTypeAnnotationOnExports47-tsx-with-dash.tsx runs correctly:
         Error: Debug Failure. False expression: Token end is child end
          at processChildNode (src/services/formatting/formatting.ts:880:27)
          at /Users/blickly/repos/TypeScript/src/services/formatting/formatting.ts:791:17
          at visitNode (src/compiler/parser.ts:441:20)
          at forEachChildInJsxAttribute (src/compiler/parser.ts:1022:16)
          at forEachChild (src/compiler/parser.ts:1251:43)
          at processNode (src/services/formatting/formatting.ts:788:9)
          at processChildNode (src/services/formatting/formatting.ts:889:13)
          at processChildNodes (src/services/formatting/formatting.ts:955:40)
          at /Users/blickly/repos/TypeScript/src/services/formatting/formatting.ts:794:17
          at visitNodes (src/compiler/parser.ts:447:20)
          at forEachChildInJsxAttributes (src/compiler/parser.ts:1019:16)
          at forEachChild (src/compiler/parser.ts:1251:43)
          at processNode (src/services/formatting/formatting.ts:788:9)
          at processChildNode (src/services/formatting/formatting.ts:889:13)
          at /Users/blickly/repos/TypeScript/src/services/formatting/formatting.ts:791:17
          at visitNode (src/compiler/parser.ts:441:20)
          at forEachChildInJsxOpeningOrSelfClosingElement (src/compiler/parser.ts:1191:9)
          at forEachChild (src/compiler/parser.ts:1251:43)
          at processNode (src/services/formatting/formatting.ts:788:9)
          at processChildNode (src/services/formatting/formatting.ts:889:13)
          at /Users/blickly/repos/TypeScript/src/services/formatting/formatting.ts:791:17
          at visitNode (src/compiler/parser.ts:441:20)
          at forEachChildInParenthesizedExpression (src/compiler/parser.ts:756:16)
          at forEachChild (src/compiler/parser.ts:1251:43)
          at processNode (src/services/formatting/formatting.ts:788:9)
          at processChildNode (src/services/formatting/formatting.ts:889:13)
          at /Users/blickly/repos/TypeScript/src/services/formatting/formatting.ts:791:17
          at visitNode (src/compiler/parser.ts:441:20)
          at forEachChildInSatisfiesExpression (src/compiler/parser.ts:793:16)
          at forEachChild (src/compiler/parser.ts:1251:43)
          at processNode (src/services/formatting/formatting.ts:788:9)
          at processChildNode (src/services/formatting/formatting.ts:889:13)
          at /Users/blickly/repos/TypeScript/src/services/formatting/formatting.ts:791:17
          at visitNode (src/compiler/parser.ts:441:20)
          at forEachChildInAsExpression (src/compiler/parser.ts:786:16)
          at forEachChild (src/compiler/parser.ts:1251:43)
          at processNode (src/services/formatting/formatting.ts:788:9)
          at formatSpanWorker (src/services/formatting/formatting.ts:521:9)
          at /Users/blickly/repos/TypeScript/src/services/formatting/formatting.ts:440:9
          at getFormattingScanner (src/services/formatting/formattingScanner.ts:69:17)
          at Object.formatNodeGivenIndentation (src/services/formatting/formatting.ts:439:12)
          at getFormattedTextOfNode (src/services/textChanges.ts:1342:36)
          at format (src/services/textChanges.ts:1313:37)
          at computeNewText (src/services/textChanges.ts:1316:15)
          at /Users/blickly/repos/TypeScript/src/services/textChanges.ts:1278:33
          at mapDefined (src/compiler/core.ts:518:28)
          at /Users/blickly/repos/TypeScript/src/services/textChanges.ts:1273:33
          at mapDefined (src/compiler/core.ts:518:28)
          at Object.getTextChangesFromChanges (src/services/textChanges.ts:1263:16)
          at _ChangeTracker.getChanges (src/services/textChanges.ts:1179:39)
          at withContext (src/services/codefixes/fixMissingTypeAnnotationOnExports.ts:254:36)
    

    After debugging a bit, I suspect the issue is that the formatter seems to rely on Nodes having a valid parent pointer (such as here), which seem to be set to undefined in the replacement node passed to the ChangeTracker.

    Is it safe to assume that the ChangeTracker / formatter in TS are designed to require valid parent pointers?

  2. jakebailey commented on May 8, 2024

    @jakebailey
    Member

    Judging by the location, this looks more like that the formatter didn't consider - to be a part of a name; it checks if it's a token (which I'm assuming is -), then only complains if that's in JsxText, but surely it can be an attribute too.

  3. locked as resolved and limited conversation to collaborators on Oct 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions