forked from rubyide/vscode-ruby
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathruby.js
More file actions
75 lines (67 loc) · 2.56 KB
/
ruby.js
File metadata and controls
75 lines (67 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"use strict";
let vscode = require('vscode');
let linters = require('./lint/lint');
const severities = {
refactor: vscode.DiagnosticSeverity.Hint,
convention: vscode.DiagnosticSeverity.Information,
info: vscode.DiagnosticSeverity.Information,
warning: vscode.DiagnosticSeverity.Warning,
error: vscode.DiagnosticSeverity.Error,
fatal: vscode.DiagnosticSeverity.Error
};
let timer;
function deferReport(uri, lint, diagnostic) {
if (lint.error) {
console.log("Linter error:", lint.source, lint.error);
return;
}
if ((!lint.result || !lint.result.length) && (!lint.lintError || !lint.lintError.length)) return;
let allOf = lint.result.concat(lint.lintError)
.map(offense => {
let tail = offense.location.column + offense.location.length;
let d = new vscode.Diagnostic(new vscode.Range(
offense.location.line - 1, offense.location.column - 1,
offense.location.line - 1, tail - 1),
offense.message, severities[offense.severity] || vscode.DiagnosticSeverity.Error);
d.source = offense.cop_name || lint.linter;
return d;
});
diagnostic.set(uri, allOf);
}
function activate(context) {
let activeLinters = {};
let linterTimers = {};
let activeDiagnostics = {};
function changeTrigger(changed) {
timer = process.hrtime();
if (!changed || !changed.document) return;
if (changed.document.languageId !== 'ruby') return;
const doc = changed.document;
let lintConfig = vscode.workspace.getConfiguration("ruby.lint");
if (lintConfig) {
clearTimeout(linterTimers[doc.fileName]);
if (activeLinters[doc.fileName]) {
try {
activeLinters[doc.fileName].send('stop');
} catch (e) {}
delete activeLinters[doc.fileName];
}
linterTimers[doc.fileName] = setTimeout(() => {
activeLinters[doc.fileName] = linters.runCollection(lintConfig, doc.fileName, doc.getText(), result => {
if (!activeDiagnostics[result.linter]){
activeDiagnostics[result.linter] = vscode.languages.createDiagnosticCollection(result.linter);
context.subscriptions.push(activeDiagnostics[result.linter]);
}
activeDiagnostics[result.linter].delete(doc.uri);
deferReport(doc.uri, result, activeDiagnostics[result.linter]);
});
}, 200);
}
}
context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(changeTrigger));
context.subscriptions.push(vscode.workspace.onDidChangeTextDocument(changeTrigger));
context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(
() => vscode.window.visibleTextEditors.forEach(changeTrigger)));
vscode.window.visibleTextEditors.forEach(changeTrigger);
}
exports.activate = activate;