More fixes to the import system and incremental compilation

This commit is contained in:
Mattia Giambirtone 2022-08-16 13:37:09 +02:00
parent 3636c74a6a
commit 9a19fad1ad
1 changed files with 10 additions and 3 deletions

View File

@ -2014,20 +2014,23 @@ proc compile*(self: Compiler, ast: seq[Declaration], file: string, lines: seq[tu
self.lines = lines self.lines = lines
self.source = source self.source = source
let pos = self.beginProgram(incremental) let pos = self.beginProgram(incremental)
if incremental: if incremental and self.replMode:
for i in countup(1, 2): for i in countup(1, 2):
discard self.chunk.code.pop() discard self.chunk.code.pop()
while not self.done(): while not self.done():
self.declaration(Declaration(self.step())) self.declaration(Declaration(self.step()))
self.terminateProgram(pos, terminateScope) self.terminateProgram(pos, terminateScope)
result = self.chunk result = self.chunk
if incremental and not self.replMode:
for i in countup(1, 2):
discard self.chunk.code.pop()
proc compileModule(self: Compiler, filename: string) = proc compileModule(self: Compiler, filename: string) =
## Compiles an imported module into an existing chunk. ## Compiles an imported module into an existing chunk.
## A temporary compiler object is initialized internally ## A temporary compiler object is initialized internally
let path = joinPath(splitPath(self.file).head, filename) let path = joinPath(splitPath(self.file).head, filename)
if self.modules.containsOrIncl(path): if self.modules.contains(path):
return return
var lexer = newLexer() var lexer = newLexer()
var parser = newParser() var parser = newParser()
@ -2038,6 +2041,10 @@ proc compileModule(self: Compiler, filename: string) =
let ast = parser.parse(tokens, filename, lexer.getLines(), source) let ast = parser.parse(tokens, filename, lexer.getLines(), source)
compiler.names.add(self.names[0]) compiler.names.add(self.names[0])
discard compiler.compile(ast, filename, lexer.getLines(), source, chunk=self.chunk, incremental=true) discard compiler.compile(ast, filename, lexer.getLines(), source, chunk=self.chunk, incremental=true)
self.names &= compiler.names for name in compiler.names:
if name.owner in self.modules:
continue
self.names.add(name)
self.modules.incl(path)
self.closedOver &= compiler.closedOver self.closedOver &= compiler.closedOver
compiler.endScope() compiler.endScope()