mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 14:21:44 +00:00
implement initial type inference for index expressions
This commit is contained in:
parent
b082cd679a
commit
189d879659
3 changed files with 33 additions and 1 deletions
|
@ -245,6 +245,10 @@ pub enum Expr {
|
||||||
rhs: ExprId,
|
rhs: ExprId,
|
||||||
op: Option<BinaryOp>,
|
op: Option<BinaryOp>,
|
||||||
},
|
},
|
||||||
|
Index {
|
||||||
|
base: ExprId,
|
||||||
|
index: ExprId,
|
||||||
|
},
|
||||||
Lambda {
|
Lambda {
|
||||||
args: Vec<PatId>,
|
args: Vec<PatId>,
|
||||||
arg_types: Vec<Option<TypeRef>>,
|
arg_types: Vec<Option<TypeRef>>,
|
||||||
|
@ -399,6 +403,10 @@ impl Expr {
|
||||||
f(*lhs);
|
f(*lhs);
|
||||||
f(*rhs);
|
f(*rhs);
|
||||||
}
|
}
|
||||||
|
Expr::Index { base, index } => {
|
||||||
|
f(*base);
|
||||||
|
f(*index);
|
||||||
|
}
|
||||||
Expr::Field { expr, .. }
|
Expr::Field { expr, .. }
|
||||||
| Expr::Await { expr }
|
| Expr::Await { expr }
|
||||||
| Expr::Try { expr }
|
| Expr::Try { expr }
|
||||||
|
@ -887,10 +895,14 @@ where
|
||||||
};
|
};
|
||||||
self.alloc_expr(Expr::Literal(lit), syntax_ptr)
|
self.alloc_expr(Expr::Literal(lit), syntax_ptr)
|
||||||
}
|
}
|
||||||
|
ast::ExprKind::IndexExpr(e) => {
|
||||||
|
let base = self.collect_expr_opt(e.base());
|
||||||
|
let index = self.collect_expr_opt(e.index());
|
||||||
|
self.alloc_expr(Expr::Index { base, index }, syntax_ptr)
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME implement HIR for these:
|
// FIXME implement HIR for these:
|
||||||
ast::ExprKind::Label(_e) => self.alloc_expr(Expr::Missing, syntax_ptr),
|
ast::ExprKind::Label(_e) => self.alloc_expr(Expr::Missing, syntax_ptr),
|
||||||
ast::ExprKind::IndexExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr),
|
|
||||||
ast::ExprKind::RangeExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr),
|
ast::ExprKind::RangeExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr),
|
||||||
ast::ExprKind::MacroCall(e) => {
|
ast::ExprKind::MacroCall(e) => {
|
||||||
let ast_id = self
|
let ast_id = self
|
||||||
|
|
|
@ -1279,6 +1279,12 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
}
|
}
|
||||||
_ => Ty::Unknown,
|
_ => Ty::Unknown,
|
||||||
},
|
},
|
||||||
|
Expr::Index { base, index } => {
|
||||||
|
let _base_ty = self.infer_expr(*base, &Expectation::none());
|
||||||
|
let _index_ty = self.infer_expr(*index, &Expectation::none());
|
||||||
|
// FIXME: use `std::ops::Index::Output` to figure out the real return type
|
||||||
|
Ty::Unknown
|
||||||
|
}
|
||||||
Expr::Tuple { exprs } => {
|
Expr::Tuple { exprs } => {
|
||||||
let mut ty_vec = Vec::with_capacity(exprs.len());
|
let mut ty_vec = Vec::with_capacity(exprs.len());
|
||||||
for arg in exprs.iter() {
|
for arg in exprs.iter() {
|
||||||
|
|
|
@ -2655,6 +2655,20 @@ fn test() -> u64 {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn indexing_arrays() {
|
||||||
|
assert_snapshot_matches!(
|
||||||
|
infer("fn main() { &mut [9][2]; }"),
|
||||||
|
@r###"
|
||||||
|
[10; 26) '{ &mut...[2]; }': ()
|
||||||
|
[12; 23) '&mut [9][2]': &mut {unknown}
|
||||||
|
[17; 20) '[9]': [i32;_]
|
||||||
|
[17; 23) '[9][2]': {unknown}
|
||||||
|
[18; 19) '9': i32
|
||||||
|
[21; 22) '2': i32"###
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn infer_macros_expanded() {
|
fn infer_macros_expanded() {
|
||||||
assert_snapshot_matches!(
|
assert_snapshot_matches!(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue