Code completion for ordinary names when we're starting a declaration, expression, or statement

llvm-svn: 82481
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h
index aa35a60..7fa5462 100644
--- a/clang/lib/Sema/Sema.h
+++ b/clang/lib/Sema/Sema.h
@@ -3629,6 +3629,7 @@
   /// \name Code completion
   //@{
   void setCodeCompleteConsumer(CodeCompleteConsumer *CCC);
+  virtual void CodeCompleteOrdinaryName(Scope *S);
   virtual void CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *Base,
                                                SourceLocation OpLoc,
                                                bool IsArrow);
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 79904c9..52e7d0e 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -104,6 +104,7 @@
     /// results of name lookup. All of the predicates have the same type, so that
     /// 
     //@{
+    bool IsOrdinaryName(NamedDecl *ND) const;
     bool IsNestedNameSpecifier(NamedDecl *ND) const;
     bool IsEnum(NamedDecl *ND) const;
     bool IsClassOrStruct(NamedDecl *ND) const;
@@ -316,6 +317,16 @@
   ShadowMaps.pop_back();
 }
 
+/// \brief Determines whether this given declaration will be found by
+/// ordinary name lookup.
+bool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const {
+  unsigned IDNS = Decl::IDNS_Ordinary;
+  if (SemaRef.getLangOptions().CPlusPlus)
+    IDNS |= Decl::IDNS_Tag;
+  
+  return ND->getIdentifierNamespace() & IDNS;
+}
+
 /// \brief Determines whether the given declaration is suitable as the 
 /// start of a C++ nested-name-specifier, e.g., a class or namespace.
 bool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const {
@@ -874,6 +885,13 @@
     CodeCompleter->ProcessCodeCompleteResults(Results, NumResults);
 }
 
+void Sema::CodeCompleteOrdinaryName(Scope *S) {
+  ResultBuilder Results(*this, &ResultBuilder::IsOrdinaryName);
+  CollectLookupResults(S, Context.getTranslationUnitDecl(), 0, CurContext, 
+                       Results);
+  HandleCodeCompleteResults(CodeCompleter, Results.data(), Results.size());
+}
+
 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE,
                                            SourceLocation OpLoc,
                                            bool IsArrow) {