diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-04-21 20:38:13 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-04-21 20:38:13 +0000 |
commit | 1569f95831a8c99e9f664137bf8f40e47ee3d90f (patch) | |
tree | a107f83099282227ab157ee9b055da87ca8319ab /lib/Parse/ParseInit.cpp | |
parent | b99c666a940e93bcfcaeddc01515c94472e28a20 (diff) |
Migrate the responsibility for turning the receiver name in an
Objective-C class message expression into a type from the parser
(which was doing so in two places) to Action::getObjCMessageKind()
which, in the case of Sema, reduces the number of name lookups we need
to perform.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102026 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseInit.cpp')
-rw-r--r-- | lib/Parse/ParseInit.cpp | 32 |
1 files changed, 7 insertions, 25 deletions
diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp index b0735b3cab..1a2a226e68 100644 --- a/lib/Parse/ParseInit.cpp +++ b/lib/Parse/ParseInit.cpp @@ -130,15 +130,17 @@ Parser::OwningExprResult Parser::ParseInitializerWithPotentialDesignator() { if (getLang().ObjC1 && Tok.is(tok::identifier)) { IdentifierInfo *II = Tok.getIdentifierInfo(); SourceLocation IILoc = Tok.getLocation(); + TypeTy *ReceiverType; // Three cases. This is a message send to a type: [type foo] // This is a message send to super: [super foo] // This is a message sent to an expr: [super.bar foo] switch (Action::ObjCMessageKind Kind = Actions.getObjCMessageKind(CurScope, II, IILoc, II == Ident_super, - NextToken().is(tok::period))) { + NextToken().is(tok::period), + ReceiverType)) { case Action::ObjCSuperMessage: - case Action::ObjCClassMessage: { + case Action::ObjCClassMessage: // If we have exactly one array designator, this used the GNU // 'designation: array-designator' extension, otherwise there should be no // designators at all! @@ -154,36 +156,16 @@ Parser::OwningExprResult Parser::ParseInitializerWithPotentialDesignator() { ConsumeToken(), 0, ExprArg(Actions)); - - // FIXME: This code is redundant with ParseObjCMessageExpr. - // Create the type that corresponds to the identifier (which - // names an Objective-C class). - TypeTy *Type = 0; - if (TypeTy *TyName = Actions.getTypeName(*II, IILoc, CurScope)) { - DeclSpec DS; - const char *PrevSpec = 0; - unsigned DiagID = 0; - if (!DS.SetTypeSpecType(DeclSpec::TST_typename, IILoc, PrevSpec, - DiagID, TyName)) { - DS.SetRangeEnd(IILoc); - Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); - TypeResult Ty = Actions.ActOnTypeName(CurScope, DeclaratorInfo); - if (!Ty.isInvalid()) - Type = Ty.get(); - } - } - - ConsumeToken(); // The identifier. - if (!Type) { + ConsumeToken(); // the identifier + if (!ReceiverType) { SkipUntil(tok::r_square); return ExprError(); } return ParseAssignmentExprWithObjCMessageExprStart(StartLoc, SourceLocation(), - Type, + ReceiverType, ExprArg(Actions)); - } case Action::ObjCInstanceMessage: // Fall through; we'll just parse the expression and |