I thought about this too when I was looking into this. It seems like this 
prefers message expansion for "[a,b" (arguable) and even "[&,b" (wrong). This 
is certainly strictly better than before, but maybe it's better to only prefer 
message expansion if there haven't been any commas yet?

(That's why I suggested doing it back in the lookahead stages of 
disambiguation.)
Jordan


On Jul 30, 2012, at 17:50 , Douglas Gregor <[email protected]> wrote:

> Author: dgregor
> Date: Mon Jul 30 19:50:07 2012
> New Revision: 161015
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=161015&view=rev
> Log:
> When we encounter a code-completion token while parsing an ill-formed
> lambda-introducer in Objective-C++11, fall back to treating the tokens
> as an Objective-C message send to provide those (more likely)
> completions. Fixes <rdar://problem/11980263>.
> 
> Added:
>    cfe/trunk/test/Index/complete-lambdas.mm
> Modified:
>    cfe/trunk/lib/Parse/ParseExprCXX.cpp
> 
> Modified: cfe/trunk/lib/Parse/ParseExprCXX.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExprCXX.cpp?rev=161015&r1=161014&r2=161015&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseExprCXX.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExprCXX.cpp Mon Jul 30 19:50:07 2012
> @@ -642,7 +642,11 @@
>   while (Tok.isNot(tok::r_square)) {
>     if (!first) {
>       if (Tok.isNot(tok::comma)) {
> -        if (Tok.is(tok::code_completion)) {
> +        // Provide a completion for a lambda introducer here. Except
> +        // in Objective-C, where this is Almost Surely meant to be a message
> +        // send. In that case, fail here and let the ObjC message
> +        // expression parser perform the completion.
> +        if (Tok.is(tok::code_completion) && !getLangOpts().ObjC1) {
>           Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro, 
>                                                /*AfterAmpersand=*/false);
>           ConsumeCodeCompletionToken();
> 
> Added: cfe/trunk/test/Index/complete-lambdas.mm
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/complete-lambdas.mm?rev=161015&view=auto
> ==============================================================================
> --- cfe/trunk/test/Index/complete-lambdas.mm (added)
> +++ cfe/trunk/test/Index/complete-lambdas.mm Mon Jul 30 19:50:07 2012
> @@ -0,0 +1,40 @@
> +// This test is line- and column-sensitive. See below for run lines.
> +
> +
> +@interface A
> +- instanceMethod:(int)value withOther:(int)other;
> ++ classMethod;
> +@end
> +
> +@interface B : A
> +@end
> +
> +@implementation B
> +- someMethod:(A*)a {
> +  [a classMethod];
> +  [A classMethod];
> +  [a instanceMethod:0 withOther:1];
> +  [self someMethod:a];
> +  [super instanceMethod];
> +}
> +
> +@end
> +
> +// RUN: c-index-test -code-completion-at=%s:14:6 -std=c++11 %s | FileCheck 
> -check-prefix=CHECK-CC1 %s
> +// CHECK-CC1: ObjCInstanceMethodDecl:{ResultType id}{TypedText 
> instanceMethod:}{Placeholder (int)}{HorizontalSpace  }{TypedText 
> withOther:}{Placeholder (int)} (35) (parent: ObjCInterfaceDecl 'A')
> +
> +// RUN: c-index-test -code-completion-at=%s:15:6 -std=c++11 %s | FileCheck 
> -check-prefix=CHECK-CC2 %s
> +// CHECK-CC2: ObjCClassMethodDecl:{ResultType id}{TypedText classMethod} 
> (35) (parent: ObjCInterfaceDecl 'A')
> +
> +// RUN: c-index-test -code-completion-at=%s:16:4 -std=c++11 %s | FileCheck 
> -check-prefix=CHECK-CC3 %s
> +// CHECK-CC3: ObjCInterfaceDecl:{TypedText A} (50) (parent: TranslationUnit 
> '(null)')
> +// CHECK-CC3: ParmDecl:{ResultType A *}{TypedText a} (34)
> +// CHECK-CC3: ObjCInterfaceDecl:{TypedText B} (50) (parent: TranslationUnit 
> '(null)')
> +// CHECK-CC3: TypedefDecl:{TypedText Class} (50) (parent: TranslationUnit 
> '(null)')
> +
> +
> +// RUN: c-index-test -code-completion-at=%s:16:21 -x objective-c++ 
> -std=c++11 %s | FileCheck -check-prefix=CHECK-CC4 %s
> +// CHECK-CC4: NotImplemented:{ResultType B *}{TypedText self} (34)
> +// CHECK-CC4: NotImplemented:{ResultType A *}{TypedText super} (40)
> +
> +// RUN: c-index-test -code-completion-at=%s:18:10 -x objective-c++ 
> -std=c++11 %s | FileCheck -check-prefix=CHECK-CC1 %s
> 
> 
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to