Skip to content

Commit d82dd75

Browse files
committed
ExprKind
1 parent 06d6710 commit d82dd75

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+777
-777
lines changed

CONTRIBUTING.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ a `.stdout` file with the generated code:
9393
// ./tests/ui/my_lint.stdout
9494

9595
if_chain! {
96-
if let Expr_::ExprArray(ref elements) = stmt.node;
96+
if let ExprKind::Array(ref elements) = stmt.node;
9797
if elements.len() == 1;
98-
if let Expr_::ExprLit(ref lit) = elements[0].node;
98+
if let ExprKind::Lit(ref lit) = elements[0].node;
9999
if let LitKind::Int(7, _) = lit.node;
100100
then {
101101
// report your lint here
@@ -179,7 +179,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
179179
```
180180

181181
The [`rustc_plugin::PluginRegistry`][plugin_registry] provides two methods to register lints: [register_early_lint_pass][reg_early_lint_pass] and [register_late_lint_pass][reg_late_lint_pass].
182-
Both take an object that implements an [`EarlyLintPass`][early_lint_pass] or [`LateLintPass`][late_lint_pass] respectively. This is done in every single lint.
182+
Both take an object that implements an [`EarlyLintPass`][early_lint_pass] or [`LateLintPass`][late_lint_pass] respectively. This is done in every single lint.
183183
It's worth noting that the majority of `clippy_lints/src/lib.rs` is autogenerated by `util/update_lints.py` and you don't have to add anything by hand. When you are writing your own lint, you can use that script to save you some time.
184184

185185
```rust

clippy_lints/src/approx_const.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl LintPass for Pass {
6363

6464
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass {
6565
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) {
66-
if let ExprLit(ref lit) = e.node {
66+
if let ExprKind::Lit(ref lit) = e.node {
6767
check_lit(cx, lit, e);
6868
}
6969
}

clippy_lints/src/arithmetic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Arithmetic {
5555
return;
5656
}
5757
match expr.node {
58-
hir::ExprBinary(ref op, ref l, ref r) => {
58+
hir::ExprKind::Binary(ref op, ref l, ref r) => {
5959
match op.node {
6060
hir::BiAnd
6161
| hir::BiOr
@@ -81,7 +81,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Arithmetic {
8181
self.span = Some(expr.span);
8282
}
8383
},
84-
hir::ExprUnary(hir::UnOp::UnNeg, ref arg) => {
84+
hir::ExprKind::Unary(hir::UnOp::UnNeg, ref arg) => {
8585
let ty = cx.tables.expr_ty(arg);
8686
if ty.is_integral() {
8787
span_lint(cx, INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected");

clippy_lints/src/assign_ops.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ impl LintPass for AssignOps {
7676
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssignOps {
7777
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr) {
7878
match expr.node {
79-
hir::ExprAssignOp(op, ref lhs, ref rhs) => {
79+
hir::ExprKind::AssignOp(op, ref lhs, ref rhs) => {
8080
span_lint_and_then(cx, ASSIGN_OPS, expr.span, "assign operation detected", |db| {
8181
let lhs = &sugg::Sugg::hir(cx, lhs, "..");
8282
let rhs = &sugg::Sugg::hir(cx, rhs, "..");
@@ -87,7 +87,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssignOps {
8787
format!("{} = {}", lhs, sugg::make_binop(higher::binop(op.node), lhs, rhs)),
8888
);
8989
});
90-
if let hir::ExprBinary(binop, ref l, ref r) = rhs.node {
90+
if let hir::ExprKind::Binary(binop, ref l, ref r) = rhs.node {
9191
if op.node == binop.node {
9292
let lint = |assignee: &hir::Expr, rhs_other: &hir::Expr| {
9393
span_lint_and_then(
@@ -131,8 +131,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssignOps {
131131
}
132132
}
133133
},
134-
hir::ExprAssign(ref assignee, ref e) => {
135-
if let hir::ExprBinary(op, ref l, ref r) = e.node {
134+
hir::ExprKind::Assign(ref assignee, ref e) => {
135+
if let hir::ExprKind::Binary(op, ref l, ref r) = e.node {
136136
#[allow(cyclomatic_complexity)]
137137
let lint = |assignee: &hir::Expr, rhs: &hir::Expr| {
138138
let ty = cx.tables.expr_ty(assignee);

clippy_lints/src/attrs.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,10 @@ fn is_relevant_block(tcx: TyCtxt, tables: &ty::TypeckTables, block: &Block) -> b
244244

245245
fn is_relevant_expr(tcx: TyCtxt, tables: &ty::TypeckTables, expr: &Expr) -> bool {
246246
match expr.node {
247-
ExprBlock(ref block, _) => is_relevant_block(tcx, tables, block),
248-
ExprRet(Some(ref e)) => is_relevant_expr(tcx, tables, e),
249-
ExprRet(None) | ExprBreak(_, None) => false,
250-
ExprCall(ref path_expr, _) => if let ExprPath(ref qpath) = path_expr.node {
247+
ExprKind::Block(ref block, _) => is_relevant_block(tcx, tables, block),
248+
ExprKind::Ret(Some(ref e)) => is_relevant_expr(tcx, tables, e),
249+
ExprKind::Ret(None) | ExprKind::Break(_, None) => false,
250+
ExprKind::Call(ref path_expr, _) => if let ExprKind::Path(ref qpath) = path_expr.node {
251251
if let Some(fun_id) = opt_def_id(tables.qpath_def(qpath, path_expr.hir_id)) {
252252
!match_def_path(tcx, fun_id, &paths::BEGIN_PANIC)
253253
} else {

clippy_lints/src/bit_mask.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ impl LintPass for BitMask {
109109

110110
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for BitMask {
111111
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) {
112-
if let ExprBinary(ref cmp, ref left, ref right) = e.node {
112+
if let ExprKind::Binary(ref cmp, ref left, ref right) = e.node {
113113
if cmp.node.is_comparison() {
114114
if let Some(cmp_opt) = fetch_int_literal(cx, right) {
115115
check_compare(cx, left, cmp.node, cmp_opt, e.span)
@@ -119,13 +119,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for BitMask {
119119
}
120120
}
121121
if_chain! {
122-
if let Expr_::ExprBinary(ref op, ref left, ref right) = e.node;
122+
if let ExprKind::Binary(ref op, ref left, ref right) = e.node;
123123
if BinOp_::BiEq == op.node;
124-
if let Expr_::ExprBinary(ref op1, ref left1, ref right1) = left.node;
124+
if let ExprKind::Binary(ref op1, ref left1, ref right1) = left.node;
125125
if BinOp_::BiBitAnd == op1.node;
126-
if let Expr_::ExprLit(ref lit) = right1.node;
126+
if let ExprKind::Lit(ref lit) = right1.node;
127127
if let LitKind::Int(n, _) = lit.node;
128-
if let Expr_::ExprLit(ref lit1) = right.node;
128+
if let ExprKind::Lit(ref lit1) = right.node;
129129
if let LitKind::Int(0, _) = lit1.node;
130130
if n.leading_zeros() == n.count_zeros();
131131
if n > u128::from(self.verbose_bit_mask_threshold);
@@ -157,7 +157,7 @@ fn invert_cmp(cmp: BinOp_) -> BinOp_ {
157157

158158

159159
fn check_compare(cx: &LateContext, bit_op: &Expr, cmp_op: BinOp_, cmp_value: u128, span: Span) {
160-
if let ExprBinary(ref op, ref left, ref right) = bit_op.node {
160+
if let ExprKind::Binary(ref op, ref left, ref right) = bit_op.node {
161161
if op.node != BiBitAnd && op.node != BiBitOr {
162162
return;
163163
}

clippy_lints/src/block_in_if_condition.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ struct ExVisitor<'a, 'tcx: 'a> {
5656

5757
impl<'a, 'tcx: 'a> Visitor<'tcx> for ExVisitor<'a, 'tcx> {
5858
fn visit_expr(&mut self, expr: &'tcx Expr) {
59-
if let ExprClosure(_, _, eid, _, _) = expr.node {
59+
if let ExprKind::Closure(_, _, eid, _, _) = expr.node {
6060
let body = self.cx.tcx.hir.body(eid);
6161
let ex = &body.value;
62-
if matches!(ex.node, ExprBlock(_, _)) {
62+
if matches!(ex.node, ExprKind::Block(_, _)) {
6363
self.found_block = Some(ex);
6464
return;
6565
}
@@ -77,8 +77,8 @@ const COMPLEX_BLOCK_MESSAGE: &str = "in an 'if' condition, avoid complex blocks
7777

7878
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for BlockInIfCondition {
7979
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
80-
if let ExprIf(ref check, ref then, _) = expr.node {
81-
if let ExprBlock(ref block, _) = check.node {
80+
if let ExprKind::If(ref check, ref then, _) = expr.node {
81+
if let ExprKind::Block(ref block, _) = check.node {
8282
if block.rules == DefaultBlock {
8383
if block.stmts.is_empty() {
8484
if let Some(ref ex) = block.expr {

clippy_lints/src/booleans.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ struct Hir2Qmm<'a, 'tcx: 'a, 'v> {
8686
impl<'a, 'tcx, 'v> Hir2Qmm<'a, 'tcx, 'v> {
8787
fn extract(&mut self, op: BinOp_, a: &[&'v Expr], mut v: Vec<Bool>) -> Result<Vec<Bool>, String> {
8888
for a in a {
89-
if let ExprBinary(binop, ref lhs, ref rhs) = a.node {
89+
if let ExprKind::Binary(binop, ref lhs, ref rhs) = a.node {
9090
if binop.node == op {
9191
v = self.extract(op, &[lhs, rhs], v)?;
9292
continue;
@@ -101,13 +101,13 @@ impl<'a, 'tcx, 'v> Hir2Qmm<'a, 'tcx, 'v> {
101101
// prevent folding of `cfg!` macros and the like
102102
if !in_macro(e.span) {
103103
match e.node {
104-
ExprUnary(UnNot, ref inner) => return Ok(Bool::Not(box self.run(inner)?)),
105-
ExprBinary(binop, ref lhs, ref rhs) => match binop.node {
104+
ExprKind::Unary(UnNot, ref inner) => return Ok(Bool::Not(box self.run(inner)?)),
105+
ExprKind::Binary(binop, ref lhs, ref rhs) => match binop.node {
106106
BiOr => return Ok(Bool::Or(self.extract(BiOr, &[lhs, rhs], Vec::new())?)),
107107
BiAnd => return Ok(Bool::And(self.extract(BiAnd, &[lhs, rhs], Vec::new())?)),
108108
_ => (),
109109
},
110-
ExprLit(ref lit) => match lit.node {
110+
ExprKind::Lit(ref lit) => match lit.node {
111111
LitKind::Bool(true) => return Ok(Bool::True),
112112
LitKind::Bool(false) => return Ok(Bool::False),
113113
_ => (),
@@ -121,8 +121,8 @@ impl<'a, 'tcx, 'v> Hir2Qmm<'a, 'tcx, 'v> {
121121
return Ok(Bool::Term(n as u8));
122122
}
123123
let negated = match e.node {
124-
ExprBinary(binop, ref lhs, ref rhs) => {
125-
124+
ExprKind::Binary(binop, ref lhs, ref rhs) => {
125+
126126
if !implements_ord(self.cx, lhs) {
127127
continue;
128128
}
@@ -133,7 +133,7 @@ impl<'a, 'tcx, 'v> Hir2Qmm<'a, 'tcx, 'v> {
133133
hir_id: DUMMY_HIR_ID,
134134
span: DUMMY_SP,
135135
attrs: ThinVec::new(),
136-
node: ExprBinary(dummy_spanned(op), lhs.clone(), rhs.clone()),
136+
node: ExprKind::Binary(dummy_spanned(op), lhs.clone(), rhs.clone()),
137137
}
138138
};
139139
match binop.node {
@@ -178,7 +178,7 @@ impl<'a, 'tcx, 'v> SuggestContext<'a, 'tcx, 'v> {
178178

179179
fn simplify_not(&self, expr: &Expr) -> Option<String> {
180180
match expr.node {
181-
ExprBinary(binop, ref lhs, ref rhs) => {
181+
ExprKind::Binary(binop, ref lhs, ref rhs) => {
182182

183183
if !implements_ord(self.cx, lhs) {
184184
return None;
@@ -194,7 +194,7 @@ impl<'a, 'tcx, 'v> SuggestContext<'a, 'tcx, 'v> {
194194
_ => None,
195195
}.and_then(|op| Some(format!("{}{}{}", self.snip(lhs)?, op, self.snip(rhs)?)))
196196
},
197-
ExprMethodCall(ref path, _, ref args) if args.len() == 1 => {
197+
ExprKind::MethodCall(ref path, _, ref args) if args.len() == 1 => {
198198
let type_of_receiver = self.cx.tables.expr_ty(&args[0]);
199199
if !match_type(self.cx, type_of_receiver, &paths::OPTION) &&
200200
!match_type(self.cx, type_of_receiver, &paths::RESULT) {
@@ -441,8 +441,8 @@ impl<'a, 'tcx> Visitor<'tcx> for NonminimalBoolVisitor<'a, 'tcx> {
441441
return;
442442
}
443443
match e.node {
444-
ExprBinary(binop, _, _) if binop.node == BiOr || binop.node == BiAnd => self.bool_expr(e),
445-
ExprUnary(UnNot, ref inner) => if self.cx.tables.node_types()[inner.hir_id].is_bool() {
444+
ExprKind::Binary(binop, _, _) if binop.node == BiOr || binop.node == BiAnd => self.bool_expr(e),
445+
ExprKind::Unary(UnNot, ref inner) => if self.cx.tables.node_types()[inner.hir_id].is_bool() {
446446
self.bool_expr(e);
447447
} else {
448448
walk_expr(self, e);

clippy_lints/src/bytecount.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@ impl LintPass for ByteCount {
3838
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ByteCount {
3939
fn check_expr(&mut self, cx: &LateContext, expr: &Expr) {
4040
if_chain! {
41-
if let ExprMethodCall(ref count, _, ref count_args) = expr.node;
41+
if let ExprKind::MethodCall(ref count, _, ref count_args) = expr.node;
4242
if count.ident.name == "count";
4343
if count_args.len() == 1;
44-
if let ExprMethodCall(ref filter, _, ref filter_args) = count_args[0].node;
44+
if let ExprKind::MethodCall(ref filter, _, ref filter_args) = count_args[0].node;
4545
if filter.ident.name == "filter";
4646
if filter_args.len() == 2;
47-
if let ExprClosure(_, _, body_id, _, _) = filter_args[1].node;
47+
if let ExprKind::Closure(_, _, body_id, _, _) = filter_args[1].node;
4848
then {
4949
let body = cx.tcx.hir.body(body_id);
5050
if_chain! {
5151
if body.arguments.len() == 1;
5252
if let Some(argname) = get_pat_name(&body.arguments[0].pat);
53-
if let ExprBinary(ref op, ref l, ref r) = body.value.node;
53+
if let ExprKind::Binary(ref op, ref l, ref r) = body.value.node;
5454
if op.node == BiEq;
5555
if match_type(cx,
5656
walk_ptrs_ty(cx.tables.expr_ty(&filter_args[0])),
@@ -66,7 +66,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ByteCount {
6666
if ty::TyUint(UintTy::U8) != walk_ptrs_ty(cx.tables.expr_ty(needle)).sty {
6767
return;
6868
}
69-
let haystack = if let ExprMethodCall(ref path, _, ref args) =
69+
let haystack = if let ExprKind::MethodCall(ref path, _, ref args) =
7070
filter_args[0].node {
7171
let p = path.ident.name;
7272
if (p == "iter" || p == "iter_mut") && args.len() == 1 {
@@ -98,13 +98,13 @@ fn check_arg(name: Name, arg: Name, needle: &Expr) -> bool {
9898

9999
fn get_path_name(expr: &Expr) -> Option<Name> {
100100
match expr.node {
101-
ExprBox(ref e) | ExprAddrOf(_, ref e) | ExprUnary(UnOp::UnDeref, ref e) => get_path_name(e),
102-
ExprBlock(ref b, _) => if b.stmts.is_empty() {
101+
ExprKind::Box(ref e) | ExprKind::AddrOf(_, ref e) | ExprKind::Unary(UnOp::UnDeref, ref e) => get_path_name(e),
102+
ExprKind::Block(ref b, _) => if b.stmts.is_empty() {
103103
b.expr.as_ref().and_then(|p| get_path_name(p))
104104
} else {
105105
None
106106
},
107-
ExprPath(ref qpath) => single_segment_path(qpath).map(|ps| ps.ident.name),
107+
ExprKind::Path(ref qpath) => single_segment_path(qpath).map(|ps| ps.ident.name),
108108
_ => None,
109109
}
110110
}

clippy_lints/src/consts.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -211,25 +211,25 @@ impl<'c, 'cc> ConstEvalLateContext<'c, 'cc> {
211211
/// simple constant folding: Insert an expression, get a constant or none.
212212
pub fn expr(&mut self, e: &Expr) -> Option<Constant> {
213213
match e.node {
214-
ExprPath(ref qpath) => self.fetch_path(qpath, e.hir_id),
215-
ExprBlock(ref block, _) => self.block(block),
216-
ExprIf(ref cond, ref then, ref otherwise) => self.ifthenelse(cond, then, otherwise),
217-
ExprLit(ref lit) => Some(lit_to_constant(&lit.node, self.tables.expr_ty(e))),
218-
ExprArray(ref vec) => self.multi(vec).map(Constant::Vec),
219-
ExprTup(ref tup) => self.multi(tup).map(Constant::Tuple),
220-
ExprRepeat(ref value, _) => {
214+
ExprKind::Path(ref qpath) => self.fetch_path(qpath, e.hir_id),
215+
ExprKind::Block(ref block, _) => self.block(block),
216+
ExprKind::If(ref cond, ref then, ref otherwise) => self.ifthenelse(cond, then, otherwise),
217+
ExprKind::Lit(ref lit) => Some(lit_to_constant(&lit.node, self.tables.expr_ty(e))),
218+
ExprKind::Array(ref vec) => self.multi(vec).map(Constant::Vec),
219+
ExprKind::Tup(ref tup) => self.multi(tup).map(Constant::Tuple),
220+
ExprKind::Repeat(ref value, _) => {
221221
let n = match self.tables.expr_ty(e).sty {
222222
ty::TyArray(_, n) => n.assert_usize(self.tcx).expect("array length"),
223223
_ => span_bug!(e.span, "typeck error"),
224224
};
225225
self.expr(value).map(|v| Constant::Repeat(Box::new(v), n as u64))
226226
},
227-
ExprUnary(op, ref operand) => self.expr(operand).and_then(|o| match op {
227+
ExprKind::Unary(op, ref operand) => self.expr(operand).and_then(|o| match op {
228228
UnNot => self.constant_not(&o, self.tables.expr_ty(e)),
229229
UnNeg => self.constant_negate(&o, self.tables.expr_ty(e)),
230230
UnDeref => Some(o),
231231
}),
232-
ExprBinary(op, ref left, ref right) => self.binop(op, left, right),
232+
ExprKind::Binary(op, ref left, ref right) => self.binop(op, left, right),
233233
// TODO: add other expressions
234234
_ => None,
235235
}
@@ -279,7 +279,7 @@ impl<'c, 'cc> ConstEvalLateContext<'c, 'cc> {
279279
.collect::<Option<_>>()
280280
}
281281

282-
/// lookup a possibly constant expression from a ExprPath
282+
/// lookup a possibly constant expression from a ExprKind::Path
283283
fn fetch_path(&mut self, qpath: &QPath, id: HirId) -> Option<Constant> {
284284
let def = self.tables.qpath_def(qpath, id);
285285
match def {

clippy_lints/src/copies.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CopyAndPaste {
115115
if !in_macro(expr.span) {
116116
// skip ifs directly in else, it will be checked in the parent if
117117
if let Some(&Expr {
118-
node: ExprIf(_, _, Some(ref else_expr)),
118+
node: ExprKind::If(_, _, Some(ref else_expr)),
119119
..
120120
}) = get_parent_expr(cx, expr)
121121
{
@@ -172,7 +172,7 @@ fn lint_same_cond(cx: &LateContext, conds: &[&Expr]) {
172172

173173
/// Implementation of `MATCH_SAME_ARMS`.
174174
fn lint_match_arms(cx: &LateContext, expr: &Expr) {
175-
if let ExprMatch(_, ref arms, MatchSource::Normal) = expr.node {
175+
if let ExprKind::Match(_, ref arms, MatchSource::Normal) = expr.node {
176176
let hash = |&(_, arm): &(usize, &Arm)| -> u64 {
177177
let mut h = SpanlessHash::new(cx, cx.tables);
178178
h.hash_expr(&arm.body);
@@ -236,12 +236,12 @@ fn if_sequence(mut expr: &Expr) -> (SmallVector<&Expr>, SmallVector<&Block>) {
236236
let mut conds = SmallVector::new();
237237
let mut blocks: SmallVector<&Block> = SmallVector::new();
238238

239-
while let ExprIf(ref cond, ref then_expr, ref else_expr) = expr.node {
239+
while let ExprKind::If(ref cond, ref then_expr, ref else_expr) = expr.node {
240240
conds.push(&**cond);
241-
if let ExprBlock(ref block, _) = then_expr.node {
241+
if let ExprKind::Block(ref block, _) = then_expr.node {
242242
blocks.push(block);
243243
} else {
244-
panic!("ExprIf node is not an ExprBlock");
244+
panic!("ExprKind::If node is not an ExprKind::Block");
245245
}
246246

247247
if let Some(ref else_expr) = *else_expr {
@@ -253,7 +253,7 @@ fn if_sequence(mut expr: &Expr) -> (SmallVector<&Expr>, SmallVector<&Block>) {
253253

254254
// final `else {..}`
255255
if !blocks.is_empty() {
256-
if let ExprBlock(ref block, _) = expr.node {
256+
if let ExprKind::Block(ref block, _) = expr.node {
257257
blocks.push(&**block);
258258
}
259259
}

0 commit comments

Comments
 (0)