diff --git a/src/chc/read/consume/consumeMacroUseOptional.ts b/src/chc/read/consume/consumeMacroUseOptional.ts index a3b3fc4..88d1f70 100644 --- a/src/chc/read/consume/consumeMacroUseOptional.ts +++ b/src/chc/read/consume/consumeMacroUseOptional.ts @@ -27,6 +27,7 @@ import macroContinue from "./macro/macroContinue" import macroDebug from "./macro/macroDebug" import type { ChiriDo } from "./macro/macroDo" import type { ChiriEach } from "./macro/macroEach" +import macroError from "./macro/macroError" import macroExport from "./macro/macroExport" import type { ChiriFontFace } from "./macro/macroFontFace" import macroFontFace from "./macro/macroFontFace" @@ -93,6 +94,7 @@ export default async function (reader: ChiriReader, ...args: any[]): Promise ({ + type: "macro-use", + name: { type: "word", value: "error", position: { file: "internal", line: 0, column: 0 } }, + assignments, + content: body, + position, + })) diff --git a/src/chc/write/ChiriCompiler.ts b/src/chc/write/ChiriCompiler.ts index 2e474e5..2c44ee1 100644 --- a/src/chc/write/ChiriCompiler.ts +++ b/src/chc/write/ChiriCompiler.ts @@ -18,6 +18,7 @@ import { ChiriType } from "../type/ChiriType" import ChiriTypeManager from "../type/ChiriTypeManager" import type { BodyVariableContext, BodyVariableContexts } from "../type/typeBody" import typeString from "../type/typeString" +import _ from "../util/_" import type { ComponentStateSpecial } from "../util/componentStates" import getFunctionParameters from "../util/getFunctionParameters" import relToCwd from "../util/relToCwd" @@ -1301,6 +1302,14 @@ function ChiriCompiler (ast: ChiriAST, dest: string): ChiriCompiler { logLine(statement.position, ansi.label + "debug" + (lines.length === 1 ? " - " : "") + ansi.reset + (lines.length <= 1 ? "" : "\n") + lines.join("\n"), false, false) return true } + case "error": { + const lines = compileStatements(statement.content, undefined, compileText) + const position = _ + ?? (!resolveExpression(compiler, statement.assignments.function) ? undefined : blocks.findLast(block => block.type === "function-call")?.position) + ?? (!resolveExpression(compiler, statement.assignments.macro) ? undefined : blocks.findLast(block => block.type === "macro-use")?.position) + ?? statement.position + throw error(position, (lines.length <= 1 ? "" : "\n") + lines.join("\n")) + } } const fn = getMacro(statement.name.value, statement.position)