aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-09-15 15:09:43 +0000
committerDouglas Gregor <dgregor@apple.com>2010-09-15 15:09:43 +0000
commitfa885c11e33ca1140e3cf376eb43cb70bbf96962 (patch)
treebe3c0d71ce677059cfbc1d8ef5eb44a637cf47fd
parentb65042da3aa4dc2f9fc1c606fa6817089fd86cd6 (diff)
Extend bracket insertion to message sends to "super", e.g.,
super method:arg] will now recover nicely and insert the '[' before 'super'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113971 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Parse/ParseExpr.cpp12
-rw-r--r--test/FixIt/fixit-objc-message.m14
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index e466af2d61..0f9154827e 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/lib/Parse/ParseExpr.cpp
@@ -663,6 +663,18 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
break;
}
+ // 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
+ // 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) &&
+ getCurScope()->isInObjcMethodScope() &&
+ (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
+ Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc, ParsedType(),
+ 0);
+ break;
+ }
+
// Make sure to pass down the right value for isAddressOfOperand.
if (isAddressOfOperand && isPostfixExpressionSuffixStart())
isAddressOfOperand = false;
diff --git a/test/FixIt/fixit-objc-message.m b/test/FixIt/fixit-objc-message.m
index f19b489f99..72728d20ad 100644
--- a/test/FixIt/fixit-objc-message.m
+++ b/test/FixIt/fixit-objc-message.m
@@ -18,4 +18,18 @@ void f(A *a, int i, int j) {
a method1:5+2 second:+(3.14159)];
a method1:[a method1:3 second:j] second:i++]
a getBlah];
+
+ int array[17];
+ (void)array[a method1:5+2 second:+(3.14159)]];
}
+
+@interface B : A
+- (int)method1:(int)x second:(float)y;
+@end
+
+@implementation B
+- (int)method1:(int)x second:(float)y {
+ super method1:x second:y];
+ return super getBlah];
+}
+@end