2016-11-26 43 views
1

我正在寫調試工具,我想清楚我在哪裏。我的理想的輸出會寫的類名和函數名到控制檯,像這樣:如果我給你一個函數的參考,你可以得到函數的名字?

Vehicle.addWheels() 
    Wheels were added by the user 

,並在代碼中這將是一個功能,如:

trace(addWheels, "Wheels were added by the user"); 

我想編寫自定義功能這得到像這樣(僞代碼)的詳細信息:

public static myTrace(function:Function, message:String):void { 
    var className:String = function.parent; 
    var functionName:String = getQualifiedName(function.prototype); 
    trace(className + "." + functionName + ": " + message); 
} 

這是一個AS3的例子,但AS3是基於JavaScript的,所以如果它工作在Javascript可以在ActionScript工作。

如果這不起作用,我可以輕鬆地使用第三個參數傳入類的引用,但仍然需要知道如何獲取函數的名稱。

public static myTrace(object:Object, function:Function, message:String):void { 
    var className:String = getQualifiedName(object); 
    var functionName:String = getQualifiedName(function.prototype); 
    trace(className + "." + functionName + ": " + message); 
} 
+1

我希望它的幫助http://stackoverflow.com/questions/4731935/actionscript-obtain-the-name-of-the-current-function –

+0

這有益於@payamsbr謝謝! –

回答

0

如果我使用error.getStackTrace()我可以用下面的方法來獲取當前類,方法,文件,文檔文件的路徑和行號的名稱。文檔,文件路徑和行號在發佈版本中不可用。這隻適用於FP 11.4之後的發佈版本。

protected function drawLayer_clickHandler(event:MouseEvent):void 
{ 
    var stack:Array = getStackArray(); 
    var object:Object = getCurrentLocation(); 
    var className:Object = getCurrentClassName(); 
    var functionName:Object = getCurrentFunctionName(); 

} 

protected static function getStackTrace(removeLines:Boolean = true):String { 
    var error:Error = new Error(); 
    var value:String; 
    var stackTrace:Array; 

    if ("getStackTrace" in error) { 
     value = error.getStackTrace(); 
     value = value.replace(/\t/g, ""); 
     if (removeLines) { 
      value = value.replace(/\[.*\]/g, ""); 
      value = value.replace(/.*?::/g, ""); 
     } 
     stackTrace = value.split("\n"); 
     stackTrace.shift(); 
     stackTrace.shift(); 
     return stackTrace.join("\n"); 
    } 

    return null; 
} 

protected static function getCurrentClassName():String { 
    var object:Object = getCurrentLocation(2); 
    var className:String = object ? object.className: null; 

    return className; 
} 

protected static function getCurrentFunctionName():String { 
    var object:Object = getCurrentLocation(2); 
    var functionName:String = object ? object.functionName: null; 

    return functionName; 
} 

public static function getCurrentLocation(offset:int = 1):Object { 
    var stack:Array = getStackArray(1, offset); 
    var object:Object = stack && stack.length ? stack[0] : null; 

    return object; 
} 

protected static function getStackArray(results:int = 0, offset:int = 0):Array { 
    var error:Error = new Error(); 
    var value:String; 
    var stackTrace:Array; 
    var object:Object; 
    var className:String; 
    var functionName:String; 
    var fileLocation:String; 
    var lineNumber:String; 
    var message:String; 
    var components:Object; 
    var matchPattern:RegExp; 
    var path:String; 
    var stack:Array; 
    var locations:Array; 

    matchPattern = /^at\s(.+?)\(\)\[(.*?):(.*)]/; 

    if ("getStackTrace" in error) { 
     value = error.getStackTrace(); 
     value = value.replace(/\t/g, ""); 
     //value = value.replace(/\[.*\]/g, ""); 
     //value = value.replace(/.*?::/g, ""); 
     stackTrace = value.split("\n"); 
     stackTrace.shift();// removes Error at 
     stackTrace.shift(); // removes this function 

     for (; offset >0 && stackTrace.length; offset--) { 
      stackTrace.shift(); 
     } 

     stack = []; 

     for (var i:int = 0; i < stackTrace.length; i++) { 
      object = {}; 
      message = stackTrace[i]; 
      components = message.match(matchPattern); 

      // matches 
      // "at TransformTests/drawLayer_clickHandler()[/Documents/Project/src/TransformTests.mxml:244]" 
      if (components) { 
       locations = components[1].split(/[\\|\/]/); 

       // class and method 
       if (locations.length>1) { 
        object.className = locations[0]; 
        object.functionName = locations[1]; 
       } 
       // global method - has no class 
       else if (locations.length) { 
        object.functionName = locations[0]; 
       } 

       path = components[2]; 

       object.location = path; 
       object.document = path ? path.split(/[\\|\/]/).pop() : null; 
       object.lineNumber = components[3]; 
       stack.push(object); 
      } 
      else { 
       // matches "at Transform/drawLayer_clickHandler()" or "at drawLayer_clickHandler()" 
       components = message.match(/^at\s(.*)\(\)/); 

       // runtime has no file path or line number 
       if (components) { 
        path = components[1]; 
        locations = path.split(/[\\|\/]/); 

        // class and method 
        if (locations.length>1) { 
         object.className = locations[0]; 
         object.functionName = locations[1]; 
        } 
        // global method - no class 
        else if (locations.length) { 
         object.functionName = locations[0]; 
        } 

        stack.push(object); 
       } 

      } 

      if (results==i+1) { 
       break; 
      } 
     } 

     return stack; 
    } 

    return null; 
} 

我增加了一些全球性功能,讓在github庫信息。深港西部通道添加到您的類,你可以調用任何下列方法之一:

log(); 
log("message"); 
logTarget(object, "message"); 
getCurrentClassName(); 
getCurrentFunctionName(); 
getCurrentLocation(); 
getStackArray(); 

的getCurrentLocation()返回一個包含類名,方法名對象,如果在內容調試器中運行返回文檔,文檔路徑和行號。

相關問題