From 92cc395e2eee1e0d7e051775a795e5f83e45c5e9 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sun, 9 Nov 2025 13:29:28 -0800 Subject: wip error handling --- src/lang/ts-lang/core/common.ts | 5 +++++ src/lang/ts-lang/core/eval.ts | 17 ++++++++++------- src/lang/ts-lang/core/lexer.ts | 5 ++++- src/lang/ts-lang/core/parser.ts | 30 +++++++++++++++++++----------- 4 files changed, 38 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/lang/ts-lang/core/common.ts b/src/lang/ts-lang/core/common.ts index 0287eec..8d08e05 100644 --- a/src/lang/ts-lang/core/common.ts +++ b/src/lang/ts-lang/core/common.ts @@ -68,3 +68,8 @@ export type MergeStackFrames< ? NewFrame["bindings"][K] : OldFrame["bindings"][K]; }>; + +export type KSError = { + __KS_ERROR: true; + message: Message; +}; diff --git a/src/lang/ts-lang/core/eval.ts b/src/lang/ts-lang/core/eval.ts index ebc58e7..fa11f3c 100644 --- a/src/lang/ts-lang/core/eval.ts +++ b/src/lang/ts-lang/core/eval.ts @@ -1,3 +1,4 @@ +import { AnySoaRecord } from "dns"; import { BUILTIN_Add, BUILTIN_Arr, @@ -13,11 +14,15 @@ import { ToString } from "../util"; import { ASTNode, EmptyStackFrame, + KSError, MergeStackFrames, NodeType, StackFrame, } from "./common"; +export type EvalError = + KSError<`Eval error: ${Message}`>; + export type RECURSION_DEPTH_LIMIT = 7; export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__"; @@ -51,8 +56,6 @@ export type MapBuiltins< : SENTINEL_NO_BUILTIN : never; -export type EvalError = `Eval error: ${T}`; - export type FindInStack< Frame extends StackFrame, NameToFind @@ -168,8 +171,8 @@ export type GetEvaluatedChildren< } : never; -export type Evaluate = _Evaluate< - Node, - EmptyStackFrame, - [] ->; +export type Evaluate = Node extends ASTNode + ? _Evaluate + : Node extends KSError + ? E + : EvalError<`Cannot evaluate ${ToString}`>; diff --git a/src/lang/ts-lang/core/lexer.ts b/src/lang/ts-lang/core/lexer.ts index bcd5785..71a63a6 100644 --- a/src/lang/ts-lang/core/lexer.ts +++ b/src/lang/ts-lang/core/lexer.ts @@ -1,4 +1,7 @@ -import { LexerCtx, Token, TokenType } from "./common"; +import { KSError, LexerCtx, Token, TokenType } from "./common"; + +export type LexerError = + KSError<`Lexer error: ${Message}`>; export type IsWhitespace = T extends `${TokenType.SPACE}` ? true diff --git a/src/lang/ts-lang/core/parser.ts b/src/lang/ts-lang/core/parser.ts index 3a497a2..fd40e63 100644 --- a/src/lang/ts-lang/core/parser.ts +++ b/src/lang/ts-lang/core/parser.ts @@ -1,11 +1,14 @@ -import { ASTNode, NodeType, ParserCtx, Token, TokenType } from "./common"; +import { + ASTNode, + KSError, + NodeType, + ParserCtx, + Token, + TokenType, +} from "./common"; -export type Error = ASTNode< - NodeType.PARSER_ERROR, - "Error", - T, - [] ->; +export type ParserError = + KSError<`Parser error: ${Message}`>; export type PushChild = { type: Node["type"]; @@ -129,7 +132,7 @@ export type _Parse = Ctx["remainingTokens"] extends [ remainingTokens: Tail; stack: [...Ctx["stack"], ResolveNodeFromToken]; }> - : Ctx & Error<`Was not expecting ${Head["type"]}`> + : ParserError<`Was not expecting ${Head["type"]}`> : // expect nextToken to be a name or close paren Head["type"] extends TokenType.NAME ? // lastToken = nextToken @@ -152,8 +155,7 @@ export type _Parse = Ctx["remainingTokens"] extends [ > >; }> - : Ctx & - Error<`Expected nextToken to be a name or close paren at ${Head["type"]}`> + : ParserError<`Expected nextToken to be a name or close paren at ${Head["type"]}`> : Ctx["lastToken"] extends Token ? // case where we ended with a name _Parse<{ @@ -170,4 +172,10 @@ export type Parse = _Parse<{ lastToken: null; remainingTokens: Raw; stack: [ASTNode]; -}>; +}> extends infer P + ? P extends ASTNode + ? P + : P extends KSError + ? E + : never + : never; -- cgit v1.2.3-70-g09d2