Browse Source

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190413 91177308-0d34-0410-b5e6-96231b3b80d8
Hans Wennborg 12 years ago
parent
commit
9a7a50eef7

+ 2 - 2
docs/ClangFormat.rst

@@ -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
-project's directory and using ``clang-format -style=file``.
+by putting your style configuration in the ``.clang-format`` or ``_clang-format``
+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:
 
 

+ 2 - 2
docs/ClangFormatStyleOptions.rst

@@ -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
-in the project directory.
+use ``-style=file`` and put style configuration in the ``.clang-format`` or
+``_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

+ 5 - 0
test/Format/style-on-command-line.cpp

@@ -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;
 }
 }

+ 4 - 3
tools/clang-format-vs/ClangFormat/ClangFormatPackage.cs

@@ -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" +
-                     "  directory and its parents.\n\n" +
+                     "  Searches for a .clang-format or _clang-format configuration file\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" +

+ 10 - 0
tools/clang-format/ClangFormat.cpp

@@ -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)) {

+ 2 - 1
tools/clang-format/clang-format-sublime.py

@@ -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):

+ 2 - 1
tools/clang-format/clang-format.py

@@ -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.