diff --git a/crates/oxc_transformer/src/es2022/class_properties/class.rs b/crates/oxc_transformer/src/es2022/class_properties/class.rs index 29ecfc1db963d..f77c6b204236d 100644 --- a/crates/oxc_transformer/src/es2022/class_properties/class.rs +++ b/crates/oxc_transformer/src/es2022/class_properties/class.rs @@ -444,9 +444,12 @@ impl<'a, 'ctx> ClassProperties<'a, 'ctx> { prop: &mut PropertyDefinition<'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 { - 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), }; diff --git a/crates/oxc_transformer/src/es2022/class_properties/mod.rs b/crates/oxc_transformer/src/es2022/class_properties/mod.rs index 9ad912c9a7d0e..f6dba6dae9fef 100644 --- a/crates/oxc_transformer/src/es2022/class_properties/mod.rs +++ b/crates/oxc_transformer/src/es2022/class_properties/mod.rs @@ -155,6 +155,7 @@ use crate::TransformCtx; mod class; mod constructor; mod private; +mod static_prop; mod utils; type FxIndexMap = IndexMap>; diff --git a/crates/oxc_transformer/src/es2022/class_properties/static_prop.rs b/crates/oxc_transformer/src/es2022/class_properties/static_prop.rs new file mode 100644 index 0000000000000..54e79d8f35c0a --- /dev/null +++ b/crates/oxc_transformer/src/es2022/class_properties/static_prop.rs @@ -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); + } +} diff --git a/tasks/transform_conformance/snapshots/babel.snap.md b/tasks/transform_conformance/snapshots/babel.snap.md index dda7a89cc0eef..a6492cb4f3e2e 100644 --- a/tasks/transform_conformance/snapshots/babel.snap.md +++ b/tasks/transform_conformance/snapshots/babel.snap.md @@ -1,6 +1,6 @@ commit: 54a8389f -Passed: 405/846 +Passed: 406/846 # All Passed: * babel-plugin-transform-class-static-block @@ -276,7 +276,7 @@ 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 x Output mismatch @@ -791,9 +791,6 @@ x Output mismatch * public/delete-super-property/input.js x Output mismatch -* public/delete-this/input.js -x Output mismatch - * public/derived-multiple-supers/input.js x Output mismatch diff --git a/tasks/transform_conformance/snapshots/babel_exec.snap.md b/tasks/transform_conformance/snapshots/babel_exec.snap.md index 651dd00bc91b3..fb90a454fe412 100644 --- a/tasks/transform_conformance/snapshots/babel_exec.snap.md +++ b/tasks/transform_conformance/snapshots/babel_exec.snap.md @@ -291,165 +291,20 @@ Received: "_Class" ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[57/98]⎯ 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: [Function A] + Received: -Object { - "__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 - 6| A.getA = () => this; - 7| const { self, getA } = A; - 8| expect(self).toBe(A); - | ^ - 9| expect(getA()).toBe(A); - 10| const oldA = A; +null + + ❯ fixtures/babel-plugin-transform-class-properties-test-fixtures-assumption-setPublicClassFields-static-this-exec.test.js:13:22 + 11| A = null; + 12| expect(oldA.self).toBe(oldA); + 13| expect(oldA.getA()).toBe(oldA); + | ^ + 14| }) ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[58/98]⎯ @@ -634,165 +489,20 @@ TypeError: e.has is not a function ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[70/98]⎯ 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: [Function A] + Received: -Object { - "__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 - 13| var _getA = { _: () => this }; - 14| const { self, getA } = A.extract(); - 15| expect(self).toBe(A); - | ^ - 16| expect(getA()).toBe(A); - 17| const oldA = A; +null + + ❯ fixtures/babel-plugin-transform-class-properties-test-fixtures-private-loose-static-this-exec.test.js:20:32 + 18| A = null; + 19| expect(oldA.extract().self).toBe(oldA); + 20| expect(oldA.extract().getA()).toBe(oldA); + | ^ + 21| }) ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[71/98]⎯ @@ -915,165 +625,20 @@ TypeError: e.has is not a function ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[80/98]⎯ 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: [Function A] + Received: -Object { - "__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 - 13| var _getA = { _: () => this }; - 14| const { self, getA } = A.extract(); - 15| expect(self).toBe(A); - | ^ - 16| expect(getA()).toBe(A); - 17| const oldA = A; +null + + ❯ fixtures/babel-plugin-transform-class-properties-test-fixtures-private-static-this-exec.test.js:20:32 + 18| A = null; + 19| expect(oldA.extract().self).toBe(oldA); + 20| expect(oldA.extract().getA()).toBe(oldA); + | ^ + 21| }) ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[81/98]⎯ @@ -1147,165 +712,20 @@ Received: "_Class" ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[85/98]⎯ 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: [Function A] + Received: -Object { - "__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 - 6| A.getA = () => this; - 7| const { self, getA } = A; - 8| expect(self).toBe(A); - | ^ - 9| expect(getA()).toBe(A); - 10| const oldA = A; +null + + ❯ fixtures/babel-plugin-transform-class-properties-test-fixtures-public-loose-static-this-exec.test.js:13:22 + 11| A = null; + 12| expect(oldA.self).toBe(oldA); + 13| expect(oldA.getA()).toBe(oldA); + | ^ + 14| }) ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[86/98]⎯ @@ -1343,165 +763,20 @@ Received: "_Class" ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[88/98]⎯ 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: [Function A] + Received: -Object { - "__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 - 7| _defineProperty(A, "getA", () => this); - 8| const { self, getA } = A; - 9| expect(self).toBe(A); - | ^ - 10| expect(getA()).toBe(A); - 11| const oldA = A; +null + + ❯ fixtures/babel-plugin-transform-class-properties-test-fixtures-public-static-this-exec.test.js:14:22 + 12| A = null; + 13| expect(oldA.self).toBe(oldA); + 14| expect(oldA.getA()).toBe(oldA); + | ^ + 15| }) ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[89/98]⎯