Интерфейс автоматического извлечения в редакторе кода AX2012 X++

Есть ли в редакторе X++ функция, позволяющая автоматически извлекать интерфейс после реализации?

Точно так же в Visual Studio есть такая функция, которая автоматически извлекает реализованный интерфейс, предоставляя заглушки методов для всех методов, необходимых для реализации интерфейса.


person Stef    schedule 08.04.2017    source источник


Ответы (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();
    }
}
person Matej    schedule 10.04.2017