summaryrefslogtreecommitdiff
path: root/src/lang/ts-lang/core/parser.ts
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/lang/ts-lang/core/parser.ts
parent93992029bd349185d15de02e0f633e95c62695a9 (diff)
wip error handlingkai/errors
Diffstat (limited to 'src/lang/ts-lang/core/parser.ts')
-rw-r--r--src/lang/ts-lang/core/parser.ts30
1 files changed, 19 insertions, 11 deletions
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;