fix(transformer/class-properties): transform this in static prop initializers (#7481)

Convert `this` in static property initializers to reference to class name.

`class C { static prop = this; }` -> `class C {}; C.prop = C;`
This commit is contained in:
overlookmotel 2024-11-25 20:10:05 +00:00
parent d2745df3bc
commit 97de0b7be1
5 changed files with 163 additions and 772 deletions

View file

@ -444,9 +444,12 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> {
prop: &mut PropertyDefinition<'a>, prop: &mut PropertyDefinition<'a>,
ctx: &mut TraverseCtx<'a>, ctx: &mut TraverseCtx<'a>,
) { ) {
// Get value // Get value, and transform it to replace `this` with reference to class name
let value = match &mut prop.value { let value = match &mut prop.value {
Some(value) => ctx.ast.move_expression(value), Some(value) => {
self.transform_static_initializer(value, ctx);
ctx.ast.move_expression(value)
}
None => ctx.ast.void_0(SPAN), None => ctx.ast.void_0(SPAN),
}; };

View file

@ -155,6 +155,7 @@ use crate::TransformCtx;
mod class; mod class;
mod constructor; mod constructor;
mod private; mod private;
mod static_prop;
mod utils; mod utils;
type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<FxHasher>>; type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<FxHasher>>;

View file

@ -0,0 +1,115 @@
//! ES2022: Class Properties
//! Transform of static property initializers.
use oxc_ast::{
ast::*,
visit::{walk_mut, VisitMut},
};
use oxc_syntax::scope::ScopeFlags;
use oxc_traverse::{BoundIdentifier, TraverseCtx};
use super::{ClassName, ClassProperties};
impl<'a, 'ctx> ClassProperties<'a, 'ctx> {
/// Transform any `this` in static property initializer to reference to class name.
pub(super) fn transform_static_initializer(
&mut self,
value: &mut Expression<'a>,
ctx: &mut TraverseCtx<'a>,
) {
// TODO: Insert temp var if class binding is mutated.
let ClassName::Binding(class_name_binding) = &self.class_name else {
// Binding is initialized in 1st pass in `transform_class` when a static prop is found
unreachable!();
};
let mut replacer = StaticInitializerVisitor::new(class_name_binding, ctx);
replacer.visit_expression(value);
}
}
struct StaticInitializerVisitor<'a, 'v> {
class_name_binding: &'v BoundIdentifier<'a>,
ctx: &'v mut TraverseCtx<'a>,
}
impl<'a, 'v> StaticInitializerVisitor<'a, 'v> {
fn new(class_name_binding: &'v BoundIdentifier<'a>, ctx: &'v mut TraverseCtx<'a>) -> Self {
Self { class_name_binding, ctx }
}
}
impl<'a, 'v> VisitMut<'a> for StaticInitializerVisitor<'a, 'v> {
#[inline]
fn visit_expression(&mut self, expr: &mut Expression<'a>) {
match expr {
Expression::ThisExpression(this_expr) => {
let span = this_expr.span;
self.replace_this_with_class_name(expr, span);
return;
}
Expression::UnaryExpression(unary_expr) => {
if unary_expr.operator == UnaryOperator::Delete
&& matches!(&unary_expr.argument, Expression::ThisExpression(_))
{
let span = unary_expr.span;
self.replace_delete_this_with_true(expr, span);
return;
}
}
_ => {}
}
walk_mut::walk_expression(self, expr);
}
// Stop traversing where scope of current `this` ends
#[inline]
fn visit_function(&mut self, _func: &mut Function<'a>, _flags: ScopeFlags) {}
#[inline]
fn visit_static_block(&mut self, _block: &mut StaticBlock) {}
#[inline]
fn visit_ts_module_block(&mut self, _block: &mut TSModuleBlock<'a>) {}
#[inline]
fn visit_property_definition(&mut self, prop: &mut PropertyDefinition<'a>) {
// `this` in computed key of property or method refers to `this` of parent class.
// So visit computed `key`, but not `value`.
// ```js
// class Outer {
// static prop = class Inner { [this] = 1; };
// }
// ```
// Don't visit `type_annotation` field because can't contain `this`.
// TODO: Are decorators in scope?
self.visit_decorators(&mut prop.decorators);
if prop.computed {
self.visit_property_key(&mut prop.key);
}
}
#[inline]
fn visit_accessor_property(&mut self, prop: &mut AccessorProperty<'a>) {
// Visit computed `key` but not `value`, for same reasons as `visit_property_definition` above.
// TODO: Are decorators in scope?
self.visit_decorators(&mut prop.decorators);
if prop.computed {
self.visit_property_key(&mut prop.key);
}
}
}
impl<'a, 'v> StaticInitializerVisitor<'a, 'v> {
/// Replace `this` with reference to class name binding.
fn replace_this_with_class_name(&mut self, expr: &mut Expression<'a>, span: Span) {
*expr = self.class_name_binding.create_spanned_read_expression(span, self.ctx);
}
/// Replace `delete this` with `true`.
fn replace_delete_this_with_true(&self, expr: &mut Expression<'a>, span: Span) {
*expr = self.ctx.ast.expression_boolean_literal(span, true);
}
}

View file

@ -1,6 +1,6 @@
commit: 54a8389f commit: 54a8389f
Passed: 405/846 Passed: 406/846
# All Passed: # All Passed:
* babel-plugin-transform-class-static-block * babel-plugin-transform-class-static-block
@ -276,7 +276,7 @@ x Output mismatch
x Output mismatch x Output mismatch
# babel-plugin-transform-class-properties (78/264) # babel-plugin-transform-class-properties (79/264)
* assumption-constantSuper/complex-super-class/input.js * assumption-constantSuper/complex-super-class/input.js
x Output mismatch x Output mismatch
@ -791,9 +791,6 @@ x Output mismatch
* public/delete-super-property/input.js * public/delete-super-property/input.js
x Output mismatch x Output mismatch
* public/delete-this/input.js
x Output mismatch
* public/derived-multiple-supers/input.js * public/derived-multiple-supers/input.js
x Output mismatch x Output mismatch

View file

@ -291,165 +291,20 @@ Received: "_Class"
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[57/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[57/98]⎯
FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-this-exec.test.js > exec FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-this-exec.test.js > exec
AssertionError: expected { Object: [Function Object], …(133), …(6) } to be [Function A] // Object.is equality AssertionError: expected null to be [Function A] // Object.is equality
- Expected: - Expected:
[Function A] [Function A]
+ Received: + Received:
Object { null
"__vitest_environment__": "node",
"__vitest_required__": Object {
"timers": Object {
"_unrefActive": [Function deprecated],
"active": [Function deprecated],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"enroll": [Function deprecated],
"promises": Object {
"scheduler": Scheduler {
Symbol(kScheduler): true,
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"unenroll": [Function deprecated],
},
"util": Object {
"MIMEParams": [Function MIMEParams],
"MIMEType": [Function MIMEType],
"TextDecoder": [Function TextDecoder],
"TextEncoder": [Function TextEncoder],
"_errnoException": [Function _errnoException],
"_exceptionWithHostPort": [Function _exceptionWithHostPort],
"_extend": [Function deprecated],
"aborted": [Function aborted],
"callbackify": [Function callbackify],
"debug": [Function debuglog],
"debuglog": [Function debuglog],
"deprecate": [Function deprecate],
"format": [Function format],
"formatWithOptions": [Function formatWithOptions],
"getCallSite": [Function getCallSite],
"getSystemErrorMap": [Function getSystemErrorMap],
"getSystemErrorName": [Function getSystemErrorName],
"inherits": [Function inherits],
"inspect": [Function inspect],
"isArray": [Function deprecated],
"isBoolean": [Function deprecated],
"isBuffer": [Function deprecated],
"isDate": [Function deprecated],
"isDeepStrictEqual": [Function isDeepStrictEqual],
"isError": [Function deprecated],
"isFunction": [Function deprecated],
"isNull": [Function deprecated],
"isNullOrUndefined": [Function deprecated],
"isNumber": [Function deprecated],
"isObject": [Function deprecated],
"isPrimitive": [Function deprecated],
"isRegExp": [Function deprecated],
"isString": [Function deprecated],
"isSymbol": [Function deprecated],
"isUndefined": [Function deprecated],
"log": [Function deprecated],
"parseArgs": [Function parseArgs],
"parseEnv": [Function parseEnv],
"promisify": [Function promisify],
"stripVTControlCharacters": [Function stripVTControlCharacters],
"styleText": [Function styleText],
"toUSVString": [Function toUSVString],
"transferableAbortController": [Function transferableAbortController],
"transferableAbortSignal": [Function transferableAbortSignal],
"types": Object {
"isAnyArrayBuffer": [Function isAnyArrayBuffer],
"isArgumentsObject": [Function isArgumentsObject],
"isArrayBuffer": [Function isArrayBuffer],
"isArrayBufferView": [Function isView],
"isAsyncFunction": [Function isAsyncFunction],
"isBigInt64Array": [Function isBigInt64Array],
"isBigIntObject": [Function isBigIntObject],
"isBigUint64Array": [Function isBigUint64Array],
"isBooleanObject": [Function isBooleanObject],
"isBoxedPrimitive": [Function isBoxedPrimitive],
"isCryptoKey": [Function value],
"isDataView": [Function isDataView],
"isDate": [Function isDate],
"isExternal": [Function isExternal],
"isFloat32Array": [Function isFloat32Array],
"isFloat64Array": [Function isFloat64Array],
"isGeneratorFunction": [Function isGeneratorFunction],
"isGeneratorObject": [Function isGeneratorObject],
"isInt16Array": [Function isInt16Array],
"isInt32Array": [Function isInt32Array],
"isInt8Array": [Function isInt8Array],
"isKeyObject": [Function value],
"isMap": [Function isMap],
"isMapIterator": [Function isMapIterator],
"isModuleNamespaceObject": [Function isModuleNamespaceObject],
"isNativeError": [Function isNativeError],
"isNumberObject": [Function isNumberObject],
"isPromise": [Function isPromise],
"isProxy": [Function isProxy],
"isRegExp": [Function isRegExp],
"isSet": [Function isSet],
"isSetIterator": [Function isSetIterator],
"isSharedArrayBuffer": [Function isSharedArrayBuffer],
"isStringObject": [Function isStringObject],
"isSymbolObject": [Function isSymbolObject],
"isTypedArray": [Function isTypedArray],
"isUint16Array": [Function isUint16Array],
"isUint32Array": [Function isUint32Array],
"isUint8Array": [Function isUint8Array],
"isUint8ClampedArray": [Function isUint8ClampedArray],
"isWeakMap": [Function isWeakMap],
"isWeakSet": [Function isWeakSet],
},
},
},
"atob": [Function atob],
"btoa": [Function btoa],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"crypto": Crypto {},
"fetch": [Function fetch],
"global": [Circular],
"navigator": Navigator {},
"performance": Performance {
Symbol(kEvents): Map {},
Symbol(events.maxEventTargetListeners): 10,
Symbol(events.maxEventTargetListenersWarned): false,
Symbol(kHandlers): Map {},
Symbol(performance): true,
},
"queueMicrotask": [Function queueMicrotask],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"structuredClone": [Function structuredClone],
Symbol(vitest:SAFE_TIMERS): Object {
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"nextTick": [Function nextTick],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
}
fixtures/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-this-exec.test.js:8:15 fixtures/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-this-exec.test.js:13:22
6| A.getA = () => this; 11| A = null;
7| const { self, getA } = A; 12| expect(oldA.self).toBe(oldA);
8| expect(self).toBe(A); 13| expect(oldA.getA()).toBe(oldA);
| ^ | ^
9| expect(getA()).toBe(A); 14| })
10| const oldA = A;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[58/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[58/98]⎯
@ -634,165 +489,20 @@ TypeError: e.has is not a function
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[70/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[70/98]⎯
FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-this-exec.test.js > exec FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-this-exec.test.js > exec
AssertionError: expected { Object: [Function Object], …(133), …(6) } to be [Function A] // Object.is equality AssertionError: expected null to be [Function A] // Object.is equality
- Expected: - Expected:
[Function A] [Function A]
+ Received: + Received:
Object { null
"__vitest_environment__": "node",
"__vitest_required__": Object {
"timers": Object {
"_unrefActive": [Function deprecated],
"active": [Function deprecated],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"enroll": [Function deprecated],
"promises": Object {
"scheduler": Scheduler {
Symbol(kScheduler): true,
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"unenroll": [Function deprecated],
},
"util": Object {
"MIMEParams": [Function MIMEParams],
"MIMEType": [Function MIMEType],
"TextDecoder": [Function TextDecoder],
"TextEncoder": [Function TextEncoder],
"_errnoException": [Function _errnoException],
"_exceptionWithHostPort": [Function _exceptionWithHostPort],
"_extend": [Function deprecated],
"aborted": [Function aborted],
"callbackify": [Function callbackify],
"debug": [Function debuglog],
"debuglog": [Function debuglog],
"deprecate": [Function deprecate],
"format": [Function format],
"formatWithOptions": [Function formatWithOptions],
"getCallSite": [Function getCallSite],
"getSystemErrorMap": [Function getSystemErrorMap],
"getSystemErrorName": [Function getSystemErrorName],
"inherits": [Function inherits],
"inspect": [Function inspect],
"isArray": [Function deprecated],
"isBoolean": [Function deprecated],
"isBuffer": [Function deprecated],
"isDate": [Function deprecated],
"isDeepStrictEqual": [Function isDeepStrictEqual],
"isError": [Function deprecated],
"isFunction": [Function deprecated],
"isNull": [Function deprecated],
"isNullOrUndefined": [Function deprecated],
"isNumber": [Function deprecated],
"isObject": [Function deprecated],
"isPrimitive": [Function deprecated],
"isRegExp": [Function deprecated],
"isString": [Function deprecated],
"isSymbol": [Function deprecated],
"isUndefined": [Function deprecated],
"log": [Function deprecated],
"parseArgs": [Function parseArgs],
"parseEnv": [Function parseEnv],
"promisify": [Function promisify],
"stripVTControlCharacters": [Function stripVTControlCharacters],
"styleText": [Function styleText],
"toUSVString": [Function toUSVString],
"transferableAbortController": [Function transferableAbortController],
"transferableAbortSignal": [Function transferableAbortSignal],
"types": Object {
"isAnyArrayBuffer": [Function isAnyArrayBuffer],
"isArgumentsObject": [Function isArgumentsObject],
"isArrayBuffer": [Function isArrayBuffer],
"isArrayBufferView": [Function isView],
"isAsyncFunction": [Function isAsyncFunction],
"isBigInt64Array": [Function isBigInt64Array],
"isBigIntObject": [Function isBigIntObject],
"isBigUint64Array": [Function isBigUint64Array],
"isBooleanObject": [Function isBooleanObject],
"isBoxedPrimitive": [Function isBoxedPrimitive],
"isCryptoKey": [Function value],
"isDataView": [Function isDataView],
"isDate": [Function isDate],
"isExternal": [Function isExternal],
"isFloat32Array": [Function isFloat32Array],
"isFloat64Array": [Function isFloat64Array],
"isGeneratorFunction": [Function isGeneratorFunction],
"isGeneratorObject": [Function isGeneratorObject],
"isInt16Array": [Function isInt16Array],
"isInt32Array": [Function isInt32Array],
"isInt8Array": [Function isInt8Array],
"isKeyObject": [Function value],
"isMap": [Function isMap],
"isMapIterator": [Function isMapIterator],
"isModuleNamespaceObject": [Function isModuleNamespaceObject],
"isNativeError": [Function isNativeError],
"isNumberObject": [Function isNumberObject],
"isPromise": [Function isPromise],
"isProxy": [Function isProxy],
"isRegExp": [Function isRegExp],
"isSet": [Function isSet],
"isSetIterator": [Function isSetIterator],
"isSharedArrayBuffer": [Function isSharedArrayBuffer],
"isStringObject": [Function isStringObject],
"isSymbolObject": [Function isSymbolObject],
"isTypedArray": [Function isTypedArray],
"isUint16Array": [Function isUint16Array],
"isUint32Array": [Function isUint32Array],
"isUint8Array": [Function isUint8Array],
"isUint8ClampedArray": [Function isUint8ClampedArray],
"isWeakMap": [Function isWeakMap],
"isWeakSet": [Function isWeakSet],
},
},
},
"atob": [Function atob],
"btoa": [Function btoa],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"crypto": Crypto {},
"fetch": [Function fetch],
"global": [Circular],
"navigator": Navigator {},
"performance": Performance {
Symbol(kEvents): Map {},
Symbol(events.maxEventTargetListeners): 10,
Symbol(events.maxEventTargetListenersWarned): false,
Symbol(kHandlers): Map {},
Symbol(performance): true,
},
"queueMicrotask": [Function queueMicrotask],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"structuredClone": [Function structuredClone],
Symbol(vitest:SAFE_TIMERS): Object {
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"nextTick": [Function nextTick],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
}
fixtures/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-this-exec.test.js:15:15 fixtures/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-this-exec.test.js:20:32
13| var _getA = { _: () => this }; 18| A = null;
14| const { self, getA } = A.extract(); 19| expect(oldA.extract().self).toBe(oldA);
15| expect(self).toBe(A); 20| expect(oldA.extract().getA()).toBe(oldA);
| ^ | ^
16| expect(getA()).toBe(A); 21| })
17| const oldA = A;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[71/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[71/98]⎯
@ -915,165 +625,20 @@ TypeError: e.has is not a function
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[80/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[80/98]⎯
FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-private-static-this-exec.test.js > exec FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-private-static-this-exec.test.js > exec
AssertionError: expected { Object: [Function Object], …(133), …(6) } to be [Function A] // Object.is equality AssertionError: expected null to be [Function A] // Object.is equality
- Expected: - Expected:
[Function A] [Function A]
+ Received: + Received:
Object { null
"__vitest_environment__": "node",
"__vitest_required__": Object {
"timers": Object {
"_unrefActive": [Function deprecated],
"active": [Function deprecated],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"enroll": [Function deprecated],
"promises": Object {
"scheduler": Scheduler {
Symbol(kScheduler): true,
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"unenroll": [Function deprecated],
},
"util": Object {
"MIMEParams": [Function MIMEParams],
"MIMEType": [Function MIMEType],
"TextDecoder": [Function TextDecoder],
"TextEncoder": [Function TextEncoder],
"_errnoException": [Function _errnoException],
"_exceptionWithHostPort": [Function _exceptionWithHostPort],
"_extend": [Function deprecated],
"aborted": [Function aborted],
"callbackify": [Function callbackify],
"debug": [Function debuglog],
"debuglog": [Function debuglog],
"deprecate": [Function deprecate],
"format": [Function format],
"formatWithOptions": [Function formatWithOptions],
"getCallSite": [Function getCallSite],
"getSystemErrorMap": [Function getSystemErrorMap],
"getSystemErrorName": [Function getSystemErrorName],
"inherits": [Function inherits],
"inspect": [Function inspect],
"isArray": [Function deprecated],
"isBoolean": [Function deprecated],
"isBuffer": [Function deprecated],
"isDate": [Function deprecated],
"isDeepStrictEqual": [Function isDeepStrictEqual],
"isError": [Function deprecated],
"isFunction": [Function deprecated],
"isNull": [Function deprecated],
"isNullOrUndefined": [Function deprecated],
"isNumber": [Function deprecated],
"isObject": [Function deprecated],
"isPrimitive": [Function deprecated],
"isRegExp": [Function deprecated],
"isString": [Function deprecated],
"isSymbol": [Function deprecated],
"isUndefined": [Function deprecated],
"log": [Function deprecated],
"parseArgs": [Function parseArgs],
"parseEnv": [Function parseEnv],
"promisify": [Function promisify],
"stripVTControlCharacters": [Function stripVTControlCharacters],
"styleText": [Function styleText],
"toUSVString": [Function toUSVString],
"transferableAbortController": [Function transferableAbortController],
"transferableAbortSignal": [Function transferableAbortSignal],
"types": Object {
"isAnyArrayBuffer": [Function isAnyArrayBuffer],
"isArgumentsObject": [Function isArgumentsObject],
"isArrayBuffer": [Function isArrayBuffer],
"isArrayBufferView": [Function isView],
"isAsyncFunction": [Function isAsyncFunction],
"isBigInt64Array": [Function isBigInt64Array],
"isBigIntObject": [Function isBigIntObject],
"isBigUint64Array": [Function isBigUint64Array],
"isBooleanObject": [Function isBooleanObject],
"isBoxedPrimitive": [Function isBoxedPrimitive],
"isCryptoKey": [Function value],
"isDataView": [Function isDataView],
"isDate": [Function isDate],
"isExternal": [Function isExternal],
"isFloat32Array": [Function isFloat32Array],
"isFloat64Array": [Function isFloat64Array],
"isGeneratorFunction": [Function isGeneratorFunction],
"isGeneratorObject": [Function isGeneratorObject],
"isInt16Array": [Function isInt16Array],
"isInt32Array": [Function isInt32Array],
"isInt8Array": [Function isInt8Array],
"isKeyObject": [Function value],
"isMap": [Function isMap],
"isMapIterator": [Function isMapIterator],
"isModuleNamespaceObject": [Function isModuleNamespaceObject],
"isNativeError": [Function isNativeError],
"isNumberObject": [Function isNumberObject],
"isPromise": [Function isPromise],
"isProxy": [Function isProxy],
"isRegExp": [Function isRegExp],
"isSet": [Function isSet],
"isSetIterator": [Function isSetIterator],
"isSharedArrayBuffer": [Function isSharedArrayBuffer],
"isStringObject": [Function isStringObject],
"isSymbolObject": [Function isSymbolObject],
"isTypedArray": [Function isTypedArray],
"isUint16Array": [Function isUint16Array],
"isUint32Array": [Function isUint32Array],
"isUint8Array": [Function isUint8Array],
"isUint8ClampedArray": [Function isUint8ClampedArray],
"isWeakMap": [Function isWeakMap],
"isWeakSet": [Function isWeakSet],
},
},
},
"atob": [Function atob],
"btoa": [Function btoa],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"crypto": Crypto {},
"fetch": [Function fetch],
"global": [Circular],
"navigator": Navigator {},
"performance": Performance {
Symbol(kEvents): Map {},
Symbol(events.maxEventTargetListeners): 10,
Symbol(events.maxEventTargetListenersWarned): false,
Symbol(kHandlers): Map {},
Symbol(performance): true,
},
"queueMicrotask": [Function queueMicrotask],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"structuredClone": [Function structuredClone],
Symbol(vitest:SAFE_TIMERS): Object {
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"nextTick": [Function nextTick],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
}
fixtures/babel-plugin-transform-class-properties-test-fixtures-private-static-this-exec.test.js:15:15 fixtures/babel-plugin-transform-class-properties-test-fixtures-private-static-this-exec.test.js:20:32
13| var _getA = { _: () => this }; 18| A = null;
14| const { self, getA } = A.extract(); 19| expect(oldA.extract().self).toBe(oldA);
15| expect(self).toBe(A); 20| expect(oldA.extract().getA()).toBe(oldA);
| ^ | ^
16| expect(getA()).toBe(A); 21| })
17| const oldA = A;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[81/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[81/98]⎯
@ -1147,165 +712,20 @@ Received: "_Class"
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[85/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[85/98]⎯
FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-this-exec.test.js > exec FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-this-exec.test.js > exec
AssertionError: expected { Object: [Function Object], …(133), …(6) } to be [Function A] // Object.is equality AssertionError: expected null to be [Function A] // Object.is equality
- Expected: - Expected:
[Function A] [Function A]
+ Received: + Received:
Object { null
"__vitest_environment__": "node",
"__vitest_required__": Object {
"timers": Object {
"_unrefActive": [Function deprecated],
"active": [Function deprecated],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"enroll": [Function deprecated],
"promises": Object {
"scheduler": Scheduler {
Symbol(kScheduler): true,
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"unenroll": [Function deprecated],
},
"util": Object {
"MIMEParams": [Function MIMEParams],
"MIMEType": [Function MIMEType],
"TextDecoder": [Function TextDecoder],
"TextEncoder": [Function TextEncoder],
"_errnoException": [Function _errnoException],
"_exceptionWithHostPort": [Function _exceptionWithHostPort],
"_extend": [Function deprecated],
"aborted": [Function aborted],
"callbackify": [Function callbackify],
"debug": [Function debuglog],
"debuglog": [Function debuglog],
"deprecate": [Function deprecate],
"format": [Function format],
"formatWithOptions": [Function formatWithOptions],
"getCallSite": [Function getCallSite],
"getSystemErrorMap": [Function getSystemErrorMap],
"getSystemErrorName": [Function getSystemErrorName],
"inherits": [Function inherits],
"inspect": [Function inspect],
"isArray": [Function deprecated],
"isBoolean": [Function deprecated],
"isBuffer": [Function deprecated],
"isDate": [Function deprecated],
"isDeepStrictEqual": [Function isDeepStrictEqual],
"isError": [Function deprecated],
"isFunction": [Function deprecated],
"isNull": [Function deprecated],
"isNullOrUndefined": [Function deprecated],
"isNumber": [Function deprecated],
"isObject": [Function deprecated],
"isPrimitive": [Function deprecated],
"isRegExp": [Function deprecated],
"isString": [Function deprecated],
"isSymbol": [Function deprecated],
"isUndefined": [Function deprecated],
"log": [Function deprecated],
"parseArgs": [Function parseArgs],
"parseEnv": [Function parseEnv],
"promisify": [Function promisify],
"stripVTControlCharacters": [Function stripVTControlCharacters],
"styleText": [Function styleText],
"toUSVString": [Function toUSVString],
"transferableAbortController": [Function transferableAbortController],
"transferableAbortSignal": [Function transferableAbortSignal],
"types": Object {
"isAnyArrayBuffer": [Function isAnyArrayBuffer],
"isArgumentsObject": [Function isArgumentsObject],
"isArrayBuffer": [Function isArrayBuffer],
"isArrayBufferView": [Function isView],
"isAsyncFunction": [Function isAsyncFunction],
"isBigInt64Array": [Function isBigInt64Array],
"isBigIntObject": [Function isBigIntObject],
"isBigUint64Array": [Function isBigUint64Array],
"isBooleanObject": [Function isBooleanObject],
"isBoxedPrimitive": [Function isBoxedPrimitive],
"isCryptoKey": [Function value],
"isDataView": [Function isDataView],
"isDate": [Function isDate],
"isExternal": [Function isExternal],
"isFloat32Array": [Function isFloat32Array],
"isFloat64Array": [Function isFloat64Array],
"isGeneratorFunction": [Function isGeneratorFunction],
"isGeneratorObject": [Function isGeneratorObject],
"isInt16Array": [Function isInt16Array],
"isInt32Array": [Function isInt32Array],
"isInt8Array": [Function isInt8Array],
"isKeyObject": [Function value],
"isMap": [Function isMap],
"isMapIterator": [Function isMapIterator],
"isModuleNamespaceObject": [Function isModuleNamespaceObject],
"isNativeError": [Function isNativeError],
"isNumberObject": [Function isNumberObject],
"isPromise": [Function isPromise],
"isProxy": [Function isProxy],
"isRegExp": [Function isRegExp],
"isSet": [Function isSet],
"isSetIterator": [Function isSetIterator],
"isSharedArrayBuffer": [Function isSharedArrayBuffer],
"isStringObject": [Function isStringObject],
"isSymbolObject": [Function isSymbolObject],
"isTypedArray": [Function isTypedArray],
"isUint16Array": [Function isUint16Array],
"isUint32Array": [Function isUint32Array],
"isUint8Array": [Function isUint8Array],
"isUint8ClampedArray": [Function isUint8ClampedArray],
"isWeakMap": [Function isWeakMap],
"isWeakSet": [Function isWeakSet],
},
},
},
"atob": [Function atob],
"btoa": [Function btoa],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"crypto": Crypto {},
"fetch": [Function fetch],
"global": [Circular],
"navigator": Navigator {},
"performance": Performance {
Symbol(kEvents): Map {},
Symbol(events.maxEventTargetListeners): 10,
Symbol(events.maxEventTargetListenersWarned): false,
Symbol(kHandlers): Map {},
Symbol(performance): true,
},
"queueMicrotask": [Function queueMicrotask],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"structuredClone": [Function structuredClone],
Symbol(vitest:SAFE_TIMERS): Object {
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"nextTick": [Function nextTick],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
}
fixtures/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-this-exec.test.js:8:15 fixtures/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-this-exec.test.js:13:22
6| A.getA = () => this; 11| A = null;
7| const { self, getA } = A; 12| expect(oldA.self).toBe(oldA);
8| expect(self).toBe(A); 13| expect(oldA.getA()).toBe(oldA);
| ^ | ^
9| expect(getA()).toBe(A); 14| })
10| const oldA = A;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[86/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[86/98]⎯
@ -1343,165 +763,20 @@ Received: "_Class"
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[88/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[88/98]⎯
FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-public-static-this-exec.test.js > exec FAIL fixtures/babel-plugin-transform-class-properties-test-fixtures-public-static-this-exec.test.js > exec
AssertionError: expected { Object: [Function Object], …(133), …(6) } to be [Function A] // Object.is equality AssertionError: expected null to be [Function A] // Object.is equality
- Expected: - Expected:
[Function A] [Function A]
+ Received: + Received:
Object { null
"__vitest_environment__": "node",
"__vitest_required__": Object {
"timers": Object {
"_unrefActive": [Function deprecated],
"active": [Function deprecated],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"enroll": [Function deprecated],
"promises": Object {
"scheduler": Scheduler {
Symbol(kScheduler): true,
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"unenroll": [Function deprecated],
},
"util": Object {
"MIMEParams": [Function MIMEParams],
"MIMEType": [Function MIMEType],
"TextDecoder": [Function TextDecoder],
"TextEncoder": [Function TextEncoder],
"_errnoException": [Function _errnoException],
"_exceptionWithHostPort": [Function _exceptionWithHostPort],
"_extend": [Function deprecated],
"aborted": [Function aborted],
"callbackify": [Function callbackify],
"debug": [Function debuglog],
"debuglog": [Function debuglog],
"deprecate": [Function deprecate],
"format": [Function format],
"formatWithOptions": [Function formatWithOptions],
"getCallSite": [Function getCallSite],
"getSystemErrorMap": [Function getSystemErrorMap],
"getSystemErrorName": [Function getSystemErrorName],
"inherits": [Function inherits],
"inspect": [Function inspect],
"isArray": [Function deprecated],
"isBoolean": [Function deprecated],
"isBuffer": [Function deprecated],
"isDate": [Function deprecated],
"isDeepStrictEqual": [Function isDeepStrictEqual],
"isError": [Function deprecated],
"isFunction": [Function deprecated],
"isNull": [Function deprecated],
"isNullOrUndefined": [Function deprecated],
"isNumber": [Function deprecated],
"isObject": [Function deprecated],
"isPrimitive": [Function deprecated],
"isRegExp": [Function deprecated],
"isString": [Function deprecated],
"isSymbol": [Function deprecated],
"isUndefined": [Function deprecated],
"log": [Function deprecated],
"parseArgs": [Function parseArgs],
"parseEnv": [Function parseEnv],
"promisify": [Function promisify],
"stripVTControlCharacters": [Function stripVTControlCharacters],
"styleText": [Function styleText],
"toUSVString": [Function toUSVString],
"transferableAbortController": [Function transferableAbortController],
"transferableAbortSignal": [Function transferableAbortSignal],
"types": Object {
"isAnyArrayBuffer": [Function isAnyArrayBuffer],
"isArgumentsObject": [Function isArgumentsObject],
"isArrayBuffer": [Function isArrayBuffer],
"isArrayBufferView": [Function isView],
"isAsyncFunction": [Function isAsyncFunction],
"isBigInt64Array": [Function isBigInt64Array],
"isBigIntObject": [Function isBigIntObject],
"isBigUint64Array": [Function isBigUint64Array],
"isBooleanObject": [Function isBooleanObject],
"isBoxedPrimitive": [Function isBoxedPrimitive],
"isCryptoKey": [Function value],
"isDataView": [Function isDataView],
"isDate": [Function isDate],
"isExternal": [Function isExternal],
"isFloat32Array": [Function isFloat32Array],
"isFloat64Array": [Function isFloat64Array],
"isGeneratorFunction": [Function isGeneratorFunction],
"isGeneratorObject": [Function isGeneratorObject],
"isInt16Array": [Function isInt16Array],
"isInt32Array": [Function isInt32Array],
"isInt8Array": [Function isInt8Array],
"isKeyObject": [Function value],
"isMap": [Function isMap],
"isMapIterator": [Function isMapIterator],
"isModuleNamespaceObject": [Function isModuleNamespaceObject],
"isNativeError": [Function isNativeError],
"isNumberObject": [Function isNumberObject],
"isPromise": [Function isPromise],
"isProxy": [Function isProxy],
"isRegExp": [Function isRegExp],
"isSet": [Function isSet],
"isSetIterator": [Function isSetIterator],
"isSharedArrayBuffer": [Function isSharedArrayBuffer],
"isStringObject": [Function isStringObject],
"isSymbolObject": [Function isSymbolObject],
"isTypedArray": [Function isTypedArray],
"isUint16Array": [Function isUint16Array],
"isUint32Array": [Function isUint32Array],
"isUint8Array": [Function isUint8Array],
"isUint8ClampedArray": [Function isUint8ClampedArray],
"isWeakMap": [Function isWeakMap],
"isWeakSet": [Function isWeakSet],
},
},
},
"atob": [Function atob],
"btoa": [Function btoa],
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"crypto": Crypto {},
"fetch": [Function fetch],
"global": [Circular],
"navigator": Navigator {},
"performance": Performance {
Symbol(kEvents): Map {},
Symbol(events.maxEventTargetListeners): 10,
Symbol(events.maxEventTargetListenersWarned): false,
Symbol(kHandlers): Map {},
Symbol(performance): true,
},
"queueMicrotask": [Function queueMicrotask],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
"structuredClone": [Function structuredClone],
Symbol(vitest:SAFE_TIMERS): Object {
"clearImmediate": [Function clearImmediate],
"clearInterval": [Function clearInterval],
"clearTimeout": [Function clearTimeout],
"nextTick": [Function nextTick],
"setImmediate": [Function setImmediate],
"setInterval": [Function setInterval],
"setTimeout": [Function setTimeout],
},
}
fixtures/babel-plugin-transform-class-properties-test-fixtures-public-static-this-exec.test.js:9:15 fixtures/babel-plugin-transform-class-properties-test-fixtures-public-static-this-exec.test.js:14:22
7| _defineProperty(A, "getA", () => this); 12| A = null;
8| const { self, getA } = A; 13| expect(oldA.self).toBe(oldA);
9| expect(self).toBe(A); 14| expect(oldA.getA()).toBe(oldA);
| ^ | ^
10| expect(getA()).toBe(A); 15| })
11| const oldA = A;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[89/98]⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[89/98]⎯