* @param {function} traverse * @param {object} node * @param {array} path * @param {object} state
(traverse, node, path, state)
| 14035 | * @param {object} state |
| 14036 | */ |
| 14037 | function visitSuperCallExpression(traverse, node, path, state) { |
| 14038 | var superClassName = state.superClass.name; |
| 14039 | |
| 14040 | if (node.callee.type === Syntax.Identifier) { |
| 14041 | if (_isConstructorMethod(state.methodNode)) { |
| 14042 | utils.append(superClassName + '.call(', state); |
| 14043 | } else { |
| 14044 | var protoProp = SUPER_PROTO_IDENT_PREFIX + superClassName; |
| 14045 | if (state.methodNode.key.type === Syntax.Identifier) { |
| 14046 | protoProp += '.' + state.methodNode.key.name; |
| 14047 | } else if (state.methodNode.key.type === Syntax.Literal) { |
| 14048 | protoProp += '[' + JSON.stringify(state.methodNode.key.value) + ']'; |
| 14049 | } |
| 14050 | utils.append(protoProp + ".call(", state); |
| 14051 | } |
| 14052 | utils.move(node.callee.range[1], state); |
| 14053 | } else if (node.callee.type === Syntax.MemberExpression) { |
| 14054 | utils.append(SUPER_PROTO_IDENT_PREFIX + superClassName, state); |
| 14055 | utils.move(node.callee.object.range[1], state); |
| 14056 | |
| 14057 | if (node.callee.computed) { |
| 14058 | // ["a" + "b"] |
| 14059 | utils.catchup(node.callee.property.range[1] + ']'.length, state); |
| 14060 | } else { |
| 14061 | // .ab |
| 14062 | utils.append('.' + node.callee.property.name, state); |
| 14063 | } |
| 14064 | |
| 14065 | utils.append('.call(', state); |
| 14066 | utils.move(node.callee.range[1], state); |
| 14067 | } |
| 14068 | |
| 14069 | utils.append('this', state); |
| 14070 | if (node.arguments.length > 0) { |
| 14071 | utils.append(',', state); |
| 14072 | utils.catchupWhiteSpace(node.arguments[0].range[0], state); |
| 14073 | traverse(node.arguments, path, state); |
| 14074 | } |
| 14075 | |
| 14076 | utils.catchupWhiteSpace(node.range[1], state); |
| 14077 | utils.append(')', state); |
| 14078 | return false; |
| 14079 | } |
| 14080 | visitSuperCallExpression.test = function(node, path, state) { |
| 14081 | if (state.superClass && node.type === Syntax.CallExpression) { |
| 14082 | var callee = node.callee; |
nothing calls this directly
no test coverage detected