This is an archive of the discontinued LLVM Phabricator instance.

clang-format: Support PP and Obj-C keywords in 'is'.
ClosedPublic

Authored by strager on Jun 12 2015, 2:27 PM.

Details

Reviewers
djasper
Summary

Add overloads of FormatToken::is supporting preprocessor and
Objective-C token types. This cleans up a bit of code.

Diff Detail

Event Timeline

strager updated this revision to Diff 27597.Jun 12 2015, 2:27 PM
strager retitled this revision from to clang-format: Support PP and Obj-C keywords in 'is'..
strager updated this object.
strager edited the test plan for this revision. (Show Details)
strager added a reviewer: djasper.
strager added subscribers: abdulras, sas, Unknown Object (MLST).
djasper edited edge metadata.Jun 23 2015, 4:27 AM

Looks good. Do you have commit access?

djasper accepted this revision.Jun 23 2015, 4:27 AM
djasper edited edge metadata.
This revision is now accepted and ready to land.Jun 23 2015, 4:27 AM

I do not. Please merge it for me.

strager closed this revision.Jun 29 2015, 6:03 PM

Oops, I didn't mean to close this diff. =[

I can't update the Phabricator revision, so here's a diff (rebased):

commit de014c17b0049587a8b5bf4293ce7e5a02230ae3
Author: Matthew Glazar <strager@fb.com>
Date:   Mon Jun 29 18:20:56 2015 -0700

    clang-format: Support PP and Obj-C keywords in 'is'.
    
    Summary:
    Add overloads of FormatToken::is supporting preprocessor and
    Objective-C token types. This cleans up a bit of code.
    
    Test Plan:
        make check-clang
    
    Reviewers: djasper
    
    Subscribers: curdeius, sas, abdulras, klimek, cfe-commits
    
    Differential Revision: http://reviews.llvm.org/D10420

diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp
index ed01d68..ce807b4 100644
--- a/lib/Format/ContinuationIndenter.cpp
+++ b/lib/Format/ContinuationIndenter.cpp
@@ -256,8 +256,7 @@ unsigned ContinuationIndenter::addTokenToState(LineState &State, bool Newline,
   assert(!State.Stack.empty());
   if ((Current.is(TT_ImplicitStringLiteral) &&
        (Current.Previous->Tok.getIdentifierInfo() == nullptr ||
-        Current.Previous->Tok.getIdentifierInfo()->getPPKeywordID() ==
-            tok::pp_not_keyword))) {
+        Current.Previous->is(tok::pp_not_keyword)))) {
     unsigned EndColumn =
         SourceMgr.getSpellingColumnNumber(Current.WhitespaceRange.getEnd());
     if (Current.LastNewlineOffset != 0) {
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp
index 0dd7ca0..ee89fdf 100644
--- a/lib/Format/Format.cpp
+++ b/lib/Format/Format.cpp
@@ -1160,9 +1160,7 @@ private:
       Column = FormatTok->LastLineColumnWidth;
     }
 
-    if (!(Tokens.size() > 0 && Tokens.back()->Tok.getIdentifierInfo() &&
-          Tokens.back()->Tok.getIdentifierInfo()->getPPKeywordID() ==
-              tok::pp_define) &&
+    if (!(Tokens.size() > 0 && Tokens.back()->is(tok::pp_define)) &&
         std::find(ForEachMacros.begin(), ForEachMacros.end(),
                   FormatTok->Tok.getIdentifierInfo()) != ForEachMacros.end())
       FormatTok->Type = TT_ForEachMacro;
diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h
index 5b7dadb..759924c 100644
--- a/lib/Format/FormatToken.h
+++ b/lib/Format/FormatToken.h
@@ -272,6 +272,13 @@ struct FormatToken {
   bool is(const IdentifierInfo *II) const {
     return II && II == Tok.getIdentifierInfo();
   }
+  bool is(tok::ObjCKeywordKind Kind) const {
+    return Tok.getObjCKeywordID() == Kind;
+  }
+  bool is(tok::PPKeywordKind Kind) const {
+    IdentifierInfo *II = Tok.getIdentifierInfo();
+    return II && II->getPPKeywordID() == Kind;
+  }
   template <typename A, typename B> bool isOneOf(A K1, B K2) const {
     return is(K1) || is(K2);
   }
diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp
index 0117f22..5701bb9 100644
--- a/lib/Format/TokenAnnotator.cpp
+++ b/lib/Format/TokenAnnotator.cpp
@@ -681,11 +681,9 @@ public:
     // Directly allow to 'import <string-literal>' to support protocol buffer
     // definitions (code.google.com/p/protobuf) or missing "#" (either way we
     // should not break the line).
-    IdentifierInfo *Info = CurrentToken->Tok.getIdentifierInfo();
     if ((Style.Language == FormatStyle::LK_Java &&
          CurrentToken->is(Keywords.kw_package)) ||
-        (Info && Info->getPPKeywordID() == tok::pp_import &&
-         CurrentToken->Next &&
+        (CurrentToken->is(tok::pp_import) && CurrentToken->Next &&
          CurrentToken->Next->isOneOf(tok::string_literal, tok::identifier,
                                      tok::kw_static))) {
       next();
@@ -1751,7 +1749,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
   if (Left.is(tok::kw_return) && Right.isNot(tok::semi))
     return true;
   if (Style.ObjCSpaceAfterProperty && Line.Type == LT_ObjCProperty &&
-      Left.Tok.getObjCKeywordID() == tok::objc_property)
+      Left.is(tok::objc_property))
     return true;
   if (Right.is(tok::hashhash))
     return Left.is(tok::hash);
@@ -1851,7 +1849,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
              Left.is(tok::r_paren)) &&
             Line.Type != LT_PreprocessorDirective);
   }
-  if (Left.is(tok::at) && Right.Tok.getObjCKeywordID() != tok::objc_not_keyword)
+  if (Left.is(tok::at) && !Right.is(tok::objc_not_keyword))
     return false;
   if (Right.is(TT_UnaryOperator))
     return !Left.isOneOf(tok::l_paren, tok::l_square, tok::at) &&
@@ -2136,7 +2134,7 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
 
   if (Left.is(tok::at))
     return false;
-  if (Left.Tok.getObjCKeywordID() == tok::objc_interface)
+  if (Left.is(tok::objc_interface))
     return false;
   if (Left.isOneOf(TT_JavaAnnotation, TT_LeadingJavaAnnotation))
     return !Right.is(tok::l_paren);