Files
UnrealEngine/Engine/Extras/clang-format
2025-05-18 13:04:45 +08:00
..
2025-05-18 13:04:45 +08:00
2025-05-18 13:04:45 +08:00
2025-05-18 13:04:45 +08:00

This is a work-in-progress project to set up clang-format for the Unreal Engine codebase.

Required binaries

Right now, you have to add clang-format.exe and clang-format-diff.py by yourself. Download them from an LLVM release and put them into this directory.

clang-format-diff

Clang comes with a handy script called clang-format-diff which uses clang-format to format only the lines of code that has changed according to your version control system.

To diff lines that have changed according to Perforce, you can use the script perforce-clang-format-diff.ps1.

Formatting changed lines on save in Rider

You can format files automatically using clang-format-diff when you save changes to them from the Rider IDE.

To do this, go to Rider's "Settings > Tools > File Watchers" and add a two new ones. Here are examples of values from a successful setup of these (the only that change between them is "File type"):

Field Value
File type C++ header files (or "C++ files" for .cpp files)
Scope Open Files
Program pwsh.exe
Arguments -File PATH-TO-CHECKOUT\Engine\Extras\clang-format\perforce-clang-format-diff.ps1 FilePath -PerformSlateFiltering
Working directory FileDir

Note that this example enables the -PerformSlateFiltering flag (see below for info).

Note that the "Show console" option can be useful to debug the watcher.

macOS support

The new perforce-clang-format-diff.py works on both Windows and macOS. You can set it up in Rider like this:

Field Value
File type C++ header files (or "C++ files" for .cpp files)
Scope Open Files
Program python
Arguments PATH-TO-CHECKOUT\Engine\Extras\clang-format\perforce-clang-format-diff.py FilePath --verbose
Working directory FileDir

Known issue: formatting Slate code

Slate code uses an uncommon overload of operator[] to nest widgets declaratively. clang-format doesn't understand this and therefore cannot format such code nicely.

An example of this problem is that this code

AddSlot()
[
    MyWidget
];

is formatted into this

AddSlot()[MyWidget];

which is not what we want for our Slate code.

To work around this issue, we can filter out any Slate code from what we give to clang-format. This works well when using clang-format-diff, which is already diff based.

This technique has been implemented in the perforce-clang-format-diff.ps1 script as a filter on the output of p4 diff where any Slate-like code is removed from the diff before passed onto clang-format-diff.py. Enable this filter by passing -PerformSlateFiltering to perforce-clang-format-diff.ps1.

Note that in rare cases, clang-format-diff will format code surrounding a diff regardless if the surrounding code has been changed or not. This can effectively override -PerformSlateFiltering, causing Slate code to be filtered incorrectly despite using the flag.