зеркало из https://github.com/microsoft/clang-1.git
Don't perform name lookup into a given declaration context more than once during code completion
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82234 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
75b7128e93
Коммит
5836b010d0
|
@ -198,6 +198,9 @@ public:
|
|||
ResultSet &Results);
|
||||
unsigned CollectMemberLookupResults(DeclContext *Ctx, unsigned InitialRank,
|
||||
ResultSet &Results);
|
||||
unsigned CollectMemberLookupResults(DeclContext *Ctx, unsigned InitialRank,
|
||||
llvm::SmallPtrSet<DeclContext *, 16> &Visited,
|
||||
ResultSet &Results);
|
||||
//@}
|
||||
|
||||
/// \name Name lookup predicates
|
||||
|
|
|
@ -321,8 +321,37 @@ unsigned CodeCompleteConsumer::CollectLookupResults(Scope *S,
|
|||
/// \returns the next higher rank value, after considering all of the
|
||||
/// names within this declaration context.
|
||||
unsigned CodeCompleteConsumer::CollectMemberLookupResults(DeclContext *Ctx,
|
||||
unsigned InitialRank,
|
||||
unsigned InitialRank,
|
||||
ResultSet &Results) {
|
||||
llvm::SmallPtrSet<DeclContext *, 16> Visited;
|
||||
return CollectMemberLookupResults(Ctx, InitialRank, Visited, Results);
|
||||
}
|
||||
|
||||
/// \brief Collect the results of searching for members within the given
|
||||
/// declaration context.
|
||||
///
|
||||
/// \param Ctx the declaration context from which we will gather results.
|
||||
///
|
||||
/// \param InitialRank the initial rank given to results in this declaration
|
||||
/// context. Larger rank values will be used for, e.g., members found in
|
||||
/// base classes.
|
||||
///
|
||||
/// \param Visited the set of declaration contexts that have already been
|
||||
/// visited. Declaration contexts will only be visited once.
|
||||
///
|
||||
/// \param Results the result set that will be extended with any results
|
||||
/// found within this declaration context (and, for a C++ class, its bases).
|
||||
///
|
||||
/// \returns the next higher rank value, after considering all of the
|
||||
/// names within this declaration context.
|
||||
unsigned CodeCompleteConsumer::CollectMemberLookupResults(DeclContext *Ctx,
|
||||
unsigned InitialRank,
|
||||
llvm::SmallPtrSet<DeclContext *, 16> &Visited,
|
||||
ResultSet &Results) {
|
||||
// Make sure we don't visit the same context twice.
|
||||
if (!Visited.insert(Ctx->getPrimaryContext()))
|
||||
return InitialRank;
|
||||
|
||||
// Enumerate all of the results in this context.
|
||||
Results.EnterNewScope();
|
||||
for (DeclContext *CurCtx = Ctx->getPrimaryContext(); CurCtx;
|
||||
|
@ -352,9 +381,6 @@ unsigned CodeCompleteConsumer::CollectMemberLookupResults(DeclContext *Ctx,
|
|||
if (!Record)
|
||||
continue;
|
||||
|
||||
// FIXME: We should keep track of the virtual bases we visit, so
|
||||
// that we don't visit them more than once.
|
||||
|
||||
// FIXME: It would be nice to be able to determine whether referencing
|
||||
// a particular member would be ambiguous. For example, given
|
||||
//
|
||||
|
@ -376,7 +402,8 @@ unsigned CodeCompleteConsumer::CollectMemberLookupResults(DeclContext *Ctx,
|
|||
// Collect results from this base class (and its bases).
|
||||
NextRank = std::max(NextRank,
|
||||
CollectMemberLookupResults(Record->getDecl(),
|
||||
InitialRank + 1,
|
||||
InitialRank + 1,
|
||||
Visited,
|
||||
Results));
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче