diff options
| author | Haojian Wu <hokein@google.com> | 2016-07-15 08:12:48 +0000 |
|---|---|---|
| committer | Haojian Wu <hokein@google.com> | 2016-07-15 08:12:48 +0000 |
| commit | 39a718c48bed8b45caac909400fc9ea52f564bc4 (patch) | |
| tree | 3cf4458e012fe663cddf6e55fee21e8689d31495 /clang-tools-extra/include-fixer/IncludeFixerContext.cpp | |
| parent | 8f16dffbb1dd6ca173ccc5c518a4313e8d466c88 (diff) | |
| download | bcm5719-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.cpp | 38 |
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 |

