From 4ba4e07b2485477ccd59c51c1d2d3b9f37fa1462 Mon Sep 17 00:00:00 2001 From: Chiri Vulpes Date: Tue, 12 Nov 2024 01:58:42 +1300 Subject: [PATCH] Fix #after resolving at the wrong time, add support for comma-separated selectors in #after --- src/chc/read/consume/body/bodySelectors.ts | 11 +++++++++-- src/chc/read/consume/macro/macroAfter.ts | 2 +- src/chc/write/ChiriCompiler.ts | 18 +++++++++--------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/chc/read/consume/body/bodySelectors.ts b/src/chc/read/consume/body/bodySelectors.ts index 3d3e7a9..442a79e 100644 --- a/src/chc/read/consume/body/bodySelectors.ts +++ b/src/chc/read/consume/body/bodySelectors.ts @@ -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 }) diff --git a/src/chc/read/consume/macro/macroAfter.ts b/src/chc/read/consume/macro/macroAfter.ts index d5c8c91..6e60c97 100644 --- a/src/chc/read/consume/macro/macroAfter.ts +++ b/src/chc/read/consume/macro/macroAfter.ts @@ -12,7 +12,7 @@ export default MacroConstruct("after") .consume(({ body, position }): ChiriAfter => { return { type: "after", - content: body, + content: body.flat(), position, } }) diff --git a/src/chc/write/ChiriCompiler.ts b/src/chc/write/ChiriCompiler.ts index db7cc5e..234d803 100644 --- a/src/chc/write/ChiriCompiler.ts +++ b/src/chc/write/ChiriCompiler.ts @@ -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 @@ -686,7 +693,7 @@ function ChiriCompiler (ast: ChiriAST, dest: string): ChiriCompiler { type: "compiled-component" selector: ChiriWord[] mixins: ChiriWord[] - after: ResolvedMixin[] + after: ChiriWord[] } interface ResolvedAfter { @@ -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")) {