You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
**Новинка:** Теперь вы можете автоматизировать генерацию раздела `methods` в манифесте вашего плагина с помощью clang-doc и парсера на Python!
255
+
::
256
+
257
+
Вместо ручного написания JSON-манифеста для каждой экспортируемой функции, вы можете использовать автоматизированные инструменты для извлечения сигнатур функций, типов, описаний параметров и даже определений перечислений непосредственно из вашего исходного кода C++.
258
+
259
+
### **Преимущества автоматической генерации**
260
+
261
+
1. **Не требуется ручное написание JSON**: Сигнатуры функций автоматически извлекаются из вашего кода
262
+
2. **Полная информация о типах**: Структуры перечислений и typedef функций включаются автоматически
263
+
3. **Интеграция документации**: Комментарии Doxygen парсятся и включаются в манифест
264
+
4. **Меньше ошибок**: Устраняются опечатки и несоответствия типов между кодом и манифестом
265
+
5. **Простое обслуживание**: Изменения в сигнатурах функций автоматически отражаются
266
+
267
+
### **Настройка: Добавление генерации документации в CMake**
268
+
269
+
Добавьте следующее в ваш `CMakeLists.txt` для генерации документации и JSON-манифеста:
270
+
271
+
```cmake
272
+
# Найти clang-doc (обычно поставляется с установкой LLVM/Clang)
273
+
find_program(CLANG_DOC clang-doc)
274
+
275
+
if(CLANG_DOC)
276
+
# Генерация YAML-документации из ваших экспортируемых функций
277
+
add_custom_target(docs
278
+
COMMAND ${CLANG_DOC}
279
+
--executor=all-TUs
280
+
-p ${CMAKE_CURRENT_BINARY_DIR}
281
+
--output=${CMAKE_CURRENT_SOURCE_DIR}/docs
282
+
--extra-arg=-Wno-error
283
+
--format=yaml
284
+
${CMAKE_SOURCE_DIR}/src/export/*.cpp # Путь к вашим экспортируемым функциям
285
+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
286
+
COMMENT "Generating documentation with clang-doc"
287
+
)
288
+
289
+
# Опционально: Автоматическое преобразование YAML в JSON после генерации документации
290
+
find_package(Python3 COMPONENTS Interpreter)
291
+
if(Python3_FOUND)
292
+
add_custom_command(TARGET docs POST_BUILD
293
+
COMMAND ${Python3_EXECUTABLE}
294
+
${CMAKE_SOURCE_DIR}/parser/parser.py
295
+
${CMAKE_SOURCE_DIR}/docs/index.yaml
296
+
${CMAKE_SOURCE_DIR}/exported_methods.json
297
+
COMMENT "Parsing documentation to JSON"
298
+
)
299
+
endif()
300
+
endif()
301
+
```
302
+
303
+
### **Использование парсера**
304
+
305
+
::steps{level=4}
306
+
#### **Установка парсера**
307
+
308
+
Скачайте `parser.py` и поместите его в ваш проект (например, в директорию `tools/`).
Скопируйте сгенерированный массив `methods` из `exported_methods.json` в манифест вашего плагина:
395
+
396
+
```json
397
+
{
398
+
"name": "ExamplePlugin",
399
+
"version": "1.0.0",
400
+
"methods": [
401
+
// Вставьте содержимое из exported_methods.json сюда
402
+
]
403
+
}
404
+
```
405
+
::
406
+
407
+
### **Продвинутое: Структуры перечислений**
408
+
409
+
Парсер автоматически включает полные определения перечислений, когда параметр использует тип перечисления:
410
+
411
+
**Сгенерированный вывод:**
412
+
```json
413
+
{
414
+
"name": "mode",
415
+
"type": "uint8",
416
+
"description": "Был ли хук в режиме post или в режиме pre.",
417
+
"enum": {
418
+
"name": "HookMode",
419
+
"description": "Перечисление, представляющее тип обратного вызова.",
420
+
"values": [
421
+
{
422
+
"name": "Pre",
423
+
"value": 0,
424
+
"description": "Обратный вызов будет выполнен перед оригинальной функцией"
425
+
},
426
+
{
427
+
"name": "Post",
428
+
"value": 1,
429
+
"description": "Обратный вызов будет выполнен после оригинальной функции"
430
+
}
431
+
]
432
+
}
433
+
}
434
+
```
435
+
436
+
### **Продвинутое: Typedef функций**
437
+
438
+
Typedef указателей на функции автоматически парсятся в полные прототипы:
439
+
440
+
**Сгенерированный вывод:**
441
+
```json
442
+
{
443
+
"name": "callback",
444
+
"type": "function",
445
+
"description": "Функция обратного вызова, которая вызывается при выполнении команды.",
446
+
"prototype": {
447
+
"name": "CommandCallback",
448
+
"funcName": "CommandCallback",
449
+
"description": "Обрабатывает выполнение команды, вызванной вызывающей стороной.",
450
+
"paramTypes": [
451
+
{
452
+
"name": "param1",
453
+
"type": "int32"
454
+
},
455
+
{
456
+
"name": "param2",
457
+
"type": "int32",
458
+
"enum": {
459
+
"name": "CommandCallingContext",
460
+
"values": [...]
461
+
}
462
+
},
463
+
{
464
+
"name": "param3",
465
+
"type": "string[]"
466
+
}
467
+
],
468
+
"retType": {
469
+
"type": "int32",
470
+
"enum": {
471
+
"name": "ResultType",
472
+
"values": [...]
473
+
}
474
+
}
475
+
}
476
+
}
477
+
```
478
+
479
+
::callout{icon="i-lucide-info"color="amber"}
480
+
**Примечание:** Имена параметров typedef функций генерируются автоматически как `param1`, `param2` и т.д. Вы можете захотеть настроить их в манифесте для лучшей документации.
481
+
::
482
+
251
483
## **Рекомендации**
252
484
253
485
1.**Используйте `PLUGIN_API`**: Всегда используйте макрос `PLUGIN_API` для пометки функций для экспорта.
0 commit comments