r325691 - [clang-format] New API guessLanguage()

via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 21 12:47:30 PST 2018


Hi Ben,

Your change is causing a test failure on one of the bots, can you take a look?

http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/25515

FAIL: Clang Tools :: clang-apply-replacements/format.cpp (12526 of 38114)
******************** TEST 'Clang Tools :: clang-apply-replacements/format.cpp' FAILED ********************
Script:
--
mkdir -p /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format
grep -Ev "// *[A-Z-]+:" /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/clang/tools/extra/test/clang-apply-replacements/Inputs/format/yes.cpp > /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format/yes.cpp
grep -Ev "// *[A-Z-]+:" /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/clang/tools/extra/test/clang-apply-replacements/Inputs/format/no.cpp > /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format/no.cpp
sed "s#\$(path)#/home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format#" /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/clang/tools/extra/test/clang-apply-replacements/Inputs/format/yes.yaml > /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format/yes.yaml
sed "s#\$(path)#/home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format#" /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/clang/tools/extra/test/clang-apply-replacements/Inputs/format/no.yaml > /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format/no.yaml
clang-apply-replacements -format /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format
FileCheck --strict-whitespace -input-file=/home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format/yes.cpp /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/clang/tools/extra/test/clang-apply-replacements/Inputs/format/yes.cpp
FileCheck --strict-whitespace -input-file=/home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format/no.cpp /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/clang/tools/extra/test/clang-apply-replacements/Inputs/format/no.cpp
--
Exit Code: 134

Command Output (stderr):
--
clang-apply-replacements: /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/clang/lib/Basic/SourceManager.cpp:393: const clang::SrcMgr::ContentCache *clang::SourceManager::getOrCreateContentCache(const clang::FileEntry *, bool): Assertion `FileEnt && "Didn't specify a file entry to use?"' failed.
/home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/format.cpp.script: line 8: 49680 Aborted                 (core dumped) clang-apply-replacements -format /home/buildslave/ps4-buildslave4/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/tools/clang/tools/extra/test/clang-apply-replacements/Output/Inputs/format

--

********************

Douglas Yung


> -----Original Message-----
> From: cfe-commits [mailto:cfe-commits-bounces at lists.llvm.org] On Behalf Of Ben
> Hamilton via cfe-commits
> Sent: Wednesday, February 21, 2018 7:55
> To: cfe-commits at lists.llvm.org
> Subject: r325691 - [clang-format] New API guessLanguage()
> 
> Author: benhamilton
> Date: Wed Feb 21 07:54:31 2018
> New Revision: 325691
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=325691&view=rev
> Log:
> [clang-format] New API guessLanguage()
> 
> Summary:
> For clients which don't have a filesystem, calling getStyle() doesn't make
> much sense (there's no .clang-format files to search for).
> 
> In this diff, I hoist out the language-guessing logic from getStyle() and move
> it into a new API guessLanguage().
> 
> I also added support for guessing the language of files which have no
> extension (they could be C++ or ObjC).
> 
> Test Plan: New tests added. Ran tests with:
>   % make -j12 FormatTests && ./tools/clang/unittests/Format/FormatTests
> 
> Reviewers: jolesiak, krasimir
> 
> Reviewed By: jolesiak, krasimir
> 
> Subscribers: klimek, cfe-commits, sammccall
> 
> Differential Revision: https://reviews.llvm.org/D43522
> 
> 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=325691&r1=325690&r2=325691
> &view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Format/Format.h (original)
> +++ cfe/trunk/include/clang/Format/Format.h Wed Feb 21 07:54:31 2018
> @@ -1981,6 +1981,10 @@ llvm::Expected<FormatStyle> getStyle(Str
>                                       StringRef Code = "",
>                                       vfs::FileSystem *FS = nullptr);
> 
> +// \brief Guesses the language from the ``FileName`` and ``Code`` to be
> formatted.
> +// Defaults to FormatStyle::LK_Cpp.
> +FormatStyle::LanguageKind guessLanguage(StringRef FileName, StringRef
> +Code);
> +
>  // \brief Returns a string representation of ``Language``.
>  inline StringRef getLanguageName(FormatStyle::LanguageKind Language) {
>    switch (Language) {
> 
> Modified: cfe/trunk/lib/Format/Format.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/cfe/trunk/lib/Format/Format.cpp?rev=325691&r1=325690&r2=325691&view=di
> ff
> ==============================================================================
> --- cfe/trunk/lib/Format/Format.cpp (original)
> +++ cfe/trunk/lib/Format/Format.cpp Wed Feb 21 07:54:31 2018
> @@ -2294,6 +2294,25 @@ static FormatStyle::LanguageKind getLang
>    return FormatStyle::LK_Cpp;
>  }
> 
> +FormatStyle::LanguageKind guessLanguage(StringRef FileName, StringRef
> +Code) {
> +  FormatStyle::LanguageKind result = getLanguageByFileName(FileName);
> +  if (result == FormatStyle::LK_Cpp) {
> +    auto extension = llvm::sys::path::extension(FileName);
> +    // If there's no file extension (or it's .h), we need to check the
> contents
> +    // of the code to see if it contains Objective-C.
> +    if (extension.empty() || extension == ".h") {
> +      std::unique_ptr<Environment> Env =
> +          Environment::CreateVirtualEnvironment(Code, FileName,
> /*Ranges=*/{});
> +      ObjCHeaderStyleGuesser Guesser(*Env, getLLVMStyle());
> +      Guesser.process();
> +      if (Guesser.isObjC()) {
> +        result = FormatStyle::LK_ObjC;
> +      }
> +    }
> +  }
> +  return result;
> +}
> +
>  llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
>                                       StringRef FallbackStyleName,
>                                       StringRef Code, vfs::FileSystem *FS) {
> @@ -2301,17 +2320,7 @@ llvm::Expected<FormatStyle> getStyle(Str
>      FS = vfs::getRealFileSystem().get();
>    }
>    FormatStyle Style = getLLVMStyle();
> -  Style.Language = getLanguageByFileName(FileName);
> -
> -  if (Style.Language == FormatStyle::LK_Cpp && FileName.endswith(".h")) {
> -    std::unique_ptr<Environment> Env =
> -        Environment::CreateVirtualEnvironment(Code, FileName, /*Ranges=*/{});
> -    ObjCHeaderStyleGuesser Guesser(*Env, Style);
> -    Guesser.process();
> -    if (Guesser.isObjC()) {
> -      Style.Language = FormatStyle::LK_ObjC;
> -    }
> -  }
> +  Style.Language = guessLanguage(FileName, Code);
> 
>    FormatStyle FallbackStyle = getNoStyle();
>    if (!getPredefinedStyle(FallbackStyleName, Style.Language, &FallbackStyle))
> 
> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=325691&r1=325690&r2=3256
> 91&view=diff
> ==============================================================================
> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
> +++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Feb 21 07:54:31 2018
> @@ -11952,6 +11952,34 @@ TEST_F(FormatTest, StructuredBindings) {
>    verifyFormat("auto const &[ a, b ] = f();", Spaces);  }
> 
> +struct GuessLanguageTestCase {
> +  const char *const FileName;
> +  const char *const Code;
> +  const FormatStyle::LanguageKind ExpectedResult; };
> +
> +class GuessLanguageTest
> +    : public FormatTest,
> +      public ::testing::WithParamInterface<GuessLanguageTestCase> {};
> +
> +TEST_P(GuessLanguageTest, FileAndCode) {
> +  auto TestCase = GetParam();
> +  EXPECT_EQ(TestCase.ExpectedResult,
> +            guessLanguage(TestCase.FileName, TestCase.Code)); }
> +
> +static const GuessLanguageTestCase TestCases[] = {
> +    {"foo.cc", "", FormatStyle::LK_Cpp},
> +    {"foo.m", "", FormatStyle::LK_ObjC},
> +    {"foo.mm", "", FormatStyle::LK_ObjC},
> +    {"foo.h", "", FormatStyle::LK_Cpp},
> +    {"foo.h", "@interface Foo\n at end\n", FormatStyle::LK_ObjC},
> +    {"foo", "", FormatStyle::LK_Cpp},
> +    {"foo", "@interface Foo\n at end\n", FormatStyle::LK_ObjC}, };
> +INSTANTIATE_TEST_CASE_P(ValidLanguages, GuessLanguageTest,
> +                        ::testing::ValuesIn(TestCases));
> +
>  } // end namespace
>  } // end namespace format
>  } // end namespace clang
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list