Skip to content

Commit 80651e3

Browse files
Matko BurulDonJayamanne
authored andcommitted
Make linter's severity levels configurable (#941)
1 parent 1741a7a commit 80651e3

8 files changed

Lines changed: 138 additions & 79 deletions

File tree

package.json

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,83 @@
10681068
"Warning"
10691069
]
10701070
},
1071+
"python.linting.pep8CategorySeverity.W": {
1072+
"type": "string",
1073+
"default": "Warning",
1074+
"description": "Severity of Pep8 message type 'W'.",
1075+
"enum": [
1076+
"Hint",
1077+
"Error",
1078+
"Information",
1079+
"Warning"
1080+
]
1081+
},
1082+
"python.linting.pep8CategorySeverity.E": {
1083+
"type": "string",
1084+
"default": "Error",
1085+
"description": "Severity of Pep8 message type 'E'.",
1086+
"enum": [
1087+
"Hint",
1088+
"Error",
1089+
"Information",
1090+
"Warning"
1091+
]
1092+
},
1093+
"python.linting.flake8CategorySeverity.F": {
1094+
"type": "string",
1095+
"default": "Error",
1096+
"description": "Severity of Flake8 message type 'F'.",
1097+
"enum": [
1098+
"Hint",
1099+
"Error",
1100+
"Information",
1101+
"Warning"
1102+
]
1103+
},
1104+
"python.linting.flake8CategorySeverity.E": {
1105+
"type": "string",
1106+
"default": "Error",
1107+
"description": "Severity of Flake8 message type 'E'.",
1108+
"enum": [
1109+
"Hint",
1110+
"Error",
1111+
"Information",
1112+
"Warning"
1113+
]
1114+
},
1115+
"python.linting.flake8CategorySeverity.W": {
1116+
"type": "string",
1117+
"default": "Warning",
1118+
"description": "Severity of Flake8 message type 'W'.",
1119+
"enum": [
1120+
"Hint",
1121+
"Error",
1122+
"Information",
1123+
"Warning"
1124+
]
1125+
},
1126+
"python.linting.mypyCategorySeverity.error": {
1127+
"type": "string",
1128+
"default": "Error",
1129+
"description": "Severity of Mypy message type 'Error'.",
1130+
"enum": [
1131+
"Hint",
1132+
"Error",
1133+
"Information",
1134+
"Warning"
1135+
]
1136+
},
1137+
"python.linting.mypyCategorySeverity.note": {
1138+
"type": "string",
1139+
"default": "Information",
1140+
"description": "Severity of Mypy message type 'Note'.",
1141+
"enum": [
1142+
"Hint",
1143+
"Error",
1144+
"Information",
1145+
"Warning"
1146+
]
1147+
},
10711148
"python.linting.prospectorPath": {
10721149
"type": "string",
10731150
"default": "prospector",

src/client/common/configSettings.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@ export interface IPylintCategorySeverity {
4949
error: vscode.DiagnosticSeverity;
5050
fatal: vscode.DiagnosticSeverity;
5151
}
52+
export interface IPep8CategorySeverity {
53+
W: vscode.DiagnosticSeverity;
54+
E: vscode.DiagnosticSeverity;
55+
}
56+
export interface Flake8CategorySeverity {
57+
F: vscode.DiagnosticSeverity;
58+
E: vscode.DiagnosticSeverity;
59+
W: vscode.DiagnosticSeverity;
60+
}
61+
export interface IMypyCategorySeverity {
62+
error: vscode.DiagnosticSeverity;
63+
note: vscode.DiagnosticSeverity;
64+
}
5265
export interface ILintingSettings {
5366
enabled: boolean;
5467
enabledWithoutWorkspace: boolean;
@@ -69,6 +82,9 @@ export interface ILintingSettings {
6982
lintOnSave: boolean;
7083
maxNumberOfProblems: number;
7184
pylintCategorySeverity: IPylintCategorySeverity;
85+
pep8CategorySeverity: IPep8CategorySeverity;
86+
flake8CategorySeverity: Flake8CategorySeverity;
87+
mypyCategorySeverity: IMypyCategorySeverity;
7288
prospectorPath: string;
7389
pylintPath: string;
7490
pep8Path: string;
@@ -183,6 +199,19 @@ export class PythonSettings extends EventEmitter implements IPythonSettings {
183199
fatal: vscode.DiagnosticSeverity.Error,
184200
refactor: vscode.DiagnosticSeverity.Hint,
185201
warning: vscode.DiagnosticSeverity.Warning
202+
},
203+
pep8CategorySeverity: {
204+
E: vscode.DiagnosticSeverity.Error,
205+
W: vscode.DiagnosticSeverity.Warning
206+
},
207+
flake8CategorySeverity: {
208+
F: vscode.DiagnosticSeverity.Error,
209+
E: vscode.DiagnosticSeverity.Error,
210+
W: vscode.DiagnosticSeverity.Warning
211+
},
212+
mypyCategorySeverity: {
213+
error: vscode.DiagnosticSeverity.Error,
214+
note: vscode.DiagnosticSeverity.Hint
186215
}
187216
};
188217
this.linting.pylintPath = getAbsolutePath(systemVariables.resolveAny(this.linting.pylintPath), workspaceRoot);

src/client/linters/baseLinter.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,29 @@ export abstract class BaseLinter {
6565
public abstract isEnabled(): Boolean;
6666
public abstract runLinter(document: vscode.TextDocument, cancellation: vscode.CancellationToken): Promise<ILintMessage[]>;
6767

68+
protected parseMessagesSeverity(error: string, categorySeverity: any): LintMessageSeverity {
69+
if (categorySeverity[error]) {
70+
let severityName = categorySeverity[error];
71+
switch (severityName) {
72+
case 'Error':
73+
return LintMessageSeverity.Error;
74+
case 'Hint':
75+
return LintMessageSeverity.Hint;
76+
case 'Information':
77+
return LintMessageSeverity.Information;
78+
case 'Warning':
79+
return LintMessageSeverity.Warning;
80+
default: {
81+
if (LintMessageSeverity[severityName]) {
82+
return <LintMessageSeverity><any>LintMessageSeverity[severityName];
83+
}
84+
}
85+
}
86+
}
87+
88+
return LintMessageSeverity.Information;
89+
}
90+
6891
protected run(command: string, args: string[], document: vscode.TextDocument, cwd: string, cancellation: vscode.CancellationToken, regEx: string = REGEX): Promise<ILintMessage[]> {
6992
let outputChannel = this.outputChannel;
7093

src/client/linters/flake8.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,6 @@ export class Linter extends baseLinter.BaseLinter {
1212
super('flake8', Product.flake8, outputChannel, workspaceRootPath);
1313
}
1414

15-
private parseMessagesCodeSeverity(error: string): baseLinter.LintMessageSeverity {
16-
17-
let category_letter = error[0];
18-
switch (category_letter) {
19-
case 'F':
20-
case 'E':
21-
return baseLinter.LintMessageSeverity.Error;
22-
case 'W':
23-
return baseLinter.LintMessageSeverity.Warning;
24-
default:
25-
return baseLinter.LintMessageSeverity.Information;
26-
}
27-
}
28-
2915
public isEnabled(): Boolean {
3016
return this.pythonSettings.linting.flake8Enabled;
3117
}
@@ -37,9 +23,9 @@ export class Linter extends baseLinter.BaseLinter {
3723
let flake8Path = this.pythonSettings.linting.flake8Path;
3824
let flake8Args = Array.isArray(this.pythonSettings.linting.flake8Args) ? this.pythonSettings.linting.flake8Args : [];
3925
return new Promise<baseLinter.ILintMessage[]>((resolve, reject) => {
40-
this.run(flake8Path, flake8Args.concat(['--format=%(row)d,%(col)d,%(code)s,%(code)s:%(text)s', document.uri.fsPath]), document, this.workspaceRootPath, cancellation).then(messages => {
26+
this.run(flake8Path, flake8Args.concat(['--format=%(row)d,%(col)d,%(code).1s,%(code)s:%(text)s', document.uri.fsPath]), document, this.workspaceRootPath, cancellation).then(messages => {
4127
messages.forEach(msg => {
42-
msg.severity = this.parseMessagesCodeSeverity(msg.type);
28+
msg.severity = this.parseMessagesSeverity(msg.type, this.pythonSettings.linting.flake8CategorySeverity);
4329
});
4430

4531
resolve(messages);

src/client/linters/mypy.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,6 @@ export class Linter extends baseLinter.BaseLinter {
1111
constructor(outputChannel: OutputChannel, workspaceRootPath?: string) {
1212
super('mypy', Product.mypy, outputChannel, workspaceRootPath);
1313
}
14-
private parseMessagesSeverity(category: string): baseLinter.LintMessageSeverity {
15-
switch (category) {
16-
case 'error': {
17-
return baseLinter.LintMessageSeverity.Error;
18-
}
19-
case 'note': {
20-
return baseLinter.LintMessageSeverity.Hint;
21-
}
22-
default: {
23-
return baseLinter.LintMessageSeverity.Information;
24-
}
25-
}
26-
}
2714

2815
public isEnabled(): Boolean {
2916
return this.pythonSettings.linting.mypyEnabled;
@@ -38,7 +25,7 @@ export class Linter extends baseLinter.BaseLinter {
3825
return new Promise<baseLinter.ILintMessage[]>((resolve, reject) => {
3926
this.run(mypyPath, mypyArgs.concat([document.uri.fsPath]), document, this.workspaceRootPath, cancellation, REGEX).then(messages => {
4027
messages.forEach(msg => {
41-
msg.severity = this.parseMessagesSeverity(msg.type);
28+
msg.severity = this.parseMessagesSeverity(msg.type, this.pythonSettings.linting.mypyCategorySeverity);
4229
msg.code = msg.type;
4330
});
4431

src/client/linters/pep8Linter.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,6 @@ export class Linter extends baseLinter.BaseLinter {
1212
super('pep8', Product.pep8, outputChannel, workspaceRootPath);
1313
}
1414

15-
private parseMessagesCodeSeverity(error: string): baseLinter.LintMessageSeverity {
16-
17-
let category_letter = error[0];
18-
switch (category_letter) {
19-
case 'E':
20-
return baseLinter.LintMessageSeverity.Error;
21-
case 'W':
22-
return baseLinter.LintMessageSeverity.Warning;
23-
default:
24-
return baseLinter.LintMessageSeverity.Information;
25-
}
26-
}
27-
2815
public isEnabled(): Boolean {
2916
return this.pythonSettings.linting.pep8Enabled;
3017
}
@@ -36,9 +23,9 @@ export class Linter extends baseLinter.BaseLinter {
3623
let pep8Path = this.pythonSettings.linting.pep8Path;
3724
let pep8Args = Array.isArray(this.pythonSettings.linting.pep8Args) ? this.pythonSettings.linting.pep8Args : [];
3825
return new Promise<baseLinter.ILintMessage[]>(resolve => {
39-
this.run(pep8Path, pep8Args.concat(['--format=%(row)d,%(col)d,%(code)s,%(code)s:%(text)s', document.uri.fsPath]), document, this.workspaceRootPath, cancellation).then(messages => {
26+
this.run(pep8Path, pep8Args.concat(['--format=%(row)d,%(col)d,%(code).1s,%(code)s:%(text)s', document.uri.fsPath]), document, this.workspaceRootPath, cancellation).then(messages => {
4027
messages.forEach(msg => {
41-
msg.severity = this.parseMessagesCodeSeverity(msg.type);
28+
msg.severity = this.parseMessagesSeverity(msg.type, this.pythonSettings.linting.pep8CategorySeverity);
4229
});
4330

4431
resolve(messages);

src/client/linters/pylint.ts

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,6 @@ export class Linter extends baseLinter.BaseLinter {
1010
super('pylint', Product.pylint, outputChannel, workspaceRootPath);
1111
}
1212

13-
private parseMessagesSeverity(category: string): baseLinter.LintMessageSeverity {
14-
if (this.pythonSettings.linting.pylintCategorySeverity[category]) {
15-
let severityName = this.pythonSettings.linting.pylintCategorySeverity[category];
16-
switch (severityName) {
17-
case 'Error':
18-
return baseLinter.LintMessageSeverity.Error;
19-
case 'Hint':
20-
return baseLinter.LintMessageSeverity.Hint;
21-
case 'Information':
22-
return baseLinter.LintMessageSeverity.Information;
23-
case 'Warning':
24-
return baseLinter.LintMessageSeverity.Warning;
25-
default: {
26-
if (baseLinter.LintMessageSeverity[severityName]) {
27-
return <baseLinter.LintMessageSeverity><any>baseLinter.LintMessageSeverity[severityName];
28-
}
29-
}
30-
}
31-
}
32-
33-
return baseLinter.LintMessageSeverity.Information;
34-
}
35-
3613
public isEnabled(): Boolean {
3714
return this.pythonSettings.linting.pylintEnabled;
3815
}
@@ -46,7 +23,7 @@ export class Linter extends baseLinter.BaseLinter {
4623
return new Promise<baseLinter.ILintMessage[]>((resolve, reject) => {
4724
this.run(pylintPath, pylintArgs.concat(['--msg-template=\'{line},{column},{category},{msg_id}:{msg}\'', '--reports=n', '--output-format=text', document.uri.fsPath]), document, this.workspaceRootPath, cancellation).then(messages => {
4825
messages.forEach(msg => {
49-
msg.severity = this.parseMessagesSeverity(msg.type);
26+
msg.severity = this.parseMessagesSeverity(msg.type, this.pythonSettings.linting.pylintCategorySeverity);
5027
});
5128

5229
resolve(messages);
Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
from third_party import lib0
2-
from third_party import lib1
3-
from third_party import lib2
4-
from third_party import lib3
5-
from third_party import lib4
6-
from third_party import lib5
7-
from third_party import lib6
8-
from third_party import lib7
9-
from third_party import lib8
10-
from third_party import lib9
1+
from third_party import (lib1, lib2, lib3,
2+
lib4, lib5, lib6,
3+
lib7, lib8, lib9)

0 commit comments

Comments
 (0)