Clang-формат: отступ макросов - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь применить формат clang к существующей кодовой базе и столкнулся со следующей проблемой:

Упрощенный (и отформатированный) пример кода:

#define QUERY_BEGIN()
#define QUERY_NORESULT()
#define QUERY_END()

void foo()
{
   int a = 0;

   QUERY_BEGIN()
      a = 1;
      QUERY_NORESULT()
      a = 2;
   QUERY_END()
}

Я установил следующие параметры:

MacroBlockEnd:   'QUERY_END'
MacroBlockBegin: 'QUERY_BEGIN'

То, чего я хочу добиться, это следующее форматирование макроса:

   QUERY_BEGIN()
      a = 1;
   QUERY_NORESULT()
      a = 2;
   QUERY_END()

Моим первым предположением было установить QUERY_NORESULT как MacroBlockEnd и MacroBlockBegin, но это не помогло. Это приводит к следующему форматированию:

   QUERY_BEGIN()
      a = 1;
      QUERY_NORESULT
         a = 2;
      QUERY_END()

Есть ли в настоящее время способ добиться отступа, как показано выше?

1 Ответ

0 голосов
/ 11 ноября 2018
  • Плохие новости: извините, это не доступно в текущей версии clang-format (7).
  • Хорошая новость: существует опция StatementMacros, которая доступна начиная с 8-го формата clang (пока не выпущена, но вы можете собрать из исходного кода).

См. этот коммит :

Резюме: Некоторые макросы используются в теле функции и фактически содержат конечную точку с запятой: поэтому они должны автоматически сопровождаться новой строкой, а не объединяться со следующей строкой. Это, например, случай с макросом Qt Q_UNUSED:

  void foo(int a, int b) {
    Q_UNUSED(a)
    return b;
  }

Этот патч работает с этими случаями, вводя новую опцию для указания списка макросов операторов. При этом повторно используется система, уже существующая для макросов foreach, чтобы гарантировать отсутствие влияния на производительность.

Документ:

◆ StatementMacros

std :: vector clang :: format :: FormatStyle :: StatementMacros Вектор макросов, который следует интерпретировать как завершенные операторы.

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

Например: Q_UNUSED

Определение в строке 1061 файла Format.h.

Ссылка на clang :: format :: FormatTokenLexer :: FormatTokenLexer (), clang :: format :: getLLVMStyle (), llvm :: yaml :: MappingTraits :: mapping () и оператор == () .

Решение:

сборка clang из источника / дождитесь выпуска llvm / clang8, затем положить StatementMacros ['QUERY_BEGIN()', 'QUERY_NORESULT()', 'QUERY_END()'] в ваш .clang-format.

Обходной путь для старого формата clang

// clang-format off
    void    unformatted_code  ;
// clang-format on

Отключите формат clang в этом макросе.

...