sammccall created this revision. sammccall added a reviewer: adamcz. Herald added subscribers: cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay, ilya-biryukov. Herald added a project: clang.
This means they're renamable and textDocument/highlight works This fell out of D78454 <https://reviews.llvm.org/D78454> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D80170 Files: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/unittests/FindTargetTests.cpp Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -773,6 +773,14 @@ "6: targets = {a::b::S}\n" "7: targets = {a::b::S::type}, qualifier = 'struct S::'\n" "8: targets = {y}, decl\n"}, + {R"cpp( + void foo() { + $0^ten: // PRINT "HELLO WORLD!" + goto $1^ten; + } + )cpp", + "0: targets = {ten}, decl\n" + "1: targets = {ten}\n"}, // Simple templates. {R"cpp( template <class T> struct vector { using value_type = T; }; Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -643,7 +643,7 @@ return V.Refs; } -llvm::SmallVector<ReferenceLoc, 2> refInExpr(const Expr *E) { +llvm::SmallVector<ReferenceLoc, 2> refInStmt(const Stmt *S) { struct Visitor : ConstStmtVisitor<Visitor> { // FIXME: handle more complicated cases: more ObjC, designated initializers. llvm::SmallVector<ReferenceLoc, 2> Refs; @@ -722,10 +722,25 @@ /*IsDecl=*/false, std::move(Targets)}); } } + + void VisitGotoStmt(const GotoStmt *GS) { + llvm::SmallVector<const NamedDecl *, 1> Targets; + if (const auto *L = GS->getLabel()) + Targets.push_back(L); + Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), GS->getLabelLoc(), + /*IsDecl=*/false, std::move(Targets)}); + } + + void VisitLabelStmt(const LabelStmt *LS) { + Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), + LS->getIdentLoc(), + /*IsDecl=*/true, + {LS->getDecl()}}); + } }; Visitor V; - V.Visit(E); + V.Visit(S); return V.Refs; } @@ -837,8 +852,8 @@ return RecursiveASTVisitor::TraverseElaboratedTypeLoc(L); } - bool VisitExpr(Expr *E) { - visitNode(DynTypedNode::create(*E)); + bool VisitStmt(Stmt *S) { + visitNode(DynTypedNode::create(*S)); return true; } @@ -926,8 +941,8 @@ llvm::SmallVector<ReferenceLoc, 2> explicitReference(DynTypedNode N) { if (auto *D = N.get<Decl>()) return refInDecl(D); - if (auto *E = N.get<Expr>()) - return refInExpr(E); + if (auto *S = N.get<Stmt>()) + return refInStmt(S); if (auto *NNSL = N.get<NestedNameSpecifierLoc>()) { // (!) 'DeclRelation::Alias' ensures we do not loose namespace aliases. return {ReferenceLoc{
Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -773,6 +773,14 @@ "6: targets = {a::b::S}\n" "7: targets = {a::b::S::type}, qualifier = 'struct S::'\n" "8: targets = {y}, decl\n"}, + {R"cpp( + void foo() { + $0^ten: // PRINT "HELLO WORLD!" + goto $1^ten; + } + )cpp", + "0: targets = {ten}, decl\n" + "1: targets = {ten}\n"}, // Simple templates. {R"cpp( template <class T> struct vector { using value_type = T; }; Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -643,7 +643,7 @@ return V.Refs; } -llvm::SmallVector<ReferenceLoc, 2> refInExpr(const Expr *E) { +llvm::SmallVector<ReferenceLoc, 2> refInStmt(const Stmt *S) { struct Visitor : ConstStmtVisitor<Visitor> { // FIXME: handle more complicated cases: more ObjC, designated initializers. llvm::SmallVector<ReferenceLoc, 2> Refs; @@ -722,10 +722,25 @@ /*IsDecl=*/false, std::move(Targets)}); } } + + void VisitGotoStmt(const GotoStmt *GS) { + llvm::SmallVector<const NamedDecl *, 1> Targets; + if (const auto *L = GS->getLabel()) + Targets.push_back(L); + Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), GS->getLabelLoc(), + /*IsDecl=*/false, std::move(Targets)}); + } + + void VisitLabelStmt(const LabelStmt *LS) { + Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), + LS->getIdentLoc(), + /*IsDecl=*/true, + {LS->getDecl()}}); + } }; Visitor V; - V.Visit(E); + V.Visit(S); return V.Refs; } @@ -837,8 +852,8 @@ return RecursiveASTVisitor::TraverseElaboratedTypeLoc(L); } - bool VisitExpr(Expr *E) { - visitNode(DynTypedNode::create(*E)); + bool VisitStmt(Stmt *S) { + visitNode(DynTypedNode::create(*S)); return true; } @@ -926,8 +941,8 @@ llvm::SmallVector<ReferenceLoc, 2> explicitReference(DynTypedNode N) { if (auto *D = N.get<Decl>()) return refInDecl(D); - if (auto *E = N.get<Expr>()) - return refInExpr(E); + if (auto *S = N.get<Stmt>()) + return refInStmt(S); if (auto *NNSL = N.get<NestedNameSpecifierLoc>()) { // (!) 'DeclRelation::Alias' ensures we do not loose namespace aliases. return {ReferenceLoc{
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits