[PATCH] D95925: [clangd] Detect rename conflicits within enclosing scope
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 3 23:55:40 PST 2021
hokein added inline comments.
================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:333
+ // not invalidated.
+ DynTypedNodeList Parents(DynTypedNode::create(RenamedDecl));
+ auto GetSingleParent = [&](DynTypedNode Node) -> const DynTypedNode * {
----------------
If the intention is for storage, maybe call it Storage.
================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:334
+ DynTypedNodeList Parents(DynTypedNode::create(RenamedDecl));
+ auto GetSingleParent = [&](DynTypedNode Node) -> const DynTypedNode * {
+ Parents = Ctx.getParents(Node);
----------------
`const DynTypedNode &`
================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:362
+ for (const auto *Node : CS->children())
+ return CheckDeclStmt(dyn_cast<DeclStmt>(Node), Name);
+ return nullptr;
----------------
I think we need to iterate *all* children, rather than the first one. looks like our testcase doesn't cover this, maybe add one.
================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:372
+
+ // CompoundStmt is the most common enclosing scope. In the simplest case we
+ // just iterate through sibling DeclStmts and check for collisions.
----------------
CompoundStmt is the most common enclosing scope for function-local symbols.
================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:378
+ const auto *ScopeParent =
+ GetSingleParent(DynTypedNode::create(*EnclosingCS));
+ // CompoundStmt may be found within if/while/for. In these cases, rename can
----------------
maybe just `GetSingleParent(Parent)`, rather than creating a new DynTypeNode.
================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:390
+ if (const auto *Result =
+ CheckDeclStmt(dyn_cast<DeclStmt>(For->getInit()), NewName))
+ return Result;
----------------
be careful about nullptr here, the init-statement could be a nullptr, which will trigger a crash in dyn_cast, thinking about the case below:
```
for (; ; ;) {
int var;
}
```
use `dyn_cast_or_null`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95925/new/
https://reviews.llvm.org/D95925
More information about the cfe-commits
mailing list