/TEST-Tensor-DInclude

Tensor company entry test. https://tensor.ru/

Primary LanguageC++BSD 2-Clause "Simplified" LicenseBSD-2-Clause

DInclude

dinclude - это небольшое консольное приложение, позволяющее проанализировать зависимости исходного кода, установленные посредством директив #include.

Аргументы приложения

Синопсис

dinclude SOURCE_FILES_DIR [OPTIONS...]

Опции

Пути для любых аргументов могут быть как абсолютными, так и относительными к папке из которой запускается приложение.

  • SOURCE_FILES_DIR - путь к директории содержащей файлы исходного кода для анализа. Опрос файлов происходит рекурсивно, т.е. все файлы, которые окажутся в под-директориях также принимают участие в анализе. В данной версии поддерживаются исходные файлы только с расширением *.hpp либо *.cpp (то же самое справедливо для алгоритма опроса вхождений - опрашиваются только *.hpp и *.cpp файлы).

  • -I<dir> --include-directory[=]<dir> - добавляет директорию к перечню путей для поиска зависимостей.

Алгоритм поиска

При анализе, приложение следует правилам описанным в стандарте ISO/IEC 9899:201x, секция 6.10.2 Source file inclusion, а именно:

  • Для директивы вида
#include <h-char-sequence> new-line

поиск осуществляется относительно директорий, зависящих от реализации и аргументов комплиятора. Т.к. dinclude последней версии не берет в расчет какую-либо информацию о компиляторах, параметрах с которыми они используются и платформе, для которой из файлов исходного кода требуется собрать приложение, dinclude не может сделать обоснованное предположение о том где данные пути расположены и их необходимо указать в виде аргументов приложения.

  • Для директивы вида
# include "q-char-sequence" new-line

поиск осуществляется относительно директории, в которой расположен файл содержащий исходный код. В случае неудачи, поиск указанного файла продолжится так, как если бы он был h-char-sequence заключенной в в угловые скобки.

  • Для директив вида
# include pp-tokens new-line

поиск зависимостей в данной версии не реализован.

Вывод данных

dinclude выводит в консоль дерево обнаруженных зависимостей, отражая "глубину" (относительно исходного файла) отступами. Для каждого файла dinclude подсчитывает количество "вхождений" (сколько раз данный файл включается в состав других файлов), в том числе косвенных (когда файл включен в состав других включенных файлов). Если в процессе опроса файлов, какой-либо оказался не найден, dinclude помечает его (!). Если в процессе поиска была обнаружена циклическая зависимость, поиск по данной ветке прекращается, однако первое вхождение, по которой цикл был выявлен, по-прежнему учавствует в подсчете вхождений, выводится в консоль и помечается (~).

Пример

dinclude ~/MyProject/src -I ~/MyProject/include

"main.cpp"
__"A.hpp"
____"B.hpp"
__"B.hpp"
"A.cpp"
__"A.hpp"
____"B.hpp"
"B.cpp"
__"B.hpp"
"C.cpp"
__"C.hpp"
__"D.hpp"(!)
__"E.hpp"
____"C.cpp"(~)

"B.hpp" 4
"A.hpp" 2
"C.hpp" 1
"C.cpp" 1
"D.hpp" 1
"E.hpp" 1
"A.cpp" 0
"B.cpp" 0
"main.cpp" 0

Для данного примера файл соответствующий вхождению D.hpp не был найден, а вхождение C.cpp в E.hpp помечено как циклическое.