define more ast stuff
This commit is contained in:
		
							parent
							
								
									ab5a830f66
								
							
						
					
					
						commit
						7ca864d5a9
					
				| @ -15,6 +15,7 @@ export type StmtKind = | |||||||
|     | { tag: "let" } & LetStmt |     | { tag: "let" } & LetStmt | ||||||
|     | { tag: "return" } & ReturnStmt |     | { tag: "return" } & ReturnStmt | ||||||
|     | { tag: "break" } & BreakStmt |     | { tag: "break" } & BreakStmt | ||||||
|  |     | { tag: "continue" } | ||||||
|     | { tag: "assign" } & AssignStmt |     | { tag: "assign" } & AssignStmt | ||||||
|     | { tag: "expr" } & ExprStmt; |     | { tag: "expr" } & ExprStmt; | ||||||
| 
 | 
 | ||||||
| @ -53,25 +54,15 @@ export type ItemKind = | |||||||
|     | { tag: "struct" } & StructItem |     | { tag: "struct" } & StructItem | ||||||
|     | { tag: "fn" } & FnItem |     | { tag: "fn" } & FnItem | ||||||
|     | { tag: "use" } & UseItem |     | { tag: "use" } & UseItem | ||||||
|     | { tag: "static" } & StaticItem |  | ||||||
|     | { tag: "type_alias" } & TypeAliasItem; |     | { tag: "type_alias" } & TypeAliasItem; | ||||||
| 
 | 
 | ||||||
| export type ModBlockItem = { | export type ModBlockItem = { ident: Ident; stmts: Stmt[] }; | ||||||
|     ident: Ident; | export type ModFileItem = { ident: Ident; filePath: string }; | ||||||
|     stmts: Stmt[]; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export type ModFileItem = { |  | ||||||
|     ident: Ident; |  | ||||||
|     filePath: string; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export type EnumItem = { variants: Variant[] }; | export type EnumItem = { variants: Variant[] }; | ||||||
| export type StructItem = { data: VariantData }; | export type StructItem = { data: VariantData }; | ||||||
| export type FnItem = { _: 0 }; | export type FnItem = { _: 0 }; | ||||||
| export type UseItem = { _: 0 }; | export type UseItem = { _: 0 }; | ||||||
| export type StaticItem = { _: 0 }; | export type TypeAliasItem = { ty: Ty }; | ||||||
| export type TypeAliasItem = { _: 0 }; |  | ||||||
| 
 | 
 | ||||||
| export type Variant = { | export type Variant = { | ||||||
|     ident: Ident; |     ident: Ident; | ||||||
| @ -108,7 +99,78 @@ export type Expr = { | |||||||
| 
 | 
 | ||||||
| export type ExprKind = | export type ExprKind = | ||||||
|     | { tag: "error" } |     | { tag: "error" } | ||||||
|     | { tag: "ident" } & Ident; |     | { tag: "path" } & Path | ||||||
|  |     | { tag: "null" } | ||||||
|  |     | { tag: "int" } & IntExpr | ||||||
|  |     | { tag: "bool" } & BoolExpr | ||||||
|  |     | { tag: "string" } & StringExpr | ||||||
|  |     | { tag: "group" } & GroupExpr | ||||||
|  |     | { tag: "array" } & ArrayExpr | ||||||
|  |     | { tag: "repeat" } & RepeatExpr | ||||||
|  |     | { tag: "struct" } & StructExpr | ||||||
|  |     | { tag: "ref" } & RefExpr | ||||||
|  |     | { tag: "deref" } & DerefExpr | ||||||
|  |     | { tag: "elem" } & ElemExpr | ||||||
|  |     | { tag: "field" } & FieldExpr | ||||||
|  |     | { tag: "index" } & IndexExpr | ||||||
|  |     | { tag: "call" } & CallExpr | ||||||
|  |     | { tag: "unary" } & UnaryExpr | ||||||
|  |     | { tag: "binary" } & BinaryExpr | ||||||
|  |     | { tag: "block" } & Block | ||||||
|  |     | { tag: "if" } & IfExpr | ||||||
|  |     | { tag: "loop" } & LoopExpr | ||||||
|  |     | { tag: "while" } & WhileExpr | ||||||
|  |     | { tag: "for" } & ForExpr | ||||||
|  |     | { tag: "c_for" } & CForExpr; | ||||||
|  | 
 | ||||||
|  | export type IntExpr = { value: number }; | ||||||
|  | export type BoolExpr = { value: boolean }; | ||||||
|  | export type StringExpr = { value: string }; | ||||||
|  | export type GroupExpr = { expr: Expr }; | ||||||
|  | export type ArrayExpr = { exprs: Expr[] }; | ||||||
|  | export type RepeatExpr = { expr: Expr; length: Expr }; | ||||||
|  | export type StructExpr = { path?: Path; field: ExprField[] }; | ||||||
|  | export type RefExpr = { expr: Expr; refType: RefType; mut: boolean }; | ||||||
|  | export type DerefExpr = { expr: Expr }; | ||||||
|  | export type ElemExpr = { expr: Expr; elem: number }; | ||||||
|  | export type FieldExpr = { expr: Expr; ident: Ident }; | ||||||
|  | export type IndexExpr = { expr: Expr; index: Expr }; | ||||||
|  | export type CallExpr = { expr: Expr; args: Expr }; | ||||||
|  | export type UnaryExpr = { unaryType: UnaryType; expr: Expr }; | ||||||
|  | export type BinaryExpr = { unaryType: UnaryType; left: Expr; right: Expr }; | ||||||
|  | export type IfExpr = { cond: Expr; truthy: Block; falsy?: Block }; | ||||||
|  | export type LoopExpr = { body: Block }; | ||||||
|  | export type WhileExpr = { cond: Expr; body: Block }; | ||||||
|  | export type ForExpr = { pat: Pat; expr: Expr; body: Block }; | ||||||
|  | export type CForExpr = { decl?: Stmt; cond?: Expr; incr?: Stmt; body: Block }; | ||||||
|  | 
 | ||||||
|  | export type RefType = "ref" | "ptr"; | ||||||
|  | export type UnaryType = "not" | "-"; | ||||||
|  | export type BinaryType = | ||||||
|  |     | "+" | ||||||
|  |     | "*" | ||||||
|  |     | "==" | ||||||
|  |     | "-" | ||||||
|  |     | "/" | ||||||
|  |     | "!=" | ||||||
|  |     | "<" | ||||||
|  |     | ">" | ||||||
|  |     | "<=" | ||||||
|  |     | ">=" | ||||||
|  |     | "or" | ||||||
|  |     | "and"; | ||||||
|  | 
 | ||||||
|  | export type ExprField = { | ||||||
|  |     ident: Ident; | ||||||
|  |     expr: Expr; | ||||||
|  |     span: Span; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export type Block = { | ||||||
|  |     stmts: Stmt[]; | ||||||
|  |     expr?: Expr; | ||||||
|  |     span: Span; | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| export type Pat = { | export type Pat = { | ||||||
|     kind: PatKind; |     kind: PatKind; | ||||||
| @ -131,18 +193,19 @@ export type Ty = { | |||||||
| 
 | 
 | ||||||
| export type TyKind = | export type TyKind = | ||||||
|     | { tag: "error" } |     | { tag: "error" } | ||||||
|     | { tag: "ident" } & Ident |     | { tag: "path" } & Path | ||||||
|     | { tag: "ref" } & RefTy |     | { tag: "ref" } & RefTy | ||||||
|     | { tag: "ptr" } & PtrTy |     | { tag: "ptr" } & PtrTy | ||||||
|     | { tag: "slice" } & SliceTy |     | { tag: "slice" } & SliceTy | ||||||
|     | { tag: "array" } & ArrayTy; |     | { tag: "array" } & ArrayTy | ||||||
|  |     | { tag: "anon_struct" } & AnonStructTy; | ||||||
| 
 | 
 | ||||||
| export type RefTy = { ty: Ty; mut: boolean }; | export type RefTy = { ty: Ty; mut: boolean }; | ||||||
| export type PtrTy = { ty: Ty; mut: boolean }; | export type PtrTy = { ty: Ty; mut: boolean }; | ||||||
| export type SliceTy = { ty: Ty }; | export type SliceTy = { ty: Ty }; | ||||||
| export type ArrayTy = { ty: Ty; length: Expr }; | export type ArrayTy = { ty: Ty; length: Expr }; | ||||||
| export type TupleTy = { elems: Ty[] }; | export type TupleTy = { elems: Ty[] }; | ||||||
| export type StructTy = { fields: FieldDef[] }; | export type AnonStructTy = { fields: AnonFieldDef[] }; | ||||||
| 
 | 
 | ||||||
| export type AnonFieldDef = { | export type AnonFieldDef = { | ||||||
|     ident: Ident; |     ident: Ident; | ||||||
| @ -150,4 +213,18 @@ export type AnonFieldDef = { | |||||||
|     span: Span; |     span: Span; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export type Ident = { text: string; span: Span }; | export type Path = { | ||||||
|  |     segments: PathSegment[]; | ||||||
|  |     span: Span; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export type PathSegment = { | ||||||
|  |     ident: Ident; | ||||||
|  |     genericArgs?: Ty[]; | ||||||
|  |     span: Span; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export type Ident = { | ||||||
|  |     text: string; | ||||||
|  |     span: Span; | ||||||
|  | }; | ||||||
|  | |||||||
| @ -1,31 +1,53 @@ | |||||||
| import { exhausted } from "../util.ts"; | import { exhausted } from "../util.ts"; | ||||||
| import { | import { | ||||||
|  |     AnonStructTy, | ||||||
|  |     ArrayExpr, | ||||||
|     ArrayTy, |     ArrayTy, | ||||||
|     AssignStmt, |     AssignStmt, | ||||||
|  |     BinaryExpr, | ||||||
|     BindPat, |     BindPat, | ||||||
|  |     BoolExpr, | ||||||
|     BreakStmt, |     BreakStmt, | ||||||
|  |     CallExpr, | ||||||
|  |     CForExpr, | ||||||
|  |     DerefExpr, | ||||||
|  |     ElemExpr, | ||||||
|     EnumItem, |     EnumItem, | ||||||
|     Expr, |     Expr, | ||||||
|     ExprStmt, |     ExprStmt, | ||||||
|  |     FieldExpr, | ||||||
|     File, |     File, | ||||||
|     FnItem, |     FnItem, | ||||||
|  |     ForExpr, | ||||||
|  |     GroupExpr, | ||||||
|     Ident, |     Ident, | ||||||
|  |     IfExpr, | ||||||
|  |     IndexExpr, | ||||||
|  |     IntExpr, | ||||||
|     Item, |     Item, | ||||||
|     ItemStmt, |     ItemStmt, | ||||||
|     LetStmt, |     LetStmt, | ||||||
|  |     LoopExpr, | ||||||
|     ModBlockItem, |     ModBlockItem, | ||||||
|     ModFileItem, |     ModFileItem, | ||||||
|     Pat, |     Pat, | ||||||
|  |     Path, | ||||||
|     PtrTy, |     PtrTy, | ||||||
|  |     RefExpr, | ||||||
|     RefTy, |     RefTy, | ||||||
|  |     RepeatExpr, | ||||||
|     ReturnStmt, |     ReturnStmt, | ||||||
|     SliceTy, |     SliceTy, | ||||||
|     StaticItem, |  | ||||||
|     Stmt, |     Stmt, | ||||||
|  |     StringExpr, | ||||||
|  |     StructExpr, | ||||||
|     StructItem, |     StructItem, | ||||||
|  |     TupleTy, | ||||||
|     Ty, |     Ty, | ||||||
|     TypeAliasItem, |     TypeAliasItem, | ||||||
|  |     UnaryExpr, | ||||||
|     UseItem, |     UseItem, | ||||||
|  |     WhileExpr, | ||||||
| } from "./ast.ts"; | } from "./ast.ts"; | ||||||
| 
 | 
 | ||||||
| export type VisitRes = "stop" | void; | export type VisitRes = "stop" | void; | ||||||
| @ -37,14 +59,17 @@ export interface Visitor< | |||||||
|     P extends PM = [], |     P extends PM = [], | ||||||
| > { | > { | ||||||
|     visitFile?(file: File, ...p: P): R; |     visitFile?(file: File, ...p: P): R; | ||||||
|  | 
 | ||||||
|     visitStmt?(stmt: Stmt, ...p: P): R; |     visitStmt?(stmt: Stmt, ...p: P): R; | ||||||
|     visitErrorStmt?(stmt: Stmt, ...p: P): R; |     visitErrorStmt?(stmt: Stmt, ...p: P): R; | ||||||
|     visitItemStmt?(stmt: Stmt, kind: ItemStmt, ...p: P): R; |     visitItemStmt?(stmt: Stmt, kind: ItemStmt, ...p: P): R; | ||||||
|     visitLetStmt?(stmt: Stmt, kind: LetStmt, ...p: P): R; |     visitLetStmt?(stmt: Stmt, kind: LetStmt, ...p: P): R; | ||||||
|     visitReturnStmt?(stmt: Stmt, kind: ReturnStmt, ...p: P): R; |     visitReturnStmt?(stmt: Stmt, kind: ReturnStmt, ...p: P): R; | ||||||
|     visitBreakStmt?(stmt: Stmt, kind: BreakStmt, ...p: P): R; |     visitBreakStmt?(stmt: Stmt, kind: BreakStmt, ...p: P): R; | ||||||
|  |     visitContinueStmt?(stmt: Stmt, ...p: P): R; | ||||||
|     visitAssignStmt?(stmt: Stmt, kind: AssignStmt, ...p: P): R; |     visitAssignStmt?(stmt: Stmt, kind: AssignStmt, ...p: P): R; | ||||||
|     visitExprStmt?(stmt: Stmt, kind: ExprStmt, ...p: P): R; |     visitExprStmt?(stmt: Stmt, kind: ExprStmt, ...p: P): R; | ||||||
|  | 
 | ||||||
|     visitItem?(item: Item, ...p: P): R; |     visitItem?(item: Item, ...p: P): R; | ||||||
|     visitErrorItem?(item: Item, ...p: P): R; |     visitErrorItem?(item: Item, ...p: P): R; | ||||||
|     visitModBlockItem?(item: Item, kind: ModBlockItem, ...p: P): R; |     visitModBlockItem?(item: Item, kind: ModBlockItem, ...p: P): R; | ||||||
| @ -53,21 +78,48 @@ export interface Visitor< | |||||||
|     visitStructItem?(item: Item, kind: StructItem, ...p: P): R; |     visitStructItem?(item: Item, kind: StructItem, ...p: P): R; | ||||||
|     visitFnItem?(item: Item, kind: FnItem, ...p: P): R; |     visitFnItem?(item: Item, kind: FnItem, ...p: P): R; | ||||||
|     visitUseItem?(item: Item, kind: UseItem, ...p: P): R; |     visitUseItem?(item: Item, kind: UseItem, ...p: P): R; | ||||||
|     visitStaticItem?(item: Item, kind: StaticItem, ...p: P): R; |  | ||||||
|     visitTypeAliasItem?(item: Item, kind: TypeAliasItem, ...p: P): R; |     visitTypeAliasItem?(item: Item, kind: TypeAliasItem, ...p: P): R; | ||||||
|  | 
 | ||||||
|     visitExpr?(expr: Expr, ...p: P): R; |     visitExpr?(expr: Expr, ...p: P): R; | ||||||
|     visitErrorExpr?(expr: Expr, ...p: P): R; |     visitErrorExpr?(expr: Expr, ...p: P): R; | ||||||
|     visitIdentExpr?(expr: Expr, kind: Ident, ...p: P): R; |     visitPathExpr?(expr: Expr, kind: Path, ...p: P): R; | ||||||
|  |     visitNullExpr?(expr: Expr, ...p: P): R; | ||||||
|  |     visitIntExpr?(expr: Expr, kind: IntExpr, ...p: P): R; | ||||||
|  |     visitBoolExpr?(expr: Expr, kind: BoolExpr, ...p: P): R; | ||||||
|  |     visitStringExpr?(expr: Expr, kind: StringExpr, ...p: P): R; | ||||||
|  |     visitGroupExpr?(expr: Expr, kind: GroupExpr, ...p: P): R; | ||||||
|  |     visitArrayExpr?(expr: Expr, kind: ArrayExpr, ...p: P): R; | ||||||
|  |     visitRepeatExpr?(expr: Expr, kind: RepeatExpr, ...p: P): R; | ||||||
|  |     visitStructExpr?(expr: Expr, kind: StructExpr, ...p: P): R; | ||||||
|  |     visitRefExpr?(expr: Expr, kind: RefExpr, ...p: P): R; | ||||||
|  |     visitDerefExpr?(expr: Expr, kind: DerefExpr, ...p: P): R; | ||||||
|  |     visitElemExpr?(expr: Expr, kind: ElemExpr, ...p: P): R; | ||||||
|  |     visitFieldExpr?(expr: Expr, kind: FieldExpr, ...p: P): R; | ||||||
|  |     visitIndexExpr?(expr: Expr, kind: IndexExpr, ...p: P): R; | ||||||
|  |     visitCallExpr?(expr: Expr, kind: CallExpr, ...p: P): R; | ||||||
|  |     visitUnaryExpr?(expr: Expr, kind: UnaryExpr, ...p: P): R; | ||||||
|  |     visitBinaryExpr?(expr: Expr, kind: BinaryExpr, ...p: P): R; | ||||||
|  |     visitIfExpr?(expr: Expr, kind: IfExpr, ...p: P): R; | ||||||
|  |     visitLoopExpr?(expr: Expr, kind: LoopExpr, ...p: P): R; | ||||||
|  |     visitWhileExpr?(expr: Expr, kind: WhileExpr, ...p: P): R; | ||||||
|  |     visitForExpr?(expr: Expr, kind: ForExpr, ...p: P): R; | ||||||
|  |     visitCForExpr?(expr: Expr, kind: CForExpr, ...p: P): R; | ||||||
|  | 
 | ||||||
|     visitPat?(pat: Pat, ...p: P): R; |     visitPat?(pat: Pat, ...p: P): R; | ||||||
|     visitErrorPat?(pat: Pat, ...p: P): R; |     visitErrorPat?(pat: Pat, ...p: P): R; | ||||||
|     visitBindPat?(pat: Pat, kind: BindPat, ...p: P): R; |     visitBindPat?(pat: Pat, kind: BindPat, ...p: P): R; | ||||||
|  | 
 | ||||||
|     visitTy?(ty: Ty, ...p: P): R; |     visitTy?(ty: Ty, ...p: P): R; | ||||||
|     visitErrorTy?(ty: Ty, ...p: P): R; |     visitErrorTy?(ty: Ty, ...p: P): R; | ||||||
|     visitIdentTy?(ty: Ty, kind: Ident, ...p: P): R; |     visitPathTy?(ty: Ty, kind: Path, ...p: P): R; | ||||||
|     visitRefTy?(ty: Ty, kind: RefTy, ...p: P): R; |     visitRefTy?(ty: Ty, kind: RefTy, ...p: P): R; | ||||||
|     visitPtrTy?(ty: Ty, kind: PtrTy, ...p: P): R; |     visitPtrTy?(ty: Ty, kind: PtrTy, ...p: P): R; | ||||||
|     visitSliceTy?(ty: Ty, kind: SliceTy, ...p: P): R; |     visitSliceTy?(ty: Ty, kind: SliceTy, ...p: P): R; | ||||||
|     visitArrayTy?(ty: Ty, kind: ArrayTy, ...p: P): R; |     visitArrayTy?(ty: Ty, kind: ArrayTy, ...p: P): R; | ||||||
|  |     visitTupleTy?(ty: Ty, kind: TupleTy, ...p: P): R; | ||||||
|  |     visitAnonStructTy?(ty: Ty, kind: AnonStructTy, ...p: P): R; | ||||||
|  | 
 | ||||||
|  |     visitPath?(path: Path, ...p: P): R; | ||||||
|     visitIdent?(ident: Ident, ...p: P): R; |     visitIdent?(ident: Ident, ...p: P): R; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -118,6 +170,9 @@ export function visitStmt< | |||||||
|         case "break": |         case "break": | ||||||
|             if (v.visitBreakStmt?.(stmt, kind, ...p) === "stop") return; |             if (v.visitBreakStmt?.(stmt, kind, ...p) === "stop") return; | ||||||
|             return; |             return; | ||||||
|  |         case "continue": | ||||||
|  |             if (v.visitContinueStmt?.(stmt, ...p) === "stop") return; | ||||||
|  |             return; | ||||||
|         case "assign": |         case "assign": | ||||||
|             if (v.visitAssignStmt?.(stmt, kind, ...p) === "stop") return; |             if (v.visitAssignStmt?.(stmt, kind, ...p) === "stop") return; | ||||||
|             return; |             return; | ||||||
| @ -158,9 +213,6 @@ export function visitItem< | |||||||
|         case "use": |         case "use": | ||||||
|             if (v.visitUseItem?.(item, kind, ...p) === "stop") return; |             if (v.visitUseItem?.(item, kind, ...p) === "stop") return; | ||||||
|             return; |             return; | ||||||
|         case "static": |  | ||||||
|             if (v.visitStaticItem?.(item, kind, ...p) === "stop") return; |  | ||||||
|             return; |  | ||||||
|         case "type_alias": |         case "type_alias": | ||||||
|             if (v.visitTypeAliasItem?.(item, kind, ...p) === "stop") return; |             if (v.visitTypeAliasItem?.(item, kind, ...p) === "stop") return; | ||||||
|             return; |             return; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user