Skip to content

Commit 953b734

Browse files
committed
fix: handle inheritance in runtime class expressions.
1 parent fd5da85 commit 953b734

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

packages/glimmer-templates/src/ClassnamesHelperGenerator.ts

+18-7
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import {
2020
BooleanExpression,
2121
OrExpression,
2222
NotExpression,
23-
AndExpression
23+
AndExpression,
24+
BlockClass,
25+
Block
2426
} from "css-blocks";
2527
import {
2628
TemplateElement,
@@ -36,6 +38,7 @@ import {
3638
import {
3739
assertNever,
3840
unwrap,
41+
isSome,
3942
} from "@opticss/util";
4043

4144
const enum SourceExpression {
@@ -130,23 +133,31 @@ function constructTernary(classes: DynamicClasses<TernaryAST>, rewrite: IndexedC
130133
expr.push(classes.condition);
131134
// The true styles
132135
if (isTrueCondition(classes)) {
133-
expr.push(builders.number(classes.whenTrue.length));
134-
// TODO: inheritance
135-
expr.push(...classes.whenTrue.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
136+
let trueClasses = resolveInheritance(classes.whenTrue, rewrite);
137+
expr.push(builders.number(trueClasses.length));
138+
expr.push(...trueClasses.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
136139
} else {
137140
expr.push(builders.number(0));
138141
}
139142
// The false styles
140143
if (isFalseCondition(classes)) {
141-
expr.push(builders.number(classes.whenFalse.length));
142-
// TODO: inheritance
143-
expr.push(...classes.whenFalse.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
144+
let falseClasses = resolveInheritance(classes.whenFalse, rewrite);
145+
expr.push(builders.number(falseClasses.length));
146+
expr.push(...falseClasses.map(style => builders.number(unwrap(rewrite.indexOf(style)))));
144147
} else {
145148
expr.push(builders.number(0));
146149
}
147150
return expr;
148151
}
149152

153+
function resolveInheritance(classes: Array<BlockClass|Block>, rewrite: IndexedClassRewrite<BlockObject>) {
154+
let allClasses = [...classes];
155+
for (let c of classes) {
156+
allClasses.push(...c.resolveInheritance() as Set<Block> | Set<BlockClass>);
157+
}
158+
return allClasses.filter(c => isSome(rewrite.indexOf(c)));
159+
}
160+
150161
/*
151162
* if conditional type has a dependency:
152163
* 3/4: number (d) of style indexes this is dependent on.

0 commit comments

Comments
 (0)