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