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