-
Notifications
You must be signed in to change notification settings - Fork 15.5k
[NFC][LLVM] Code cleanup in llvm-xray
#164080
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Member
|
@llvm/pr-subscribers-xray Author: Rahul Joshi (jurahul) Changes
Full diff: https://github.com/llvm/llvm-project/pull/164080.diff 15 Files Affected:
diff --git a/llvm/tools/llvm-xray/func-id-helper.h b/llvm/tools/llvm-xray/func-id-helper.h
index d99fb7c1cfb0c..d1a66282bab0b 100644
--- a/llvm/tools/llvm-xray/func-id-helper.h
+++ b/llvm/tools/llvm-xray/func-id-helper.h
@@ -17,8 +17,7 @@
#include "llvm/DebugInfo/Symbolize/Symbolize.h"
#include <unordered_map>
-namespace llvm {
-namespace xray {
+namespace llvm::xray {
// This class consolidates common operations related to Function IDs.
class FuncIdConversionHelper {
@@ -45,7 +44,6 @@ class FuncIdConversionHelper {
std::string FileLineAndColumn(int32_t FuncId) const;
};
-} // namespace xray
-} // namespace llvm
+} // namespace llvm::xray
#endif // LLVM_TOOLS_LLVM_XRAY_FUNC_ID_HELPER_H
diff --git a/llvm/tools/llvm-xray/trie-node.h b/llvm/tools/llvm-xray/trie-node.h
index 7bff81473b5df..b42b0293620dd 100644
--- a/llvm/tools/llvm-xray/trie-node.h
+++ b/llvm/tools/llvm-xray/trie-node.h
@@ -21,6 +21,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
+namespace llvm {
/// A type to represent a trie of invocations. It is useful to construct a
/// graph of these nodes from reading an XRay trace, such that each function
/// call can be placed in a larger context.
@@ -87,5 +88,6 @@ mergeTrieNodes(const TrieNode<T> &Left, const TrieNode<T> &Right,
return Node;
}
+} // namespace llvm
#endif // LLVM_TOOLS_LLVM_XRAY_STACK_TRIE_H
diff --git a/llvm/tools/llvm-xray/xray-account.cpp b/llvm/tools/llvm-xray/xray-account.cpp
index 24a3552cfb91e..5168aa1c88bc6 100644
--- a/llvm/tools/llvm-xray/xray-account.cpp
+++ b/llvm/tools/llvm-xray/xray-account.cpp
@@ -118,18 +118,16 @@ static cl::opt<std::string>
static cl::alias AccountInstrMap2("m", cl::aliasopt(AccountInstrMap),
cl::desc("Alias for -instr_map"));
-namespace {
-
-template <class T, class U> void setMinMax(std::pair<T, T> &MM, U &&V) {
+template <class T, class U> static void setMinMax(std::pair<T, T> &MM, U &&V) {
if (MM.first == 0 || MM.second == 0)
MM = std::make_pair(std::forward<U>(V), std::forward<U>(V));
else
MM = std::make_pair(std::min(MM.first, V), std::max(MM.second, V));
}
-template <class T> T diff(T L, T R) { return std::max(L, R) - std::min(L, R); }
-
-} // namespace
+template <class T> static T diff(T L, T R) {
+ return std::max(L, R) - std::min(L, R);
+}
using RecursionStatus = LatencyAccountant::FunctionStack::RecursionStatus;
RecursionStatus &RecursionStatus::operator++() {
@@ -143,6 +141,7 @@ RecursionStatus &RecursionStatus::operator++() {
true); // Storage |= INT_MIN
return *this;
}
+
RecursionStatus &RecursionStatus::operator--() {
auto Depth = Bitfield::get<RecursionStatus::Depth>(Storage);
assert(Depth > 0);
@@ -153,6 +152,7 @@ RecursionStatus &RecursionStatus::operator--() {
Bitfield::set<RecursionStatus::IsRecursive>(Storage, false); // Storage = 0
return *this;
}
+
bool RecursionStatus::isRecursive() const {
return Bitfield::get<RecursionStatus::IsRecursive>(Storage); // Storage s< 0
}
@@ -270,8 +270,9 @@ struct ResultRow {
std::string DebugInfo;
std::string Function;
};
+} // namespace
-ResultRow getStats(MutableArrayRef<uint64_t> Timings) {
+static ResultRow getStats(MutableArrayRef<uint64_t> Timings) {
assert(!Timings.empty());
ResultRow R;
R.Sum = std::accumulate(Timings.begin(), Timings.end(), 0.0);
@@ -296,8 +297,6 @@ ResultRow getStats(MutableArrayRef<uint64_t> Timings) {
return R;
}
-} // namespace
-
using TupleType = std::tuple<int32_t, uint64_t, ResultRow>;
template <typename F>
@@ -417,11 +416,8 @@ void LatencyAccountant::exportStatsAsCSV(raw_ostream &OS,
});
}
-using namespace llvm::xray;
-
-namespace llvm {
-template <> struct format_provider<llvm::xray::RecordTypes> {
- static void format(const llvm::xray::RecordTypes &T, raw_ostream &Stream,
+template <> struct llvm::format_provider<RecordTypes> {
+ static void format(const RecordTypes &T, raw_ostream &Stream,
StringRef Style) {
switch (T) {
case RecordTypes::ENTER:
@@ -445,7 +441,6 @@ template <> struct format_provider<llvm::xray::RecordTypes> {
}
}
};
-} // namespace llvm
static CommandRegistration Unused(&Account, []() -> Error {
InstrumentationMap Map;
@@ -468,10 +463,10 @@ static CommandRegistration Unused(&Account, []() -> Error {
const auto &FunctionAddresses = Map.getFunctionAddresses();
symbolize::LLVMSymbolizer Symbolizer;
- llvm::xray::FuncIdConversionHelper FuncIdHelper(AccountInstrMap, Symbolizer,
- FunctionAddresses);
- xray::LatencyAccountant FCA(FuncIdHelper, AccountRecursiveCallsOnly,
- AccountDeduceSiblingCalls);
+ FuncIdConversionHelper FuncIdHelper(AccountInstrMap, Symbolizer,
+ FunctionAddresses);
+ LatencyAccountant FCA(FuncIdHelper, AccountRecursiveCallsOnly,
+ AccountDeduceSiblingCalls);
auto TraceOrErr = loadTraceFile(AccountInput);
if (!TraceOrErr)
return joinErrors(
diff --git a/llvm/tools/llvm-xray/xray-account.h b/llvm/tools/llvm-xray/xray-account.h
index 0f24f93b9fd10..c4e20731af083 100644
--- a/llvm/tools/llvm-xray/xray-account.h
+++ b/llvm/tools/llvm-xray/xray-account.h
@@ -21,8 +21,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/XRay/XRayRecord.h"
-namespace llvm {
-namespace xray {
+namespace llvm::xray {
class LatencyAccountant {
public:
@@ -107,7 +106,6 @@ class LatencyAccountant {
template <class F> void exportStats(const XRayFileHeader &Header, F fn) const;
};
-} // namespace xray
-} // namespace llvm
+} // namespace llvm::xray
#endif // LLVM_TOOLS_LLVM_XRAY_XRAY_ACCOUNT_H
diff --git a/llvm/tools/llvm-xray/xray-color-helper.h b/llvm/tools/llvm-xray/xray-color-helper.h
index 3141e90cc893c..ae95c921769f0 100644
--- a/llvm/tools/llvm-xray/xray-color-helper.h
+++ b/llvm/tools/llvm-xray/xray-color-helper.h
@@ -16,8 +16,7 @@
#include "llvm/ADT/ArrayRef.h"
#include <tuple>
-namespace llvm {
-namespace xray {
+namespace llvm::xray {
/// The color helper class it a healper class which allows you to easily get a
/// color in a gradient. This is used to color-code edges in XRay-Graph tools.
@@ -82,6 +81,6 @@ class ColorHelper {
// Convert a tuple to a string
static std::string getColorString(std::tuple<uint8_t, uint8_t, uint8_t> t);
};
-} // namespace xray
-} // namespace llvm
+} // namespace llvm::xray
+
#endif
diff --git a/llvm/tools/llvm-xray/xray-converter.cpp b/llvm/tools/llvm-xray/xray-converter.cpp
index 34832ebda0224..0f45fef670014 100644
--- a/llvm/tools/llvm-xray/xray-converter.cpp
+++ b/llvm/tools/llvm-xray/xray-converter.cpp
@@ -176,13 +176,14 @@ struct StackIdData {
// unique ID.
SmallVector<TrieNode<StackIdData> *, 4> siblings;
};
+} // namespace
using StackTrieNode = TrieNode<StackIdData>;
// A helper function to find the sibling nodes for an encountered function in a
// thread of execution. Relies on the invariant that each time a new node is
// traversed in a thread, sibling bidirectional pointers are maintained.
-SmallVector<StackTrieNode *, 4>
+static SmallVector<StackTrieNode *, 4>
findSiblings(StackTrieNode *parent, int32_t FnId, uint32_t TId,
const DenseMap<uint32_t, SmallVector<StackTrieNode *, 4>>
&StackRootsByThreadId) {
@@ -213,7 +214,7 @@ findSiblings(StackTrieNode *parent, int32_t FnId, uint32_t TId,
// StackTrie representing the function call stack. If no node exists, creates
// the node. Assigns unique IDs to stacks newly encountered among all threads
// and keeps sibling links up to when creating new nodes.
-StackTrieNode *findOrCreateStackNode(
+static StackTrieNode *findOrCreateStackNode(
StackTrieNode *Parent, int32_t FuncId, uint32_t TId,
DenseMap<uint32_t, SmallVector<StackTrieNode *, 4>> &StackRootsByThreadId,
DenseMap<unsigned, StackTrieNode *> &StacksByStackId, unsigned *id_counter,
@@ -244,12 +245,13 @@ StackTrieNode *findOrCreateStackNode(
return CurrentStack;
}
-void writeTraceViewerRecord(uint16_t Version, raw_ostream &OS, int32_t FuncId,
- uint32_t TId, uint32_t PId, bool Symbolize,
- const FuncIdConversionHelper &FuncIdHelper,
- double EventTimestampUs,
- const StackTrieNode &StackCursor,
- StringRef FunctionPhenotype) {
+static void writeTraceViewerRecord(uint16_t Version, raw_ostream &OS,
+ int32_t FuncId, uint32_t TId, uint32_t PId,
+ bool Symbolize,
+ const FuncIdConversionHelper &FuncIdHelper,
+ double EventTimestampUs,
+ const StackTrieNode &StackCursor,
+ StringRef FunctionPhenotype) {
OS << " ";
if (Version >= 3) {
OS << llvm::formatv(
@@ -269,8 +271,6 @@ void writeTraceViewerRecord(uint16_t Version, raw_ostream &OS, int32_t FuncId,
}
}
-} // namespace
-
void TraceConverter::exportAsChromeTraceEventFormat(const Trace &Records,
raw_ostream &OS) {
const auto &FH = Records.getFileHeader();
@@ -364,9 +364,6 @@ void TraceConverter::exportAsChromeTraceEventFormat(const Trace &Records,
OS << "}\n"; // Close the JSON entry.
}
-namespace llvm {
-namespace xray {
-
static CommandRegistration Unused(&Convert, []() -> Error {
// FIXME: Support conversion to BINARY when upgrading XRay trace versions.
InstrumentationMap Map;
@@ -386,9 +383,9 @@ static CommandRegistration Unused(&Convert, []() -> Error {
if (Demangle.getPosition() < NoDemangle.getPosition())
SymbolizerOpts.Demangle = false;
symbolize::LLVMSymbolizer Symbolizer(SymbolizerOpts);
- llvm::xray::FuncIdConversionHelper FuncIdHelper(ConvertInstrMap, Symbolizer,
- FunctionAddresses);
- llvm::xray::TraceConverter TC(FuncIdHelper, ConvertSymbolize);
+ FuncIdConversionHelper FuncIdHelper(ConvertInstrMap, Symbolizer,
+ FunctionAddresses);
+ TraceConverter TC(FuncIdHelper, ConvertSymbolize);
std::error_code EC;
raw_fd_ostream OS(ConvertOutput, EC,
ConvertOutputFormat == ConvertFormats::BINARY
@@ -420,6 +417,3 @@ static CommandRegistration Unused(&Convert, []() -> Error {
}
return Error::success();
});
-
-} // namespace xray
-} // namespace llvm
diff --git a/llvm/tools/llvm-xray/xray-converter.h b/llvm/tools/llvm-xray/xray-converter.h
index db6d2b1614ee2..0f8efa4626081 100644
--- a/llvm/tools/llvm-xray/xray-converter.h
+++ b/llvm/tools/llvm-xray/xray-converter.h
@@ -17,8 +17,7 @@
#include "llvm/XRay/Trace.h"
#include "llvm/XRay/XRayRecord.h"
-namespace llvm {
-namespace xray {
+namespace llvm::xray {
class TraceConverter {
FuncIdConversionHelper &FuncIdHelper;
@@ -37,7 +36,6 @@ class TraceConverter {
void exportAsChromeTraceEventFormat(const Trace &Records, raw_ostream &OS);
};
-} // namespace xray
-} // namespace llvm
+} // namespace llvm::xray
#endif // LLVM_TOOLS_LLVM_XRAY_XRAY_CONVERTER_H
diff --git a/llvm/tools/llvm-xray/xray-extract.cpp b/llvm/tools/llvm-xray/xray-extract.cpp
index 52767a00f6152..70fe0111b0c40 100644
--- a/llvm/tools/llvm-xray/xray-extract.cpp
+++ b/llvm/tools/llvm-xray/xray-extract.cpp
@@ -52,10 +52,8 @@ static cl::opt<bool> NoDemangle("no-demangle",
cl::desc("don't demangle symbols"),
cl::sub(Extract));
-namespace {
-
-void exportAsYAML(const InstrumentationMap &Map, raw_ostream &OS,
- FuncIdConversionHelper &FH) {
+static void exportAsYAML(const InstrumentationMap &Map, raw_ostream &OS,
+ FuncIdConversionHelper &FH) {
// First we translate the sleds into the YAMLXRaySledEntry objects in a deque.
std::vector<YAMLXRaySledEntry> YAMLSleds;
auto Sleds = Map.sleds();
@@ -72,8 +70,6 @@ void exportAsYAML(const InstrumentationMap &Map, raw_ostream &OS,
Out << YAMLSleds;
}
-} // namespace
-
static CommandRegistration Unused(&Extract, []() -> Error {
auto InstrumentationMapOrError = loadInstrumentationMap(ExtractInput);
if (!InstrumentationMapOrError)
@@ -94,8 +90,8 @@ static CommandRegistration Unused(&Extract, []() -> Error {
if (Demangle.getPosition() < NoDemangle.getPosition())
opts.Demangle = false;
symbolize::LLVMSymbolizer Symbolizer(opts);
- llvm::xray::FuncIdConversionHelper FuncIdHelper(ExtractInput, Symbolizer,
- FunctionAddresses);
+ FuncIdConversionHelper FuncIdHelper(ExtractInput, Symbolizer,
+ FunctionAddresses);
exportAsYAML(*InstrumentationMapOrError, OS, FuncIdHelper);
return Error::success();
});
diff --git a/llvm/tools/llvm-xray/xray-graph-diff.cpp b/llvm/tools/llvm-xray/xray-graph-diff.cpp
index b5c63ab0a9183..6679909121fab 100644
--- a/llvm/tools/llvm-xray/xray-graph-diff.cpp
+++ b/llvm/tools/llvm-xray/xray-graph-diff.cpp
@@ -236,6 +236,7 @@ Expected<GraphDiffRenderer> GraphDiffRenderer::Factory::getGraphDiffRenderer() {
return R;
}
+
// Returns the Relative change With respect to LeftStat between LeftStat
// and RightStat.
static double statRelDiff(const GraphDiffRenderer::TimeStat &LeftStat,
@@ -363,9 +364,8 @@ void GraphDiffRenderer::exportGraphAsDOT(raw_ostream &OS, StatType EdgeLabel,
StringMap<int32_t> VertexNo;
int i = 0;
- for (const auto &V : G.vertices()) {
+ for (const auto &V : G.vertices())
VertexNo[V.first] = i++;
- }
ColorHelper H(ColorHelper::DivergingScheme::PiYG);
diff --git a/llvm/tools/llvm-xray/xray-graph-diff.h b/llvm/tools/llvm-xray/xray-graph-diff.h
index c2b2a938bfbc6..709f1bf1339d9 100644
--- a/llvm/tools/llvm-xray/xray-graph-diff.h
+++ b/llvm/tools/llvm-xray/xray-graph-diff.h
@@ -17,8 +17,7 @@
#include "xray-graph.h"
#include "llvm/XRay/Graph.h"
-namespace llvm {
-namespace xray {
+namespace llvm::xray {
// This class creates a graph representing the difference between two
// xray-graphs And allows you to print it to a dot file, with optional color
@@ -66,7 +65,6 @@ class GraphDiffRenderer {
const GraphT &getGraph() { return G; }
};
-} // namespace xray
-} // namespace llvm
+} // namespace llvm::xray
#endif
diff --git a/llvm/tools/llvm-xray/xray-graph.cpp b/llvm/tools/llvm-xray/xray-graph.cpp
index a97aacfd67b7a..71d30295e4dbf 100644
--- a/llvm/tools/llvm-xray/xray-graph.cpp
+++ b/llvm/tools/llvm-xray/xray-graph.cpp
@@ -153,7 +153,9 @@ static cl::opt<GraphRenderer::StatType> GraphVertexColorType(
static cl::alias GraphVertexColorType2("b", cl::aliasopt(GraphVertexColorType),
cl::desc("Alias for -edge-label"));
-template <class T> T diff(T L, T R) { return std::max(L, R) - std::min(L, R); }
+template <class T> static T diff(T L, T R) {
+ return std::max(L, R) - std::min(L, R);
+}
// Updates the statistics for a GraphRenderer::TimeStat
static void updateStat(GraphRenderer::TimeStat &S, int64_t L) {
@@ -459,10 +461,9 @@ Expected<GraphRenderer> GraphRenderer::Factory::getGraphRenderer() {
symbolize::LLVMSymbolizer Symbolizer;
const auto &Header = Trace.getFileHeader();
- llvm::xray::FuncIdConversionHelper FuncIdHelper(InstrMap, Symbolizer,
- FunctionAddresses);
+ FuncIdConversionHelper FuncIdHelper(InstrMap, Symbolizer, FunctionAddresses);
- xray::GraphRenderer GR(FuncIdHelper, DeduceSiblingCalls);
+ GraphRenderer GR(FuncIdHelper, DeduceSiblingCalls);
for (const auto &Record : Trace) {
auto E = GR.accountRecord(Record);
if (!E)
diff --git a/llvm/tools/llvm-xray/xray-graph.h b/llvm/tools/llvm-xray/xray-graph.h
index 23372d40f05ee..fd9644908426f 100644
--- a/llvm/tools/llvm-xray/xray-graph.h
+++ b/llvm/tools/llvm-xray/xray-graph.h
@@ -28,8 +28,7 @@
#include "llvm/XRay/Trace.h"
#include "llvm/XRay/XRayRecord.h"
-namespace llvm {
-namespace xray {
+namespace llvm::xray {
/// A class encapsulating the logic related to analyzing XRay traces, producting
/// Graphs from them and then exporting those graphs for review.
@@ -225,7 +224,6 @@ inline GraphRenderer::TimeStat operator/(const GraphRenderer::TimeStat &A,
A.Pct90 / B.Pct90, A.Pct99 / B.Pct99, A.Max / B.Max,
A.Sum / B.Sum};
}
-} // namespace xray
-} // namespace llvm
+} // namespace llvm::xray
#endif // XRAY_GRAPH_H
diff --git a/llvm/tools/llvm-xray/xray-registry.cpp b/llvm/tools/llvm-xray/xray-registry.cpp
index 34ac07ebe45c1..ae18f8d6f57c1 100644
--- a/llvm/tools/llvm-xray/xray-registry.cpp
+++ b/llvm/tools/llvm-xray/xray-registry.cpp
@@ -13,8 +13,8 @@
#include <unordered_map>
-namespace llvm {
-namespace xray {
+using namespace llvm;
+using namespace xray;
using HandlerType = std::function<Error()>;
@@ -31,12 +31,9 @@ CommandRegistration::CommandRegistration(cl::SubCommand *SC,
getCommands()[SC] = Command;
}
-HandlerType dispatch(cl::SubCommand *SC) {
+HandlerType xray::dispatch(cl::SubCommand *SC) {
auto It = getCommands().find(SC);
assert(It != getCommands().end() &&
"Attempting to dispatch on un-registered SubCommand.");
return It->second;
}
-
-} // namespace xray
-} // namespace llvm
diff --git a/llvm/tools/llvm-xray/xray-registry.h b/llvm/tools/llvm-xray/xray-registry.h
index d6fae78ea53cc..3921a423c8fad 100644
--- a/llvm/tools/llvm-xray/xray-registry.h
+++ b/llvm/tools/llvm-xray/xray-registry.h
@@ -15,8 +15,7 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Error.h"
-namespace llvm {
-namespace xray {
+namespace llvm::xray {
// Use |CommandRegistration| as a global initialiser that registers a function
// and associates it with |SC|. This requires that a command has not been
@@ -34,7 +33,6 @@ struct CommandRegistration {
// Requires that |SC| is not null and has an associated function to it.
std::function<Error()> dispatch(cl::SubCommand *SC);
-} // namespace xray
-} // namespace llvm
+} // namespace llvm::xray
#endif // TOOLS_LLVM_XRAY_XRAY_REGISTRY_H
diff --git a/llvm/tools/llvm-xray/xray-stacks.cpp b/llvm/tools/llvm-xray/xray-stacks.cpp
index b11d732a4fcc0..8101cad28ca1c 100644
--- a/llvm/tools/llvm-xray/xray-stacks.cpp
+++ b/llvm/tools/llvm-xray/xray-stacks.cpp
@@ -107,6 +107,8 @@ static cl::opt<AggregationType> RequestedAggregation(
"of all callees.")),
cl::sub(Stack), cl::init(AggregationType::TOTAL_TIME));
+namespace {
+
/// A helper struct to work with formatv and XRayRecords. Makes it easier to
/// use instrumentation map names or addresses in formatted output.
struct format_xray_record : public FormatAdapter<XRayRecord> {
@@ -252,10 +254,9 @@ struct format_xray_record : public FormatAdapter<XRayRecord> {
/// maintain an index of unique functions, and provide a means of iterating
/// through all the instrumented call stacks which we know about.
-namespace {
struct StackDuration {
- llvm::SmallVector<int64_t, 4> TerminalDurations;
- llvm::SmallVector<int64_t, 4> IntermediateDurations;
+ SmallVector<int64_t, 4> TerminalDurations;
+ SmallVector<int64_t, 4> IntermediateDurations;
};
} // namespace
@@ -310,6 +311,7 @@ std::size_t GetValueForStack(const StackTrieNode *Node) {
return 0;
}
+namespace {
class StackTrie {
// Avoid the magic number of 4 propagated through the code with an alias.
// We use this SmallVector to track the root nodes in a call graph.
@@ -649,6 +651,7 @@ class StackTrie {
OS << "\n";
}
};
+} // namespace
static std::string CreateErrorMessage(StackTrie::AccountRecordStatus Error,
const XRayRecord &Record,
|
nikic
approved these changes
Oct 18, 2025
Lukacma
pushed a commit
to Lukacma/llvm-project
that referenced
this pull request
Oct 29, 2025
- Use nested namespace definitions in header files. - Mark file local function static and enclods file local structs in anonymous namespace. - Drop some unnecessary namespace qualifiers.
aokblast
pushed a commit
to aokblast/llvm-project
that referenced
this pull request
Oct 30, 2025
- Use nested namespace definitions in header files. - Mark file local function static and enclods file local structs in anonymous namespace. - Drop some unnecessary namespace qualifiers.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.