Skip to content

Commit ba887d1

Browse files
author
David Ungar
committed
intern strings, etc.
1 parent 96a3043 commit ba887d1

22 files changed

+695
-579
lines changed

Sources/SwiftDriver/IncrementalCompilation/DependencyGraphDotFileWriter.swift

+31-28
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,25 @@ public struct DependencyGraphDotFileWriter {
2323
}
2424

2525
mutating func write(_ sfdg: SourceFileDependencyGraph, for file: TypedVirtualPath,
26-
host: ModuleDependencyGraph) {
26+
internedStringTable: InternedStringTable) {
2727
let basename = file.file.basename
28-
write(sfdg, basename: basename, host: host)
28+
write(sfdg, basename: basename, internedStringTable: internedStringTable)
2929
}
3030

3131
mutating func write(_ mdg: ModuleDependencyGraph) {
32-
write(mdg, basename: Self.moduleDependencyGraphBasename, host: mdg)
32+
write(mdg, basename: Self.moduleDependencyGraphBasename,
33+
internedStringTable: mdg.internedStringTable)
3334
}
3435

3536
@_spi(Testing) public static let moduleDependencyGraphBasename = "moduleDependencyGraph"
3637
}
3738

3839
// MARK: Asking to write dot files / implementation
3940
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
4245
) {
4346
let path = dotFilePath(for: basename)
4447
try! info.fileSystem.writeFileContents(path) { stream in
@@ -48,7 +51,7 @@ fileprivate extension DependencyGraphDotFileWriter {
4851
stream,
4952
includeExternals: info.dependencyDotFilesIncludeExternals,
5053
includeAPINotes: info.dependencyDotFilesIncludeAPINotes,
51-
host: host)
54+
internedStringTable: internedStringTable)
5255
s.emit()
5356
}
5457
}
@@ -107,7 +110,7 @@ extension ModuleDependencyGraph: ExportableGraph {
107110
fileprivate protocol ExportableNode: Hashable {
108111
var key: DependencyKey {get}
109112
var isProvides: Bool {get}
110-
var label: String {get}
113+
func label(in: InternedStringTable) -> String
111114
}
112115

113116
extension SourceFileDependencyGraph.Node: ExportableNode {
@@ -120,19 +123,19 @@ extension ModuleDependencyGraph.Node: ExportableNode {
120123
}
121124

122125
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"
125128
}
126129

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")"
129132
}
130133

131134
fileprivate var isExternal: Bool {
132135
key.designator.externalDependency != nil
133136
}
134137
fileprivate var isAPINotes: Bool {
135-
key.designator.externalDependency?.fileName.string.hasSuffix(".apinotes")
138+
key.designator.externalDependency?.fileNameString.hasSuffix(".apinotes")
136139
?? false
137140
}
138141

@@ -168,26 +171,26 @@ fileprivate extension DependencyKey.Designator {
168171
}
169172
}
170173

171-
static func oneOfEachKind(host: ModuleDependencyGraph) -> [DependencyKey.Designator] {
174+
static var oneOfEachKind: [DependencyKey.Designator] {
172175
[
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)
180183
]}
181184
}
182185

183186
// MARK: - writing one dot file
184187

185-
fileprivate struct DOTDependencyGraphSerializer<Graph: ExportableGraph> {
188+
fileprivate struct DOTDependencyGraphSerializer<Graph: ExportableGraph>: InternedStringTableHolder {
186189
private let includeExternals: Bool
187190
private let includeAPINotes: Bool
188191
private let graphID: String
189192
private let graph: Graph
190-
private let host: ModuleDependencyGraph
193+
fileprivate let internedStringTable: InternedStringTable
191194
private var nodeIDs = [Graph.Node: Int]()
192195
private var out: WritableByteStream
193196

@@ -197,14 +200,14 @@ fileprivate struct DOTDependencyGraphSerializer<Graph: ExportableGraph> {
197200
_ stream: WritableByteStream,
198201
includeExternals: Bool,
199202
includeAPINotes: Bool,
200-
host: ModuleDependencyGraph
203+
internedStringTable: InternedStringTable
201204
) {
202205
self.graph = graph
206+
self.internedStringTable = internedStringTable
203207
self.graphID = graphID
204208
self.out = stream
205209
self.includeExternals = includeExternals
206210
self.includeAPINotes = includeAPINotes
207-
self.host = host
208211
}
209212

210213
fileprivate mutating func emit() {
@@ -219,14 +222,14 @@ fileprivate struct DOTDependencyGraphSerializer<Graph: ExportableGraph> {
219222
out <<< "digraph " <<< graphID.quoted <<< " {\n"
220223
}
221224
private mutating func emitLegend() {
222-
for dummy in DependencyKey.Designator.oneOfEachKind(host: host) {
225+
for dummy in DependencyKey.Designator.oneOfEachKind {
223226
out <<< DotFileNode(forLegend: dummy).description <<< "\n"
224227
}
225228
}
226229
private mutating func emitNodes() {
227230
graph.forEachExportableNode { (n: Graph.Node) in
228231
if include(n) {
229-
n.emit(id: register(n), to: &out)
232+
n.emit(id: register(n), to: &out, internedStringTable)
230233
}
231234
}
232235
}
@@ -273,9 +276,9 @@ fileprivate struct DotFileNode: CustomStringConvertible {
273276
let fillColor: Color
274277
let style: Style?
275278

276-
init<Node: ExportableNode>(id: Int, node: Node) {
279+
init<Node: ExportableNode>(id: Int, node: Node, in t: InternedStringTable) {
277280
self.id = String(id)
278-
self.label = node.label
281+
self.label = node.label(in: t)
279282
self.shape = node.shape
280283
self.fillColor = node.fillColor
281284
self.style = node.style

0 commit comments

Comments
 (0)