forked from OSchip/llvm-project
When performing code completion after at @interface, allow both
already-defined and forward-declared results. Already-defined results are fine because they could be the start of a category. Fixes <rdar://problem/9811691>. llvm-svn: 136559
This commit is contained in:
parent
7e1eb935db
commit
2c595adf2e
|
@ -248,9 +248,9 @@ public:
|
|||
CCC_ObjCInstanceMessage,
|
||||
/// \brief Code completion where an Objective-C class message is expected.
|
||||
CCC_ObjCClassMessage,
|
||||
/// \brief Code completion where a superclass of an Objective-C class is
|
||||
/// \brief Code completion where the name of an Objective-C class is
|
||||
/// expected.
|
||||
CCC_ObjCSuperclass,
|
||||
CCC_ObjCInterfaceName,
|
||||
/// \brief Code completion where an Objective-C category name is expected.
|
||||
CCC_ObjCCategoryName,
|
||||
/// \brief An unknown context, in which we are recovering from a parsing
|
||||
|
|
|
@ -186,7 +186,7 @@ static unsigned getDeclShowContexts(NamedDecl *ND,
|
|||
|
||||
// In Objective-C, you can only be a subclass of another Objective-C class
|
||||
if (isa<ObjCInterfaceDecl>(ND))
|
||||
Contexts |= (1 << (CodeCompletionContext::CCC_ObjCSuperclass - 1));
|
||||
Contexts |= (1 << (CodeCompletionContext::CCC_ObjCInterfaceName - 1));
|
||||
|
||||
// Deal with tag names.
|
||||
if (isa<EnumDecl>(ND)) {
|
||||
|
@ -1992,7 +1992,7 @@ static void CalculateHiddenNames(const CodeCompletionContext &Context,
|
|||
case CodeCompletionContext::CCC_Name:
|
||||
case CodeCompletionContext::CCC_PotentiallyQualifiedName:
|
||||
case CodeCompletionContext::CCC_ParenthesizedExpression:
|
||||
case CodeCompletionContext::CCC_ObjCSuperclass:
|
||||
case CodeCompletionContext::CCC_ObjCInterfaceName:
|
||||
break;
|
||||
|
||||
case CodeCompletionContext::CCC_EnumTag:
|
||||
|
|
|
@ -67,7 +67,7 @@ bool CodeCompletionContext::wantConstructorResults() const {
|
|||
case CCC_OtherWithMacros:
|
||||
case CCC_ObjCInstanceMessage:
|
||||
case CCC_ObjCClassMessage:
|
||||
case CCC_ObjCSuperclass:
|
||||
case CCC_ObjCInterfaceName:
|
||||
case CCC_ObjCCategoryName:
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -5325,21 +5325,23 @@ void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) {
|
|||
CodeCompletionContext::CCC_Other);
|
||||
Results.EnterNewScope();
|
||||
|
||||
// Add all classes.
|
||||
AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, true,
|
||||
false, Results);
|
||||
|
||||
if (CodeCompleter->includeGlobals()) {
|
||||
// Add all classes.
|
||||
AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
|
||||
false, Results);
|
||||
}
|
||||
|
||||
Results.ExitScope();
|
||||
// FIXME: Use cached global completion results.
|
||||
|
||||
HandleCodeCompleteResults(this, CodeCompleter,
|
||||
CodeCompletionContext::CCC_Other,
|
||||
CodeCompletionContext::CCC_ObjCInterfaceName,
|
||||
Results.data(),Results.size());
|
||||
}
|
||||
|
||||
void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
|
||||
SourceLocation ClassNameLoc) {
|
||||
ResultBuilder Results(*this, CodeCompleter->getAllocator(),
|
||||
CodeCompletionContext::CCC_ObjCSuperclass);
|
||||
CodeCompletionContext::CCC_ObjCInterfaceName);
|
||||
Results.EnterNewScope();
|
||||
|
||||
// Make sure that we ignore the class we're currently defining.
|
||||
|
@ -5348,14 +5350,16 @@ void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName,
|
|||
if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
|
||||
Results.Ignore(CurClass);
|
||||
|
||||
// Add all classes.
|
||||
AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
|
||||
false, Results);
|
||||
|
||||
if (CodeCompleter->includeGlobals()) {
|
||||
// Add all classes.
|
||||
AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
|
||||
false, Results);
|
||||
}
|
||||
|
||||
Results.ExitScope();
|
||||
// FIXME: Use cached global completion results.
|
||||
|
||||
HandleCodeCompleteResults(this, CodeCompleter,
|
||||
CodeCompletionContext::CCC_ObjCSuperclass,
|
||||
CodeCompletionContext::CCC_ObjCInterfaceName,
|
||||
Results.data(),Results.size());
|
||||
}
|
||||
|
||||
|
@ -5364,14 +5368,16 @@ void Sema::CodeCompleteObjCImplementationDecl(Scope *S) {
|
|||
CodeCompletionContext::CCC_Other);
|
||||
Results.EnterNewScope();
|
||||
|
||||
// Add all unimplemented classes.
|
||||
AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
|
||||
true, Results);
|
||||
|
||||
if (CodeCompleter->includeGlobals()) {
|
||||
// Add all unimplemented classes.
|
||||
AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false,
|
||||
true, Results);
|
||||
}
|
||||
|
||||
Results.ExitScope();
|
||||
// FIXME: Use cached global completion results.
|
||||
|
||||
HandleCodeCompleteResults(this, CodeCompleter,
|
||||
CodeCompletionContext::CCC_Other,
|
||||
CodeCompletionContext::CCC_ObjCInterfaceName,
|
||||
Results.data(),Results.size());
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
// RUN: c-index-test -code-completion-at=%s:11:12 %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// CHECK-CC2: ObjCInterfaceDecl:{TypedText Int1}
|
||||
// CHECK-CC2-NEXT: ObjCInterfaceDecl:{TypedText Int2}
|
||||
// CHECK-CC2-NEXT: ObjCInterfaceDecl:{TypedText Int3}
|
||||
// CHECK-CC2-NEXT: ObjCInterfaceDecl:{TypedText Int4}
|
||||
// RUN: c-index-test -code-completion-at=%s:11:19 %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// CHECK-CC3: ObjCInterfaceDecl:{TypedText Int1}
|
||||
|
@ -41,3 +42,6 @@
|
|||
// CHECK-CC5: ObjCInterfaceDecl:{TypedText Int1}
|
||||
// CHECK-CC5-NEXT: ObjCInterfaceDecl:{TypedText Int3}
|
||||
// CHECK-CC5-NEXT: ObjCInterfaceDecl:{TypedText Int4}
|
||||
|
||||
|
||||
// RUN: env CINDEXTEST_EDITING=1 CINDEXTEST_COMPLETION_CACHING=1 c-index-test -code-completion-at=%s:11:12 %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
|
|
|
@ -438,7 +438,7 @@ static unsigned long long getContextsForContextKind(
|
|||
contexts = CXCompletionContext_ObjCClassMessage;
|
||||
break;
|
||||
}
|
||||
case CodeCompletionContext::CCC_ObjCSuperclass: {
|
||||
case CodeCompletionContext::CCC_ObjCInterfaceName: {
|
||||
contexts = CXCompletionContext_ObjCInterface;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue