Skip to content

Commit 14854e2

Browse files
authored
Recognize MacCatalyst as a superset of iOS (#55550)
Recognize MacCatalyst as a superset of iOS and apply platform guard attributes that will inform the analyzer of the relationship.
1 parent ce09822 commit 14854e2

File tree

3 files changed

+40
-14
lines changed

3 files changed

+40
-14
lines changed

src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33

44
using System.Diagnostics;
55
using System.Runtime.Serialization;
6+
using System.Runtime.Versioning;
67

78
namespace System
89
{
910
public sealed class OperatingSystem : ISerializable, ICloneable
1011
{
11-
#if TARGET_UNIX && !TARGET_OSX
12+
#if TARGET_UNIX && !TARGET_OSX && !TARGET_MACCATALYST && !TARGET_IOS
1213
private static readonly string s_osPlatformName = Interop.Sys.GetUnixName();
1314
#endif
1415

@@ -102,6 +103,10 @@ public static bool IsOSPlatform(string platform)
102103
return platform.Equals("WINDOWS", StringComparison.OrdinalIgnoreCase);
103104
#elif TARGET_OSX
104105
return platform.Equals("OSX", StringComparison.OrdinalIgnoreCase) || platform.Equals("MACOS", StringComparison.OrdinalIgnoreCase);
106+
#elif TARGET_MACCATALYST
107+
return platform.Equals("MACCATALYST", StringComparison.OrdinalIgnoreCase) || platform.Equals("IOS", StringComparison.OrdinalIgnoreCase);
108+
#elif TARGET_IOS
109+
return platform.Equals("IOS", StringComparison.OrdinalIgnoreCase);
105110
#elif TARGET_UNIX
106111
return platform.Equals(s_osPlatformName, StringComparison.OrdinalIgnoreCase);
107112
#else
@@ -173,18 +178,20 @@ public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build =
173178
=> IsAndroid() && IsOSVersionAtLeast(major, minor, build, revision);
174179

175180
/// <summary>
176-
/// Indicates whether the current application is running on iOS.
181+
/// Indicates whether the current application is running on iOS or MacCatalyst.
177182
/// </summary>
183+
[SupportedOSPlatformGuard("maccatalyst")]
178184
public static bool IsIOS() =>
179-
#if TARGET_IOS
185+
#if TARGET_IOS || TARGET_MACCATALYST
180186
true;
181187
#else
182188
false;
183189
#endif
184190

185191
/// <summary>
186-
/// Check for the iOS version (returned by 'libobjc.get_operatingSystemVersion') with a >= version comparison. Used to guard APIs that were added in the given iOS release.
192+
/// Check for the iOS/MacCatalyst version (returned by 'libobjc.get_operatingSystemVersion') with a >= version comparison. Used to guard APIs that were added in the given iOS release.
187193
/// </summary>
194+
[SupportedOSPlatformGuard("maccatalyst")]
188195
public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0)
189196
=> IsIOS() && IsOSVersionAtLeast(major, minor, build, 0);
190197

src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,23 @@ public static void OSX_Is_Treated_as_macOS()
132132
[Fact, PlatformSpecific(TestPlatforms.MacCatalyst)]
133133
public static void TestIsOSVersionAtLeast_MacCatalyst() => TestIsOSVersionAtLeast("MacCatalyst");
134134

135+
[Fact, PlatformSpecific(TestPlatforms.MacCatalyst)]
136+
public static void MacCatalyst_Is_Also_iOS()
137+
{
138+
Assert.True(OperatingSystem.IsOSPlatform("IOS"));
139+
Assert.True(OperatingSystem.IsIOS());
140+
141+
AssertVersionChecks(true, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision));
142+
AssertVersionChecks(true, (major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build));
143+
}
144+
145+
[Fact, PlatformSpecific(TestPlatforms.iOS)]
146+
public static void IOS_Is_Not_Also_MacCatalyst()
147+
{
148+
Assert.False(OperatingSystem.IsOSPlatform("MacCatalyst"));
149+
Assert.False(OperatingSystem.IsMacCatalyst());
150+
}
151+
135152
[Fact, PlatformSpecific(TestPlatforms.tvOS)]
136153
public static void TestIsOSPlatform_TvOS() => TestIsOSPlatform("tvOS", OperatingSystem.IsTvOS);
137154

@@ -146,13 +163,13 @@ public static void OSX_Is_Treated_as_macOS()
146163

147164
private static void TestIsOSPlatform(string currentOSName, Func<bool> currentOSCheck)
148165
{
149-
foreach (string platfromName in AllKnownPlatformNames)
166+
foreach (string platformName in AllKnownPlatformNames)
150167
{
151-
bool expected = currentOSName.Equals(platfromName, StringComparison.OrdinalIgnoreCase);
168+
bool expected = currentOSName.Equals(platformName, StringComparison.OrdinalIgnoreCase);
152169

153-
Assert.Equal(expected, OperatingSystem.IsOSPlatform(platfromName));
154-
Assert.Equal(expected, OperatingSystem.IsOSPlatform(platfromName.ToUpper()));
155-
Assert.Equal(expected, OperatingSystem.IsOSPlatform(platfromName.ToLower()));
170+
Assert.Equal(expected, OperatingSystem.IsOSPlatform(platformName));
171+
Assert.Equal(expected, OperatingSystem.IsOSPlatform(platformName.ToUpper()));
172+
Assert.Equal(expected, OperatingSystem.IsOSPlatform(platformName.ToLower()));
156173
}
157174

158175
Assert.True(currentOSCheck());
@@ -176,13 +193,13 @@ private static void TestIsOSPlatform(string currentOSName, Func<bool> currentOSC
176193

177194
private static void TestIsOSVersionAtLeast(string currentOSName)
178195
{
179-
foreach (string platfromName in AllKnownPlatformNames)
196+
foreach (string platformName in AllKnownPlatformNames)
180197
{
181-
bool isCurrentOS = currentOSName.Equals(platfromName, StringComparison.OrdinalIgnoreCase);
198+
bool isCurrentOS = currentOSName.Equals(platformName, StringComparison.OrdinalIgnoreCase);
182199

183-
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platfromName, major, minor, build, revision));
184-
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platfromName.ToLower(), major, minor, build, revision));
185-
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platfromName.ToUpper(), major, minor, build, revision));
200+
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName, major, minor, build, revision));
201+
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName.ToLower(), major, minor, build, revision));
202+
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName.ToUpper(), major, minor, build, revision));
186203
}
187204

188205
AssertVersionChecks(currentOSName.Equals("Android", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsAndroidVersionAtLeast);

src/libraries/System.Runtime/ref/System.Runtime.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4965,7 +4965,9 @@ public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, S
49654965
public static bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) { throw null; }
49664966
public static bool IsAndroid() { throw null; }
49674967
public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) { throw null; }
4968+
[System.Runtime.Versioning.SupportedOSPlatformGuardAttribute("maccatalyst")]
49684969
public static bool IsIOS() { throw null; }
4970+
[System.Runtime.Versioning.SupportedOSPlatformGuardAttribute("maccatalyst")]
49694971
public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0) { throw null; }
49704972
public static bool IsMacOS() { throw null; }
49714973
public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0) { throw null; }

0 commit comments

Comments
 (0)