summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2025-11-09 13:29:28 -0800
committerKai Stevenson <kai@kaistevenson.com>2025-11-09 13:29:28 -0800
commit92cc395e2eee1e0d7e051775a795e5f83e45c5e9 (patch)
tree315d0a59f8f5d4d28ac7fce9d4e310e02e130193 /src
parent93992029bd349185d15de02e0f633e95c62695a9 (diff)
wip error handlingkai/errors
Diffstat (limited to 'src')
-rw-r--r--src/lang/ts-lang/core/common.ts5
-rw-r--r--src/lang/ts-lang/core/eval.ts17
-rw-r--r--src/lang/ts-lang/core/lexer.ts5
-rw-r--r--src/lang/ts-lang/core/parser.ts30
4 files changed, 38 insertions, 19 deletions
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<Message extends string = string> = {
+ __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<Message extends string> =
+ 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<T extends string> = `Eval error: ${T}`;
-
export type FindInStack<
Frame extends StackFrame,
NameToFind
@@ -168,8 +171,8 @@ export type GetEvaluatedChildren<
}
: never;
-export type Evaluate<Node extends ASTNode> = _Evaluate<
- Node,
- EmptyStackFrame,
- []
->;
+export type Evaluate<Node> = Node extends ASTNode
+ ? _Evaluate<Node, EmptyStackFrame, []>
+ : Node extends KSError<infer E>
+ ? E
+ : EvalError<`Cannot evaluate ${ToString<Node>}`>;
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<Message extends string = string> =
+ KSError<`Lexer error: ${Message}`>;
export type IsWhitespace<T extends string> = 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<T extends string> = ASTNode<
- NodeType.PARSER_ERROR,
- "Error",
- T,
- []
->;
+export type ParserError<Message extends string> =
+ KSError<`Parser error: ${Message}`>;
export type PushChild<Node extends ASTNode, Child extends ASTNode> = {
type: Node["type"];
@@ -129,7 +132,7 @@ export type _Parse<Ctx extends ParserCtx> = Ctx["remainingTokens"] extends [
remainingTokens: Tail;
stack: [...Ctx["stack"], ResolveNodeFromToken<Ctx["lastToken"]>];
}>
- : 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 extends ParserCtx> = 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<Raw extends readonly Token[]> = _Parse<{
lastToken: null;
remainingTokens: Raw;
stack: [ASTNode<NodeType.EXT, "arr", null, []>];
-}>;
+}> extends infer P
+ ? P extends ASTNode
+ ? P
+ : P extends KSError<infer E>
+ ? E
+ : never
+ : never;