[include-fixer] Don't add qualifiers to symbols which have global scope operator.

Reviewers: bkramer

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D22127

llvm-svn: 274848
This commit is contained in:
Haojian Wu 2016-07-08 14:28:43 +00:00
parent 46c4c3d31c
commit 5d9482d887
3 changed files with 12 additions and 7 deletions

View File

@ -34,6 +34,10 @@ tooling::Replacement
IncludeFixerContext::createSymbolReplacement(llvm::StringRef FilePath,
size_t Idx) {
assert(Idx < MatchedSymbols.size());
// No need to add missing qualifiers if SymbolIndentifer has a global scope
// operator "::".
if (getSymbolIdentifier().startswith("::"))
return tooling::Replacement();
std::string QualifiedName = MatchedSymbols[Idx].getQualifiedName();
// For nested classes, the qualified name constructed from database misses
// some stripped qualifiers, because when we search a symbol in database,

View File

@ -30,6 +30,7 @@ public:
/// symbol.
tooling::Replacement createSymbolReplacement(llvm::StringRef FilePath,
size_t Idx = 0);
/// \brief Get symbol name.
llvm::StringRef getSymbolIdentifier() const { return SymbolIdentifier; }

View File

@ -242,18 +242,18 @@ TEST(IncludeFixer, FixNamespaceQualifiers) {
EXPECT_EQ("#include \"bar.h\"\nnamespace a {\nb::bar::t b;\n}\n",
runIncludeFixer("namespace a {\nbar::t b;\n}\n"));
EXPECT_EQ(
"#include \"color.h\"\nint test = a::b::Green;\n",
runIncludeFixer("int test = Green;\n"));
EXPECT_EQ("#include \"color.h\"\nint test = a::b::Green;\n",
runIncludeFixer("int test = Green;\n"));
EXPECT_EQ("#include \"color.h\"\nnamespace d {\nint test = a::b::Green;\n}\n",
runIncludeFixer("namespace d {\nint test = Green;\n}\n"));
EXPECT_EQ("#include \"color.h\"\nnamespace a {\nint test = b::Green;\n}\n",
runIncludeFixer("namespace a {\nint test = Green;\n}\n"));
// FIXME: Fix-namespace should not fix the global qualified identifier.
EXPECT_EQ(
"#include \"bar.h\"\na::b::bar b;\n",
runIncludeFixer("::a::b::bar b;\n"));
// Test global scope operator.
EXPECT_EQ("#include \"bar.h\"\n::a::b::bar b;\n",
runIncludeFixer("::a::b::bar b;\n"));
EXPECT_EQ("#include \"bar.h\"\nnamespace a {\n::a::b::bar b;\n}\n",
runIncludeFixer("namespace a {\n::a::b::bar b;\n}\n"));
}
} // namespace