@@ -23,22 +23,25 @@ public struct DependencyGraphDotFileWriter {
23
23
}
24
24
25
25
mutating func write( _ sfdg: SourceFileDependencyGraph , for file: TypedVirtualPath ,
26
- host : ModuleDependencyGraph ) {
26
+ internedStringTable : InternedStringTable ) {
27
27
let basename = file. file. basename
28
- write ( sfdg, basename: basename, host : host )
28
+ write ( sfdg, basename: basename, internedStringTable : internedStringTable )
29
29
}
30
30
31
31
mutating func write( _ mdg: ModuleDependencyGraph ) {
32
- write ( mdg, basename: Self . moduleDependencyGraphBasename, host: mdg)
32
+ write ( mdg, basename: Self . moduleDependencyGraphBasename,
33
+ internedStringTable: mdg. internedStringTable)
33
34
}
34
35
35
36
@_spi ( Testing) public static let moduleDependencyGraphBasename = " moduleDependencyGraph "
36
37
}
37
38
38
39
// MARK: Asking to write dot files / implementation
39
40
fileprivate extension DependencyGraphDotFileWriter {
40
- mutating func write< Graph: ExportableGraph > ( _ graph: Graph , basename: String ,
41
- host: ModuleDependencyGraph
41
+ mutating func write< Graph: ExportableGraph > (
42
+ _ graph: Graph ,
43
+ basename: String ,
44
+ internedStringTable: InternedStringTable
42
45
) {
43
46
let path = dotFilePath ( for: basename)
44
47
try ! info. fileSystem. writeFileContents ( path) { stream in
@@ -48,7 +51,7 @@ fileprivate extension DependencyGraphDotFileWriter {
48
51
stream,
49
52
includeExternals: info. dependencyDotFilesIncludeExternals,
50
53
includeAPINotes: info. dependencyDotFilesIncludeAPINotes,
51
- host : host )
54
+ internedStringTable : internedStringTable )
52
55
s. emit ( )
53
56
}
54
57
}
@@ -107,7 +110,7 @@ extension ModuleDependencyGraph: ExportableGraph {
107
110
fileprivate protocol ExportableNode : Hashable {
108
111
var key : DependencyKey { get }
109
112
var isProvides : Bool { get }
110
- var label : String { get }
113
+ func label( in : InternedStringTable ) -> String
111
114
}
112
115
113
116
extension SourceFileDependencyGraph . Node : ExportableNode {
@@ -120,19 +123,19 @@ extension ModuleDependencyGraph.Node: ExportableNode {
120
123
}
121
124
122
125
extension ExportableNode {
123
- fileprivate func emit( id: Int , to out: inout WritableByteStream ) {
124
- out <<< DotFileNode ( id: id, node: self ) . description <<< " \n "
126
+ fileprivate func emit( id: Int , to out: inout WritableByteStream , _ t : InternedStringTable ) {
127
+ out <<< DotFileNode ( id: id, node: self , in : t ) . description <<< " \n "
125
128
}
126
129
127
- fileprivate var label : String {
128
- " \( key. description) \( isProvides ? " here " : " somewhere else " ) "
130
+ fileprivate func label( in t : InternedStringTable ) -> String {
131
+ " \( key. description ( in : t ) ) \( isProvides ? " here " : " somewhere else " ) "
129
132
}
130
133
131
134
fileprivate var isExternal : Bool {
132
135
key. designator. externalDependency != nil
133
136
}
134
137
fileprivate var isAPINotes : Bool {
135
- key. designator. externalDependency? . fileName . string . hasSuffix ( " .apinotes " )
138
+ key. designator. externalDependency? . fileNameString . hasSuffix ( " .apinotes " )
136
139
?? false
137
140
}
138
141
@@ -168,26 +171,26 @@ fileprivate extension DependencyKey.Designator {
168
171
}
169
172
}
170
173
171
- static func oneOfEachKind( host : ModuleDependencyGraph ) -> [ DependencyKey . Designator ] {
174
+ static var oneOfEachKind : [ DependencyKey . Designator ] {
172
175
[
173
- host . topLevel ( name: " " ) ,
174
- host . dynamicLookup ( name: " " ) ,
175
- host . externalDepend ( ed : ExternalDependency ( fileName : " . " . intern ( host ) ) ) ,
176
- host . sourceFileProvide ( name: " " ) ,
177
- host . nominal ( context: " " ) ,
178
- host . potentialMember ( context: " " ) ,
179
- host . member ( context: " " , name: " " )
176
+ . topLevel( name: . empty ) ,
177
+ . dynamicLookup( name: . empty ) ,
178
+ . externalDepend( . dummy ) ,
179
+ . sourceFileProvide( name: . empty ) ,
180
+ . nominal( context: . empty ) ,
181
+ . potentialMember( context: . empty ) ,
182
+ . member( context: . empty , name: . empty )
180
183
] }
181
184
}
182
185
183
186
// MARK: - writing one dot file
184
187
185
- fileprivate struct DOTDependencyGraphSerializer < Graph: ExportableGraph > {
188
+ fileprivate struct DOTDependencyGraphSerializer < Graph: ExportableGraph > : InternedStringTableHolder {
186
189
private let includeExternals : Bool
187
190
private let includeAPINotes : Bool
188
191
private let graphID : String
189
192
private let graph : Graph
190
- private let host : ModuleDependencyGraph
193
+ fileprivate let internedStringTable : InternedStringTable
191
194
private var nodeIDs = [ Graph . Node: Int] ( )
192
195
private var out : WritableByteStream
193
196
@@ -197,14 +200,14 @@ fileprivate struct DOTDependencyGraphSerializer<Graph: ExportableGraph> {
197
200
_ stream: WritableByteStream ,
198
201
includeExternals: Bool ,
199
202
includeAPINotes: Bool ,
200
- host : ModuleDependencyGraph
203
+ internedStringTable : InternedStringTable
201
204
) {
202
205
self . graph = graph
206
+ self . internedStringTable = internedStringTable
203
207
self . graphID = graphID
204
208
self . out = stream
205
209
self . includeExternals = includeExternals
206
210
self . includeAPINotes = includeAPINotes
207
- self . host = host
208
211
}
209
212
210
213
fileprivate mutating func emit( ) {
@@ -219,14 +222,14 @@ fileprivate struct DOTDependencyGraphSerializer<Graph: ExportableGraph> {
219
222
out <<< " digraph " <<< graphID. quoted <<< " { \n "
220
223
}
221
224
private mutating func emitLegend( ) {
222
- for dummy in DependencyKey . Designator. oneOfEachKind ( host : host ) {
225
+ for dummy in DependencyKey . Designator. oneOfEachKind {
223
226
out <<< DotFileNode ( forLegend: dummy) . description <<< " \n "
224
227
}
225
228
}
226
229
private mutating func emitNodes( ) {
227
230
graph. forEachExportableNode { ( n: Graph . Node ) in
228
231
if include ( n) {
229
- n. emit ( id: register ( n) , to: & out)
232
+ n. emit ( id: register ( n) , to: & out, internedStringTable )
230
233
}
231
234
}
232
235
}
@@ -273,9 +276,9 @@ fileprivate struct DotFileNode: CustomStringConvertible {
273
276
let fillColor : Color
274
277
let style : Style ?
275
278
276
- init < Node: ExportableNode > ( id: Int , node: Node ) {
279
+ init < Node: ExportableNode > ( id: Int , node: Node , in t : InternedStringTable ) {
277
280
self . id = String ( id)
278
- self . label = node. label
281
+ self . label = node. label ( in : t )
279
282
self . shape = node. shape
280
283
self . fillColor = node. fillColor
281
284
self . style = node. style
0 commit comments