Skip to content

Commit 47b797d

Browse files
committed
Patch: Handle enum values in type extensions
1 parent 62cc9cd commit 47b797d

File tree

11 files changed

+247
-7
lines changed

11 files changed

+247
-7
lines changed

src/WebExtensions.Net.Generator/EntitiesRegistration/AnonymousTypeProcessor.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ private void Process(IEnumerable<string> nameHierarchy, TypeReference? typeRefer
121121
var typeEntity = registrarFactory.TypeEntityRegistrar.GetTypeEntity(typeReference.Ref, namespaceEntity);
122122
if (typeReferencesProcessed.Add(typeEntity.NamespaceQualifiedId))
123123
{
124-
ProcessTypeDefinition(typeEntity.FormattedName, typeEntity.Definition, typeEntity.NamespaceEntity);
124+
ProcessTypeDefinitionWithExtensions(typeEntity.FormattedName, typeEntity.Definition, typeEntity.Extensions, typeEntity.NamespaceEntity);
125125
}
126126
return;
127127
}
@@ -189,14 +189,20 @@ private static bool ShouldRegisterObjectType(TypeReference typeReference)
189189
private static bool ShouldProcessTypeChoices(TypeReference typeReference)
190190
{
191191
if (typeReference.TypeChoices is null ||
192-
typeReference.TypeChoices.All(typeChoice => typeChoice.Type == ObjectType.String && typeChoice.EnumValues is not null))
192+
// When all type choices are enum, it will be handled by EnumClassEntityRegistrar
193+
typeReference.TypeChoices.All(IsEnumString))
193194
{
194195
return false;
195196
}
196197

197198
return true;
198199
}
199200

201+
private static bool IsEnumString(TypeDefinition typeDefinition)
202+
{
203+
return typeDefinition.Type == ObjectType.String && typeDefinition.EnumValues is not null;
204+
}
205+
200206
private static void TryHandleSingleTypeChoice(TypeReference typeReference)
201207
{
202208
if (typeReference.TypeChoices is null)
@@ -421,6 +427,36 @@ private void ProcessTypeChoices(IEnumerable<string> nameHierarchy, IEnumerable<T
421427
Process(SetNameSuffix(nameHierarchy, registrationOptions.TypeChoicesTypeNameSuffix + typeChoiceIndex++), typeChoice, namespaceEntity);
422428
}
423429
}
430+
private void ProcessTypeDefinitionWithExtensions(string className, TypeDefinition typeDefinition, IList<TypeDefinition> extensions, NamespaceEntity namespaceEntity)
431+
{
432+
if (extensions.Count > 0)
433+
{
434+
var enumChoice = typeDefinition.TypeChoices?.FirstOrDefault(IsEnumString);
435+
foreach(var extension in extensions)
436+
{
437+
var enumChoiceExtension = IsEnumString(extension) ? extension : extension.TypeChoices?.FirstOrDefault(IsEnumString);
438+
if (enumChoiceExtension?.EnumValues?.Any() ?? false)
439+
{
440+
if (typeDefinition.EnumValues is not null)
441+
{
442+
typeDefinition.EnumValues = typeDefinition.EnumValues.Concat(enumChoiceExtension.EnumValues).ToList();
443+
}
444+
else if (enumChoice is not null)
445+
{
446+
enumChoice.EnumValues = (enumChoice.EnumValues ?? []).Concat(enumChoiceExtension.EnumValues).ToList();
447+
}
448+
else
449+
{
450+
enumChoice = SerializationHelper.DeserializeTo<TypeDefinition>(enumChoiceExtension);
451+
typeDefinition.TypeChoices = (typeDefinition.TypeChoices ?? [])
452+
.Concat([enumChoice]);
453+
}
454+
}
455+
}
456+
}
457+
458+
Process([className], typeDefinition, namespaceEntity);
459+
}
424460

425461
private static string[] SetNameSuffix(IEnumerable<string> nameHierarchy, string suffix)
426462
{

src/WebExtensions.Net.Generator/Extensions/StringExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static string ToCapitalCase(this string name)
3232

3333
public static string ToCSharpName(this string name, bool toCapitalCase = false, bool avoidReservedKeywords = true)
3434
{
35-
var tokenizedNameSegments = name.Split(['-', '_', '<', '>', ' '], System.StringSplitOptions.RemoveEmptyEntries);
35+
var tokenizedNameSegments = name.Split(['-', '_', '.', '<', '>', ' '], System.StringSplitOptions.RemoveEmptyEntries);
3636
name = string.Join("", tokenizedNameSegments.Select((tokenizedNameSegment, index) =>
3737
{
3838
var startsWithAsciiLetter = char.IsAsciiLetter(tokenizedNameSegment[0]);

src/WebExtensions.Net/Generated/Manifest/OptionalOnlyPermission.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,12 @@ namespace WebExtensions.Net.Manifest
66
[JsonConverter(typeof(EnumStringConverter<OptionalOnlyPermission>))]
77
public enum OptionalOnlyPermission
88
{
9+
/// <summary>trialML</summary>
10+
[EnumValue("trialML")]
11+
TrialML,
12+
13+
/// <summary>userScripts</summary>
14+
[EnumValue("userScripts")]
15+
UserScripts,
916
}
1017
}

src/WebExtensions.Net/Generated/Manifest/OptionalPermissionNoPrompt.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,45 @@ public enum OptionalPermissionNoPrompt
99
/// <summary>idle</summary>
1010
[EnumValue("idle")]
1111
Idle,
12+
13+
/// <summary>cookies</summary>
14+
[EnumValue("cookies")]
15+
Cookies,
16+
17+
/// <summary>scripting</summary>
18+
[EnumValue("scripting")]
19+
Scripting,
20+
21+
/// <summary>webRequest</summary>
22+
[EnumValue("webRequest")]
23+
WebRequest,
24+
25+
/// <summary>webRequestAuthProvider</summary>
26+
[EnumValue("webRequestAuthProvider")]
27+
WebRequestAuthProvider,
28+
29+
/// <summary>webRequestBlocking</summary>
30+
[EnumValue("webRequestBlocking")]
31+
WebRequestBlocking,
32+
33+
/// <summary>webRequestFilterResponse</summary>
34+
[EnumValue("webRequestFilterResponse")]
35+
WebRequestFilterResponse,
36+
37+
/// <summary>webRequestFilterResponse.serviceWorkerScript</summary>
38+
[EnumValue("webRequestFilterResponse.serviceWorkerScript")]
39+
WebRequestFilterResponseServiceWorkerScript,
40+
41+
/// <summary>menus.overrideContext</summary>
42+
[EnumValue("menus.overrideContext")]
43+
MenusOverrideContext,
44+
45+
/// <summary>search</summary>
46+
[EnumValue("search")]
47+
Search,
48+
49+
/// <summary>activeTab</summary>
50+
[EnumValue("activeTab")]
51+
ActiveTab,
1252
}
1353
}

src/WebExtensions.Net/Generated/Manifest/OptionalPermissionType2.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,81 @@ public enum OptionalPermissionType2
2121
/// <summary>notifications</summary>
2222
[EnumValue("notifications")]
2323
Notifications,
24+
25+
/// <summary>browserSettings</summary>
26+
[EnumValue("browserSettings")]
27+
BrowserSettings,
28+
29+
/// <summary>declarativeNetRequestFeedback</summary>
30+
[EnumValue("declarativeNetRequestFeedback")]
31+
DeclarativeNetRequestFeedback,
32+
33+
/// <summary>downloads</summary>
34+
[EnumValue("downloads")]
35+
Downloads,
36+
37+
/// <summary>downloads.open</summary>
38+
[EnumValue("downloads.open")]
39+
DownloadsOpen,
40+
41+
/// <summary>management</summary>
42+
[EnumValue("management")]
43+
Management,
44+
45+
/// <summary>privacy</summary>
46+
[EnumValue("privacy")]
47+
Privacy,
48+
49+
/// <summary>proxy</summary>
50+
[EnumValue("proxy")]
51+
Proxy,
52+
53+
/// <summary>nativeMessaging</summary>
54+
[EnumValue("nativeMessaging")]
55+
NativeMessaging,
56+
57+
/// <summary>webNavigation</summary>
58+
[EnumValue("webNavigation")]
59+
WebNavigation,
60+
61+
/// <summary>bookmarks</summary>
62+
[EnumValue("bookmarks")]
63+
Bookmarks,
64+
65+
/// <summary>browsingData</summary>
66+
[EnumValue("browsingData")]
67+
BrowsingData,
68+
69+
/// <summary>devtools</summary>
70+
[EnumValue("devtools")]
71+
Devtools,
72+
73+
/// <summary>find</summary>
74+
[EnumValue("find")]
75+
Find,
76+
77+
/// <summary>history</summary>
78+
[EnumValue("history")]
79+
History,
80+
81+
/// <summary>pkcs11</summary>
82+
[EnumValue("pkcs11")]
83+
Pkcs11,
84+
85+
/// <summary>sessions</summary>
86+
[EnumValue("sessions")]
87+
Sessions,
88+
89+
/// <summary>tabs</summary>
90+
[EnumValue("tabs")]
91+
Tabs,
92+
93+
/// <summary>tabHide</summary>
94+
[EnumValue("tabHide")]
95+
TabHide,
96+
97+
/// <summary>topSites</summary>
98+
[EnumValue("topSites")]
99+
TopSites,
24100
}
25101
}

src/WebExtensions.Net/Generated/Manifest/Permission.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public partial class Permission : BaseMultiTypeObject
99
{
1010
private readonly PermissionNoPrompt valuePermissionNoPrompt;
1111
private readonly OptionalPermission valueOptionalPermission;
12+
private readonly PermissionType3 valuePermissionType3;
1213

1314
/// <summary>Creates a new instance of <see cref="Permission" />.</summary>
1415
/// <param name="value">The value.</param>
@@ -24,6 +25,13 @@ public Permission(OptionalPermission value) : base(value, typeof(OptionalPermiss
2425
valueOptionalPermission = value;
2526
}
2627

28+
/// <summary>Creates a new instance of <see cref="Permission" />.</summary>
29+
/// <param name="value">The value.</param>
30+
public Permission(PermissionType3 value) : base(value, typeof(PermissionType3))
31+
{
32+
valuePermissionType3 = value;
33+
}
34+
2735
/// <summary>Converts from <see cref="Permission" /> to <see cref="PermissionNoPrompt" />.</summary>
2836
/// <param name="value">The value to convert from.</param>
2937
public static implicit operator PermissionNoPrompt(Permission value) => value.valuePermissionNoPrompt;
@@ -39,5 +47,13 @@ public Permission(OptionalPermission value) : base(value, typeof(OptionalPermiss
3947
/// <summary>Converts from <see cref="OptionalPermission" /> to <see cref="Permission" />.</summary>
4048
/// <param name="value">The value to convert from.</param>
4149
public static implicit operator Permission(OptionalPermission value) => new(value);
50+
51+
/// <summary>Converts from <see cref="Permission" /> to <see cref="PermissionType3" />.</summary>
52+
/// <param name="value">The value to convert from.</param>
53+
public static implicit operator PermissionType3(Permission value) => value.valuePermissionType3;
54+
55+
/// <summary>Converts from <see cref="PermissionType3" /> to <see cref="Permission" />.</summary>
56+
/// <param name="value">The value to convert from.</param>
57+
public static implicit operator Permission(PermissionType3 value) => new(value);
4258
}
4359
}

src/WebExtensions.Net/Generated/Manifest/PermissionNoPromptType3.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,41 @@ public enum PermissionNoPromptType3
1717
/// <summary>unlimitedStorage</summary>
1818
[EnumValue("unlimitedStorage")]
1919
UnlimitedStorage,
20+
21+
/// <summary>contextualIdentities</summary>
22+
[EnumValue("contextualIdentities")]
23+
ContextualIdentities,
24+
25+
/// <summary>declarativeNetRequestWithHostAccess</summary>
26+
[EnumValue("declarativeNetRequestWithHostAccess")]
27+
DeclarativeNetRequestWithHostAccess,
28+
29+
/// <summary>dns</summary>
30+
[EnumValue("dns")]
31+
Dns,
32+
33+
/// <summary>theme</summary>
34+
[EnumValue("theme")]
35+
Theme,
36+
37+
/// <summary>captivePortal</summary>
38+
[EnumValue("captivePortal")]
39+
CaptivePortal,
40+
41+
/// <summary>identity</summary>
42+
[EnumValue("identity")]
43+
Identity,
44+
45+
/// <summary>menus</summary>
46+
[EnumValue("menus")]
47+
Menus,
48+
49+
/// <summary>contextMenus</summary>
50+
[EnumValue("contextMenus")]
51+
ContextMenus,
52+
53+
/// <summary>geckoProfiler</summary>
54+
[EnumValue("geckoProfiler")]
55+
GeckoProfiler,
2056
}
2157
}

src/WebExtensions.Net/Generated/Manifest/PermissionPrivileged.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,21 @@ public enum PermissionPrivileged
99
/// <summary>mozillaAddons</summary>
1010
[EnumValue("mozillaAddons")]
1111
MozillaAddons,
12+
13+
/// <summary>activityLog</summary>
14+
[EnumValue("activityLog")]
15+
ActivityLog,
16+
17+
/// <summary>networkStatus</summary>
18+
[EnumValue("networkStatus")]
19+
NetworkStatus,
20+
21+
/// <summary>telemetry</summary>
22+
[EnumValue("telemetry")]
23+
Telemetry,
24+
25+
/// <summary>normandyAddonStudy</summary>
26+
[EnumValue("normandyAddonStudy")]
27+
NormandyAddonStudy,
1228
}
1329
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace WebExtensions.Net.Manifest
4+
{
5+
/// <summary></summary>
6+
[JsonConverter(typeof(EnumStringConverter<PermissionType3>))]
7+
public enum PermissionType3
8+
{
9+
/// <summary>declarativeNetRequest</summary>
10+
[EnumValue("declarativeNetRequest")]
11+
DeclarativeNetRequest,
12+
}
13+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
This file is auto generated at 2025-03-02T13:19:35
1+
This file is auto generated at 2025-03-02T21:45:07

test/WebExtensions.Net.BrowserExtensionIntegrationTest/Tests/PermissionsApiTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public async Task GetSelf()
3232
{
3333
Permissions =
3434
[
35-
new Permission(new OptionalPermission("alarms")),
36-
new Permission(new OptionalPermission("bookmarks")),
37-
new Permission(new OptionalPermission("cookies"))
35+
new Permission(PermissionNoPromptType3.Alarms),
36+
new Permission(OptionalPermissionType2.Bookmarks),
37+
new Permission((PermissionNoPrompt)OptionalPermissionNoPrompt.Cookies)
3838
]
3939
});
4040

0 commit comments

Comments
 (0)