r195961 - Added LanguageStandard::LS_JavaScript to gate all JS-specific parsing.

Nico Weber thakis at chromium.org
Sat Nov 30 15:26:26 PST 2013


unittests/Format/FormatTest.cpp is pretty large by now. Should js-specific
tests maybe go into a new file?


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131201/2cc8751e/attachment.html>


More information about the cfe-commits mailing list