clang-format: [JS] FormatToken.startsSequence/endsSequence.

Refactors AnnotatedLine.startsWith/endsWith by extracting the core functionality
into FormatToken.startsSequence/endsSequence. This allows checking tokens within
the pointered linked list structure with a lookahead, automatically ignoring
comments, which is useful in many places (e.g. see subsequent commit).

llvm-svn: 271183
diff --git a/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h
index dfe1d1d..baa68de 100644
--- a/clang/lib/Format/TokenAnnotator.h
+++ b/clang/lib/Format/TokenAnnotator.h
@@ -83,7 +83,7 @@
   /// \c true if this line starts with the given tokens in order, ignoring
   /// comments.
   template <typename... Ts> bool startsWith(Ts... Tokens) const {
-    return startsWithInternal(First, Tokens...);
+    return First && First->startsSequence(Tokens...);
   }
 
   /// \c true if this line ends with the given tokens in reversed order,
@@ -91,7 +91,7 @@
   /// For example, given tokens [T1, T2, T3, ...], the function returns true if
   /// this line is like "... T3 T2 T1".
   template <typename... Ts> bool endsWith(Ts... Tokens) const {
-    return endsWithInternal(Last, Tokens...);
+    return Last && Last->endsSequence(Tokens...);
   }
 
   /// \c true if this line looks like a function definition instead of a
@@ -130,44 +130,6 @@
   // Disallow copying.
   AnnotatedLine(const AnnotatedLine &) = delete;
   void operator=(const AnnotatedLine &) = delete;
-
-  template <typename A, typename... Ts>
-  bool startsWithInternal(const FormatToken *Tok, A K1) const {
-    // Even though we skip comments in the outer `startWithInternal` function,
-    // this loop is still necessary if it is invoked by the public interface
-    // `startsWith`.
-    while (Tok && Tok->is(tok::comment))
-      Tok = Tok->Next;
-    return Tok && Tok->is(K1);
-  }
-
-  template <typename A, typename... Ts>
-  bool startsWithInternal(const FormatToken *Tok, A K1, Ts... Tokens) const {
-    // Skip comments before calling `startsWithInternal(Tok, K1)` so that  the
-    // second call to `startsWithInternal` takes the correct `Tok->Next`, which
-    // should be the next token of the token checked in the first call.
-    while (Tok && Tok->is(tok::comment))
-      Tok = Tok->Next;
-    return Tok && startsWithInternal(Tok, K1) &&
-           startsWithInternal(Tok->Next, Tokens...);
-  }
-
-  template <typename A, typename... Ts>
-  bool endsWithInternal(const FormatToken *Tok, A K1) const {
-    // See the comments above in `startsWithInternal(Tok, K1)`.
-    while (Tok && Tok->is(tok::comment))
-      Tok = Tok->Previous;
-    return Tok && Tok->is(K1);
-  }
-
-  template <typename A, typename... Ts>
-  bool endsWithInternal(const FormatToken *Tok, A K1, Ts... Tokens) const {
-    // See the comments above in `startsWithInternal(Tok, K1, Tokens)`.
-    while (Tok && Tok->is(tok::comment))
-      Tok = Tok->Previous;
-    return Tok && endsWithInternal(Tok, K1) &&
-           endsWithInternal(Tok->Previous, Tokens...);
-  }
 };
 
 /// \brief Determines extra information about the tokens comprising an