11import std / [assertions, tables, parseutils]
2- import " ../../dist/nimony/src/lib" / [bitabs, nifreader, nifstreams, nifcursors, symparser]
3- import " .." / [ast, astalgo, idents, lineinfos, options, modulegraphs, msgs, pathutils]
2+ import " ../../dist/nimony/src/lib" / [bitabs, nifreader, nifstreams, nifcursors]
3+ import " .." / [ast, astalgo, idents, lineinfos, options, modules, modulegraphs, msgs, pathutils]
4+ import " ../../dist/nimony/src/gear2" / modnames
45import enum2nif
56
67type
@@ -47,6 +48,10 @@ proc splitNifSym(s: string): SplittedNifSym =
4748
4849proc fromNif (c: var DecodeContext ; n: var Cursor ): PNode
4950
51+ proc fromNifSymbol (c: var DecodeContext ; n: var Cursor ): PSym =
52+ result = c.nifSymToPSym[pool.syms[n.symId]]
53+ inc n
54+
5055proc fromNifSymDef (c: var DecodeContext ; n: var Cursor ; kind: TNodeKind ): PNode =
5156 assert n.nodeKind == nkSym
5257 let symKind = case kind:
@@ -61,20 +66,34 @@ proc fromNifSymDef(c: var DecodeContext; n: var Cursor; kind: TNodeKind): PNode
6166 assert symdef.name.len != 0
6267 let ident = c.graph.cache.getIdent (symdef.name)
6368 inc n
69+ assert n.kind == IntLit
70+ let itemId = pool.integers[n.intId].int32
71+ inc n
72+ assert n.kind in {Symbol , DotToken }, $ n.kind
73+ let owner = if n.kind == Symbol :
74+ fromNifSymbol (c, n)
75+ else :
76+ inc n
77+ nil
6478 assert n.kind in {Ident , DotToken }, $ n.kind
6579 let flags = if n.kind == Ident : pool.strings[n.litId].parseSymFlags else : {}
6680 inc n
67- var position = 0
68- if symKind == skModule:
69- assert n.kind == StringLit
70- let path = pool.strings[n.litId].AbsoluteFile
71- position = fileInfoIdx (c.graph.config, path).int
72- else :
73- assert n.kind == IntLit
74- position = pool.integers[n.intId]
81+ var position = if symKind == skModule:
82+ assert n.kind == StringLit
83+ let path = pool.strings[n.litId].AbsoluteFile
84+ fileInfoIdx (c.graph.config, path).int
85+ else :
86+ assert n.kind == IntLit
87+ pool.integers[n.intId]
7588 inc n
7689
77- let psym = PSym (itemId: ItemId (module: 0 , item: symdef.id.int32 ), kind: symKind, name: ident, flags: flags, position: position)
90+ var psym = PSym (itemId: ItemId (module: 0 , item: itemId),
91+ kind: symKind,
92+ name: ident,
93+ flags: flags,
94+ position: position,
95+ disamb: symdef.id.int32 )
96+ psym.setOwner (owner)
7897 result = newSymNode (psym)
7998 let hasSym = c.nifSymToPSym.hasKeyOrPut (nifSym, psym)
8099 assert not hasSym
@@ -113,9 +132,7 @@ proc fromNif(c: var DecodeContext; n: var Cursor): PNode =
113132 result = newIntTypeNode (pool.integers[n.intId], getSysType (tyInt))
114133 inc n
115134 of Symbol :
116- let sym = c.nifSymToPSym[pool.syms[n.symId]]
117- result = newSymNode (sym)
118- inc n
135+ result = newSymNode (fromNifSymbol (c, n))
119136 of ParLe :
120137 let kind = n.nodeKind
121138 case kind:
@@ -134,30 +151,36 @@ proc fromNif(c: var DecodeContext; n: var Cursor): PNode =
134151 else :
135152 assert false , " Not yet implemented " & $ n.kind
136153
137- proc loadNif (stream: var Stream ; graph: ModuleGraph ): PNode =
154+ proc loadNif (stream: var Stream ; modulePath: AbsoluteFile ; graph: ModuleGraph ): PNode =
138155 discard processDirectives (stream.r)
139156
140157 var buf = fromStream (stream)
141158 var n = beginRead (buf)
142159
143160 var c = DecodeContext (graph: graph)
161+
162+ let modSym = newModule (graph, fileInfoIdx (graph.config, modulePath))
163+ let modSuffix = moduleSuffix (modulePath.string , cast [seq [string ]](graph.config.searchPaths))
164+ let nifModSym = modSym.name.s & '.' & $ modSym.disamb & '.' & modSuffix
165+ c.nifSymToPSym[nifModSym] = modSym
166+
144167 result = fromNif (c, n)
145168
146169 endRead (buf)
147170
148171proc loadNifFile * (infile: AbsoluteFile ; graph: ModuleGraph ): PNode =
149172 var stream = nifstreams.open (infile.string )
150- result = loadNif (stream, graph)
173+ result = loadNif (stream, infile. changeFileExt ( " nim " ), graph)
151174 stream.close
152175
153- proc loadNifFromBuffer * (strbuf: sink string ; graph: ModuleGraph ): PNode =
176+ proc loadNifFromBuffer * (strbuf: sink string ; modulePath: AbsoluteFile ; graph: ModuleGraph ): PNode =
154177 var stream = nifstreams.openFromBuffer (strbuf)
155- result = loadNif (stream, graph)
178+ result = loadNif (stream, modulePath, graph)
156179
157180when isMainModule :
158181 import std/ cmdline
159182
160183 if paramCount () > 0 :
161184 var graph = newModuleGraph (newIdentCache (), newConfigRef ())
162- var node = loadNifFile (paramStr (1 ).AbsoluteFile , graph)
185+ var node = loadNifFile (paramStr (1 ).toAbsolute ( toAbsoluteDir ( " . " )) , graph)
163186 debug (node)
0 commit comments