From: Ben Hamilton Date: Tue, 20 Mar 2018 14:53:25 +0000 (+0000) Subject: [clang-format] Fix ObjC selectors with multiple params passed to macro X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2f7c11b4591a923041ecb714e3c082b6a88ef45f;p=clang [clang-format] Fix ObjC selectors with multiple params passed to macro Summary: Objective-C selectors with arguments take the form of: foo: foo:bar: foo:bar:baz: These can be passed to a macro, like NS_SWIFT_NAME(): https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html and must never have spaces inserted around the colons. Previously, there was logic in TokenAnnotator's tok::colon parser to handle the single-argument case, but it failed for the multiple-argument cases. This diff fixes the bug and adds more tests. Test Plan: New tests added. Ran tests with: % make -j12 FormatTests && ./tools/clang/unittests/Format/FormatTests Reviewers: jolesiak, djasper, Wizard Reviewed By: jolesiak, Wizard Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D44638 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@327986 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index edb5a6fd7a..7734b7e9a2 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -701,7 +701,8 @@ private: else Tok->Type = TT_InheritanceColon; } else if (Tok->Previous->is(tok::identifier) && Tok->Next && - Tok->Next->isOneOf(tok::r_paren, tok::comma)) { + (Tok->Next->isOneOf(tok::r_paren, tok::comma) || + Tok->Next->startsSequence(tok::identifier, tok::colon))) { // This handles a special macro in ObjC code where selectors including // the colon are passed as macro arguments. Tok->Type = TT_ObjCMethodExpr; diff --git a/unittests/Format/FormatTestObjC.cpp b/unittests/Format/FormatTestObjC.cpp index efc227d310..35c4d88638 100644 --- a/unittests/Format/FormatTestObjC.cpp +++ b/unittests/Format/FormatTestObjC.cpp @@ -618,6 +618,9 @@ TEST_F(FormatTestObjC, FormatObjCMethodExpr) { verifyFormat("for (id foo in [self getStuffFor:bla]) {\n" "}"); verifyFormat("[self aaaaa:MACRO(a, b:, c:)];"); + verifyFormat("[self aaaaa:MACRO(a, b:c:, d:e:)];"); + verifyFormat("[self aaaaa:MACRO(a, b:c:d:, e:f:g:)];"); + verifyFormat("int XYMyFoo(int a, int b) NS_SWIFT_NAME(foo(self:scale:));"); verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];"); verifyFormat("[self aaaaa:(Type)a bbbbb:3];");