[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