<p dir="ltr">I think I'd rather have a different style and let clang-format's caller (E.g. the editor integration) decide. But it is just a gut feeling.. </p>
<p dir="ltr">On Nov 21, 2013 4:10 PM, "Alexander Kornienko" <<a href="mailto:alexfh@google.com">alexfh@google.com</a>> wrote:<br>
><br>
> Hi djasper, klimek,<br>
><br>
> Use LS_JavaScript for files ending with ".js". Added support for ">>>="<br>
> operator.<br>
><br>
> <a href="http://llvm-reviews.chandlerc.com/D2242">http://llvm-reviews.chandlerc.com/D2242</a><br>
><br>
> Files:<br>
>   include/clang/Format/Format.h<br>
>   lib/Format/Format.cpp<br>
>   unittests/Format/FormatTest.cpp<br>
><br>
> Index: include/clang/Format/Format.h<br>
> ===================================================================<br>
> --- include/clang/Format/Format.h<br>
> +++ include/clang/Format/Format.h<br>
> @@ -71,6 +71,8 @@<br>
>      /// Use features of C++11 (e.g. \c A<A<int>> instead of<br>
>      /// <tt>A<A<int> ></tt>).<br>
>      LS_Cpp11,<br>
> +    /// Allow JavaScript-specific syntax constructs.<br>
> +    LS_JavaScript,<br>
>      /// Automatic detection based on the input.<br>
>      LS_Auto<br>
>    };<br>
> Index: lib/Format/Format.cpp<br>
> ===================================================================<br>
> --- lib/Format/Format.cpp<br>
> +++ lib/Format/Format.cpp<br>
> @@ -1038,24 +1038,40 @@<br>
><br>
>  private:<br>
>    void tryMergePreviousTokens() {<br>
> -    tryMerge_TMacro() || tryMergeJavaScriptIdentityOperators();<br>
> +    if (tryMerge_TMacro())<br>
> +      return;<br>
> +<br>
> +    if (Style.Standard == FormatStyle::LS_JavaScript) {<br>
> +      static tok::TokenKind JSIdentity[] = { tok::equalequal, tok::equal };<br>
> +      static tok::TokenKind JSNotIdentity[] = { tok::exclaimequal, tok::equal };<br>
> +      static tok::TokenKind JSShiftEqual[] = { tok::greater, tok::greater,<br>
> +                                               tok::greaterequal };<br>
> +      // FIXME: We probably need to change token type to mimic operator with the<br>
> +      // correct priority.<br>
> +      tryMergeTokens(JSIdentity) || tryMergeTokens(JSNotIdentity) ||<br>
> +          tryMergeTokens(JSShiftEqual);<br>
> +    }<br>
>    }<br>
><br>
> -  bool tryMergeJavaScriptIdentityOperators() {<br>
> -    if (Tokens.size() < 2)<br>
> -      return false;<br>
> -    FormatToken &First = *Tokens[Tokens.size() - 2];<br>
> -    if (!First.isOneOf(tok::exclaimequal, tok::equalequal))<br>
> -      return false;<br>
> -    FormatToken &Second = *Tokens.back();<br>
> -    if (!Second.is(tok::equal))<br>
> +  bool tryMergeTokens(ArrayRef<tok::TokenKind> Kinds) {<br>
> +    if (Tokens.size() < Kinds.size())<br>
>        return false;<br>
> -    if (Second.WhitespaceRange.getBegin() != Second.WhitespaceRange.getEnd())<br>
> +<br>
> +    SmallVectorImpl<FormatToken *>::const_iterator First =<br>
> +        Tokens.end() - Kinds.size();<br>
> +    if (!First[0]->is(Kinds[0]))<br>
>        return false;<br>
> -    First.TokenText =<br>
> -        StringRef(First.TokenText.data(), First.TokenText.size() + 1);<br>
> -    First.ColumnWidth += 1;<br>
> -    Tokens.pop_back();<br>
> +    unsigned AddLength = 0;<br>
> +    for (unsigned i = 1; i < Kinds.size(); ++i) {<br>
> +      if (!First[i]->is(Kinds[i]) || First[i]->WhitespaceRange.getBegin() !=<br>
> +                                         First[i]->WhitespaceRange.getEnd())<br>
> +        return false;<br>
> +      AddLength += First[i]->TokenText.size();<br>
> +    }<br>
> +    Tokens.resize(Tokens.size() - Kinds.size() + 1);<br>
> +    First[0]->TokenText = StringRef(First[0]->TokenText.data(),<br>
> +                                    First[0]->TokenText.size() + AddLength);<br>
> +    First[0]->ColumnWidth += AddLength;<br>
>      return true;<br>
>    }<br>
><br>
> @@ -1265,6 +1281,12 @@<br>
>                         << (Encoding == encoding::Encoding_UTF8 ? "UTF8"<br>
>                                                                 : "unknown")<br>
>                         << "\n");<br>
> +    if (SourceMgr.getFilename(Lex.getFileLoc()).endswith(".js"))<br>
> +      this->Style.Standard = FormatStyle::LS_JavaScript;<br>
> +    // Should be in sync with the LanguageStandard enum.<br>
> +    static const char *Standards[] = { "C++03", "C++11", "JavaScript", "Auto" };<br>
> +    DEBUG(llvm::dbgs() << "Language standard: "<br>
> +                       << Standards[this->Style.Standard] << "\n");<br>
>    }<br>
><br>
>    tooling::Replacements format() {<br>
</p>