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

0

Этот фрагмент кода - это то, что я хочу сгенерировать (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
    Какой язык вы генерируете? Похоже на C ++. FWIW, генерирующий конструктор C # таким способом, прекрасно работает для меня.
  • 0
    Да с ++. Не думаю, что это будет иметь значение, поскольку код конструктора выглядит точно так же. Это интересно, однако, и должно помочь мне определить проблему.
Показать ещё 4 комментария
Теги:
visual-studio
visual-studio-extensions
c#-code-model

1 ответ

2
Лучший ответ

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

Вы открыли 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)
{
}
  • 1
    Обычно вы не определяете классы в файле cpp, только их функции-члены.
  • 0
    Это ^, кажется, моя настоящая проблема, я создаю класс в заголовочном файле, но я хочу добавить реализацию в относительный исходный файл. Мне как-то нужно сказать VCCodeModel, с каким исходным файлом должен быть связан объект класса. Но теперь я вижу, как мой пример, где просто. Однако вы все еще ответили на мой первоначальный вопрос, и я, скорее всего, скоро выберу этот ответ.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню