Skip to content

Commit dc501f0

Browse files
committed
fix: handle inheritance in runtime class expressions.
1 parent 5df7a7e commit dc501f0

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

packages/jsx-analyzer/src/transformer/classNameGenerator.ts

+18-7
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import {
1515
BooleanExpression,
1616
OrExpression,
1717
NotExpression,
18-
AndExpression
18+
AndExpression,
19+
BlockClass,
20+
Block
1921
} from 'css-blocks';
2022
import {
2123
JSXElementAnalysis,
@@ -31,6 +33,7 @@ import {
3133
import {
3234
assertNever,
3335
unwrap,
36+
isSome,
3437
} from '@opticss/util';
3538
import {
3639
arrayExpression,
@@ -142,23 +145,31 @@ function constructTernary(classes: DynamicClasses<TernaryAST>, rewrite: IndexedC
142145
expr.push(classes.condition);
143146
// The true styles
144147
if (isTrueCondition(classes)) {
145-
expr.push(builders.number(classes.whenTrue.length));
146-
// TODO: inheritance
147-
expr.push(...classes.whenTrue.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
148+
let trueClasses = resolveInheritance(classes.whenTrue, rewrite);
149+
expr.push(builders.number(trueClasses.length));
150+
expr.push(...trueClasses.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
148151
} else {
149152
expr.push(builders.number(0));
150153
}
151154
// The false styles
152155
if (isFalseCondition(classes)) {
153-
expr.push(builders.number(classes.whenFalse.length));
154-
// TODO: inheritance
155-
expr.push(...classes.whenFalse.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
156+
let falseClasses = resolveInheritance(classes.whenFalse, rewrite);
157+
expr.push(builders.number(falseClasses.length));
158+
expr.push(...falseClasses.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
156159
} else {
157160
expr.push(builders.number(0));
158161
}
159162
return expr;
160163
}
161164

165+
function resolveInheritance(classes: Array<BlockClass|Block>, rewrite: IndexedClassRewrite<BlockObject>) {
166+
let allClasses = [...classes];
167+
for (let c of classes) {
168+
allClasses.push(...c.resolveInheritance() as Set<Block> | Set<BlockClass>);
169+
}
170+
return allClasses.filter(c => isSome(rewrite.indexOf(c)));
171+
}
172+
162173
/*
163174
* if conditional type has a dependency:
164175
* 3/4: number (d) of style indexes this is dependent on.

0 commit comments

Comments
 (0)