mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Merge #10819
10819: internal: Replace some `Vec` occurences with `Box` r=Veykril a=Veykril Shaves off ~15mb from self analysis Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
f2707bce36
@ -130,11 +130,7 @@ impl ExprCollector<'_> {
|
|||||||
self.body.params.push(param_pat);
|
self.body.params.push(param_pat);
|
||||||
}
|
}
|
||||||
|
|
||||||
for param in param_list.params() {
|
for pat in param_list.params().filter_map(|param| param.pat()) {
|
||||||
let pat = match param.pat() {
|
|
||||||
None => continue,
|
|
||||||
Some(pat) => pat,
|
|
||||||
};
|
|
||||||
let param_pat = self.collect_pat(pat);
|
let param_pat = self.collect_pat(pat);
|
||||||
self.body.params.push(param_pat);
|
self.body.params.push(param_pat);
|
||||||
}
|
}
|
||||||
@ -160,7 +156,7 @@ impl ExprCollector<'_> {
|
|||||||
self.make_expr(expr, Err(SyntheticSyntax))
|
self.make_expr(expr, Err(SyntheticSyntax))
|
||||||
}
|
}
|
||||||
fn unit(&mut self) -> ExprId {
|
fn unit(&mut self) -> ExprId {
|
||||||
self.alloc_expr_desugared(Expr::Tuple { exprs: Vec::new() })
|
self.alloc_expr_desugared(Expr::Tuple { exprs: Box::default() })
|
||||||
}
|
}
|
||||||
fn missing_expr(&mut self) -> ExprId {
|
fn missing_expr(&mut self) -> ExprId {
|
||||||
self.alloc_expr_desugared(Expr::Missing)
|
self.alloc_expr_desugared(Expr::Missing)
|
||||||
@ -235,7 +231,8 @@ impl ExprCollector<'_> {
|
|||||||
expr: else_branch.unwrap_or_else(|| self.unit()),
|
expr: else_branch.unwrap_or_else(|| self.unit()),
|
||||||
guard: None,
|
guard: None,
|
||||||
},
|
},
|
||||||
];
|
]
|
||||||
|
.into();
|
||||||
return Some(
|
return Some(
|
||||||
self.alloc_expr(Expr::Match { expr: match_expr, arms }, syntax_ptr),
|
self.alloc_expr(Expr::Match { expr: match_expr, arms }, syntax_ptr),
|
||||||
);
|
);
|
||||||
@ -300,7 +297,8 @@ impl ExprCollector<'_> {
|
|||||||
let arms = vec![
|
let arms = vec![
|
||||||
MatchArm { pat, expr: body, guard: None },
|
MatchArm { pat, expr: body, guard: None },
|
||||||
MatchArm { pat: placeholder_pat, expr: break_, guard: None },
|
MatchArm { pat: placeholder_pat, expr: break_, guard: None },
|
||||||
];
|
]
|
||||||
|
.into();
|
||||||
let match_expr =
|
let match_expr =
|
||||||
self.alloc_expr_desugared(Expr::Match { expr: match_expr, arms });
|
self.alloc_expr_desugared(Expr::Match { expr: match_expr, arms });
|
||||||
return Some(
|
return Some(
|
||||||
@ -324,7 +322,7 @@ impl ExprCollector<'_> {
|
|||||||
let args = if let Some(arg_list) = e.arg_list() {
|
let args = if let Some(arg_list) = e.arg_list() {
|
||||||
arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
|
arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
|
||||||
} else {
|
} else {
|
||||||
Vec::new()
|
Box::default()
|
||||||
};
|
};
|
||||||
self.alloc_expr(Expr::Call { callee, args }, syntax_ptr)
|
self.alloc_expr(Expr::Call { callee, args }, syntax_ptr)
|
||||||
}
|
}
|
||||||
@ -333,7 +331,7 @@ impl ExprCollector<'_> {
|
|||||||
let args = if let Some(arg_list) = e.arg_list() {
|
let args = if let Some(arg_list) = e.arg_list() {
|
||||||
arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
|
arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
|
||||||
} else {
|
} else {
|
||||||
Vec::new()
|
Box::default()
|
||||||
};
|
};
|
||||||
let method_name = e.name_ref().map(|nr| nr.as_name()).unwrap_or_else(Name::missing);
|
let method_name = e.name_ref().map(|nr| nr.as_name()).unwrap_or_else(Name::missing);
|
||||||
let generic_args = e
|
let generic_args = e
|
||||||
@ -367,7 +365,7 @@ impl ExprCollector<'_> {
|
|||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
} else {
|
} else {
|
||||||
Vec::new()
|
Box::default()
|
||||||
};
|
};
|
||||||
self.alloc_expr(Expr::Match { expr, arms }, syntax_ptr)
|
self.alloc_expr(Expr::Match { expr, arms }, syntax_ptr)
|
||||||
}
|
}
|
||||||
@ -429,7 +427,7 @@ impl ExprCollector<'_> {
|
|||||||
let spread = nfl.spread().map(|s| self.collect_expr(s));
|
let spread = nfl.spread().map(|s| self.collect_expr(s));
|
||||||
Expr::RecordLit { path, fields, spread }
|
Expr::RecordLit { path, fields, spread }
|
||||||
} else {
|
} else {
|
||||||
Expr::RecordLit { path, fields: Vec::new(), spread: None }
|
Expr::RecordLit { path, fields: Box::default(), spread: None }
|
||||||
};
|
};
|
||||||
|
|
||||||
self.alloc_expr(record_lit, syntax_ptr)
|
self.alloc_expr(record_lit, syntax_ptr)
|
||||||
@ -496,7 +494,10 @@ impl ExprCollector<'_> {
|
|||||||
.and_then(|r| r.ty())
|
.and_then(|r| r.ty())
|
||||||
.map(|it| Interned::new(TypeRef::from_ast(&self.ctx(), it)));
|
.map(|it| Interned::new(TypeRef::from_ast(&self.ctx(), it)));
|
||||||
let body = self.collect_expr_opt(e.body());
|
let body = self.collect_expr_opt(e.body());
|
||||||
self.alloc_expr(Expr::Lambda { args, arg_types, ret_type, body }, syntax_ptr)
|
self.alloc_expr(
|
||||||
|
Expr::Lambda { args: args.into(), arg_types: arg_types.into(), ret_type, body },
|
||||||
|
syntax_ptr,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
ast::Expr::BinExpr(e) => {
|
ast::Expr::BinExpr(e) => {
|
||||||
let lhs = self.collect_expr_opt(e.lhs());
|
let lhs = self.collect_expr_opt(e.lhs());
|
||||||
@ -718,7 +719,7 @@ impl ExprCollector<'_> {
|
|||||||
self.statements_in_scope.pop();
|
self.statements_in_scope.pop();
|
||||||
}
|
}
|
||||||
let tail = tail;
|
let tail = tail;
|
||||||
let statements = std::mem::replace(&mut self.statements_in_scope, prev_statements);
|
let statements = std::mem::replace(&mut self.statements_in_scope, prev_statements).into();
|
||||||
let syntax_node_ptr = AstPtr::new(&block.into());
|
let syntax_node_ptr = AstPtr::new(&block.into());
|
||||||
let expr_id = self.alloc_expr(
|
let expr_id = self.alloc_expr(
|
||||||
Expr::Block { id: block_id, statements, tail, label: None },
|
Expr::Block { id: block_id, statements, tail, label: None },
|
||||||
@ -812,7 +813,7 @@ impl ExprCollector<'_> {
|
|||||||
ast::Pat::RecordPat(p) => {
|
ast::Pat::RecordPat(p) => {
|
||||||
let path =
|
let path =
|
||||||
p.path().and_then(|path| self.expander.parse_path(self.db, path)).map(Box::new);
|
p.path().and_then(|path| self.expander.parse_path(self.db, path)).map(Box::new);
|
||||||
let args: Vec<_> = p
|
let args = p
|
||||||
.record_pat_field_list()
|
.record_pat_field_list()
|
||||||
.expect("every struct should have a field list")
|
.expect("every struct should have a field list")
|
||||||
.fields()
|
.fields()
|
||||||
@ -902,7 +903,7 @@ impl ExprCollector<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn collect_tuple_pat(&mut self, args: AstChildren<ast::Pat>) -> (Vec<PatId>, Option<usize>) {
|
fn collect_tuple_pat(&mut self, args: AstChildren<ast::Pat>) -> (Box<[PatId]>, Option<usize>) {
|
||||||
// Find the location of the `..`, if there is one. Note that we do not
|
// Find the location of the `..`, if there is one. Note that we do not
|
||||||
// consider the possibility of there being multiple `..` here.
|
// consider the possibility of there being multiple `..` here.
|
||||||
let ellipsis = args.clone().position(|p| matches!(p, ast::Pat::RestPat(_)));
|
let ellipsis = args.clone().position(|p| matches!(p, ast::Pat::RestPat(_)));
|
||||||
@ -961,7 +962,7 @@ impl From<ast::LiteralKind> for Literal {
|
|||||||
Literal::Float(Default::default(), ty)
|
Literal::Float(Default::default(), ty)
|
||||||
}
|
}
|
||||||
LiteralKind::ByteString(bs) => {
|
LiteralKind::ByteString(bs) => {
|
||||||
let text = bs.value().map(Vec::from).unwrap_or_else(Default::default);
|
let text = bs.value().map(Box::from).unwrap_or_else(Default::default);
|
||||||
Literal::ByteString(text)
|
Literal::ByteString(text)
|
||||||
}
|
}
|
||||||
LiteralKind::String(_) => Literal::String(Default::default()),
|
LiteralKind::String(_) => Literal::String(Default::default()),
|
||||||
|
@ -204,7 +204,7 @@ fn compute_expr_scopes(expr: ExprId, body: &Body, scopes: &mut ExprScopes, scope
|
|||||||
}
|
}
|
||||||
Expr::Match { expr, arms } => {
|
Expr::Match { expr, arms } => {
|
||||||
compute_expr_scopes(*expr, body, scopes, scope);
|
compute_expr_scopes(*expr, body, scopes, scope);
|
||||||
for arm in arms {
|
for arm in arms.iter() {
|
||||||
let mut scope = scopes.new_scope(scope);
|
let mut scope = scopes.new_scope(scope);
|
||||||
scopes.add_bindings(body, scope, arm.pat);
|
scopes.add_bindings(body, scope, arm.pat);
|
||||||
match arm.guard {
|
match arm.guard {
|
||||||
|
@ -40,8 +40,8 @@ pub type LabelId = Idx<Label>;
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
pub enum Literal {
|
pub enum Literal {
|
||||||
String(String),
|
String(Box<str>),
|
||||||
ByteString(Vec<u8>),
|
ByteString(Box<[u8]>),
|
||||||
Char(char),
|
Char(char),
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
Int(i128, Option<BuiltinInt>),
|
Int(i128, Option<BuiltinInt>),
|
||||||
@ -61,7 +61,7 @@ pub enum Expr {
|
|||||||
},
|
},
|
||||||
Block {
|
Block {
|
||||||
id: BlockId,
|
id: BlockId,
|
||||||
statements: Vec<Statement>,
|
statements: Box<[Statement]>,
|
||||||
tail: Option<ExprId>,
|
tail: Option<ExprId>,
|
||||||
label: Option<LabelId>,
|
label: Option<LabelId>,
|
||||||
},
|
},
|
||||||
@ -82,17 +82,17 @@ pub enum Expr {
|
|||||||
},
|
},
|
||||||
Call {
|
Call {
|
||||||
callee: ExprId,
|
callee: ExprId,
|
||||||
args: Vec<ExprId>,
|
args: Box<[ExprId]>,
|
||||||
},
|
},
|
||||||
MethodCall {
|
MethodCall {
|
||||||
receiver: ExprId,
|
receiver: ExprId,
|
||||||
method_name: Name,
|
method_name: Name,
|
||||||
args: Vec<ExprId>,
|
args: Box<[ExprId]>,
|
||||||
generic_args: Option<Box<GenericArgs>>,
|
generic_args: Option<Box<GenericArgs>>,
|
||||||
},
|
},
|
||||||
Match {
|
Match {
|
||||||
expr: ExprId,
|
expr: ExprId,
|
||||||
arms: Vec<MatchArm>,
|
arms: Box<[MatchArm]>,
|
||||||
},
|
},
|
||||||
Continue {
|
Continue {
|
||||||
label: Option<Name>,
|
label: Option<Name>,
|
||||||
@ -109,7 +109,7 @@ pub enum Expr {
|
|||||||
},
|
},
|
||||||
RecordLit {
|
RecordLit {
|
||||||
path: Option<Box<Path>>,
|
path: Option<Box<Path>>,
|
||||||
fields: Vec<RecordLitField>,
|
fields: Box<[RecordLitField]>,
|
||||||
spread: Option<ExprId>,
|
spread: Option<ExprId>,
|
||||||
},
|
},
|
||||||
Field {
|
Field {
|
||||||
@ -162,13 +162,13 @@ pub enum Expr {
|
|||||||
index: ExprId,
|
index: ExprId,
|
||||||
},
|
},
|
||||||
Lambda {
|
Lambda {
|
||||||
args: Vec<PatId>,
|
args: Box<[PatId]>,
|
||||||
arg_types: Vec<Option<Interned<TypeRef>>>,
|
arg_types: Box<[Option<Interned<TypeRef>>]>,
|
||||||
ret_type: Option<Interned<TypeRef>>,
|
ret_type: Option<Interned<TypeRef>>,
|
||||||
body: ExprId,
|
body: ExprId,
|
||||||
},
|
},
|
||||||
Tuple {
|
Tuple {
|
||||||
exprs: Vec<ExprId>,
|
exprs: Box<[ExprId]>,
|
||||||
},
|
},
|
||||||
Unsafe {
|
Unsafe {
|
||||||
body: ExprId,
|
body: ExprId,
|
||||||
@ -182,7 +182,7 @@ pub enum Expr {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
pub enum Array {
|
pub enum Array {
|
||||||
ElementList(Vec<ExprId>),
|
ElementList(Box<[ExprId]>),
|
||||||
Repeat { initializer: ExprId, repeat: ExprId },
|
Repeat { initializer: ExprId, repeat: ExprId },
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,23 +228,23 @@ impl Expr {
|
|||||||
Expr::If { condition, then_branch, else_branch } => {
|
Expr::If { condition, then_branch, else_branch } => {
|
||||||
f(*condition);
|
f(*condition);
|
||||||
f(*then_branch);
|
f(*then_branch);
|
||||||
if let Some(else_branch) = else_branch {
|
if let &Some(else_branch) = else_branch {
|
||||||
f(*else_branch);
|
f(else_branch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expr::Block { statements, tail, .. } => {
|
Expr::Block { statements, tail, .. } => {
|
||||||
for stmt in statements {
|
for stmt in statements.iter() {
|
||||||
match stmt {
|
match stmt {
|
||||||
Statement::Let { initializer, .. } => {
|
Statement::Let { initializer, .. } => {
|
||||||
if let Some(expr) = initializer {
|
if let &Some(expr) = initializer {
|
||||||
f(*expr);
|
f(expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Statement::Expr { expr: expression, .. } => f(*expression),
|
Statement::Expr { expr: expression, .. } => f(*expression),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(expr) = tail {
|
if let &Some(expr) = tail {
|
||||||
f(*expr);
|
f(expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expr::TryBlock { body }
|
Expr::TryBlock { body }
|
||||||
@ -262,34 +262,28 @@ impl Expr {
|
|||||||
}
|
}
|
||||||
Expr::Call { callee, args } => {
|
Expr::Call { callee, args } => {
|
||||||
f(*callee);
|
f(*callee);
|
||||||
for arg in args {
|
args.iter().copied().for_each(f);
|
||||||
f(*arg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Expr::MethodCall { receiver, args, .. } => {
|
Expr::MethodCall { receiver, args, .. } => {
|
||||||
f(*receiver);
|
f(*receiver);
|
||||||
for arg in args {
|
args.iter().copied().for_each(f);
|
||||||
f(*arg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Expr::Match { expr, arms } => {
|
Expr::Match { expr, arms } => {
|
||||||
f(*expr);
|
f(*expr);
|
||||||
for arm in arms {
|
arms.iter().map(|arm| arm.expr).for_each(f);
|
||||||
f(arm.expr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Expr::Continue { .. } => {}
|
Expr::Continue { .. } => {}
|
||||||
Expr::Break { expr, .. } | Expr::Return { expr } | Expr::Yield { expr } => {
|
Expr::Break { expr, .. } | Expr::Return { expr } | Expr::Yield { expr } => {
|
||||||
if let Some(expr) = expr {
|
if let &Some(expr) = expr {
|
||||||
f(*expr);
|
f(expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expr::RecordLit { fields, spread, .. } => {
|
Expr::RecordLit { fields, spread, .. } => {
|
||||||
for field in fields {
|
for field in fields.iter() {
|
||||||
f(field.expr);
|
f(field.expr);
|
||||||
}
|
}
|
||||||
if let Some(expr) = spread {
|
if let &Some(expr) = spread {
|
||||||
f(*expr);
|
f(expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expr::Lambda { body, .. } => {
|
Expr::Lambda { body, .. } => {
|
||||||
@ -300,11 +294,11 @@ impl Expr {
|
|||||||
f(*rhs);
|
f(*rhs);
|
||||||
}
|
}
|
||||||
Expr::Range { lhs, rhs, .. } => {
|
Expr::Range { lhs, rhs, .. } => {
|
||||||
if let Some(lhs) = rhs {
|
if let &Some(lhs) = rhs {
|
||||||
f(*lhs);
|
f(lhs);
|
||||||
}
|
}
|
||||||
if let Some(rhs) = lhs {
|
if let &Some(rhs) = lhs {
|
||||||
f(*rhs);
|
f(rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expr::Index { base, index } => {
|
Expr::Index { base, index } => {
|
||||||
@ -320,17 +314,9 @@ impl Expr {
|
|||||||
| Expr::Box { expr } => {
|
| Expr::Box { expr } => {
|
||||||
f(*expr);
|
f(*expr);
|
||||||
}
|
}
|
||||||
Expr::Tuple { exprs } => {
|
Expr::Tuple { exprs } => exprs.iter().copied().for_each(f),
|
||||||
for expr in exprs {
|
|
||||||
f(*expr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Expr::Array(a) => match a {
|
Expr::Array(a) => match a {
|
||||||
Array::ElementList(exprs) => {
|
Array::ElementList(exprs) => exprs.iter().copied().for_each(f),
|
||||||
for expr in exprs {
|
|
||||||
f(*expr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Array::Repeat { initializer, repeat } => {
|
Array::Repeat { initializer, repeat } => {
|
||||||
f(*initializer);
|
f(*initializer);
|
||||||
f(*repeat)
|
f(*repeat)
|
||||||
@ -386,15 +372,15 @@ pub struct RecordFieldPat {
|
|||||||
pub enum Pat {
|
pub enum Pat {
|
||||||
Missing,
|
Missing,
|
||||||
Wild,
|
Wild,
|
||||||
Tuple { args: Vec<PatId>, ellipsis: Option<usize> },
|
Tuple { args: Box<[PatId]>, ellipsis: Option<usize> },
|
||||||
Or(Vec<PatId>),
|
Or(Box<[PatId]>),
|
||||||
Record { path: Option<Box<Path>>, args: Vec<RecordFieldPat>, ellipsis: bool },
|
Record { path: Option<Box<Path>>, args: Box<[RecordFieldPat]>, ellipsis: bool },
|
||||||
Range { start: ExprId, end: ExprId },
|
Range { start: ExprId, end: ExprId },
|
||||||
Slice { prefix: Vec<PatId>, slice: Option<PatId>, suffix: Vec<PatId> },
|
Slice { prefix: Box<[PatId]>, slice: Option<PatId>, suffix: Box<[PatId]> },
|
||||||
Path(Box<Path>),
|
Path(Box<Path>),
|
||||||
Lit(ExprId),
|
Lit(ExprId),
|
||||||
Bind { mode: BindingAnnotation, name: Name, subpat: Option<PatId> },
|
Bind { mode: BindingAnnotation, name: Name, subpat: Option<PatId> },
|
||||||
TupleStruct { path: Option<Box<Path>>, args: Vec<PatId>, ellipsis: Option<usize> },
|
TupleStruct { path: Option<Box<Path>>, args: Box<[PatId]>, ellipsis: Option<usize> },
|
||||||
Ref { pat: PatId, mutability: Mutability },
|
Ref { pat: PatId, mutability: Mutability },
|
||||||
Box { inner: PatId },
|
Box { inner: PatId },
|
||||||
ConstBlock(ExprId),
|
ConstBlock(ExprId),
|
||||||
|
@ -22,7 +22,7 @@ pub struct ModPath {
|
|||||||
segments: Vec<Name>,
|
segments: Vec<Name>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
pub enum PathKind {
|
pub enum PathKind {
|
||||||
Plain,
|
Plain,
|
||||||
/// `self::` is `Super(0)`
|
/// `self::` is `Super(0)`
|
||||||
@ -119,7 +119,7 @@ pub struct Path {
|
|||||||
type_anchor: Option<Interned<TypeRef>>,
|
type_anchor: Option<Interned<TypeRef>>,
|
||||||
mod_path: Interned<ModPath>,
|
mod_path: Interned<ModPath>,
|
||||||
/// Invariant: the same len as `self.mod_path.segments`
|
/// Invariant: the same len as `self.mod_path.segments`
|
||||||
generic_args: Vec<Option<Interned<GenericArgs>>>,
|
generic_args: Box<[Option<Interned<GenericArgs>>]>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generic arguments to a path segment (e.g. the `i32` in `Option<i32>`). This
|
/// Generic arguments to a path segment (e.g. the `i32` in `Option<i32>`). This
|
||||||
@ -171,9 +171,9 @@ impl Path {
|
|||||||
/// Converts a known mod path to `Path`.
|
/// Converts a known mod path to `Path`.
|
||||||
pub fn from_known_path(
|
pub fn from_known_path(
|
||||||
path: ModPath,
|
path: ModPath,
|
||||||
generic_args: Vec<Option<Interned<GenericArgs>>>,
|
generic_args: impl Into<Box<[Option<Interned<GenericArgs>>]>>,
|
||||||
) -> Path {
|
) -> Path {
|
||||||
Path { type_anchor: None, mod_path: Interned::new(path), generic_args }
|
Path { type_anchor: None, mod_path: Interned::new(path), generic_args: generic_args.into() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn kind(&self) -> &PathKind {
|
pub fn kind(&self) -> &PathKind {
|
||||||
@ -187,7 +187,7 @@ impl Path {
|
|||||||
pub fn segments(&self) -> PathSegments<'_> {
|
pub fn segments(&self) -> PathSegments<'_> {
|
||||||
PathSegments {
|
PathSegments {
|
||||||
segments: self.mod_path.segments.as_slice(),
|
segments: self.mod_path.segments.as_slice(),
|
||||||
generic_args: self.generic_args.as_slice(),
|
generic_args: &self.generic_args,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,14 +205,14 @@ impl Path {
|
|||||||
self.mod_path.kind.clone(),
|
self.mod_path.kind.clone(),
|
||||||
self.mod_path.segments[..self.mod_path.segments.len() - 1].iter().cloned(),
|
self.mod_path.segments[..self.mod_path.segments.len() - 1].iter().cloned(),
|
||||||
)),
|
)),
|
||||||
generic_args: self.generic_args[..self.generic_args.len() - 1].to_vec(),
|
generic_args: self.generic_args[..self.generic_args.len() - 1].to_vec().into(),
|
||||||
};
|
};
|
||||||
Some(res)
|
Some(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_self_type(&self) -> bool {
|
pub fn is_self_type(&self) -> bool {
|
||||||
self.type_anchor.is_none()
|
self.type_anchor.is_none()
|
||||||
&& self.generic_args == [None]
|
&& *self.generic_args == [None]
|
||||||
&& self.mod_path.as_ident() == Some(&name!(Self))
|
&& self.mod_path.as_ident() == Some(&name!(Self))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -286,7 +286,7 @@ impl From<Name> for Path {
|
|||||||
Path {
|
Path {
|
||||||
type_anchor: None,
|
type_anchor: None,
|
||||||
mod_path: Interned::new(ModPath::from_segments(PathKind::Plain, iter::once(name))),
|
mod_path: Interned::new(ModPath::from_segments(PathKind::Plain, iter::once(name))),
|
||||||
generic_args: vec![None],
|
generic_args: Box::new([None]),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,18 +70,13 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
|
|||||||
}
|
}
|
||||||
// <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo
|
// <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo
|
||||||
Some(trait_ref) => {
|
Some(trait_ref) => {
|
||||||
let path = Path::from_src(trait_ref.path()?, ctx)?;
|
let Path { mod_path, generic_args: path_generic_args, .. } =
|
||||||
let mod_path = (*path.mod_path).clone();
|
Path::from_src(trait_ref.path()?, ctx)?;
|
||||||
let num_segments = path.mod_path.segments.len();
|
let num_segments = mod_path.segments.len();
|
||||||
kind = mod_path.kind;
|
kind = mod_path.kind;
|
||||||
|
|
||||||
let mut prefix_segments = mod_path.segments;
|
segments.extend(mod_path.segments.iter().cloned().rev());
|
||||||
prefix_segments.reverse();
|
generic_args.extend(path_generic_args.iter().cloned().rev());
|
||||||
segments.extend(prefix_segments);
|
|
||||||
|
|
||||||
let mut prefix_args = path.generic_args;
|
|
||||||
prefix_args.reverse();
|
|
||||||
generic_args.extend(prefix_args);
|
|
||||||
|
|
||||||
// Insert the type reference (T in the above example) as Self parameter for the trait
|
// Insert the type reference (T in the above example) as Self parameter for the trait
|
||||||
let last_segment =
|
let last_segment =
|
||||||
@ -139,7 +134,7 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mod_path = Interned::new(ModPath::from_segments(kind, segments));
|
let mod_path = Interned::new(ModPath::from_segments(kind, segments));
|
||||||
return Some(Path { type_anchor, mod_path, generic_args });
|
return Some(Path { type_anchor, mod_path, generic_args: generic_args.into() });
|
||||||
|
|
||||||
fn qualifier(path: &ast::Path) -> Option<ast::Path> {
|
fn qualifier(path: &ast::Path) -> Option<ast::Path> {
|
||||||
if let Some(q) = path.qualifier() {
|
if let Some(q) = path.qualifier() {
|
||||||
|
@ -202,19 +202,16 @@ impl ExprValidator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let is_method_call = matches!(expr, Expr::MethodCall { .. });
|
let is_method_call = matches!(expr, Expr::MethodCall { .. });
|
||||||
let (sig, args) = match expr {
|
let (sig, mut arg_count) = match expr {
|
||||||
Expr::Call { callee, args } => {
|
Expr::Call { callee, args } => {
|
||||||
let callee = &self.infer.type_of_expr[*callee];
|
let callee = &self.infer.type_of_expr[*callee];
|
||||||
let sig = match callee.callable_sig(db) {
|
let sig = match callee.callable_sig(db) {
|
||||||
Some(sig) => sig,
|
Some(sig) => sig,
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
(sig, args.clone())
|
(sig, args.len())
|
||||||
}
|
}
|
||||||
Expr::MethodCall { receiver, args, .. } => {
|
Expr::MethodCall { receiver, args, .. } => {
|
||||||
let mut args = args.clone();
|
|
||||||
args.insert(0, *receiver);
|
|
||||||
|
|
||||||
let receiver = &self.infer.type_of_expr[*receiver];
|
let receiver = &self.infer.type_of_expr[*receiver];
|
||||||
if receiver.strip_references().is_unknown() {
|
if receiver.strip_references().is_unknown() {
|
||||||
// if the receiver is of unknown type, it's very likely we
|
// if the receiver is of unknown type, it's very likely we
|
||||||
@ -229,7 +226,7 @@ impl ExprValidator {
|
|||||||
};
|
};
|
||||||
let sig = db.callable_item_signature(callee.into()).substitute(&Interner, &subst);
|
let sig = db.callable_item_signature(callee.into()).substitute(&Interner, &subst);
|
||||||
|
|
||||||
(sig, args)
|
(sig, args.len() + 1)
|
||||||
}
|
}
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
@ -241,7 +238,6 @@ impl ExprValidator {
|
|||||||
let params = sig.params();
|
let params = sig.params();
|
||||||
|
|
||||||
let mut param_count = params.len();
|
let mut param_count = params.len();
|
||||||
let mut arg_count = args.len();
|
|
||||||
|
|
||||||
if arg_count != param_count {
|
if arg_count != param_count {
|
||||||
if is_method_call {
|
if is_method_call {
|
||||||
|
@ -375,7 +375,7 @@ impl<'a> InferenceContext<'a> {
|
|||||||
let matchee_diverges = self.diverges;
|
let matchee_diverges = self.diverges;
|
||||||
let mut all_arms_diverge = Diverges::Always;
|
let mut all_arms_diverge = Diverges::Always;
|
||||||
|
|
||||||
for arm in arms {
|
for arm in arms.iter() {
|
||||||
self.diverges = Diverges::Maybe;
|
self.diverges = Diverges::Maybe;
|
||||||
let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());
|
let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());
|
||||||
match arm.guard {
|
match arm.guard {
|
||||||
|
@ -226,8 +226,8 @@ impl<'a> InferenceContext<'a> {
|
|||||||
_ => self.err_ty(),
|
_ => self.err_ty(),
|
||||||
};
|
};
|
||||||
|
|
||||||
for pat_id in prefix.iter().chain(suffix) {
|
for &pat_id in prefix.iter().chain(suffix.iter()) {
|
||||||
self.infer_pat(*pat_id, &elem_ty, default_bm);
|
self.infer_pat(pat_id, &elem_ty, default_bm);
|
||||||
}
|
}
|
||||||
|
|
||||||
let pat_ty = match expected.kind(&Interner) {
|
let pat_ty = match expected.kind(&Interner) {
|
||||||
@ -235,8 +235,8 @@ impl<'a> InferenceContext<'a> {
|
|||||||
_ => TyKind::Slice(elem_ty),
|
_ => TyKind::Slice(elem_ty),
|
||||||
}
|
}
|
||||||
.intern(&Interner);
|
.intern(&Interner);
|
||||||
if let Some(slice_pat_id) = slice {
|
if let &Some(slice_pat_id) = slice {
|
||||||
self.infer_pat(*slice_pat_id, &pat_ty, default_bm);
|
self.infer_pat(slice_pat_id, &pat_ty, default_bm);
|
||||||
}
|
}
|
||||||
|
|
||||||
pat_ty
|
pat_ty
|
||||||
|
Loading…
Reference in New Issue
Block a user