У меня есть проект, который необходимо проанализировать перед исходной компиляцией. Это нужно для размышлений. Короче говоря, я хочу проверить отредактированные файлы .h
на наличие некоторых атрибутов в коде и собрать информацию об этом для создания определенных c включаемых файлов. Например, отражаемые классы / поля / методы будут отмечены как META(parameters...)
. Этот макрос будет определен следующим образом: #define META(...) __attribute__(annotate("reflectable"))
.
Код должен выглядеть следующим образом (аналогично Qt QObject или Unreal Engine 4):
1.
// --- macros outside of header to parse ---
// Marks declaration as reflectable (with some metadata), empty for base compiler, useful for clang
#ifdef __clang__
#define META(...) __attribute__(annotate("reflectable"))
#else
#define META(...)
#endif
// Injects some generated code after parsing step, empty for clang, useful for base compiler
#ifdef __clang__
#define GENERATED_REFLECTION_INFO
#else
#define GENERATED_REFLECTION_INFO GENERATE_CODE(__FILE__, __LINE__)
#endif
// --- reflectable class ---
META(Serializable, Exposed, etc)
class MyReflectableClass : public BaseReflectableClass
{
GENERATED_REFLECTION_INFO
public:
// Fields examples
META()
int32 MyReflectableField;
META(SkipSerialize)
float MySecondaryReflectableField;
// Methods example
META(RemoteMethod)
void MyReflectableMethod(int32 Param1, uint8 Param2);
};
libclang использовался для этой цели. Но когда проект включает в себя что-то вроде <string>
или <memory>
, это приводит к долгому синтаксическому анализу длинной цепочки зависимостей в стандартной библиотеке.
Также, если в проекте много заголовков, может произойти аналогичная ситуация.
Как избежать парсинга полной стандартной библиотеки? Возможно, какие-то кеши, которые я мог бы использовать в libclang?
Или, возможно, есть способы пропустить анализ этих включений и убедить синтаксический анализатор, что неизвестные типы приемлемы?
Итак, как я могу оптимизировать приложение, чтобы сократить время парсинга?