[PATCH] D79701: [clangd] Add metrics for selection tree and recovery expressions.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 12 07:30:27 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG774acdfb8c46: [clangd] Add metrics for selection tree and recovery expressions. (authored by hokein).
Changed prior to commit:
https://reviews.llvm.org/D79701?vs=263382&id=263433#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79701/new/
https://reviews.llvm.org/D79701
Files:
clang-tools-extra/clangd/Selection.cpp
clang-tools-extra/clangd/unittests/SelectionTests.cpp
Index: clang-tools-extra/clangd/unittests/SelectionTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -9,6 +9,7 @@
#include "Selection.h"
#include "SourceCode.h"
#include "TestTU.h"
+#include "support/TestTracer.h"
#include "clang/AST/Decl.h"
#include "llvm/Support/Casting.h"
#include "gmock/gmock.h"
@@ -390,6 +391,7 @@
)cpp", "DeclRefExpr"} // DeclRefExpr to the "operator->" method.
};
for (const Case &C : Cases) {
+ trace::TestTracer Tracer;
Annotations Test(C.Code);
TestTU TU;
@@ -407,6 +409,7 @@
if (Test.ranges().empty()) {
// If no [[range]] is marked in the example, there should be no selection.
EXPECT_FALSE(T.commonAncestor()) << C.Code << "\n" << T;
+ EXPECT_THAT(Tracer.takeMetric("selection_recovery"), testing::IsEmpty());
} else {
// If there is an expected selection, common ancestor should exist
// with the appropriate node type.
@@ -422,6 +425,8 @@
// and no nodes outside it are selected.
EXPECT_TRUE(verifyCommonAncestor(T.root(), T.commonAncestor(), C.Code))
<< C.Code;
+ EXPECT_THAT(Tracer.takeMetric("selection_recovery"),
+ testing::ElementsAreArray({0}));
}
}
}
@@ -436,6 +441,20 @@
EXPECT_FALSE(D->isInjectedClassName());
}
+TEST(SelectionTree, Metrics) {
+ const char *Code = R"cpp(
+ // error-ok: testing behavior on recovery expression
+ int foo();
+ int foo(int, int);
+ int x = fo^o(42);
+ )cpp";
+ 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}));
+}
+
// FIXME: Doesn't select the binary operator node in
// #define FOO(X) X + 1
// int a, b = [[FOO(a)]];
Index: clang-tools-extra/clangd/Selection.cpp
===================================================================
--- clang-tools-extra/clangd/Selection.cpp
+++ clang-tools-extra/clangd/Selection.cpp
@@ -9,6 +9,7 @@
#include "Selection.h"
#include "SourceCode.h"
#include "support/Logger.h"
+#include "support/Trace.h"
#include "clang/AST/ASTTypeTraits.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
@@ -35,6 +36,21 @@
using Node = SelectionTree::Node;
using ast_type_traits::DynTypedNode;
+// Measure the fraction of selections that were enabled by recovery AST.
+void recordMetrics(const SelectionTree &S) {
+ static constexpr trace::Metric SelectionUsedRecovery(
+ "selection_recovery", trace::Metric::Distribution);
+ const auto *Common = S.commonAncestor();
+ for (const auto *N = Common; N; N = N->Parent) {
+ if (N->ASTNode.get<RecoveryExpr>()) {
+ SelectionUsedRecovery.record(1); // used recovery ast.
+ return;
+ }
+ }
+ if (Common)
+ SelectionUsedRecovery.record(0); // unused.
+}
+
// An IntervalSet maintains a set of disjoint subranges of an array.
//
// Initially, it contains the entire array.
@@ -774,6 +790,7 @@
.printToString(SM));
Nodes = SelectionVisitor::collect(AST, Tokens, PrintPolicy, Begin, End, FID);
Root = Nodes.empty() ? nullptr : &Nodes.front();
+ recordMetrics(*this);
dlog("Built selection tree\n{0}", *this);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79701.263433.patch
Type: text/x-patch
Size: 3431 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200512/dcd977f9/attachment.bin>
More information about the cfe-commits
mailing list