Как создать категорию для внешних заголовков в clang-формате? - PullRequest
1 голос
/ 22 апреля 2019

Я хочу настроить clang-формат для сортировки в C ++ включенных заголовков следующим образом:

  • основной заголовок (связанный с текущим файлом cpp),
  • локальные заголовки, включенные через"",
  • другие заголовки включены через <>,
  • заголовки из определенных внешних библиотек (например, boost, catch2),
  • системные / стандартные заголовки.

Я использую clang-формат 8.0.0 в macOS.Моя текущая конфигурация (фрагмент относится только к включениям) выглядит следующим образом:

SortIncludes: true
IncludeBlocks: Regroup
IncludeCategories:
  # Headers in <> without extension.
  - Regex:           '<([A-Za-z0-9\/-_])+>'
    Priority:        4
  # Headers in <> from specific external libraries.
  - Regex:           '<((\bboost\b)|(\bcatch2\b))\/([A-Za-z0-9.\/-_])+>'
    Priority:        3
  # Headers in <> with extension.
  - Regex:           '<([A-Za-z0-9.\/-_])+>'
    Priority:        2
  # Headers in "" with extension.
  - Regex:           '"([A-Za-z0-9.\/-_])+"'
    Priority:        1

В этой конфигурации я предполагаю, что системные / стандартные заголовки не имеют расширения.Это не будет работать для заголовков UNIX / POSIX.Главный заголовок автоматически определяется и ему назначается приоритет 0. Пока что все кажется работающим, как и ожидалось, за исключением категории для внешних библиотек.Похоже, что clang-format присваивает ему приоритет 2.

Ожидаемый результат:

#include "test.h"

#include <allocator/region.hpp>
#include <page.hpp>
#include <page_allocator.hpp>
#include <test_utils.hpp>
#include <utils.hpp>
#include <zone_allocator.hpp>

#include <catch2/catch.hpp>     // <--------

#include <array>
#include <cmath>
#include <cstring>
#include <map>

Фактический результат:

#include "test.h"

#include <allocator/region.hpp>
#include <catch2/catch.hpp>     // <--------
#include <page.hpp>
#include <page_allocator.hpp>
#include <test_utils.hpp>
#include <utils.hpp>
#include <zone_allocator.hpp>

#include <array>
#include <cmath>
#include <cstring>
#include <map>

Как настроить приоритет 3 дляесть ожидаемый результат?

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Проблема в том, что в клан-формате используются регулярные выражения POSIX ERE .И они не поддерживают границы слов.

Так что <catch2/catch.hpp> никогда не будет соответствовать второму правилу.Затем эта же строка оценивается для третьего правила, которое соответствует.

Если бы оно соответствовало второму правилу, оно бы остановилось на этом, но, поскольку оно не соответствовало, оно переходит к следующему правилу.

Просто удалите все \b в регулярном выражении.Удалить их безопасно, потому что у вас уже есть границы слов: слева у вас есть <, а справа - /, поэтому, даже если вы можете использовать словарные слова, это будет бесполезно.

  - Regex:           '<(boost|catch2)\/([A-Za-z0-9.\/-_])+>'
    Priority:        3

ПРИМЕЧАНИЕ: Имейте в виду, что - внутри [] должен быть убран обратной косой чертой, если только он не помещен в последнюю позицию.Это потому, что он используется для диапазонов.Поэтому, когда вы пишете [A-Za-z0-9.\/-_], вы имеете в виду A-Za-z0-9. или диапазон от / до _, что, вероятно, не означает, что вы таковы.

0 голосов
/ 22 апреля 2019

Я получил его, используя и изменив пример из документов в формате clang для этой опции:

SortIncludes: true
IncludeBlocks: Regroup
IncludeCategories:
  # Headers in <> without extension.
  - Regex:           '<([A-Za-z0-9\Q/-_\E])+>'
    Priority:        4
  # Headers in <> from specific external libraries.
  - Regex:           '<(catch2|boost)\/'
    Priority:        3
  # Headers in <> with extension.
  - Regex:           '<([A-Za-z0-9.\Q/-_\E])+>'
    Priority:        2
  # Headers in "" with extension.
  - Regex:           '"([A-Za-z0-9.\Q/-_\E])+"'
    Priority:        1

В частности, я изменил регулярное выражение приоритета 3, чтобы оно было больше похоже на оригинальное пример :

'^(<|"(gtest|gmock|isl|json)/)'

Кроме того, я добавил модификаторы \ Q и \ E, чтобы избежать проблемы, упомянутой Хулио.Теперь все работает как положено.Однако я до сих пор не знаю, почему решение из поста с вопросом не работает.

...