Skip to content

Commit c3b0a05

Browse files
committed
Add NAG compiler support for linting
Fixes #476
1 parent 05ad031 commit c3b0a05

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@
195195
"gfortran",
196196
"ifort",
197197
"ifx",
198+
"nagfor",
198199
"Disabled"
199200
],
200201
"markdownDescription": "Compiler used for linting support."

src/features/linter-provider.ts

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ export class FortranLintingProvider {
132132
...args,
133133
...this.getIncludeParams(includePaths), // include paths
134134
textDocument.fileName,
135-
`-o ${fileNameWithoutExtension}.mod`,
135+
'-o',
136+
`${fileNameWithoutExtension}.mod`,
136137
];
137138

138139
return argList.map(arg => arg.trim()).filter(arg => arg !== '');
@@ -148,6 +149,10 @@ export class FortranLintingProvider {
148149
modFlag = '-module';
149150
break;
150151

152+
case 'nagfor':
153+
modFlag = '-mdir';
154+
break;
155+
151156
default:
152157
modFlag = '-J';
153158
break;
@@ -379,11 +384,58 @@ export class FortranLintingProvider {
379384
}
380385
return diagnostics;
381386

387+
case 'nagfor':
388+
return this.linterParserNagfor(matches);
389+
382390
default:
383391
break;
384392
}
385393
}
386394

395+
private linterParserNagfor(matches: RegExpMatchArray[]) {
396+
const diagnostics: vscode.Diagnostic[] = [];
397+
for (const m of matches) {
398+
const g = m.groups;
399+
const fname: string = g['fname'];
400+
const lineNo: number = parseInt(g['ln']);
401+
const msg_type: string = g['sev1'];
402+
const msg: string = g['msg1'];
403+
// NAGFOR does not have a column number, so get the entire line
404+
const range = vscode.window.activeTextEditor.document.lineAt(lineNo - 1).range;
405+
406+
let severity: vscode.DiagnosticSeverity;
407+
switch (msg_type.toLowerCase()) {
408+
case 'panic':
409+
case 'fatal':
410+
case 'error':
411+
severity = vscode.DiagnosticSeverity.Error;
412+
break;
413+
414+
case 'extension':
415+
case 'questionable':
416+
case 'deleted feature used':
417+
case 'warning':
418+
severity = vscode.DiagnosticSeverity.Warning;
419+
break;
420+
421+
case 'remark':
422+
case 'note':
423+
case 'info':
424+
severity = vscode.DiagnosticSeverity.Information;
425+
break;
426+
427+
default:
428+
severity = vscode.DiagnosticSeverity.Error;
429+
console.log('Unknown severity: ' + msg_type);
430+
break;
431+
}
432+
433+
const d = new vscode.Diagnostic(range, msg, severity);
434+
diagnostics.push(d);
435+
}
436+
return diagnostics;
437+
}
438+
387439
/**
388440
* Different compilers, display errors in different ways, hence we need
389441
* different regular expressions to interpret their output.
@@ -427,6 +479,9 @@ export class FortranLintingProvider {
427479
// see https://regex101.com/r/GZ0Lzz/2
428480
return /^(?<fname>(?:\w:\\)?.*)\((?<ln>\d+)\):\s*(?:#(?:(?<sev2>\w*):\s*(?<msg2>.*$))|(?<sev1>\w*)\s*(?<msg1>.*$)(?:\s*.*\s*)(?<cn>-*\^))/gm;
429481

482+
case 'nagfor':
483+
return /^(?<sev1>Remark|Info|Note|Warning|Questionable|Extension|Deleted feature used|Error|Fatal|Panic)(\(\w+\))?: (?<fname>[\S ]+), line (?<ln>\d+): (?<msg1>.+)$/gm;
484+
430485
default:
431486
vscode.window.showErrorMessage('Unsupported linter, change your linter.compiler option');
432487
}
@@ -454,6 +509,9 @@ export class FortranLintingProvider {
454509
case 'ifort':
455510
return ['-syntax-only', '-fpp'];
456511

512+
case 'nagfor':
513+
return ['-M', '-quiet'];
514+
457515
default:
458516
break;
459517
}

0 commit comments

Comments
 (0)