r195961 - Added LanguageStandard::LS_JavaScript to gate all JS-specific parsing.
Daniel Jasper
djasper at google.com
Mon Dec 2 00:27:37 PST 2013
On Sun, Dec 1, 2013 at 12:26 AM, Nico Weber <thakis at chromium.org> wrote:
> unittests/Format/FormatTest.cpp is pretty large by now. Should js-specific
> tests maybe go into a new file?
>
Sounds like a good idea to me.
On Sat, Nov 30, 2013 at 12:19 AM, Alexander Kornienko <alexfh at google.com>wrote:
>
>> Author: alexfh
>> Date: Fri Nov 29 09:19:43 2013
>> New Revision: 195961
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=195961&view=rev
>> Log:
>> Added LanguageStandard::LS_JavaScript to gate all JS-specific parsing.
>>
>> Summary:
>> Use LS_JavaScript for files ending with ".js". Added support for ">>>="
>> operator.
>>
>> Reviewers: djasper, klimek
>>
>> Reviewed By: djasper
>>
>> CC: cfe-commits, klimek
>>
>> Differential Revision: http://llvm-reviews.chandlerc.com/D2242
>>
>> Added:
>> cfe/trunk/test/Format/language-detection.cpp
>> 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=195961&r1=195960&r2=195961&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Format/Format.h (original)
>> +++ cfe/trunk/include/clang/Format/Format.h Fri Nov 29 09:19:43 2013
>> @@ -30,6 +30,21 @@ namespace format {
>> /// \brief The \c FormatStyle is used to configure the formatting to
>> follow
>> /// specific guidelines.
>> struct FormatStyle {
>> + /// \brief Supported languages. When stored in a configuration file,
>> specifies
>> + /// the language, that the configuration targets. When passed to the
>> + /// reformat() function, enables syntax features specific to the
>> language.
>> + enum LanguageKind {
>> + /// Do not use.
>> + LK_None,
>> + /// Should be used for C, C++, ObjectiveC, ObjectiveC++.
>> + LK_Cpp,
>> + /// Should be used for JavaScript.
>> + LK_JavaScript
>> + };
>> +
>> + /// \brief Language, this format style is targeted at.
>> + LanguageKind Language;
>> +
>> /// \brief The column limit.
>> ///
>> /// A column limit of \c 0 means that there is no column limit. In
>> this case,
>> @@ -283,7 +298,7 @@ struct FormatStyle {
>> IndentCaseLabels == R.IndentCaseLabels &&
>> IndentFunctionDeclarationAfterType ==
>> R.IndentFunctionDeclarationAfterType &&
>> - IndentWidth == R.IndentWidth &&
>> + IndentWidth == R.IndentWidth && Language == R.Language &&
>> MaxEmptyLinesToKeep == R.MaxEmptyLinesToKeep &&
>> NamespaceIndentation == R.NamespaceIndentation &&
>> ObjCSpaceBeforeProtocolList == R.ObjCSpaceBeforeProtocolList
>> &&
>>
>> Modified: cfe/trunk/lib/Format/Format.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=195961&r1=195960&r2=195961&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Format/Format.cpp (original)
>> +++ cfe/trunk/lib/Format/Format.cpp Fri Nov 29 09:19:43 2013
>> @@ -34,6 +34,15 @@
>> namespace llvm {
>> namespace yaml {
>> template <>
>> +struct ScalarEnumerationTraits<clang::format::FormatStyle::LanguageKind>
>> {
>> + static void enumeration(IO &IO,
>> + clang::format::FormatStyle::LanguageKind
>> &Value) {
>> + IO.enumCase(Value, "Cpp", clang::format::FormatStyle::LK_Cpp);
>> + IO.enumCase(Value, "JavaScript",
>> clang::format::FormatStyle::LK_JavaScript);
>> + }
>> +};
>> +
>> +template <>
>> struct
>> ScalarEnumerationTraits<clang::format::FormatStyle::LanguageStandard> {
>> static void enumeration(IO &IO,
>> clang::format::FormatStyle::LanguageStandard
>> &Value) {
>> @@ -99,13 +108,17 @@ template <> struct MappingTraits<clang::
>> } else {
>> StringRef BasedOnStyle;
>> IO.mapOptional("BasedOnStyle", BasedOnStyle);
>> - if (!BasedOnStyle.empty())
>> + if (!BasedOnStyle.empty()) {
>> + clang::format::FormatStyle::LanguageKind Language =
>> Style.Language;
>> if (!clang::format::getPredefinedStyle(BasedOnStyle, &Style)) {
>> IO.setError(Twine("Unknown value for BasedOnStyle: ",
>> BasedOnStyle));
>> return;
>> }
>> + Style.Language = Language;
>> + }
>> }
>>
>> + IO.mapOptional("Language", Style.Language);
>> IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset);
>> IO.mapOptional("ConstructorInitializerIndentWidth",
>> Style.ConstructorInitializerIndentWidth);
>> @@ -173,6 +186,36 @@ template <> struct MappingTraits<clang::
>> IO.mapOptional("ContinuationIndentWidth",
>> Style.ContinuationIndentWidth);
>> }
>> };
>> +
>> +// Allows to read vector<FormatStyle> while keeping default values.
>> +// Elements will be written or read starting from the 1st element.
>> +// When writing, the 0th element is ignored.
>> +// When reading, keys that are not present in the serialized form will be
>> +// copied from the 0th element of the vector. If the first element had no
>> +// Language specified, it will be treated as the default one for the
>> following
>> +// elements.
>> +template <>
>> +struct DocumentListTraits<std::vector<clang::format::FormatStyle> > {
>> + static size_t size(IO &io, std::vector<clang::format::FormatStyle>
>> &Seq) {
>> + return Seq.size() - 1;
>> + }
>> + static clang::format::FormatStyle &
>> + element(IO &io, std::vector<clang::format::FormatStyle> &Seq, size_t
>> Index) {
>> + if (Index + 2 > Seq.size()) {
>> + assert(Index + 2 == Seq.size() + 1);
>> + clang::format::FormatStyle Template;
>> + if (Seq.size() > 1 &&
>> + Seq[1].Language == clang::format::FormatStyle::LK_None) {
>> + Template = Seq[1];
>> + } else {
>> + Template = Seq[0];
>> + Template.Language = clang::format::FormatStyle::LK_None;
>> + }
>> + Seq.resize(Index + 2, Template);
>> + }
>> + return Seq[Index + 1];
>> + }
>> +};
>> }
>> }
>>
>> @@ -188,6 +231,7 @@ void setDefaultPenalties(FormatStyle &St
>>
>> FormatStyle getLLVMStyle() {
>> FormatStyle LLVMStyle;
>> + LLVMStyle.Language = FormatStyle::LK_Cpp;
>> LLVMStyle.AccessModifierOffset = -2;
>> LLVMStyle.AlignEscapedNewlinesLeft = false;
>> LLVMStyle.AlignTrailingComments = true;
>> @@ -236,6 +280,7 @@ FormatStyle getLLVMStyle() {
>>
>> FormatStyle getGoogleStyle() {
>> FormatStyle GoogleStyle;
>> + GoogleStyle.Language = FormatStyle::LK_Cpp;
>> GoogleStyle.AccessModifierOffset = -1;
>> GoogleStyle.AlignEscapedNewlinesLeft = true;
>> GoogleStyle.AlignTrailingComments = true;
>> @@ -337,11 +382,42 @@ bool getPredefinedStyle(StringRef Name,
>> }
>>
>> llvm::error_code parseConfiguration(StringRef Text, FormatStyle *Style) {
>> + assert(Style);
>> + assert(Style->Language != FormatStyle::LK_None);
>> if (Text.trim().empty())
>> return llvm::make_error_code(llvm::errc::invalid_argument);
>> +
>> + std::vector<FormatStyle> Styles;
>> + // DocumentListTraits<vector<FormatStyle>> uses 0th element as the
>> default one
>> + // for the fields, keys for which are missing from the configuration.
>> + Styles.push_back(*Style);
>> llvm::yaml::Input Input(Text);
>> - Input >> *Style;
>> - return Input.error();
>> + Input >> Styles;
>> + if (Input.error())
>> + return Input.error();
>> +
>> + for (unsigned i = 1; i < Styles.size(); ++i) {
>> + // Ensures that only the first configuration can skip the Language
>> option.
>> + if (Styles[i].Language == FormatStyle::LK_None && i != 1)
>> + return llvm::make_error_code(llvm::errc::invalid_argument);
>> + // Ensure that each language is configured at most once.
>> + for (unsigned j = 1; j < i; ++j) {
>> + if (Styles[i].Language == Styles[j].Language)
>> + return llvm::make_error_code(llvm::errc::invalid_argument);
>> + }
>> + }
>> + // Look for a suitable configuration starting from the end, so we can
>> + // find the configuration for the specific language first, and the
>> default
>> + // configuration (which can only be at slot 1) after it.
>> + for (unsigned i = Styles.size() - 1; i > 0; --i) {
>> + if (Styles[i].Language == Styles[0].Language ||
>> + Styles[i].Language == FormatStyle::LK_None) {
>> + *Style = Styles[i];
>> + Style->Language = Styles[0].Language;
>> + return llvm::make_error_code(llvm::errc::success);
>> + }
>> + }
>> + return llvm::make_error_code(llvm::errc::not_supported);
>> }
>>
>> std::string configurationAsText(const FormatStyle &Style) {
>> @@ -986,24 +1062,44 @@ public:
>>
>> private:
>> void tryMergePreviousTokens() {
>> - tryMerge_TMacro() || tryMergeJavaScriptIdentityOperators();
>> + if (tryMerge_TMacro())
>> + return;
>> +
>> + if (Style.Language == FormatStyle::LK_JavaScript) {
>> + static tok::TokenKind JSIdentity[] = { tok::equalequal, tok::equal
>> };
>> + static tok::TokenKind JSNotIdentity[] = { tok::exclaimequal,
>> tok::equal };
>> + static tok::TokenKind JSShiftEqual[] = { tok::greater,
>> tok::greater,
>> + tok::greaterequal };
>> + // FIXME: We probably need to change token type to mimic operator
>> with the
>> + // correct priority.
>> + if (tryMergeTokens(JSIdentity))
>> + return;
>> + if (tryMergeTokens(JSNotIdentity))
>> + return;
>> + if (tryMergeTokens(JSShiftEqual))
>> + return;
>> + }
>> }
>>
>> - bool tryMergeJavaScriptIdentityOperators() {
>> - if (Tokens.size() < 2)
>> - return false;
>> - FormatToken &First = *Tokens[Tokens.size() - 2];
>> - if (!First.isOneOf(tok::exclaimequal, tok::equalequal))
>> + bool tryMergeTokens(ArrayRef<tok::TokenKind> Kinds) {
>> + if (Tokens.size() < Kinds.size())
>> return false;
>> - FormatToken &Second = *Tokens.back();
>> - if (!Second.is(tok::equal))
>> - return false;
>> - if (Second.WhitespaceRange.getBegin() !=
>> Second.WhitespaceRange.getEnd())
>> +
>> + SmallVectorImpl<FormatToken *>::const_iterator First =
>> + Tokens.end() - Kinds.size();
>> + if (!First[0]->is(Kinds[0]))
>> return false;
>> - First.TokenText =
>> - StringRef(First.TokenText.data(), First.TokenText.size() + 1);
>> - First.ColumnWidth += 1;
>> - Tokens.pop_back();
>> + unsigned AddLength = 0;
>> + for (unsigned i = 1; i < Kinds.size(); ++i) {
>> + if (!First[i]->is(Kinds[i]) ||
>> First[i]->WhitespaceRange.getBegin() !=
>> +
>> First[i]->WhitespaceRange.getEnd())
>> + return false;
>> + AddLength += First[i]->TokenText.size();
>> + }
>> + Tokens.resize(Tokens.size() - Kinds.size() + 1);
>> + First[0]->TokenText = StringRef(First[0]->TokenText.data(),
>> + First[0]->TokenText.size() +
>> AddLength);
>> + First[0]->ColumnWidth += AddLength;
>> return true;
>> }
>>
>> @@ -1201,6 +1297,17 @@ private:
>> }
>> };
>>
>> +static StringRef getLanguageName(FormatStyle::LanguageKind Language) {
>> + switch (Language) {
>> + case FormatStyle::LK_Cpp:
>> + return "C++";
>> + case FormatStyle::LK_JavaScript:
>> + return "JavaScript";
>> + default:
>> + return "Unknown";
>> + }
>> +}
>> +
>> class Formatter : public UnwrappedLineConsumer {
>> public:
>> Formatter(const FormatStyle &Style, Lexer &Lex, SourceManager
>> &SourceMgr,
>> @@ -1213,6 +1320,8 @@ public:
>> << (Encoding == encoding::Encoding_UTF8 ? "UTF8"
>> :
>> "unknown")
>> << "\n");
>> + DEBUG(llvm::dbgs() << "Language: " << getLanguageName(Style.Language)
>> + << "\n");
>> }
>>
>> tooling::Replacements format() {
>> @@ -1538,11 +1647,26 @@ const char *StyleOptionHelpDescription =
>> "parameters, e.g.:\n"
>> " -style=\"{BasedOnStyle: llvm, IndentWidth: 8}\"";
>>
>> +static void fillLanguageByFileName(StringRef FileName, FormatStyle
>> *Style) {
>> + if (FileName.endswith_lower(".c") || FileName.endswith_lower(".h") ||
>> + FileName.endswith_lower(".cpp") || FileName.endswith_lower(".hpp")
>> ||
>> + FileName.endswith_lower(".cc") || FileName.endswith_lower(".hh") ||
>> + FileName.endswith_lower(".cxx") || FileName.endswith_lower(".hxx")
>> ||
>> + FileName.endswith_lower(".m") || FileName.endswith_lower(".mm")) {
>> + Style->Language = FormatStyle::LK_Cpp;
>> + }
>> + if (FileName.endswith_lower(".js")) {
>> + Style->Language = FormatStyle::LK_JavaScript;
>> + }
>> +}
>> +
>> FormatStyle getStyle(StringRef StyleName, StringRef FileName) {
>> + // FIXME: Configure fallback style from outside (add a command line
>> option).
>> // Fallback style in case the rest of this function can't determine a
>> style.
>> StringRef FallbackStyle = "LLVM";
>> FormatStyle Style;
>> getPredefinedStyle(FallbackStyle, &Style);
>> + fillLanguageByFileName(FileName, &Style);
>>
>> if (StyleName.startswith("{")) {
>> // Parse YAML/JSON style from the command line.
>> @@ -1557,9 +1681,11 @@ FormatStyle getStyle(StringRef StyleName
>> if (!getPredefinedStyle(StyleName, &Style))
>> llvm::errs() << "Invalid value for -style, using " << FallbackStyle
>> << " style\n";
>> + fillLanguageByFileName(FileName, &Style);
>> return Style;
>> }
>>
>> + SmallString<128> UnsuitableConfigFiles;
>> SmallString<128> Path(FileName);
>> llvm::sys::fs::make_absolute(Path);
>> for (StringRef Directory = Path; !Directory.empty();
>> @@ -1591,8 +1717,14 @@ FormatStyle getStyle(StringRef StyleName
>> continue;
>> }
>> if (llvm::error_code ec = parseConfiguration(Text->getBuffer(),
>> &Style)) {
>> - llvm::errs() << "Error reading " << ConfigFile << ": " <<
>> ec.message()
>> - << "\n";
>> + if (ec == llvm::errc::not_supported) {
>> + if (!UnsuitableConfigFiles.empty())
>> + UnsuitableConfigFiles.append(", ");
>> + UnsuitableConfigFiles.append(ConfigFile);
>> + } else {
>> + llvm::errs() << "Error reading " << ConfigFile << ": " <<
>> ec.message()
>> + << "\n";
>> + }
>> continue;
>> }
>> DEBUG(llvm::dbgs() << "Using configuration file " << ConfigFile <<
>> "\n");
>> @@ -1601,6 +1733,11 @@ FormatStyle getStyle(StringRef StyleName
>> }
>> llvm::errs() << "Can't find usable .clang-format, using " <<
>> FallbackStyle
>> << " style\n";
>> + if (!UnsuitableConfigFiles.empty()) {
>> + llvm::errs() << "Configuration file(s) do(es) not support "
>> + << getLanguageName(Style.Language) << ": "
>> + << UnsuitableConfigFiles << "\n";
>> + }
>> return Style;
>> }
>>
>>
>> Added: cfe/trunk/test/Format/language-detection.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Format/language-detection.cpp?rev=195961&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/Format/language-detection.cpp (added)
>> +++ cfe/trunk/test/Format/language-detection.cpp Fri Nov 29 09:19:43 2013
>> @@ -0,0 +1,7 @@
>> +// RUN: grep -Ev "// *[A-Z0-9_]+:" %s > %t.js
>> +// RUN: grep -Ev "// *[A-Z0-9_]+:" %s > %t.cpp
>> +// RUN: clang-format -style=llvm %t.js | FileCheck -strict-whitespace
>> -check-prefix=CHECK1 %s
>> +// RUN: clang-format -style=llvm %t.cpp | FileCheck -strict-whitespace
>> -check-prefix=CHECK2 %s
>> +// CHECK1: {{^a >>>= b;$}}
>> +// CHECK2: {{^a >> >= b;$}}
>> +a >>>= b;
>>
>> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=195961&r1=195960&r2=195961&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
>> +++ cfe/trunk/unittests/Format/FormatTest.cpp Fri Nov 29 09:19:43 2013
>> @@ -6939,8 +6939,6 @@ TEST_F(FormatTest, GetsPredefinedStyleBy
>> EXPECT_FALSE(getPredefinedStyle("qwerty", &Styles[0]));
>> }
>>
>> -TEST_F(FormatTest, ParsesConfiguration) {
>> - FormatStyle Style = {};
>> #define CHECK_PARSE(TEXT, FIELD, VALUE)
>> \
>> EXPECT_NE(VALUE, Style.FIELD);
>> \
>> EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());
>> \
>> @@ -6953,6 +6951,9 @@ TEST_F(FormatTest, ParsesConfiguration)
>> EXPECT_EQ(0, parseConfiguration(#FIELD ": false", &Style).value());
>> \
>> EXPECT_FALSE(Style.FIELD);
>>
>> +TEST_F(FormatTest, ParsesConfiguration) {
>> + FormatStyle Style = {};
>> + Style.Language = FormatStyle::LK_Cpp;
>> CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
>> CHECK_PARSE_BOOL(AlignTrailingComments);
>> CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
>> @@ -7027,15 +7028,117 @@ TEST_F(FormatTest, ParsesConfiguration)
>> FormatStyle::NI_Inner);
>> CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
>> FormatStyle::NI_All);
>> +}
>> +
>> +TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
>> + FormatStyle Style = {};
>> + Style.Language = FormatStyle::LK_Cpp;
>> + CHECK_PARSE("Language: Cpp\n"
>> + "IndentWidth: 12",
>> + IndentWidth, 12u);
>> + EXPECT_EQ(llvm::errc::not_supported,
>> + parseConfiguration("Language: JavaScript\n"
>> + "IndentWidth: 34",
>> + &Style));
>> + EXPECT_EQ(12u, Style.IndentWidth);
>> + CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
>> + EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
>> +
>> + Style.Language = FormatStyle::LK_JavaScript;
>> + CHECK_PARSE("Language: JavaScript\n"
>> + "IndentWidth: 12",
>> + IndentWidth, 12u);
>> + CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
>> + EXPECT_EQ(llvm::errc::not_supported, parseConfiguration("Language:
>> Cpp\n"
>> + "IndentWidth:
>> 34",
>> + &Style));
>> + EXPECT_EQ(23u, Style.IndentWidth);
>> + CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
>> + EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
>> +
>> + CHECK_PARSE("BasedOnStyle: LLVM\n"
>> + "IndentWidth: 67",
>> + IndentWidth, 67u);
>> +
>> + CHECK_PARSE("---\n"
>> + "Language: JavaScript\n"
>> + "IndentWidth: 12\n"
>> + "---\n"
>> + "Language: Cpp\n"
>> + "IndentWidth: 34\n"
>> + "...\n",
>> + IndentWidth, 12u);
>> +
>> + Style.Language = FormatStyle::LK_Cpp;
>> + CHECK_PARSE("---\n"
>> + "Language: JavaScript\n"
>> + "IndentWidth: 12\n"
>> + "---\n"
>> + "Language: Cpp\n"
>> + "IndentWidth: 34\n"
>> + "...\n",
>> + IndentWidth, 34u);
>> + CHECK_PARSE("---\n"
>> + "IndentWidth: 78\n"
>> + "---\n"
>> + "Language: JavaScript\n"
>> + "IndentWidth: 56\n"
>> + "...\n",
>> + IndentWidth, 78u);
>> +
>> + Style.ColumnLimit = 123;
>> + Style.IndentWidth = 234;
>> + Style.BreakBeforeBraces = FormatStyle::BS_Linux;
>> + Style.TabWidth = 345;
>> + EXPECT_EQ(llvm::errc::success,
>> + parseConfiguration("---\n"
>> + "IndentWidth: 456\n"
>> + "BreakBeforeBraces: Allman\n"
>> + "---\n"
>> + "Language: JavaScript\n"
>> + "IndentWidth: 111\n"
>> + "TabWidth: 111\n"
>> + "---\n"
>> + "Language: Cpp\n"
>> + "BreakBeforeBraces: Stroustrup\n"
>> + "TabWidth: 789\n"
>> + "...\n",
>> + &Style));
>> + EXPECT_EQ(123u, Style.ColumnLimit);
>> + EXPECT_EQ(456u, Style.IndentWidth);
>> + EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
>> + EXPECT_EQ(789u, Style.TabWidth);
>> +
>> +
>> + EXPECT_EQ(llvm::errc::invalid_argument,
>> + parseConfiguration("---\n"
>> + "Language: JavaScript\n"
>> + "IndentWidth: 56\n"
>> + "---\n"
>> + "IndentWidth: 78\n"
>> + "...\n",
>> + &Style));
>> + EXPECT_EQ(llvm::errc::invalid_argument,
>> + parseConfiguration("---\n"
>> + "Language: JavaScript\n"
>> + "IndentWidth: 56\n"
>> + "---\n"
>> + "Language: JavaScript\n"
>> + "IndentWidth: 78\n"
>> + "...\n",
>> + &Style));
>> +
>> + EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
>> +}
>>
>> #undef CHECK_PARSE
>> #undef CHECK_PARSE_BOOL
>> -}
>>
>> TEST_F(FormatTest, ConfigurationRoundTripTest) {
>> FormatStyle Style = getLLVMStyle();
>> std::string YAML = configurationAsText(Style);
>> FormatStyle ParsedStyle = {};
>> + ParsedStyle.Language = FormatStyle::LK_Cpp;
>> EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
>> EXPECT_EQ(Style, ParsedStyle);
>> }
>> @@ -7457,18 +7560,36 @@ TEST_F(FormatTest, SpacesInAngles) {
>> }
>>
>> TEST_F(FormatTest, UnderstandsJavaScript) {
>> - verifyFormat("a == = b;");
>> - verifyFormat("a != = b;");
>> -
>> - verifyFormat("a === b;");
>> - verifyFormat("aaaaaaa ===\n b;", getLLVMStyleWithColumns(10));
>> - verifyFormat("a !== b;");
>> - verifyFormat("aaaaaaa !==\n b;", getLLVMStyleWithColumns(10));
>> + FormatStyle JS = getLLVMStyle();
>> + FormatStyle JS10Columns = getLLVMStyleWithColumns(10);
>> + FormatStyle JS20Columns = getLLVMStyleWithColumns(20);
>> + JS.Language = JS10Columns.Language = JS20Columns.Language =
>> + FormatStyle::LK_JavaScript;
>> +
>> + verifyFormat("a == = b;", JS);
>> + verifyFormat("a != = b;", JS);
>> +
>> + verifyFormat("a === b;", JS);
>> + verifyFormat("aaaaaaa ===\n b;", JS10Columns);
>> + verifyFormat("a !== b;", JS);
>> + verifyFormat("aaaaaaa !==\n b;", JS10Columns);
>> verifyFormat("if (a + b + c +\n"
>> " d !==\n"
>> " e + f + g)\n"
>> " q();",
>> - getLLVMStyleWithColumns(20));
>> + JS20Columns);
>> +
>> + verifyFormat("a >> >= b;", JS);
>> +
>> + verifyFormat("a >>> b;", JS);
>> + verifyFormat("aaaaaaa >>>\n b;", JS10Columns);
>> + verifyFormat("a >>>= b;", JS);
>> + verifyFormat("aaaaaaa >>>=\n b;", JS10Columns);
>> + verifyFormat("if (a + b + c +\n"
>> + " d >>>\n"
>> + " e + f + g)\n"
>> + " q();",
>> + JS20Columns);
>> }
>>
>> } // end namespace tooling
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131202/31c90c76/attachment.html>
More information about the cfe-commits
mailing list