Allow _clang-format as alternative to .clang-format config filename

Dotfiles are impractical on Windows. This makes clang-format search
for the style configuration file as '_clang-format' in addition to
the usual '.clang-format'. This is similar to how VIM searches for
'_vimrc' on Windows.

Differential Revision: http://llvm-reviews.chandlerc.com/D1629

llvm-svn: 190413
This commit is contained in:
Hans Wennborg 2013-09-10 15:41:12 +00:00
parent d532cb6bed
commit 9f6581bb88
7 changed files with 27 additions and 9 deletions

View File

@ -72,8 +72,8 @@ to format C/C++/Obj-C code.
When the desired code formatting style is different from the available options, When the desired code formatting style is different from the available options,
the style can be customized using the ``-style="{key: value, ...}"`` option or the style can be customized using the ``-style="{key: value, ...}"`` option or
by putting your style configuration to the ``.clang-format`` file in your by putting your style configuration in the ``.clang-format`` or ``_clang-format``
project's directory and using ``clang-format -style=file``. file in your project's directory and using ``clang-format -style=file``.
An easy way to create the ``.clang-format`` file is: An easy way to create the ``.clang-format`` file is:

View File

@ -16,8 +16,8 @@ Configuring Style with clang-format
:program:`clang-format` supports two ways to provide custom style options: :program:`clang-format` supports two ways to provide custom style options:
directly specify style configuration in the ``-style=`` command line option or directly specify style configuration in the ``-style=`` command line option or
use ``-style=file`` and put style configuration in the ``.clang-format`` file use ``-style=file`` and put style configuration in the ``.clang-format`` or
in the project directory. ``_clang-format`` file in the project directory.
When using ``-style=file``, :program:`clang-format` for each input file will When using ``-style=file``, :program:`clang-format` for each input file will
try to find the ``.clang-format`` file located in the closest parent directory try to find the ``.clang-format`` file located in the closest parent directory

View File

@ -8,6 +8,10 @@
// RUN: clang-format -style=file %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK5 %s // RUN: clang-format -style=file %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK5 %s
// RUN: printf "\n" > %T/.clang-format // RUN: printf "\n" > %T/.clang-format
// RUN: clang-format -style=file %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK6 %s // RUN: clang-format -style=file %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK6 %s
// RUN: [ ! -e %T/.clang-format ] || rm %T/.clang-format
// RUN: [ ! -e %T/_clang-format ] || rm %T/_clang-format
// RUN: printf "BasedOnStyle: google\nIndentWidth: 6\n" > %T/_clang-format
// RUN: clang-format -style=file %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK7 %s
void f() { void f() {
// CHECK1: {{^ int\* i;$}} // CHECK1: {{^ int\* i;$}}
// CHECK2: {{^ int \*i;$}} // CHECK2: {{^ int \*i;$}}
@ -19,6 +23,7 @@ void f() {
// CHECK5: {{^ int\* i;$}} // CHECK5: {{^ int\* i;$}}
// CHECK6: {{^Error reading .*\.clang-format: Invalid argument}} // CHECK6: {{^Error reading .*\.clang-format: Invalid argument}}
// CHECK6: {{^ int \*i;$}} // CHECK6: {{^ int \*i;$}}
// CHECK7: {{^ int\* i;$}}
int*i; int*i;
int j; int j;
} }

View File

@ -37,11 +37,12 @@ namespace LLVM.ClangFormat
[DisplayName("Style")] [DisplayName("Style")]
[Description("Coding style, currently supports:\n" + [Description("Coding style, currently supports:\n" +
" - Predefined styles ('LLVM', 'Google', 'Chromium', 'Mozilla').\n" + " - Predefined styles ('LLVM', 'Google', 'Chromium', 'Mozilla').\n" +
" - 'File' to search for a YAML .clang-format configuration.\n" + " - 'File' to search for a YAML .clang-format or _clang-format\n" +
" configuration file.\n" +
" - A YAML configuration snippet.\n\n" + " - A YAML configuration snippet.\n\n" +
"'File':\n" + "'File':\n" +
" Searches for a .clang-format configuration in the source file's\n" + " Searches for a .clang-format or _clang-format configuration file\n" +
" directory and its parents.\n\n" + " in the source file's directory and its parents.\n\n" +
"YAML configuration snippet:\n" + "YAML configuration snippet:\n" +
" The content of a .clang-format configuration file, as string.\n" + " The content of a .clang-format configuration file, as string.\n" +
" Example: '{BasedOnStyle: \"LLVM\", IndentWidth: 8}'\n\n" + " Example: '{BasedOnStyle: \"LLVM\", IndentWidth: 8}'\n\n" +

View File

@ -132,12 +132,22 @@ FormatStyle getStyle(StringRef StyleName, StringRef FileName) {
!Directory.empty(); !Directory.empty();
Directory = llvm::sys::path::parent_path(Directory)) { Directory = llvm::sys::path::parent_path(Directory)) {
SmallString<128> ConfigFile(Directory); SmallString<128> ConfigFile(Directory);
llvm::sys::path::append(ConfigFile, ".clang-format"); llvm::sys::path::append(ConfigFile, ".clang-format");
DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n"); DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");
bool IsFile = false; bool IsFile = false;
// Ignore errors from is_regular_file: we only need to know if we can read // Ignore errors from is_regular_file: we only need to know if we can read
// the file or not. // the file or not.
llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile); llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile);
if (!IsFile) {
// Try _clang-format too, since dotfiles are not commonly used on Windows.
ConfigFile = Directory;
llvm::sys::path::append(ConfigFile, "_clang-format");
DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");
llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile);
}
if (IsFile) { if (IsFile) {
OwningPtr<MemoryBuffer> Text; OwningPtr<MemoryBuffer> Text;
if (error_code ec = MemoryBuffer::getFile(ConfigFile, Text)) { if (error_code ec = MemoryBuffer::getFile(ConfigFile, Text)) {

View File

@ -21,7 +21,8 @@ binary = 'clang-format'
# Change this to format according to other formatting styles. See the output of # Change this to format according to other formatting styles. See the output of
# 'clang-format --help' for a list of supported styles. The default looks for # 'clang-format --help' for a list of supported styles. The default looks for
# a '.clang-format' file to indicate the style that should be used. # a '.clang-format' or '_clang-format' file to indicate the style that should be
# used.
style = 'file' style = 'file'
class ClangFormatCommand(sublime_plugin.TextCommand): class ClangFormatCommand(sublime_plugin.TextCommand):

View File

@ -28,7 +28,8 @@ binary = 'clang-format'
# Change this to format according to other formatting styles. See the output of # Change this to format according to other formatting styles. See the output of
# 'clang-format --help' for a list of supported styles. The default looks for # 'clang-format --help' for a list of supported styles. The default looks for
# a '.clang-format' file to indicate the style that should be used. # a '.clang-format' or '_clang-format' file to indicate the style that should be
# used.
style = 'file' style = 'file'
# Get the current text. # Get the current text.