njames93 updated this revision to Diff 318523. njames93 added a comment. Update FindTargets to fix symbol renaming on a CXXBaseSpecifier. Add test to ensure rename wont trigger on a CXXBaseSpecifier.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D95231/new/ https://reviews.llvm.org/D95231 Files: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/Selection.cpp clang-tools-extra/clangd/unittests/RenameTests.cpp clang-tools-extra/clangd/unittests/SelectionTests.cpp clang/lib/AST/ASTTypeTraits.cpp Index: clang/lib/AST/ASTTypeTraits.cpp =================================================================== --- clang/lib/AST/ASTTypeTraits.cpp +++ clang/lib/AST/ASTTypeTraits.cpp @@ -193,5 +193,7 @@ return TAL->getSourceRange(); if (const auto *C = get<OMPClause>()) return SourceRange(C->getBeginLoc(), C->getEndLoc()); + if (const auto *CBS = get<CXXBaseSpecifier>()) + return CBS->getSourceRange(); return SourceRange(); } Index: clang-tools-extra/clangd/unittests/SelectionTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -261,6 +261,27 @@ )cpp", "StringLiteral", // Not DeclRefExpr to operator()! }, + { + R"cpp( + struct Foo {}; + struct Bar : [[v^ir^tual private Foo]] {}; + )cpp", + "CXXBaseSpecifier", + }, + { + R"cpp( + struct Foo {}; + struct Bar : [[private Fo^o]] {}; + )cpp", + "CXXBaseSpecifier", + }, + { + R"cpp( + struct Foo {}; + struct Bar : [[Fo^o]] {}; + )cpp", + "CXXBaseSpecifier", + }, // Point selections. {"void foo() { [[^foo]](); }", "DeclRefExpr"}, Index: clang-tools-extra/clangd/unittests/RenameTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/RenameTests.cpp +++ clang-tools-extra/clangd/unittests/RenameTests.cpp @@ -1024,6 +1024,12 @@ } )cpp", "new name is the same", !HeaderFile, nullptr, "SameName"}, + {R"cpp(// Ensure it doesn't associate base specifier with base name. + struct A {}; + struct B : priv^ate A {}; + )cpp", + "Cannot rename symbol: there is no symbol at the given location", false, + nullptr}, }; for (const auto& Case : Cases) { Index: clang-tools-extra/clangd/Selection.cpp =================================================================== --- clang-tools-extra/clangd/Selection.cpp +++ clang-tools-extra/clangd/Selection.cpp @@ -493,6 +493,14 @@ return traverseNode( X, [&] { return Base::TraverseConstructorInitializer(X); }); } + bool TraverseCXXBaseSpecifier(const CXXBaseSpecifier &X) { + auto N = DynTypedNode::create(X); + if (canSafelySkipNode(N)) + return true; + push(std::move(N)); + pop(); + return true; + } // Stmt is the same, but this form allows the data recursion optimization. bool dataTraverseStmtPre(Stmt *X) { if (!X || isImplicit(X)) Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -710,7 +710,8 @@ Finder.add(CCI, Flags); else if (const TemplateArgumentLoc *TAL = N.get<TemplateArgumentLoc>()) Finder.add(TAL->getArgument(), Flags); - + else if (const CXXBaseSpecifier *CBS = N.get<CXXBaseSpecifier>()) + Finder.add(CBS->getType(), Flags); return Finder.takeDecls(); }
Index: clang/lib/AST/ASTTypeTraits.cpp =================================================================== --- clang/lib/AST/ASTTypeTraits.cpp +++ clang/lib/AST/ASTTypeTraits.cpp @@ -193,5 +193,7 @@ return TAL->getSourceRange(); if (const auto *C = get<OMPClause>()) return SourceRange(C->getBeginLoc(), C->getEndLoc()); + if (const auto *CBS = get<CXXBaseSpecifier>()) + return CBS->getSourceRange(); return SourceRange(); } Index: clang-tools-extra/clangd/unittests/SelectionTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -261,6 +261,27 @@ )cpp", "StringLiteral", // Not DeclRefExpr to operator()! }, + { + R"cpp( + struct Foo {}; + struct Bar : [[v^ir^tual private Foo]] {}; + )cpp", + "CXXBaseSpecifier", + }, + { + R"cpp( + struct Foo {}; + struct Bar : [[private Fo^o]] {}; + )cpp", + "CXXBaseSpecifier", + }, + { + R"cpp( + struct Foo {}; + struct Bar : [[Fo^o]] {}; + )cpp", + "CXXBaseSpecifier", + }, // Point selections. {"void foo() { [[^foo]](); }", "DeclRefExpr"}, Index: clang-tools-extra/clangd/unittests/RenameTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/RenameTests.cpp +++ clang-tools-extra/clangd/unittests/RenameTests.cpp @@ -1024,6 +1024,12 @@ } )cpp", "new name is the same", !HeaderFile, nullptr, "SameName"}, + {R"cpp(// Ensure it doesn't associate base specifier with base name. + struct A {}; + struct B : priv^ate A {}; + )cpp", + "Cannot rename symbol: there is no symbol at the given location", false, + nullptr}, }; for (const auto& Case : Cases) { Index: clang-tools-extra/clangd/Selection.cpp =================================================================== --- clang-tools-extra/clangd/Selection.cpp +++ clang-tools-extra/clangd/Selection.cpp @@ -493,6 +493,14 @@ return traverseNode( X, [&] { return Base::TraverseConstructorInitializer(X); }); } + bool TraverseCXXBaseSpecifier(const CXXBaseSpecifier &X) { + auto N = DynTypedNode::create(X); + if (canSafelySkipNode(N)) + return true; + push(std::move(N)); + pop(); + return true; + } // Stmt is the same, but this form allows the data recursion optimization. bool dataTraverseStmtPre(Stmt *X) { if (!X || isImplicit(X)) Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -710,7 +710,8 @@ Finder.add(CCI, Flags); else if (const TemplateArgumentLoc *TAL = N.get<TemplateArgumentLoc>()) Finder.add(TAL->getArgument(), Flags); - + else if (const CXXBaseSpecifier *CBS = N.get<CXXBaseSpecifier>()) + Finder.add(CBS->getType(), Flags); return Finder.takeDecls(); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits