Автоматическое извлечение интерфейса в редакторе кода AX2012 X++
Есть ли в редакторе X++ функция, позволяющая автоматически извлекать интерфейс после реализации?
Аналогично, в Visual Studio есть такая функция, которая автоматически извлекает реализованный интерфейс, предоставляя заглушки методов для всех методов, необходимых для реализации интерфейса.
1 ответ
Решение
Нет, такой функции нет.
Но вы можете написать один. Смотрите пример кода ниже. И добавить Action menu item
в \Menus\SysContextMenu
,
В качестве альтернативы вы можете добавить метод \Classes\EditorScripts
public static void main(Args _args)
{
#macrolib.AOT
SysContextMenuAOT menuAot;
TreeNode tn;
DictClass dc;
DictMethod dm;
int i, j;
str dmName;
str intSrc, intParams;
TreeNode itnRoot, itnChild;
if (!SysContextMenu::startedFrom(_args))
{
throw error(Error::wrongUseOfFunction(funcName()));
}
menuAot = _args.parmObject();
tn = menuAot.getFirstNode();
dc = new DictClass(className2Id(tn.AOTname()));
if (!dc)
{
throw error(Error::wrongUseOfFunction(funcName()));
}
for (i = 1; i <= dc.objectMethodCnt(); i++)
{
dm = dc.objectMethodObject(i);
dmName = dm.name();
if (dm.isStatic()
|| dm.isDelegate()
|| dm.accessSpecifier() != AccessSpecifier::public
|| dm.name() == identifierStr(classDeclaration)
)
{
continue;
}
if (!itnRoot)
{
itnRoot = TreeNode::findNode(#ClassesPath).AOTadd("I" + dc.name());
itnRoot.AOTsave();
itnChild = itnRoot.AOTfirstChild();
itnChild.AOTsetSource(strFmt('public interface I%1\n{\n}', dc.name()));
}
itnChild = itnRoot.AOTadd(dm.name());
intParams = '';
for (j = 1; j <= dm.parameterCnt(); j++)
{
if (j > 1)
{
intParams+= ', ';
}
intParams+= strFmt('%1 %2', extendedTypeId2DisplayName(dm.parameterType(j), dm.parameterId(j)), dm.parameterName(j));
}
intSrc = strFmt('public %1 %2(%3)\n{\n}', extendedTypeId2DisplayName(dm.returnType(), dm.returnId()), dm.name(), intParams);
itnChild.AOTsetSource(intSrc);
}
if (itnRoot)
{
itnRoot.AOTcompile();
itnRoot.AOTrestore();
itnRoot.AOTnewWindow();
itnRoot.AOTedit();
}
}