Skip to content

Commit 3316887

Browse files
authored
Merge pull request #379 from tayloraswift/requirement-filters
protocol requirement filters
2 parents 00ddf7a + 639e266 commit 3316887

33 files changed

+721
-186
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import Symbols
2+
import UCF
3+
4+
extension UCF.ConditionFilter
5+
{
6+
static func ~= (self:Self, decl:(phylum:Phylum.Decl, kinks:Phylum.Decl.Kinks)) -> Bool
7+
{
8+
let value:Bool
9+
10+
switch (decl.phylum, self.keywords)
11+
{
12+
case (.actor, .actor): value = true
13+
case (.associatedtype, .associatedtype): value = true
14+
case (.case, .case): value = true
15+
case (.class, .class): value = true
16+
case (.deinitializer, .deinit): value = true
17+
case (.enum, .enum): value = true
18+
case (.func(nil), .func): value = true
19+
case (.func(.instance), .func): value = true
20+
case (.func(.class?), .class_func): value = true
21+
case (.func(.static?), .static_func): value = true
22+
case (.initializer, .`init`): value = true
23+
case (.macro, .macro): value = true
24+
case (.protocol, .protocol): value = true
25+
case (.struct, .struct): value = true
26+
case (.subscript(.instance), .subscript): value = true
27+
case (.subscript(.class), .class_subscript): value = true
28+
case (.subscript(.static), .static_subscript): value = true
29+
case (.typealias, .typealias): value = true
30+
case (.var(nil), .var): value = true
31+
case (.var(.instance?), .var): value = true
32+
case (.var(.class?), .class_var): value = true
33+
case (.var(.static?), .static_var): value = true
34+
case (_, .requirement): value = decl.kinks[is: .required]
35+
default: value = false
36+
}
37+
38+
return self.expected == value
39+
}
40+
}

Sources/LinkResolution/Codelinks/UCF.KeywordFilter (ext).swift

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

Sources/LinkResolution/Codelinks/UCF.LegacyFilter (ext).swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import UCF
33

44
extension UCF.LegacyFilter
55
{
6-
static
7-
func ~= (self:Self, phylum:Phylum.Decl?) -> Bool
6+
static func ~= (self:Self, phylum:Phylum.Decl?) -> Bool
87
{
98
guard
109
let phylum:Phylum.Decl
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import UCF
2+
3+
extension UCF.SignatureFilter
4+
{
5+
static func ~= (self:Self, autograph:UCF.Autograph) -> Bool
6+
{
7+
if let inputs:[String?] = self.inputs
8+
{
9+
guard autograph.inputs.count == inputs.count
10+
else
11+
{
12+
return false
13+
}
14+
for case (let required, let provided?) in zip(autograph.inputs, inputs)
15+
{
16+
if required != provided
17+
{
18+
return false
19+
}
20+
}
21+
}
22+
23+
if let output:[String?] = self.output
24+
{
25+
guard autograph.output.count == output.count
26+
else
27+
{
28+
return false
29+
}
30+
for case (let required, let provided?) in zip(autograph.output, output)
31+
{
32+
if required != provided
33+
{
34+
return false
35+
}
36+
}
37+
}
38+
39+
return true
40+
}
41+
}

Sources/LinkResolution/UCF.Autograph.swift

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,42 +18,3 @@ extension UCF
1818
}
1919
}
2020
}
21-
extension UCF.Autograph
22-
{
23-
static func ~= (filter:UCF.SignatureFilter, self:Self) -> Bool
24-
{
25-
if let inputs:[String?] = filter.inputs
26-
{
27-
guard self.inputs.count == inputs.count
28-
else
29-
{
30-
return false
31-
}
32-
for case (let required, let provided?) in zip(self.inputs, inputs)
33-
{
34-
if required != provided
35-
{
36-
return false
37-
}
38-
}
39-
}
40-
41-
if let output:[String?] = filter.output
42-
{
43-
guard self.output.count == output.count
44-
else
45-
{
46-
return false
47-
}
48-
for case (let required, let provided?) in zip(self.output, output)
49-
{
50-
if required != provided
51-
{
52-
return false
53-
}
54-
}
55-
}
56-
57-
return true
58-
}
59-
}

Sources/LinkResolution/UCF.CausalOverload.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ extension UCF
1010
public
1111
let phylum:Phylum.Decl
1212
public
13+
let kinks:Phylum.Decl.Kinks
14+
public
1315
let decl:Symbol.Decl
1416
public
1517
let heir:Symbol.Decl?
@@ -23,13 +25,15 @@ extension UCF
2325

2426
@inlinable public
2527
init(phylum:Phylum.Decl,
28+
kinks:Phylum.Decl.Kinks,
2629
decl:Symbol.Decl,
2730
heir:Symbol.Decl?,
2831
hash:FNV24,
2932
documented:Bool,
3033
autograph:Autograph?)
3134
{
3235
self.phylum = phylum
36+
self.kinks = kinks
3337
self.decl = decl
3438
self.heir = heir
3539
self.hash = hash

Sources/LinkResolution/UCF.PackageOverload.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ extension UCF
1010
public
1111
let phylum:Phylum.Decl
1212
public
13+
let kinks:Phylum.Decl.Kinks
14+
public
1315
let decl:Int32
1416
public
1517
let heir:Int32?
@@ -27,6 +29,7 @@ extension UCF
2729

2830
@inlinable public
2931
init(phylum:Phylum.Decl,
32+
kinks:Phylum.Decl.Kinks,
3033
decl:Int32,
3134
heir:Int32?,
3235
hash:FNV24,
@@ -35,6 +38,7 @@ extension UCF
3538
id:Symbol.Decl)
3639
{
3740
self.phylum = phylum
41+
self.kinks = kinks
3842
self.decl = decl
3943
self.heir = heir
4044
self.hash = hash

Sources/LinkResolution/UCF.ResolvableOverload.swift

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extension UCF
99
{
1010
var autograph:Autograph? { get }
1111
var phylum:Phylum.Decl { get }
12+
var kinks:Phylum.Decl.Kinks { get }
1213
var hash:FNV24 { get }
1314

1415
var documented:Bool { get }
@@ -72,6 +73,30 @@ extension UCF.ResolvableOverload
7273

7374
switch suffix
7475
{
76+
case .unidoc(let filter):
77+
if let signature:UCF.SignatureFilter = filter.signature
78+
{
79+
// If a signature filter is present, the declaration must have an autograph.
80+
guard
81+
let autograph:UCF.Autograph = self.autograph, signature ~= autograph
82+
else
83+
{
84+
return false
85+
}
86+
}
87+
88+
let decl:(Phylum.Decl, Phylum.Decl.Kinks) = (self.phylum, self.kinks)
89+
for condition:UCF.ConditionFilter in filter.conditions
90+
{
91+
guard condition ~= decl
92+
else
93+
{
94+
return false
95+
}
96+
}
97+
98+
return true
99+
75100
case .legacy(let filter, nil):
76101
return filter ~= self.phylum
77102

@@ -80,19 +105,6 @@ extension UCF.ResolvableOverload
80105

81106
case .hash(let hash):
82107
return hash == self.hash
83-
84-
case .keywords(let filter):
85-
return filter ~= self.phylum
86-
87-
case .signature(let filter):
88-
if let autograph:UCF.Autograph = self.autograph
89-
{
90-
return filter ~= autograph
91-
}
92-
else
93-
{
94-
return false
95-
}
96108
}
97109
}
98110
}

Sources/SymbolGraphCompiler/Extensions/SSGC.ModuleIndex.Feature.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,22 @@ extension SSGC.ModuleIndex
1212
public
1313
let phylum:Phylum.Decl
1414
public
15+
let kinks:Phylum.Decl.Kinks
16+
public
1517
let path:UnqualifiedPath
1618
public
1719
let documented:Bool
1820
public
1921
let autograph:UCF.Autograph?
2022

2123
init(phylum:Phylum.Decl,
24+
kinks:Phylum.Decl.Kinks,
2225
path:UnqualifiedPath,
2326
documented:Bool,
2427
autograph:UCF.Autograph?)
2528
{
2629
self.phylum = phylum
30+
self.kinks = kinks
2731
self.path = path
2832
self.documented = documented
2933
self.autograph = autograph
@@ -35,6 +39,7 @@ extension SSGC.ModuleIndex.Feature
3539
init(from decl:borrowing SSGC.Decl)
3640
{
3741
self.init(phylum: decl.phylum,
42+
kinks: decl.kinks,
3843
path: decl.path,
3944
documented: decl.comment != nil,
4045
autograph: decl.autograph)

Sources/SymbolGraphCompiler/UCF.CausalOverload (ext).swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ extension UCF.CausalOverload
77
func feature(_ decl:SSGC.Decl, self heir:Symbol.Decl) -> Self
88
{
99
.init(phylum: decl.phylum,
10+
kinks: decl.kinks,
1011
decl: decl.id,
1112
heir: heir,
1213
hash: .decl(.init(decl.id, self: heir)),
@@ -17,6 +18,7 @@ extension UCF.CausalOverload
1718
func decl(_ decl:SSGC.Decl) -> Self
1819
{
1920
.init(phylum: decl.phylum,
21+
kinks: decl.kinks,
2022
decl: decl.id,
2123
heir: nil,
2224
hash: .decl(decl.id),

0 commit comments

Comments
 (0)