summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParseExpr.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-09-15 16:23:04 +0000
committerDouglas Gregor <dgregor@apple.com>2010-09-15 16:23:04 +0000
commited0b69dc8163fbae358f99ffc2b1b56a3cad468f (patch)
tree8c3d0f810f3b3f036f1b3cb07477b2e6def1f852 /clang/lib/Parse/ParseExpr.cpp
parent0d8971f0d04e802b0357e361523c7b2ac05aa4d5 (diff)
downloadbcm5719-llvm-ed0b69dc8163fbae358f99ffc2b1b56a3cad468f.tar.gz
bcm5719-llvm-ed0b69dc8163fbae358f99ffc2b1b56a3cad468f.zip
Improve code completion for Objective-C message sends when the opening
'[' is missing. Prior commits improving recovery also improved code completion beyond the first selector, e.g., at or after the "to" in calculator add:x to:y but not after "calculator". We now provide the same completions for calculator <CC> that we would for [calculator <CC> if "calculator" is an expression whose type is something that can receive Objective-C messages. This code completion works for instance and super message sends, but not class message sends. llvm-svn: 113976
Diffstat (limited to 'clang/lib/Parse/ParseExpr.cpp')
-rw-r--r--clang/lib/Parse/ParseExpr.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index 0f9154827e9..26563de2b25 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -664,12 +664,14 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
}
// In an Objective-C method, if we have "super" followed by an identifier,
- // the token sequence is ill-fomed. However, if there's a ':' or ']' after
+ // the token sequence is ill-formed. However, if there's a ':' or ']' after
// that identifier, this is probably a message send with a missing open
- // bracket. Treat it as such.
- if (getLang().ObjC1 && &II == Ident_super && Tok.is(tok::identifier) &&
+ // bracket. Treat it as such.
+ if (getLang().ObjC1 && &II == Ident_super && !InMessageExpression &&
getCurScope()->isInObjcMethodScope() &&
- (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
+ ((Tok.is(tok::identifier) &&
+ (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) ||
+ Tok.is(tok::code_completion))) {
Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc, ParsedType(),
0);
break;
@@ -991,6 +993,15 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
SourceLocation Loc;
while (1) {
switch (Tok.getKind()) {
+ case tok::code_completion:
+ if (InMessageExpression)
+ return move(LHS);
+
+ Actions.CodeCompletePostfixExpression(getCurScope(), LHS.take());
+ ConsumeCodeCompletionToken();
+ LHS = ExprError();
+ break;
+
case tok::identifier:
// If we see identifier: after an expression, and we're not already in a
// message send, then this is probably a message send with a missing
OpenPOWER on IntegriCloud