Skip to content

[BUG] Unknown problem - not format part of .h-file #75

Description

@Drovosek01

I have this .clang-format file in root of project:

# A clang-format style that approximates Python's PEP 7
BasedOnStyle: Google
AlwaysBreakAfterReturnType: None
# Пытается выровнять операнды друг под другом после переноса
# AlignAfterOpenBracket: Align
# Разрешает переносить элементы вложенных списков инициализации, 
# если они превышают ColumnLimit
AlignAfterOpenBracket: BlockIndent
ColumnLimit: 120
DerivePointerAlignment: false
IndentWidth: 4
# чтобы убрать специфический "гугловский" отступ в 2 пробела
AccessModifierOffset: -4
Language: Cpp
PointerAlignment: Right
ReflowComments: true

SpacesInParentheses: false
TabWidth: 4
UseTab: Never
SortIncludes: false
AlignEscapedNewlines: DontAlign

# Запрещает clang-format схлопывать короткие функции в одну строку
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
AllowShortBlocksOnASingleLine: Empty
AllowShortLambdasOnASingleLine: Empty


# Принудительно разрывает строку перед логическими операторами (||, &&)
BreakBeforeBinaryOperators: NonAssignment

# Включает перенос строк в выражениях return
ContinuationIndentWidth: 4




# Выравнивание самого двоеточия и запятых (замена старого стиля LeftAligned)
BreakConstructorInitializers: BeforeColon

# Запрещаем упаковывать элементы в одну строку (каждый элемент на новой строке)
PackConstructorInitializers: Never

# Настройки для переноса фигурной скобки конструктора на новую строку
BreakBeforeBraces: Custom
#BreakBeforeBraces: Attach
BraceWrapping:
  AfterFunction: true
  # Переносить открывающую скобку на новую строку после объявления enum
  AfterEnum: true
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false

# Ширина отступа для элементов инициализации (обычно 4)
ConstructorInitializerIndentWidth: 4

# Запрещает разбивать и переносить длинные строки в кавычках
BreakStringLiterals: false

# Отключает "компактный" режим для списков инициализации.
# Заставляет переносить элементы на новые строки, если они не влезают в ColumnLimit.
BinPackArguments: false
BinPackParameters: false

# Включает отступы для директив препроцессора после решетки #
IndentPPDirectives: BeforeHash

# Запрещает clang-format упаковывать перечисления в одну строку
AllowShortEnumsOnASingleLine: false

# Принудительно очищает лишние пробелы перед и после знаков препинания
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements

I have Sublime Text 4 build 4200 on macOS 15.7.7

When I try format .h-file with this code:

#pragma once

#include <mach-o/loader.h>

#include <cstdint>
#include <string>
#include <vector>

#include "common.h"
#include "pattern.h"

enum class AddressType : std::int8_t
{
    RuntimeAddress,
    FileOffset
};

enum class CpuArch : std::int8_t
{
    arm64,
    x64,
    x86,
    arm32,
    unknown
};

struct ImageArch {
    CpuArch arch;
    std::string cpuType;
};

struct SegmentRange {
    const uint8_t *ptr;  // начало сегмента в памяти
    uint64_t base;       // runtime-адрес начала сегмента
    size_t size;         // размер сегмента в байтах

    uint64_t fileoff;      // fileoff сегмента
    uint64_t sliceOffset;  // смещение архитектурного слайса (для fat)
};

/**
 * @struct DyldModuleInfo
 *
 * @brief Описывает один загруженный Mach-O модуль.
 *
 * Содержит:
 *  - полный путь к модулю
 *  - указатель на mach_header (ASLR-скорректированный)
 *  - slide (смещение ASLR)
 */
struct DyldModuleInfo {
    std::string fullPath;
    const mach_header_64 *header;
    intptr_t slide;

    // Возвращает имя файла (basename) из fullPath
    std::string getBasename() const;

    // Возвращает имя файла с расширением из fullPath
    std::string getFilename() const;

    // Оператор для сравнения. Set будет считать элементы одинаковыми, если их
    // адреса заголовков равны
    bool operator<(const DyldModuleInfo &other) const
    {
        return header < other.header;
    }
    // Определяем, как сравнивать объекты (по полю header)
    bool operator==(const DyldModuleInfo &other) const
    {
        return header == other.header;
    }

    // Проверяет доступен ли данный модуль для использования
    bool isModuleAccessible() const;

    // Проверяет совпадает ли данный модуль с строкой которую нужно найти в пути
    // этого модуля на диске
    bool match(SearchString text) const;

    // Возвращает строку с названием архитектуры (например, "ARM64" или "x86_64")
    ImageArch getArchitectureName() const;
};

// хэшер (функтор), который берет адрес заголовка и делает из него хэш
struct DyldModuleHasher {
    std::size_t operator()(const DyldModuleInfo &m) const
    {
        return std::hash<const void *>{}(m.header);
    }
};

/**
 * Ищет среди всех загруженных Mach-O модулей первый модуль,
 * чьё имя файла (basename) совпадает с targetName, и возвращает
 * его базовый адрес (ASLR-скорректированный адрес заголовка Mach-O).
 *
 * @param targetName  Имя бинарника без пути (например, "libSystem.B.dylib").
 * @return uintptr_t  Базовый адрес первого найденного модуля,
 *                    либо 0, если модуль не найден.
 */
uintptr_t getFirstModuleBaseAddressByName(const std::string &targetName);

/**
 * Перебирает все загруженные Mach-O модули и собирает базовые адреса
 * всех модулей, чьё имя файла (basename) совпадает с targetName.
 * Возвращает список всех совпадений, поскольку в системе могут быть
 * загружены несколько модулей с одинаковым именем, но разными путями.
 *
 * @param targetName  Имя бинарника без пути (например, "libswiftCore.dylib").
 * @return std::vector<DyldModuleInfo> Вектор структур с базовой информацией
 * о всех найденных модулях. Пустой вектор, если совпадений нет.
 */
std::vector<DyldModuleInfo> getAllModulesBaseAddressesByName(const std::string &targetName);



namespace SymbolSearch {
                                   symtab_command* FindSymTab(const struct mach_header_64* header);

         segment_command_64* FindSegment(const struct mach_header_64* header, std::string_view segname);

                        std::vector<uintptr_t> FindSymbolInImage(const intptr_t slide, const struct mach_header_64* header, const SearchSymbol symbol);

/**
 * @brief Ищет все символы из списка в заданном образе.
 * @param slide       ASLR слайд модуля
 * @param header      Заголовок Mach-O модуля
 * @param symbols     Вектор объектов SearchSymbol для поиска
 * @return std::vector<std::vector<uintptr_t>> Список всех найденных адресов
 */
            std::vector<std::vector<uintptr_t>> FindSymbolsInImage(const intptr_t slide,
                                         const struct mach_header_64 *header,
                                         const std::vector<SearchSymbol>& symbols);

}

SublimeClangFormat extension not touch namespace SymbolSearch.

But if I remove this code:

/**
 * Перебирает все загруженные Mach-O модули и собирает базовые адреса
 * всех модулей, чьё имя файла (basename) совпадает с targetName.
 * Возвращает список всех совпадений, поскольку в системе могут быть
 * загружены несколько модулей с одинаковым именем, но разными путями.
 *
 * @param targetName  Имя бинарника без пути (например, "libswiftCore.dylib").
 * @return std::vector<DyldModuleInfo> Вектор структур с базовой информацией
 * о всех найденных модулях. Пустой вектор, если совпадений нет.
 */
std::vector<DyldModuleInfo> getAllModulesBaseAddressesByName(const std::string &targetName);

Then format again using SublimeClangFormat extension - namespace SymbolSearch will formatted without problems.

But if I will format code above using this service - https://clang-format-configurator.site/ or if I will format using command in terminal clang-format -style=file:/path/to/file/.clang-format -i /path/to/file//file.h - all it format code above without problems and without pre-removing part of code.

I do not know what the problem is, but the problem clearly lies in this extension and I cannot solve it in any way.

I will delete this extension and try to use the SublimeLinter + SublimeLinter-contrib-clang-format bundle.


UPDATE:
Looks like LSP-clangd also have format function using .clang-format file and no need additional extensions!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions