Add a printing policy flag to suppress printing "<anonymous>::" prior

to types. Enable this flag for code completion, where knowing whether
something is in an anonymous or inline namespace is actually not
useful, since you don't have to type it anyway. Fixes
<rdar://problem/10208818>.

llvm-svn: 143599
This commit is contained in:
Douglas Gregor 2011-11-03 00:16:13 +00:00
parent 9589872af9
commit 2e10cf9620
5 changed files with 20 additions and 5 deletions

View File

@ -36,7 +36,7 @@ struct PrintingPolicy {
PrintingPolicy(const LangOptions &LO) PrintingPolicy(const LangOptions &LO)
: Indentation(2), LangOpts(LO), SuppressSpecifiers(false), : Indentation(2), LangOpts(LO), SuppressSpecifiers(false),
SuppressTagKeyword(false), SuppressTag(false), SuppressScope(false), SuppressTagKeyword(false), SuppressTag(false), SuppressScope(false),
SuppressInitializers(false), SuppressUnwrittenScope(false), SuppressInitializers(false),
Dump(false), ConstantArraySizeAsWritten(false), Dump(false), ConstantArraySizeAsWritten(false),
AnonymousTagLocations(true), SuppressStrongLifetime(false), AnonymousTagLocations(true), SuppressStrongLifetime(false),
Bool(LO.Bool) { } Bool(LO.Bool) { }
@ -86,6 +86,10 @@ struct PrintingPolicy {
/// \brief Suppresses printing of scope specifiers. /// \brief Suppresses printing of scope specifiers.
bool SuppressScope : 1; bool SuppressScope : 1;
/// \brief Suppress printing parts of scope specifiers that don't need
/// to be written, e.g., for inline or anonymous namespaces.
bool SuppressUnwrittenScope : 1;
/// \brief Suppress printing of variable initializers. /// \brief Suppress printing of variable initializers.
/// ///
/// This flag is used when printing the loop variable in a for-range /// This flag is used when printing the loop variable in a for-range

View File

@ -229,6 +229,9 @@ NestedNameSpecifier::print(raw_ostream &OS,
break; break;
case Namespace: case Namespace:
if (getAsNamespace()->isAnonymousNamespace())
return;
OS << getAsNamespace()->getName(); OS << getAsNamespace()->getName();
break; break;

View File

@ -600,6 +600,9 @@ void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) {
unsigned OldSize = Buffer.size(); unsigned OldSize = Buffer.size();
if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
if (Policy.SuppressUnwrittenScope &&
(NS->isAnonymousNamespace() || NS->isInline()))
return;
if (NS->getIdentifier()) if (NS->getIdentifier())
Buffer += NS->getNameAsString(); Buffer += NS->getNameAsString();
else else
@ -620,6 +623,8 @@ void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) {
Buffer += Typedef->getIdentifier()->getName(); Buffer += Typedef->getIdentifier()->getName();
else if (Tag->getIdentifier()) else if (Tag->getIdentifier())
Buffer += Tag->getIdentifier()->getName(); Buffer += Tag->getIdentifier()->getName();
else
return;
} }
if (Buffer.size() != OldSize) if (Buffer.size() != OldSize)

View File

@ -1381,6 +1381,7 @@ static PrintingPolicy getCompletionPrintingPolicy(Sema &S) {
PrintingPolicy Policy = S.getPrintingPolicy(); PrintingPolicy Policy = S.getPrintingPolicy();
Policy.AnonymousTagLocations = false; Policy.AnonymousTagLocations = false;
Policy.SuppressStrongLifetime = true; Policy.SuppressStrongLifetime = true;
Policy.SuppressUnwrittenScope = true;
return Policy; return Policy;
} }

View File

@ -1,3 +1,4 @@
namespace {
class MyCls { class MyCls {
void in_foo() { void in_foo() {
vec.x = 0; vec.x = 0;
@ -20,9 +21,10 @@ private:
int value; int value;
MyCls *object; MyCls *object;
}; };
}
// RUN: c-index-test -code-completion-at=%s:3:9 %s | FileCheck %s // RUN: c-index-test -code-completion-at=%s:4:9 %s | FileCheck %s
// RUN: c-index-test -code-completion-at=%s:12:7 %s | FileCheck %s // RUN: c-index-test -code-completion-at=%s:13:7 %s | FileCheck %s
// CHECK: CXXMethod:{ResultType MyCls::Vec &}{TypedText operator=}{LeftParen (}{Placeholder const MyCls::Vec &}{RightParen )} (34) // CHECK: CXXMethod:{ResultType MyCls::Vec &}{TypedText operator=}{LeftParen (}{Placeholder const MyCls::Vec &}{RightParen )} (34)
// CHECK-NEXT: StructDecl:{TypedText Vec}{Text ::} (75) // CHECK-NEXT: StructDecl:{TypedText Vec}{Text ::} (75)
// CHECK-NEXT: FieldDecl:{ResultType int}{TypedText x} (35) // CHECK-NEXT: FieldDecl:{ResultType int}{TypedText x} (35)
@ -32,11 +34,11 @@ private:
// CHECK-NEXT: Dot member access // CHECK-NEXT: Dot member access
// CHECK-NEXT: Container Kind: StructDecl // CHECK-NEXT: Container Kind: StructDecl
// RUN: c-index-test -code-completion-at=%s:17:41 %s | FileCheck -check-prefix=CHECK-CTOR-INIT %s // RUN: c-index-test -code-completion-at=%s:18:41 %s | FileCheck -check-prefix=CHECK-CTOR-INIT %s
// CHECK-CTOR-INIT: NotImplemented:{TypedText MyCls}{LeftParen (}{Placeholder args}{RightParen )} (7) // CHECK-CTOR-INIT: NotImplemented:{TypedText MyCls}{LeftParen (}{Placeholder args}{RightParen )} (7)
// CHECK-CTOR-INIT: MemberRef:{TypedText object}{LeftParen (}{Placeholder args}{RightParen )} (35) // CHECK-CTOR-INIT: MemberRef:{TypedText object}{LeftParen (}{Placeholder args}{RightParen )} (35)
// CHECK-CTOR-INIT: MemberRef:{TypedText value}{LeftParen (}{Placeholder args}{RightParen )} (35) // CHECK-CTOR-INIT: MemberRef:{TypedText value}{LeftParen (}{Placeholder args}{RightParen )} (35)
// RUN: c-index-test -code-completion-at=%s:17:55 %s | FileCheck -check-prefix=CHECK-CTOR-INIT-2 %s // RUN: c-index-test -code-completion-at=%s:18:55 %s | FileCheck -check-prefix=CHECK-CTOR-INIT-2 %s
// CHECK-CTOR-INIT-2-NOT: NotImplemented:{TypedText MyCls}{LeftParen (}{Placeholder args}{RightParen )} // CHECK-CTOR-INIT-2-NOT: NotImplemented:{TypedText MyCls}{LeftParen (}{Placeholder args}{RightParen )}
// CHECK-CTOR-INIT-2: MemberRef:{TypedText object}{LeftParen (}{Placeholder args}{RightParen )} (35) // CHECK-CTOR-INIT-2: MemberRef:{TypedText object}{LeftParen (}{Placeholder args}{RightParen )} (35)
// CHECK-CTOR-INIT-2: MemberRef:{TypedText value}{LeftParen (}{Placeholder args}{RightParen )} (7) // CHECK-CTOR-INIT-2: MemberRef:{TypedText value}{LeftParen (}{Placeholder args}{RightParen )} (7)