1
1
import InlineArray
2
+ import Symbols
2
3
import UCF
3
4
4
5
extension UCF . ResolutionTable
@@ -9,15 +10,15 @@ extension UCF.ResolutionTable
9
10
let predicate : UCF . Selector . Suffix ?
10
11
11
12
private
12
- var selected : InlineArray < Overload >
13
+ var selected : [ Symbol . Decl : Overload ]
13
14
private
14
- var rejected : [ Overload ]
15
+ var rejected : [ Symbol . Decl : Overload ]
15
16
16
17
init ( matching predicate: UCF . Selector . Suffix ? )
17
18
{
18
19
self . predicate = predicate
19
- self . selected = [ ]
20
- self . rejected = [ ]
20
+ self . selected = [ : ]
21
+ self . rejected = [ : ]
21
22
}
22
23
}
23
24
}
@@ -26,43 +27,62 @@ extension UCF.ResolutionTable.Search
26
27
mutating
27
28
func add( _ candidates: InlineArray < Overload > )
28
29
{
30
+ // Because of the way `@_exported` paths are represented in the search tree, it is
31
+ // possible to encounter the same overload multiple times, due to namespace inference
29
32
if let predicate: UCF . Selector . Suffix = self . predicate
30
33
{
31
34
for overload : Overload in candidates
32
35
{
33
- predicate ~= overload ?
34
- self . selected. append ( overload) :
35
- self . rejected. append ( overload)
36
+ guard predicate ~= overload
37
+ else
38
+ {
39
+ self . rejected [ overload. id] = overload
40
+ continue
41
+ }
42
+
43
+ self . selected [ overload. id] = overload
36
44
}
37
45
}
38
46
else
39
47
{
40
48
for overload : Overload in candidates
41
49
{
42
- self . selected. append ( overload)
50
+ self . selected [ overload . id ] = overload
43
51
}
44
52
}
45
53
}
46
54
47
55
func any( ) -> UCF . Resolution < Overload > ?
48
56
{
49
- switch self . selected
57
+ guard
58
+ let overload: Overload = self . selected. values. first
59
+ else
50
60
{
51
- case . one ( let overload ) :
52
- . overload ( overload )
61
+ return nil
62
+ }
53
63
54
- case . some( let overloads) :
55
- overloads. isEmpty ? nil : . ambiguous( overloads, rejected: self . rejected)
64
+ if self . selected. count == 1
65
+ {
66
+ return . overload( overload)
67
+ }
68
+ else
69
+ {
70
+ return . ambiguous( self . selected. values. sorted { $0. id < $1. id } ,
71
+ rejected: self . rejected. values. sorted { $0. id < $1. id } )
56
72
}
57
73
}
58
74
59
75
consuming
60
76
func get( ) -> UCF . Resolution < Overload >
61
77
{
62
- switch self . selected
78
+ if let overload: Overload = self . selected. values. first, self . selected. count == 1
79
+ {
80
+ return . overload( overload)
81
+ }
82
+ else
63
83
{
64
- case . one ( let overload ) : . overload ( overload )
65
- case . some ( let overloads ) : . ambiguous ( overloads , rejected: self . rejected)
84
+ return . ambiguous ( self . selected . values . sorted { $0 . id < $1 . id } ,
85
+ rejected: self . rejected. values . sorted { $0 . id < $1 . id } )
66
86
}
67
87
}
68
88
}
0 commit comments