diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp --- a/clang-tools-extra/clangd/Selection.cpp +++ b/clang-tools-extra/clangd/Selection.cpp @@ -37,17 +37,30 @@ using Node = SelectionTree::Node; using ast_type_traits::DynTypedNode; +std::string getLanguage(const clang::LangOptions &Lang) { + if (Lang.C99 || Lang.C11 || Lang.C17 || Lang.C2x) + return "C"; + if (Lang.ObjC) + return "ObjC"; + if (Lang.CPlusPlus) + return "C++"; + return "Others"; // others we don't care. +} + // Measure the fraction of selections that were enabled by recovery AST. -void recordMetrics(const SelectionTree &S) { +void recordMetrics(const SelectionTree &S, const ASTContext &AST) { static constexpr trace::Metric SelectionUsedRecovery( "selection_recovery", trace::Metric::Distribution); static constexpr trace::Metric RecoveryType("selection_recovery_type", trace::Metric::Distribution); + static constexpr trace::Metric RecoveryAvailable( + "selection_recovery_available", trace::Metric::Counter, "languages"); const auto *Common = S.commonAncestor(); for (const auto *N = Common; N; N = N->Parent) { if (const auto *RE = N->ASTNode.get()) { SelectionUsedRecovery.record(1); // used recovery ast. RecoveryType.record(RE->isTypeDependent() ? 0 : 1); + RecoveryAvailable.record(1, getLanguage(AST.getLangOpts())); return; } } @@ -834,7 +847,7 @@ .printToString(SM)); Nodes = SelectionVisitor::collect(AST, Tokens, PrintPolicy, Begin, End, FID); Root = Nodes.empty() ? nullptr : &Nodes.front(); - recordMetrics(*this); + recordMetrics(*this, AST); dlog("Built selection tree\n{0}", *this); } diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -18,6 +18,7 @@ namespace clang { namespace clangd { namespace { +using ::testing::ElementsAreArray; using ::testing::UnorderedElementsAreArray; // Create a selection tree corresponding to a point or pair of points. @@ -469,7 +470,7 @@ EXPECT_TRUE(verifyCommonAncestor(T.root(), T.commonAncestor(), C.Code)) << C.Code; EXPECT_THAT(Tracer.takeMetric("selection_recovery"), - testing::ElementsAreArray({0})); + ElementsAreArray({0})); } } } @@ -494,10 +495,11 @@ auto AST = TestTU::withCode(Annotations(Code).code()).build(); trace::TestTracer Tracer; auto T = makeSelectionTree(Code, AST); - EXPECT_THAT(Tracer.takeMetric("selection_recovery"), - testing::ElementsAreArray({1})); + EXPECT_THAT(Tracer.takeMetric("selection_recovery"), ElementsAreArray({1})); EXPECT_THAT(Tracer.takeMetric("selection_recovery_type"), - testing::ElementsAreArray({1})); + ElementsAreArray({1})); + EXPECT_THAT(Tracer.takeMetric("selection_recovery_available", "C++"), + ElementsAreArray({1})); } // FIXME: Doesn't select the binary operator node in