Skip to content

Commit d7c507e

Browse files
committed
draft logic for computing conforming types
1 parent de3cca8 commit d7c507e

18 files changed

+193
-155
lines changed

Sources/SwiftinitPages/Sections/GroupSections.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ extension GroupSections
106106
.third($0.symbol.package)
107107
} ?? .first
108108

109-
let genericness:Genericness = group.conditions.isEmpty ?
110-
.unconstrained : generics.count(substituting: group.conditions) > 0 ?
109+
let genericness:Genericness = group.constraints.isEmpty ?
110+
.unconstrained : generics.count(substituting: group.constraints) > 0 ?
111111
.constrained :
112112
.concretized
113113

@@ -193,7 +193,7 @@ extension GroupSections
193193
return .init(self.context,
194194
display: display,
195195
culture: `extension`.culture,
196-
where: `extension`.conditions)
196+
where: `extension`.constraints)
197197
}
198198

199199
private

Sources/SwiftinitPages/Surfaces/Vertices/Swiftinit.Docs.DeclPage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ extension Swiftinit.Docs.DeclPage:Swiftinit.VertexPage
236236
}
237237

238238
if let containing:Unidoc.Group.Extension = self.groups.containing,
239-
let list:ConstraintsList = self.context.constraints(containing.conditions)
239+
let list:ConstraintsList = self.context.constraints(containing.constraints)
240240
{
241241
$0[.details, { $0.open = true }]
242242
{

Sources/UnidocLinker/Sema/DroppedPassagesError.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import UnidocDiagnostics
33

44
enum DroppedPassagesError:Equatable, Error
55
{
6-
case fromExtension(Unidoc.Group.ID, of:Unidoc.Scalar)
6+
case fromExtension(Unidoc.Linker.Extension.ID, of:Unidoc.Scalar)
77
}
88
extension DroppedPassagesError:Diagnostic
99
{

Sources/UnidocLinker/Sema/ProtocolConformance.swift

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

Sources/UnidocLinker/Sema/ProtocolConformances.swift

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,25 @@ import SymbolGraphs
33
import Unidoc
44
import UnidocDiagnostics
55

6-
/// Describes a single type’s protocol conformances. Depending on how the type is being used,
7-
/// the lists may or may not be exhaustive.
8-
struct ProtocolConformances<Culture>
6+
/// Describes a single type’s protocol conformances. Depending on how this structure is being
7+
/// used, the lists may or may not be exhaustive.
8+
struct ProtocolConformances:Sendable
99
{
1010
private
11-
var table:[Unidoc.Scalar: [ProtocolConformance<Culture>]]
11+
var table:[Unidoc.Scalar: [Unidoc.Linker.ExtensionConditions]]
1212

1313
private
14-
init(table:[Unidoc.Scalar: [ProtocolConformance<Culture>]])
14+
init(table:[Unidoc.Scalar: [Unidoc.Linker.ExtensionConditions]])
1515
{
1616
self.table = table
1717
}
1818
}
19-
extension ProtocolConformances:Sendable where Culture:Sendable
20-
{
21-
}
2219
extension ProtocolConformances
2320
{
2421
/// Yields all known conformances to the specified protocol. This subscript returns an empty
2522
/// list if no conformances are known to exist. It can also return more than one conformance
2623
/// if multiple modules declare conformances to the same protocol.
27-
subscript(to protocol:Unidoc.Scalar) -> [ProtocolConformance<Culture>]
24+
subscript(to protocol:Unidoc.Scalar) -> [Unidoc.Linker.ExtensionConditions]
2825
{
2926
_read
3027
{
@@ -38,7 +35,8 @@ extension ProtocolConformances
3835
}
3936
extension ProtocolConformances:Sequence
4037
{
41-
func makeIterator() -> Dictionary<Unidoc.Scalar, [ProtocolConformance<Culture>]>.Iterator
38+
func makeIterator()
39+
-> Dictionary<Unidoc.Scalar, [Unidoc.Linker.ExtensionConditions]>.Iterator
4240
{
4341
self.table.makeIterator()
4442
}
@@ -50,35 +48,36 @@ extension ProtocolConformances:ExpressibleByDictionaryLiteral
5048
self.init(table: [:])
5149
}
5250
}
53-
extension ProtocolConformances<Int>
51+
extension ProtocolConformances
5452
{
5553
init(of subject:Unidoc.Scalar,
56-
signatures:borrowing [Unidoc.Linker.ExtensionSignature],
54+
conditions:borrowing [Unidoc.Linker.ExtensionConditions],
5755
extensions:borrowing [SymbolGraph.Extension],
5856
modules:borrowing [SymbolGraph.ModuleContext],
5957
context:inout Unidoc.Linker)
6058
{
6159
self = [:]
6260

63-
for (`extension`, signature):(SymbolGraph.Extension, Unidoc.Linker.ExtensionSignature)
64-
in zip(extensions, signatures)
61+
for (conditions, `extension`):
62+
(Unidoc.Linker.ExtensionConditions, SymbolGraph.Extension) in zip(
63+
conditions,
64+
extensions)
6565
{
66-
let module:SymbolGraph.ModuleContext = modules[`extension`.culture]
66+
let module:SymbolGraph.ModuleContext = modules[conditions.culture]
6767
for p:Int32 in `extension`.conformances
6868
{
6969
// Only track conformances that were declared by modules in
7070
// the current package.
7171
if let p:Unidoc.Scalar = context.current.scalars.decls[p],
7272
case false = module.already(conforms: subject, to: p)
7373
{
74-
self[to: p].append(.init(
75-
conditions: signature.conditions,
76-
culture: `extension`.culture))
74+
self[to: p].append(conditions)
7775
}
7876
}
7977
}
8078

81-
for i:Dictionary<Unidoc.Scalar, [ProtocolConformance<Int>]>.Index in self.table.indices
79+
for i:Dictionary<Unidoc.Scalar, [Unidoc.Linker.ExtensionConditions]>.Index
80+
in self.table.indices
8281
{
8382
let `protocol`:Unidoc.Scalar = self.table.keys[i]
8483
context.simplify(conformances: &self.table.values[i],
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
extension Unidoc.Linker.Extension
2+
{
3+
struct ID:Equatable, Hashable, Sendable
4+
{
5+
let index:Int
6+
7+
init(index:Int)
8+
{
9+
self.index = index
10+
}
11+
}
12+
}
13+
extension Unidoc.Linker.Extension.ID:Comparable
14+
{
15+
static
16+
func < (a:Self, b:Self) -> Bool { a.index < b.index }
17+
}

Sources/UnidocLinker/Sema/Unidoc.Linker.Extension.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ extension Unidoc.Linker
55
{
66
struct Extension:Identifiable, Equatable, Sendable
77
{
8-
let id:Unidoc.Group.ID
8+
let id:ID
99

1010
var conformances:[Unidoc.Scalar]
1111
var features:[Unidoc.Scalar]
@@ -15,7 +15,7 @@ extension Unidoc.Linker
1515
var overview:Unidoc.Passage?
1616
var details:Unidoc.Passage?
1717

18-
init(id:Unidoc.Group.ID,
18+
init(id:ID,
1919
conformances:[Unidoc.Scalar] = [],
2020
features:[Unidoc.Scalar] = [],
2121
nested:[Unidoc.Scalar] = [],
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Signatures
2+
import Unidoc
3+
4+
extension Unidoc.Linker
5+
{
6+
struct ExtensionConditions:Equatable, Hashable, Sendable
7+
{
8+
let constraints:[GenericConstraint<Unidoc.Scalar?>]
9+
let culture:Int
10+
11+
init(constraints:[GenericConstraint<Unidoc.Scalar?>], culture:Int)
12+
{
13+
self.constraints = constraints
14+
self.culture = culture
15+
}
16+
}
17+
}

Sources/UnidocLinker/Sema/Unidoc.Linker.ExtensionSignature.swift

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,25 @@ extension Unidoc.Linker
55
{
66
struct ExtensionSignature:Equatable, Hashable, Sendable
77
{
8-
let conditions:[GenericConstraint<Unidoc.Scalar?>]
9-
let culture:Int
10-
let extends:Unidoc.Scalar
8+
let conditions:ExtensionConditions
9+
let extendee:Unidoc.Scalar
1110

12-
init(conditions:[GenericConstraint<Unidoc.Scalar?>],
13-
culture:Int,
14-
extends:Unidoc.Scalar)
11+
private
12+
init(conditions:ExtensionConditions, extendee:Unidoc.Scalar)
1513
{
1614
self.conditions = conditions
17-
self.culture = culture
18-
self.extends = extends
15+
self.extendee = extendee
1916
}
2017
}
2118
}
19+
extension Unidoc.Linker.ExtensionSignature
20+
{
21+
static
22+
func extends(_ extendee:consuming Unidoc.Scalar,
23+
where conditions:consuming Unidoc.Linker.ExtensionConditions) -> Self
24+
{
25+
.init(conditions: conditions, extendee: extendee)
26+
}
27+
28+
var culture:Int { self.conditions.culture }
29+
}

0 commit comments

Comments
 (0)