diff --git a/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/services/LinterAdapter.js b/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/services/LinterAdapter.js index f6e16b4d..0bc5a95a 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/services/LinterAdapter.js +++ b/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/services/LinterAdapter.js @@ -15,6 +15,7 @@ import type {NuclideUri} from 'nuclide-commons/nuclideUri'; import type { DiagnosticInvalidationMessage, DiagnosticMessage, + DiagnosticMessageType, DiagnosticProviderUpdate, FileDiagnosticMessage, LinterMessage, @@ -44,13 +45,14 @@ export function linterMessageToDiagnosticMessage( const trace = msg.trace ? msg.trace.map(component => ({...component})) : undefined; + const type = convertLinterType(msg.type); // flowlint-next-line sketchy-null-string:off if (msg.filePath) { const {fix} = msg; return ({ scope: 'file', providerName: msg.name != null ? msg.name : providerName, - type: msg.type, + type, filePath: msg.filePath, text: msg.text, html: msg.html, @@ -69,7 +71,7 @@ export function linterMessageToDiagnosticMessage( return ({ scope: 'project', providerName: msg.name != null ? msg.name : providerName, - type: msg.type, + type, text: msg.text, html: msg.html, range: msg.range && Range.fromObject(msg.range), @@ -78,11 +80,21 @@ export function linterMessageToDiagnosticMessage( } } -const LinterSeverityMap = { - error: 'Error', - warning: 'Warning', - info: 'Info', -}; +// Be flexible in accepting various linter types/severities. +function convertLinterType(type: string): DiagnosticMessageType { + switch (type) { + case 'Error': + case 'error': + return 'Error'; + case 'Warning': + case 'warning': + return 'Warning'; + case 'Info': + case 'info': + return 'Info'; + } + return 'Error'; +} // Version 2 only handles file-level diagnostics. export function linterMessageV2ToDiagnosticMessage( @@ -130,7 +142,7 @@ export function linterMessageV2ToDiagnosticMessage( scope: 'file', // flowlint-next-line sketchy-null-string:off providerName: msg.linterName || providerName, - type: LinterSeverityMap[msg.severity], + type: convertLinterType(msg.severity), filePath: msg.location.file, text, range: Range.fromObject(msg.location.position), diff --git a/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/types.js b/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/types.js index 51631d46..dfe96a57 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/types.js +++ b/modules/atom-ide-ui/pkg/atom-ide-diagnostics/lib/types.js @@ -140,7 +140,8 @@ export type LinterTrace = { }; export type LinterMessageV1 = { - type: 'Error' | 'Warning' | 'Info', + // Should be Error / Warning / Info, but no guarantees. + type: string, text?: string, html?: string, /* diff --git a/modules/atom-ide-ui/pkg/atom-ide-diagnostics/spec/LinterAdapter-spec.js b/modules/atom-ide-ui/pkg/atom-ide-diagnostics/spec/LinterAdapter-spec.js index b22486b9..1b6e2232 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-diagnostics/spec/LinterAdapter-spec.js +++ b/modules/atom-ide-ui/pkg/atom-ide-diagnostics/spec/LinterAdapter-spec.js @@ -260,6 +260,18 @@ describe('message transformation functions', () => { filePath: fileMessage.filePath, text: fileMessage.text, }); + + // Invalid types are automatically turned into "Error". + checkMessage( + {...fileMessage, type: 'blah'}, + { + scope: 'file', + providerName, + type: 'Error', + filePath: fileMessage.filePath, + text: fileMessage.text, + }, + ); }); it('should turn a message without a filePath into a project scope diagnostic', () => {