Skip to content

Commit 393c0bb

Browse files
committed
fix #501
1 parent 6b3f197 commit 393c0bb

4 files changed

Lines changed: 45 additions & 12 deletions

File tree

package.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,17 @@
902902
"type": "string"
903903
}
904904
},
905+
"python.linting.ignorePatterns": {
906+
"type": "array",
907+
"description": "Patterns used to exclude files or folders from being linted.",
908+
"default": [
909+
".vscode/*.py",
910+
"**/site-packages/**/*.py"
911+
],
912+
"items": {
913+
"type": "string"
914+
}
915+
},
905916
"python.linting.pylamaEnabled": {
906917
"type": "boolean",
907918
"default": false,
@@ -971,6 +982,7 @@
971982
"fs-extra": "^0.30.0",
972983
"fuzzy": "^0.1.3",
973984
"line-by-line": "^0.1.5",
985+
"minimatch": "^3.0.3",
974986
"named-js-regexp": "^1.3.1",
975987
"node-static": "^0.7.9",
976988
"prepend-file": "^1.3.0",

src/client/common/configSettings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export interface IPylintCategorySeverity {
4545
}
4646
export interface ILintingSettings {
4747
enabled: boolean;
48+
ignorePatterns: string[];
4849
prospectorEnabled: boolean;
4950
prospectorArgs: string[];
5051
pylintEnabled: boolean;
@@ -155,6 +156,7 @@ export class PythonSettings extends EventEmitter implements IPythonSettings {
155156
// Support for travis
156157
this.linting = this.linting ? this.linting : {
157158
enabled: false,
159+
ignorePatterns: [],
158160
flake8Args: [], flake8Enabled: false, flake8Path: 'flake',
159161
lintOnSave: false, lintOnTextChange: false, maxNumberOfProblems: 100,
160162
mypyArgs: [], mypyEnabled: false, mypyPath: 'mypy',

src/client/linters/baseLinter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export abstract class BaseLinter {
7171
let diagnostics: ILintMessage[] = [];
7272
outputLines.filter((value, index) => index <= this.pythonSettings.linting.maxNumberOfProblems).forEach(line => {
7373
let match = matchNamedRegEx(line, regEx);
74-
if (match == null) {
74+
if (!match) {
7575
return;
7676
}
7777

src/client/providers/lintProvider.ts

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,16 @@ import * as settings from '../common/configSettings';
1414
import * as telemetryHelper from '../common/telemetry';
1515
import * as telemetryContracts from '../common/telemetryContracts';
1616
import * as fs from 'fs';
17+
import { LinterErrors } from '../common/constants';
18+
const Minimatch = require("minimatch").Minimatch;
1719

18-
import { LinterErrors } from '../common/constants'
1920
const lintSeverityToVSSeverity = new Map<linter.LintMessageSeverity, vscode.DiagnosticSeverity>();
20-
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Error, vscode.DiagnosticSeverity.Error)
21-
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Hint, vscode.DiagnosticSeverity.Hint)
22-
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Information, vscode.DiagnosticSeverity.Information)
23-
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Warning, vscode.DiagnosticSeverity.Warning)
21+
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Error, vscode.DiagnosticSeverity.Error);
22+
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Hint, vscode.DiagnosticSeverity.Hint);
23+
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Information, vscode.DiagnosticSeverity.Information);
24+
lintSeverityToVSSeverity.set(linter.LintMessageSeverity.Warning, vscode.DiagnosticSeverity.Warning);
2425

2526
function createDiagnostics(message: linter.ILintMessage, txtDocumentLines: string[]): vscode.Diagnostic {
26-
let sourceLine = txtDocumentLines[message.line - 1];
27-
let sourceStart = sourceLine.substring(message.column - 1);
2827
let endCol = txtDocumentLines[message.line - 1].length;
2928

3029
// try to get the first word from the startig position
@@ -51,17 +50,31 @@ export class LintProvider extends vscode.Disposable {
5150
private pendingLintings = new Map<string, vscode.CancellationTokenSource>();
5251
private outputChannel: vscode.OutputChannel;
5352
private context: vscode.ExtensionContext;
54-
53+
private disposables: vscode.Disposable[];
54+
private ignoreMinmatches: { match: (fname: string) => boolean }[];
5555
public constructor(context: vscode.ExtensionContext, outputChannel: vscode.OutputChannel,
5656
private workspaceRootPath: string, private documentHasJupyterCodeCells: DocumentHasJupyterCodeCells) {
5757
super(() => { });
5858
this.outputChannel = outputChannel;
5959
this.context = context;
6060
this.settings = settings.PythonSettings.getInstance();
61-
61+
this.disposables = [];
62+
this.ignoreMinmatches = [];
6263
this.initialize();
63-
}
6464

65+
this.disposables.push(vscode.workspace.onDidChangeConfiguration(this.onConfigChanged.bind(this)));
66+
}
67+
dispose() {
68+
this.disposables.forEach(d => d.dispose());
69+
}
70+
private onConfigChanged() {
71+
this.initializeGlobs();
72+
}
73+
private initializeGlobs() {
74+
this.ignoreMinmatches = settings.PythonSettings.getInstance().linting.ignorePatterns.map(pattern => {
75+
return new Minimatch(pattern);
76+
});
77+
}
6578
private isDocumentOpen(uri: vscode.Uri): boolean {
6679
return vscode.window.visibleTextEditors.some(editor => editor.document && editor.document.uri.fsPath === uri.fsPath);
6780
}
@@ -89,7 +102,7 @@ export class LintProvider extends vscode.Disposable {
89102
if (e.languageId !== 'python' || !this.settings.linting.enabled) {
90103
return;
91104
}
92-
if (!e.uri.path || (path.basename(e.uri.path) === e.uri.path && !fs.existsSync(e.uri.path))){
105+
if (!e.uri.path || (path.basename(e.uri.path) === e.uri.path && !fs.existsSync(e.uri.path))) {
93106
return;
94107
}
95108
this.lintDocument(e, e.uri, e.getText().split(/\r?\n/g), 100);
@@ -106,6 +119,7 @@ export class LintProvider extends vscode.Disposable {
106119
}
107120
});
108121
this.context.subscriptions.push(disposable);
122+
this.initializeGlobs();
109123
}
110124

111125
private lastTimeout: number;
@@ -123,6 +137,11 @@ export class LintProvider extends vscode.Disposable {
123137
}
124138

125139
private onLintDocument(document: vscode.TextDocument, documentUri: vscode.Uri, documentLines: string[]): void {
140+
// Check if we need to lint this document
141+
const relativeFileName = path.relative(vscode.workspace.rootPath, document.fileName);
142+
if (this.ignoreMinmatches.some(matcher => matcher.match(document.fileName) || matcher.match(relativeFileName))) {
143+
return;
144+
}
126145
if (this.pendingLintings.has(documentUri.fsPath)) {
127146
this.pendingLintings.get(documentUri.fsPath).cancel();
128147
this.pendingLintings.delete(documentUri.fsPath);

0 commit comments

Comments
 (0)