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
 | 
						|
}
 |