@@ -21,8 +21,12 @@ protocol ImportableModuleFieldDecl {
2121 var importNames : WatParser . ImportNames ? { get }
2222}
2323
24+ protocol NameToIndexResolver {
25+ func resolveIndex( use: Parser . IndexOrId ) throws -> Int
26+ }
27+
2428/// A map of module field declarations indexed by their name
25- struct NameMapping < Decl: NamedModuleFieldDecl > {
29+ struct NameMapping < Decl: NamedModuleFieldDecl > : NameToIndexResolver {
2630 private var decls : [ Decl ] = [ ]
2731 private var nameToIndex : [ String : Int ] = [ : ]
2832
@@ -94,15 +98,21 @@ extension NameMapping where Decl: ImportableModuleFieldDecl {
9498 }
9599}
96100
101+ typealias TypesNameMapping = NameMapping < TypesMap . NamedResolvedType >
102+
97103/// A map of unique function types indexed by their name or type signature
98104struct TypesMap {
99- private var nameMapping = NameMapping < WatParser . FunctionTypeDecl > ( )
105+ struct NamedResolvedType : NamedModuleFieldDecl {
106+ let id : Name ?
107+ let type : WatParser . FunctionType
108+ }
109+ private( set) var nameMapping = NameMapping < NamedResolvedType > ( )
100110 /// Tracks the earliest index for each function type
101111 private var indices : [ FunctionType : Int ] = [ : ]
102112
103113 /// Adds a new function type to the mapping
104114 @discardableResult
105- mutating func add( _ decl: WatParser . FunctionTypeDecl ) throws -> Int {
115+ mutating func add( _ decl: NamedResolvedType ) throws -> Int {
106116 try nameMapping. add ( decl)
107117 // Normalize the function type signature without parameter names
108118 if let existing = indices [ decl. type. signature] {
@@ -120,7 +130,7 @@ struct TypesMap {
120130 return existing
121131 }
122132 return try add (
123- WatParser . FunctionTypeDecl (
133+ NamedResolvedType (
124134 id: nil ,
125135 type: WatParser . FunctionType ( signature: signature, parameterNames: [ ] )
126136 )
@@ -170,10 +180,10 @@ struct TypesMap {
170180 mutating func resolveBlockType( use: WatParser . TypeUse ) throws -> BlockType {
171181 switch ( use. index, use. inline) {
172182 case let ( indexOrId? , inline) :
173- let ( type, index) = try resolveAndCheck ( use: indexOrId, inline: inline)
183+ let ( type, index) = try resolveAndCheck ( use: indexOrId, inline: inline? . resolve ( nameMapping ) )
174184 return try resolveBlockType ( signature: type. signature, resolveSignatureIndex: { _ in index } )
175185 case ( nil , let inline? ) :
176- return try resolveBlockType ( signature: inline. signature)
186+ return try resolveBlockType ( signature: inline. resolve ( nameMapping ) . signature)
177187 case ( nil , nil ) : return . empty
178188 }
179189 }
@@ -183,7 +193,7 @@ struct TypesMap {
183193 case let ( indexOrId? , _) :
184194 return try nameMapping. resolveIndex ( use: indexOrId)
185195 case ( nil , let inline) :
186- let inline = inline? . signature ?? WasmTypes . FunctionType ( parameters: [ ] , results: [ ] )
196+ let inline = try inline? . resolve ( nameMapping ) . signature ?? WasmTypes . FunctionType ( parameters: [ ] , results: [ ] )
187197 return try addAnonymousSignature ( inline)
188198 }
189199 }
@@ -209,16 +219,16 @@ struct TypesMap {
209219 mutating func resolve( use: WatParser . TypeUse ) throws -> ( type: WatParser . FunctionType , index: Int ) {
210220 switch ( use. index, use. inline) {
211221 case let ( indexOrId? , inline) :
212- return try resolveAndCheck ( use: indexOrId, inline: inline)
222+ return try resolveAndCheck ( use: indexOrId, inline: inline? . resolve ( nameMapping ) )
213223 case ( nil , let inline) :
214224 // If no index and no inline type, then it's a function type with no parameters or results
215- let inline = inline ?? WatParser . FunctionType ( signature: WasmTypes . FunctionType ( parameters: [ ] , results: [ ] ) , parameterNames: [ ] )
225+ let inline = try inline? . resolve ( nameMapping ) ?? WatParser . FunctionType ( signature: WasmTypes . FunctionType ( parameters: [ ] , results: [ ] ) , parameterNames: [ ] )
216226 // Check if the inline type already exists
217227 if let index = indices [ inline. signature] {
218228 return ( inline, index)
219229 }
220230 // Add inline type to the index space if it doesn't already exist
221- let index = try add ( WatParser . FunctionTypeDecl ( id: nil , type: inline) )
231+ let index = try add ( NamedResolvedType ( id: nil , type: inline) )
222232 return ( inline, index)
223233 }
224234 }
@@ -233,11 +243,11 @@ extension TypesMap: Collection {
233243 nameMapping. index ( after: i)
234244 }
235245
236- subscript( position: Int ) -> WatParser . FunctionTypeDecl {
246+ subscript( position: Int ) -> NamedResolvedType {
237247 return nameMapping [ position]
238248 }
239249
240- func makeIterator( ) -> NameMapping < WatParser . FunctionTypeDecl > . Iterator {
250+ func makeIterator( ) -> NameMapping < NamedResolvedType > . Iterator {
241251 return nameMapping. makeIterator ( )
242252 }
243253}
0 commit comments