Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Draft
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
c1e72b9
WIP
addaleax Apr 2, 2024
e3af42a
fixup: VecDeque
addaleax Apr 3, 2024
ac0a79d
fixup: IIFE wrapping WIP
addaleax Apr 3, 2024
b1db86d
fixup: ...
addaleax Apr 4, 2024
dc08b18
fixup: Kevin’s suggestions
addaleax Apr 4, 2024
7ee0641
fixup: invert condition so the difference shows in CI perf tests
addaleax Apr 10, 2024
2a4996e
fixup: include compiled WASM in compile_ts
addaleax Apr 10, 2024
5d9ad16
fixup: Rust in CI ...
addaleax Apr 10, 2024
0af48ce
fixup: regenerate automatically created files after rebase
addaleax Mar 6, 2025
aaebeae
fixup: handle e.g. `function foo(a=1){}`
addaleax Mar 9, 2025
75a7ba4
WIP
addaleax Mar 10, 2025
4d31176
fixup: snapshot fix
addaleax Mar 11, 2025
fae056a
fixup: literal object keys work
addaleax Mar 11, 2025
dfce63f
fixup: template elements should not receive tags
addaleax Mar 23, 2025
e245d9d
fixup: account for typeof + parentheses
addaleax Mar 23, 2025
64878fb
fixup: set sync rv for arrow functions
addaleax Mar 24, 2025
1ec867e
fixup: handle for-of/in lvalues, labels
addaleax Mar 24, 2025
7d3a10d
fixup: handle bracketed call expressions
addaleax Mar 24, 2025
5e08699
fixup: slash merging
addaleax Mar 24, 2025
f394028
fixup: perf
addaleax Mar 24, 2025
7cad72b
fixup: unnecessary .iter()
addaleax Mar 25, 2025
96441cd
fixup: initialize immediately after class def
addaleax Mar 25, 2025
4a9a651
fixup: extend ; safeguarding
addaleax Mar 25, 2025
0426e16
fixup: more semicolon safeguards
addaleax Mar 25, 2025
1d3e357
fixup: Rust cleanups
addaleax Mar 31, 2025
20f3965
fixup: explicitly install wasm-pack
addaleax May 6, 2025
fb5dada
fixup: add rust executable variant
addaleax May 7, 2025
3dc6cd4
fixup: switch to oxc parser
addaleax May 7, 2025
1273afd
fixup: post-rewrite fixes
addaleax May 7, 2025
baf2755
fixup: `cargo fmt`
addaleax May 7, 2025
74b48d5
fixup: readability
addaleax May 8, 2025
0c167a9
fixup: fmt
addaleax May 8, 2025
288b40e
fixup: add c addon variant
addaleax May 8, 2025
482bc98
fixup: typo discovered during walkthrough :)
addaleax May 9, 2025
5470160
Merge remote-tracking branch 'origin/main' into async-rewriter3
addaleax Sep 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixup: VecDeque
  • Loading branch information
addaleax committed May 8, 2025
commit e3af42a7cfc287124adb5541ba7d4a4205fd99ad
45 changes: 24 additions & 21 deletions 45 packages/async-rewriter3/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::collections::VecDeque;
use wasm_bindgen::prelude::*;
use rslint_parser::{ast::{ArrowExpr, CallExpr, Expr, ExprOrBlock, FnDecl, FnExpr, ReturnStmt}, parse_text, AstNode, SyntaxNode, TextSize};

Expand Down Expand Up @@ -25,15 +26,15 @@ fn is_block(body: &ExprOrBlock) -> bool {
}
}

fn fn_start_insertion(body: &ExprOrBlock) -> Vec<Insertion> {
let mut ret = Vec::new();
fn fn_start_insertion(body: &ExprOrBlock) -> VecDeque<Insertion> {
let mut ret = VecDeque::new();
let mut offset = body.syntax().text_range().start();
if !is_block(body) {
ret.push(Insertion::new(offset, "{"));
ret.push_back(Insertion::new(offset, "{"));
} else {
offset = offset.checked_add(1.into()).unwrap();
}
ret.push(Insertion::new(offset, r#"
ret.push_back(Insertion::new(offset, r#"
const _syntheticPromise = Symbol.for('@@mongosh.syntheticPromise');

function _markSyntheticPromise(p) {
Expand All @@ -53,22 +54,22 @@ fn fn_start_insertion(body: &ExprOrBlock) -> Vec<Insertion> {
"#
));
if !is_block(body) {
ret.push(Insertion::new(
ret.push_back(Insertion::new(
offset,
"return ("
));
}
ret
}
fn fn_end_insertion(body: &ExprOrBlock) -> Vec<Insertion> {
let mut ret = Vec::new();
fn fn_end_insertion(body: &ExprOrBlock) -> VecDeque<Insertion> {
let mut ret = VecDeque::new();
let mut offset = body.syntax().text_range().end();
if is_block(body) {
offset = offset.checked_sub(1.into()).unwrap();
} else {
ret.push(Insertion::new(offset, ");"));
ret.push_back(Insertion::new(offset, ");"));
}
ret.push(Insertion::new(
ret.push_back(Insertion::new(
offset,
r#"
} catch (err) {
Expand Down Expand Up @@ -98,17 +99,18 @@ fn fn_end_insertion(body: &ExprOrBlock) -> Vec<Insertion> {
"#
));
if !is_block(body) {
ret.push(Insertion::new(offset, "}"));
ret.push_back(Insertion::new(offset, "}"));
}
ret
}

fn collect_insertions(node: &SyntaxNode, has_function_parent: bool) -> Vec<Insertion> {
fn collect_insertions(node: &SyntaxNode, nesting_depth: u32) -> VecDeque<Insertion> {
let is_function_node = FnExpr::can_cast(node.kind()) || FnDecl::can_cast(node.kind()) || ArrowExpr::can_cast(node.kind());
let mut insertions = Vec::new();
let has_function_parent = nesting_depth > 0;
let mut insertions = VecDeque::new();
for child in node.children() {
let range = child.text_range();
let child_insertions = &mut collect_insertions(&child, has_function_parent || is_function_node);
let child_insertions = &mut collect_insertions(&child, nesting_depth + if is_function_node { 1 } else { 0 });
if FnDecl::can_cast(child.kind()) {
let as_fn = FnDecl::cast(child).unwrap();
if as_fn.async_token().is_none() {
Expand All @@ -129,9 +131,9 @@ fn collect_insertions(node: &SyntaxNode, has_function_parent: bool) -> Vec<Inser
let mut is_dot_call_expression = false;
if has_function_parent {
if is_returned_expression {
insertions.push(Insertion::new(range.start(), "(_synchronousReturnValue = "));
insertions.push_back(Insertion::new(range.start(), "(_synchronousReturnValue = "));
}
insertions.push(Insertion::new(range.start(), "(_ex = "));
insertions.push_back(Insertion::new(range.start(), "(_ex = "));
}

match as_expr {
Expand All @@ -154,7 +156,7 @@ fn collect_insertions(node: &SyntaxNode, has_function_parent: bool) -> Vec<Inser
Expr::DotExpr(_) => {
if is_called_expression {
is_dot_call_expression = true;
insertions.pop();
insertions.pop_back();
}
insertions.append(child_insertions);
}
Expand All @@ -164,10 +166,10 @@ fn collect_insertions(node: &SyntaxNode, has_function_parent: bool) -> Vec<Inser
}
if has_function_parent {
if !is_dot_call_expression {
insertions.push(Insertion::new(range.end(), ", _isp(_ex) ? await _ex : _ex)"));
insertions.push_back(Insertion::new(range.end(), ", _isp(_ex) ? await _ex : _ex)"));
}
if is_returned_expression {
insertions.push(Insertion::new(
insertions.push_back(Insertion::new(
range.end(),
", _functionState === 'async' ? _synchronousReturnValue : null)"
));
Expand All @@ -182,13 +184,13 @@ fn collect_insertions(node: &SyntaxNode, has_function_parent: bool) -> Vec<Inser
#[wasm_bindgen]
pub fn async_rewrite(input: String, with_debug_tags: bool) -> String {
let parsed = parse_text(input.as_str(), 0);
let mut insertions = collect_insertions(&parsed.syntax(), false);
let mut insertions = collect_insertions(&parsed.syntax(), 0);
let mut i = 0;
for insertion in &mut insertions {
i += 1;
insertion.original_ordering = Some(i);
}
insertions.sort_by(|a, b| a.offset.cmp(&b.offset));
insertions.make_contiguous().sort_by(|a, b| a.offset.cmp(&b.offset));

let mut result = input.to_string();
let mut debug_tag = "".to_string();
Expand All @@ -197,7 +199,8 @@ pub fn async_rewrite(input: String, with_debug_tags: bool) -> String {
if with_debug_tags {
debug_tag = [
"/*i", insertion.original_ordering.unwrap().to_string().as_str(), "@",
u32::from(insertion.offset).to_string().as_str(), "*/"
u32::from(insertion.offset).to_string().as_str(),
if insertion.text.contains("/*") { "" } else { "*/" }
].concat();
}
result = [before, debug_tag.as_str(), insertion.text, debug_tag.as_str(), after].concat();
Expand Down
Morty Proxy This is a proxified and sanitized view of the page, visit original site.