-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathMyLinter.js
43 lines (40 loc) · 1.16 KB
/
MyLinter.js
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
"use strict";
import {parse} from "esprima";
import {traverse} from "estraverse";
import {EventEmitter} from "events";
class RuleContext extends EventEmitter {
report(node, message) {
this.emit("report", message);
}
}
export default class MyLinter {
constructor() {
this._emitter = new EventEmitter();
this._ruleContext = new RuleContext();
}
loadRule(rule) {
var ruleExports = rule(this._ruleContext);
// on(nodeType, nodeTypeCallback);
Object.keys(ruleExports).forEach(nodeType => {
this._emitter.on(nodeType, ruleExports[nodeType]);
});
}
lint(code) {
var messages = [];
var addMessage = (message)=> {
messages.push(message);
};
this._ruleContext.on("report", addMessage);
var ast = parse(code);
traverse(ast, {
enter: (node) => {
this._emitter.emit(node.type, node);
},
leave: (node) => {
this._emitter.emit(`${node.type}:exit`, node);
}
});
this._ruleContext.removeListener("report", addMessage);
return messages;
}
}