Skip to content

Native API: formatDiagnosticsWithColorAndContext drops related information without a file location #65087

Open

Description

@emerardd

🔎 Search Terms

formatDiagnosticsWithColorAndContext, relatedInformation, fileless diagnostic, missing related diagnostic text, diagnosticFormatter

🕗 Version & Regression Information

Reproduced against main at 6161772 using Node.js v24.14.0. The same conditional is still present on current main.

The TypeScript 6.0.3 implementation outputs related diagnostic text outside the if (file) branch; the native API implementation only outputs it inside the location branch.

⏯ Playground Link

Not applicable: this exercises the diagnostic formatting API.

💻 Code

Save as repro.mts at the repository root and run node repro.mts with Node.js 24. This calls the formatter directly with a diagnostic containing a related message without a file location.

import { formatDiagnosticsWithColorAndContext } from "./packages/typescript/src/api/diagnosticFormatter.ts";

const host = {
    getCurrentDirectory: () => "/project",
    getCanonicalFileName: (name: string) => name,
    getNewLine: () => "\n",
};

const output = formatDiagnosticsWithColorAndContext([{
    category: 1,
    code: 2322,
    pos: 0,
    end: 0,
    text: "Primary error.",
    relatedInformation: [{
        category: 3,
        code: 9999,
        pos: 0,
        end: 0,
        text: "This related explanation must remain visible.",
    }],
}], host);

console.log(JSON.stringify(output.replace(/\x1b\[[0-9;]*m/g, "")));

🙁 Actual behavior

The related explanation disappears:

"error TS2322: Primary error.\n"

Adding fileName: "/project/a.ts" and startPosition: { line: 0, character: 0 } to the related diagnostic makes its text appear.

🙂 Expected behavior

The related explanation should be included even when it has no file location. Only the location heading and source context depend on a location.

Additional information about the issue

In diagnosticFormatter.ts, the call to flattenDiagnosticMessage(related, ...) is inside if (related.fileName && related.startPosition). This also drops message chains on locationless related diagnostics.

The diagnostic response type permits omitted file names and positions. In the 6.0.3 formatter, related message text is emitted independently of the file check.

The reproduction uses constructed diagnostic objects to isolate the formatter behavior. Existing formatter tests cover related information with a location.

I would be happy to submit a focused fix and regression tests once this is triaged.

Activity

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions