1 | /**
|
2 | * @fileoverview The event generator for AST nodes.
|
3 | * @author Toru Nagashima
|
4 | */
|
5 |
|
6 | ;
|
7 |
|
8 | //------------------------------------------------------------------------------
|
9 | // Public Interface
|
10 | //------------------------------------------------------------------------------
|
11 |
|
12 | /**
|
13 | * The event generator for AST nodes.
|
14 | * This implements below interface.
|
15 | *
|
16 | * ```ts
|
17 | * interface EventGenerator {
|
18 | * emitter: EventEmitter;
|
19 | * enterNode(node: ASTNode): void;
|
20 | * leaveNode(node: ASTNode): void;
|
21 | * }
|
22 | * ```
|
23 | *
|
24 | * @param {EventEmitter} emitter - An event emitter which is the destination of events.
|
25 | * @returns {NodeEventGenerator} new instance.
|
26 | */
|
27 | function NodeEventGenerator(emitter) {
|
28 | this.emitter = emitter;
|
29 | }
|
30 |
|
31 | NodeEventGenerator.prototype = {
|
32 | constructor: NodeEventGenerator,
|
33 |
|
34 | /**
|
35 | * Emits an event of entering AST node.
|
36 | * @param {ASTNode} node - A node which was entered.
|
37 | * @returns {void}
|
38 | */
|
39 | enterNode: function enterNode(node) {
|
40 | this.emitter.emit(node.type, node);
|
41 | },
|
42 |
|
43 | /**
|
44 | * Emits an event of leaving AST node.
|
45 | * @param {ASTNode} node - A node which was left.
|
46 | * @returns {void}
|
47 | */
|
48 | leaveNode: function leaveNode(node) {
|
49 | this.emitter.emit(node.type + ":exit", node);
|
50 | }
|
51 | };
|
52 |
|
53 | module.exports = NodeEventGenerator;
|