summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/include-fixer/IncludeFixerContext.cpp
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2016-07-15 08:12:48 +0000
committerHaojian Wu <hokein@google.com>2016-07-15 08:12:48 +0000
commit39a718c48bed8b45caac909400fc9ea52f564bc4 (patch)
tree3cf4458e012fe663cddf6e55fee21e8689d31495 /clang-tools-extra/include-fixer/IncludeFixerContext.cpp
parent8f16dffbb1dd6ca173ccc5c518a4313e8d466c88 (diff)
downloadbcm5719-llvm-39a718c48bed8b45caac909400fc9ea52f564bc4.tar.gz
bcm5719-llvm-39a718c48bed8b45caac909400fc9ea52f564bc4.zip
[include-fixer] Always add as few as possible qualifiers to the unidentified symbol.
Reviewers: bkramer Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D22367 llvm-svn: 275542
Diffstat (limited to 'clang-tools-extra/include-fixer/IncludeFixerContext.cpp')
-rw-r--r--clang-tools-extra/include-fixer/IncludeFixerContext.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/clang-tools-extra/include-fixer/IncludeFixerContext.cpp b/clang-tools-extra/include-fixer/IncludeFixerContext.cpp
index 988b440ca1c..d6fbdb5fbbb 100644
--- a/clang-tools-extra/include-fixer/IncludeFixerContext.cpp
+++ b/clang-tools-extra/include-fixer/IncludeFixerContext.cpp
@@ -15,9 +15,17 @@ namespace include_fixer {
namespace {
+// Splits a multiply qualified names (e.g. a::b::c).
+llvm::SmallVector<llvm::StringRef, 8>
+SplitQualifiers(llvm::StringRef StringQualifiers) {
+ llvm::SmallVector<llvm::StringRef, 8> Qualifiers;
+ StringQualifiers.split(Qualifiers, "::");
+ return Qualifiers;
+}
+
std::string createQualifiedNameForReplacement(
llvm::StringRef RawSymbolName,
- llvm::StringRef SymbolScopedQualifiers,
+ llvm::StringRef SymbolScopedQualifiersName,
const find_all_symbols::SymbolInfo &MatchedSymbol) {
// No need to add missing qualifiers if SymbolIndentifer has a global scope
// operator "::".
@@ -32,8 +40,7 @@ std::string createQualifiedNameForReplacement(
// missing stripped qualifiers here.
//
// Get stripped qualifiers.
- llvm::SmallVector<llvm::StringRef, 8> SymbolQualifiers;
- RawSymbolName.split(SymbolQualifiers, "::");
+ auto SymbolQualifiers = SplitQualifiers(RawSymbolName);
std::string StrippedQualifiers;
while (!SymbolQualifiers.empty() &&
!llvm::StringRef(QualifiedName).endswith(SymbolQualifiers.back())) {
@@ -43,11 +50,26 @@ std::string createQualifiedNameForReplacement(
// Append the missing stripped qualifiers.
std::string FullyQualifiedName = QualifiedName + StrippedQualifiers;
- // Skips symbol scoped qualifiers prefix.
- if (llvm::StringRef(FullyQualifiedName).startswith(SymbolScopedQualifiers))
- return FullyQualifiedName.substr(SymbolScopedQualifiers.size());
-
- return FullyQualifiedName;
+ // Try to find and skip the common prefix qualifiers.
+ auto FullySymbolQualifiers = SplitQualifiers(FullyQualifiedName);
+ auto ScopedQualifiers = SplitQualifiers(SymbolScopedQualifiersName);
+ auto FullySymbolQualifiersIter = FullySymbolQualifiers.begin();
+ auto SymbolScopedQualifiersIter = ScopedQualifiers.begin();
+ while (FullySymbolQualifiersIter != FullySymbolQualifiers.end() &&
+ SymbolScopedQualifiersIter != ScopedQualifiers.end()) {
+ if (*FullySymbolQualifiersIter != *SymbolScopedQualifiersIter)
+ break;
+ ++FullySymbolQualifiersIter;
+ ++SymbolScopedQualifiersIter;
+ }
+ std::string Result;
+ for (; FullySymbolQualifiersIter != FullySymbolQualifiers.end();
+ ++FullySymbolQualifiersIter) {
+ if (!Result.empty())
+ Result += "::";
+ Result += *FullySymbolQualifiersIter;
+ }
+ return Result;
}
} // anonymous namespace
OpenPOWER on IntegriCloud