From e488f5dd1ea9a5eaec8862135a140c63b7452515 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Fri, 13 Sep 2013 13:40:24 +0000 Subject: clang-format: Add -assume-filename option for editor integrations. With -style=file, clang-format now starts to search for a .clang-format file starting at the file given with -assume-filename if it reads from stdin. Otherwise, it would start searching from the current directory, which is not helpful for editor integrations. Also changed vim, emacs and sublime integrations to actually make use of this flag. This fixes llvm.org/PR17072. llvm-svn: 190691 --- clang/tools/clang-format/ClangFormat.cpp | 14 +++++++++++++- clang/tools/clang-format/clang-format-sublime.py | 24 ++++++++++++------------ clang/tools/clang-format/clang-format.el | 4 +++- clang/tools/clang-format/clang-format.py | 3 ++- 4 files changed, 30 insertions(+), 15 deletions(-) (limited to 'clang/tools') diff --git a/clang/tools/clang-format/ClangFormat.cpp b/clang/tools/clang-format/ClangFormat.cpp index 592d46a..71dcfc5 100644 --- a/clang/tools/clang-format/ClangFormat.cpp +++ b/clang/tools/clang-format/ClangFormat.cpp @@ -73,6 +73,14 @@ static cl::opt "parameters, e.g.:\n" " -style=\"{BasedOnStyle: llvm, IndentWidth: 8}\""), cl::init("file"), cl::cat(ClangFormatCategory)); + +static cl::opt +AssumeFilename("assume-filename", + cl::desc("When reading from stdin, clang-format assumes this\n" + "filename to look for a style config file (with\n" + "-style=file)."), + cl::cat(ClangFormatCategory)); + static cl::opt Inplace("i", cl::desc("Inplace edit s, if specified."), cl::cat(ClangFormatCategory)); @@ -126,11 +134,15 @@ FormatStyle getStyle(StringRef StyleName, StringRef FileName) { return Style; } + if (FileName == "-") + FileName = AssumeFilename; SmallString<128> Path(FileName); llvm::sys::fs::make_absolute(Path); - for (StringRef Directory = llvm::sys::path::parent_path(Path); + for (StringRef Directory = Path; !Directory.empty(); Directory = llvm::sys::path::parent_path(Directory)) { + if (!llvm::sys::fs::is_directory(Directory)) + continue; SmallString<128> ConfigFile(Directory); llvm::sys::path::append(ConfigFile, ".clang-format"); diff --git a/clang/tools/clang-format/clang-format-sublime.py b/clang/tools/clang-format/clang-format-sublime.py index 78c8939..2099d7a 100644 --- a/clang/tools/clang-format/clang-format-sublime.py +++ b/clang/tools/clang-format/clang-format-sublime.py @@ -37,21 +37,21 @@ class ClangFormatCommand(sublime_plugin.TextCommand): region_offset = min(region.a, region.b) region_length = abs(region.b - region.a) command.extend(['-offset', str(region_offset), - '-length', str(region_length)]) + '-length', str(region_length), + '-assume-filename', str(self.view.file_name())]) old_viewport_position = self.view.viewport_position() buf = self.view.substr(sublime.Region(0, self.view.size())) p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) output, error = p.communicate(buf.encode(encoding)) - if not error: - self.view.replace( - edit, sublime.Region(0, self.view.size()), - output.decode(encoding)) - self.view.sel().clear() - for region in regions: - self.view.sel().add(region) - # FIXME: Without the 10ms delay, the viewport sometimes jumps. - sublime.set_timeout(lambda: self.view.set_viewport_position( - old_viewport_position, False), 10) - else: + if error: print error + self.view.replace( + edit, sublime.Region(0, self.view.size()), + output.decode(encoding)) + self.view.sel().clear() + for region in regions: + self.view.sel().add(region) + # FIXME: Without the 10ms delay, the viewport sometimes jumps. + sublime.set_timeout(lambda: self.view.set_viewport_position( + old_viewport_position, False), 10) diff --git a/clang/tools/clang-format/clang-format.el b/clang/tools/clang-format/clang-format.el index 531635e..520a3e2 100644 --- a/clang/tools/clang-format/clang-format.el +++ b/clang/tools/clang-format/clang-format.el @@ -38,10 +38,12 @@ (orig-point (point)) (style "file")) (unwind-protect - (call-process-region (point-min) (point-max) clang-format-binary t t nil + (call-process-region (point-min) (point-max) clang-format-binary + t (list t nil) nil "-offset" (number-to-string (1- begin)) "-length" (number-to-string (- end begin)) "-cursor" (number-to-string (1- (point))) + "-assume-filename" (buffer-file-name) "-style" style) (goto-char (point-min)) (let ((json-output (json-read-from-string diff --git a/clang/tools/clang-format/clang-format.py b/clang/tools/clang-format/clang-format.py index d8338ab..c333e4d 100644 --- a/clang/tools/clang-format/clang-format.py +++ b/clang/tools/clang-format/clang-format.py @@ -49,7 +49,8 @@ if sys.platform.startswith('win32'): # Call formatter. p = subprocess.Popen([binary, '-lines', lines, '-style', style, - '-cursor', str(cursor)], + '-cursor', str(cursor), + '-assume-filename', vim.current.buffer.name], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, startupinfo=startupinfo) stdout, stderr = p.communicate(input=text) -- cgit v1.1