-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathMyLinter.js
44 lines (39 loc) · 1.17 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
44
import { parse } from "esprima";
import { traverse } from "estraverse";
import { EventEmitter } from "events";
class RuleContext extends EventEmitter {
report({ message }) {
this.emit("report", message);
}
}
export default class MyLinter {
constructor() {
this._emitter = new EventEmitter();
this._ruleContext = new RuleContext();
}
loadRule(rule) {
const ruleExports = rule.create(this._ruleContext);
// on(nodeType, nodeTypeCallback);
Object.keys(ruleExports).forEach(nodeType => {
this._emitter.on(nodeType, ruleExports[nodeType]);
});
}
lint(code) {
const messages = [];
const addMessage = (message) => {
messages.push(message);
};
this._ruleContext.on("report", addMessage);
const 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;
}
}