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