I am looking into it now. On Thu, Mar 24, 2016 at 2:39 PM Nico Weber <tha...@chromium.org> wrote:
> Won't this still be broken in mingw (GCC, but on Windows)? > On Mar 24, 2016 9:28 AM, "Eric Liu via cfe-commits" < > cfe-commits@lists.llvm.org> wrote: > >> Author: ioeric >> Date: Thu Mar 24 08:22:42 2016 >> New Revision: 264277 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=264277&view=rev >> Log: >> Added support for different VFSs in format::getStyle. Disable >> platform-related test case for MS compilers to avoid breaking buildbot. >> >> Modified: >> cfe/trunk/include/clang/Format/Format.h >> cfe/trunk/lib/Format/Format.cpp >> cfe/trunk/unittests/Format/FormatTest.cpp >> >> Modified: cfe/trunk/include/clang/Format/Format.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=264277&r1=264276&r2=264277&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Format/Format.h (original) >> +++ cfe/trunk/include/clang/Format/Format.h Thu Mar 24 08:22:42 2016 >> @@ -16,6 +16,7 @@ >> #define LLVM_CLANG_FORMAT_FORMAT_H >> >> #include "clang/Basic/LangOptions.h" >> +#include "clang/Basic/VirtualFileSystem.h" >> #include "clang/Tooling/Core/Replacement.h" >> #include "llvm/ADT/ArrayRef.h" >> #include <system_error> >> @@ -832,11 +833,13 @@ extern const char *StyleOptionHelpDescri >> /// == "file". >> /// \param[in] FallbackStyle The name of a predefined style used to >> fallback to >> /// in case the style can't be determined from \p StyleName. >> +/// \param[in] FS The underlying file system, in which the file resides. >> By >> +/// default, the file system is the real file system. >> /// >> /// \returns FormatStyle as specified by ``StyleName``. If no style >> could be >> /// determined, the default is LLVM Style (see ``getLLVMStyle()``). >> FormatStyle getStyle(StringRef StyleName, StringRef FileName, >> - StringRef FallbackStyle); >> + StringRef FallbackStyle, vfs::FileSystem *FS = >> nullptr); >> >> } // end namespace format >> } // end namespace clang >> >> Modified: cfe/trunk/lib/Format/Format.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=264277&r1=264276&r2=264277&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Format/Format.cpp (original) >> +++ cfe/trunk/lib/Format/Format.cpp Thu Mar 24 08:22:42 2016 >> @@ -2099,7 +2099,10 @@ static FormatStyle::LanguageKind getLang >> } >> >> FormatStyle getStyle(StringRef StyleName, StringRef FileName, >> - StringRef FallbackStyle) { >> + StringRef FallbackStyle, vfs::FileSystem *FS) { >> + if (!FS) { >> + FS = vfs::getRealFileSystem().get(); >> + } >> FormatStyle Style = getLLVMStyle(); >> Style.Language = getLanguageByFileName(FileName); >> if (!getPredefinedStyle(FallbackStyle, Style.Language, &Style)) { >> @@ -2130,28 +2133,34 @@ FormatStyle getStyle(StringRef StyleName >> llvm::sys::fs::make_absolute(Path); >> for (StringRef Directory = Path; !Directory.empty(); >> Directory = llvm::sys::path::parent_path(Directory)) { >> - if (!llvm::sys::fs::is_directory(Directory)) >> + >> + auto Status = FS->status(Directory); >> + if (!Status || >> + Status->getType() != llvm::sys::fs::file_type::directory_file) { >> continue; >> + } >> + >> SmallString<128> ConfigFile(Directory); >> >> llvm::sys::path::append(ConfigFile, ".clang-format"); >> DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n"); >> - bool IsFile = false; >> - // Ignore errors from is_regular_file: we only need to know if we >> can read >> - // the file or not. >> - llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile); >> >> + Status = FS->status(ConfigFile.str()); >> + bool IsFile = >> + Status && (Status->getType() == >> llvm::sys::fs::file_type::regular_file); >> 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); >> + Status = FS->status(ConfigFile.str()); >> + IsFile = Status && >> + (Status->getType() == >> llvm::sys::fs::file_type::regular_file); >> } >> >> if (IsFile) { >> llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text = >> - llvm::MemoryBuffer::getFile(ConfigFile.c_str()); >> + FS->getBufferForFile(ConfigFile.str()); >> if (std::error_code EC = Text.getError()) { >> llvm::errs() << EC.message() << "\n"; >> break; >> >> Modified: cfe/trunk/unittests/Format/FormatTest.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=264277&r1=264276&r2=264277&view=diff >> >> ============================================================================== >> --- cfe/trunk/unittests/Format/FormatTest.cpp (original) >> +++ cfe/trunk/unittests/Format/FormatTest.cpp Thu Mar 24 08:22:42 2016 >> @@ -14,6 +14,7 @@ >> >> #include "clang/Frontend/TextDiagnosticPrinter.h" >> #include "llvm/Support/Debug.h" >> +#include "llvm/Support/MemoryBuffer.h" >> #include "gtest/gtest.h" >> >> #define DEBUG_TYPE "format-test" >> @@ -11199,6 +11200,39 @@ TEST_F(FormatTest, FormatsTableGenCode) >> verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); >> } >> >> +// Since this test case uses UNIX-style file path. We disable it for MS >> +// compiler. >> +#if !defined(_MSC_VER) >> + >> +TEST(FormatStyle, GetStyleOfFile) { >> + vfs::InMemoryFileSystem FS; >> + // Test 1: format file in the same directory. >> + ASSERT_TRUE( >> + FS.addFile("/a/.clang-format", 0, >> + llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: >> LLVM"))); >> + ASSERT_TRUE( >> + FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int >> i;"))); >> + auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS); >> + ASSERT_EQ(Style1, getLLVMStyle()); >> + >> + // Test 2: fallback to default. >> + ASSERT_TRUE( >> + FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int >> i;"))); >> + auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS); >> + ASSERT_EQ(Style2, getMozillaStyle()); >> + >> + // Test 3: format file in parent directory. >> + ASSERT_TRUE( >> + FS.addFile("/c/.clang-format", 0, >> + llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: >> Google"))); >> + ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, >> + llvm::MemoryBuffer::getMemBuffer("int i;"))); >> + auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS); >> + ASSERT_EQ(Style3, getGoogleStyle()); >> +} >> + >> +#endif // _MSC_VER >> + >> class ReplacementTest : public ::testing::Test { >> protected: >> tooling::Replacement createReplacement(SourceLocation Start, unsigned >> Length, >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits