feat(tvix/eval): skip & warn for useless parenthesis
Change-Id: I567ca0682012b9d09f1217e57a104ac5671f8d82 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7771 Tested-by: BuildkiteCI Reviewed-by: raitobezarius <tvl@lahfa.xyz> Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
		
							parent
							
								
									aadf71a6ed
								
							
						
					
					
						commit
						87c80895cd
					
				
					 2 changed files with 32 additions and 0 deletions
				
			
		|  | @ -9,6 +9,7 @@ use ast::Expr; | ||||||
| pub(super) fn optimise_expr(c: &mut Compiler, slot: LocalIdx, expr: ast::Expr) -> ast::Expr { | pub(super) fn optimise_expr(c: &mut Compiler, slot: LocalIdx, expr: ast::Expr) -> ast::Expr { | ||||||
|     match expr { |     match expr { | ||||||
|         Expr::BinOp(_) => optimise_bin_op(c, slot, expr), |         Expr::BinOp(_) => optimise_bin_op(c, slot, expr), | ||||||
|  |         Expr::Paren(_) => optimise_paren(c, expr), | ||||||
|         _ => expr.to_owned(), |         _ => expr.to_owned(), | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -123,3 +124,28 @@ fn optimise_bin_op(c: &mut Compiler, slot: LocalIdx, expr: ast::Expr) -> ast::Ex | ||||||
| 
 | 
 | ||||||
|     expr |     expr | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /// Detect useless parenthesis around primitive expressions.
 | ||||||
|  | fn optimise_paren(c: &mut Compiler, expr: ast::Expr) -> ast::Expr { | ||||||
|  |     if let Expr::Paren(inner) = &expr { | ||||||
|  |         let inner = inner.expr().unwrap(); | ||||||
|  | 
 | ||||||
|  |         if let Expr::Paren(_) = &inner { | ||||||
|  |             c.emit_warning(&expr, WarningKind::UselessParens); | ||||||
|  |             return optimise_paren(c, inner); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if let Expr::Literal(_) | ||||||
|  |         | Expr::Str(_) | ||||||
|  |         | Expr::Select(_) | ||||||
|  |         | Expr::List(_) | ||||||
|  |         | Expr::AttrSet(_) | ||||||
|  |         | Expr::Ident(_) = &inner | ||||||
|  |         { | ||||||
|  |             c.emit_warning(&expr, WarningKind::UselessParens); | ||||||
|  |             return inner; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     expr | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -17,6 +17,7 @@ pub enum WarningKind { | ||||||
|     DeadCode, |     DeadCode, | ||||||
|     EmptyInherit, |     EmptyInherit, | ||||||
|     EmptyLet, |     EmptyLet, | ||||||
|  |     UselessParens, | ||||||
| 
 | 
 | ||||||
|     /// Tvix internal warning for features triggered by users that are
 |     /// Tvix internal warning for features triggered by users that are
 | ||||||
|     /// not actually implemented yet, but do not cause runtime failures.
 |     /// not actually implemented yet, but do not cause runtime failures.
 | ||||||
|  | @ -105,6 +106,10 @@ impl EvalWarning { | ||||||
|                 format!("this `let`-expression contains no bindings") |                 format!("this `let`-expression contains no bindings") | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             WarningKind::UselessParens => { | ||||||
|  |                 format!("these parenthesis can be removed") | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             WarningKind::NotImplemented(what) => { |             WarningKind::NotImplemented(what) => { | ||||||
|                 format!("feature not yet implemented in tvix: {}", what) |                 format!("feature not yet implemented in tvix: {}", what) | ||||||
|             } |             } | ||||||
|  | @ -125,6 +130,7 @@ impl EvalWarning { | ||||||
|             WarningKind::DeadCode => "W008", |             WarningKind::DeadCode => "W008", | ||||||
|             WarningKind::EmptyInherit => "W009", |             WarningKind::EmptyInherit => "W009", | ||||||
|             WarningKind::EmptyLet => "W010", |             WarningKind::EmptyLet => "W010", | ||||||
|  |             WarningKind::UselessParens => "W011", | ||||||
| 
 | 
 | ||||||
|             WarningKind::NotImplemented(_) => "W999", |             WarningKind::NotImplemented(_) => "W999", | ||||||
|         } |         } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue