-
Notifications
You must be signed in to change notification settings - Fork 0
/
pigeon.js
99 lines (83 loc) · 2.49 KB
/
pigeon.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
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
const EventEmitter = require('events').EventEmitter;
const Module = require('module');
const Instrument = require('./lib/instrument');
const GlobalFunctions = require('./lib/global_functions');
const Visualizer = require('./lib/visualizer/visualizer');
const Logger = require('./lib/logger');
const Tracer = require('./lib/tracer');
const Code = require('./lib/code');
const JSONHandler = require('./lib/jsonhandler');
const path = require("path");
/**
* Az osztály, ami a folyamat elindításáért felelős
* @extends EventEmitter
*/
class Pigeon extends EventEmitter {
/**
* Verzió azonosító
* @type {string}
*/
version = 'pre-0.0.1';
/**
* Logolásért felelős osztály
* @type {Logger}
*/
logger = new Logger(process.stdout, process.stdout.write);
/**
* Követő metódusokért felelős osztály
* @type {Tracer}
*/
tracer = new Tracer(this);
instrument = new Instrument(this);
visualizer = new Visualizer(this);
constructor() {
super();
this.inject();
}
/**
* Forráskód injektálás végrehajtása
*/
inject() {
this.log(`-- pigeon ${this.version} --`);
this.log('kimeneti JSON fájlok létrehozása');
JSONHandler.createAllJSONFiles();
this.log('compile felülírása');
this.alterCompile();
this.setupGlobalFunctions();
}
/**
* Fordítás felülírása instrumentálás segítségével
*/
alterCompile() {
let self = this;
let original = Module.prototype._compile;
Module.prototype._compile = function(content, filename) {
let relativeFilename = path.relative( __dirname, filename ).replaceAll("\\", "/");
// Beágyazás
let code = new Code(content);
code.wrap();
// Instrumentálás
code.source = self.instrument.inject(relativeFilename, code);
// Megágyazás
code.unwrap();
// Eredeti működés megtartása
original.call(this, code.source, filename);
JSONHandler.calculateCombinedJSON();
}
}
/**
* Globális függvények beállítása
*/
setupGlobalFunctions() {
GlobalFunctions.setup(this);
}
/**
* Logolást végző metódus
*/
log() {
if (!this.logger) return;
this.logger.print('pigeon: ');
this.logger.write.apply(this.logger, arguments);
}
}
exports.default = new Pigeon();