You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.2 KiB
JavaScript
104 lines
2.2 KiB
JavaScript
/*!
|
|
* 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
|
|
}
|