diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-11-09 21:35:27 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-11-09 21:35:27 +0000 |
commit | ff4393c1cea81b94ac081bed5c49b8126f12fae8 (patch) | |
tree | a1f473fc31b914aecbdb21a8025c65ee3c39b05c | |
parent | d411b3f746e612294bd5f0843d83e8c215f7fe58 (diff) |
Make sure that we look into nested, transparent declaration contexts
when looking for a name within a given DeclContext. Now enumerators
will show up in code-completion results.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86591 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaCodeComplete.cpp | 11 | ||||
-rw-r--r-- | test/Index/code-completion.cpp | 8 | ||||
-rw-r--r-- | tools/CIndex/CIndex.cpp | 1 |
3 files changed, 16 insertions, 4 deletions
diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index c6323956cc..072dfe9b73 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -473,17 +473,24 @@ static unsigned CollectMemberLookupResults(DeclContext *Ctx, for (DeclContext *CurCtx = Ctx->getPrimaryContext(); CurCtx; CurCtx = CurCtx->getNextContext()) { for (DeclContext::decl_iterator D = CurCtx->decls_begin(), - DEnd = CurCtx->decls_end(); + DEnd = CurCtx->decls_end(); D != DEnd; ++D) { if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) Results.MaybeAddResult(Result(ND, Rank, 0, InBaseClass), CurContext); + + // Visit transparent contexts inside this context. + if (DeclContext *InnerCtx = dyn_cast<DeclContext>(*D)) { + if (InnerCtx->isTransparentContext()) + CollectMemberLookupResults(InnerCtx, Rank, CurContext, Visited, + Results, InBaseClass); + } } } // Traverse the contexts of inherited classes. if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Ctx)) { for (CXXRecordDecl::base_class_iterator B = Record->bases_begin(), - BEnd = Record->bases_end(); + BEnd = Record->bases_end(); B != BEnd; ++B) { QualType BaseType = B->getType(); diff --git a/test/Index/code-completion.cpp b/test/Index/code-completion.cpp index 313e56d733..44bd9d2893 100644 --- a/test/Index/code-completion.cpp +++ b/test/Index/code-completion.cpp @@ -2,6 +2,8 @@ #include "nonexistent_header.h" struct X { int member; + + enum E { Val1 }; }; struct Y { @@ -17,7 +19,7 @@ struct Z : X, Y { struct Z get_Z(); void test_Z() { - // RUN: c-index-test -code-completion-at=%s:21:11 %s | FileCheck -check-prefix=CHECK-MEMBER %s + // RUN: c-index-test -code-completion-at=%s:23:11 %s | FileCheck -check-prefix=CHECK-MEMBER %s get_Z().member = 17; } @@ -27,12 +29,14 @@ double& overloaded(float f, int second); int& overloaded(Z z, int second); void test_overloaded() { - // RUN: c-index-test -code-completion-at=%s:31:18 %s | FileCheck -check-prefix=CHECK-OVERLOAD %s + // RUN: c-index-test -code-completion-at=%s:33:18 %s | FileCheck -check-prefix=CHECK-OVERLOAD %s overloaded(Z(), 0); } +// CHECK-MEMBER: EnumDecl:{Informative X::}{TypedText E} // CHECK-MEMBER: FieldDecl:{TypedText member} // CHECK-MEMBER: FunctionDecl:{Informative Y::}{TypedText memfunc}{LeftParen (}{Optional {Placeholder int i}}{RightParen )} +// CHECK-MEMBER: EnumConstantDecl:{Informative E::}{TypedText Val1} // CHECK-MEMBER: FunctionDecl:{Informative X::}{TypedText ~X}{LeftParen (}{RightParen )} // CHECK-MEMBER: FunctionDecl:{TypedText operator int}{LeftParen (}{RightParen )} // CHECK-MEMBER: FunctionDecl:{TypedText operator=}{LeftParen (}{Placeholder struct Z const &}{RightParen )} diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 33d2032aba..c98d14264a 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -1141,6 +1141,7 @@ static CXCursorKind parseResultKind(llvm::StringRef Str) { .Case("Struct", CXCursor_StructDecl) .Case("Union", CXCursor_UnionDecl) .Case("Class", CXCursor_ClassDecl) + .Case("Enum", CXCursor_EnumDecl) .Case("Field", CXCursor_FieldDecl) .Case("EnumConstant", CXCursor_EnumConstantDecl) .Case("Function", CXCursor_FunctionDecl) |