summaryrefslogtreecommitdiffstats
path: root/clang/lib/Format
diff options
context:
space:
mode:
authorMartin Probst <martin@probst.io>2016-05-29 14:41:02 +0000
committerMartin Probst <martin@probst.io>2016-05-29 14:41:02 +0000
commit1244ecbbd2072aa13f2bde79c00130486d9e7c78 (patch)
treed96090a22dde76a8661517472ba8e76335fee8de /clang/lib/Format
parent442b9a90a47450b446c08aaae844a95baa2b92e3 (diff)
downloadbcm5719-llvm-1244ecbbd2072aa13f2bde79c00130486d9e7c78.tar.gz
bcm5719-llvm-1244ecbbd2072aa13f2bde79c00130486d9e7c78.zip
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
Diffstat (limited to 'clang/lib/Format')
-rw-r--r--clang/lib/Format/FormatToken.h42
-rw-r--r--clang/lib/Format/TokenAnnotator.h42
2 files changed, 44 insertions, 40 deletions
diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h
index 8052e5efd1f..84a7e4153a0 100644
--- a/clang/lib/Format/FormatToken.h
+++ b/clang/lib/Format/FormatToken.h
@@ -297,6 +297,20 @@ struct FormatToken {
}
template <typename T> bool isNot(T Kind) const { return !is(Kind); }
+ /// \c true if this token starts a sequence with the given tokens in order,
+ /// following the ``Next`` pointers, ignoring comments.
+ template <typename A, typename... Ts>
+ bool startsSequence(A K1, Ts... Tokens) const {
+ return startsSequenceInternal(K1, Tokens...);
+ }
+
+ /// \c true if this token ends a sequence with the given tokens in order,
+ /// following the ``Previous`` pointers, ignoring comments.
+ template <typename A, typename... Ts>
+ bool endsSequence(A K1, Ts... Tokens) const {
+ return endsSequenceInternal(K1, Tokens...);
+ }
+
bool isStringLiteral() const { return tok::isStringLiteral(Tok.getKind()); }
bool isObjCAtKeyword(tok::ObjCKeywordKind Kind) const {
@@ -429,6 +443,34 @@ private:
// Disallow copying.
FormatToken(const FormatToken &) = delete;
void operator=(const FormatToken &) = delete;
+
+ template <typename A, typename... Ts>
+ bool startsSequenceInternal(A K1, Ts... Tokens) const {
+ if (is(tok::comment) && Next)
+ return Next->startsSequenceInternal(K1, Tokens...);
+ return is(K1) && Next && Next->startsSequenceInternal(Tokens...);
+ }
+
+ template <typename A>
+ bool startsSequenceInternal(A K1) const {
+ if (is(tok::comment) && Next)
+ return Next->startsSequenceInternal(K1);
+ return is(K1);
+ }
+
+ template <typename A, typename... Ts>
+ bool endsSequenceInternal(A K1) const {
+ if (is(tok::comment) && Previous)
+ return Previous->endsSequenceInternal(K1);
+ return is(K1);
+ }
+
+ template <typename A, typename... Ts>
+ bool endsSequenceInternal(A K1, Ts... Tokens) const {
+ if (is(tok::comment) && Previous)
+ return Previous->endsSequenceInternal(K1, Tokens...);
+ return is(K1) && Previous && Previous->endsSequenceInternal(Tokens...);
+ }
};
class ContinuationIndenter;
diff --git a/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h
index dfe1d1ddebd..baa68ded974 100644
--- a/clang/lib/Format/TokenAnnotator.h
+++ b/clang/lib/Format/TokenAnnotator.h
@@ -83,7 +83,7 @@ public:
/// \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 @@ public:
/// 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 @@ private:
// 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
OpenPOWER on IntegriCloud