[PATCH] D58185: [clangd] Handle unresolved scope specifier when fixing includes.
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 18 10:29:48 PST 2019
sammccall accepted this revision.
sammccall added a comment.
This revision is now accepted and ready to land.
Thanks! The layering is *much* clearer now.
I can still suggest a couple of tweaks, but they're pretty much cosmetic.
================
Comment at: clangd/IncludeFixer.cpp:190
+// clang::clangd::X::Y
+// ~~~~~~
+llvm::Optional<std::string> qualifiedByUnresolved(llvm::StringRef Code,
----------------
you're showing a range here, it should be a point though?
================
Comment at: clangd/IncludeFixer.cpp:191
+// ~~~~~~
+llvm::Optional<std::string> qualifiedByUnresolved(llvm::StringRef Code,
+ size_t Offset) {
----------------
this isn't wrong per se (conservative, bails out e.g. on unicode)
But is it much harder to call Lexer::findNextToken twice and expect a raw identifier and ::?
================
Comment at: clangd/IncludeFixer.cpp:231
+ const SourceManager &SM, CXXScopeSpec *SS, llvm::StringRef UnresolvedName,
+ SourceLocation UnresolvedLoc, bool IsUnrsolvedSpecifier) {
+ bool Invalid = false;
----------------
Unrsolved -> Unresolved
emphasis might be clearer as `UnresolvedIsSpecifier` - there's always an unresolved entity, the boolean is indicating that it's a specifier
================
Comment at: clangd/IncludeFixer.cpp:256
+ std::string Spelling = (Code.substr(B, E - B) + "::").str();
+ vlog("Spelling scope: {0}, SpecifiedNS: {1}", Spelling, SpecifiedNS);
+ if (llvm::StringRef(SpecifiedNS).endswith(Spelling))
----------------
I don't think this vlog is useful as-is (quite far down the stack with no context)
Did you intend to remove it?
================
Comment at: clangd/IncludeFixer.cpp:322
UnresolvedName Unresolved;
Unresolved.Name = Typo.getAsString();
Unresolved.Loc = Typo.getBeginLoc();
----------------
Following up on our offline discussion :-)
I think that since `extractSpecifiedScopes` can want to modify the name, we should just expand that function's signature/responsibility to always determine the name.
So we'd pass the `const DeclarationNameInfo&` to `extractSpecifiedScopes`, and it would return a struct `{optional<string> ResolvedScope; optional<string> UnresolvedScope; string Name}`.
Maybe need to call them `CheapUnresolvedName`/`extractUnresolvedNameCheaply` or similar.
But I think the code change is small.
Repository:
rCTE Clang Tools Extra
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D58185/new/
https://reviews.llvm.org/D58185
More information about the cfe-commits
mailing list