@@ -10,12 +10,14 @@ public partial class JavaApi
10
10
{
11
11
public JavaApi ( )
12
12
{
13
- Packages = new List < JavaPackage > ( ) ;
13
+ Packages = new Dictionary < string , JavaPackage > ( StringComparer . OrdinalIgnoreCase ) ;
14
14
}
15
15
16
16
public string ? ExtendedApiSource { get ; set ; }
17
17
public string ? Platform { get ; set ; }
18
- public IList < JavaPackage > Packages { get ; set ; }
18
+ public IDictionary < string , JavaPackage > Packages { get ; }
19
+
20
+ public ICollection < JavaPackage > AllPackages => Packages . Values ;
19
21
}
20
22
21
23
public partial class JavaPackage
@@ -24,15 +26,61 @@ public JavaPackage (JavaApi? parent)
24
26
{
25
27
Parent = parent ;
26
28
27
- Types = new List < JavaType > ( ) ;
29
+ Types = new Dictionary < string , List < JavaType > > ( StringComparer . OrdinalIgnoreCase ) ;
28
30
}
29
31
30
32
public JavaApi ? Parent { get ; private set ; }
31
33
32
34
public string ? Name { get ; set ; }
33
35
public string ? JniName { get ; set ; }
34
- public IList < JavaType > Types { get ; set ; }
35
-
36
+
37
+ // Yes, there can be multiple types with the same *Java* name.
38
+ // For example:
39
+ // - MyInterface
40
+ // - MyInterfaceConsts
41
+ // It's debatable whether we handle this "properly", as most callers just
42
+ // do `First ()`, but it's been working for years so I'm not changing it.
43
+ // Exposes an IReadOnlyDictionary so caller cannot bypass our AddType/RemoveType code.
44
+ public IReadOnlyDictionary < string , List < JavaType > > Types { get ; }
45
+
46
+ // Use this for a flat list of *all* types
47
+ public IEnumerable < JavaType > AllTypes => Types . Values . SelectMany ( v => v ) ;
48
+
49
+ public void AddType ( string name , JavaType type )
50
+ {
51
+ // If this is a duplicate key, add it to existing list
52
+ if ( Types . TryGetValue ( name , out var list ) ) {
53
+ list . Add ( type ) ;
54
+ return ;
55
+ }
56
+
57
+ // Add to a new list
58
+ var new_list = new List < JavaType > ( ) ;
59
+ new_list . Add ( type ) ;
60
+
61
+ ( ( IDictionary < string , List < JavaType > > ) Types ) . Add ( name , new_list ) ;
62
+ }
63
+
64
+ public void RemoveType ( string name , JavaType type )
65
+ {
66
+ if ( ! Types . TryGetValue ( name , out var list ) )
67
+ return ;
68
+
69
+ // Remove 1 type from list if it contains multiple types
70
+ if ( list . Count > 1 ) {
71
+ list . Remove ( type ) ;
72
+ return ;
73
+ }
74
+
75
+ // Remove the whole dictionary entry
76
+ ( ( IDictionary < string , List < JavaType > > ) Types ) . Remove ( name ) ;
77
+ }
78
+
79
+ public void ClearTypes ( )
80
+ {
81
+ ( ( IDictionary < string , List < JavaType > > ) Types ) . Clear ( ) ;
82
+ }
83
+
36
84
// Content of this value is not stable.
37
85
public override string ToString ( )
38
86
{
@@ -123,14 +171,14 @@ static ManagedType ()
123
171
dummy_system_package = new JavaPackage ( null ) { Name = "System" } ;
124
172
system_object = new ManagedType ( dummy_system_package ) { Name = "Object" } ;
125
173
system_exception = new ManagedType ( dummy_system_package ) { Name = "Exception" } ;
126
- dummy_system_package . Types . Add ( system_object ) ;
127
- dummy_system_package . Types . Add ( system_exception ) ;
174
+ dummy_system_package . AddType ( system_object . Name , system_object ) ;
175
+ dummy_system_package . AddType ( system_exception . Name , system_exception ) ;
128
176
dummy_system_io_package = new JavaPackage ( null ) { Name = "System.IO" } ;
129
177
system_io_stream = new ManagedType ( dummy_system_io_package ) { Name = "Stream" } ;
130
- dummy_system_io_package . Types . Add ( system_io_stream ) ;
178
+ dummy_system_io_package . AddType ( system_io_stream . Name , system_io_stream ) ;
131
179
dummy_system_xml_package = new JavaPackage ( null ) { Name = "System.Xml" } ;
132
180
system_xml_xmlreader = new ManagedType ( dummy_system_xml_package ) { Name = "XmlReader" } ;
133
- dummy_system_io_package . Types . Add ( system_xml_xmlreader ) ;
181
+ dummy_system_io_package . AddType ( system_xml_xmlreader . Name , system_xml_xmlreader ) ;
134
182
}
135
183
136
184
public static IEnumerable < JavaPackage > DummyManagedPackages {
0 commit comments