|
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