diff --git a/scripts/processDiagnosticMessages.ts b/scripts/processDiagnosticMessages.ts index dd66564b134..5b45fdeaae8 100644 --- a/scripts/processDiagnosticMessages.ts +++ b/scripts/processDiagnosticMessages.ts @@ -4,6 +4,7 @@ interface DiagnosticDetails { category: string; code: number; + reportsUnnecessary?: {}; isEarly?: boolean; } @@ -59,14 +60,15 @@ function buildInfoFileOutput(messageTable: InputDiagnosticMessageTable, inputFil "/// \r\n" + "/* @internal */\r\n" + "namespace ts {\r\n" + - " function diag(code: number, category: DiagnosticCategory, key: string, message: string): DiagnosticMessage {\r\n" + - " return { code, category, key, message };\r\n" + + " function diag(code: number, category: DiagnosticCategory, key: string, message: string, reportsUnnecessary?: {}): DiagnosticMessage {\r\n" + + " return { code, category, key, message, reportsUnnecessary };\r\n" + " }\r\n" + " // tslint:disable-next-line variable-name\r\n" + " export const Diagnostics = {\r\n"; - messageTable.forEach(({ code, category }, name) => { + messageTable.forEach(({ code, category, reportsUnnecessary }, name) => { const propName = convertPropertyName(name); - result += ` ${propName}: diag(${code}, DiagnosticCategory.${category}, "${createKey(propName, code)}", ${JSON.stringify(name)}),\r\n`; + const argReportsUnnecessary = reportsUnnecessary ? `, /*reportsUnnecessary*/ ${reportsUnnecessary}` : ""; + result += ` ${propName}: diag(${code}, DiagnosticCategory.${category}, "${createKey(propName, code)}", ${JSON.stringify(name)}${argReportsUnnecessary}),\r\n`; }); result += " };\r\n}"; diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 2d3b2a2a0ce..cbfcf127200 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1606,7 +1606,7 @@ namespace ts { messageText: text, category: message.category, code: message.code, - reportsUnnecessary: message.unused, + reportsUnnecessary: message.reportsUnnecessary, }; } @@ -1637,7 +1637,7 @@ namespace ts { messageText: text, category: message.category, code: message.code, - reportsUnnecessary: message.unused, + reportsUnnecessary: message.reportsUnnecessary, }; } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 69a90fbabf5..2b56e551f1b 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3286,7 +3286,7 @@ "'{0}' is declared but its value is never read.": { "category": "Error", "code": 6133, - "unused": true + "reportsUnnecessary": true }, "Report errors on unused locals.": { "category": "Message", @@ -3307,7 +3307,7 @@ "Property '{0}' is declared but its value is never read.": { "category": "Error", "code": 6138, - "unused": true + "reportsUnnecessary": true }, "Import emit helpers from 'tslib'.": { "category": "Message", @@ -3520,7 +3520,7 @@ "All imports in import declaration are unused.": { "category": "Error", "code": 6192, - "unused": true + "reportsUnnecessary": true }, "Found 1 error.": { "category": "Message", @@ -3609,7 +3609,7 @@ "Unused label.": { "category": "Error", "code": 7028, - "unused": true + "reportsUnnecessary": true }, "Fallthrough case in switch.": { "category": "Error", diff --git a/src/compiler/types.ts b/src/compiler/types.ts index ac32d91c61a..f0aba4a34d7 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -4076,7 +4076,7 @@ namespace ts { category: DiagnosticCategory; code: number; message: string; - unused?: {}; + reportsUnnecessary?: {}; } /** diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index 8170c663b1f..ab0b1cf734d 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -4131,10 +4131,10 @@ namespace ts.projectSystem { checkErrorMessage(session, "semanticDiag", { file: file1.path, diagnostics: [] }); }); - it("info diagnostics", () => { + it("suggestion diagnostics", () => { const file: FileOrFolder = { path: "/a.js", - content: 'require("b")', + content: "function f(p) {}", }; const host = createServerHost([file]); @@ -4177,7 +4177,7 @@ namespace ts.projectSystem { checkErrorMessage(session, "suggestionDiag", { file: file.path, diagnostics: [ - createDiagnostic({ line: 1, offset: 1 }, { line: 1, offset: 13 }, Diagnostics.File_is_a_CommonJS_module_it_may_be_converted_to_an_ES6_module) + createDiagnostic({ line: 1, offset: 12 }, { line: 1, offset: 13 }, Diagnostics._0_is_declared_but_its_value_is_never_read, ["p"], "suggestion", /*reportsUnnecssary*/ true) ], }); checkCompleteEvent(session, 2, expectedSequenceId); @@ -4241,8 +4241,8 @@ namespace ts.projectSystem { session.clearMessages(); }); - function createDiagnostic(start: protocol.Location, end: protocol.Location, message: DiagnosticMessage, args: ReadonlyArray = []): protocol.Diagnostic { - return { start, end, text: formatStringFromArgs(message.message, args), code: message.code, category: diagnosticCategoryName(message), source: undefined }; + function createDiagnostic(start: protocol.Location, end: protocol.Location, message: DiagnosticMessage, args: ReadonlyArray = [], category = diagnosticCategoryName(message), reportsUnnecessary?: {}): protocol.Diagnostic { + return { start, end, text: formatStringFromArgs(message.message, args), code: message.code, category, reportsUnnecessary, source: undefined }; } }); diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 74b6865a3c3..52427413aed 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -2172,6 +2172,8 @@ namespace ts.server.protocol { */ category: string; + reportsUnnecessary?: {}; + /** * The error code of the diagnostic message. */ diff --git a/src/server/session.ts b/src/server/session.ts index 3979687d631..c6066723892 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -80,6 +80,7 @@ namespace ts.server { text: flattenDiagnosticMessageText(diag.messageText, "\n"), code: diag.code, category: diagnosticCategoryName(diag), + reportsUnnecessary: diag.reportsUnnecessary, source: diag.source }; } @@ -96,8 +97,8 @@ namespace ts.server { const text = flattenDiagnosticMessageText(diag.messageText, "\n"); const { code, source } = diag; const category = diagnosticCategoryName(diag); - return includeFileName ? { start, end, text, code, category, source, fileName: diag.file && diag.file.fileName } : - { start, end, text, code, category, source }; + return includeFileName ? { start, end, text, code, category, source, reportsUnnecessary: diag.reportsUnnecessary, fileName: diag.file && diag.file.fileName } : + { start, end, text, code, category, reportsUnnecessary: diag.reportsUnnecessary, source }; } export interface PendingErrorCheck { diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f602e872c14..49b9c2b5eca 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2275,7 +2275,7 @@ declare namespace ts { category: DiagnosticCategory; code: number; message: string; - unused?: {}; + reportsUnnecessary?: {}; } /** * A linked list of formatted diagnostic messages to be used as part of a multiline message. @@ -6758,6 +6758,7 @@ declare namespace ts.server.protocol { * The category of the diagnostic message, e.g. "error", "warning", or "suggestion". */ category: string; + reportsUnnecessary?: {}; /** * The error code of the diagnostic message. */ diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 94fd684daee..f8a63a21575 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -2275,7 +2275,7 @@ declare namespace ts { category: DiagnosticCategory; code: number; message: string; - unused?: {}; + reportsUnnecessary?: {}; } /** * A linked list of formatted diagnostic messages to be used as part of a multiline message.