Этот кусок кода — то, что я хочу генерировать (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, как я могу сгенерировать простой конструктор, который является функцией без тип возврата?
Ну, глядя на ваш пример проекта, я думаю, что вижу проблему.
Вы открыли 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)
{
}
Других решений пока нет …