| /*! |
| * depd |
| * Copyright(c) 2014 Douglas Christopher Wilson |
| * MIT Licensed |
| */ |
| |
| 'use strict' |
| |
| /** |
| * Module exports. |
| */ |
| |
| module.exports = callSiteToString |
| |
| /** |
| * Format a CallSite file location to a string. |
| */ |
| |
| function callSiteFileLocation (callSite) { |
| var fileName |
| var fileLocation = '' |
| |
| if (callSite.isNative()) { |
| fileLocation = 'native' |
| } else if (callSite.isEval()) { |
| fileName = callSite.getScriptNameOrSourceURL() |
| if (!fileName) { |
| fileLocation = callSite.getEvalOrigin() |
| } |
| } else { |
| fileName = callSite.getFileName() |
| } |
| |
| if (fileName) { |
| fileLocation += fileName |
| |
| var lineNumber = callSite.getLineNumber() |
| if (lineNumber != null) { |
| fileLocation += ':' + lineNumber |
| |
| var columnNumber = callSite.getColumnNumber() |
| if (columnNumber) { |
| fileLocation += ':' + columnNumber |
| } |
| } |
| } |
| |
| return fileLocation || 'unknown source' |
| } |
| |
| /** |
| * Format a CallSite to a string. |
| */ |
| |
| function callSiteToString (callSite) { |
| var addSuffix = true |
| var fileLocation = callSiteFileLocation(callSite) |
| var functionName = callSite.getFunctionName() |
| var isConstructor = callSite.isConstructor() |
| var isMethodCall = !(callSite.isToplevel() || isConstructor) |
| var line = '' |
| |
| if (isMethodCall) { |
| var methodName = callSite.getMethodName() |
| var typeName = getConstructorName(callSite) |
| |
| if (functionName) { |
| if (typeName && functionName.indexOf(typeName) !== 0) { |
| line += typeName + '.' |
| } |
| |
| line += functionName |
| |
| if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) { |
| line += ' [as ' + methodName + ']' |
| } |
| } else { |
| line += typeName + '.' + (methodName || '<anonymous>') |
| } |
| } else if (isConstructor) { |
| line += 'new ' + (functionName || '<anonymous>') |
| } else if (functionName) { |
| line += functionName |
| } else { |
| addSuffix = false |
| line += fileLocation |
| } |
| |
| if (addSuffix) { |
| line += ' (' + fileLocation + ')' |
| } |
| |
| return line |
| } |
| |
| /** |
| * Get constructor name of reviver. |
| */ |
| |
| function getConstructorName (obj) { |
| var receiver = obj.receiver |
| return (receiver.constructor && receiver.constructor.name) || null |
| } |