|
13 | 13 | thisModuleSuffix: string |
14 | 14 | tempUseBufStack: seq[TokenBuf] |
15 | 15 | activeChecks: set[CheckMode] |
| 16 | + pending: TokenBuf |
16 | 17 |
|
17 | 18 | proc declareTemp(c: var Context; dest: var TokenBuf; typ: Cursor; info: PackedLineInfo): SymId = |
18 | 19 | let s = "`desugar." & $c.counter & "." & c.thisModuleSuffix |
@@ -67,12 +68,12 @@ proc skipParRi(n: var Cursor) = |
67 | 68 | else: |
68 | 69 | bug "expected ')', but got: ", n |
69 | 70 |
|
70 | | -proc tr(c: var Context; dest: var TokenBuf; n: var Cursor) |
| 71 | +proc tr(c: var Context; dest: var TokenBuf; n: var Cursor; isTopScope = false) |
71 | 72 |
|
72 | | -proc trSons(c: var Context; dest: var TokenBuf; n: var Cursor) = |
| 73 | +proc trSons(c: var Context; dest: var TokenBuf; n: var Cursor; isTopScope = false) = |
73 | 74 | copyInto dest, n: |
74 | 75 | while n.kind != ParRi: |
75 | | - tr(c, dest, n) |
| 76 | + tr(c, dest, n, isTopScope) |
76 | 77 |
|
77 | 78 | proc trLocal(c: var Context; dest: var TokenBuf; n: var Cursor) = |
78 | 79 | let kind = n.symKind |
@@ -702,7 +703,7 @@ proc trExpr(c: var Context; dest: var TokenBuf; n: var Cursor) = |
702 | 703 | skipParRi n |
703 | 704 | dec nestedExpr |
704 | 705 |
|
705 | | -proc tr(c: var Context; dest: var TokenBuf; n: var Cursor) = |
| 706 | +proc tr(c: var Context; dest: var TokenBuf; n: var Cursor; isTopScope = false) = |
706 | 707 | case n.kind |
707 | 708 | of DotToken, UnknownToken, EofToken, Ident, Symbol, SymbolDef, IntLit, UIntLit, FloatLit, CharLit, StringLit: |
708 | 709 | takeTree dest, n |
@@ -734,15 +735,22 @@ proc tr(c: var Context; dest: var TokenBuf; n: var Cursor) = |
734 | 735 | trLocal c, dest, n |
735 | 736 | of ProcS, FuncS, MacroS, MethodS, ConverterS: |
736 | 737 | trProc c, dest, n |
737 | | - of IteratorS, TemplateS, TypeS, EmitS, BreakS, ContinueS, |
| 738 | + of IteratorS, TemplateS, EmitS, BreakS, ContinueS, |
738 | 739 | ForS, CmdS, IncludeS, ImportS, FromimportS, ImportExceptS, |
739 | 740 | ExportS, CommentS, |
740 | 741 | PragmasS: |
741 | 742 | takeTree dest, n |
| 743 | + of TypeS: |
| 744 | + if isTopScope: |
| 745 | + takeTree dest, n |
| 746 | + else: |
| 747 | + takeTree c.pending, n |
742 | 748 | of ScopeS: |
743 | 749 | c.typeCache.openScope() |
744 | 750 | trSons(c, dest, n) |
745 | 751 | c.typeCache.closeScope() |
| 752 | + of StmtsS: |
| 753 | + trSons(c, dest, n, isTopScope = isTopScope) |
746 | 754 | else: |
747 | 755 | trSons(c, dest, n) |
748 | 756 | of SetConstrX: |
@@ -770,9 +778,16 @@ proc tr(c: var Context; dest: var TokenBuf; n: var Cursor) = |
770 | 778 | bug "unexpected ')' inside" |
771 | 779 |
|
772 | 780 | proc desugar*(n: Cursor; moduleSuffix: string; activeChecks: set[CheckMode]): TokenBuf = |
773 | | - var c = Context(counter: 0, typeCache: createTypeCache(), thisModuleSuffix: moduleSuffix, activeChecks: activeChecks) |
| 781 | + var c = Context(counter: 0, typeCache: createTypeCache(), thisModuleSuffix: moduleSuffix, activeChecks: activeChecks, pending: createTokenBuf()) |
774 | 782 | c.typeCache.openScope() |
775 | 783 | result = createTokenBuf(300) |
776 | 784 | var n = n |
777 | | - tr c, result, n |
| 785 | + tr c, result, n, isTopScope = true |
| 786 | + |
| 787 | + assert result[result.len-1].kind == ParRi |
| 788 | + shrink(result, result.len-1) |
| 789 | + |
| 790 | + result.add c.pending |
| 791 | + result.addParRi() |
| 792 | + |
778 | 793 | c.typeCache.closeScope() |
0 commit comments