Skip to content

Commit 1e35e30

Browse files
authored
fixes local type decls by lifting them into top levels (#1175)
It lifts local type decls before hexer handling. In sem phases, every type decls have gotten a global name. All is left to do is to lift them to the top levels. It alleviates pain for hexer. e.g. in `collectMethods`, only top level type decls are handled. But vtable infos are still needed for inherited objects for display checking at least. It's better to lift them instead of special cases local type decls in the multiple hexer phases
1 parent 176a3cc commit 1e35e30

File tree

4 files changed

+77
-21
lines changed

4 files changed

+77
-21
lines changed

src/hexer/desugar.nim

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type
1313
thisModuleSuffix: string
1414
tempUseBufStack: seq[TokenBuf]
1515
activeChecks: set[CheckMode]
16+
pending: TokenBuf
1617

1718
proc declareTemp(c: var Context; dest: var TokenBuf; typ: Cursor; info: PackedLineInfo): SymId =
1819
let s = "`desugar." & $c.counter & "." & c.thisModuleSuffix
@@ -67,12 +68,12 @@ proc skipParRi(n: var Cursor) =
6768
else:
6869
bug "expected ')', but got: ", n
6970

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)
7172

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) =
7374
copyInto dest, n:
7475
while n.kind != ParRi:
75-
tr(c, dest, n)
76+
tr(c, dest, n, isTopScope)
7677

7778
proc trLocal(c: var Context; dest: var TokenBuf; n: var Cursor) =
7879
let kind = n.symKind
@@ -702,7 +703,7 @@ proc trExpr(c: var Context; dest: var TokenBuf; n: var Cursor) =
702703
skipParRi n
703704
dec nestedExpr
704705

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) =
706707
case n.kind
707708
of DotToken, UnknownToken, EofToken, Ident, Symbol, SymbolDef, IntLit, UIntLit, FloatLit, CharLit, StringLit:
708709
takeTree dest, n
@@ -734,15 +735,22 @@ proc tr(c: var Context; dest: var TokenBuf; n: var Cursor) =
734735
trLocal c, dest, n
735736
of ProcS, FuncS, MacroS, MethodS, ConverterS:
736737
trProc c, dest, n
737-
of IteratorS, TemplateS, TypeS, EmitS, BreakS, ContinueS,
738+
of IteratorS, TemplateS, EmitS, BreakS, ContinueS,
738739
ForS, CmdS, IncludeS, ImportS, FromimportS, ImportExceptS,
739740
ExportS, CommentS,
740741
PragmasS:
741742
takeTree dest, n
743+
of TypeS:
744+
if isTopScope:
745+
takeTree dest, n
746+
else:
747+
takeTree c.pending, n
742748
of ScopeS:
743749
c.typeCache.openScope()
744750
trSons(c, dest, n)
745751
c.typeCache.closeScope()
752+
of StmtsS:
753+
trSons(c, dest, n, isTopScope = isTopScope)
746754
else:
747755
trSons(c, dest, n)
748756
of SetConstrX:
@@ -770,9 +778,16 @@ proc tr(c: var Context; dest: var TokenBuf; n: var Cursor) =
770778
bug "unexpected ')' inside"
771779

772780
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())
774782
c.typeCache.openScope()
775783
result = createTokenBuf(300)
776784
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+
778793
c.typeCache.closeScope()

src/hexer/duplifier.nim

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -865,21 +865,9 @@ proc trDeref(c: var Context; n: var Cursor) =
865865
c.dest.addIntLit(0, info) # inheritance
866866
takeParRi c.dest, n
867867

868-
proc trTypeDecl(c: var Context; n: var Cursor) =
869-
var iter = n
870-
inc iter
871-
let symId = iter.symId
872-
var dest = createTokenBuf()
873-
takeTree(dest, n)
874-
c.dest.add dest
875-
if isLocalDecl(symId):
876-
publish(symId, dest)
877-
878868
proc tr(c: var Context; n: var Cursor; e: Expects) =
879869
if n.kind == Symbol:
880870
trLocation c, n, e
881-
elif n.stmtKind == TypeS:
882-
trTypeDecl c, n
883871
elif n.kind in {Ident, SymbolDef, IntLit, UIntLit, CharLit, StringLit, FloatLit, DotToken} or isDeclarative(n):
884872
takeTree c.dest, n
885873
else:

src/hexer/nifcgen.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1911,4 +1911,4 @@ proc expand*(infile: string; bits: int; flags: set[CheckMode]) =
19111911
c.closeMangleScope()
19121912

19131913
when isMainModule:
1914-
echo splitModulePath("/abc/def/name.4.nif")
1914+
echo splitModulePath("/abc/def/name.4.nif")

tests/nimony/object/tinheritance.nim

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,57 @@ let
1313

1414
# object construction:
1515
student = Student(name: "Anton", age: 5, id: 2)
16-
assert student.name == "Anton"
16+
assert student.name == "Anton"
17+
18+
19+
20+
type
21+
TestTestObj = object of RootObj
22+
id: int
23+
24+
var x = TestTestObj(id: 12)
25+
assert x.id == 12
26+
27+
28+
proc foo =
29+
type
30+
TestTestObj = object of RootObj
31+
id: int
32+
33+
var x = TestTestObj(id: 12)
34+
assert x.id == 12
35+
36+
block:
37+
type
38+
TestTestObj = object of RootObj
39+
id: int
40+
41+
var x = TestTestObj(id: 12)
42+
assert x.id == 12
43+
44+
block:
45+
type
46+
TestTestObj = object
47+
id: int
48+
49+
var x = TestTestObj(id: 12)
50+
assert x.id == 12
51+
52+
foo()
53+
54+
block:
55+
type
56+
TestTestObj = object of RootObj
57+
id: int
58+
59+
var x = TestTestObj(id: 12)
60+
assert x.id == 12
61+
62+
63+
block:
64+
type
65+
TestTestObj = object of RootObj
66+
id: int
67+
68+
var x = TestTestObj(id: 12)
69+
assert x.id == 12

0 commit comments

Comments
 (0)