Skip to content

Commit

Permalink
[clang-format] Fix bug where -dump-config failed on ObjC header
Browse files Browse the repository at this point in the history
Summary:
`clang-format -dump-config path/to/file.h` never passed
anything for the Code parameter to clang::format::getStyle().

This meant the logic to guess Objective-C from the contents
of a .h file never worked, because LibFormat didn't have the
code to work with.

With this fix, we now correctly read in the contents of the
file if possible with -dump-config.

I had to update the lit config for test/Format/ because
the default config ignores .h files.

Test Plan: make -j12 check-clang

Reviewers: jolesiak, krasimir

Reviewed By: jolesiak, krasimir

Subscribers: Wizard, klimek, cfe-commits, djasper

Differential Revision: https://reviews.llvm.org/D42395

llvm-svn: 323668
  • Loading branch information
bhamiltoncx committed Jan 29, 2018
1 parent 073971b commit 6845dec
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 3 deletions.
3 changes: 3 additions & 0 deletions clang/test/Format/dump-config-cxx.h
@@ -0,0 +1,3 @@
// RUN: clang-format -dump-config %s | FileCheck %s

// CHECK: Language: Cpp
5 changes: 5 additions & 0 deletions clang/test/Format/dump-config-objc.h
@@ -0,0 +1,5 @@
// RUN: clang-format -dump-config %s | FileCheck %s

// CHECK: Language: ObjC
@interface Foo
@end
4 changes: 4 additions & 0 deletions clang/test/Format/lit.local.cfg
@@ -0,0 +1,4 @@
# Suffixes supported by clang-format.
config.suffixes = ['.c', '.cc', '.cpp', '.h', '.m', '.mm', '.java', '.js',
'.ts', '.proto', '.protodevel', '.pb.txt', '.textproto',
'.textpb', '.asciipb', '.td']
23 changes: 20 additions & 3 deletions clang/tools/clang-format/ClangFormat.cpp
Expand Up @@ -357,10 +357,27 @@ int main(int argc, const char **argv) {
}

if (DumpConfig) {
StringRef FileName;
std::unique_ptr<llvm::MemoryBuffer> Code;
if (FileNames.empty()) {
// We can't read the code to detect the language if there's no
// file name, so leave Code empty here.
FileName = AssumeFileName;
} else {
// Read in the code in case the filename alone isn't enough to
// detect the language.
ErrorOr<std::unique_ptr<MemoryBuffer>> CodeOrErr =
MemoryBuffer::getFileOrSTDIN(FileNames[0]);
if (std::error_code EC = CodeOrErr.getError()) {
llvm::errs() << EC.message() << "\n";
return 1;
}
FileName = (FileNames[0] == "-") ? AssumeFileName : FileNames[0];
Code = std::move(CodeOrErr.get());
}
llvm::Expected<clang::format::FormatStyle> FormatStyle =
clang::format::getStyle(
Style, FileNames.empty() ? AssumeFileName : FileNames[0],
FallbackStyle);
clang::format::getStyle(Style, FileName, FallbackStyle,
Code ? Code->getBuffer() : "");
if (!FormatStyle) {
llvm::errs() << llvm::toString(FormatStyle.takeError()) << "\n";
return 1;
Expand Down

0 comments on commit 6845dec

Please sign in to comment.