Skip to content

Commit

Permalink
Fix #after resolving at the wrong time, add support for comma-separat…
Browse files Browse the repository at this point in the history
…ed selectors in #after
  • Loading branch information
ChiriVulpes committed Nov 11, 2024
1 parent 2c55f1d commit 4ba4e07
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 12 deletions.
11 changes: 9 additions & 2 deletions src/chc/read/consume/body/bodySelectors.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import consumeWhiteSpaceOptional from "../consumeWhiteSpaceOptional"
import consumeWordInterpolated from "../consumeWordInterpolated"
import type { ChiriWordInterpolated } from "../consumeWordInterpolatedOptional"
import BodyConsumer from "./BodyConsumer"

export default BodyConsumer("selectors", reader => {
reader.consume(".")
return consumeWordInterpolated(reader)
const selectors: ChiriWordInterpolated[] = []
do {
reader.consume(".")
selectors.push(consumeWordInterpolated(reader))
} while (reader.consumeOptional(",") && (consumeWhiteSpaceOptional(reader) || true))

return selectors
})
2 changes: 1 addition & 1 deletion src/chc/read/consume/macro/macroAfter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export default MacroConstruct("after")
.consume(({ body, position }): ChiriAfter => {
return {
type: "after",
content: body,
content: body.flat(),
position,
}
})
18 changes: 9 additions & 9 deletions src/chc/write/ChiriCompiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,13 @@ function ChiriCompiler (ast: ChiriAST, dest: string): ChiriCompiler {
for (const component of results) {
const registeredMixins: ResolvedMixin[] = []
const visited: ResolvedMixin[] = component.after
.flatMap(selector => {
const afterComponent = components[selector.value]
if (!afterComponent)
throw error(selector.position, `Component .${selector.value} has not been defined`)

return afterComponent.mixins
})
for (let i = 0; i < component.mixins.length; i++) {
const mixin = useMixin(getMixin(component.mixins[i].value, component.mixins[i].position), visited)
component.mixins[i] = mixin.name
Expand Down Expand Up @@ -686,7 +693,7 @@ function ChiriCompiler (ast: ChiriAST, dest: string): ChiriCompiler {
type: "compiled-component"
selector: ChiriWord[]
mixins: ChiriWord[]
after: ResolvedMixin[]
after: ChiriWord[]
}

interface ResolvedAfter {
Expand Down Expand Up @@ -718,14 +725,7 @@ function ChiriCompiler (ast: ChiriAST, dest: string): ChiriCompiler {
selector: selector.class,
mixins: content.filter(item => item.type === "word"),
after: content.filter(item => item.type === "compiled-after")
.flatMap(after => after.selectors)
.flatMap(selector => {
const afterComponent = components[selector.value]
if (!afterComponent)
throw error(selector.position, `Component .${selector.value} has not been defined`)

return afterComponent.mixins
}),
.flatMap(after => after.selectors),
}

if ((component.mixins.some(m => m.value === "before") && component.mixins.some(m => m.value === "after")) || component.mixins.some(m => m.value === "before-after")) {
Expand Down

0 comments on commit 4ba4e07

Please sign in to comment.