FileCodeModel :: AddFunction генерирует функцию с возвращаемым типом при передаче vsCMFunctionConstructor

Этот кусок кода — то, что я хочу генерировать (c ++)

X::X()
{
}

Тем не менее AddFunction вызов ниже генерирует функцию с типом возврата (источником является FileCodeModel, представляющий исходный файл cpp):

source.AddFunction("X::X" , vsCMFunction.vsCMFunctionConstructor, null, -1,vsCMAccess.vsCMAccessDefault);

Замена нуля любым из этих типов возврата не имеет значения:

«ИКС»

vsCMTypeRef.vsCMTypeRefVoid

vsCMTypeRef.vsCMTypeRefCodeType

vsCMTypeRef.vsCMTypeRefOther

Все эти результаты приводят к функции с возвращаемым типом, как показано ниже, даже если указан жесткий vsCMFunctionConstructor:

int X::X()
{
}

Используя интерфейс FileCodeModel, как я могу сгенерировать простой конструктор, который является функцией без тип возврата?

Вот самый минимальный код для воссоздания моей проблемы.

0

Решение

Ну, глядя на ваш пример проекта, я думаю, что вижу проблему.

Вы открыли FileCodeModel в файле .cpp, и вы добавляете к нему функцию — но класса нет.

Кроме того, для генерации C ++, вы должны убедиться, что вы используете VCCodeModel.

Что вы должны сделать, это сначала создать класс, а затем добавить конструктор в класс. Что-то вроде этого:

// get IDE
EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.12.0");

// select the second project (pre-created as in your example)
var project = dte.Solution.Projects.Item(2);

// get the VC code model
VCCodeModel pModel = (VCCodeModel)project.CodeModel;

// create a class in the header (also creates header if not existing)
var pClass = pModel.AddClass("X", "test.h");

// add the constructor implementation in the cpp file
pClass.AddFunction("X", EnvDTE.vsCMFunction.vsCMFunctionConstructor, null,
0, EnvDTE.vsCMAccess.vsCMAccessDefault, "test.cpp");

Это правильно генерирует следующий код в test.h файл:

class X
{
X(void);
};

И следующее test.cpp файл:

#include "test.h"
X::X(void)
{
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]