fix(es/transforms/compat): Preserve more span (#2762)

swc_ecma_transforms_compat:
 - `async_to_generator`: Preserve more span. (Closes #2758)
This commit is contained in:
OJ Kwon 2021-11-16 04:50:51 -08:00 committed by GitHub
parent 262c8941a2
commit 2fb4e5a60c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 2 deletions

View File

@ -0,0 +1,5 @@
{
"jsc": {
"target": "es2015"
}
}

View File

@ -0,0 +1,6 @@
const obj = {
// A comment
async foo() {
console.log("Should work");
}
}

View File

@ -0,0 +1,37 @@
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function() {
var self = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
const obj = {
// A comment
foo () {
return _asyncToGenerator(function*() {
console.log("Should work");
})();
}
};

View File

@ -395,6 +395,14 @@ impl VisitMut for Actual {
let original_fn_params = prop.function.params.take();
let prop_method_span = prop.function.span;
let prop_method_body_span = if let Some(body) = &prop.function.body {
body.span
} else {
DUMMY_SP
};
prop.function.span = prop_method_body_span;
let fn_ref = make_fn_ref(
FnExpr {
ident: None,
@ -423,7 +431,7 @@ impl VisitMut for Actual {
prop.function = Function {
params: original_fn_params,
span: DUMMY_SP,
span: prop_method_span,
is_async: false,
is_generator: false,
body: Some(BlockStmt {

View File

@ -1,7 +1,7 @@
use swc_common::DUMMY_SP;
use swc_ecma_ast::*;
use swc_ecma_utils::{IdentExt, IsDirective};
use swc_ecma_visit::{as_folder, noop_fold_type, noop_visit_mut_type, Fold, VisitMut};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut};
pub fn export_namespace_from() -> impl Fold + VisitMut {
as_folder(ExportNamespaceFrom)