aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/MinimalAction.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-04-21 20:38:13 +0000
committerDouglas Gregor <dgregor@apple.com>2010-04-21 20:38:13 +0000
commit1569f95831a8c99e9f664137bf8f40e47ee3d90f (patch)
treea107f83099282227ab157ee9b055da87ca8319ab /lib/Parse/MinimalAction.cpp
parentb99c666a940e93bcfcaeddc01515c94472e28a20 (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/MinimalAction.cpp')
-rw-r--r--lib/Parse/MinimalAction.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/lib/Parse/MinimalAction.cpp b/lib/Parse/MinimalAction.cpp
index fc06a0d6a5..5a03767811 100644
--- a/lib/Parse/MinimalAction.cpp
+++ b/lib/Parse/MinimalAction.cpp
@@ -27,15 +27,30 @@ ActionBase::~ActionBase() {}
Action::~Action() {}
Action::ObjCMessageKind Action::getObjCMessageKind(Scope *S,
- IdentifierInfo *&Name,
+ IdentifierInfo *Name,
SourceLocation NameLoc,
bool IsSuper,
- bool HasTrailingDot) {
+ bool HasTrailingDot,
+ TypeTy *&ReceiverType) {
+ ReceiverType = 0;
+
if (IsSuper && !HasTrailingDot && S->isInObjcMethodScope())
return ObjCSuperMessage;
- if (getTypeName(*Name, NameLoc, S))
+ if (TypeTy *TyName = getTypeName(*Name, NameLoc, S)) {
+ DeclSpec DS;
+ const char *PrevSpec = 0;
+ unsigned DiagID = 0;
+ if (!DS.SetTypeSpecType(DeclSpec::TST_typename, NameLoc, PrevSpec,
+ DiagID, TyName)) {
+ DS.SetRangeEnd(NameLoc);
+ Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
+ TypeResult Ty = ActOnTypeName(S, DeclaratorInfo);
+ if (!Ty.isInvalid())
+ ReceiverType = Ty.get();
+ }
return ObjCClassMessage;
+ }
return ObjCInstanceMessage;
}