|
1 | 1 | use std::{borrow::Borrow, collections::VecDeque, fmt::Debug}; |
2 | 2 | use wasm_bindgen::prelude::*; |
3 | | -use rslint_parser::{ast::{ArrowExpr, AssignExpr, BracketExpr, BreakStmt, CallExpr, ClassDecl, Constructor, ContinueStmt, DotExpr, Expr, ExprOrBlock, ExprStmt, FnDecl, FnExpr, ForStmtInit, GroupingExpr, Literal, Method, NameRef, ObjectPatternProp, ParameterList, Pattern, PropName, ReturnStmt, ThisExpr, UnaryExpr, VarDecl}, parse_text, AstNode, SyntaxKind, SyntaxNode, TextSize}; |
| 3 | +use rslint_parser::{ast::{ArrayExpr, ArrowExpr, AssignExpr, BinExpr, BracketExpr, BreakStmt, CallExpr, ClassDecl, ClassExpr, CondExpr, Constructor, ContinueStmt, DotExpr, Expr, ExprOrBlock, ExprStmt, FnDecl, FnExpr, ForStmtInit, GroupingExpr, Literal, Method, NameRef, NewExpr, NewTarget, ObjectExpr, ObjectPatternProp, ParameterList, Pattern, PropName, ReturnStmt, SequenceExpr, ThisExpr, UnaryExpr, VarDecl}, parse_text, AstNode, SyntaxKind, SyntaxNode, TextSize}; |
4 | 4 |
|
5 | 5 | #[derive(Debug)] |
6 | 6 | enum InsertionText { |
@@ -179,13 +179,25 @@ fn is_in_async_function(node: &SyntaxNode) -> bool { |
179 | 179 | if Constructor::can_cast(parent.kind()) { |
180 | 180 | return false; |
181 | 181 | } |
| 182 | + if ClassDecl::can_cast(parent.kind()) { |
| 183 | + return false; |
| 184 | + } |
| 185 | + if ClassExpr::can_cast(parent.kind()) { |
| 186 | + return false; |
| 187 | + } |
182 | 188 | assert!(!is_function_node(&parent)); |
183 | 189 | return is_in_async_function(&parent) |
184 | 190 | }); |
185 | 191 | } |
186 | 192 |
|
187 | 193 | fn is_function_node(node: &SyntaxNode) -> bool { |
188 | | - return FnExpr::can_cast(node.kind()) || FnDecl::can_cast(node.kind()) || ArrowExpr::can_cast(node.kind()) || Method::can_cast(node.kind()) || Constructor::can_cast(node.kind()); |
| 194 | + return FnExpr::can_cast(node.kind()) || |
| 195 | + FnDecl::can_cast(node.kind()) || |
| 196 | + ArrowExpr::can_cast(node.kind()) || |
| 197 | + Method::can_cast(node.kind()) || |
| 198 | + Constructor::can_cast(node.kind()) || |
| 199 | + ClassExpr::can_cast(node.kind()) || |
| 200 | + ClassDecl::can_cast(node.kind()); |
189 | 201 | } |
190 | 202 |
|
191 | 203 | fn add_all_variables_from_declaration(patterns: impl Iterator<Item = impl Borrow<Pattern>>) -> InsertionList { |
@@ -243,7 +255,11 @@ fn add_all_variables_from_declaration(patterns: impl Iterator<Item = impl Borrow |
243 | 255 | fn is_name_ref(syntax_node: &SyntaxNode, names: Option<&'static[&'static str]>) -> bool { |
244 | 256 | if !NameRef::can_cast(syntax_node.kind()) { |
245 | 257 | if GroupingExpr::can_cast(syntax_node.kind()) { |
246 | | - return is_name_ref(GroupingExpr::cast(syntax_node.clone()).unwrap().inner().unwrap().syntax(), names); |
| 258 | + let inner = GroupingExpr::cast(syntax_node.clone()).unwrap().inner(); |
| 259 | + if inner.is_none() { |
| 260 | + return false; |
| 261 | + } |
| 262 | + return is_name_ref(inner.unwrap().syntax(), names); |
247 | 263 | } |
248 | 264 | return false; |
249 | 265 | } |
@@ -321,6 +337,9 @@ fn collect_insertions(node: &SyntaxNode, nesting_depth: u32) -> InsertionList { |
321 | 337 | insertions.push_back(Insertion::new_dynamic(range.start(), |
322 | 338 | ["_cr = ", name.text().as_str(), " = "].concat() |
323 | 339 | )); |
| 340 | + insertions.push_back(Insertion::new(range.end(), |
| 341 | + ";" |
| 342 | + )); |
324 | 343 | insertions.add_variable(name.to_string()); |
325 | 344 | } |
326 | 345 | } |
@@ -386,17 +405,29 @@ fn collect_insertions(node: &SyntaxNode, nesting_depth: u32) -> InsertionList { |
386 | 405 | let is_argument_default_value = ParameterList::can_cast(as_expr.syntax().parent().unwrap().parent().unwrap().kind()); |
387 | 406 | let is_literal = Literal::can_cast(as_expr.syntax().kind()); |
388 | 407 | let is_label_in_continue_or_break = is_name_ref(as_expr.syntax(), None) && |
389 | | - ContinueStmt::can_cast(as_expr.syntax().parent().unwrap().kind()) || BreakStmt::can_cast(as_expr.syntax().parent().unwrap().kind()); |
| 408 | + ContinueStmt::can_cast(as_expr.syntax().parent().unwrap().kind()) || BreakStmt::can_cast(as_expr.syntax().parent().unwrap().kind()); |
390 | 409 | let is_for_in_of_lvalue = |
391 | | - ForStmtInit::can_cast(as_expr.syntax().parent().unwrap().kind()); |
| 410 | + ForStmtInit::can_cast(as_expr.syntax().parent().unwrap().kind()); |
| 411 | + let is_known_non_async_expr = |
| 412 | + ObjectExpr::can_cast(as_expr.syntax().kind()) || ArrayExpr::can_cast(as_expr.syntax().kind()) || |
| 413 | + UnaryExpr::can_cast(as_expr.syntax().kind()) || |
| 414 | + AssignExpr::can_cast(as_expr.syntax().kind()) || |
| 415 | + BinExpr::can_cast(as_expr.syntax().kind()) || |
| 416 | + CondExpr::can_cast(as_expr.syntax().kind()) || |
| 417 | + GroupingExpr::can_cast(as_expr.syntax().kind()) || |
| 418 | + SequenceExpr::can_cast(as_expr.syntax().kind()) || |
| 419 | + NewExpr::can_cast(as_expr.syntax().kind()) || |
| 420 | + NewTarget::can_cast(as_expr.syntax().kind()); |
392 | 421 | let wants_implicit_await_wrapper = |
393 | 422 | !is_lhs_of_assign_expr && |
394 | 423 | !is_argument_default_value && |
395 | 424 | !is_eval_this_super_reference && |
396 | 425 | !is_literal && |
397 | 426 | !is_label_in_continue_or_break && |
398 | 427 | !is_for_in_of_lvalue && |
399 | | - !is_dot_call_expression; |
| 428 | + !is_dot_call_expression && |
| 429 | + !is_known_non_async_expr && |
| 430 | + !is_function_node(as_expr.syntax()); |
400 | 431 |
|
401 | 432 | if is_named_typeof_rhs { |
402 | 433 | insertions.push_back(Insertion::new_dynamic(as_expr.syntax().parent().unwrap().text_range().start(), [ |
|
0 commit comments