@@ -19,7 +19,7 @@ use crate::errors::{
1919 NeedPlusAfterTraitObjectLifetime , NestedCVariadicType , ReturnTypesUseThinArrow ,
2020} ;
2121use crate :: parser:: item:: FrontMatterParsingMode ;
22- use crate :: parser:: { FnContext , FnParseMode } ;
22+ use crate :: parser:: { ExpTokenPair , FnContext , FnParseMode } ;
2323use crate :: { exp, maybe_recover_from_interpolated_ty_qpath} ;
2424
2525/// Signals whether parsing a type should allow `+`.
@@ -768,6 +768,25 @@ impl<'a> Parser<'a> {
768768 self . bump_with ( ( dyn_tok, dyn_tok_sp) ) ;
769769 }
770770 let ty = self . parse_ty_no_plus ( ) ?;
771+ if self . token == TokenKind :: Dot && self . look_ahead ( 1 , |t| t. kind == TokenKind :: OpenBrace ) {
772+ // & [mut] <type> . { <fields> }
773+ // ^
774+ // we are here
775+ let view_start_span = self . token . span ;
776+ self . bump ( ) ;
777+ let fields = self
778+ . parse_delim_comma_seq (
779+ ExpTokenPair { tok : TokenKind :: OpenBrace , token_type : TokenType :: OpenBrace } ,
780+ ExpTokenPair { tok : TokenKind :: CloseBrace , token_type : TokenType :: CloseBrace } ,
781+ |p| p. parse_ident ( ) ,
782+ ) ?
783+ . 0 ;
784+ // FIXME(scrabsha): actually propagate field view in the AST.
785+ let _ = fields;
786+ let view_end_span = self . prev_token . span ;
787+ let span = view_start_span. to ( view_end_span) ;
788+ self . psess . gated_spans . gate ( sym:: view_types, span) ;
789+ }
771790 Ok ( match pinned {
772791 Pinnedness :: Not => TyKind :: Ref ( opt_lifetime, MutTy { ty, mutbl } ) ,
773792 Pinnedness :: Pinned => TyKind :: PinnedRef ( opt_lifetime, MutTy { ty, mutbl } ) ,
0 commit comments