fix: deoptimize slots when a directive is used

This commit is contained in:
Kael 2023-03-30 03:44:48 +11:00
parent 687be8aca8
commit 6365deb4b4

View File

@ -369,7 +369,18 @@ const transformJSXElement = (
const { optimize = false } = state.opts; const { optimize = false } = state.opts;
const slotFlag = path.getData('slotFlag') || SlotFlags.STABLE; // #541 - directives can't be resolved in optimized slots
// all parents should be deoptimized
if (directives.length) {
let currentPath = path;
while (currentPath.parentPath?.isJSXElement()) {
currentPath = currentPath.parentPath;
currentPath.setData('slotFlag', 0);
}
}
const slotFlag = path.getData('slotFlag') ?? SlotFlags.STABLE;
const optimizeSlots = optimize && slotFlag !== 0;
let VNodeChild; let VNodeChild;
if (children.length > 1 || slots) { if (children.length > 1 || slots) {
@ -390,7 +401,7 @@ const transformJSXElement = (
? (slots! as t.ObjectExpression).properties ? (slots! as t.ObjectExpression).properties
: [t.spreadElement(slots!)] : [t.spreadElement(slots!)]
) : []), ) : []),
optimize && t.objectProperty( optimizeSlots && t.objectProperty(
t.identifier('_'), t.identifier('_'),
t.numericLiteral(slotFlag), t.numericLiteral(slotFlag),
), ),
@ -408,7 +419,7 @@ const transformJSXElement = (
t.identifier('default'), t.identifier('default'),
t.arrowFunctionExpression([], t.arrayExpression(buildIIFE(path, [child]))), t.arrowFunctionExpression([], t.arrayExpression(buildIIFE(path, [child]))),
), ),
optimize && t.objectProperty( optimizeSlots && t.objectProperty(
t.identifier('_'), t.identifier('_'),
t.numericLiteral(slotFlag), t.numericLiteral(slotFlag),
) as any, ) as any,
@ -435,7 +446,7 @@ const transformJSXElement = (
t.objectProperty( t.objectProperty(
t.identifier('default'), t.identifier('default'),
t.arrowFunctionExpression([], t.arrayExpression(buildIIFE(path, [slotId]))), t.arrowFunctionExpression([], t.arrayExpression(buildIIFE(path, [slotId]))),
), optimize && t.objectProperty( ), optimizeSlots && t.objectProperty(
t.identifier('_'), t.identifier('_'),
t.numericLiteral(slotFlag), t.numericLiteral(slotFlag),
) as any, ) as any,
@ -463,7 +474,7 @@ const transformJSXElement = (
} else if (t.isObjectExpression(child)) { } else if (t.isObjectExpression(child)) {
VNodeChild = t.objectExpression([ VNodeChild = t.objectExpression([
...child.properties, ...child.properties,
optimize && t.objectProperty( optimizeSlots && t.objectProperty(
t.identifier('_'), t.identifier('_'),
t.numericLiteral(slotFlag), t.numericLiteral(slotFlag),
), ),