Stop allocating view_items with @
This commit is contained in:
parent
63f7857697
commit
a69eb95233
@ -12,7 +12,7 @@
|
||||
use std::option;
|
||||
use syntax::{ast, fold, attr};
|
||||
|
||||
type in_cfg_pred = @fn(attrs: ~[ast::attribute]) -> bool;
|
||||
type in_cfg_pred = @fn(attrs: &[ast::attribute]) -> bool;
|
||||
|
||||
struct Context {
|
||||
in_cfg: in_cfg_pred
|
||||
@ -50,8 +50,7 @@ fn filter_item(cx: @Context, item: @ast::item) ->
|
||||
if item_in_cfg(cx, item) { option::Some(item) } else { option::None }
|
||||
}
|
||||
|
||||
fn filter_view_item(cx: @Context, view_item: @ast::view_item
|
||||
)-> Option<@ast::view_item> {
|
||||
fn filter_view_item<'r>(cx: @Context, view_item: &'r ast::view_item)-> Option<&'r ast::view_item> {
|
||||
if view_item_in_cfg(cx, view_item) {
|
||||
option::Some(view_item)
|
||||
} else {
|
||||
@ -64,7 +63,7 @@ fn fold_mod(cx: @Context, m: &ast::_mod, fld: @fold::ast_fold) -> ast::_mod {
|
||||
filter_item(cx, *a).chain(|x| fld.fold_item(x))
|
||||
}.collect();
|
||||
let filtered_view_items = do m.view_items.iter().filter_map |a| {
|
||||
filter_view_item(cx, *a).map(|x| fld.fold_view_item(*x))
|
||||
filter_view_item(cx, a).map(|&x| fld.fold_view_item(x))
|
||||
}.collect();
|
||||
ast::_mod {
|
||||
view_items: filtered_view_items,
|
||||
@ -86,7 +85,7 @@ fn fold_foreign_mod(
|
||||
) -> ast::foreign_mod {
|
||||
let filtered_items = nm.items.iter().filter_map(|a| filter_foreign_item(cx, *a)).collect();
|
||||
let filtered_view_items = do nm.view_items.iter().filter_map |a| {
|
||||
filter_view_item(cx, *a).map(|x| fld.fold_view_item(*x))
|
||||
filter_view_item(cx, a).map(|&x| fld.fold_view_item(x))
|
||||
}.collect();
|
||||
ast::foreign_mod {
|
||||
sort: nm.sort,
|
||||
@ -141,7 +140,7 @@ fn fold_block(
|
||||
filter_stmt(cx, *a).chain(|stmt| fld.fold_stmt(stmt))
|
||||
}.collect();
|
||||
let filtered_view_items = do b.view_items.iter().filter_map |a| {
|
||||
filter_view_item(cx, *a).map(|x| fld.fold_view_item(*x))
|
||||
filter_view_item(cx, a).map(|&x| fld.fold_view_item(x))
|
||||
}.collect();
|
||||
ast::blk_ {
|
||||
view_items: filtered_view_items,
|
||||
@ -160,8 +159,8 @@ fn foreign_item_in_cfg(cx: @Context, item: @ast::foreign_item) -> bool {
|
||||
return (cx.in_cfg)(/*bad*/copy item.attrs);
|
||||
}
|
||||
|
||||
fn view_item_in_cfg(cx: @Context, item: @ast::view_item) -> bool {
|
||||
return (cx.in_cfg)(/*bad*/copy item.attrs);
|
||||
fn view_item_in_cfg(cx: @Context, item: &ast::view_item) -> bool {
|
||||
return (cx.in_cfg)(item.attrs);
|
||||
}
|
||||
|
||||
fn method_in_cfg(cx: @Context, meth: @ast::method) -> bool {
|
||||
|
@ -41,7 +41,7 @@ fn inject_libstd_ref(sess: Session, crate: &ast::crate) -> @ast::crate {
|
||||
let precursor = @fold::AstFoldFns {
|
||||
fold_crate: |crate, span, fld| {
|
||||
let n1 = sess.next_node_id();
|
||||
let vi1 = @ast::view_item {
|
||||
let vi1 = ast::view_item {
|
||||
node: ast::view_item_extern_mod(
|
||||
sess.ident_of("std"), ~[], n1),
|
||||
attrs: ~[
|
||||
@ -87,7 +87,7 @@ fn inject_libstd_ref(sess: Session, crate: &ast::crate) -> @ast::crate {
|
||||
};
|
||||
|
||||
let vp = @spanned(ast::view_path_glob(prelude_path, n2));
|
||||
let vi2 = @ast::view_item { node: ast::view_item_use(~[vp]),
|
||||
let vi2 = ast::view_item { node: ast::view_item_use(~[vp]),
|
||||
attrs: ~[],
|
||||
vis: ast::private,
|
||||
span: dummy_sp() };
|
||||
|
@ -272,7 +272,7 @@ mod __test {
|
||||
|
||||
*/
|
||||
|
||||
fn mk_std(cx: &TestCtxt) -> @ast::view_item {
|
||||
fn mk_std(cx: &TestCtxt) -> ast::view_item {
|
||||
let vers = ast::lit_str(@"0.7");
|
||||
let vers = nospan(vers);
|
||||
let mi = ast::meta_name_value(@"vers", vers);
|
||||
@ -287,13 +287,12 @@ fn mk_std(cx: &TestCtxt) -> @ast::view_item {
|
||||
ast::view_item_extern_mod(id_std, ~[@mi],
|
||||
cx.sess.next_node_id())
|
||||
};
|
||||
let vi = ast::view_item {
|
||||
ast::view_item {
|
||||
node: vi,
|
||||
attrs: ~[],
|
||||
vis: ast::public,
|
||||
span: dummy_sp()
|
||||
};
|
||||
return @vi;
|
||||
}
|
||||
}
|
||||
|
||||
fn mk_test_module(cx: &TestCtxt) -> @ast::item {
|
||||
|
@ -136,7 +136,7 @@ fn visit_crate(e: &Env, c: &ast::crate) {
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_view_item(e: @mut Env, i: @ast::view_item) {
|
||||
fn visit_view_item(e: @mut Env, i: &ast::view_item) {
|
||||
match i.node {
|
||||
ast::view_item_extern_mod(ident, ref meta_items, id) => {
|
||||
debug!("resolving extern mod stmt. ident: %?, meta: %?",
|
||||
|
@ -1432,7 +1432,7 @@ impl Resolver {
|
||||
/// Constructs the reduced graph for one 'view item'. View items consist
|
||||
/// of imports and use directives.
|
||||
pub fn build_reduced_graph_for_view_item(@mut self,
|
||||
view_item: @view_item,
|
||||
view_item: &view_item,
|
||||
(parent, _):
|
||||
(ReducedGraphParent,
|
||||
vt<ReducedGraphParent>)) {
|
||||
@ -5295,7 +5295,7 @@ impl Resolver {
|
||||
visit_crate(self.crate, ((), vt));
|
||||
}
|
||||
|
||||
pub fn check_for_item_unused_imports(&mut self, vi: @view_item) {
|
||||
pub fn check_for_item_unused_imports(&mut self, vi: &view_item) {
|
||||
// Ignore public import statements because there's no way to be sure
|
||||
// whether they're used or not. Also ignore imports with a dummy span
|
||||
// because this means that they were generated in some fashion by the
|
||||
|
@ -219,7 +219,7 @@ pub type blk = spanned<blk_>;
|
||||
|
||||
#[deriving(Eq, Encodable, Decodable,IterBytes)]
|
||||
pub struct blk_ {
|
||||
view_items: ~[@view_item],
|
||||
view_items: ~[view_item],
|
||||
stmts: ~[@stmt],
|
||||
expr: Option<@expr>,
|
||||
id: node_id,
|
||||
@ -827,7 +827,7 @@ pub struct method {
|
||||
|
||||
#[deriving(Eq, Encodable, Decodable,IterBytes)]
|
||||
pub struct _mod {
|
||||
view_items: ~[@view_item],
|
||||
view_items: ~[view_item],
|
||||
items: ~[@item],
|
||||
}
|
||||
|
||||
@ -839,7 +839,7 @@ pub enum foreign_mod_sort { named, anonymous }
|
||||
pub struct foreign_mod {
|
||||
sort: foreign_mod_sort,
|
||||
abis: AbiSet,
|
||||
view_items: ~[@view_item],
|
||||
view_items: ~[view_item],
|
||||
items: ~[@foreign_item],
|
||||
}
|
||||
|
||||
|
@ -80,7 +80,7 @@ pub trait AstBuilder {
|
||||
fn blk(&self, span: span, stmts: ~[@ast::stmt], expr: Option<@ast::expr>) -> ast::blk;
|
||||
fn blk_expr(&self, expr: @ast::expr) -> ast::blk;
|
||||
fn blk_all(&self, span: span,
|
||||
view_items: ~[@ast::view_item],
|
||||
view_items: ~[ast::view_item],
|
||||
stmts: ~[@ast::stmt],
|
||||
expr: Option<@ast::expr>) -> ast::blk;
|
||||
|
||||
@ -202,7 +202,7 @@ pub trait AstBuilder {
|
||||
|
||||
fn item_mod(&self, span: span,
|
||||
name: ident, attrs: ~[ast::attribute],
|
||||
vi: ~[@ast::view_item], items: ~[@ast::item]) -> @ast::item;
|
||||
vi: ~[ast::view_item], items: ~[@ast::item]) -> @ast::item;
|
||||
|
||||
fn item_ty_poly(&self,
|
||||
span: span,
|
||||
@ -218,11 +218,11 @@ pub trait AstBuilder {
|
||||
fn meta_name_value(&self, sp: span, name: @str, value: ast::lit_) -> @ast::meta_item;
|
||||
|
||||
fn view_use(&self, sp: span,
|
||||
vis: ast::visibility, vp: ~[@ast::view_path]) -> @ast::view_item;
|
||||
vis: ast::visibility, vp: ~[@ast::view_path]) -> ast::view_item;
|
||||
fn view_use_list(&self, sp: span, vis: ast::visibility,
|
||||
path: ~[ast::ident], imports: &[ast::ident]) -> @ast::view_item;
|
||||
path: ~[ast::ident], imports: &[ast::ident]) -> ast::view_item;
|
||||
fn view_use_glob(&self, sp: span,
|
||||
vis: ast::visibility, path: ~[ast::ident]) -> @ast::view_item;
|
||||
vis: ast::visibility, path: ~[ast::ident]) -> ast::view_item;
|
||||
}
|
||||
|
||||
impl AstBuilder for @ExtCtxt {
|
||||
@ -400,7 +400,7 @@ impl AstBuilder for @ExtCtxt {
|
||||
}
|
||||
fn blk_all(&self,
|
||||
span: span,
|
||||
view_items: ~[@ast::view_item],
|
||||
view_items: ~[ast::view_item],
|
||||
stmts: ~[@ast::stmt],
|
||||
expr: Option<@ast::expr>) -> ast::blk {
|
||||
respan(span,
|
||||
@ -762,7 +762,7 @@ impl AstBuilder for @ExtCtxt {
|
||||
|
||||
fn item_mod(&self, span: span, name: ident,
|
||||
attrs: ~[ast::attribute],
|
||||
vi: ~[@ast::view_item],
|
||||
vi: ~[ast::view_item],
|
||||
items: ~[@ast::item]) -> @ast::item {
|
||||
self.item(
|
||||
span,
|
||||
@ -804,8 +804,8 @@ impl AstBuilder for @ExtCtxt {
|
||||
}
|
||||
|
||||
fn view_use(&self, sp: span,
|
||||
vis: ast::visibility, vp: ~[@ast::view_path]) -> @ast::view_item {
|
||||
@ast::view_item {
|
||||
vis: ast::visibility, vp: ~[@ast::view_path]) -> ast::view_item {
|
||||
ast::view_item {
|
||||
node: ast::view_item_use(vp),
|
||||
attrs: ~[],
|
||||
vis: vis,
|
||||
@ -814,7 +814,7 @@ impl AstBuilder for @ExtCtxt {
|
||||
}
|
||||
|
||||
fn view_use_list(&self, sp: span, vis: ast::visibility,
|
||||
path: ~[ast::ident], imports: &[ast::ident]) -> @ast::view_item {
|
||||
path: ~[ast::ident], imports: &[ast::ident]) -> ast::view_item {
|
||||
let imports = do imports.map |id| {
|
||||
respan(sp, ast::path_list_ident_ { name: *id, id: self.next_id() })
|
||||
};
|
||||
@ -827,7 +827,7 @@ impl AstBuilder for @ExtCtxt {
|
||||
}
|
||||
|
||||
fn view_use_glob(&self, sp: span,
|
||||
vis: ast::visibility, path: ~[ast::ident]) -> @ast::view_item {
|
||||
vis: ast::visibility, path: ~[ast::ident]) -> ast::view_item {
|
||||
self.view_use(sp, vis,
|
||||
~[@respan(sp,
|
||||
ast::view_path_glob(self.path(sp, path), self.next_id()))])
|
||||
|
@ -16,7 +16,7 @@ use opt_vec::OptVec;
|
||||
|
||||
pub trait ast_fold {
|
||||
fn fold_crate(@self, &crate) -> crate;
|
||||
fn fold_view_item(@self, @view_item) -> @view_item;
|
||||
fn fold_view_item(@self, &view_item) -> view_item;
|
||||
fn fold_foreign_item(@self, @foreign_item) -> @foreign_item;
|
||||
fn fold_item(@self, @item) -> Option<@item>;
|
||||
fn fold_struct_field(@self, @struct_field) -> @struct_field;
|
||||
@ -372,7 +372,7 @@ fn noop_fold_method(m: @method, fld: @ast_fold) -> @method {
|
||||
|
||||
|
||||
pub fn noop_fold_block(b: &blk_, fld: @ast_fold) -> blk_ {
|
||||
let view_items = b.view_items.map(|x| fld.fold_view_item(*x));
|
||||
let view_items = b.view_items.map(|x| fld.fold_view_item(x));
|
||||
let mut stmts = ~[];
|
||||
for b.stmts.iter().advance |stmt| {
|
||||
match fld.fold_stmt(*stmt) {
|
||||
@ -697,7 +697,7 @@ pub fn noop_fold_ty(t: &ty_, fld: @ast_fold) -> ty_ {
|
||||
// ...nor do modules
|
||||
pub fn noop_fold_mod(m: &_mod, fld: @ast_fold) -> _mod {
|
||||
ast::_mod {
|
||||
view_items: m.view_items.iter().transform(|x| fld.fold_view_item(*x)).collect(),
|
||||
view_items: m.view_items.iter().transform(|x| fld.fold_view_item(x)).collect(),
|
||||
items: m.items.iter().filter_map(|x| fld.fold_item(*x)).collect(),
|
||||
}
|
||||
}
|
||||
@ -706,7 +706,7 @@ fn noop_fold_foreign_mod(nm: &foreign_mod, fld: @ast_fold) -> foreign_mod {
|
||||
ast::foreign_mod {
|
||||
sort: nm.sort,
|
||||
abis: nm.abis,
|
||||
view_items: nm.view_items.iter().transform(|x| fld.fold_view_item(*x)).collect(),
|
||||
view_items: nm.view_items.iter().transform(|x| fld.fold_view_item(x)).collect(),
|
||||
items: nm.items.iter().transform(|x| fld.fold_foreign_item(*x)).collect(),
|
||||
}
|
||||
}
|
||||
@ -818,9 +818,8 @@ impl ast_fold for AstFoldFns {
|
||||
let (n, s) = (self.fold_crate)(&c.node, c.span, self as @ast_fold);
|
||||
spanned { node: n, span: (self.new_span)(s) }
|
||||
}
|
||||
fn fold_view_item(@self, x: @view_item) ->
|
||||
@view_item {
|
||||
@ast::view_item {
|
||||
fn fold_view_item(@self, x: &view_item) -> view_item {
|
||||
ast::view_item {
|
||||
node: (self.fold_view_item)(&x.node, self as @ast_fold),
|
||||
attrs: x.attrs.iter().transform(|a| fold_attribute_(*a, self as @ast_fold)).collect(),
|
||||
vis: x.vis,
|
||||
|
@ -115,7 +115,7 @@ pub enum item_or_view_item {
|
||||
iovi_none,
|
||||
iovi_item(@item),
|
||||
iovi_foreign_item(@foreign_item),
|
||||
iovi_view_item(@view_item)
|
||||
iovi_view_item(view_item)
|
||||
}
|
||||
|
||||
#[deriving(Eq)]
|
||||
@ -208,7 +208,7 @@ fn maybe_append(lhs: ~[attribute], rhs: Option<~[attribute]>)
|
||||
|
||||
struct ParsedItemsAndViewItems {
|
||||
attrs_remaining: ~[attribute],
|
||||
view_items: ~[@view_item],
|
||||
view_items: ~[view_item],
|
||||
items: ~[@item],
|
||||
foreign_items: ~[@foreign_item]
|
||||
}
|
||||
@ -4074,7 +4074,7 @@ impl Parser {
|
||||
// extern mod foo;
|
||||
let metadata = self.parse_optional_meta();
|
||||
self.expect(&token::SEMI);
|
||||
iovi_view_item(@ast::view_item {
|
||||
iovi_view_item(ast::view_item {
|
||||
node: view_item_extern_mod(ident, metadata, self.get_id()),
|
||||
attrs: copy attrs,
|
||||
vis: visibility,
|
||||
@ -4308,7 +4308,7 @@ impl Parser {
|
||||
// USE ITEM (iovi_view_item)
|
||||
let view_item = self.parse_use();
|
||||
self.expect(&token::SEMI);
|
||||
return iovi_view_item(@ast::view_item {
|
||||
return iovi_view_item(ast::view_item {
|
||||
node: view_item,
|
||||
attrs: attrs,
|
||||
vis: visibility,
|
||||
@ -4656,7 +4656,7 @@ impl Parser {
|
||||
&self,
|
||||
attrs: ~[attribute],
|
||||
vis: visibility
|
||||
) -> @view_item {
|
||||
) -> view_item {
|
||||
let lo = self.span.lo;
|
||||
let node = if self.eat_keyword(keywords::Use) {
|
||||
self.parse_use()
|
||||
@ -4669,7 +4669,7 @@ impl Parser {
|
||||
self.bug("expected view item");
|
||||
};
|
||||
self.expect(&token::SEMI);
|
||||
@ast::view_item { node: node,
|
||||
ast::view_item { node: node,
|
||||
attrs: attrs,
|
||||
vis: vis,
|
||||
span: mk_sp(lo, self.last_span.hi) }
|
||||
@ -4687,7 +4687,7 @@ impl Parser {
|
||||
let mut attrs = vec::append(first_item_attrs,
|
||||
self.parse_outer_attributes());
|
||||
// First, parse view items.
|
||||
let mut view_items = ~[];
|
||||
let mut view_items : ~[ast::view_item] = ~[];
|
||||
let mut items = ~[];
|
||||
let mut done = false;
|
||||
// I think this code would probably read better as a single
|
||||
|
@ -352,7 +352,7 @@ pub fn commasep_exprs(s: @ps, b: breaks, exprs: &[@ast::expr]) {
|
||||
pub fn print_mod(s: @ps, _mod: &ast::_mod, attrs: &[ast::attribute]) {
|
||||
print_inner_attributes(s, attrs);
|
||||
for _mod.view_items.iter().advance |vitem| {
|
||||
print_view_item(s, *vitem);
|
||||
print_view_item(s, vitem);
|
||||
}
|
||||
for _mod.items.iter().advance |item| { print_item(s, *item); }
|
||||
}
|
||||
@ -361,7 +361,7 @@ pub fn print_foreign_mod(s: @ps, nmod: &ast::foreign_mod,
|
||||
attrs: &[ast::attribute]) {
|
||||
print_inner_attributes(s, attrs);
|
||||
for nmod.view_items.iter().advance |vitem| {
|
||||
print_view_item(s, *vitem);
|
||||
print_view_item(s, vitem);
|
||||
}
|
||||
for nmod.items.iter().advance |item| { print_foreign_item(s, *item); }
|
||||
}
|
||||
@ -947,7 +947,7 @@ pub fn print_possibly_embedded_block_(s: @ps,
|
||||
|
||||
print_inner_attributes(s, attrs);
|
||||
|
||||
for blk.node.view_items.iter().advance |vi| { print_view_item(s, *vi); }
|
||||
for blk.node.view_items.iter().advance |vi| { print_view_item(s, vi); }
|
||||
for blk.node.stmts.iter().advance |st| {
|
||||
print_stmt(s, *st);
|
||||
}
|
||||
@ -1844,7 +1844,7 @@ pub fn print_view_paths(s: @ps, vps: &[@ast::view_path]) {
|
||||
commasep(s, inconsistent, vps, print_view_path);
|
||||
}
|
||||
|
||||
pub fn print_view_item(s: @ps, item: @ast::view_item) {
|
||||
pub fn print_view_item(s: @ps, item: &ast::view_item) {
|
||||
hardbreak_if_not_bol(s);
|
||||
maybe_print_comment(s, item.span.lo);
|
||||
print_outer_attributes(s, item.attrs);
|
||||
|
@ -72,7 +72,7 @@ pub fn generics_of_fn(fk: &fn_kind) -> Generics {
|
||||
|
||||
pub struct Visitor<E> {
|
||||
visit_mod: @fn(&_mod, span, node_id, (E, vt<E>)),
|
||||
visit_view_item: @fn(@view_item, (E, vt<E>)),
|
||||
visit_view_item: @fn(&view_item, (E, vt<E>)),
|
||||
visit_foreign_item: @fn(@foreign_item, (E, vt<E>)),
|
||||
visit_item: @fn(@item, (E, vt<E>)),
|
||||
visit_local: @fn(@local, (E, vt<E>)),
|
||||
@ -123,7 +123,7 @@ pub fn visit_crate<E: Copy>(c: &crate, (e, v): (E, vt<E>)) {
|
||||
}
|
||||
|
||||
pub fn visit_mod<E: Copy>(m: &_mod, _sp: span, _id: node_id, (e, v): (E, vt<E>)) {
|
||||
for m.view_items.iter().advance |vi| { (v.visit_view_item)(*vi, (copy e, v)); }
|
||||
for m.view_items.iter().advance |vi| { (v.visit_view_item)(vi, (copy e, v)); }
|
||||
for m.items.iter().advance |i| { (v.visit_item)(*i, (copy e, v)); }
|
||||
}
|
||||
|
||||
@ -166,7 +166,7 @@ pub fn visit_item<E: Copy>(i: &item, (e, v): (E, vt<E>)) {
|
||||
}
|
||||
item_mod(ref m) => (v.visit_mod)(m, i.span, i.id, (e, v)),
|
||||
item_foreign_mod(ref nm) => {
|
||||
for nm.view_items.iter().advance |vi| { (v.visit_view_item)(*vi, (copy e, v)); }
|
||||
for nm.view_items.iter().advance |vi| { (v.visit_view_item)(vi, (copy e, v)); }
|
||||
for nm.items.iter().advance |ni| { (v.visit_foreign_item)(*ni, (copy e, v)); }
|
||||
}
|
||||
item_ty(t, ref tps) => {
|
||||
@ -414,7 +414,7 @@ pub fn visit_struct_field<E: Copy>(sf: &struct_field, (e, v): (E, vt<E>)) {
|
||||
|
||||
pub fn visit_block<E: Copy>(b: &blk, (e, v): (E, vt<E>)) {
|
||||
for b.node.view_items.iter().advance |vi| {
|
||||
(v.visit_view_item)(*vi, (copy e, v));
|
||||
(v.visit_view_item)(vi, (copy e, v));
|
||||
}
|
||||
for b.node.stmts.iter().advance |s| {
|
||||
(v.visit_stmt)(*s, (copy e, v));
|
||||
@ -568,7 +568,7 @@ pub fn visit_arm<E: Copy>(a: &arm, (e, v): (E, vt<E>)) {
|
||||
|
||||
pub struct SimpleVisitor {
|
||||
visit_mod: @fn(&_mod, span, node_id),
|
||||
visit_view_item: @fn(@view_item),
|
||||
visit_view_item: @fn(&view_item),
|
||||
visit_foreign_item: @fn(@foreign_item),
|
||||
visit_item: @fn(@item),
|
||||
visit_local: @fn(@local),
|
||||
@ -629,7 +629,7 @@ pub fn mk_simple_visitor(v: simple_visitor) -> vt<()> {
|
||||
f(m, sp, id);
|
||||
visit_mod(m, sp, id, (e, v));
|
||||
}
|
||||
fn v_view_item(f: @fn(@view_item), vi: @view_item, (e, v): ((), vt<()>)) {
|
||||
fn v_view_item(f: @fn(&view_item), vi: &view_item, (e, v): ((), vt<()>)) {
|
||||
f(vi);
|
||||
visit_view_item(vi, (e, v));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user