66 lines
1.2 KiB
JavaScript
66 lines
1.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
// eslint-disable-next-line no-var
|
||
|
var linter = (() => {
|
||
|
const lintingUpdatedListeners = [];
|
||
|
const unhookListeners = [];
|
||
|
const linters = [];
|
||
|
const cms = new Set();
|
||
|
|
||
|
return {
|
||
|
register,
|
||
|
run,
|
||
|
enableForEditor,
|
||
|
disableForEditor,
|
||
|
onLintingUpdated,
|
||
|
onUnhook
|
||
|
};
|
||
|
|
||
|
function onUnhook(cb) {
|
||
|
unhookListeners.push(cb);
|
||
|
}
|
||
|
|
||
|
function onLintingUpdated(cb) {
|
||
|
lintingUpdatedListeners.push(cb);
|
||
|
}
|
||
|
|
||
|
function onUpdateLinting(...args) {
|
||
|
for (const cb of lintingUpdatedListeners) {
|
||
|
cb(...args);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function enableForEditor(cm) {
|
||
|
cm.setOption('lint', {onUpdateLinting, getAnnotations});
|
||
|
cms.add(cm);
|
||
|
}
|
||
|
|
||
|
function disableForEditor(cm) {
|
||
|
cm.setOption('lint', false);
|
||
|
cms.delete(cm);
|
||
|
for (const cb of unhookListeners) {
|
||
|
cb(cm);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function register(linterFn) {
|
||
|
linters.push(linterFn);
|
||
|
}
|
||
|
|
||
|
function run() {
|
||
|
for (const cm of cms) {
|
||
|
cm.performLint();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAnnotations(...args) {
|
||
|
return Promise.all(linters.map(fn => fn(...args)))
|
||
|
.then(results => [].concat(...results.filter(Boolean)));
|
||
|
}
|
||
|
})();
|
||
|
|
||
|
// FIXME: this should be put inside edit.js
|
||
|
prefs.subscribe(['editor.linter'], () => {
|
||
|
linter.run();
|
||
|
});
|