Skip to content

Commit 19b89ae

Browse files
committed
Add support for tracking a function's scope level
1 parent 75a3be0 commit 19b89ae

7 files changed

Lines changed: 31 additions & 10 deletions

File tree

lib/node_modules/@stdlib/_tools/js/program-summary/lib/analyze.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ var type2key = require( './type2key.js' );
2626
* @param {Node} ast - AST node
2727
* @param {string} src - source code
2828
* @param {StringArray} lines - source code lines
29+
* @param {NonNegativeInteger} level - recursion level
2930
* @param {Options} opts - parse options
3031
* @returns {Object} results
3132
*/
32-
function analyze( results, ast, src, lines, opts ) {
33+
function analyze( results, ast, src, lines, level, opts ) {
3334
var nodes;
3435
var node;
3536
var type;
@@ -45,7 +46,8 @@ function analyze( results, ast, src, lines, opts ) {
4546
results.lines += ast.loc.end.line - ast.loc.start.line + 1;
4647

4748
// Flatten the AST:
48-
nodes = flatten( ( ast.type !== 'Program' && ast.body ) ? ast.body : ast );
49+
node = ( ast.type !== 'Program' && ast.body ) ? ast.body : ast;
50+
nodes = flatten( node, level );
4951

5052
// Calculate the number of source lines of codes (SLOC):
5153
results.sloc += sloc( nodes );
@@ -59,6 +61,9 @@ function analyze( results, ast, src, lines, opts ) {
5961
// Tabulate AST node occurrences:
6062
results = tabulate( results, nodes );
6163

64+
// Increment the recursion level:
65+
level += 1;
66+
6267
// Recursively analyze AST nodes:
6368
for ( i = 0; i < nodes.length; i++ ) {
6469
node = nodes[ i ];
@@ -82,13 +87,14 @@ function analyze( results, ast, src, lines, opts ) {
8287

8388
// Analyze the AST:
8489
key = type2key( type );
85-
res = analyze( res, ast, str, lines, opts );
90+
res = analyze( res, ast, str, lines, level, opts );
8691

8792
// Include results specific to particular AST nodes:
8893
if ( type === 'SwitchStatement' ) {
8994
res.case = node.cases.length;
9095
} else if ( type === 'FunctionDeclaration' ) {
9196
res.params = node.params.length;
97+
res.level = node.__scope_level__; // eslint-disable-line no-underscore-dangle
9298
}
9399
// Cache the sub-tree results:
94100
results[ key ].data.push( res );

lib/node_modules/@stdlib/_tools/js/program-summary/lib/flatten.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ var types = require( './node_types.js' );
1414
*
1515
* @private
1616
* @param {Node} ast - AST node
17+
* @param {NonNegativeInteger} level - recursion level
1718
* @returns {Array} flattened AST
1819
*/
19-
function flatten( ast ) {
20+
function flatten( ast, level ) {
2021
var out = [];
2122
walk( ast, visit );
2223
return out;
@@ -29,8 +30,18 @@ function flatten( ast ) {
2930
* @param {*} state - state
3031
* @param {Array<Node>} ancestors - ancestor nodes
3132
*/
32-
function visit( node ) {
33+
function visit( node, state, ancestors ) {
34+
var i;
3335
if ( node !== ast && contains( types, node.type ) ) {
36+
// For functions, track the function scope (i.e., level of function nesting):
37+
if ( node.type === 'FunctionDeclaration' ) {
38+
node.__scope_level__ = level; // eslint-disable-line no-underscore-dangle
39+
for ( i = 0; i < ancestors.length-1; i++ ) {
40+
if ( ancestors[ i ].type === 'FunctionDeclaration' ) {
41+
node.__scope_level__ += 1; // eslint-disable-line no-underscore-dangle
42+
}
43+
}
44+
}
3445
out.push( node );
3546
}
3647
} // end FUNCTION visit()

lib/node_modules/@stdlib/_tools/js/program-summary/lib/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ function summary( input ) {
5252
ast = parse( input, opts );
5353

5454
// Analyze the AST:
55-
results = analyze( results, ast, input, lines, opts );
55+
results = analyze( results, ast, input, lines, 0, opts );
5656

5757
// Return the summary results:
5858
return results;

lib/node_modules/@stdlib/_tools/js/program-summary/test/fixtures/1.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,8 @@
12131213
"count": 0,
12141214
"data": []
12151215
},
1216-
"params": 2
1216+
"params": 2,
1217+
"level": 0
12171218
}
12181219
]
12191220
}

lib/node_modules/@stdlib/_tools/js/program-summary/test/fixtures/2.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,8 @@
935935
"count": 0,
936936
"data": []
937937
},
938-
"params": 2
938+
"params": 2,
939+
"level": 0
939940
}
940941
]
941942
}

lib/node_modules/@stdlib/_tools/js/program-summary/test/fixtures/empty_function_declaration.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@
129129
"count": 0,
130130
"data": []
131131
},
132-
"params": 0
132+
"params": 0,
133+
"level": 0
133134
}
134135
]
135136
}

lib/node_modules/@stdlib/_tools/js/program-summary/test/fixtures/function_declaration.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@
129129
"count": 0,
130130
"data": []
131131
},
132-
"params": 2
132+
"params": 2,
133+
"level": 0
133134
}
134135
]
135136
}

0 commit comments

Comments
 (0)