Clang-tidy вставляет несколько спецификаторов переопределения при исправлении

У меня есть проект cmake, который я хотел бы модернизировать с помощью clang-tidy. Чтобы не происходило слишком много событий одновременно, я активировал только опцию modernize-use-override. Однако, когда я применяю это:

$> run-clang-tidy  -header-filter='.*'  -checks='-*, modernize-use-override' -fix

в проект clang-tidy вставляет несколько экземпляров спецификатора override, например:

void update_sizes() override override override etc.

Я попытался последовать совету, данному здесь, и использовал cmake для создания базы данных команд компиляции json:

$>cmake ../../ -DCMAKE_BUILD_TYPE=debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

Я убедился, что cmake действительно подхватывает компилятор clang, установив для него общесистемное значение по умолчанию (используя update-alternative). В этом случае cmake генерирует файлы make, которые вызывают компилятор clang.

Я использую Ubuntu 18.10 и clang 7.

Я также пробовал это, используя clang-6 и настраивая cmake для создания сценариев сборки ninja вместо файлов make, но результат всегда один и тот же.

До применения исправления весь проект отлично компилируется как с gcc, так и с clang.

Обратите внимание, что есть аналогичное обсуждение здесь, однако данный совет заключается в использовании run-clang-tidy.py, что я и делаю. Поэтому не считаю это дубликатом.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
610
2

Ответы 2

Это та же проблема, о которой говорилось в обсуждении, на которое вы ссылались, и мне кажется, что это ошибка. У вас есть несколько вариантов:

  1. Сообщите об этом как об ошибке, чтобы лязгнуть. Ждать долго.
  2. Исправьте ошибку самостоятельно. Вкладывай много времени.
  3. Используйте любой инструмент с возможностью замены текста в нескольких файлах / каталогах (например, Notepad ++). Найдите и замените все вхождения «переопределить переопределение» на «переопределить». Повторяйте до тех пор, пока вхождений больше не будет. Дрожь от безобразия раствора, который вы использовали. :)

Спасибо за ваш ответ. Исправление этого путем последующего редактирования файлов, вероятно, не лучший вариант, потому что, как только я включу другие проверки, мне придется выяснить, как с этим бороться. Поэтому я надеялся на то, что в первую очередь предотвратит это. Поскольку я использовал этот инструмент всего около 1 часа, я не счел целесообразным начинать подавать заявку. Я думал, что более вероятно, что я делаю что-то неправильно ...

ThorOdinsson 10.11.2018 10:47

Это довольно старый вопрос, но проблема все еще существует в clang 11. Проблема заключается в том, как clang сохраняет пути к файлам заголовков. Вы можете легко увидеть это в файлах yaml, например

В первом файле yaml:
Путь к файлу: 'C: / SOURCES / APP / COMMON / CORE /../../../ Libs / Sdk / Public / File.h'

Во втором файле yaml:
FilePath: 'C: / SOURCES / APP / COMMON / APPCORE / VIEWS /../../../../ Libs / Sdk / Public / File.h'

Вышеуказанные пути такие же, но не для clang apply replacements. Самый простой способ решить эту проблему - изменить скрипт run-clang-tidy.py, чтобы исправить все пути в файлах yaml перед запуском clang apply replacements.

def FixPath(line):
    value = line.find("'")
    if value != -1:
        left = line[:value]
        right = line[value+1:len(line)-2]
        right = "'" + os.path.normpath(right) + "'"
        line = left + right.lower() + "\n"
    return line

def FixYamlContent(tmpdir):
    for replacefile in glob.iglob(os.path.join(tmpdir, '*.yaml')):
        with open(replacefile, "r+") as file_rw:
            lines = []
            for line in file_rw:
                if line.find("FilePath:") != -1:
                    line = FixPath(line)
                    
                lines.append(line)

            file_rw.seek(0)
            file_rw.writelines(lines)
            file_rw.truncate()

Чтобы использовать приведенный выше код, вам необходимо вызвать функцию FixYamlContent (tmpdir) непосредственно перед функцией apply_fixes. Я не разработчик Python, и приведенный выше код не полностью протестирован, но вы поняли.

Другие вопросы по теме