Editor scripts OpenOverriddenMethodDef

Purpose
Navigate to the definition of a method that overrides the currently open method in a descendent class

Description

 * This is a nice script that will be very helpful to AX developers often exploring the class heirarchy when debugging, etc. You will need to navigate to the AOT less, which, generally, speeds up things
 * In case there is more than one overridden method found, a listview with the possible choices is shown, where the developer can select the needed class.
 * 2 versions of the code are provided, one of which uses cross references information, and the other - Dictionary class. The xRef version is generally faster.

Dynamics AX versions
Has been tested on Dynamics AX 3.0 SP3, Dynamics AX 4.0 SP1 and Dynamics AX 2009

Code
Simply create a new method in class EditorScripts and paste the following code into it. (Check out the other 2 verions here: Talk:Editor_scripts_OpenOverriddenMethodDef) /// /// Editor_Scripts_OpenOverriddenMethodDef_ikash, 2008-08-12 /// Navigate to the definition of a method that overrides the currently open method in a descendent class /// /// Currenty open editor public void addIns_OpenOverriddenMethodDef(Editor e) { #define.AOTDelimiter('\\') #AOT TreeNode       treeNode = TreeNode::findNode(e.path); TreeNode       treeNodeParent; ClassId        classIdParent; TreeNodeName   methodName = treeNode.treeNodeName; Map            descendents; MapEnumerator  descendentsEnumerator; Counter        descendentsCount;

xRefTypeHierarchy xRefTypeHierarchy_find(Types _baseType, int _id) {       xRefTypeHierarchy xRefTypeHierarchy;

select firstonly xRefTypeHierarchy index BaseTypeIdIdx where xRefTypeHierarchy.BaseType == _baseType && xRefTypeHierarchy.Id == _id;

return xRefTypeHierarchy; }

xRefTypeHierarchy xRefTypeHierarchy_findOrCreate(Types _baseType, int _id) {       xRefTypeHierarchy xRefTypeHierarchy = xRefTypeHierarchy_find(_baseType, _id);

if (!xRefTypeHierarchy) {           new xRefUpdateTypeHierarchy.run; xRefTypeHierarchy = xRefTypeHierarchy_find(_baseType, _id); }

return xRefTypeHierarchy; }

void findDescendents(ClassId _parentId) {       xRefTypeHierarchy   typeHierarchy; TreeNode           descendent; ;       if (!xRefTypeHierarchy_findOrCreate(Types::Class, _parentId).Children) return;

while select typeHierarchy where typeHierarchy.Parent == _parentId && typeHierarchy.BaseType == Types::Class

{           descendentsCount++; descendent = TreeNode::findNode(#ClassesPath + #AOTDelimiter + typeHierarchy.Name + #AOTDelimiter + methodName); if (descendent) descendents.insert(descendent.treeNodePath, descendent.AOTparent.treeNodeName);

if (typeHierarchy.Children && typeHierarchy.Id) findDescendents(typeHierarchy.Id); }   }    ;    if (subStr(treeNode.treeNodePath, 1, strLen(#ClassesPath)) == #ClassesPath) {       treeNodeParent = TreeNode::findNode(xUtilElements::getNodePathRough(xUtilElements::parentElement(xUtilElements::findTreeNode(treeNode)))); classIdParent = className2Id(treeNodeParent.treeNodeName); descendents = new Map(Types::String, Types::String); findDescendents(classIdParent);

switch (descendents.elements) {           case 0: info(strFmt(@"The method '%1' is not overridden in any of the %2 descendent classes", methodName, descendentsCount)); break; case 1: descendentsEnumerator = descendents.getEnumerator; if (descendentsEnumerator.moveNext) treeNode = TreeNode::findNode(descendentsEnumerator.currentKey); break; default: treeNode = TreeNode::findNode(pickList(descendents, "@SYS24724", @"Pick required class to go to method definition")); }       if (treeNode && SysTreeNode::hasSource(treeNode)) treeNode.AOTedit; } }

Used in
Editor scripts

Externdal Links
Original blog post about this script