-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdependencies.js
68 lines (57 loc) · 1.94 KB
/
dependencies.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
/*
* Dependency graph generator for FoxScheme
*
* Usage: rhino dependencies.js src/system/*.js > dependencies.dot
* dot dependencies.dot
*
* This script analyzes the JavaScript source files passed in as arguments, and
* generates a graph of which FoxScheme classes refer to which. This script
* assumes a few conventions about the FoxScheme source:
* * Class declarations start at the beginning of the line, and each class is
* only one step down from FoxScheme:
* i.e. /^FoxScheme.\w+/
* * Comments occupy their own line, so lines containing " * " or "// " are
* skipped
* * The source for a class immediately follows that class's declaration in a
* contiguous block until the next declaration
*
* JavaScript object properties are abused to avoid printing duplicate edges
*/
var nodes = []
var edges = {} // fake hash
var declRegex = /^(FoxScheme\.\w+) =/
var classRegex = /FoxScheme\.\w+/g
for(var i = 0; i < arguments.length; i++) {
var file = java.io.File(arguments[i])
var br = java.io.BufferedReader(java.io.FileReader(file))
var currentClass = null
var line
var results
while((line = br.readLine()) !== null) {
// see if a new class is declared
if((results = declRegex(line)) !== null) {
currentClass = results[1]
nodes.push(currentClass)
continue;
}
if(currentClass === null)
continue;
// avoid commented-out things
if(line.indexOf(" * ") !== -1 ||
line.indexOf("// ") !== -1)
continue;
while((results = classRegex(line)) !== null) {
if(results[0] !== currentClass)
// set fakehash's key
edges[['"',currentClass,'" -> "',results[0],'"'].join("")] = true
}
}
}
print("digraph FoxScheme {")
for(var i in nodes) {
print(['"',nodes[i],'"'].join(""))
}
for(var i in edges) {
print(i)
}
print("}")