stuff ig
This commit is contained in:
		
							parent
							
								
									b02c5e223f
								
							
						
					
					
						commit
						63d4406551
					
				| @ -7,6 +7,7 @@ import { | ||||
|     Span, | ||||
| } from "./diagnostics.ts"; | ||||
| import * as hir from "./middle/hir.ts"; | ||||
| import { Mod } from "./middle/res.ts"; | ||||
| 
 | ||||
| export class Ctx { | ||||
|     private fileIds = new Ids<File>(); | ||||
| @ -81,9 +82,9 @@ export class Ctx { | ||||
| 
 | ||||
|     //
 | ||||
| 
 | ||||
|     private hirIds = new Ids<hir.HirId>(); | ||||
|     private hirIds = new Ids<HirId>(); | ||||
| 
 | ||||
|     private stmts = new Map<Key<hir.HirId>, hir.Stmt>(); | ||||
|     private stmts = new Map<Key<HirId>, hir.Stmt>(); | ||||
| 
 | ||||
|     /// don't intern the same thing twice
 | ||||
|     public internStmt(kind: hir.StmtKind, span: Span): hir.Stmt { | ||||
| @ -93,7 +94,7 @@ export class Ctx { | ||||
|         return v; | ||||
|     } | ||||
| 
 | ||||
|     private exprs = new Map<Key<hir.HirId>, hir.Expr>(); | ||||
|     private exprs = new Map<Key<HirId>, hir.Expr>(); | ||||
| 
 | ||||
|     /// don't intern the same thing twice
 | ||||
|     public internExpr(kind: hir.ExprKind, span: Span): hir.Expr { | ||||
| @ -103,7 +104,7 @@ export class Ctx { | ||||
|         return v; | ||||
|     } | ||||
| 
 | ||||
|     private pats = new Map<Key<hir.HirId>, hir.Pat>(); | ||||
|     private pats = new Map<Key<HirId>, hir.Pat>(); | ||||
| 
 | ||||
|     /// don't intern the same thing twice
 | ||||
|     public internPat(kind: hir.PatKind, span: Span): hir.Pat { | ||||
| @ -113,7 +114,7 @@ export class Ctx { | ||||
|         return v; | ||||
|     } | ||||
| 
 | ||||
|     private tys = new Map<Key<hir.HirId>, hir.Ty>(); | ||||
|     private tys = new Map<Key<HirId>, hir.Ty>(); | ||||
| 
 | ||||
|     /// don't intern the same thing twice
 | ||||
|     public internTy(kind: hir.TyKind, span: Span): hir.Ty { | ||||
| @ -123,7 +124,7 @@ export class Ctx { | ||||
|         return v; | ||||
|     } | ||||
| 
 | ||||
|     private blocks = new Map<Key<hir.HirId>, hir.Block>(); | ||||
|     private blocks = new Map<Key<HirId>, hir.Block>(); | ||||
| 
 | ||||
|     /// don't intern the same thing twice
 | ||||
|     public internBlock(block: Omit<hir.Block, "id">): hir.Block { | ||||
| @ -135,20 +136,31 @@ export class Ctx { | ||||
| 
 | ||||
|     //
 | ||||
| 
 | ||||
|     private defIds = new Ids<hir.DefId>(); | ||||
|     private defIds = new Ids<DefId>(); | ||||
| 
 | ||||
|     private defs = new Map<Key<hir.DefId>, hir.HirId>(); | ||||
|     private defs = new Map<Key<DefId>, HirId>(); | ||||
| 
 | ||||
|     public addHirIdDef(hirId: hir.HirId): hir.DefId { | ||||
|     public addHirIdDef(hirId: HirId): DefId { | ||||
|         const id = this.defIds.nextThenStep(); | ||||
|         this.defs.set(idKey(id), hirId); | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public defHirId(id: hir.DefId): hir.HirId { | ||||
|     public defHirId(id: DefId): HirId { | ||||
|         return this.defs.get(idKey(id))!; | ||||
|     } | ||||
| 
 | ||||
|     private modDefs = new Map<Key<DefId>, Mod>(); | ||||
|     private modItemMaps = new Map<Key<DefId>, Map<Key<IdentId>, DefId>>(); | ||||
| 
 | ||||
|     public modDef(id: DefId): Mod { | ||||
|         return this.modDefs.get(idKey(id))!; | ||||
|     } | ||||
| 
 | ||||
|     public mod(id: DefId, ident: IdentId): DefId | undefined { | ||||
|         return this.modItemMaps.get(idKey(id))!.get(idKey(ident)); | ||||
|     } | ||||
| 
 | ||||
|     //
 | ||||
| 
 | ||||
|     public filePosLineText(file: File, pos: Pos): string { | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| export type { DefId, HirId } from "../ctx.ts"; | ||||
| import { HirId, IdentId } from "../ctx.ts"; | ||||
| import { Span } from "../diagnostics.ts"; | ||||
| import { Res } from "./rib.ts"; | ||||
| import { Res } from "./res.ts"; | ||||
| 
 | ||||
| export type Stmt = { | ||||
|     id: HirId; | ||||
| @ -261,6 +260,7 @@ export type QPath = | ||||
| 
 | ||||
| export type Path = { | ||||
|     segments: PathSegment[]; | ||||
|     res: Res; | ||||
|     span: Span; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -13,7 +13,8 @@ import { | ||||
|     Ty, | ||||
| } from "./hir.ts"; | ||||
| import { exhausted, Res as Result, todo } from "../util.ts"; | ||||
| import { Res, Rib } from "./rib.ts"; | ||||
| import { Rib } from "./rib.ts"; | ||||
| import { Res } from "./res.ts"; | ||||
| 
 | ||||
| export class AstLowerer { | ||||
|     private ribs: Rib[] = []; | ||||
| @ -292,6 +293,10 @@ export class AstLowerer { | ||||
| 
 | ||||
|     private lowerBlock(block: ast.Block): Block { | ||||
|         const point = this.ribPoint(); | ||||
|         this.pushRib({ | ||||
|             kind: { tag: "mod", mod: { kind: { tag: "block" } } }, | ||||
|             bindings: new Map(), | ||||
|         }); | ||||
|         const stmts = block.stmts.map((stmt) => this.lowerStmt(stmt)); | ||||
|         const expr = block.expr && this.lowerExpr(block.expr); | ||||
|         this.returnToRibPoint(point); | ||||
| @ -318,11 +323,10 @@ export class AstLowerer { | ||||
|                 }, | ||||
|             }; | ||||
|         } | ||||
|         const res = this.resolvePathSegs(path.segments); | ||||
|         const [res, segments] = this.resolvePathSegs(path.segments); | ||||
|         return { | ||||
|             path: { | ||||
|                 segments | ||||
|             } | ||||
|             tag: "resolved", | ||||
|             path: { segments, res, span: path.span }, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
| @ -330,28 +334,41 @@ export class AstLowerer { | ||||
|         if (segs.length <= 1) { | ||||
|             const seg = segs[0]; | ||||
|             const res = this.resolveTyIdent(seg.ident); | ||||
|             return [res, [{ident: seg.ident, res, genericArgs:seg.genericArgs && | ||||
|                         seg.genericArgs.map((ty) => this.lowerTy(ty)), inferArgs:  }]] | ||||
|             return [res, [{ | ||||
|                 ident: seg.ident, | ||||
|                 res, | ||||
|                 genericArgs: seg.genericArgs && | ||||
|                     seg.genericArgs.map((ty) => this.lowerTy(ty)), | ||||
|                 inferArgs: false, | ||||
|                 span: seg.span, | ||||
|             }]]; | ||||
|         } | ||||
|         const innerRes = this.resolvePathSegs(segs.slice(1)); | ||||
|         const seg = segs.at(-1)!; | ||||
|         const [innerRes, resSegs] = this.resolvePathSegs( | ||||
|             segs.slice(0, segs.length - 1), | ||||
|         ); | ||||
|         switch (innerRes.tag) { | ||||
|             case "error": | ||||
|                 return innerRes; | ||||
|                 return [innerRes, [...resSegs, { | ||||
|                     ident: seg.ident, | ||||
|                     res: innerRes, | ||||
|                     inferArgs: false, | ||||
|                     span: seg.span, | ||||
|                 }]]; | ||||
|             case "def": { | ||||
|                 const irk = innerRes.kind; | ||||
|                 switch (irk.tag) { | ||||
|                     case "mod": | ||||
|                     case "mod": { | ||||
|                         const mod = this.ctx.modDef(innerRes.id); | ||||
|                         const def = this.ctx.modItem(); | ||||
|                         return todo(); | ||||
|                     } | ||||
|                     case "struct": | ||||
|                         return todo(); | ||||
|                     case "enum": | ||||
|                         return todo(); | ||||
|                     case "variant": | ||||
|                         return todo(); | ||||
|                     case "ty_alias": | ||||
|                         return todo(); | ||||
|                     case "ty_param": | ||||
|                         return todo(); | ||||
|                     case "fn": | ||||
|                         return todo(); | ||||
|                     case "ctor": | ||||
| @ -362,7 +379,7 @@ export class AstLowerer { | ||||
|                         return todo(); | ||||
|                 } | ||||
|                 exhausted(irk); | ||||
|                 return todo(); | ||||
|                 throw new Error(); | ||||
|             } | ||||
|             case "local": | ||||
|                 throw new Error("should not be possible"); | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { DefId, HirId, IdentId } from "../ctx.ts"; | ||||
| import { Mod } from "../main.ts"; | ||||
| import { IdentId } from "../ctx.ts"; | ||||
| import { DefKind, Mod, Res } from "./res.ts"; | ||||
| 
 | ||||
| // https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/late/struct.Rib.html
 | ||||
| export type Rib = { | ||||
| @ -9,26 +9,13 @@ export type Rib = { | ||||
| 
 | ||||
| // https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/late/enum.RibKind.html
 | ||||
| export type RibKind = | ||||
|     /// No restriction needs to be applied.
 | ||||
|     | { tag: "normal" } | ||||
|     /// We passed through a function, closure or coroutine signature. Disallow labels.
 | ||||
|     | { tag: "fn" } | ||||
|     /// We passed through an item scope. Disallow upvars.
 | ||||
|     | { tag: "item"; defKind: DefKind } | ||||
|     | { tag: "mod"; mod: Mod }; | ||||
| 
 | ||||
| // https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/late/enum.RibKind.html
 | ||||
| export type Res = | ||||
|     | { tag: "error" } | ||||
|     | { tag: "def"; kind: DefKind; id: DefId } | ||||
|     | { tag: "local"; id: HirId }; | ||||
| 
 | ||||
| // https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def/enum.DefKind.html
 | ||||
| export type DefKind = | ||||
|     | { tag: "mod" } | ||||
|     | { tag: "struct" } | ||||
|     | { tag: "enum" } | ||||
|     | { tag: "variant" } | ||||
|     | { tag: "ty_alias" } | ||||
|     | { tag: "ty_param" } | ||||
|     | { tag: "fn" } | ||||
|     | { tag: "ctor" } | ||||
|     | { tag: "use" } | ||||
|     | { tag: "field" }; | ||||
|     /// We passed through a module.
 | ||||
|     | { tag: "mod"; mod: Mod } | ||||
|     /// We passed through a block (same as module, see Rust).
 | ||||
|     | { tag: "block" }; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user