diff options
-rw-r--r-- | include/clang/AST/PrettyPrinter.h | 6 | ||||
-rw-r--r-- | lib/AST/NestedNameSpecifier.cpp | 3 | ||||
-rw-r--r-- | lib/AST/TypePrinter.cpp | 5 | ||||
-rw-r--r-- | lib/Sema/SemaCodeComplete.cpp | 1 | ||||
-rw-r--r-- | test/Index/complete-cxx-inline-methods.cpp | 10 |
5 files changed, 20 insertions, 5 deletions
diff --git a/include/clang/AST/PrettyPrinter.h b/include/clang/AST/PrettyPrinter.h index 2bdd8d3f4b..2e34dc8cbd 100644 --- a/include/clang/AST/PrettyPrinter.h +++ b/include/clang/AST/PrettyPrinter.h @@ -36,7 +36,7 @@ struct PrintingPolicy { PrintingPolicy(const LangOptions &LO) : Indentation(2), LangOpts(LO), SuppressSpecifiers(false), SuppressTagKeyword(false), SuppressTag(false), SuppressScope(false), - SuppressInitializers(false), + SuppressUnwrittenScope(false), SuppressInitializers(false), Dump(false), ConstantArraySizeAsWritten(false), AnonymousTagLocations(true), SuppressStrongLifetime(false), Bool(LO.Bool) { } @@ -86,6 +86,10 @@ struct PrintingPolicy { /// \brief Suppresses printing of scope specifiers. 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. /// /// This flag is used when printing the loop variable in a for-range diff --git a/lib/AST/NestedNameSpecifier.cpp b/lib/AST/NestedNameSpecifier.cpp index 1ff2e7177b..858cf12dc6 100644 --- a/lib/AST/NestedNameSpecifier.cpp +++ b/lib/AST/NestedNameSpecifier.cpp @@ -229,6 +229,9 @@ NestedNameSpecifier::print(raw_ostream &OS, break; case Namespace: + if (getAsNamespace()->isAnonymousNamespace()) + return; + OS << getAsNamespace()->getName(); break; diff --git a/lib/AST/TypePrinter.cpp b/lib/AST/TypePrinter.cpp index fb7b918ca2..ec6cb48bf8 100644 --- a/lib/AST/TypePrinter.cpp +++ b/lib/AST/TypePrinter.cpp @@ -600,6 +600,9 @@ void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) { unsigned OldSize = Buffer.size(); if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { + if (Policy.SuppressUnwrittenScope && + (NS->isAnonymousNamespace() || NS->isInline())) + return; if (NS->getIdentifier()) Buffer += NS->getNameAsString(); else @@ -620,6 +623,8 @@ void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) { Buffer += Typedef->getIdentifier()->getName(); else if (Tag->getIdentifier()) Buffer += Tag->getIdentifier()->getName(); + else + return; } if (Buffer.size() != OldSize) diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 4066a06e52..f964ec1483 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -1381,6 +1381,7 @@ static PrintingPolicy getCompletionPrintingPolicy(Sema &S) { PrintingPolicy Policy = S.getPrintingPolicy(); Policy.AnonymousTagLocations = false; Policy.SuppressStrongLifetime = true; + Policy.SuppressUnwrittenScope = true; return Policy; } diff --git a/test/Index/complete-cxx-inline-methods.cpp b/test/Index/complete-cxx-inline-methods.cpp index 48fa8683af..d441972dd6 100644 --- a/test/Index/complete-cxx-inline-methods.cpp +++ b/test/Index/complete-cxx-inline-methods.cpp @@ -1,3 +1,4 @@ +namespace { class MyCls { void in_foo() { vec.x = 0; @@ -20,9 +21,10 @@ private: int value; MyCls *object; }; +} -// RUN: c-index-test -code-completion-at=%s:3: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:4:9 %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-NEXT: StructDecl:{TypedText Vec}{Text ::} (75) // CHECK-NEXT: FieldDecl:{ResultType int}{TypedText x} (35) @@ -32,11 +34,11 @@ private: // CHECK-NEXT: Dot member access // 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: MemberRef:{TypedText object}{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: MemberRef:{TypedText object}{LeftParen (}{Placeholder args}{RightParen )} (35) // CHECK-CTOR-INIT-2: MemberRef:{TypedText value}{LeftParen (}{Placeholder args}{RightParen )} (7) |