[PATCH] D145435: Choose style (file) from within code for use in IDEs
bers via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 6 14:49:56 PST 2023
bersbersbers created this revision.
bersbersbers added a reviewer: owenpan.
bersbersbers created this object with visibility "All Users".
bersbersbers added a project: clang-format.
Herald added a project: All.
bersbersbers requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Address https://github.com/llvm/llvm-project/issues/60917
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D145435
Files:
clang/docs/ClangFormatStyleOptions.rst
clang/lib/Format/Format.cpp
Index: clang/lib/Format/Format.cpp
===================================================================
--- clang/lib/Format/Format.cpp
+++ clang/lib/Format/Format.cpp
@@ -3534,6 +3534,25 @@
if (!getPredefinedStyle(FallbackStyleName, Style.Language, &FallbackStyle))
return make_string_error("Invalid fallback style \"" + FallbackStyleName);
+ if (StyleName == "file") {
+ // Read style from a style comment in the code.
+ const char *Prefix{"// clang-format style="};
+ const size_t PrefixPos = Code.find(Prefix);
+
+ // Prefix found, and at start of file or preceded by white space?
+ if (PrefixPos != StringRef::npos &&
+ ((PrefixPos == 0) || (Code.substr(PrefixPos - 1, 1).ltrim() == ""))) {
+
+ // Use remainder of line as `StyleName` as if passed by `-style=...`.
+ const size_t StylePos = PrefixPos + strlen(Prefix);
+ const size_t EndOfLine = Code.find_first_of("\r\n", StylePos);
+ if (EndOfLine == StringRef::npos)
+ StyleName = Code.substr(StylePos);
+ else
+ StyleName = Code.substr(StylePos, EndOfLine - StylePos);
+ }
+ }
+
llvm::SmallVector<std::unique_ptr<llvm::MemoryBuffer>, 1>
ChildFormatTextToApply;
Index: clang/docs/ClangFormatStyleOptions.rst
===================================================================
--- clang/docs/ClangFormatStyleOptions.rst
+++ clang/docs/ClangFormatStyleOptions.rst
@@ -22,12 +22,15 @@
Configuring Style with clang-format
===================================
-:program:`clang-format` supports two ways to provide custom style options:
-directly specify style configuration in the ``-style=`` command line option or
-use ``-style=file`` and put style configuration in the ``.clang-format`` or
+:program:`clang-format` supports three ways to provide custom style options:
+directly specify style configuration in the ``-style=`` command line option, or
+use ``-style=file`` and put style configuration either in a style comment
+(``// clang-format style=``) in each code file or in the ``.clang-format`` or
``_clang-format`` file in the project directory.
When using ``-style=file``, :program:`clang-format` for each input file will
+locate the first ``// clang-format style=`` comment, if it exists, and use the
+remainder of that line as the style; if no such comment is found, it will then
try to find the ``.clang-format`` file located in the closest parent directory
of the input file. When the standard input is used, the search is started from
the current directory.
@@ -100,6 +103,18 @@
-style='{key1: value1, key2: value2, ...}'
+Similar syntax be used within the file, such as
+
+.. code-block:: console
+
+ // clang-format style={key1: value1, key2: value2, ...}
+
+or even
+
+.. code-block:: console
+
+ // clang-format style=file:<format_file_path>
+
Disabling Formatting on a Piece of Code
=======================================
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D145435.502810.patch
Type: text/x-patch
Size: 2906 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230306/5b508db9/attachment.bin>
More information about the cfe-commits
mailing list