Skip to content

Commit dfe42a8

Browse files
Ensure libraries are loaded before converting elements to concrete
1 parent e24a199 commit dfe42a8

File tree

1 file changed

+59
-13
lines changed

1 file changed

+59
-13
lines changed

engine/runtime-compiler/src/main/scala/org/enso/compiler/data/BindingsMap.scala

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.enso.compiler.pass.analyse.BindingAnalysis
1515
import org.enso.compiler.pass.resolve.MethodDefinitions
1616
import org.enso.persist.Persistance.Reference
1717
import org.enso.pkg.QualifiedName
18+
import org.enso.editions.LibraryName
1819

1920
import java.io.ObjectOutputStream
2021
import scala.annotation.unused
@@ -27,7 +28,7 @@ import scala.collection.mutable.ArrayBuffer
2728
*/
2829
case class BindingsMap(
2930
private val _definedEntities: List[DefinedEntity],
30-
private val _currentModule: ModuleReference
31+
private var _currentModule: ModuleReference
3132
) extends IRPass.IRMetadata {
3233
import BindingsMap._
3334

@@ -39,18 +40,33 @@ case class BindingsMap(
3940
*/
4041
private var _resolvedImports: List[ResolvedImport] = List()
4142

42-
def definedEntities: List[DefinedEntity] = _definedEntities
43-
def currentModule: ModuleReference = _currentModule
44-
def resolvedImports: List[ResolvedImport] = _resolvedImports
43+
def definedEntities: List[DefinedEntity] = {
44+
ensureConvertedToConcrete()
45+
_definedEntities
46+
}
47+
def currentModule: ModuleReference = {
48+
ensureConvertedToConcrete()
49+
_currentModule
50+
}
51+
def resolvedImports: List[ResolvedImport] = {
52+
ensureConvertedToConcrete()
53+
_resolvedImports
54+
}
4555
def resolvedImports_(v: List[ResolvedImport]): Unit = {
4656
_resolvedImports = v
4757
}
4858

59+
/** Set to non-null after deserialization to signal that conversion to concrete values is needed */
60+
private var pendingRepository: PackageRepository = null
61+
4962
/** Symbols exported by [[currentModule]].
5063
*/
5164
private var _exportedSymbols: Map[String, List[ResolvedName]] = Map()
5265

53-
def exportedSymbols: Map[String, List[ResolvedName]] = _exportedSymbols
66+
def exportedSymbols: Map[String, List[ResolvedName]] = {
67+
ensureConvertedToConcrete()
68+
_exportedSymbols
69+
}
5470
def exportedSymbols_(v: Map[String, List[ResolvedName]]): Unit = {
5571
_exportedSymbols = v
5672
}
@@ -66,8 +82,8 @@ case class BindingsMap(
6682
override def restoreFromSerialization(
6783
compiler: Compiler
6884
): Option[BindingsMap] = {
69-
val packageRepository = compiler.getPackageRepository
70-
this.toConcrete(packageRepository.getModuleMap)
85+
this.pendingRepository = compiler.getPackageRepository
86+
Some(this)
7187
}
7288

7389
/** Convert this [[BindingsMap]] instance to use abstract module references.
@@ -89,15 +105,45 @@ case class BindingsMap(
89105
* instances
90106
* @return `this` with module references converted to concrete
91107
*/
92-
private def toConcrete(moduleMap: ModuleMap): Option[BindingsMap] = {
93-
val newMap = this.currentModule.toConcrete(moduleMap).map { module =>
94-
this.copy(_currentModule = module)
108+
private def ensureConvertedToConcrete(): Option[BindingsMap] = {
109+
val r = pendingRepository
110+
if (r != null) {
111+
val res = toConcrete(r, r.getModuleMap).map { b =>
112+
pendingRepository = null
113+
this._currentModule = b._currentModule
114+
this._exportedSymbols = b._exportedSymbols
115+
this._resolvedImports = b._resolvedImports
116+
this
117+
}
118+
res
119+
} else {
120+
Some(this)
95121
}
122+
}
123+
124+
private def toConcrete(
125+
r: PackageRepository,
126+
moduleMap: ModuleMap
127+
): Option[BindingsMap] = {
128+
val newMap = this._currentModule
129+
.toConcrete(moduleMap)
130+
.map { c =>
131+
this._currentModule = c
132+
c
133+
}
134+
.map { module =>
135+
this.copy(_currentModule = module)
136+
}
96137

97138
val withImports: Option[BindingsMap] = newMap.flatMap { bindings =>
98-
val newImports = this._resolvedImports.map(
99-
_.toConcrete(moduleMap)
100-
)
139+
val newImports = this._resolvedImports.map { imp =>
140+
imp.targets.map { t =>
141+
r.ensurePackageIsLoaded(
142+
LibraryName(t.qualifiedName.path(0), t.qualifiedName.path(1))
143+
)
144+
}
145+
imp.toConcrete(moduleMap)
146+
}
101147
if (newImports.exists(_.isEmpty)) {
102148
None
103149
} else {

0 commit comments

Comments
 (0)