Skip to content

Manually constructed nullish coalescing AST is missing parentheses when printedΒ #61369

Open
@mmalerba

Description

@mmalerba

πŸ”Ž Search Terms

nullish coalescing parentheses ast

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about nullish coalescing

⏯ Playground Link

https://stackblitz.com/edit/vitejs-vite-letuvqes?file=src%2Fmain.ts

πŸ’» Code

import * as ts from 'typescript';

const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
const src = ts.createSourceFile('test.ts', '', ts.ScriptTarget.Latest);

const nullishNode = ts.factory.createExpressionStatement(
  ts.factory.createBinaryExpression(
    ts.factory.createConditionalExpression(
      ts.factory.createIdentifier('a'),
      ts.factory.createToken(ts.SyntaxKind.QuestionToken),
      ts.factory.createIdentifier('b'),
      ts.factory.createToken(ts.SyntaxKind.ColonToken),
      ts.factory.createIdentifier('c')
    ),
    ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
    ts.factory.createIdentifier('d')
  )
);

const orNode = ts.factory.createExpressionStatement(
  ts.factory.createBinaryExpression(
    ts.factory.createConditionalExpression(
      ts.factory.createIdentifier('a'),
      ts.factory.createToken(ts.SyntaxKind.QuestionToken),
      ts.factory.createIdentifier('b'),
      ts.factory.createToken(ts.SyntaxKind.ColonToken),
      ts.factory.createIdentifier('c')
    ),
    ts.factory.createToken(ts.SyntaxKind.BarBarToken),
    ts.factory.createIdentifier('d')
  )
);

// a ? b : c ?? d
const nullish = printer.printNode(ts.EmitHint.Unspecified, nullishNode, src);
// (a ? b : c) || d
const or = printer.printNode(ts.EmitHint.Unspecified, orNode, src);

πŸ™ Actual behavior

When I manually create AST for the expression (a ? b : c) ?? d but leave the parentheses out of the AST, the generated code does not add the parens back in and therefore does not match the structure of the AST.

When I do this same thing with || or && it behaves as expected, inserting the parens back in to the generated code.

πŸ™‚ Expected behavior

The nullishNode should be printed in the same way the orNode is in the example, adding back in the parentheses so that the code matches the structure of the AST

Additional information about the issue

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptFix AvailableA PR has been opened for this issueHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions