[cfe-commits] r100528 - in /cfe/trunk: lib/Sema/SemaCodeComplete.cpp test/Index/complete-objc-message.m

Fariborz Jahanian fjahanian at apple.com
Tue Apr 6 09:58:11 PDT 2010


On Apr 6, 2010, at 9:40 AM, Douglas Gregor wrote:

> Author: dgregor
> Date: Tue Apr  6 11:40:00 2010
> New Revision: 100528
>
> URL: http://llvm.org/viewvc/llvm-project?rev=100528&view=rev
> Log:
> Implement support for code completion of an Objective-C message send  
> to
> "id" or an expression of type "id". In these cases, we produce a list
> of all of the (class or instance) methods, respectively, that we  
> know about.

I am wondering how useful this list would be. Aren't we talking about  
thousands in our typical
framework?

- fariborz

>
>
> Note that this implementation does not yet work well with precompiled
> headers; that's coming soon.
>
>
> Modified:
>    cfe/trunk/lib/Sema/SemaCodeComplete.cpp
>    cfe/trunk/test/Index/complete-objc-message.m
>
> Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=100528&r1=100527&r2=100528&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Tue Apr  6 11:40:00 2010
> @@ -2970,8 +2970,33 @@
>   // superclasses, categories, implementation, etc.
>   ResultBuilder Results(*this);
>   Results.EnterNewScope();
> -  AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents,  
> CurContext,
> -                 Results);
> +
> +  if (CDecl)
> +    AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents,  
> CurContext,
> +                   Results);
> +  else if (FName->isStr("id")) {
> +    // We're messaging "id" as a type; provide all class/factory  
> methods.
> +
> +    // FIXME: Load the entire class method pool from the PCH file
> +    for (llvm::DenseMap<Selector, ObjCMethodList>::iterator
> +           M = FactoryMethodPool.begin(),
> +           MEnd = FactoryMethodPool.end();
> +         M != MEnd;
> +         ++M) {
> +      for (ObjCMethodList *MethList = &M->second; MethList;
> +           MethList = MethList->Next) {
> +        if (!isAcceptableObjCMethod(MethList->Method, MK_Any,  
> SelIdents,
> +                                    NumSelIdents))
> +          continue;
> +
> +        Result R(MethList->Method, 0);
> +        R.StartParameter = NumSelIdents;
> +        R.AllParametersAreInformative = false;
> +        Results.MaybeAddResult(R, CurContext);
> +      }
> +    }
> +  }
> +
>   Results.ExitScope();
>
>   // This also suppresses remaining diagnostics.
> @@ -2990,12 +3015,6 @@
>   DefaultFunctionArrayLvalueConversion(RecExpr);
>   QualType ReceiverType = RecExpr->getType();
>
> -  if (ReceiverType->isObjCIdType() || ReceiverType- 
> >isBlockPointerType()) {
> -    // FIXME: We're messaging 'id'. Do we actually want to look up  
> every method
> -    // in the universe?
> -    return;
> -  }
> -
>   // Build the set of methods we can see.
>   ResultBuilder Results(*this);
>   Results.EnterNewScope();
> @@ -3035,7 +3054,28 @@
>       AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents,  
> CurContext,
>                      Results);
>   }
> -
> +  // Handle messages to "id".
> +  else if (ReceiverType->isObjCIdType()) {
> +    // FIXME: Load the entire instance method pool from the PCH file
> +    for (llvm::DenseMap<Selector, ObjCMethodList>::iterator
> +           M = InstanceMethodPool.begin(),
> +           MEnd = InstanceMethodPool.end();
> +         M != MEnd;
> +         ++M) {
> +      for (ObjCMethodList *MethList = &M->second; MethList;
> +           MethList = MethList->Next) {
> +        if (!isAcceptableObjCMethod(MethList->Method, MK_Any,  
> SelIdents,
> +                                    NumSelIdents))
> +          continue;
> +
> +        Result R(MethList->Method, 0);
> +        R.StartParameter = NumSelIdents;
> +        R.AllParametersAreInformative = false;
> +        Results.MaybeAddResult(R, CurContext);
> +      }
> +    }
> +  }
> +
>   Results.ExitScope();
>   HandleCodeCompleteResults(this, CodeCompleter,  
> Results.data(),Results.size());
> }
>
> Modified: cfe/trunk/test/Index/complete-objc-message.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/complete-objc-message.m?rev=100528&r1=100527&r2=100528&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/test/Index/complete-objc-message.m (original)
> +++ cfe/trunk/test/Index/complete-objc-message.m Tue Apr  6 11:40:00  
> 2010
> @@ -116,6 +116,12 @@
>   [Overload2 Method:1 Arg1:1 OtherArg:ovl];
> }
>
> +void msg_id(id x) {
> +  [x Method:1 Arg1:1 OtherArg:ovl];
> +  [[x blarg] Method:1 Arg1:1 OtherArg:ovl];
> +  [id Method:1 Arg1:1 OtherArg:ovl];
> +}
> +
> // RUN: c-index-test -code-completion-at=%s:23:19 %s | FileCheck - 
> check-prefix=CHECK-CC1 %s
> // CHECK-CC1: {TypedText categoryClassMethod}
> // CHECK-CC1: {TypedText classMethod1:}{Placeholder (id)a} 
> {HorizontalSpace  }{Text withKeyword:}{Placeholder (int)b}
> @@ -192,3 +198,36 @@
> // CHECK-CCF: TypedefDecl:{TypedText SEL}
> // CHECK-CCF: {ResultType Class}{TypedText self}
> // CHECK-CCF: {TypedText super}
> +// RUN: c-index-test -code-completion-at=%s:120:6 %s | FileCheck - 
> check-prefix=CHECK-CCG %s
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType id}{TypedText  
> categoryInstanceMethod}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType id}{TypedText  
> instanceMethod1}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> Method}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (int)i}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (float)f}{HorizontalSpace  }{Text Arg1:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text Arg2:}{Placeholder  
> (int)i2}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (float)f}{HorizontalSpace  }{Text Arg1:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text OtherArg:}{Placeholder  
> (id)obj}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (float)f}{HorizontalSpace  }{Text SomeArg:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text OtherArg:}{Placeholder  
> (id)obj}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> MyInstMethod:}{Placeholder (id)x}{HorizontalSpace  }{Text second:} 
> {Placeholder (id)y}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> MyPrivateInstMethod}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> MySubInstMethod}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> MySubInstMethod:}{Placeholder (id)obj}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> OtherMethod:}{Placeholder (float)f}{HorizontalSpace  }{Text Arg1:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text Arg2:}{Placeholder  
> (int)i2}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType id}{TypedText  
> protocolInstanceMethod:}{Placeholder (int)value}
> +// CHECK-CCG: ObjCInstanceMethodDecl:{ResultType int}{TypedText  
> secondProtocolInstanceMethod}
> +// RUN: c-index-test -code-completion-at=%s:121:14 %s | FileCheck - 
> check-prefix=CHECK-CCG %s
> +// RUN: c-index-test -code-completion-at=%s:122:7 %s | FileCheck - 
> check-prefix=CHECK-CCH %s
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType id}{TypedText  
> categoryClassMethod}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> classMethod1:}{Placeholder (id)a}{HorizontalSpace  }{Text  
> withKeyword:}{Placeholder (int)b}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType void}{TypedText  
> classMethod2}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText Method}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (int)i}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (float)f}{HorizontalSpace  }{Text Arg1:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text Arg2:}{Placeholder  
> (int)i2}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (float)f}{HorizontalSpace  }{Text Arg1:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text OtherArg:}{Placeholder  
> (id)obj}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> Method:}{Placeholder (float)f}{HorizontalSpace  }{Text SomeArg:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text OtherArg:}{Placeholder  
> (id)obj}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> MyClassMethod:}{Placeholder (id)obj}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> MyPrivateMethod}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> MySubClassMethod}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> MySubPrivateMethod}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType id}{TypedText new}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType int}{TypedText  
> OtherMethod:}{Placeholder (float)f}{HorizontalSpace  }{Text Arg1:} 
> {Placeholder (int)i1}{HorizontalSpace  }{Text Arg2:}{Placeholder  
> (int)i2}
> +// CHECK-CCH: ObjCClassMethodDecl:{ResultType id}{TypedText  
> protocolClassMethod}
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list