diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-12-27 10:08:34 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-12-27 10:08:34 +0000 |
commit | 1d6dcef5c584d0dffdf5386eec993e41daad0210 (patch) | |
tree | 1e67675b7031115b1811863d0f186ad1f98b1fce /crates/ra_syntax/src/grammar | |
parent | 700165cf17290561dea511565278b9869ed61625 (diff) | |
parent | bc745a139674f289386f3081458793f756cab5b9 (diff) |
Merge #332
332: Struct types r=matklad a=flodiebold
Infer types for struct fields, and add basic field completions. There's also some code for enums, but I focused on getting structs working.
There's still ways to go before this becomes useful: There's no autoderef (or even reference types) and no inference for `self`, for example.
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/ra_syntax/src/grammar')
-rw-r--r-- | crates/ra_syntax/src/grammar/expressions.rs | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/crates/ra_syntax/src/grammar/expressions.rs b/crates/ra_syntax/src/grammar/expressions.rs index da78d85a2..2d1f17491 100644 --- a/crates/ra_syntax/src/grammar/expressions.rs +++ b/crates/ra_syntax/src/grammar/expressions.rs | |||
@@ -283,14 +283,10 @@ fn postfix_expr( | |||
283 | // } | 283 | // } |
284 | L_PAREN if allow_calls => call_expr(p, lhs), | 284 | L_PAREN if allow_calls => call_expr(p, lhs), |
285 | L_BRACK if allow_calls => index_expr(p, lhs), | 285 | L_BRACK if allow_calls => index_expr(p, lhs), |
286 | DOT if p.nth(1) == IDENT => { | 286 | DOT if p.nth(1) == IDENT && (p.nth(2) == L_PAREN || p.nth(2) == COLONCOLON) => { |
287 | if p.nth(2) == L_PAREN || p.nth(2) == COLONCOLON { | 287 | method_call_expr(p, lhs) |
288 | method_call_expr(p, lhs) | ||
289 | } else { | ||
290 | field_expr(p, lhs) | ||
291 | } | ||
292 | } | 288 | } |
293 | DOT if p.nth(1) == INT_NUMBER => field_expr(p, lhs), | 289 | DOT => field_expr(p, lhs), |
294 | // test postfix_range | 290 | // test postfix_range |
295 | // fn foo() { let x = 1..; } | 291 | // fn foo() { let x = 1..; } |
296 | DOTDOT | DOTDOTEQ if !EXPR_FIRST.contains(p.nth(1)) => { | 292 | DOTDOT | DOTDOTEQ if !EXPR_FIRST.contains(p.nth(1)) => { |
@@ -355,13 +351,15 @@ fn method_call_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { | |||
355 | // x.0.bar; | 351 | // x.0.bar; |
356 | // } | 352 | // } |
357 | fn field_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { | 353 | fn field_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { |
358 | assert!(p.at(DOT) && (p.nth(1) == IDENT || p.nth(1) == INT_NUMBER)); | 354 | assert!(p.at(DOT)); |
359 | let m = lhs.precede(p); | 355 | let m = lhs.precede(p); |
360 | p.bump(); | 356 | p.bump(); |
361 | if p.at(IDENT) { | 357 | if p.at(IDENT) { |
362 | name_ref(p) | 358 | name_ref(p) |
363 | } else { | 359 | } else if p.at(INT_NUMBER) { |
364 | p.bump() | 360 | p.bump() |
361 | } else { | ||
362 | p.error("expected field name or number") | ||
365 | } | 363 | } |
366 | m.complete(p, FIELD_EXPR) | 364 | m.complete(p, FIELD_EXPR) |
367 | } | 365 | } |