зеркало из https://github.com/microsoft/clang-1.git
Do not produce types as valid code completions when we're in an
expression context in C/Objective-C, or when we're in an @interface/@implementation/@protocol in Objective-C(++). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104908 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cfeac3441a
Коммит
4710e5b12b
|
@ -212,6 +212,7 @@ namespace {
|
|||
///
|
||||
//@{
|
||||
bool IsOrdinaryName(NamedDecl *ND) const;
|
||||
bool IsOrdinaryNonTypeName(NamedDecl *ND) const;
|
||||
bool IsOrdinaryNonValueName(NamedDecl *ND) const;
|
||||
bool IsNestedNameSpecifier(NamedDecl *ND) const;
|
||||
bool IsEnum(NamedDecl *ND) const;
|
||||
|
@ -646,6 +647,8 @@ void ResultBuilder::ExitScope() {
|
|||
/// \brief Determines whether this given declaration will be found by
|
||||
/// ordinary name lookup.
|
||||
bool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const {
|
||||
ND = cast<NamedDecl>(ND->getUnderlyingDecl());
|
||||
|
||||
unsigned IDNS = Decl::IDNS_Ordinary;
|
||||
if (SemaRef.getLangOptions().CPlusPlus)
|
||||
IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace;
|
||||
|
@ -655,15 +658,34 @@ bool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const {
|
|||
return ND->getIdentifierNamespace() & IDNS;
|
||||
}
|
||||
|
||||
/// \brief Determines whether this given declaration will be found by
|
||||
/// ordinary name lookup but is not a type name.
|
||||
bool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const {
|
||||
ND = cast<NamedDecl>(ND->getUnderlyingDecl());
|
||||
if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
|
||||
return false;
|
||||
|
||||
unsigned IDNS = Decl::IDNS_Ordinary;
|
||||
if (SemaRef.getLangOptions().CPlusPlus)
|
||||
IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace;
|
||||
else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND))
|
||||
return true;
|
||||
|
||||
return ND->getIdentifierNamespace() & IDNS;
|
||||
}
|
||||
|
||||
/// \brief Determines whether this given declaration will be found by
|
||||
/// ordinary name lookup.
|
||||
bool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const {
|
||||
ND = cast<NamedDecl>(ND->getUnderlyingDecl());
|
||||
|
||||
unsigned IDNS = Decl::IDNS_Ordinary;
|
||||
if (SemaRef.getLangOptions().CPlusPlus)
|
||||
IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace;
|
||||
|
||||
return (ND->getIdentifierNamespace() & IDNS) &&
|
||||
!isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND);
|
||||
!isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) &&
|
||||
!isa<ObjCPropertyDecl>(ND);
|
||||
}
|
||||
|
||||
/// \brief Determines whether the given declaration is suitable as the
|
||||
|
@ -973,6 +995,34 @@ static void AddTypedefResult(ResultBuilder &Results) {
|
|||
Results.AddResult(CodeCompleteConsumer::Result(Pattern));
|
||||
}
|
||||
|
||||
static bool WantTypesInContext(Action::CodeCompletionContext CCC,
|
||||
const LangOptions &LangOpts) {
|
||||
if (LangOpts.CPlusPlus)
|
||||
return true;
|
||||
|
||||
switch (CCC) {
|
||||
case Action::CCC_Namespace:
|
||||
case Action::CCC_Class:
|
||||
case Action::CCC_ObjCInstanceVariableList:
|
||||
case Action::CCC_Template:
|
||||
case Action::CCC_MemberTemplate:
|
||||
case Action::CCC_Statement:
|
||||
case Action::CCC_RecoveryInFunction:
|
||||
return true;
|
||||
|
||||
case Action::CCC_ObjCInterface:
|
||||
case Action::CCC_ObjCImplementation:
|
||||
case Action::CCC_Expression:
|
||||
case Action::CCC_Condition:
|
||||
return false;
|
||||
|
||||
case Action::CCC_ForInit:
|
||||
return LangOpts.ObjC1 || LangOpts.C99;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// \brief Add language constructs that show up for "ordinary" names.
|
||||
static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,
|
||||
Scope *S,
|
||||
|
@ -1431,7 +1481,8 @@ static void AddOrdinaryNameResults(Action::CodeCompletionContext CCC,
|
|||
}
|
||||
}
|
||||
|
||||
AddTypeSpecifierResults(SemaRef.getLangOptions(), Results);
|
||||
if (WantTypesInContext(CCC, SemaRef.getLangOptions()))
|
||||
AddTypeSpecifierResults(SemaRef.getLangOptions(), Results);
|
||||
|
||||
if (SemaRef.getLangOptions().CPlusPlus)
|
||||
Results.AddResult(Result("operator"));
|
||||
|
@ -2057,7 +2108,10 @@ void Sema::CodeCompleteOrdinaryName(Scope *S,
|
|||
case CCC_Statement:
|
||||
case CCC_ForInit:
|
||||
case CCC_Condition:
|
||||
Results.setFilter(&ResultBuilder::IsOrdinaryName);
|
||||
if (WantTypesInContext(CompletionContext, getLangOptions()))
|
||||
Results.setFilter(&ResultBuilder::IsOrdinaryName);
|
||||
else
|
||||
Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
|
||||
break;
|
||||
|
||||
case CCC_RecoveryInFunction:
|
||||
|
|
|
@ -39,11 +39,6 @@
|
|||
// CHECK-CC5: {TypedText @optional}
|
||||
// CHECK-CC5: {TypedText @property}
|
||||
// CHECK-CC5: {TypedText @required}
|
||||
// CHECK-CC5: NotImplemented:{TypedText _Bool}
|
||||
// CHECK-CC5: TypedefDecl:{TypedText Class}
|
||||
// CHECK-CC5: TypedefDecl:{TypedText id}
|
||||
// CHECK-CC5: ObjCInterfaceDecl:{TypedText MyClass}
|
||||
// CHECK-CC5: TypedefDecl:{TypedText SEL}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:2:23 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC6 %s
|
||||
// CHECK-CC6: NotImplemented:{TypedText package}
|
||||
|
|
|
@ -10,9 +10,15 @@ int test(int i, int j, int k, int l) {
|
|||
// RUN: c-index-test -code-completion-at=%s:7:9 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// CHECK-CC1: macro definition:{TypedText __VERSION__} (70)
|
||||
// CHECK-CC1: FunctionDecl:{ResultType int}{TypedText f}{LeftParen (}{Placeholder int}{RightParen )} (50)
|
||||
// CHECK-CC1: NotImplemented:{TypedText float} (40)
|
||||
// CHECK-CC1-NOT: NotImplemented:{TypedText float} (40)
|
||||
// CHECK-CC1: ParmDecl:{ResultType int}{TypedText j} (8)
|
||||
// CHECK-CC1: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )} (30)
|
||||
// RUN: c-index-test -code-completion-at=%s:7:14 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: c-index-test -code-completion-at=%s:7:18 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: c-index-test -code-completion-at=%s:7:22 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: c-index-test -code-completion-at=%s:7:2 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// CHECK-CC2: macro definition:{TypedText __VERSION__} (70)
|
||||
// CHECK-CC2: FunctionDecl:{ResultType int}{TypedText f}{LeftParen (}{Placeholder int}{RightParen )} (50)
|
||||
// CHECK-CC2: NotImplemented:{TypedText float} (40)
|
||||
// CHECK-CC2: ParmDecl:{ResultType int}{TypedText j} (8)
|
||||
// CHECK-CC2: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )} (30)
|
||||
|
|
|
@ -14,8 +14,12 @@
|
|||
// RUN: c-index-test -code-completion-at=%s:9:20 -Xclang -code-completion-patterns %s 2>%t | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: not grep error %t
|
||||
// CHECK-CC1: NotImplemented:{TypedText @encode}{LeftParen (}{Placeholder type-name}{RightParen )}
|
||||
// CHECK-CC1: NotImplemented:{TypedText _Bool}
|
||||
// CHECK-CC1-NOT: NotImplemented:{TypedText _Bool}
|
||||
// CHECK-CC1: VarDecl:{ResultType A *}{TypedText a}
|
||||
// CHECK-CC1: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:10:24 -Xclang -code-completion-patterns %s 2>%t | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: c-index-test -code-completion-at=%s:10:24 -Xclang -code-completion-patterns %s 2>%t | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// CHECK-CC2: NotImplemented:{TypedText @encode}{LeftParen (}{Placeholder type-name}{RightParen )}
|
||||
// CHECK-CC2: NotImplemented:{TypedText _Bool}
|
||||
// CHECK-CC2: VarDecl:{ResultType A *}{TypedText a}
|
||||
// CHECK-CC2: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )}
|
||||
|
|
Загрузка…
Ссылка в новой задаче