Поиск по тексту - это как-то не элегантно :-)
Я для тех же целей когда-то вот такой скриптик нарисовал. Скрип строит перекрестные ссылки для всего AOT объекта (если вызван из статического метода, то только по данному методу) и для всех его предков (если объект - класс). Потом показывает сслыки в форме и фильтрует записи по названию-типу-предку выделенной переменной. Если выделения нет, то показывает все ссылки. Удобно тем, что можно быстро найти где переменная объявлена или инициализирована. Некоторый недостаток в том, что код статических методов тоже попадет в перекрестные ссылки и если названия переменных совпадут, то будут найдены лишние вхождения (при поиске по тексту естественно будет то же самое).
Наглядный пример: откройте в редакторе \Classes\InventUpd_Reservation\updateNow, выделите переменную movement и вызовите скрипт. Вхождения из \Classes\InventUpd_Reservation\updateReserveFromForm не будут относиться к выделенной переменной, но особых проблем не вызовут.
X++:
//Show cross-references, complete or filtered by selection, for a class and its super classes
#TreeNodeSysNodeType
void addIns_CrossReferencesSelected(Editor e)
{
xRefUpdateTmpReferences xTmpReferences = new xRefUpdateTmpReferences();
TreeNode currentNode = TreeNode::findNode(e.path());
SysDictClass sysDictClass;
Args formRunArgs;
FormRun formRun;
FormDataSource fds;
xRefTmpReferences refTable;
xRefName selectedText;
xRefPath currentNodePath;
int startLine = e.selectionStartLine();
int startCol = e.selectionStartCol();
int endCol = e.selectionEndCol();
;
if (e.selectionStartLine() == e.selectionEndLine() && startCol != endCol)
{
e.firstSelectedLine();
selectedText = strLRTrim(subStr(e.getLine(), e.selectionStartCol(), endCol-startCol));
}
currentNodePath = currentNode.treeNodePath();
if (currentNode.applObjectType() != UtilElementType::ClassStaticMethod &&
currentNode.applObjectType() != UtilElementType::TableStaticMethod)
{
while(! currentNode.AOTObjectNode())
{
currentNode = currentNode.AOTparent();
}
}
xTmpReferences.fillTmpxRefReferences(currentNode);
while (currentNode && currentNode.sysNodeType() == #NT_CLASS)
{
sysDictClass = new SysDictClass(new SysDictClass(currentNode.applObjectId()).extend());
currentNode = sysDictClass ? sysDictClass.treeNode() : null;
if (currentNode)
{
xTmpReferences.fillTmpxRefReferences(currentNode);
}
}
formRunArgs = new Args(formstr(xRefTmpReferences));
formRunArgs.parmObject(xTmpReferences);
formRun = classfactory.formRunClass(formRunArgs);
formRun.init();
if (selectedText)
{
refTable = xTmpReferences.allTmpxRefReferences();
select firstonly refTable
where refTable.line == startLine
&& refTable.Column == startCol
&& refTable.name == selectedText
&& refTable.Path == currentNodePath;
fds = formRun.dataSource();
fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, Kind)).value(queryValue(refTable.Kind));
fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, name)).value(queryValue(refTable.name));
fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, ParentName)).value(queryValue(refTable.ParentName));
formRun.design().caption(strfmt("Complete cross-reference for %1 '%2'", refTable.Kind, refTable.name));
}
formRun.run();
formRun.detach();
}