Skip to content

Commit f26ac27

Browse files
authored
Whole tree builds (#308)
changes SSGC’s compilation model so that it now compiles the full dependency tree for one module at a time, instead of a partial set of dependencies for the entire package
1 parent 45b94b7 commit f26ac27

File tree

124 files changed

+3193
-2304
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

124 files changed

+3193
-2304
lines changed

Package.resolved

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ let package:Package = .init(
9292
.package(url: "https://github.com/tayloraswift/swift-hash", .upToNextMinor(
9393
from: "0.6.0")),
9494
.package(url: "https://github.com/tayloraswift/swift-mongodb", .upToNextMinor(
95-
from: "0.23.0")),
95+
from: "0.23.1")),
9696
.package(url: "https://github.com/tayloraswift/swift-unixtime", .upToNextMinor(
9797
from: "0.1.0")),
9898

@@ -103,7 +103,7 @@ let package:Package = .init(
103103
from: "4.4.3")),
104104

105105
.package(url: "https://github.com/apple/swift-argument-parser", .upToNextMinor(
106-
from: "1.4.0")),
106+
from: "1.5.0")),
107107
.package(url: "https://github.com/apple/swift-atomics", .upToNextMinor(
108108
from: "1.2.0")),
109109
.package(url: "https://github.com/apple/swift-collections", .upToNextMinor(
@@ -303,11 +303,13 @@ let package:Package = .init(
303303
.target(name: "PackageGraphs",
304304
dependencies: [
305305
.target(name: "SymbolGraphs"),
306+
.target(name: "TopologicalSorting"),
306307
]),
307308

308309
.target(name: "PackageMetadata",
309310
dependencies: [
310311
.target(name: "PackageGraphs"),
312+
.product(name: "OrderedCollections", package: "swift-collections"),
311313
.product(name: "JSON", package: "swift-json"),
312314
]),
313315

@@ -431,6 +433,8 @@ let package:Package = .init(
431433
.product(name: "Testing_", package: "swift-grammar"),
432434
]),
433435

436+
.target(name: "TopologicalSorting"),
437+
434438
.target(name: "UA",
435439
dependencies: [
436440
.product(name: "Grammar", package: "swift-grammar"),
@@ -642,8 +646,7 @@ let package:Package = .init(
642646

643647
.executableTarget(name: "SymbolGraphCompilerTests",
644648
dependencies: [
645-
.target(name: "SymbolGraphCompiler"),
646-
.target(name: "System"),
649+
.target(name: "SymbolGraphBuilder"),
647650
.product(name: "Testing_", package: "swift-grammar"),
648651
]),
649652

@@ -684,6 +687,12 @@ let package:Package = .init(
684687
"directories",
685688
]),
686689

690+
.executableTarget(name: "TopologicalSortingTests",
691+
dependencies: [
692+
.target(name: "TopologicalSorting"),
693+
.product(name: "Testing_", package: "swift-grammar"),
694+
]),
695+
687696
.executableTarget(name: "UATests",
688697
dependencies: [
689698
.target(name: "UA"),

Sources/HTTPServer/AsyncSequence (ext).swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,11 @@ extension AsyncSequence where Element:Sendable
4444
func iterate(concurrently width:Int,
4545
with body:@Sendable @escaping (Element) async -> ()) async throws
4646
{
47+
var iterator:AsyncIterator = self.makeAsyncIterator()
4748
let exit:Result<Void, any Error> = await withTaskGroup(of: Void.self)
4849
{
4950
(tasks:inout TaskGroup<Void>) in
5051

51-
var iterator:AsyncIterator = self.makeAsyncIterator()
52-
5352
do
5453
{
5554
for _:Int in 0 ..< width

Sources/PackageGraphs/Digraphs/DigraphCycleError.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/// At least one dependency cycle exists in the relevant digraph.
22
public
3-
struct DigraphCycleError<Node>:Error, Equatable, Sendable where Node:DigraphNode
3+
struct DigraphCycleError<Node>:Error, Equatable, Sendable where Node:Identifiable
44
{
55
public
66
init()

Sources/PackageGraphs/Digraphs/DigraphExplorer.Nodes.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ extension DigraphExplorer.Nodes
4545
}
4646
extension DigraphExplorer<TargetNode>.Nodes
4747
{
48-
public
49-
init(indexing nodes:[TargetNode]) throws
48+
@inlinable public
49+
init(indexing nodes:some Sequence<TargetNode>) throws
5050
{
5151
self.init()
5252
for node:TargetNode in nodes

Sources/PackageGraphs/Digraphs/DigraphExplorer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/// Context for a breadth-first traversal of a digraph.
22
@frozen public
3-
struct DigraphExplorer<Node> where Node:DigraphNode, Node.ID:Sendable
3+
struct DigraphExplorer<Node> where Node:Identifiable, Node.ID:Sendable
44
{
55
@usableFromInline internal
66
let nodes:Nodes

Sources/PackageGraphs/Digraphs/DigraphNode.swift

Lines changed: 0 additions & 94 deletions
This file was deleted.

Sources/PackageGraphs/Digraphs/DigraphNodeError.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
public
2-
enum DigraphNodeError<Node>:Error, Equatable where Node:DigraphNode, Node.ID:Sendable
2+
enum DigraphNodeError<Node>:Error, Equatable where Node:Identifiable, Node.ID:Sendable
33
{
44
case duplicate(Node.ID)
55
case undefined(Node.ID)

Sources/PackageGraphs/Packages/PackageNode.Predecessors.swift

Lines changed: 0 additions & 33 deletions
This file was deleted.

Sources/PackageGraphs/Packages/PackageNode.swift

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import SymbolGraphs
22
import Symbols
3+
import TopologicalSorting
34

45
/// A package node is a flattened representation of a package manifest.
56
/// Creating one involves assigning an identity to a package manifest
@@ -12,9 +13,6 @@ struct PackageNode:Identifiable
1213
public
1314
var dependencies:[any Identifiable<Symbol.Package>]
1415

15-
public
16-
var snippets:String
17-
1816
public
1917
var products:[SymbolGraph.Product]
2018
public
@@ -28,26 +26,19 @@ struct PackageNode:Identifiable
2826
@inlinable public
2927
init(id:Symbol.Package,
3028
dependencies:[any Identifiable<Symbol.Package>],
31-
snippets:String = "Snippets",
3229
products:[SymbolGraph.Product],
3330
modules:[SymbolGraph.Module],
3431
exclude:[[String]],
3532
root:Symbol.FileBase)
3633
{
3734
self.id = id
3835
self.dependencies = dependencies
39-
self.snippets = snippets
4036
self.products = products
4137
self.modules = modules
4238
self.exclude = exclude
4339
self.root = root
4440
}
4541
}
46-
extension PackageNode:DigraphNode
47-
{
48-
@inlinable public
49-
var predecessors:Predecessors { .init(self.dependencies) }
50-
}
5142
extension PackageNode
5243
{
5344
public consuming
@@ -98,7 +89,24 @@ extension PackageNode
9889
}
9990
}
10091

101-
self.dependencies = try Self.order(topologically: dependencies).compactMap
92+
let directedEdges:[(Symbol.Package, Symbol.Package)] = dependencies.reduce(into: [])
93+
{
94+
for dependency:any Identifiable<Symbol.Package> in $1.dependencies
95+
{
96+
$0.append((dependency.id, $1.id))
97+
}
98+
}
99+
100+
// FIXME: in Swift 6, it will be legal to have cyclic package dependencies!
101+
guard
102+
let dependenciesOrdered:[PackageNode] = dependencies.sortedTopologically(
103+
by: directedEdges)
104+
else
105+
{
106+
throw DigraphCycleError<PackageNode>.init()
107+
}
108+
109+
self.dependencies = dependenciesOrdered.compactMap
102110
{
103111
actuallyUsed.contains($0.id)
104112
? declared[$0.id] ?? TransitiveDependency.init(id: $0.id)

0 commit comments

Comments
 (0)