diff --git a/test/fixtures/stack-trace-analyzer/call-expression-of-object-member.js b/test/fixtures/stack-trace-analyzer/call-expression-of-object-member.js index 9e9a1c0e..01a8e837 100644 --- a/test/fixtures/stack-trace-analyzer/call-expression-of-object-member.js +++ b/test/fixtures/stack-trace-analyzer/call-expression-of-object-member.js @@ -5,6 +5,22 @@ var object = { } }, + bar: function () { + function inner () { + + } + + inner(); + } +}; + +var object1 = { + foo: { + baz: function () { + + } + }, + bar: function () { function inner1 () { @@ -14,6 +30,8 @@ var object = { } }; -object.foo.baz(); -object['foo'].baz(); +object1.foo.baz(); +object1['foo'].baz(); +object1.bar(); + object.bar(); diff --git a/test/fixtures/stack-trace-analyzer/no-recursion.js b/test/fixtures/stack-trace-analyzer/no-recursion.js new file mode 100644 index 00000000..b693ef3d --- /dev/null +++ b/test/fixtures/stack-trace-analyzer/no-recursion.js @@ -0,0 +1,4 @@ +var bar = function () { +}; + +bar(); \ No newline at end of file diff --git a/test/functional-tests/stack-trace-analyzer/StackTraceAnalyzer.spec.ts b/test/functional-tests/stack-trace-analyzer/StackTraceAnalyzer.spec.ts index 52a6349a..3e4643ef 100644 --- a/test/functional-tests/stack-trace-analyzer/StackTraceAnalyzer.spec.ts +++ b/test/functional-tests/stack-trace-analyzer/StackTraceAnalyzer.spec.ts @@ -66,32 +66,6 @@ function getFunctionExpressionByName (astTree: ESTree.Node, name: string): ESTre return functionExpressionNode; } -/** - * @param astTree - * @param name - * @returns {ESTree.FunctionExpression|null} - */ -function getObjectFunctionExpressionByName (astTree: ESTree.Node, name: string): ESTree.FunctionExpression|null { - let functionExpressionNode: ESTree.FunctionExpression|null = null; - - estraverse.traverse(astTree, { - enter: (node: ESTree.Node): any => { - if ( - Nodes.isPropertyNode(node) && - Nodes.isFunctionExpressionNode(node.value) && - Nodes.isIdentifierNode(node.key) && - node.key.name === name - ) { - functionExpressionNode = node.value; - - return estraverse.VisitorOption.Break; - } - } - }); - - return functionExpressionNode; -} - /** * @param astTree * @param id @@ -118,6 +92,54 @@ function getFunctionExpressionById (astTree: ESTree.Node, id: string): ESTree.Fu return functionExpressionNode; } +/** + * @param astTree + * @param objectName + * @param name + * @returns {ESTree.FunctionExpression|null} + */ +function getObjectFunctionExpressionByName (astTree: ESTree.Node, objectName: string, name: string): ESTree.FunctionExpression|null { + let functionExpressionNode: ESTree.FunctionExpression|null = null, + targetObjectExpressionNode: ESTree.ObjectExpression|null = null; + + estraverse.traverse(astTree, { + enter: (node: ESTree.Node): any => { + if ( + Nodes.isVariableDeclaratorNode(node) && + Nodes.isIdentifierNode(node.id) && + node.init && + Nodes.isObjectExpressionNode(node.init) && + node.id.name === objectName + ) { + targetObjectExpressionNode = node.init; + + return estraverse.VisitorOption.Break; + } + } + }); + + if (!targetObjectExpressionNode) { + return null; + } + + estraverse.traverse(targetObjectExpressionNode, { + enter: (node: ESTree.Node): any => { + if ( + Nodes.isPropertyNode(node) && + Nodes.isFunctionExpressionNode(node.value) && + Nodes.isIdentifierNode(node.key) && + node.key.name === name + ) { + functionExpressionNode = node.value; + + return estraverse.VisitorOption.Break; + } + } + }); + + return functionExpressionNode; +} + describe('StackTraceAnalyzer', () => { describe('extract (): IStackTraceData[]', () => { let astTree: TNodeWithBlockStatement, @@ -268,17 +290,17 @@ describe('StackTraceAnalyzer', () => { expectedStackTraceData = [ { name: 'baz', - callee: (getObjectFunctionExpressionByName(astTree, 'baz')).body, + callee: (getObjectFunctionExpressionByName(astTree, 'object1', 'baz')).body, stackTrace: [] }, { name: 'baz', - callee: (getObjectFunctionExpressionByName(astTree, 'baz')).body, + callee: (getObjectFunctionExpressionByName(astTree, 'object1', 'baz')).body, stackTrace: [] }, { name: 'bar', - callee: (getObjectFunctionExpressionByName(astTree, 'bar')).body, + callee: (getObjectFunctionExpressionByName(astTree, 'object1', 'bar')).body, stackTrace: [ { name: 'inner1', @@ -289,6 +311,19 @@ describe('StackTraceAnalyzer', () => { }, ] }, + { + name: 'bar', + callee: (getObjectFunctionExpressionByName(astTree, 'object', 'bar')).body, + stackTrace: [ + { + name: 'inner', + callee: (getFunctionDeclarationByName(astTree, 'inner')).body, + stackTrace: [ + + ] + }, + ] + } ]; stackTraceData = new StackTraceAnalyzer(astTree.body).analyze(); @@ -352,5 +387,24 @@ describe('StackTraceAnalyzer', () => { assert.deepEqual(stackTraceData, expectedStackTraceData); }); + + it('should returns correct BlockScopeTraceData - variant #9: no recursion', () => { + astTree = NodeUtils.convertCodeToStructure( + readFileAsString('./test/fixtures/stack-trace-analyzer/no-recursion.js'), + false + ); + + expectedStackTraceData = [ + { + name: 'bar', + callee: (getFunctionExpressionByName(astTree, 'bar')).body, + stackTrace: [] + } + ]; + + stackTraceData = new StackTraceAnalyzer(astTree.body).analyze(); + + assert.deepEqual(stackTraceData, expectedStackTraceData); + }); }); });