@@ -15,6 +15,7 @@ import org.enso.compiler.pass.analyse.BindingAnalysis
15
15
import org .enso .compiler .pass .resolve .MethodDefinitions
16
16
import org .enso .persist .Persistance .Reference
17
17
import org .enso .pkg .QualifiedName
18
+ import org .enso .editions .LibraryName
18
19
19
20
import java .io .ObjectOutputStream
20
21
import scala .annotation .unused
@@ -27,7 +28,7 @@ import scala.collection.mutable.ArrayBuffer
27
28
*/
28
29
case class BindingsMap (
29
30
private val _definedEntities : List [DefinedEntity ],
30
- private val _currentModule : ModuleReference
31
+ private var _currentModule : ModuleReference
31
32
) extends IRPass .IRMetadata {
32
33
import BindingsMap ._
33
34
@@ -39,18 +40,33 @@ case class BindingsMap(
39
40
*/
40
41
private var _resolvedImports : List [ResolvedImport ] = List ()
41
42
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
+ }
45
55
def resolvedImports_ (v : List [ResolvedImport ]): Unit = {
46
56
_resolvedImports = v
47
57
}
48
58
59
+ /** Set to non-null after deserialization to signal that conversion to concrete values is needed */
60
+ private var pendingRepository : PackageRepository = null
61
+
49
62
/** Symbols exported by [[currentModule ]].
50
63
*/
51
64
private var _exportedSymbols : Map [String , List [ResolvedName ]] = Map ()
52
65
53
- def exportedSymbols : Map [String , List [ResolvedName ]] = _exportedSymbols
66
+ def exportedSymbols : Map [String , List [ResolvedName ]] = {
67
+ ensureConvertedToConcrete()
68
+ _exportedSymbols
69
+ }
54
70
def exportedSymbols_ (v : Map [String , List [ResolvedName ]]): Unit = {
55
71
_exportedSymbols = v
56
72
}
@@ -66,8 +82,8 @@ case class BindingsMap(
66
82
override def restoreFromSerialization (
67
83
compiler : Compiler
68
84
): Option [BindingsMap ] = {
69
- val packageRepository = compiler.getPackageRepository
70
- this .toConcrete(packageRepository.getModuleMap )
85
+ this .pendingRepository = compiler.getPackageRepository
86
+ Some ( this )
71
87
}
72
88
73
89
/** Convert this [[BindingsMap ]] instance to use abstract module references.
@@ -89,15 +105,45 @@ case class BindingsMap(
89
105
* instances
90
106
* @return `this` with module references converted to concrete
91
107
*/
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 )
95
121
}
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
+ }
96
137
97
138
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
+ }
101
147
if (newImports.exists(_.isEmpty)) {
102
148
None
103
149
} else {
0 commit comments