feat: support punning in record updates
This commit is contained in:
		
							parent
							
								
									9ebc836b89
								
							
						
					
					
						commit
						85f839abe4
					
				| 
						 | 
					@ -573,18 +573,30 @@ pub fn expr_parser(
 | 
				
			||||||
                    .then(
 | 
					                    .then(
 | 
				
			||||||
                        just(Token::Comma)
 | 
					                        just(Token::Comma)
 | 
				
			||||||
                            .ignore_then(
 | 
					                            .ignore_then(
 | 
				
			||||||
                                select! { Token::Name {name} => name }
 | 
					                                choice((
 | 
				
			||||||
                                    .then_ignore(just(Token::Colon))
 | 
					                                    select! { Token::Name {name} => name }
 | 
				
			||||||
                                    .then(r.clone())
 | 
					                                        .then_ignore(just(Token::Colon))
 | 
				
			||||||
                                    .map_with_span(|(label, value), span| {
 | 
					                                        .then(r.clone())
 | 
				
			||||||
                                        ast::UntypedRecordUpdateArg {
 | 
					                                        .map_with_span(|(label, value), span| {
 | 
				
			||||||
                                            label,
 | 
					                                            ast::UntypedRecordUpdateArg {
 | 
				
			||||||
                                            value,
 | 
					                                                label,
 | 
				
			||||||
 | 
					                                                value,
 | 
				
			||||||
 | 
					                                                location: span,
 | 
				
			||||||
 | 
					                                            }
 | 
				
			||||||
 | 
					                                        }),
 | 
				
			||||||
 | 
					                                    select! {Token::Name {name} => name}.map_with_span(
 | 
				
			||||||
 | 
					                                        |name, span| ast::UntypedRecordUpdateArg {
 | 
				
			||||||
                                            location: span,
 | 
					                                            location: span,
 | 
				
			||||||
                                        }
 | 
					                                            value: expr::UntypedExpr::Var {
 | 
				
			||||||
                                    })
 | 
					                                                name: name.clone(),
 | 
				
			||||||
                                    .separated_by(just(Token::Comma))
 | 
					                                                location: span,
 | 
				
			||||||
                                    .allow_trailing(),
 | 
					                                            },
 | 
				
			||||||
 | 
					                                            label: name,
 | 
				
			||||||
 | 
					                                        },
 | 
				
			||||||
 | 
					                                    ),
 | 
				
			||||||
 | 
					                                ))
 | 
				
			||||||
 | 
					                                .separated_by(just(Token::Comma))
 | 
				
			||||||
 | 
					                                .allow_trailing(),
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            .or_not(),
 | 
					                            .or_not(),
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1177,7 +1177,7 @@ fn call() {
 | 
				
			||||||
fn record_update() {
 | 
					fn record_update() {
 | 
				
			||||||
    let code = indoc! {r#"
 | 
					    let code = indoc! {r#"
 | 
				
			||||||
        fn update_name(user: User, name: String) -> User {
 | 
					        fn update_name(user: User, name: String) -> User {
 | 
				
			||||||
          User { ..user, name: "Aiken", }
 | 
					          User { ..user, name: "Aiken", age }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    "#};
 | 
					    "#};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1215,7 +1215,7 @@ fn record_update() {
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            body: expr::UntypedExpr::RecordUpdate {
 | 
					            body: expr::UntypedExpr::RecordUpdate {
 | 
				
			||||||
                location: Span::new((), 53..84),
 | 
					                location: Span::new((), 53..88),
 | 
				
			||||||
                constructor: Box::new(expr::UntypedExpr::Var {
 | 
					                constructor: Box::new(expr::UntypedExpr::Var {
 | 
				
			||||||
                    location: Span::new((), 53..57),
 | 
					                    location: Span::new((), 53..57),
 | 
				
			||||||
                    name: "User".to_string(),
 | 
					                    name: "User".to_string(),
 | 
				
			||||||
| 
						 | 
					@ -1227,14 +1227,24 @@ fn record_update() {
 | 
				
			||||||
                    }),
 | 
					                    }),
 | 
				
			||||||
                    location: Span::new((), 60..66),
 | 
					                    location: Span::new((), 60..66),
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                arguments: vec![ast::UntypedRecordUpdateArg {
 | 
					                arguments: vec![
 | 
				
			||||||
                    label: "name".to_string(),
 | 
					                    ast::UntypedRecordUpdateArg {
 | 
				
			||||||
                    location: Span::new((), 68..81),
 | 
					                        label: "name".to_string(),
 | 
				
			||||||
                    value: expr::UntypedExpr::String {
 | 
					                        location: Span::new((), 68..81),
 | 
				
			||||||
                        location: Span::new((), 74..81),
 | 
					                        value: expr::UntypedExpr::String {
 | 
				
			||||||
                        value: "Aiken".to_string(),
 | 
					                            location: Span::new((), 74..81),
 | 
				
			||||||
 | 
					                            value: "Aiken".to_string(),
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                }],
 | 
					                    ast::UntypedRecordUpdateArg {
 | 
				
			||||||
 | 
					                        label: "age".to_string(),
 | 
				
			||||||
 | 
					                        location: Span::new((), 83..86),
 | 
				
			||||||
 | 
					                        value: expr::UntypedExpr::Var {
 | 
				
			||||||
 | 
					                            location: Span::new((), 83..86),
 | 
				
			||||||
 | 
					                            name: "age".to_string(),
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            doc: None,
 | 
					            doc: None,
 | 
				
			||||||
            location: Span::new((), 0..48),
 | 
					            location: Span::new((), 0..48),
 | 
				
			||||||
| 
						 | 
					@ -1247,7 +1257,7 @@ fn record_update() {
 | 
				
			||||||
                arguments: vec![],
 | 
					                arguments: vec![],
 | 
				
			||||||
            }),
 | 
					            }),
 | 
				
			||||||
            return_type: (),
 | 
					            return_type: (),
 | 
				
			||||||
            end_position: 85,
 | 
					            end_position: 89,
 | 
				
			||||||
        }),
 | 
					        }),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue