From 852496d5de668837be2bd5483553293a2df299bd Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 27 Sep 2024 10:16:56 +0200 Subject: [PATCH 001/155] [devops] Only fetch the exact remote branches we need to undo the GitHub merge. (#21266) This will typically save between 1 and 2 minutes for every test run. But potentially much more if GitHub happens to be slow: ``` [...] Working on a PR, Undoing the github merge with main. ##[error]The task has timed out. [...] ``` --- tools/devops/automation/scripts/undo_github_merge.ps1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/devops/automation/scripts/undo_github_merge.ps1 b/tools/devops/automation/scripts/undo_github_merge.ps1 index 32befd505352..af8e54f627a9 100644 --- a/tools/devops/automation/scripts/undo_github_merge.ps1 +++ b/tools/devops/automation/scripts/undo_github_merge.ps1 @@ -11,8 +11,11 @@ param if($IsPr.ToLower() -eq "true") { Write-Host "Working on a PR, Undoing the github merge with main." - git config remote.origin.fetch '+refs/pull/*:refs/remotes/origin/pull/*' - git fetch origin + $refspec="+refs/pull/$Env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER/*:refs/remotes/origin/pull/$Env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER/*" + + Write-Host "Refspec: $refspec" + + git fetch origin "$refspec" $branch="$SourceBranch".Replace("merge", "head") $branch=$branch.Replace("refs", "origin") From 3790cbda5a3ed195758371e669e81e3219dcddba Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 27 Sep 2024 17:17:32 +0200 Subject: [PATCH 002/155] [devops] Add a bit more info when showing the enviroment. (#21311) Also show: * The network configuration * The load on the system / cpu usage (top) --- tools/devops/automation/scripts/show_env.ps1 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/devops/automation/scripts/show_env.ps1 b/tools/devops/automation/scripts/show_env.ps1 index 2a265dd21563..7852d1ad7c7a 100644 --- a/tools/devops/automation/scripts/show_env.ps1 +++ b/tools/devops/automation/scripts/show_env.ps1 @@ -15,6 +15,20 @@ gci env: | format-table -autosize | Out-String -Width 8192 gci env: | format-table -autosize -wrap if ($IsMacOS) { + Write-Host "" + Write-Host "## System profile" + Write-Host "" system_profiler SPSoftwareDataType SPHardwareDataType SPDeveloperToolsDataType + + Write-Host "" + Write-Host "## Network configuration" + Write-Host "" + ifconfig | grep 'inet ' + + + Write-Host "" + Write-Host "## Top processes" + Write-Host "" + top -l 1 -o TIME } From fc9d73b76170631adeff5cc06d8ba73516e3bde6 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 27 Sep 2024 18:19:03 +0200 Subject: [PATCH 003/155] [devops] Unify and simplify provisionator provisioning. (#21268) This should speed up getting bots ready, since now we only run the provisionator once for each bot, and we also don't try to provision the same thing multiple times. --- .gitignore | 4 +- tools/devops/Makefile | 39 +----- .../automation/templates/build/build.yml | 12 +- .../automation/templates/tests/build.yml | 16 +-- .../templates/windows/reserve-mac.yml | 2 +- tools/devops/build-provisioning.csx | 8 ++ tools/devops/build-provisioning.csx.in | 38 ------ tools/devops/device-tests-provisioning.csx.in | 15 --- tools/devops/mac-tests-provisioning.csx.in | 34 ----- tools/devops/provision-brew-packages.csx | 12 +- tools/devops/provision-shared.csx | 103 --------------- tools/devops/provision-shared.in.csx | 118 ++++++++++++++++++ tools/devops/provision-xcode.csx | 4 + tools/devops/provision-xcode.csx.in | 34 ----- 14 files changed, 142 insertions(+), 297 deletions(-) create mode 100644 tools/devops/build-provisioning.csx delete mode 100644 tools/devops/build-provisioning.csx.in delete mode 100644 tools/devops/device-tests-provisioning.csx.in delete mode 100644 tools/devops/mac-tests-provisioning.csx.in delete mode 100644 tools/devops/provision-shared.csx create mode 100644 tools/devops/provision-shared.in.csx create mode 100644 tools/devops/provision-xcode.csx delete mode 100644 tools/devops/provision-xcode.csx.in diff --git a/.gitignore b/.gitignore index b02321a54319..1e6128bc5658 100644 --- a/.gitignore +++ b/.gitignore @@ -34,9 +34,7 @@ tests/bcl-test/SystemCoreXunit*.csproj tests/bcl-test/SystemXunit.csproj global.json .idea -device-tests-provisioning.csx -build-provisioning.csx -provision-xcode.csx +provision-shared.csx mono_crash.*.json *.binlog .vscode diff --git a/tools/devops/Makefile b/tools/devops/Makefile index 74771d5c78d6..873bc40bfc4b 100644 --- a/tools/devops/Makefile +++ b/tools/devops/Makefile @@ -1,44 +1,13 @@ TOP=../.. include $(TOP)/Make.config -device-tests-provisioning.csx: device-tests-provisioning.csx.in Makefile $(TOP)/Make.config - $(Q_GEN) sed \ - -e 's#@XCODE_XIP_NAME@#$(notdir $(XCODE_URL))#g' \ - -e 's#@MONO_PACKAGE@#$(MIN_MONO_URL)#g' \ - -e 's#@MIN_SHARPIE_URL@#$(MIN_SHARPIE_URL)#g' \ - -e 's#@INCLUDE_MAC@#$(INCLUDE_MAC)#g' \ - -e 's#@INCLUDE_IOS@#$(INCLUDE_IOS)#g' \ - -e 's#@INCLUDE_TVOS@#$(INCLUDE_TVOS)#g' \ - -e 's#@INCLUDE_WATCH@#$(INCLUDE_WATCH)#g' \ - $< > $@; - @echo "Generated $@:" - @cat $@ - -build-provisioning.csx: build-provisioning.csx.in Makefile $(TOP)/Make.config +provision-shared.csx: provision-shared.in.csx Makefile $(TOP)/Make.config $(Q_GEN) sed \ -e 's#@XCODE_XIP_NAME@#$(notdir $(XCODE_URL))#g' \ + -e 's#@XCODE_ROOT_PATH@#$(XCODE_DEVELOPER_ROOT)#g' \ -e 's#@MONO_PACKAGE@#$(MIN_MONO_URL)#g' \ -e 's#@MIN_SHARPIE_URL@#$(MIN_SHARPIE_URL)#g' \ - $< > $@; - @echo "Generated $@:" - @cat $@ - -mac-tests-provisioning.csx: mac-tests-provisioning.csx.in Makefile $(TOP)/Make.config - $(Q_GEN) sed \ - -e 's#@MONO_PACKAGE@#$(MIN_MONO_URL)#g' \ - -e 's#@INCLUDE_MAC@#$(INCLUDE_MAC)#g' \ - -e 's#@INCLUDE_IOS@#$(INCLUDE_IOS)#g' \ - $< > $@; - @echo "Generated $@:" - @cat $@ - -provision-xcode.csx: provision-xcode.csx.in Makefile $(TOP)/Make.config - $(Q_GEN) sed \ - -e 's#@XCODE_XIP_NAME@#$(notdir $(XCODE_URL))#g' \ - -e 's#@XCODE_ROOT_PATH@#$(XCODE_DEVELOPER_ROOT)#g' \ - $< > $@; - @echo "Generated $@:" - @cat $@ + $< > $@ LocProject.json: LocProject.json.in Makefile $(TOP)/Make.config $(Q_GEN) sed \ @@ -65,4 +34,4 @@ print-variable: print-variable-value-to-file: @echo $($(VARIABLE)) > "$(FILE)" -provisioning: build-provisioning.csx device-tests-provisioning.csx provision-xcode.csx +provisioning: provision-shared.csx diff --git a/tools/devops/automation/templates/build/build.yml b/tools/devops/automation/templates/build/build.yml index 7838afd4894c..4b284dfb5805 100644 --- a/tools/devops/automation/templates/build/build.yml +++ b/tools/devops/automation/templates/build/build.yml @@ -64,18 +64,8 @@ steps: MacDeveloper: $(mac-developer) HostedMacKeychainPassword: ${{ parameters.keyringPass }} - - task: xamops.azdevex.provisionator-task.provisionator@2 - displayName: 'Provision Brew components' - inputs: - provisioning_script: $(Build.SourcesDirectory)/xamarin-macios/tools/devops/provision-brew-packages.csx - provisioning_extra_args: '-vvvv' - github_token: ${{ parameters.gitHubToken }} - timeoutInMinutes: 30 - enabled: true - continueOnError: true # brew installation can be temperamental, and things usually work even if the installation fail. - - bash: | - make -C $(Build.SourcesDirectory)/xamarin-macios/tools/devops build-provisioning.csx + make -C $(Build.SourcesDirectory)/xamarin-macios/tools/devops provisioning displayName: 'Generate provisionator files.' - task: xamops.azdevex.provisionator-task.provisionator@2 diff --git a/tools/devops/automation/templates/tests/build.yml b/tools/devops/automation/templates/tests/build.yml index dd8b8158bf5f..e8b12d92a345 100644 --- a/tools/devops/automation/templates/tests/build.yml +++ b/tools/devops/automation/templates/tests/build.yml @@ -220,7 +220,7 @@ steps: timeoutInMinutes: 5 - bash: | - make -C $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/ device-tests-provisioning.csx + make -C $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/ provisioning displayName: 'Generate Provisionator csx file' # Executed ONLY if we want to clear the provisionator cache. @@ -234,19 +234,7 @@ steps: - task: xamops.azdevex.provisionator-task.provisionator@2 displayName: 'Provision dependencies' inputs: - provisioning_script: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/device-tests-provisioning.csx - provisioning_extra_args: '-vvvv' - github_token: ${{ parameters.gitHubToken }} - timeoutInMinutes: 250 - -- bash: | - make -C $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/ mac-tests-provisioning.csx - displayName: 'Generate Provisionator csx file for macOS' - -- task: xamops.azdevex.provisionator-task.provisionator@2 - displayName: 'Provision Xamarin.Mac' - inputs: - provisioning_script: $(Build.SourcesDirectory)/xamarin-macios/tools/devops/mac-tests-provisioning.csx + provisioning_script: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/build-provisioning.csx provisioning_extra_args: '-vvvv' github_token: ${{ parameters.gitHubToken }} timeoutInMinutes: 250 diff --git a/tools/devops/automation/templates/windows/reserve-mac.yml b/tools/devops/automation/templates/windows/reserve-mac.yml index afbd6e7dc216..9c8710d9b619 100644 --- a/tools/devops/automation/templates/windows/reserve-mac.yml +++ b/tools/devops/automation/templates/windows/reserve-mac.yml @@ -85,7 +85,7 @@ steps: $vsts.Agents.SetEnabled($pool, $agent, $False) displayName: "Disable macOS bot from pool" -- bash: make -C $(Build.SourcesDirectory)/xamarin-macios/tools/devops provision-xcode.csx +- bash: make -C $(Build.SourcesDirectory)/xamarin-macios/tools/devops provisioning displayName: 'Generate Xcode provisioning csx file' - task: xamops.azdevex.provisionator-task.provisionator@2 diff --git a/tools/devops/build-provisioning.csx b/tools/devops/build-provisioning.csx new file mode 100644 index 000000000000..de6a84226d26 --- /dev/null +++ b/tools/devops/build-provisioning.csx @@ -0,0 +1,8 @@ +#load "provision-shared.csx" + +if (!ProvisionXcode ()) + return 1; +ProvisionMono (); +ProvisionSharpie (); +ProvisionBrewPackages (); +SetDefaultXcodeInVSMac (); diff --git a/tools/devops/build-provisioning.csx.in b/tools/devops/build-provisioning.csx.in deleted file mode 100644 index 2fba863a6961..000000000000 --- a/tools/devops/build-provisioning.csx.in +++ /dev/null @@ -1,38 +0,0 @@ -#r "_provisionator/provisionator.dll" - -using System.IO; -using System.Reflection; -using System.Linq; - -using static Xamarin.Provisioning.ProvisioningScript; - -// Provision Xcode using the xip name declared in Make.config -Xcode ("@XCODE_XIP_NAME@").XcodeSelect (allowUntrusted: true); - -// provisionator knows how to deal with this items -Item ("@MONO_PACKAGE@"); -Item ("@MIN_SHARPIE_URL@"); - -var appleSdkOverride = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), "Library", "Preferences", "Xamarin", "Settings.plist"); -Item ("Override Apple SDK Settings") - .Action (item => { - DeleteSafe (appleSdkOverride); - CreateSetting (appleSdkOverride, "AppleSdkRoot", GetSelectedXcodePath ()); - Console.WriteLine ($"New iOS SDK Location: {GetSettingValue (appleSdkOverride, "AppleSdkRoot")}"); - }); - -void DeleteSafe (string file) -{ - if (File.Exists (file)) - File.Delete (file); -} - -void CreateSetting (string settingFile, string key, string value) -{ - Exec ("defaults", "write", settingFile, key, value); -} - -string GetSettingValue (string settingFile, string keyName) -{ - return Exec ("defaults", "read", settingFile, keyName).FirstOrDefault (); -} diff --git a/tools/devops/device-tests-provisioning.csx.in b/tools/devops/device-tests-provisioning.csx.in deleted file mode 100644 index 1834b99bbe52..000000000000 --- a/tools/devops/device-tests-provisioning.csx.in +++ /dev/null @@ -1,15 +0,0 @@ -#r "_provisionator/provisionator.dll" - -using System.IO; -using System.Reflection; -using System.Linq; - -using static Xamarin.Provisioning.ProvisioningScript; - -// Provision Xcode using the xip name declared in Make.config -Xcode ("@XCODE_XIP_NAME@").XcodeSelect (allowUntrusted: true); - -Item ("@MONO_PACKAGE@"); -Item ("@MIN_SHARPIE_URL@"); - -BrewPackages ("p7zip"); diff --git a/tools/devops/mac-tests-provisioning.csx.in b/tools/devops/mac-tests-provisioning.csx.in deleted file mode 100644 index 7bbea84ce87e..000000000000 --- a/tools/devops/mac-tests-provisioning.csx.in +++ /dev/null @@ -1,34 +0,0 @@ -#r "_provisionator/provisionator.dll" - -using System.IO; -using System.Reflection; -using System.Linq; - -using static Xamarin.Provisioning.ProvisioningScript; - -BrewPackages ("p7zip"); - -var appleSdkOverride = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.UserProfile), "Library", "Preferences", "Xamarin", "Settings.plist"); -Item ("Override Apple SDK Settings") - .Condition (item => !File.Exists (appleSdkOverride) || GetSettingValue (appleSdkOverride, "AppleSdkRoot") != GetSelectedXcodePath ()) - .Action (item => { - DeleteSafe (appleSdkOverride); - CreateSetting (appleSdkOverride, "AppleSdkRoot", GetSelectedXcodePath ()); - Console.WriteLine ($"New VSMac iOS SDK Location: {GetSelectedXcodePath ()}"); - }); - -void DeleteSafe (string file) -{ - if (File.Exists (file)) - File.Delete (file); -} - -void CreateSetting (string settingFile, string key, string value) -{ - Exec ("defaults", "write", settingFile, key, value); -} - -string GetSettingValue (string settingFile, string keyName) -{ - return Exec ("defaults", "read", settingFile, keyName).FirstOrDefault (); -} diff --git a/tools/devops/provision-brew-packages.csx b/tools/devops/provision-brew-packages.csx index 291ec5e294cd..1b0789b311f6 100644 --- a/tools/devops/provision-brew-packages.csx +++ b/tools/devops/provision-brew-packages.csx @@ -1,9 +1,3 @@ -BrewPackages ( - "shellcheck", - "yamllint", - "cmake", - "p7zip", - "msitools", - "wget", - "azure-cli" - ); +#load "provision-shared.csx" + +ProvisionBrewPackages (); diff --git a/tools/devops/provision-shared.csx b/tools/devops/provision-shared.csx deleted file mode 100644 index f01699237aee..000000000000 --- a/tools/devops/provision-shared.csx +++ /dev/null @@ -1,103 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -using Newtonsoft.Json.Linq; - -using Xamarin.Provisioning; -using Xamarin.Provisioning.Model; -using Xamarin.Provisioning.IO; - -var commit = Environment.GetEnvironmentVariable ("BUILD_SOURCEVERSION"); -var provision_from_commit = Environment.GetEnvironmentVariable ("PROVISION_FROM_COMMIT") ?? commit; - -// Looks for a variable either in the environment, or in current repo's Make.config. -// Returns null if the variable couldn't be found. -IEnumerable make_config = null; -string FindConfigurationVariable (string variable, string hash = "HEAD") -{ - var value = Environment.GetEnvironmentVariable (variable); - if (!string.IsNullOrEmpty (value)) - return value; - - if (make_config == null) { - try { - make_config = Exec ("git", "show", $"{hash}:Make.config"); - } catch { - Console.WriteLine ("Could not find a Make.config"); - return null; - } - } - foreach (var line in make_config) { - if (line.StartsWith (variable + "=", StringComparison.Ordinal)) - return line.Substring (variable.Length + 1); - } - - return null; -} - -string FindVariable (string variable) -{ - var value = FindConfigurationVariable (variable, provision_from_commit); - if (!string.IsNullOrEmpty (value)) - return value; - - throw new Exception ($"Could not find {variable} in environment nor in the commit's ({commit}) manifest."); -} - -void ExecVerbose (string filename, params string[] args) -{ - Console.WriteLine ($"{filename} {string.Join (" ", args)}"); - Exec (filename, args); -} - -bool IsAtLeastVersion(string actualVer, string minVer) -{ - if (actualVer.Equals(minVer, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - - var actualVerChars = actualVer.ToCharArray(); - var minVerChars = minVer.ToCharArray(); - - var length = Math.Min (minVerChars.Length, actualVerChars.Length); - - var i = 0; - while (i < length) - { - if (actualVerChars[i] > minVerChars[i]) - { - return true; - } - else if (minVerChars[i] > actualVerChars[i]) - { - return false; - } - i++; - } - - if (actualVerChars.Length == minVerChars.Length) - { - return true; - } - - return actualVerChars.Length > minVerChars.Length; -} - -void RemoveXcodeSymlinks (string xcodePath) -{ - Console.WriteLine ($"Checkig if '{xcodePath}' is a symlink..."); - var resolvedPath = Symlink.Resolve (xcodePath); - Console.WriteLine ($"Path resolved: '{resolvedPath}'"); - if (resolvedPath is string) { - Console.WriteLine ($"Removing '{xcodePath}' symlink."); - Symlink.Delete (xcodePath); - Console.WriteLine ($"Renaming '{resolvedPath}' into '{xcodePath}'"); - ElevatedExec ("/bin/mv", resolvedPath, xcodePath); - } else - Console.WriteLine ($"'{xcodePath}' is not a symlink."); -} diff --git a/tools/devops/provision-shared.in.csx b/tools/devops/provision-shared.in.csx new file mode 100644 index 000000000000..53816241322a --- /dev/null +++ b/tools/devops/provision-shared.in.csx @@ -0,0 +1,118 @@ +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +using Newtonsoft.Json.Linq; + +using Xamarin.Provisioning; +using Xamarin.Provisioning.Model; +using Xamarin.Provisioning.IO; + +var commit = Environment.GetEnvironmentVariable ("BUILD_SOURCEVERSION"); +var provision_from_commit = Environment.GetEnvironmentVariable ("PROVISION_FROM_COMMIT") ?? commit; + +void RemoveXcodeSymlinks (string xcodePath) +{ + Console.WriteLine ($"Checking if '{xcodePath}' is a symlink..."); + var resolvedPath = Symlink.Resolve (xcodePath); + Console.WriteLine ($"Path resolved: '{resolvedPath}'"); + if (resolvedPath is string) { + Console.WriteLine ($"Removing '{xcodePath}' symlink."); + Symlink.Delete (xcodePath); + Console.WriteLine ($"Renaming '{resolvedPath}' into '{xcodePath}'"); + ElevatedExec ("/bin/mv", resolvedPath, xcodePath); + } else + Console.WriteLine ($"'{xcodePath}' is not a symlink."); +} + +void ListXcodes () +{ + Console.WriteLine ($"Xcodes:"); + var lines = Exec ("bash", "-c", "ls -lad /Applications/Xcode*"); + foreach (var line in lines) + Console.WriteLine ($"\t{line}"); +} + +// Provision Xcode using the xip name declared in Make.config +// +// Overrides: +// * The current commit can be overridden by setting the PROVISION_FROM_COMMIT variable. +bool ProvisionXcode () +{ + + if (string.IsNullOrEmpty (provision_from_commit)) { + Console.Error.WriteLine ($"Either BUILD_SOURCEVERSION or PROVISION_FROM_COMMIT must be set."); + Environment.Exit (1); + return false; + } + + ListXcodes (); + + // Provision Xcode + Console.WriteLine ($"Provisioning Xcode from {provision_from_commit}..."); + + // Let's turn symlink into an actual path + var reqXcode = Path.GetDirectoryName (Path.GetDirectoryName ("@XCODE_ROOT_PATH@")); + RemoveXcodeSymlinks (reqXcode); + + // Provision Xcode using the xip name declared in Make.config + Xcode ("@XCODE_XIP_NAME@").XcodeSelect (allowUntrusted: true); + + LogInstalledXcodes (); + return true; +} + +void ProvisionBrewPackages () +{ + BrewPackages ( + "shellcheck", + "yamllint", + "cmake", + "p7zip", + "msitools", + "wget", + "azure-cli" + ); +} + +void SetDefaultXcodeInVSMac () +{ + var appleSdkOverride = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.UserProfile), "Library", "Preferences", "Xamarin", "Settings.plist"); + Item ("Override Apple SDK Settings") + .Condition (item => !File.Exists (appleSdkOverride) || GetSettingValue (appleSdkOverride, "AppleSdkRoot") != GetSelectedXcodePath ()) + .Action (item => { + DeleteSafe (appleSdkOverride); + CreateSetting (appleSdkOverride, "AppleSdkRoot", GetSelectedXcodePath ()); + Console.WriteLine ($"New VSMac iOS SDK Location: {GetSelectedXcodePath ()}"); + }); + +} + +void DeleteSafe (string file) +{ + if (File.Exists (file)) + File.Delete (file); +} + +void CreateSetting (string settingFile, string key, string value) +{ + Exec ("defaults", "write", settingFile, key, value); +} + +string GetSettingValue (string settingFile, string keyName) +{ + return Exec ("defaults", "read", settingFile, keyName).FirstOrDefault (); +} + +void ProvisionMono () +{ + Item ("@MONO_PACKAGE@"); +} + +void ProvisionSharpie () +{ + Item ("@MIN_SHARPIE_URL@"); +} diff --git a/tools/devops/provision-xcode.csx b/tools/devops/provision-xcode.csx new file mode 100644 index 000000000000..4a4785ea7462 --- /dev/null +++ b/tools/devops/provision-xcode.csx @@ -0,0 +1,4 @@ +#load "provision-shared.csx" + +if (ProvisionXcode ()) + return 1; diff --git a/tools/devops/provision-xcode.csx.in b/tools/devops/provision-xcode.csx.in deleted file mode 100644 index ea30ad8f6ec8..000000000000 --- a/tools/devops/provision-xcode.csx.in +++ /dev/null @@ -1,34 +0,0 @@ -#load "provision-shared.csx" - -// Provision Xcode -// -// Overrides: -// * The current commit can be overridden by setting the PROVISION_FROM_COMMIT variable. - -void ListXcodes () -{ - Console.WriteLine ($"Xcodes:"); - var lines = Exec ("bash", "-c", "ls -lad /Applications/Xcode*"); - foreach (var line in lines) - Console.WriteLine ($"\t{line}"); -} - -if (string.IsNullOrEmpty (provision_from_commit)) { - Console.Error.WriteLine ($"Either BUILD_SOURCEVERSION or PROVISION_FROM_COMMIT must be set."); - Environment.Exit (1); - return 1; -} - -ListXcodes (); - -// Provision Xcode -Console.WriteLine ($"Provisioning Xcode from {provision_from_commit}..."); - -// Let's turn symlink into an actual path -var reqXcode = Path.GetDirectoryName (Path.GetDirectoryName ("@XCODE_ROOT_PATH@")); -RemoveXcodeSymlinks (reqXcode); - -// Provision Xcode using the xip name declared in Make.config -Xcode ("@XCODE_XIP_NAME@").XcodeSelect (allowUntrusted: true); - -LogInstalledXcodes (); From ac21d087adac968b3c7ec827d38d36792299d687 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:08:43 +0200 Subject: [PATCH 004/155] [main] Update dependencies from dotnet/xharness (#21329) This pull request updates the following dependencies ## From https://github.com/dotnet/xharness - **Subscription**: 601bc5e1-1cae-44b5-cf5f-08db9342aa2f - **Build**: 20240926.1 - **Date Produced**: September 26, 2024 1:44:39 PM UTC - **Commit**: 7d5c32dbda0c6c8b9dc20cde4e1261b191896138 - **Branch**: refs/heads/main - **Updates**: - **Microsoft.DotNet.XHarness.iOS.Shared**: [from 10.0.0-prerelease.24467.4 to 10.0.0-prerelease.24476.1][1] [1]: https://github.com/dotnet/xharness/compare/3cfb1a3d86...7d5c32dbda --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 55990589f698..2f99556a26ea 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -82,9 +82,9 @@ https://github.com/dotnet/templating - + https://github.com/dotnet/xharness - 3cfb1a3d86da666fb80ba0adb970525e88339d57 + 7d5c32dbda0c6c8b9dc20cde4e1261b191896138 diff --git a/eng/Versions.props b/eng/Versions.props index 2424d9aaf1a5..fde4e95f4094 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -12,7 +12,7 @@ 8.0.0-rtm.23511.3 8.0.0 7.0.100-alpha.1.21601.1 - 10.0.0-prerelease.24467.4 + 10.0.0-prerelease.24476.1 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) From 2cc9af4c0126cb0242a94fb760c969f96cbd5a9c Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 30 Sep 2024 23:55:33 +0200 Subject: [PATCH 005/155] Bump maccore. (#21319) New commits in xamarin/maccore: * xamarin/maccore@c1a17a2f80 [mlaunch] Install and launch apps without using the AMDevice API for devices that devicectl supports. Diff: https://github.com/xamarin/maccore/compare/ad4af9cde4..c1a17a2f80 Fixes https://github.com/xamarin/xamarin-macios/issues/21274. --- mk/xamarin.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mk/xamarin.mk b/mk/xamarin.mk index a1590c9054be..45698e3896d6 100644 --- a/mk/xamarin.mk +++ b/mk/xamarin.mk @@ -18,7 +18,7 @@ endif # Available versions can be seen here: # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/Microsoft.Tools.Mlaunch/versions -MLAUNCH_NUGET_VERSION=1.0.256 +MLAUNCH_NUGET_VERSION=1.0.261 define CheckVersionTemplate check-$(1):: From 54701328f1fa1e638f35d171f466e7869c6775f6 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 00:23:02 +0200 Subject: [PATCH 006/155] =?UTF-8?q?[build]=C2=A0Shutdown/kill=20any=20buil?= =?UTF-8?q?d=20servers=20at=20the=20end=20of=20the=20build.=20(#21315)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a log from our bots, note the 14 minute gap just before printing the timing results: ``` [...] 2024-09-27T07:34:00.3958920Z Making install in dotnet 2024-09-27T07:34:01.7633820Z Validated file permissions for Xamarin.Mac. 2024-09-27T07:34:01.7800150Z Validated file permissions for Xamarin.iOS. 2024-09-27T07:34:01.7825300Z 2024-09-27T07:34:01.7872490Z Xamarin.iOS has not been installed into your system by 'make install' 2024-09-27T07:34:01.7918570Z In order to set the currently built Xamarin.iOS as your system version, 2024-09-27T07:34:01.7965090Z execute 'make install-system'. 2024-09-27T07:34:01.7987920Z 2024-09-27T07:34:01.8034290Z Xamarin.Mac has not been installed into your system by 'make install' 2024-09-27T07:34:01.8080260Z In order to set the currently built Xamarin.Mac as your system version, 2024-09-27T07:34:01.8126200Z execute 'make install-system'. 2024-09-27T07:34:01.8148530Z 2024-09-27T07:48:22.3100850Z 2024-09-27T07:48:22.3102130Z real 15m26.160s 2024-09-27T07:48:22.3102800Z user 1m4.044s 2024-09-27T07:48:22.3103270Z sys 0m18.379s ``` What happens is this: * We're using parallel make, and parallel make will start a jobserver, managed by file descriptors, where these file descriptors must be closed in all subprocesses for make to realize it's done. * Any 'dotnet build' might start a build server * The build server does not close any file descriptors it may have inherited when daemonizing itself. * Thus the build server (which will still be alive after we're done building here) might have a file descriptor open which make is waiting for. * The proper fix is to fix the build server to close its file descriptors. * The intermediate working is to shut down the build server instead. This will save 10-15 minutes at the end of every build in the bots. --- Makefile | 1 + dotnet/Makefile | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ef263bb0ceaa..5f79a6024671 100644 --- a/Makefile +++ b/Makefile @@ -110,6 +110,7 @@ else @echo endif endif + $(Q) $(MAKE) -C dotnet shutdown-build-server .PHONY: package release package release: diff --git a/dotnet/Makefile b/dotnet/Makefile index 24c2192d4db2..a11033872d0d 100644 --- a/dotnet/Makefile +++ b/dotnet/Makefile @@ -546,4 +546,9 @@ all-hook:: $(Q) $(MAKE) shutdown-build-server shutdown-build-server: - $(Q) $(DOTNET) build-server shutdown + $(Q) echo "Shutting down build servers:" + $(Q) $(DOTNET) build-server shutdown | sed 's/^/ /' || true + $(Q) echo "Listing .NET processes still alive:" + $(Q) pgrep -lf "^$(DOTNET)" | sed 's/^/ /' || true + $(Q) echo "Killing the above mentioned processes." + $(Q) pkill -9 -f "^$(DOTNET)" | sed 's/^/ /' || true From f657ca9fcad91727d3cefb812c036a9bf39813be Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 00:23:38 +0200 Subject: [PATCH 007/155] [AppKit] Implement NSToolbarItemVisibilityPriority. Fixes #21298. (#21304) Fixes https://github.com/xamarin/xamarin-macios/issues/21298. --- src/appkit.cs | 23 +++++++++++++++++++ .../Documentation.KnownFailures.txt | 5 ++++ .../common-AppKit.ignore | 3 +++ 3 files changed, 31 insertions(+) diff --git a/src/appkit.cs b/src/appkit.cs index a4f7227de1f3..b97be9410982 100644 --- a/src/appkit.cs +++ b/src/appkit.cs @@ -20503,8 +20503,23 @@ interface NSToolbarItem : NSCopying, NSMenuItemValidation, NSValidatedUserInterf [Export ("maxSize")] CGSize MaxSize { get; set; } +#if XAMCORE_5_0 + [Export ("visibilityPriority")] + NSToolbarItemVisibilityPriority VisibilityPriority { get; set; } +#else + /// Indicate which toolbar items should be kept when the toolbar space is limited. + /// + /// The valid values come from the enum, and they can be referenced as follows: + /// + /// + /// + /// [Export ("visibilityPriority")] nint VisibilityPriority { get; set; } +#endif [Export ("autovalidates")] bool Autovalidates { get; set; } @@ -28838,4 +28853,12 @@ interface NSViewContentSelectionInfo { [Export ("selectionAnchorRect")] CGRect /* NSRect */ SelectionAnchorRect { get; } } + + [Native] + enum NSToolbarItemVisibilityPriority : long { + Standard = 0, + Low = -1000, + High = 1000, + User = 2000, + } } diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 56aca8bf163d..17d3e16881ca 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -2869,6 +2869,10 @@ F:AppKit.NSToolbarItemGroupControlRepresentation.Expanded F:AppKit.NSToolbarItemGroupSelectionMode.Momentary F:AppKit.NSToolbarItemGroupSelectionMode.SelectAny F:AppKit.NSToolbarItemGroupSelectionMode.SelectOne +F:AppKit.NSToolbarItemVisibilityPriority.High +F:AppKit.NSToolbarItemVisibilityPriority.Low +F:AppKit.NSToolbarItemVisibilityPriority.Standard +F:AppKit.NSToolbarItemVisibilityPriority.User F:AppKit.NSToolbarSizeMode.Default F:AppKit.NSToolbarSizeMode.Regular F:AppKit.NSToolbarSizeMode.Small @@ -80962,6 +80966,7 @@ T:AppKit.NSToolbarImmovableItemIdentifiers T:AppKit.NSToolbarItemEventArgs T:AppKit.NSToolbarItemGroupControlRepresentation T:AppKit.NSToolbarItemGroupSelectionMode +T:AppKit.NSToolbarItemVisibilityPriority T:AppKit.NSToolbarSizeMode T:AppKit.NSToolbarWillInsert T:AppKit.NSTouch_NSTouchBar diff --git a/tests/xtro-sharpie/api-annotations-dotnet/common-AppKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/common-AppKit.ignore index 6f9811c32731..d8151a01de31 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/common-AppKit.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/common-AppKit.ignore @@ -16,3 +16,6 @@ !missing-field! NSTypeIdentifierTransitInformationText not bound !missing-protocol! NSAnimatablePropertyContainer not bound !missing-selector! NSTouchBar::itemIdentifiers not bound + +# NSToolbarItemVisibilityPriority is a collection of constants we've bound as an enum. +!unknown-native-enum! NSToolbarItemVisibilityPriority bound From b327bcc4939f3a3aae9bde7aa16d31cbf5cf305c Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 01:03:06 +0200 Subject: [PATCH 008/155] [tests] Remove mono-native logic. (#21312) It's only for legacy Xamarin. --- tests/Makefile | 2 - tests/common/MonoNativeConfig.cs | 89 ------ tests/introspection/ApiPInvokeTest.cs | 12 - .../Mac/introspection-mac.csproj | 3 - tests/introspection/dotnet/shared.csproj | 3 - .../iOS/introspection-ios.csproj | 3 - tests/mmptest/src/CodeStrippingTests.cs | 12 +- tests/mono-native/.gitignore | 1 - tests/mono-native/AppDelegate.cs | 117 -------- tests/mono-native/Introspection.cs | 90 ------ tests/mono-native/MacAppDelegate.cs | 20 -- tests/mono-native/MacMain.cs | 10 - tests/mono-native/Main.cs | 23 -- tests/mono-native/NativePlatformConfig.cs | 20 -- tests/mono-native/iOS/Info.plist | 44 --- .../iOS/mono-native.csproj.template | 125 -------- tests/mono-native/macOS/Entitlements.plist | 6 - tests/mono-native/macOS/Info.plist | 30 -- .../macOS/mono-native.csproj.template | 85 ------ tests/mtouch/MonoNativeTests.cs | 271 ------------------ tests/mtouch/mtouchtests.csproj | 1 - tests/xharness/Harness.cs | 28 -- .../Jenkins/RunSimulatorTasksFactory.cs | 2 - tests/xharness/Jenkins/TestData.cs | 1 - tests/xharness/Jenkins/TestSelector.cs | 1 - .../xharness/Jenkins/TestVariationsFactory.cs | 24 +- tests/xharness/MonoNativeInfo.cs | 132 --------- tests/xharness/Targets/TVOSTarget.cs | 4 +- tests/xharness/Targets/Target.cs | 3 - .../xharness/Targets/TodayExtensionTarget.cs | 4 +- tests/xharness/Targets/UnifiedTarget.cs | 4 +- tests/xharness/Targets/WatchOSTarget.cs | 4 +- tests/xharness/Targets/iOSTarget.cs | 2 - tests/xharness/TestLabel.cs | 3 +- tests/xharness/TestProject.cs | 3 - tests/xharness/iOSTestProject.cs | 5 +- tests/xharness/xharness.csproj | 1 - 37 files changed, 21 insertions(+), 1167 deletions(-) delete mode 100644 tests/common/MonoNativeConfig.cs delete mode 100644 tests/mono-native/.gitignore delete mode 100644 tests/mono-native/AppDelegate.cs delete mode 100644 tests/mono-native/Introspection.cs delete mode 100644 tests/mono-native/MacAppDelegate.cs delete mode 100644 tests/mono-native/MacMain.cs delete mode 100644 tests/mono-native/Main.cs delete mode 100644 tests/mono-native/NativePlatformConfig.cs delete mode 100644 tests/mono-native/iOS/Info.plist delete mode 100644 tests/mono-native/iOS/mono-native.csproj.template delete mode 100644 tests/mono-native/macOS/Entitlements.plist delete mode 100644 tests/mono-native/macOS/Info.plist delete mode 100644 tests/mono-native/macOS/mono-native.csproj.template delete mode 100644 tests/mtouch/MonoNativeTests.cs delete mode 100644 tests/xharness/MonoNativeInfo.cs diff --git a/tests/Makefile b/tests/Makefile index b242791bc3ff..917286623b74 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -352,8 +352,6 @@ package-test-libraries.zip: $(Q) $(MAKE) all -C test-libraries/custom-type-assembly build-assembly $(Q_GEN) rm -f "$@" "$@.tmp" $(Q_GEN) cd $(TOP) && zip -9r --symlinks $(abspath $@).tmp ./tests/test-libraries - $(Q_GEN) cd $(TOP) && zip -9r --symlinks $(abspath $@).tmp ./tests/mono-native/macOS/unified ./tests/mono-native/macOS/compat - $(Q_GEN) cd $(TOP) && zip -9r --symlinks $(abspath $@).tmp ./tests/mono-native/iOS/unified ./tests/mono-native/iOS/compat $(Q_GEN) cd $(TOP) && find tests -regex '.*/generated-projects/.*[c|f]sproj' -exec zip -9r --symlinks $(abspath $@).tmp {} + $(Q_GEN) cd $(TOP) && find tests -regex '.*/generated-projects/.*sln' -exec zip -9r --symlinks $(abspath $@).tmp {} + $(Q_GEN) cd $(TOP) && find tests -regex 'tests/test-libraries/custom-type-assembly/.libs/.*dll' -exec zip -9r --symlinks $(abspath $@).tmp {} + diff --git a/tests/common/MonoNativeConfig.cs b/tests/common/MonoNativeConfig.cs deleted file mode 100644 index 770ea99552ca..000000000000 --- a/tests/common/MonoNativeConfig.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.IO; -using System.Reflection; -using NUnit.Framework; - -namespace Xamarin.Tests { - public enum MonoNativeLinkMode { - None, - Static, - Dynamic, - Framework, - Symlink, - } - - public enum MonoNativeFlavor { - None, - Unified, - } - - public static class MonoNativeConfig { - public static MonoNativeLinkMode LinkMode { - get { -#if MONO_NATIVE_STATIC - return MonoNativeLinkMode.Static; -#elif MONO_NATIVE_DYNAMIC - return MonoNativeLinkMode.Dynamic; -#elif MONO_NATIVE_SYMLINK - return MonoNativeLinkMode.Symlink; -#else - return MonoNativeLinkMode.None; -#endif - } - } - - public static MonoNativeFlavor Flavor { - get { -#if MONO_NATIVE_UNIFIED - return MonoNativeFlavor.Unified; -#else - return MonoNativeFlavor.None; -#endif - } - } - - public static bool UsingCompat { - get { -#if MONO_NATIVE_UNIFIED - return false; -#else - Assert.Fail ("Missing `MONO_NATIVE_UNIFIED`"); - throw new NotImplementedException (); -#endif - } - } - - public static string GetDynamicLibraryName () - { - return GetDynamicLibraryName (MonoNativeFlavor.Unified); - } - - public static string GetDynamicLibraryName (MonoNativeFlavor flavor) - { - switch (flavor) { - case MonoNativeFlavor.Unified: - return "libmono-native-unified.dylib"; - default: - Assert.Fail ($"Invalid MonoNativeFlavor: {flavor}"); - throw new NotImplementedException (); - } - } - - public static string GetPInvokeLibraryName (MonoNativeFlavor flavor, MonoNativeLinkMode link) - { - switch (link) { - case MonoNativeLinkMode.Static: - return null; - case MonoNativeLinkMode.Dynamic: - return GetDynamicLibraryName (flavor); - case MonoNativeLinkMode.Symlink: - return "libmono-native.dylib"; - default: - Assert.Fail ($"Invalid link mode: {MonoNativeConfig.LinkMode}"); - throw new NotImplementedException (); - } - } - - public static string DynamicLibraryName => GetDynamicLibraryName (); - } -} diff --git a/tests/introspection/ApiPInvokeTest.cs b/tests/introspection/ApiPInvokeTest.cs index 043ef299944a..e75f72d0e01e 100644 --- a/tests/introspection/ApiPInvokeTest.cs +++ b/tests/introspection/ApiPInvokeTest.cs @@ -158,13 +158,7 @@ public void SymbolExists () case "System.Native": case "System.Security.Cryptography.Native.Apple": case "System.Net.Security.Native": - if (MonoNativeConfig.LinkMode == MonoNativeLinkMode.None) - continue; -#if __IOS__ - libname = MonoNativeConfig.GetPInvokeLibraryName (MonoNativeFlavor.Unified, MonoNativeConfig.LinkMode); -#else libname = null; -#endif break; } @@ -248,13 +242,7 @@ protected void Check (Assembly a) case "System.Native": case "System.Security.Cryptography.Native.Apple": case "System.Net.Security.Native": - if (MonoNativeConfig.LinkMode == MonoNativeLinkMode.None) - continue; -#if __IOS__ - path = MonoNativeConfig.GetPInvokeLibraryName (MonoNativeFlavor.Unified, MonoNativeConfig.LinkMode); -#else path = null; -#endif break; } diff --git a/tests/introspection/Mac/introspection-mac.csproj b/tests/introspection/Mac/introspection-mac.csproj index 7119a988ade4..1909259c4a0e 100644 --- a/tests/introspection/Mac/introspection-mac.csproj +++ b/tests/introspection/Mac/introspection-mac.csproj @@ -122,9 +122,6 @@ TestRuntime.cs - - MonoNativeConfig.cs - ApiAvailabilityTest.cs diff --git a/tests/introspection/dotnet/shared.csproj b/tests/introspection/dotnet/shared.csproj index c787b358fcf5..a20624fe5b36 100644 --- a/tests/introspection/dotnet/shared.csproj +++ b/tests/introspection/dotnet/shared.csproj @@ -111,9 +111,6 @@ EnvironmentVariable.cs - - MonoNativeConfig.cs - PlatformInfo.cs diff --git a/tests/introspection/iOS/introspection-ios.csproj b/tests/introspection/iOS/introspection-ios.csproj index 56901f7b3870..8e2601f88ae0 100644 --- a/tests/introspection/iOS/introspection-ios.csproj +++ b/tests/introspection/iOS/introspection-ios.csproj @@ -148,9 +148,6 @@ EnvironmentVariable.cs - - MonoNativeConfig.cs - PlatformInfo.cs diff --git a/tests/mmptest/src/CodeStrippingTests.cs b/tests/mmptest/src/CodeStrippingTests.cs index 5fb469da1b54..45ec14d41849 100644 --- a/tests/mmptest/src/CodeStrippingTests.cs +++ b/tests/mmptest/src/CodeStrippingTests.cs @@ -9,11 +9,11 @@ namespace Xamarin.MMP.Tests { public class CodeStrippingTests { static Func LipoStripConditional = s => s.Contains ("lipo") && s.Contains ("-extract_family"); - static Func LipoStripSkipPosixAndMonoNativeConditional = s => LipoStripConditional (s) && !s.Contains ("libMonoPosixHelper.dylib") && !s.Contains ("libmono-native.dylib"); + static Func LipoStripSkipPosixConditional = s => LipoStripConditional (s) && !s.Contains ("libMonoPosixHelper.dylib"); - static bool DidAnyLipoStripSkipPosixAndMonoNative (BuildResult buildResult) + static bool DidAnyLipoStripSkipPosix (BuildResult buildResult) { - return buildResult.BuildOutputLines.Any (LipoStripSkipPosixAndMonoNativeConditional); + return buildResult.BuildOutputLines.Any (LipoStripSkipPosixConditional); } static bool DidAnyLipoStrip (BuildResult buildResult) @@ -129,9 +129,9 @@ void AssertNoLipoOrWarning (BuildResult buildOutput, string context) Assert.False (buildOutput.HasMessage (2108), "MM2108 incorrectly given in in context: " + context); } - void AssertLipoOnlyMonoPosixAndMonoNative (BuildResult buildOutput, string context) + void AssertLipoOnlyMonoPosix (BuildResult buildOutput, string context) { - Assert.False (DidAnyLipoStripSkipPosixAndMonoNative (buildOutput), "lipo incorrectly run in context outside of libMonoPosixHelper/libmono-native: " + context); + Assert.False (DidAnyLipoStripSkipPosix (buildOutput), "lipo incorrectly run in context outside of libMonoPosixHelper/libmono-native: " + context); Assert.False (buildOutput.HasMessage (2108), "MM2108 incorrectly given in in context: " + context); } @@ -173,7 +173,7 @@ public void ThirdPartyLibrary_WithCorrectBitness_ShouldNotStripOrWarn () test.Release = true; testResult = TI.TestUnifiedExecutable (test); - AssertLipoOnlyMonoPosixAndMonoNative (testResult.BuildResult, "Release"); // libMonoPosixHelper.dylib and libmono-native.dylib will lipo in Release + AssertLipoOnlyMonoPosix (testResult.BuildResult, "Release"); // libMonoPosixHelper.dylib and libmono-native.dylib will lipo in Release }); } } diff --git a/tests/mono-native/.gitignore b/tests/mono-native/.gitignore deleted file mode 100644 index 7f0c25398785..000000000000 --- a/tests/mono-native/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.csproj diff --git a/tests/mono-native/AppDelegate.cs b/tests/mono-native/AppDelegate.cs deleted file mode 100644 index e08e3de2785a..000000000000 --- a/tests/mono-native/AppDelegate.cs +++ /dev/null @@ -1,117 +0,0 @@ -#if !__WATCHOS__ && !MONOMAC -using System; -using System.Collections.Generic; -using System.Reflection; -using Foundation; -using UIKit; -using MonoTouch.NUnit.UI; -using NUnit.Framework.Internal; - -namespace Mono.Native.Tests { - // The UIApplicationDelegate for the application. This class is responsible for launching the - // User Interface of the application, as well as listening (and optionally responding) to - // application events from iOS. - [Register ("AppDelegate")] - public partial class AppDelegate : UIApplicationDelegate { - // class-level declarations - static UIWindow window; - TouchRunner runner; - -#if !__TVOS__ - public override bool AccessibilityPerformMagicTap () - { - try { - runner.OpenWriter ("Magic Tap"); - runner.Run (runner.LoadedTest as TestSuite); - } finally { - runner.CloseWriter (); - } - return true; - } -#endif - // - // This method is invoked when the application has loaded and is ready to run. In this - // method you should instantiate the window, load the UI into it and then make the window - // visible. - // - // You have 17 seconds to return from this method, or iOS will terminate your application. - // - public override bool FinishedLaunching (UIApplication app, NSDictionary options) - { - // create a new window instance based on the screen size - window = new UIWindow (UIScreen.MainScreen.Bounds); - runner = new TouchRunner (window); - - // tests can be inside the main assembly - runner.Add (Assembly.GetExecutingAssembly ()); - - window.RootViewController = new UINavigationController (runner.GetViewController ()); - // make the window visible - window.MakeKeyAndVisible (); - - return true; - } - - public static void PresentModalViewController (UIViewController vc, double duration) - { - var bckp = window.RootViewController; - window.RootViewController = vc; - try { - NSRunLoop.Main.RunUntil (NSDate.Now.AddSeconds (duration)); - } finally { - window.RootViewController = bckp; - } - } - - public static bool RunAsync (DateTime timeout, Action action, Func check_completed) - { - var vc = new AsyncController (action); - var bckp = window.RootViewController; - window.RootViewController = vc; - try { - do { - if (timeout < DateTime.Now) - return false; - NSRunLoop.Main.RunUntil (NSDate.Now.AddSeconds (0.1)); - } while (!check_completed ()); - } finally { - window.RootViewController = bckp; - } - - return true; - } - - static void Main (string [] args) - { - UIApplication.Main (args, null, typeof (AppDelegate)); - } - } - - class AsyncController : UIViewController { - Action action; - static int counter; - - public AsyncController (Action action) - { - this.action = action; - counter++; - } - - public override void ViewDidLoad () - { - base.ViewDidLoad (); - - switch (counter % 2) { - case 0: - View.BackgroundColor = UIColor.Yellow; - break; - default: - View.BackgroundColor = UIColor.LightGray; - break; - } - NSTimer.CreateScheduledTimer (0.01, (v) => action ()); - } - } -} - -#endif // !__WATCHOS__ diff --git a/tests/mono-native/Introspection.cs b/tests/mono-native/Introspection.cs deleted file mode 100644 index 6343229c77ca..000000000000 --- a/tests/mono-native/Introspection.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading; -using System.Reflection; -using System.Runtime.InteropServices; -using NUnit.Framework; -using ObjCRuntime; - -namespace Xamarin.Tests { - [TestFixture] - public class Introspection { - public static string RootDirectory => Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location); - - void AssertShouldExist (string name) - { - var pathName = Path.Combine (RootDirectory, name); - Assert.That (File.Exists (pathName), $"Found {name}."); - } - - void AssertShouldNotExist (string name) - { - var pathName = Path.Combine (RootDirectory, name); - Assert.That (File.Exists (pathName), Is.False, $"Should not have {name}."); - } - - int CountFiles (string pattern) - { - // Don't use Linq as it'd use too much memory. - return Directory.GetFiles (RootDirectory, pattern, SearchOption.AllDirectories).Length; - } - - void CheckDynamicLibrary () - { - AssertShouldExist (MonoNativeConfig.DynamicLibraryName); - AssertShouldNotExist ("libmono-native.dylib"); - - var count = CountFiles ("libmono-native*"); - Assert.That (count, Is.EqualTo (1), "exactly one mono-native library."); - } - - void CheckStaticLibrary () - { - AssertShouldNotExist ("libmono-native.dylib"); - AssertShouldNotExist ("libmono-native-compat.dylib"); - AssertShouldNotExist ("libmono-native-unified.dylib"); - - var count = CountFiles ("libmono-native*"); - Assert.That (count, Is.EqualTo (0), "zero mono-native libraries."); - } - - void CheckSymlinkedLibrary () - { - AssertShouldExist ("libmono-native.dylib"); - AssertShouldNotExist ("libmono-native-compat.dylib"); - AssertShouldNotExist ("libmono-native-unified.dylib"); - - var count = CountFiles ("libmono-native*"); - Assert.That (count, Is.EqualTo (1), "exactly one mono-native library."); - } - - [Test] - public void CheckLibrary () - { - switch (MonoNativeConfig.LinkMode) { - case MonoNativeLinkMode.Dynamic: - CheckDynamicLibrary (); - break; - case MonoNativeLinkMode.Static: - CheckStaticLibrary (); - break; - case MonoNativeLinkMode.Symlink: - CheckSymlinkedLibrary (); - break; - default: - Assert.Fail ($"Unknown link mode: {MonoNativeConfig.LinkMode}"); - break; - } - } - - [DllImport ("System.Native")] - extern static void mono_native_initialize (); - - [Test] - public void TestInvoke () - { - mono_native_initialize (); - } - } -} diff --git a/tests/mono-native/MacAppDelegate.cs b/tests/mono-native/MacAppDelegate.cs deleted file mode 100644 index b8b1ef0127ae..000000000000 --- a/tests/mono-native/MacAppDelegate.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using NUnitLite; -using AppKit; -using Foundation; - -namespace Mono.Native.Tests { - [Register ("AppDelegate")] - public class MacAppDelegate : NSApplicationDelegate { - public override void DidFinishLaunching (NSNotification notification) - { - } - - public override void WillTerminate (NSNotification notification) - { - // Insert code here to tear down your application - } - } -} diff --git a/tests/mono-native/MacMain.cs b/tests/mono-native/MacMain.cs deleted file mode 100644 index b2e379ef7de7..000000000000 --- a/tests/mono-native/MacMain.cs +++ /dev/null @@ -1,10 +0,0 @@ -using NUnitLite; - -namespace mononativetests { - public class Application { - static int Main (string [] args) - { - return new AutoRun ().Execute (args); - } - } -} diff --git a/tests/mono-native/Main.cs b/tests/mono-native/Main.cs deleted file mode 100644 index aaa9fe15eeb7..000000000000 --- a/tests/mono-native/Main.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -#if __WATCHOS__ -using Foundation; -#endif -using UIKit; - -partial class TestRuntime { - public static bool RunAsync (DateTime timeout, Action action, Func check_completed) - { -#if __WATCHOS__ - NSTimer.CreateScheduledTimer (0.01, (v) => action ()); - do { - if (timeout < DateTime.Now) - return false; - NSRunLoop.Main.RunUntil (NSDate.Now.AddSeconds (0.1)); - } while (!check_completed ()); - - return true; -#else - return Mono.Native.Tests.AppDelegate.RunAsync (timeout, action, check_completed); -#endif - } -} diff --git a/tests/mono-native/NativePlatformConfig.cs b/tests/mono-native/NativePlatformConfig.cs deleted file mode 100644 index 08f3a9056122..000000000000 --- a/tests/mono-native/NativePlatformConfig.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.IO; -using System.Reflection; -using NUnit.Framework; -using Mono; - -namespace Xamarin.Tests { - [TestFixture] - public class NativePlatformConfig { - [Test] - public void PlatformType () - { - var type = MonoNativePlatform.GetPlatformType (); - Assert.That ((int) type, Is.GreaterThan (0), "platform type"); - - var usingCompat = (type & MonoNativePlatformType.MONO_NATIVE_PLATFORM_TYPE_COMPAT) != 0; - Assert.AreEqual (MonoNativeConfig.UsingCompat, usingCompat, "using compatibility layer"); - } - } -} diff --git a/tests/mono-native/iOS/Info.plist b/tests/mono-native/iOS/Info.plist deleted file mode 100644 index 6415bfd4d6f2..000000000000 --- a/tests/mono-native/iOS/Info.plist +++ /dev/null @@ -1,44 +0,0 @@ - - - - - CFBundleDisplayName - MonoNativeTest - CFBundleIdentifier - com.xamarin.mono-native-test - CFBundleName - MonoNativeTest - MinimumOSVersion - 11.0 - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - UIDeviceFamily - - 1 - 2 - - UILaunchStoryboardName - LaunchScreen - UIRequiresFullScreen - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - XSAppIconAssets - Assets.xcassets/AppIcons.appiconset - - diff --git a/tests/mono-native/iOS/mono-native.csproj.template b/tests/mono-native/iOS/mono-native.csproj.template deleted file mode 100644 index 18c13ef180c5..000000000000 --- a/tests/mono-native/iOS/mono-native.csproj.template +++ /dev/null @@ -1,125 +0,0 @@ - - - - Debug - iPhoneSimulator - 10.0.0 - 2.0 - {26125265-2204-4514-A572-36079CA4F925} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - Mono.Native.Tests - Resources - mononativetests - 168,169,219,414,612,618,649,672 - Xamarin.iOS - obj\$(Platform)\$(Configuration)-unified - PackageReference - ..\.. - latest - true - - - MONO_NATIVE_SYMLINK - MONO_NATIVE_STATIC - $(MonoNativeMode);$(DefineConstants) - - - True - full - False - bin\iPhoneSimulator\$(Configuration)-unified - DEBUG;$(DefineConstants) - prompt - 4 - True - None - True - -v -v - x86_64 - iPhone Developer - HttpClientHandler - - - none - True - bin\iPhoneSimulator\$(Configuration)-unified - $(DefineConstants) - prompt - 4 - None - True - -v -v - x86_64 - HttpClientHandler - - - True - full - False - bin\iPhone\$(Configuration)-unified - DEBUG;$(DefineConstants) - prompt - 4 - iPhone Developer - True - True - -v -v - ARM64 - SdkOnly - HttpClientHandler - - - none - True - bin\iPhone\$(Configuration)-unified - $(DefineConstants) - prompt - 4 - iPhone Developer - True - -v -v - ARM64 - true - SdkOnly - HttpClientHandler - - - - - - - - {F611ED96-54B5-4975-99BB-12F50AF95936} - Touch.Client-iOS - - - - - - - - Info.plist - - - - - - - - MonoNativePlatform.cs - - - MonoNativePlatformType.cs - - - NativePlatformTest.cs - - - MonoNativeConfig.cs - - - - - - diff --git a/tests/mono-native/macOS/Entitlements.plist b/tests/mono-native/macOS/Entitlements.plist deleted file mode 100644 index 9ae599370b42..000000000000 --- a/tests/mono-native/macOS/Entitlements.plist +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/mono-native/macOS/Info.plist b/tests/mono-native/macOS/Info.plist deleted file mode 100644 index ff6ae70a155b..000000000000 --- a/tests/mono-native/macOS/Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleName - mononativetests - CFBundleIdentifier - com.xamarin.mononativetests - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - 10.15 - CFBundleDevelopmentRegion - en - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleSignature - ???? - NSHumanReadableCopyright - Xamarin Inc. (http://www.xamarin.com) - NSPrincipalClass - NSApplication - NSMainStoryboardFile - Main - - diff --git a/tests/mono-native/macOS/mono-native.csproj.template b/tests/mono-native/macOS/mono-native.csproj.template deleted file mode 100644 index 82a7761c8c04..000000000000 --- a/tests/mono-native/macOS/mono-native.csproj.template +++ /dev/null @@ -1,85 +0,0 @@ - - - - ..\.. - Debug - AnyCPU - {2B174B45-CC6B-443D-870F-6B5394FDE3FD} - {A3F8F2AB-B479-4A4A-A458-A89E7DC349F1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - Mono.Native.Tests - mononativetests - Resources - 67,168,169,219,414,612,618,649,672 - Xamarin.Mac - v2.0 - $(DefineConstants);MOBILE;XAMMAC - PackageReference - latest - true - - - false - bin\Mac - 4 - false - false - false - false - HttpClientHandler - None - $(DefineConstants); - - - - - - - - - - Info.plist - - - - - - MacMain.cs - - - Assert.cs - - - MonoNativeConfig.cs - - - TestAssemblyLoader.cs - - - - MonoNativePlatform.cs - - - MonoNativePlatformType.cs - - - NativePlatformTest.cs - - - TestRuntime.cs - - - ApplePlatform.cs - - - SdkVersions.cs - - - - - {88A8A1AC-0829-4C98-8F4A-9FC23DC42A06} - Touch.Client-macOS-mobile - - - - \ No newline at end of file diff --git a/tests/mtouch/MonoNativeTests.cs b/tests/mtouch/MonoNativeTests.cs deleted file mode 100644 index f132c64667b3..000000000000 --- a/tests/mtouch/MonoNativeTests.cs +++ /dev/null @@ -1,271 +0,0 @@ -// -// MonoNativeTests.cs -// -// Author: -// Martin Baulig -// -// Copyright (c) 2018 Xamarin Inc. (http://www.xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.IO; -using System.Linq; -using NUnit.Framework; - -// using MTouchLinker = Xamarin.Tests.LinkerOption; -// using ExecutionHelper = Xamarin.Tests.ExecutionHelper; -// using MTouchRegistrar = Xamarin.Tests.RegistrarOption; - -namespace Xamarin { - using Tests; - using Utils; - - [TestFixture] - public class MonoNativeTests { - [Test] - public void TestDebugSymlink () - { - using (var mtouch = new MTouchTool ()) { - mtouch.CreateTemporaryApp (); - mtouch.Debug = true; - mtouch.Linker = LinkerOption.DontLink; - mtouch.AssertExecute (MTouchAction.BuildSim, "build"); - - AssertSymlinked (mtouch.AppPath); - } - } - - [Test] - public void TestDebugLinkOut () - { - using (var mtouch = new MTouchTool ()) { - mtouch.CreateTemporaryApp (); - mtouch.Debug = true; - mtouch.Linker = LinkerOption.LinkAll; - mtouch.AssertExecute (MTouchAction.BuildSim, "build"); - - AssertStaticLinked (mtouch); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Not.Contain ("_mono_native_initialize")); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Not.Contain ("_NetSecurityNative_ImportUserName")); - } - } - - [Test] - public void TestDeviceLinkOut () - { - using (var mtouch = new MTouchTool ()) { - mtouch.CreateTemporaryApp (); - mtouch.Linker = LinkerOption.LinkSdk; - mtouch.AssertExecute (MTouchAction.BuildDev, "build"); - - AssertStaticLinked (mtouch); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Not.Contain ("_mono_native_initialize")); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Not.Contain ("_NetSecurityNative_ImportUserName")); - } - } - - [Test] - public void TestDebugLinkAll () - { - using (var mtouch = new MTouchTool ()) { - mtouch.CreateTemporaryApp (code: MonoNativeInitialize); - mtouch.Debug = true; - mtouch.Linker = LinkerOption.LinkAll; - mtouch.AssertExecute (MTouchAction.BuildSim, "build"); - - AssertStaticLinked (mtouch); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Contain ("_mono_native_initialize")); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Not.Contain ("_NetSecurityNative_ImportUserName")); - } - } - - [Test] - public void TestDeviceLinkAll () - { - using (var mtouch = new MTouchTool ()) { - mtouch.CreateTemporaryApp (code: MonoNativeInitialize); - mtouch.Linker = LinkerOption.LinkAll; - mtouch.AssertExecute (MTouchAction.BuildDev, "build"); - - AssertStaticLinked (mtouch); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Contain ("_mono_native_initialize")); - Assert.That (mtouch.NativeSymbolsInExecutable, Does.Not.Contain ("_NetSecurityNative_ImportUserName")); - } - } - - [Test] - [TestCase (Profile.iOS, "9.3", "libmono-native-compat.dylib", SdkVersions.MiniOS)] - [TestCase (Profile.iOS, "10.0", "libmono-native-unified.dylib", SdkVersions.MiniOS)] - [TestCase (Profile.tvOS, "9.0", "libmono-native-compat.dylib", SdkVersions.MinTVOS)] - [TestCase (Profile.tvOS, "10.0", "libmono-native-unified.dylib", SdkVersions.MinTVOS)] - [TestCase (Profile.watchOS, "2.0", "libmono-native-compat.dylib", SdkVersions.MinWatchOS)] - [TestCase (Profile.watchOS, "5.0", "libmono-native-unified.dylib", SdkVersions.MinWatchOS)] - public void TestDeviceDylib (Profile profile, string version, string mono_native_dylib, string min_version) - { - if (mono_native_dylib.Contains ("compat") && Version.Parse (min_version) > Version.Parse (version)) - Assert.Ignore ("No OS versions that require compat libmono-unified are supported anymore"); - if (Version.Parse (min_version) > Version.Parse (version)) - version = min_version; - - using (var mtouch = new MTouchTool ()) { - mtouch.Profile = profile; - if (profile == Profile.watchOS) { - mtouch.CreateTemporaryWatchKitExtension (code: MonoNativeWatchInitialize, extraCode: MonoNativeInitialize); - } else { - mtouch.CreateTemporaryApp (code: MonoNativeInitialize); - } - mtouch.Linker = LinkerOption.LinkAll; - mtouch.AssemblyBuildTargets.Add ("@all=dynamiclibrary"); - mtouch.TargetVer = version; - - mtouch.AssertExecute (MTouchAction.BuildDev, "build"); - - var files = Directory.EnumerateFiles (mtouch.AppPath, "libmono-native*", SearchOption.AllDirectories).Select (Path.GetFileName); - Assert.That (files.Count, Is.EqualTo (1), "One single libmono-native* library"); - Assert.That (files.First (), Is.EqualTo (mono_native_dylib)); - - var mono_native_path = Path.Combine (mtouch.AppPath, mono_native_dylib); - - var symbols = MTouch.GetNativeSymbols (mono_native_path); - var otool_dylib = ExecutionHelper.Execute ("otool", new [] { "-L", mono_native_path }, hide_output: true); - - Assert.That (symbols, Does.Contain ("_mono_native_initialize")); - Assert.That (otool_dylib, Does.Contain ($"@rpath/{mono_native_dylib}")); - Assert.That (otool_dylib.Replace (mono_native_path, ""), Does.Not.Contain ("/Users/")); - - if (profile == Profile.iOS) { - Assert.That (symbols, Does.Contain ("_NetSecurityNative_ImportUserName")); - Assert.That (otool_dylib, Does.Contain ("/System/Library/Frameworks/GSS.framework/GSS")); - } else { - Assert.That (symbols, Does.Not.Contain ("_NetSecurityNative_ImportUserName")); - Assert.That (otool_dylib, Does.Not.Contain ("/System/Library/Frameworks/GSS.framework/GSS")); - } - - var otool_exe = ExecutionHelper.Execute ("otool", new [] { "-L", mtouch.NativeExecutablePath }, hide_output: true); - Assert.That (otool_exe, Does.Not.Contain ("GSS")); - Assert.That (otool_exe, Does.Contain ($"@rpath/{mono_native_dylib}")); - } - } - - [Test] - public void TestDeviceFrameworkLinkOut () - { - using (var mtouch = new MTouchTool ()) { - mtouch.CreateTemporaryApp (); - mtouch.Linker = LinkerOption.LinkAll; - mtouch.AssemblyBuildTargets.Add ("@all=framework"); - mtouch.TargetVer = SdkVersions.MiniOSVersion.Major >= 10 ? SdkVersions.MiniOS : "10.0"; - - mtouch.AssertExecute (MTouchAction.BuildDev, "build"); - - var files = Directory.EnumerateFiles (mtouch.AppPath, "libmono-native*", SearchOption.AllDirectories).Select (Path.GetFileName); - Assert.That (files.Count, Is.EqualTo (0), "No libmono-native* library"); - } - } - - [Test] - public void TestGss () - { - using (var mtouch = new MTouchTool ()) { - mtouch.CreateTemporaryApp (code: MonoNativeGss); - mtouch.Linker = LinkerOption.LinkAll; - mtouch.AssertExecute (MTouchAction.BuildSim, "build"); - - AssertStaticLinked (mtouch); - var symbols = mtouch.NativeSymbolsInExecutable; - Assert.That (symbols, Does.Contain ("_mono_native_initialize")); - Assert.That (symbols, Does.Contain ("_NetSecurityNative_ImportUserName")); - - var otool_exe = ExecutionHelper.Execute ("otool", new [] { "-L", mtouch.NativeExecutablePath }, hide_output: true); - Assert.That (otool_exe, Does.Contain ("/System/Library/Frameworks/GSS.framework/GSS")); - } - } - - [Test] - public void TestGssTv () - { - using (var mtouch = new MTouchTool ()) { - mtouch.Profile = Profile.tvOS; - mtouch.CreateTemporaryApp (code: MonoNativeGss); - mtouch.Linker = LinkerOption.LinkAll; - - mtouch.AssertExecuteFailure (MTouchAction.BuildSim, "build"); - mtouch.AssertError (5214, "Native linking failed, undefined symbol: _NetSecurityNative_ImportUserName. This symbol was referenced by the managed member X.NetSecurityNative_ImportUserName. Please verify that all the necessary frameworks have been referenced and native libraries linked."); - } - } - - void AssertSymlinked (string path) - { - var files = Directory.EnumerateFiles (path, "libmono-native*", SearchOption.AllDirectories).Select (Path.GetFileName); - Assert.That (files.Count, Is.EqualTo (1), "One single libmono-native* library"); - Assert.That (files.First (), Is.EqualTo ("libmono-native.dylib"), "Found libmono-native.dylib"); - } - - void AssertStaticLinked (MTouchTool app) - { - var files = Directory.EnumerateFiles (app.AppPath, "libmono-native*", SearchOption.AllDirectories).Select (Path.GetFileName); - Assert.That (files.Count, Is.EqualTo (0), "No libmono-native* libraries"); - } - - string MonoNativeWatchInitialize => @" -using WatchKit; -public partial class NotificationController : WKUserNotificationInterfaceController -{ - protected NotificationController (System.IntPtr handle) : base (handle) { X.Main(); } -} -"; - - string MonoNativeInitialize => @" -class X { - [System.Runtime.InteropServices.DllImport (""System.Native"")] - extern static void mono_native_initialize (); - - public static void Main () - { - System.Console.WriteLine (typeof (ObjCRuntime.Runtime).ToString ()); - mono_native_initialize (); - } -} -"; - - string MonoNativeGss => @" -using System; - -class X { - [System.Runtime.InteropServices.DllImport (""System.Native"")] - extern static void mono_native_initialize (); - - [System.Runtime.InteropServices.DllImport (""System.Net.Security.Native"")] - extern static void NetSecurityNative_ImportUserName (IntPtr a, IntPtr b, int c, IntPtr d); - - static void Main () - { - // Reference Xamarin.iOS - var runtime = typeof (ObjCRuntime.Runtime).ToString (); - // Always false, but the linker does not know that, so the following code won't be linked out. - if (runtime.Equals (""XXX"")) { - mono_native_initialize (); - NetSecurityNative_ImportUserName (IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero); - } - } -} -"; - - } -} diff --git a/tests/mtouch/mtouchtests.csproj b/tests/mtouch/mtouchtests.csproj index feec07e1769c..c207827fbe0b 100644 --- a/tests/mtouch/mtouchtests.csproj +++ b/tests/mtouch/mtouchtests.csproj @@ -74,7 +74,6 @@ BundlerTool.cs - SdkVersions.cs diff --git a/tests/xharness/Harness.cs b/tests/xharness/Harness.cs index 2d6f5b1bc2d0..7fb3f9118dc8 100644 --- a/tests/xharness/Harness.cs +++ b/tests/xharness/Harness.cs @@ -493,22 +493,6 @@ int AutoConfigureMac (bool generate_projects) }); } - var monoNativeInfo = new MonoNativeInfo (DevicePlatform.macOS, RootDirectory, Log); - var macTestProject = new MacTestProject (TestLabel.Mononative, monoNativeInfo.ProjectPath, targetFrameworkFlavor: MacFlavors.Modern | MacFlavors.Full) { - MonoNativeInfo = monoNativeInfo, - Name = monoNativeInfo.ProjectName, - Platform = "AnyCPU", - Ignore = !INCLUDE_XAMARIN_LEGACY, - - }; - MacTestProjects.Add (macTestProject); - - - // Generate test projects from templates (mono-native templates) - if (generate_projects) { - foreach (var mtp in MacTestProjects.Where (x => x.MonoNativeInfo is not null).Select (x => x.MonoNativeInfo)) - mtp.Convert (); - } // All test projects should be either Modern projects or NUnit/console executables at this point. // If we need to generate Full/System variations, we do that here. @@ -611,13 +595,6 @@ void AutoConfigureIOS () Configurations = new string [] { "Debug", "Release" }, }); - var monoNativeInfo = new MonoNativeInfo (DevicePlatform.iOS, RootDirectory, Log); - var iosTestProject = new iOSTestProject (TestLabel.Mononative, monoNativeInfo.ProjectPath) { - MonoNativeInfo = monoNativeInfo, - Name = monoNativeInfo.ProjectName, - }; - IOSTestProjects.Add (iosTestProject); - // add all the tests that are using the precompiled mono assemblies WatchOSContainerTemplate = Path.GetFullPath (Path.Combine (RootDirectory, "templates/WatchContainer")); WatchOSAppTemplate = Path.GetFullPath (Path.Combine (RootDirectory, "templates/WatchApp")); @@ -688,8 +665,6 @@ int Configure () // * dont link, link all, link sdk // * Each of these test projects can used to generate other platform variations (tvOS, watchOS, macOS full, etc), // if the the TestProject.GenerateVariations property is true. - // * For the mono-native template project, we generate a compat+unified version of the mono-native template project (in MonoNativeInfo.Convert). - // GenerateVariations is true for mono-native projects, which means we'll generate platform variations. int ConfigureIOS () { @@ -702,9 +677,6 @@ int ConfigureIOS () if (autoConf) AutoConfigureIOS (); - foreach (var monoNativeInfo in IOSTestProjects.Where (x => x.MonoNativeInfo is not null).Select (x => x.MonoNativeInfo)) - monoNativeInfo.Convert (); - foreach (var proj in IOSTestProjects.Where ((v) => v.GenerateVariations)) { var file = proj.Path; diff --git a/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs b/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs index ca268427dfb7..b0821bfb9aa2 100644 --- a/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs +++ b/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs @@ -30,8 +30,6 @@ public async Task> CreateAsync (Jenkins jenkins, IMlaunch } else { if (!project.SkipiOSVariation) ps.Add (new Tuple (project, TestPlatform.iOS_Unified, ignored)); - if (project.MonoNativeInfo is not null) - ps.Add (new Tuple (project, TestPlatform.iOS_TodayExtension64, ignored)); if (!project.SkiptvOSVariation) ps.Add (new Tuple (project.AsTvOSProject (), TestPlatform.tvOS, ignored)); if (!project.SkipwatchOSVariation) diff --git a/tests/xharness/Jenkins/TestData.cs b/tests/xharness/Jenkins/TestData.cs index 411f64cdac9f..423702dc0150 100644 --- a/tests/xharness/Jenkins/TestData.cs +++ b/tests/xharness/Jenkins/TestData.cs @@ -18,7 +18,6 @@ class TestData { public bool UseThumb; public bool UseLlvm; public bool? UseMonoRuntime; - public MonoNativeLinkMode MonoNativeLinkMode; public IEnumerable Candidates; public string XamMacArch; public string RuntimeIdentifier; diff --git a/tests/xharness/Jenkins/TestSelector.cs b/tests/xharness/Jenkins/TestSelector.cs index 3751141bc004..632734ef94cf 100644 --- a/tests/xharness/Jenkins/TestSelector.cs +++ b/tests/xharness/Jenkins/TestSelector.cs @@ -278,7 +278,6 @@ public void SelectTests (TestSelection selection) selection.SetEnabled (PlatformLabel.LegacyXamarin, false); selection.SetEnabled (PlatformLabel.watchOS, false); selection.SetEnabled (TestLabel.Mmp, false); - selection.SetEnabled (TestLabel.Mononative, false); selection.SetEnabled (TestLabel.Mtouch, false); selection.SetEnabled (TestLabel.Xammac, false); } diff --git a/tests/xharness/Jenkins/TestVariationsFactory.cs b/tests/xharness/Jenkins/TestVariationsFactory.cs index 970dc0131624..5c3b87f9cf32 100644 --- a/tests/xharness/Jenkins/TestVariationsFactory.cs +++ b/tests/xharness/Jenkins/TestVariationsFactory.cs @@ -68,22 +68,22 @@ IEnumerable GetTestData (RunTestTask test) /* we don't add --assembly-build-target=@all=staticobject because that's the default in all our test projects */ if (supports_debug && !test.TestProject.IsDotNetProject) { - yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Static, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = false, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = false, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = true, Ignored = ignore }; + yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = true, Ignored = ignore }; } if (test.ProjectConfiguration.Contains ("Debug")) - yield return new TestData { Variation = "Release", Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static }; + yield return new TestData { Variation = "Release", Debug = false, Profiling = false }; if (test.Platform == TestPlatform.iOS_Unified32 && !test.TestProject.IsDotNetProject) - yield return new TestData { Variation = "Release: UseThumb", Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, UseThumb = true }; + yield return new TestData { Variation = "Release: UseThumb", Debug = false, Profiling = false, UseThumb = true }; // Disable this by default for tvOS/Release because the app ends up being too big (https://github.com/xamarin/maccore/issues/2282) var sdk_release_skip = test.Platform == TestPlatform.tvOS && test.TestName == "dont link"; sdk_release_skip = sdk_release_skip || test.TestProject.IsDotNetProject; if (!sdk_release_skip) - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (release)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, }; + yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (release)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = false, Profiling = false, }; switch (test.TestName) { case "monotouch-test": @@ -94,7 +94,7 @@ IEnumerable GetTestData (RunTestTask test) yield return new TestData { Variation = "Release (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = false, Profiling = false, Defines = "OPTIMIZEALL", Ignored = ignore }; if (supports_debug) { yield return new TestData { Variation = "Debug (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = true, Profiling = false, Defines = "OPTIMIZEALL", Ignored = ignore }; - yield return new TestData { Variation = "Debug: SGenConc", AppBundleExtraOptions = "", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, EnableSGenConc = true, Ignored = ignore }; + yield return new TestData { Variation = "Debug: SGenConc", AppBundleExtraOptions = "", Debug = true, Profiling = false, EnableSGenConc = true, Ignored = ignore }; } if (supports_interpreter) { if (supports_debug) { @@ -113,7 +113,7 @@ IEnumerable GetTestData (RunTestTask test) break; case string name when name.StartsWith ("mscorlib", StringComparison.Ordinal): if (supports_debug) - yield return new TestData { Variation = "Debug: SGenConc", AppBundleExtraOptions = "", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, EnableSGenConc = true }; + yield return new TestData { Variation = "Debug: SGenConc", AppBundleExtraOptions = "", Debug = true, Profiling = false, EnableSGenConc = true }; if (supports_interpreter) { if (supports_debug) { yield return new TestData { Variation = "Debug (interpreter)", AppBundleExtraOptions = "--interpreter", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME", KnownFailure = new KnownIssue ("#1683", issueLink: "https://github.com/xamarin/maccore/issues/1683") }; @@ -280,12 +280,6 @@ public IEnumerable CreateTestVariations (IEnumerable tests, Func -// -// Copyright (c) 2018 Xamarin Inc. (http://www.xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.IO; -using System.Xml; - -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; - -namespace Xharness { - public enum MonoNativeLinkMode { - None, - Static, - Dynamic, - Symlink, - } - - public static class MonoNativeHelper { - public static void AddProjectDefines (XmlDocument project, MonoNativeLinkMode link) - { - switch (link) { - case MonoNativeLinkMode.Static: - project.AddTopLevelProperty ("MonoNativeMode", "MONO_NATIVE_STATIC"); - break; - case MonoNativeLinkMode.Dynamic: - project.AddTopLevelProperty ("MonoNativeMode", "MONO_NATIVE_DYNAMIC"); - break; - case MonoNativeLinkMode.Symlink: - project.AddTopLevelProperty ("MonoNativeMode", "MONO_NATIVE_SYMLINK"); - break; - default: - throw new Exception ($"Unknown MonoNativeLinkMode: {link}"); - } - } - - public static string GetMinimumOSVersion (DevicePlatform platform) - { - switch (platform) { - case DevicePlatform.iOS: - return Xamarin.SdkVersions.MiniOS; - case DevicePlatform.tvOS: - return Xamarin.SdkVersions.MinTVOS; - case DevicePlatform.watchOS: - return Xamarin.SdkVersions.LegacyMinWatchOS; - case DevicePlatform.macOS: - return Xamarin.SdkVersions.MinOSX; - default: - throw new Exception ($"Unknown DevicePlatform: {platform}"); - } - } - } - - public class MonoNativeInfo { - Action log; - public DevicePlatform DevicePlatform { get; set; } - string rootDirectory; - - public MonoNativeInfo (DevicePlatform platform, string rootDirectory, Action logAction = null) - { - DevicePlatform = platform; - this.log = logAction; - this.rootDirectory = rootDirectory ?? throw new ArgumentNullException (nameof (rootDirectory)); - } - - public string FlavorSuffix => "-unified"; - public string ProjectName => "mono-native" + FlavorSuffix; - public string ProjectPath => Path.Combine (rootDirectory, "mono-native", DevicePlatform.ToString (), FlavorSuffix.TrimStart ('-'), TemplateName + FlavorSuffix + ".csproj"); - string TemplateName => "mono-native"; - public string TemplatePath => Path.Combine (rootDirectory, "mono-native", DevicePlatform.ToString (), TemplateName + ".csproj.template"); - - public void Convert () - { - var inputProject = new XmlDocument (); - - var xml = File.ReadAllText (TemplatePath); - inputProject.LoadXmlWithoutNetworkAccess (xml); - inputProject.SetAssemblyName (inputProject.GetAssemblyName () + FlavorSuffix); - inputProject.AddAdditionalDefines ("MONO_NATIVE_UNIFIED"); - inputProject.ResolveAllPaths (TemplatePath); - - var template_info_plist = HarnessConfiguration.EvaluateRootTestsDirectory (inputProject.GetInfoPListInclude ().Replace ('\\', '/')); - var target_info_plist = Path.Combine (Path.GetDirectoryName (ProjectPath), "Info" + FlavorSuffix + ".plist"); - SetInfoPListMinimumOSVersion (template_info_plist, target_info_plist); - target_info_plist = HarnessConfiguration.InjectRootTestsDirectory (target_info_plist); - inputProject.FixInfoPListInclude (FlavorSuffix, newName: target_info_plist); - - inputProject.Save (ProjectPath, log); - } - - public XmlDocument SetInfoPListMinimumOSVersion (string template_plist, string target_plist) - { - var template_info_plist = template_plist; - var info_plist = new XmlDocument (); - info_plist.LoadWithoutNetworkAccess (template_info_plist); - SetInfoPListMinimumOSVersion (info_plist, MonoNativeHelper.GetMinimumOSVersion (DevicePlatform)); - info_plist.Save (target_plist, log); - return info_plist; - } - - public virtual void SetInfoPListMinimumOSVersion (XmlDocument info_plist, string version) - { - if (DevicePlatform == DevicePlatform.macOS) { - info_plist.SetMinimummacOSVersion (version); - } else { - info_plist.SetMinimumOSVersion (version); - } - } - } -} diff --git a/tests/xharness/Targets/TVOSTarget.cs b/tests/xharness/Targets/TVOSTarget.cs index c026021ad1d0..b3bf5c5de289 100644 --- a/tests/xharness/Targets/TVOSTarget.cs +++ b/tests/xharness/Targets/TVOSTarget.cs @@ -63,9 +63,7 @@ public override string DeviceArchitectures { protected override string GetMinimumOSVersion (string templateMinimumOSVersion) { - if (MonoNativeInfo is null) - return Xamarin.SdkVersions.MinTVOS; - return MonoNativeHelper.GetMinimumOSVersion (DevicePlatform.tvOS); + return Xamarin.SdkVersions.MinTVOS; } protected override int [] UIDeviceFamily { diff --git a/tests/xharness/Targets/Target.cs b/tests/xharness/Targets/Target.cs index 47b845f9857c..3d62d717fcc1 100644 --- a/tests/xharness/Targets/Target.cs +++ b/tests/xharness/Targets/Target.cs @@ -235,9 +235,6 @@ public void Execute () templateName = Path.GetFileNameWithoutExtension (templateName); templateName = Path.GetFileNameWithoutExtension (templateName); - if (templateName.Equals ("mono-native-mac", StringComparison.Ordinal)) - templateName = "mono-native"; - if (!ShouldSkipProjectGeneration) { inputProject = new XmlDocument (); inputProject.LoadWithoutNetworkAccess (TemplateProjectPath); diff --git a/tests/xharness/Targets/TodayExtensionTarget.cs b/tests/xharness/Targets/TodayExtensionTarget.cs index ae4e6867c7a5..262f053b466f 100644 --- a/tests/xharness/Targets/TodayExtensionTarget.cs +++ b/tests/xharness/Targets/TodayExtensionTarget.cs @@ -129,9 +129,7 @@ protected override void ExecuteInternal () protected override string GetMinimumOSVersion (string templateMinimumOSVersion) { - if (MonoNativeInfo is null) - return templateMinimumOSVersion; - return MonoNativeHelper.GetMinimumOSVersion (DevicePlatform.iOS); + return templateMinimumOSVersion; } public override IEnumerable GetRelatedProjects () diff --git a/tests/xharness/Targets/UnifiedTarget.cs b/tests/xharness/Targets/UnifiedTarget.cs index a782a2063f53..e5d6c138abda 100644 --- a/tests/xharness/Targets/UnifiedTarget.cs +++ b/tests/xharness/Targets/UnifiedTarget.cs @@ -63,9 +63,7 @@ public override string DeviceArchitectures { protected override string GetMinimumOSVersion (string templateMinimumOSVersion) { - if (MonoNativeInfo is null) - return templateMinimumOSVersion; - return MonoNativeHelper.GetMinimumOSVersion (DevicePlatform.iOS); + return templateMinimumOSVersion; } protected override int [] UIDeviceFamily { diff --git a/tests/xharness/Targets/WatchOSTarget.cs b/tests/xharness/Targets/WatchOSTarget.cs index 19d9df59a371..b1490c0df9da 100644 --- a/tests/xharness/Targets/WatchOSTarget.cs +++ b/tests/xharness/Targets/WatchOSTarget.cs @@ -217,9 +217,7 @@ protected override void ExecuteInternal () protected override string GetMinimumOSVersion (string templateMinimumOSVersion) { - if (MonoNativeInfo is null) - return templateMinimumOSVersion; - return MonoNativeHelper.GetMinimumOSVersion (DevicePlatform.watchOS); + return templateMinimumOSVersion; } public override string Suffix { diff --git a/tests/xharness/Targets/iOSTarget.cs b/tests/xharness/Targets/iOSTarget.cs index a06b3242996d..208c88a815d3 100644 --- a/tests/xharness/Targets/iOSTarget.cs +++ b/tests/xharness/Targets/iOSTarget.cs @@ -8,8 +8,6 @@ namespace Xharness.Targets { public abstract class iOSTarget : Target { public iOSTestProject TestProject; - public MonoNativeInfo MonoNativeInfo => TestProject.MonoNativeInfo; - protected override void PostProcessExecutableProject () { base.PostProcessExecutableProject (); diff --git a/tests/xharness/TestLabel.cs b/tests/xharness/TestLabel.cs index 61e73d0e976c..de55a4774f0f 100644 --- a/tests/xharness/TestLabel.cs +++ b/tests/xharness/TestLabel.cs @@ -55,8 +55,7 @@ public enum TestLabel : Int64 { MacBindingProject = 1 << 17, [Label ("mmp")] Mmp = 1 << 18, - [Label ("mononative")] - Mononative = 1 << 19, + // 1 << 19 is unused [Label ("monotouch")] Monotouch = 1 << 20, [Label ("msbuild")] diff --git a/tests/xharness/TestProject.cs b/tests/xharness/TestProject.cs index caceaa93c253..a645531746c4 100644 --- a/tests/xharness/TestProject.cs +++ b/tests/xharness/TestProject.cs @@ -37,9 +37,6 @@ public class TestProject { public IEnumerable? ProjectReferences; - // Optional - public MonoNativeInfo? MonoNativeInfo { get; set; } - public TestProject (TestLabel label, string path, bool isExecutableProject = true) { Label = label; diff --git a/tests/xharness/iOSTestProject.cs b/tests/xharness/iOSTestProject.cs index 85ad3e3526f7..6d8a9cf2c214 100644 --- a/tests/xharness/iOSTestProject.cs +++ b/tests/xharness/iOSTestProject.cs @@ -19,10 +19,7 @@ public iOSTestProject (TestLabel label, string path, bool isExecutableProject = public bool IsSupported (DevicePlatform devicePlatform, string productVersion) { - if (MonoNativeInfo is null) - return true; - var min_version = MonoNativeHelper.GetMinimumOSVersion (devicePlatform); - return Version.Parse (productVersion) >= Version.Parse (min_version); + return true; } public override TestProject Clone () diff --git a/tests/xharness/xharness.csproj b/tests/xharness/xharness.csproj index 27ef8e5ea82a..1fb000b19799 100644 --- a/tests/xharness/xharness.csproj +++ b/tests/xharness/xharness.csproj @@ -105,7 +105,6 @@ - From b81fc7375c6f012de5a1055af0f57bd7e0ae0692 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 01:22:36 +0200 Subject: [PATCH 009/155] [tests] Rework StringAttributesTests.SimpleAttributesTest. Fixes #18656. (#21336) * CTLine crashes with certain NSAttributedStrings, so don't do that. This fixes #18656. * Implement this test for macOS. * Misc other fixes. Fixes https://github.com/xamarin/xamarin-macios/issues/18656. --- .../CoreText/StringAttributes.cs | 60 +++++++++++++++---- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/tests/monotouch-test/CoreText/StringAttributes.cs b/tests/monotouch-test/CoreText/StringAttributes.cs index 049196ae4455..7bc7e36d8ded 100644 --- a/tests/monotouch-test/CoreText/StringAttributes.cs +++ b/tests/monotouch-test/CoreText/StringAttributes.cs @@ -24,13 +24,9 @@ namespace MonoTouchFixtures.CoreText { [TestFixture] [Preserve (AllMembers = true)] public class StringAttributesTests { -#if !MONOMAC // No UIGraphics on mac [Test] - public void SimpleValuesSet () + public void NoCTLine () { - if (TestRuntime.CheckXcodeVersion (15, 0)) - Assert.Ignore ("Test timeouts on Xcode 15 beta 4: https://github.com/xamarin/xamarin-macios/issues/18656"); - var sa = new CTStringAttributes (); sa.ForegroundColor = UIColor.Blue.CGColor; sa.Font = new CTFont ("Georgia-BoldItalic", 24); @@ -50,14 +46,51 @@ public void SimpleValuesSet () sa.TrackingAdjustment = 1.0f; AdaptiveImageProvider? provider = null; -#if NET + if (TestRuntime.CheckXcodeVersion (16, 0)) { + sa.AdaptiveImageProvider = provider = new AdaptiveImageProvider (); + Assert.AreSame (provider, sa.AdaptiveImageProvider, "AdaptiveImageProvider"); + } + } + + [Test] + public void SimpleValuesSet () + { + var sa = new CTStringAttributes (); + sa.ForegroundColor = UIColor.Blue.CGColor; + sa.Font = new CTFont ("Georgia-BoldItalic", 24); + sa.UnderlineStyle = CTUnderlineStyle.Double; // It does not seem to do anything + sa.UnderlineColor = UIColor.Blue.CGColor; + sa.UnderlineStyleModifiers = CTUnderlineStyleModifiers.PatternDashDotDot; + + Assert.IsNull (sa.BaselineClass, "#0"); + sa.BaselineClass = CTBaselineClass.IdeographicHigh; + Assert.AreEqual (CTBaselineClass.IdeographicHigh, sa.BaselineClass, "#1"); + + // Calling sa.SetBaselineInfo makes the CTLine ctor crash (https://github.com/xamarin/maccore/issues/2947) + // so don't do that here. + // sa.SetBaselineInfo (CTBaselineClass.Roman, 13); + // sa.SetBaselineInfo (CTBaselineClass.IdeographicHigh, 3); + sa.SetWritingDirection (CTWritingDirection.LeftToRight); + + if (TestRuntime.CheckXcodeVersion (11, 0)) + sa.TrackingAdjustment = 1.0f; + + AdaptiveImageProvider? provider = null; if (TestRuntime.CheckXcodeVersion (16, 0)) sa.AdaptiveImageProvider = provider = new AdaptiveImageProvider (); -#endif var size = new CGSize (300, 300); +#if MONOMAC + using var imageRep = new NSBitmapImageRep (IntPtr.Zero, (nint) size.Width, (nint) size.Height, 8, 4, true, false, NSColorSpace.DeviceRGB, 4 * (int) size.Width, 32); + using var graphicsContext = NSGraphicsContext.FromBitmap (imageRep); + using var img = new NSImage (size); + img.AddRepresentation (imageRep); + img.LockFocus (); + using var gctx = graphicsContext.CGContext; +#else UIGraphics.BeginImageContext (size); - var gctx = UIGraphics.GetCurrentContext (); + using var gctx = UIGraphics.GetCurrentContext (); +#endif gctx.SetFillColor (UIColor.Green.CGColor); @@ -67,9 +100,8 @@ public void SimpleValuesSet () textLine.Draw (gctx); } -#if NET if (TestRuntime.CheckXcodeVersion (16, 0)) - Assert.AreEqual (0, provider!.Count, "AdaptiveImageProvider #0"); + Assert.AreEqual (1, provider!.Count, "AdaptiveImageProvider #0"); attributedString = new NSAttributedString ("🙈`", sa); using (var textLine = new CTLine (attributedString)) { @@ -77,12 +109,14 @@ public void SimpleValuesSet () } if (TestRuntime.CheckXcodeVersion (16, 0)) - Assert.AreEqual (1, provider!.Count, "AdaptiveImageProvider #1"); -#endif + Assert.AreEqual (2, provider!.Count, "AdaptiveImageProvider #1"); +#if MONOMAC + img.UnlockFocus (); +#else UIGraphics.EndImageContext (); - } #endif + } [Test] public void BackgroundColor () From 76b6538845fb7aedee51bd00bc6088444978e734 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 01:27:22 +0200 Subject: [PATCH 010/155] [tests] Ignore a few tests that fail on Mac Catalyst/arm64. (#21322) Also remove some outdated watchOS ignores. Ref: https://github.com/xamarin/xamarin-macios/issues/19781 --- .../ObjCRuntime/RegistrarTestGenerated.cs | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs b/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs index f1d9f7930ab0..2a500d50b312 100644 --- a/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs +++ b/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs @@ -1,3 +1,4 @@ +using ObjCRuntime; using System.Runtime.CompilerServices; using NUnit.Framework; @@ -8,13 +9,24 @@ public partial class RegistrarTestGenerated { void AssertIfIgnored ([CallerMemberName] string testCase = null) { switch (testCase) { -#if __WATCHOS__ - case "Test_c": - case "Test_cc": - case "Test_ccc": - case "Test_s": - case "Test_sss": - Assert.Ignore ("https://github.com/mono/mono/issues/8486"); +#if __MACCATALYST__ + case "NSNumberBindAs_Boolean_Array_Overrides": + case "NSNumberBindAs_Byte_Array_Overrides": + case "NSNumberBindAs_Double_Array_Overrides": + case "NSNumberBindAs_Int16_Array_Overrides": + case "NSNumberBindAs_Int32_Array_Overrides": + case "NSNumberBindAs_Int64_Array_Overrides": + case "NSNumberBindAs_nint_Array_Overrides": + case "NSNumberBindAs_NSStreamStatus_Array_Overrides": + case "NSNumberBindAs_nuint_Array_Overrides": + case "NSNumberBindAs_SByte_Array_Overrides": + case "NSNumberBindAs_Single_Array_Overrides": + case "NSNumberBindAs_UInt16_Array_Overrides": + case "NSNumberBindAs_UInt32_Array_Overrides": + case "NSNumberBindAs_UInt64_Array_Overrides": + // https://github.com/xamarin/xamarin-macios/issues/19781 + if (Runtime.IsARM64CallingConvention) + Assert.Ignore ("https://github.com/xamarin/xamarin-macios/issues/19781"); break; #endif default: From 3db59cc8d5afe78d17f170f3c9e9d5acbc7b2ef0 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 10:36:22 +0200 Subject: [PATCH 011/155] [tests] Fix inclusion of Directory.Build.props up the directory hierarchy. (#21341) The first Directory.Build.props should be imported, so do that. --- tests/dotnet/MySimpleApp/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dotnet/MySimpleApp/Directory.Build.props b/tests/dotnet/MySimpleApp/Directory.Build.props index f35c2a50a994..465fa5046e93 100644 --- a/tests/dotnet/MySimpleApp/Directory.Build.props +++ b/tests/dotnet/MySimpleApp/Directory.Build.props @@ -3,5 +3,5 @@ false - + From c4a5627f03e0555ed35395ac2e4207432c9ceb87 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 11:32:43 +0200 Subject: [PATCH 012/155] [PassKit] Finish implementation of PKPayLaterValidateAmount. Fixes #19271. (#21339) Fixes https://github.com/xamarin/xamarin-macios/issues/19271. --- src/PassKit/PKPayLaterView.cs | 129 +++++++++--------- .../PassKit/PKPayLaterViewTest.cs | 72 ++++++---- .../api-annotations-dotnet/iOS-PassKit.ignore | 3 - 3 files changed, 116 insertions(+), 88 deletions(-) diff --git a/src/PassKit/PKPayLaterView.cs b/src/PassKit/PKPayLaterView.cs index 49c26d19733e..15457dc99641 100644 --- a/src/PassKit/PKPayLaterView.cs +++ b/src/PassKit/PKPayLaterView.cs @@ -1,72 +1,79 @@ -// Can be uncommented when this issue is resolved: # https://github.com/xamarin/xamarin-macios/issues/19271 +#nullable enable -// #nullable enable +#if IOS && !__MACCATALYST__ -// #if IOS && !__MACCATALYST__ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; -// using System; -// using System.Runtime.InteropServices; -// using System.Runtime.CompilerServices; -// using ObjCRuntime; -// using Foundation; -// using PassKit; +using Foundation; +using ObjCRuntime; +using PassKit; -// #if !NET -// using NativeHandle = System.IntPtr; -// #endif +namespace PassKit { -// namespace PassKit { + /// The delegate that is called when has determined whether the Pay Later Merchandising information is valid. + /// True if the Pay Later Merchandising information is valid, false otherwise. + public delegate void PKPayLaterViewValidateAmountCallback (bool eligible); -// public partial class PKPayLaterView { + public partial class PKPayLaterView { + [UnmanagedCallersOnly] + static void TrampolineValidateAmount (IntPtr block, byte eligible) + { + var del = BlockLiteral.GetTarget (block); + if (del is not null) { + del (eligible != 0); + } + } -// #if !NET -// delegate void PKPayLaterValidateAmountCompletionHandler (IntPtr block, byte eligible); -// static PKPayLaterValidateAmountCompletionHandler static_ValidateAmount = TrampolineValidateAmount; + /// Checks whether the Pay Later Merchandising information is valid for the specified amount and currency. + /// The amount to check for. + /// The ISO 4217 currency code to use. + /// The delegate that will be called with the result. + [SupportedOSPlatform ("ios17.0")] + [UnsupportedOSPlatform ("maccatalyst")] + [UnsupportedOSPlatform ("macos")] + [UnsupportedOSPlatform ("tvos")] + [BindingImpl (BindingImplOptions.Optimizable)] + public static void ValidateAmount (NSDecimalNumber amount, string currencyCode, PKPayLaterViewValidateAmountCallback callback) + { + if (callback is null) + ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (callback)); -// [MonoPInvokeCallback (typeof (PKPayLaterValidateAmountCompletionHandler))] -// #else -// [UnmanagedCallersOnly] -// #endif -// static void TrampolineValidateAmount (IntPtr block, byte eligible) -// { -// var del = BlockLiteral.GetTarget> (block); -// if (del is not null) { -// del (eligible != 0); -// } -// } + unsafe { + delegate* unmanaged trampoline = &TrampolineValidateAmount; + using var block = new BlockLiteral (trampoline, callback, typeof (PKPayLaterView), nameof (TrampolineValidateAmount)); + var nsCurrencyCodePtr = NSString.CreateNative (currencyCode); + try { + PKPayLaterValidateAmount (amount.Handle, nsCurrencyCodePtr, &block); + } finally { + NSString.ReleaseNative (nsCurrencyCodePtr); + } + } + } -// #if NET -// [SupportedOSPlatform ("ios17.0")] -// [UnsupportedOSPlatform ("maccatalyst")] -// [UnsupportedOSPlatform ("macos")] -// [UnsupportedOSPlatform ("tvos")] -// #endif -// [BindingImpl (BindingImplOptions.Optimizable)] -// public static void ValidateAmount (NSDecimalNumber amount, string currencyCode, Action callback) -// { -// if (callback is null) -// ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (callback)); + /// Checks whether the Pay Later Merchandising information is valid for the specified amount and currency. + /// The amount to check for. + /// The ISO 4217 currency code to use. + /// The delegate that will be called with the result. + [SupportedOSPlatform ("ios17.0")] + [UnsupportedOSPlatform ("maccatalyst")] + [UnsupportedOSPlatform ("macos")] + [UnsupportedOSPlatform ("tvos")] + [BindingImpl (BindingImplOptions.Optimizable)] + public static void ValidateAmount (decimal amount, string currencyCode, PKPayLaterViewValidateAmountCallback callback) + { + using var decimalAmount = new NSDecimalNumber ((NSDecimal) amount); + ValidateAmount (decimalAmount, currencyCode, callback); + } -// unsafe { -// #if NET -// delegate* unmanaged trampoline = &TrampolineValidateAmount; -// using var block = new BlockLiteral (trampoline, callback, typeof (PKPayLaterView), nameof (TrampolineValidateAmount)); -// #else -// using var block = new BlockLiteral (); -// block.SetupBlockUnsafe (static_ValidateAmount, callback); -// #endif -// var nsCurrencyCodePtr = NSString.CreateNative (currencyCode); -// try { -// PKPayLaterValidateAmount (amount.Handle, nsCurrencyCodePtr, &block); -// } finally { -// NSString.ReleaseNative (nsCurrencyCodePtr); -// } -// } -// } + [SupportedOSPlatform ("ios17.0")] + [UnsupportedOSPlatform ("maccatalyst")] + [UnsupportedOSPlatform ("macos")] + [UnsupportedOSPlatform ("tvos")] + [DllImport (Constants.PassKitLibrary)] + unsafe static extern void PKPayLaterValidateAmount (IntPtr /* NSDecimalNumber */ amount, IntPtr /* NSString */ currencyCode, BlockLiteral* callback); + } +} -// [DllImport (Constants.PassKitLibrary)] -// unsafe static extern void PKPayLaterValidateAmount (IntPtr /* NSDecimalNumber */ amount, IntPtr /* NSString */ currencyCode, BlockLiteral* callback); -// } -// } - -// #endif +#endif diff --git a/tests/monotouch-test/PassKit/PKPayLaterViewTest.cs b/tests/monotouch-test/PassKit/PKPayLaterViewTest.cs index 54ab17be2f74..3dafe6dec6b0 100644 --- a/tests/monotouch-test/PassKit/PKPayLaterViewTest.cs +++ b/tests/monotouch-test/PassKit/PKPayLaterViewTest.cs @@ -1,31 +1,55 @@ -// Can be uncommented when this issue is resolved: # https://github.com/xamarin/xamarin-macios/issues/19271 +#if __IOS__ && !__MACCATALYST__ -// #if __IOS__ && !__MACCATALYST__ +using System; +using System.Threading; -// using System; -// using Foundation; -// using UIKit; -// using PassKit; -// using NUnit.Framework; +using Foundation; +using UIKit; -// namespace MonoTouchFixtures.PassKit { +using PassKit; -// [TestFixture] -// [Preserve (AllMembers = true)] -// public class PKPayLaterViewTest { +using NUnit.Framework; -// [Test] -// public void ValidateAmountTest () -// { -// TestRuntime.AssertXcodeVersion (15, 0); +namespace MonoTouchFixtures.PassKit { -// for (int i = 0; i < 1000; i++){ -// PKPayLaterView.ValidateAmount (new NSDecimalNumber (i), "USD", (eligible) => { -// Assert.False (eligible); -// }); -// } -// } -// } -// } + [TestFixture] + [Preserve (AllMembers = true)] + public class PKPayLaterViewTest { -// #endif + [Test] + public void ValidateAmountTest_NSDecimal () + { + TestRuntime.AssertXcodeVersion (15, 0); + + var counter = 100; + var cnt = 0; + for (int i = 0; i < counter; i++) { + PKPayLaterView.ValidateAmount (new NSDecimalNumber (i), "USD", (eligible) => { + Interlocked.Increment (ref cnt); + }); + } + // The callback is rarely called, so just assert that we don't get more callbacks than + // actual validation requests. + Assert.That (cnt, Is.Not.LessThan (0).And.Not.GreaterThan (counter), $"NSDecimalNumber overload"); + } + + [Test] + public void ValidateAmountTest_Decimal () + { + TestRuntime.AssertXcodeVersion (15, 0); + + var counter = 100; + var cnt = 0; + for (int i = 0; i < counter; i++) { + PKPayLaterView.ValidateAmount (i, "USD", (eligible) => { + Interlocked.Increment (ref cnt); + }); + } + // The callback is rarely called, so just assert that we don't get more callbacks than + // actual validation requests. + Assert.That (cnt, Is.Not.LessThan (0).And.Not.GreaterThan (counter), $"decimal overload"); + } + } +} + +#endif diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-PassKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/iOS-PassKit.ignore index a4d141ea5e35..1be18a80705a 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-PassKit.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-PassKit.ignore @@ -6,6 +6,3 @@ # needed to allow our WeakDelegate wrap !extra-null-allowed! 'System.Void PassKit.PKPayLaterView::set_WeakDelegate(Foundation.NSObject)' has a extraneous [NullAllowed] on parameter #0 - -# https://github.com/xamarin/xamarin-macios/issues/19271 -!missing-pinvoke! PKPayLaterValidateAmount is not bound From 89195184c85de6c820453fa3438f176520ec212a Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 11:44:21 +0200 Subject: [PATCH 013/155] [actions] There's no reason to keep testing a .NET-only configuration. (#21330) Because there's nothing but .NET now. --- .github/workflows/update-single-platform-branches.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-single-platform-branches.yml b/.github/workflows/update-single-platform-branches.yml index 0a0deab61fa4..e5c75d63a120 100644 --- a/.github/workflows/update-single-platform-branches.yml +++ b/.github/workflows/update-single-platform-branches.yml @@ -28,7 +28,7 @@ jobs: set -ex git config user.email "github-actions-single-platform-branch-updater@xamarin.com" git config user.name "GitHub Actions Single Platform Branch Updater" - for platform in dotnet-iOS dotnet-tvOS dotnet-MacCatalyst dotnet-macOS dotnet; do + for platform in dotnet-iOS dotnet-tvOS dotnet-MacCatalyst dotnet-macOS; do git checkout -b release-test/only-$platform origin/release-test/only-$platform git merge origin/main git push From 6b2e93651aa4faedd5323395946bbe6da8c8ca14 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 12:24:56 +0200 Subject: [PATCH 014/155] [UIKit] Improve code for UISegmentedControl. Fixes #21289. (#21299) 1. Enable nullability. 2. Move Get|SetTitleTextAttributes to generated code. 3. Remove dead code (pre-.NET code paths). Point 2. fixes #21289, so add tests for this scenario. Fixes https://github.com/xamarin/xamarin-macios/issues/21289. --- src/Foundation/DictionaryContainer.cs | 1 + src/UIKit/UISegmentedControl.cs | 53 +------------------ src/uikit.cs | 17 ++++-- .../Documentation.KnownFailures.txt | 2 + .../UIKit/SegmentedControlTest.cs | 12 +++++ .../MacCatalyst-UIKit.ignore | 2 - .../api-annotations-dotnet/iOS-UIKit.ignore | 2 - .../api-annotations-dotnet/tvOS-UIKit.ignore | 2 - 8 files changed, 30 insertions(+), 61 deletions(-) diff --git a/src/Foundation/DictionaryContainer.cs b/src/Foundation/DictionaryContainer.cs index 5a7918052cb8..d8247bf5cb33 100644 --- a/src/Foundation/DictionaryContainer.cs +++ b/src/Foundation/DictionaryContainer.cs @@ -546,6 +546,7 @@ static public NativeHandle GetHandle (this DictionaryContainer? self) // helper to avoid the (common pattern) // var p = x is null ? null : x.Dictionary; + [return: NotNullIfNotNull (nameof (self))] static public NSDictionary? GetDictionary (this DictionaryContainer? self) { return self is null ? null : self.Dictionary; diff --git a/src/UIKit/UISegmentedControl.cs b/src/UIKit/UISegmentedControl.cs index f80fe2c8f0f9..d3756f66ca79 100644 --- a/src/UIKit/UISegmentedControl.cs +++ b/src/UIKit/UISegmentedControl.cs @@ -8,19 +8,14 @@ // Copyright 2011 Xamarin, Inc // -#if !WATCH - using System; using System.Collections; using Foundation; using ObjCRuntime; using CoreGraphics; +using UIKit; -#if XAMCORE_3_0 -using TextAttributes = UIKit.UIStringAttributes; -#else -using TextAttributes = UIKit.UITextAttributes; -#endif +#nullable enable namespace UIKit { public partial class UISegmentedControl { @@ -92,49 +87,5 @@ static NSArray FromStrings (string [] strings) return NSArray.FromStrings (strings); } - - public void SetTitleTextAttributes (TextAttributes attributes, UIControlState state) - { - if (attributes is null) - throw new ArgumentNullException ("attributes"); - -#if XAMCORE_3_0 - var dict = attributes.Dictionary; -#else - using var dict = attributes.ToDictionary (); -#endif - _SetTitleTextAttributes (dict, state); - } - - public TextAttributes GetTitleTextAttributes (UIControlState state) - { - using (var d = _GetTitleTextAttributes (state)) { - return new TextAttributes (d); - } - } - - public partial class UISegmentedControlAppearance { - public void SetTitleTextAttributes (TextAttributes attributes, UIControlState state) - { - if (attributes is null) - throw new ArgumentNullException ("attributes"); - -#if XAMCORE_3_0 - var dict = attributes.Dictionary; -#else - using var dict = attributes.ToDictionary (); -#endif - _SetTitleTextAttributes (dict, state); - } - - public TextAttributes GetTitleTextAttributes (UIControlState state) - { - using (var d = _GetTitleTextAttributes (state)) { - return new TextAttributes (d); - } - } - } } } - -#endif // !WATCH diff --git a/src/uikit.cs b/src/uikit.cs index c3559a3f2381..bdb2c99f5332 100644 --- a/src/uikit.cs +++ b/src/uikit.cs @@ -14087,13 +14087,22 @@ interface UISegmentedControl UIImage DividerImageForLeftSegmentStaterightSegmentStatebarMetrics (UIControlState leftState, UIControlState rightState, UIBarMetrics barMetrics); #endif - [Export ("setTitleTextAttributes:forState:"), Internal] [Appearance] - void _SetTitleTextAttributes (NSDictionary attributes, UIControlState state); + [Wrap ("SetTitleTextAttributes (attributes?.GetDictionary (), state)")] + void SetTitleTextAttributes ([NullAllowed] UIStringAttributes attributes, UIControlState state); - [Export ("titleTextAttributesForState:"), Internal] + [Export ("setTitleTextAttributes:forState:")] [Appearance] - NSDictionary _GetTitleTextAttributes (UIControlState state); + void SetTitleTextAttributes ([NullAllowed] NSDictionary attributes, UIControlState state); + + [Appearance] + [Wrap ("new UIStringAttributes (GetWeakTitleTextAttributes (state))")] + UIStringAttributes GetTitleTextAttributes (UIControlState state); + + [Appearance] + [Export ("titleTextAttributesForState:")] + [return: NullAllowed] + NSDictionary GetWeakTitleTextAttributes (UIControlState state); [Export ("setContentPositionAdjustment:forSegmentType:barMetrics:")] [Appearance] diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 17d3e16881ca..900ecf8af7ed 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -51492,9 +51492,11 @@ M:UIKit.UISegmentedControl.UISegmentedControlAppearance.ContentPositionAdjustmen M:UIKit.UISegmentedControl.UISegmentedControlAppearance.GetBackgroundImage(UIKit.UIControlState,UIKit.UIBarMetrics) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.GetDividerImage(UIKit.UIControlState,UIKit.UIControlState,UIKit.UIBarMetrics) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.GetTitleTextAttributes(UIKit.UIControlState) +M:UIKit.UISegmentedControl.UISegmentedControlAppearance.GetWeakTitleTextAttributes(UIKit.UIControlState) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetBackgroundImage(UIKit.UIImage,UIKit.UIControlState,UIKit.UIBarMetrics) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetContentPositionAdjustment(UIKit.UIOffset,UIKit.UISegmentedControlSegment,UIKit.UIBarMetrics) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetDividerImage(UIKit.UIImage,UIKit.UIControlState,UIKit.UIControlState,UIKit.UIBarMetrics) +M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetTitleTextAttributes(Foundation.NSDictionary,UIKit.UIControlState) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetTitleTextAttributes(UIKit.UIStringAttributes,UIKit.UIControlState) M:UIKit.UISelectionFeedbackGenerator.GetFeedbackGenerator(UIKit.UIView) M:UIKit.UIShadowProperties.Copy(Foundation.NSZone) diff --git a/tests/monotouch-test/UIKit/SegmentedControlTest.cs b/tests/monotouch-test/UIKit/SegmentedControlTest.cs index 37435e0c216c..a567efd3b0e1 100644 --- a/tests/monotouch-test/UIKit/SegmentedControlTest.cs +++ b/tests/monotouch-test/UIKit/SegmentedControlTest.cs @@ -7,6 +7,7 @@ using System.IO; using CoreGraphics; using Foundation; +using ObjCRuntime; using UIKit; using NUnit.Framework; @@ -107,6 +108,17 @@ public void CtorUIImage () Assert.That (sc.NumberOfSegments, Is.EqualTo ((nint) 1), "NumberOfSegments"); } } + + [Test] + public void TitleTextAttributes () + { + using var sc = new UISegmentedControl ("one", "two"); + sc.SetTitleTextAttributes (new UIStringAttributes () { ForegroundColor = UIColor.Gray }, UIControlState.Selected); + var attrib = sc.GetTitleTextAttributes (UIControlState.Selected); + Assert.AreEqual (UIColor.Gray, attrib?.ForegroundColor, "ForegroundColor"); + Assert.IsNotNull (attrib?.Dictionary, "Dictionary"); + Assert.AreNotEqual (NativeHandle.Zero, attrib.Dictionary.Handle, "Dictionary.Handle"); + } } } diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.ignore index 8e3b0a4f0476..2739f5efab4c 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.ignore @@ -172,7 +172,6 @@ !missing-null-allowed! 'Foundation.NSDictionary UIKit.UIDocument::GetFileAttributesToWrite(Foundation.NSUrl,UIKit.UIDocumentSaveOperation,Foundation.NSError&)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSDictionary UIKit.UIMotionEffect::ComputeKeyPathsAndRelativeValues(UIKit.UIOffset)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSDictionary UIKit.UISearchBar::_GetScopeBarButtonTitleTextAttributes(UIKit.UIControlState)' is missing an [NullAllowed] on return type -!missing-null-allowed! 'Foundation.NSDictionary UIKit.UISegmentedControl::_GetTitleTextAttributes(UIKit.UIControlState)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UICollectionViewFocusUpdateContext::get_NextFocusedIndexPath()' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UICollectionViewFocusUpdateContext::get_PreviouslyFocusedIndexPath()' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UITableViewDelegate::WillDeselectRow(UIKit.UITableView,Foundation.NSIndexPath)' is missing an [NullAllowed] on return type @@ -284,7 +283,6 @@ !missing-null-allowed! 'System.Void UIKit.UISearchBar::_SetScopeBarButtonTitle(Foundation.NSDictionary,UIKit.UIControlState)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISearchTextField::set_TokenBackgroundColor(UIKit.UIColor)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::.ctor(Foundation.NSArray)' is missing an [NullAllowed] on parameter #0 -!missing-null-allowed! 'System.Void UIKit.UISegmentedControl::_SetTitleTextAttributes(Foundation.NSDictionary,UIKit.UIControlState)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::InsertSegment(System.String,System.IntPtr,System.Boolean)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::InsertSegment(UIKit.UIImage,System.IntPtr,System.Boolean)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::SetImage(UIKit.UIImage,System.IntPtr)' is missing an [NullAllowed] on parameter #0 diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.ignore index cc11a9f0362c..5539be8aa49c 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.ignore @@ -176,7 +176,6 @@ !missing-null-allowed! 'Foundation.NSDictionary UIKit.UIDocument::GetFileAttributesToWrite(Foundation.NSUrl,UIKit.UIDocumentSaveOperation,Foundation.NSError&)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSDictionary UIKit.UIMotionEffect::ComputeKeyPathsAndRelativeValues(UIKit.UIOffset)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSDictionary UIKit.UISearchBar::_GetScopeBarButtonTitleTextAttributes(UIKit.UIControlState)' is missing an [NullAllowed] on return type -!missing-null-allowed! 'Foundation.NSDictionary UIKit.UISegmentedControl::_GetTitleTextAttributes(UIKit.UIControlState)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UICollectionViewFocusUpdateContext::get_NextFocusedIndexPath()' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UICollectionViewFocusUpdateContext::get_PreviouslyFocusedIndexPath()' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UITableViewDelegate::WillDeselectRow(UIKit.UITableView,Foundation.NSIndexPath)' is missing an [NullAllowed] on return type @@ -288,7 +287,6 @@ !missing-null-allowed! 'System.Void UIKit.UISearchBar::_SetScopeBarButtonTitle(Foundation.NSDictionary,UIKit.UIControlState)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISearchTextField::set_TokenBackgroundColor(UIKit.UIColor)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::.ctor(Foundation.NSArray)' is missing an [NullAllowed] on parameter #0 -!missing-null-allowed! 'System.Void UIKit.UISegmentedControl::_SetTitleTextAttributes(Foundation.NSDictionary,UIKit.UIControlState)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::InsertSegment(System.String,System.IntPtr,System.Boolean)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::InsertSegment(UIKit.UIImage,System.IntPtr,System.Boolean)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::SetImage(UIKit.UIImage,System.IntPtr)' is missing an [NullAllowed] on parameter #0 diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.ignore index ddb894e0504e..dfbf47f14611 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.ignore @@ -196,7 +196,6 @@ !missing-null-allowed! 'Foundation.NSDictionary UIKit.UICollectionViewLayoutInvalidationContext::get_InvalidatedSupplementaryIndexPaths()' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSDictionary UIKit.UIMotionEffect::ComputeKeyPathsAndRelativeValues(UIKit.UIOffset)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSDictionary UIKit.UISearchBar::_GetScopeBarButtonTitleTextAttributes(UIKit.UIControlState)' is missing an [NullAllowed] on return type -!missing-null-allowed! 'Foundation.NSDictionary UIKit.UISegmentedControl::_GetTitleTextAttributes(UIKit.UIControlState)' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UICollectionViewFocusUpdateContext::get_NextFocusedIndexPath()' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UICollectionViewFocusUpdateContext::get_PreviouslyFocusedIndexPath()' is missing an [NullAllowed] on return type !missing-null-allowed! 'Foundation.NSIndexPath UIKit.UITableViewDelegate::WillDeselectRow(UIKit.UITableView,Foundation.NSIndexPath)' is missing an [NullAllowed] on return type @@ -265,7 +264,6 @@ !missing-null-allowed! 'System.Void UIKit.UIScrollViewDelegate::ZoomingStarted(UIKit.UIScrollView,UIKit.UIView)' is missing an [NullAllowed] on parameter #1 !missing-null-allowed! 'System.Void UIKit.UISearchBar::_SetScopeBarButtonTitle(Foundation.NSDictionary,UIKit.UIControlState)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::.ctor(Foundation.NSArray)' is missing an [NullAllowed] on parameter #0 -!missing-null-allowed! 'System.Void UIKit.UISegmentedControl::_SetTitleTextAttributes(Foundation.NSDictionary,UIKit.UIControlState)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::InsertSegment(System.String,System.IntPtr,System.Boolean)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::InsertSegment(UIKit.UIImage,System.IntPtr,System.Boolean)' is missing an [NullAllowed] on parameter #0 !missing-null-allowed! 'System.Void UIKit.UISegmentedControl::SetImage(UIKit.UIImage,System.IntPtr)' is missing an [NullAllowed] on parameter #0 From 88310119fd7dea7d0ee8f35d57befcd878678e92 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 14:44:09 +0200 Subject: [PATCH 015/155] [devops] Rework how we hide GitHub comments. (#21320) * Whenever we add a GitHub comment, also provide a comment id. * When adding a GitHub comment, use that comment id to hide any previous comments with the same id. It turns out this simplifies the code a lot, and additionally we now correctly hide every comment we report whenever a step or stage is re-executed. --- tools/devops/automation/scripts/GitHub.psm1 | 66 ++++++++++++++++--- .../scripts/clean_past_comments.ps1 | 36 ---------- .../automation/templates/api-diff-stage.yml | 12 ---- .../build/api-diff-process-results.yml | 2 +- .../automation/templates/build/build.yml | 2 +- .../automation/templates/common/clean.yml | 36 ---------- .../devops/automation/templates/mac/build.yml | 4 +- .../automation/templates/main-stage.yml | 15 ----- .../artifact-github-comment.yml | 2 +- .../automation/templates/tests-stage.yml | 12 ---- .../templates/tests/publish-html.yml | 8 +-- .../templates/tests/publish-results.yml | 2 +- .../automation/templates/windows/build.yml | 6 +- 13 files changed, 68 insertions(+), 135 deletions(-) delete mode 100644 tools/devops/automation/scripts/clean_past_comments.ps1 delete mode 100644 tools/devops/automation/templates/common/clean.yml diff --git a/tools/devops/automation/scripts/GitHub.psm1 b/tools/devops/automation/scripts/GitHub.psm1 index db3636044d8c..69774dc33b32 100644 --- a/tools/devops/automation/scripts/GitHub.psm1 +++ b/tools/devops/automation/scripts/GitHub.psm1 @@ -294,7 +294,8 @@ class GitHubComments { } [void] WriteCommentFooter( - [object] $stringBuilder + [object] $stringBuilder, + [string] $commentId ) { $targetUrl = Get-TargetUrl $stringBuilder.AppendLine("[Pipeline]($targetUrl) on Agent $Env:TESTS_BOT") # Env:TESTS_BOT is added by the pipeline as a variable coming from the execute tests job @@ -308,12 +309,20 @@ class GitHubComments { $hashUrl= "https://github.com/$($this.Org)/$($this.Repo)/commit/$($this.Hash)" $hashSource = " [CI build]" } - $ciComment = "[comment]: <> (This is a comment added by Azure DevOps)" + $ciComment = $this.GetCommentIdentifier($commentId) $stringBuilder.AppendLine("Hash: [$($this.Hash)]($hashUrl) $hashSource") $stringBuilder.AppendLine("") $stringBuilder.AppendLine($ciComment) } + [string] GetCommentIdentifier([string] $commentId) + { + $sanitizedId = $commentId + $sanitizedId = $sanitizedId.Replace("(","_").Replace(")","_").Replace("[","_").Replace("]","_") + $sanitizedId = $sanitizedId.Replace("{","_").Replace("}","_").Replace("<","_").Replace(">","_") + return "[comment]: <> (This is a comment added by Azure DevOps, id: $sanitizedId)" + } + [string] GetCommentUrl() { # if the build was due to PR, we want to write the comment in the PR rather than in the commit if ([GitHubComments]::IsPR()) { @@ -360,11 +369,46 @@ class GitHubComments { return $request } + [void] HideComments( + [string] $commentId + ) { + if (!$commentId) { + Write-Host "Not hiding comments, because no comment id provided" + return + } + + if (![GitHubComments]::IsPR()) { + Write-Host "Not hiding comments, because we're not in a pull request" + return + } + + $prId = "$Env:BUILD_SOURCEBRANCH".Replace("refs/pull/", "").Replace("/merge", "") + $prComments = $this.GetCommentsForPR($prId) + + $botComments = [System.Collections.ArrayList]@() + $commentToHide = $this.GetCommentIdentifier($commentId) + + foreach ($c in $prComments) { + if ($c.Author -eq "vs-mobiletools-engineering-service2") { + if ($c.Body.Contains($CommentToHide)) { + $botComments.Add($c) + } + } + } + + Write-Host "Hiding $($botComments.Count) comments for PR #$prId with comment id '$commentId'" + + $this.MinimizeComments($botComments) + } + [object] NewCommentFromObject( [string] $commentTitle, [string] $commentEmoji, - [object] $commentObject + [object] $commentObject, + [string] $commentId ) { + $this.HideComments($commentId) + # build the message, which will be sent to github, users can use markdown $msg = [System.Text.StringBuilder]::new() @@ -376,7 +420,7 @@ class GitHubComments { $msg.AppendLine() # footer - $this.WriteCommentFooter($msg) + $this.WriteCommentFooter($msg, $commentId) return $this.NewComment($msg) } @@ -384,8 +428,11 @@ class GitHubComments { [object] NewCommentFromFile( [string] $commentTitle, [string] $commentEmoji, - [string] $filePath + [string] $filePath, + [string] $commentId ) { + $this.HideComments($commentId) + # build the message, which will be sent to github, users can use markdown $msg = [System.Text.StringBuilder]::new() @@ -404,7 +451,7 @@ class GitHubComments { $msg.AppendLine() # footer - $this.WriteCommentFooter($msg) + $this.WriteCommentFooter($msg, $commentId) return $this.NewComment($msg) } @@ -412,8 +459,11 @@ class GitHubComments { [object] NewCommentFromMessage( [string] $commentTitle, [string] $commentEmoji, - [string] $content + [string] $content, + [string] $commentId ) { + $this.HideComments($commentId) + $msg = [System.Text.StringBuilder]::new() # header @@ -424,7 +474,7 @@ class GitHubComments { $msg.AppendLine() # footer - $this.WriteCommentFooter($msg) + $this.WriteCommentFooter($msg, $commentId) return $this.NewComment($msg) } diff --git a/tools/devops/automation/scripts/clean_past_comments.ps1 b/tools/devops/automation/scripts/clean_past_comments.ps1 deleted file mode 100644 index c24e1be430ce..000000000000 --- a/tools/devops/automation/scripts/clean_past_comments.ps1 +++ /dev/null @@ -1,36 +0,0 @@ -param -( - - [Parameter(Mandatory)] - [String] - $GithubToken, - - [Parameter(Mandatory)] - [String] - $RepositoryUri, - - [Parameter(Mandatory)] - [String] - $SourceBranch, - - [Parameter(Mandatory)] - [String] - $CommentToHide -) - -Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY/xamarin-macios/tools/devops/automation/scripts/MaciosCI.psd1 - -$comments = New-GitHubCommentsObjectFromUrl -Url "$RepositoryUri" -Token $GithubToken - -$prId = "$SourceBranch".Replace("refs/pull/", "").Replace("/merge", "") -$prComments = $comments.GetCommentsForPR($prId) - -$botComments = [System.Collections.ArrayList]@() -foreach ($c in $prComments) { - if ($c.Author -eq "vs-mobiletools-engineering-service2") { - if ($c.Body.Contains($CommentToHide)) { - $botComments.Add($c) - } - } -} -$comments.MinimizeComments($botComments) diff --git a/tools/devops/automation/templates/api-diff-stage.yml b/tools/devops/automation/templates/api-diff-stage.yml index 081a1f58e172..3fb0a7a00cb9 100644 --- a/tools/devops/automation/templates/api-diff-stage.yml +++ b/tools/devops/automation/templates/api-diff-stage.yml @@ -33,18 +33,6 @@ parameters: stages: -- ${{ if parameters.isPR }}: - - stage: clean - displayName: 'Clean up' - dependsOn: [] - jobs: - - job: - displayName: 'Clean comments' - pool: - vmImage: windows-latest - steps: - - template: ./common/clean.yml - - stage: configure_build displayName: 'Configure' jobs: diff --git a/tools/devops/automation/templates/build/api-diff-process-results.yml b/tools/devops/automation/templates/build/api-diff-process-results.yml index a73bcb9e572f..c8b3bf3cc8bb 100644 --- a/tools/devops/automation/templates/build/api-diff-process-results.yml +++ b/tools/devops/automation/templates/build/api-diff-process-results.yml @@ -84,7 +84,7 @@ steps: $converted = $inputContents + "`n`nUnable to convert markdown: $_`n`n" } $githubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $Env:GITHUB_TOKEN -Hash $Env:COMMENT_HASH - $result = $githubComments.NewCommentFromMessage("", "", $converted) + $result = $githubComments.NewCommentFromMessage("", "", $converted, "api diff") displayName: 'Publish GitHub comment for change detection' timeoutInMinutes: 10 continueOnError: true # don't let any failures here stop us diff --git a/tools/devops/automation/templates/build/build.yml b/tools/devops/automation/templates/build/build.yml index 4b284dfb5805..a2648822460e 100644 --- a/tools/devops/automation/templates/build/build.yml +++ b/tools/devops/automation/templates/build/build.yml @@ -195,7 +195,7 @@ steps: - pwsh: | Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY\xamarin-macios\tools\devops\automation\scripts\MaciosCI.psd1 $githubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $(GitHub.Token) -Hash $Env:COMMENT_HASH - $githubComments.NewCommentFromMessage("Build failed", ":fire:", "Build failed for the job '$(System.JobDisplayName)'") + $githubComments.NewCommentFromMessage("Build failed", ":fire:", "Build failed for the job '$(System.JobDisplayName)'", "build") condition: failed() displayName: 'Report build failure' env: diff --git a/tools/devops/automation/templates/common/clean.yml b/tools/devops/automation/templates/common/clean.yml deleted file mode 100644 index ea5849595778..000000000000 --- a/tools/devops/automation/templates/common/clean.yml +++ /dev/null @@ -1,36 +0,0 @@ -# Perform gihub cleaning steps - -parameters: -- name: commentToHide - type: string - default: '[comment]: <> (This is a comment added by Azure DevOps)' - -- name: checkoutCode - type: boolean - default: true - -- name: repositoryAlias - type: string - default: self - -- name: commit - type: string - default: HEAD - -steps: - -- ${{ if parameters.checkoutCode }}: - - template: checkout.yml - parameters: - isPR: false # always use the latests version of the script - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - -- pwsh: >- - ./clean_past_comments.ps1 - -GithubToken "$(GitHub.Token)" - -RepositoryUri "$(Build.Repository.Uri)" - -SourceBranch "$(Build.SourceBranch)" - -CommentToHide "${{ parameters.commentToHide }}" - displayName: Clear past comments - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts diff --git a/tools/devops/automation/templates/mac/build.yml b/tools/devops/automation/templates/mac/build.yml index 00e08489a799..504c68d79372 100644 --- a/tools/devops/automation/templates/mac/build.yml +++ b/tools/devops/automation/templates/mac/build.yml @@ -213,10 +213,10 @@ steps: $githubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $(GitHub.Token) -Hash $Env:COMMENT_HASH if (Test-Path -Path "$Env:GITHUB_FAILURE_COMMENT_FILE" -PathType Leaf) { - $githubComments.NewCommentFromFile("Tests on macOS ${{ parameters.statusContext }} failed", ":x:", "$Env:GITHUB_FAILURE_COMMENT_FILE") + $githubComments.NewCommentFromFile("Tests on macOS ${{ parameters.statusContext }} failed", ":x:", "$Env:GITHUB_FAILURE_COMMENT_FILE", "macOS ${{ parameters.statusContext }}") } else { $message = ":white_check_mark: **All** tests on macOS ${{ parameters.statusContext }} passed." - $githubComments.NewCommentFromMessage("Tests on macOS ${{ parameters.statusContext }} passed", ":computer:", $message) + $githubComments.NewCommentFromMessage("Tests on macOS ${{ parameters.statusContext }} passed", ":computer:", $message, "macOS ${{ parameters.statusContext }}") } displayName: 'Report results to GitHub' timeoutInMinutes: 5 diff --git a/tools/devops/automation/templates/main-stage.yml b/tools/devops/automation/templates/main-stage.yml index 47009cd3be4d..fe218dcc51e9 100644 --- a/tools/devops/automation/templates/main-stage.yml +++ b/tools/devops/automation/templates/main-stage.yml @@ -202,21 +202,6 @@ stages: commit: ${{ parameters.commit }} stageDisplayNamePrefix: ${{ parameters.stageDisplayNamePrefix }} - - ${{ if parameters.isPR }}: - - stage: clean - displayName: '${{ parameters.stageDisplayNamePrefix }}Clean up' - dependsOn: [] - jobs: - - job: - displayName: 'Clean comments' - pool: - name: AzurePipelines-EO - demands: - - ImageOverride -equals 1ESPT-Windows2022 - - steps: - - template: ./common/clean.yml - - stage: configure_build displayName: '${{ parameters.stageDisplayNamePrefix }}Configure' dependsOn: ${{ parameters.dependsOn }} diff --git a/tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml b/tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml index ca16f53215e2..75a7a6ae8731 100644 --- a/tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml +++ b/tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml @@ -29,7 +29,7 @@ steps: Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY\xamarin-macios\tools\devops\automation\scripts\MaciosCI.psd1 $artifact = New-ArtifactsFromJsonFile -Path "$Env:ARTIFACTS_JSON_PATH" $gihubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $Env:GITHUB_TOKEN -Hash $Env:COMMENT_HASH - $result = $gihubComments.NewCommentFromObject("Artifacts", ":books:", $artifact) + $result = $gihubComments.NewCommentFromObject("Artifacts", ":books:", $artifact, "artifacts") Write-Host $result env: GITHUB_TOKEN: $(GitHub.Token) diff --git a/tools/devops/automation/templates/tests-stage.yml b/tools/devops/automation/templates/tests-stage.yml index e54a23ee9cd7..8916e575cf35 100644 --- a/tools/devops/automation/templates/tests-stage.yml +++ b/tools/devops/automation/templates/tests-stage.yml @@ -163,18 +163,6 @@ parameters: stages: -- ${{ if parameters.isPR }}: - - stage: clean - displayName: '${{ parameters.stageDisplayNamePrefix }}Clean up' - dependsOn: [] - jobs: - - job: - displayName: 'Clean comments' - pool: - vmImage: windows-latest - steps: - - template: ./common/clean.yml - - stage: configure_build displayName: '${{ parameters.stageDisplayNamePrefix }}Configure' dependsOn: ${{ parameters.dependsOn }} diff --git a/tools/devops/automation/templates/tests/publish-html.yml b/tools/devops/automation/templates/tests/publish-html.yml index 7b0926fad01b..79d44e48d23f 100644 --- a/tools/devops/automation/templates/tests/publish-html.yml +++ b/tools/devops/automation/templates/tests/publish-html.yml @@ -49,12 +49,6 @@ steps: - template: download-artifacts.yml -- ${{ if parameters.isPR }}: - - template: ../common/clean.yml - parameters: - commentToHide: '[comment]: <> (This is a test result report added by Azure DevOps)' - checkoutCode: false # we already execute the 'clean.yml' template elsewhere in this job, and running 'checkout' again is useless (it also leads to duplicate step names which Azure DevOps doesn't like). - - pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 displayName: 'Show Environment' @@ -83,7 +77,7 @@ steps: } $gihubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $Env:GITHUB_TOKEN -Hash $Env:COMMENT_HASH -Debug - $result = $gihubComments.NewCommentFromObject("Test results", $emoji, $parallelResults) + $result = $gihubComments.NewCommentFromObject("Test results", $emoji, $parallelResults, "test results") } catch { Write-Host "##vso[task.complete result=Failed;]Failed to compute test summaries: $_" New-GitHubComment -Header "Failed to compute test summaries on $Env:CONTEXT" -Emoji ":fire:" -Description "Failed to compute test summaries: $_." diff --git a/tools/devops/automation/templates/tests/publish-results.yml b/tools/devops/automation/templates/tests/publish-results.yml index 02729046d4a2..a02fa11d5911 100644 --- a/tools/devops/automation/templates/tests/publish-results.yml +++ b/tools/devops/automation/templates/tests/publish-results.yml @@ -119,7 +119,7 @@ stages: $githubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $Env:GITHUB_TOKEN -Hash $Env:COMMENT_HASH -Debug $sb = [System.Text.StringBuilder]::new() $sb.AppendLine("All tests have been skipped because the label 'skip-all-tests' was set.") - $result = $githubComments.NewCommentFromMessage("Test results", ":seedling:", $sb.ToString()) + $result = $githubComments.NewCommentFromMessage("Test results", ":seedling:", $sb.ToString(), "test results") displayName: 'Set comment' env: CONTEXT: ${{ parameters.statusContext }} diff --git a/tools/devops/automation/templates/windows/build.yml b/tools/devops/automation/templates/windows/build.yml index 6f83e39da959..c8c39389992f 100644 --- a/tools/devops/automation/templates/windows/build.yml +++ b/tools/devops/automation/templates/windows/build.yml @@ -342,13 +342,13 @@ steps: $githubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $(GitHub.Token) -Hash $Env:COMMENT_HASH if (Test-Path -Path "$Env:GITHUB_FAILURE_COMMENT_FILE" -PathType Leaf) { - $githubComments.NewCommentFromFile("${{ parameters.statusContext }} failed", ":x:", "$Env:GITHUB_FAILURE_COMMENT_FILE") + $githubComments.NewCommentFromFile("${{ parameters.statusContext }} failed", ":x:", "$Env:GITHUB_FAILURE_COMMENT_FILE", "windows tests") } elseif ("$($Env:AGENT_JOBSTATUS)" -ne "Succeeded") { $message = ":x: $($Env:AGENT_JOBSTATUS) :x:" - $githubComments.NewCommentFromMessage("${{ parameters.statusContext }} failed", ":x:", $message) + $githubComments.NewCommentFromMessage("${{ parameters.statusContext }} failed", ":x:", $message, "windows tests") } else { $message = ":white_check_mark: **All** ${{ parameters.statusContext }} passed." - $githubComments.NewCommentFromMessage("${{ parameters.statusContext }} passed", ":computer:", $message) + $githubComments.NewCommentFromMessage("${{ parameters.statusContext }} passed", ":computer:", $message, "windows tests") } displayName: 'Report results to GitHub' timeoutInMinutes: 5 From 00444d1507d3707f606c02f6644b40efc10f1583 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 16:20:23 +0200 Subject: [PATCH 016/155] [msbuild] Don't try to look for library resources to unpack from BCL assemblies. Fixes #19511. (#21305) We know BCL won't have library resources to unpack, so there's no need to spend any time looking at them. This also required porting the UnpackLibraryResources task to use System.Reflection.Metadata, because MetadataLoadContext requires the reference assemblies to be available to resolve assembly dependencies (and the idea is to not have to pass any reference assemblies to the task). Fixes https://github.com/xamarin/xamarin-macios/issues/19511. Fixes https://github.com/xamarin/xamarin-macios/issues/15030. --- .../Tasks/UnpackLibraryResources.cs | 153 +++++++++--------- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 6 +- 2 files changed, 78 insertions(+), 81 deletions(-) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs index 52c9b5357cd7..8c6d713e2e2a 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs @@ -2,6 +2,8 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Reflection.Metadata; +using System.Reflection.PortableExecutable; using System.Text; using System.Collections.Generic; @@ -15,7 +17,6 @@ namespace Xamarin.MacDev.Tasks { public class UnpackLibraryResources : XamarinTask, ITaskCallback, ICancelableTask { - MetadataLoadContext? universe; List unpackedResources = new List (); #region Inputs @@ -26,9 +27,6 @@ public class UnpackLibraryResources : XamarinTask, ITaskCallback, ICancelableTas [Required] public string IntermediateOutputPath { get; set; } = string.Empty; - [Required] - public ITaskItem [] ReferenceAssemblies { get; set; } = Array.Empty (); - [Required] public ITaskItem [] ReferencedLibraries { get; set; } = Array.Empty (); @@ -52,15 +50,6 @@ public class UnpackLibraryResources : XamarinTask, ITaskCallback, ICancelableTas #endregion public override bool Execute () - { - try { - return ExecuteImpl (); - } finally { - universe?.Dispose (); - } - } - - bool ExecuteImpl () { if (ShouldExecuteRemotely ()) { var result = new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result; @@ -87,7 +76,7 @@ bool ExecuteImpl () Log.LogMessage (MessageImportance.Low, MSBStrings.M0168, asm.ItemSpec); } else { var perAssemblyOutputPath = Path.Combine (IntermediateOutputPath, "unpack", asm.GetMetadata ("Filename")); - var extracted = ExtractContentAssembly (asm.ItemSpec, perAssemblyOutputPath).ToArray (); + var extracted = ExtractContentAssembly (asm.ItemSpec, perAssemblyOutputPath); results.AddRange (extracted); @@ -113,58 +102,88 @@ bool IsFrameworkAssembly (ITaskItem asm) return false; } - IEnumerable ExtractContentAssembly (string assembly, string intermediatePath) + List ExtractContentAssembly (string assembly, string intermediatePath) { + var rv = new List (); + if (!File.Exists (assembly)) { Log.LogMessage (MessageImportance.Low, $"Not inspecting assembly because it doesn't exist: {assembly}"); - yield break; + return rv; } - var asmWriteTime = File.GetLastWriteTimeUtc (assembly); - var manifestResources = GetAssemblyManifestResources (assembly).ToArray (); - if (!manifestResources.Any ()) - yield break; - - Log.LogMessage (MessageImportance.Low, $"Inspecting assembly with {manifestResources.Length} resources: {assembly}"); - foreach (var embedded in manifestResources) { - string rpath; - - if (embedded.Name.StartsWith ("__" + Prefix + "_content_", StringComparison.Ordinal)) { - var mangled = embedded.Name.Substring (("__" + Prefix + "_content_").Length); - rpath = UnmangleResource (mangled); - } else if (embedded.Name.StartsWith ("__" + Prefix + "_page_", StringComparison.Ordinal)) { - var mangled = embedded.Name.Substring (("__" + Prefix + "_page_").Length); - rpath = UnmangleResource (mangled); - } else { - continue; - } - - var path = Path.Combine (intermediatePath, rpath); - var file = new FileInfo (path); - - var item = new TaskItem (path); - item.SetMetadata ("LogicalName", rpath); - item.SetMetadata ("Optimize", "false"); - - if (file.Exists && file.LastWriteTimeUtc >= asmWriteTime) { - Log.LogMessage (" Up to date: {0}", rpath); - } else { - Log.LogMessage (" Unpacking: {0}", rpath); - - Directory.CreateDirectory (Path.GetDirectoryName (path)); + try { + var asmWriteTime = File.GetLastWriteTimeUtc (assembly); + using var peStream = File.OpenRead (assembly); + using var peReader = new PEReader (peStream); + var metadataReader = PEReaderExtensions.GetMetadataReader (peReader); + Log.LogMessage (MessageImportance.Low, $"Inspecting resources in assembly {assembly}"); + foreach (var manifestResourceHandle in metadataReader.ManifestResources) { + var manifestResource = metadataReader.GetManifestResource (manifestResourceHandle); + if (!manifestResource.Implementation.IsNil) + continue; // embedded resources have Implementation.IsNil = true, and those are the ones we care about + + var name = metadataReader.GetString (manifestResource.Name); + if (string.IsNullOrEmpty (name)) + continue; + + string rpath; + + if (name.StartsWith ("__" + Prefix + "_content_", StringComparison.Ordinal)) { + var mangled = name.Substring (("__" + Prefix + "_content_").Length); + rpath = UnmangleResource (mangled); + } else if (name.StartsWith ("__" + Prefix + "_page_", StringComparison.Ordinal)) { + var mangled = name.Substring (("__" + Prefix + "_page_").Length); + rpath = UnmangleResource (mangled); + } else { + continue; + } - using (var stream = File.Open (path, FileMode.Create)) { - using (var resource = embedded.Open ()) - resource.CopyTo (stream); + var path = Path.Combine (intermediatePath, rpath); + var file = new FileInfo (path); + + var item = new TaskItem (path); + item.SetMetadata ("LogicalName", rpath); + item.SetMetadata ("Optimize", "false"); + + if (file.Exists && file.LastWriteTimeUtc >= asmWriteTime) { + Log.LogMessage (" Up to date: {0}", rpath); + } else { + Log.LogMessage (" Unpacking: {0}", rpath); + + Directory.CreateDirectory (Path.GetDirectoryName (path)); + + var resourceDirectory = peReader.GetSectionData (peReader.PEHeaders.CorHeader!.ResourcesDirectory.RelativeVirtualAddress); + var reader = resourceDirectory.GetReader ((int) manifestResource.Offset, resourceDirectory.Length - (int) manifestResource.Offset); + var length = reader.ReadUInt32 (); + if (length > reader.RemainingBytes) + throw new BadImageFormatException (); +#if NET + using var fs = new FileStream (path, FileMode.Create, FileAccess.Write, FileShare.Read); + unsafe { + var span = new ReadOnlySpan (reader.CurrentPointer, (int) length); + fs.Write (span); + } +#else + var buffer = new byte [4096]; + using var fs = new FileStream (path, FileMode.Create, FileAccess.Write, FileShare.Read, buffer.Length); + var left = (int) length; + while (left > 0) { + var read = Math.Min (left, buffer.Length); + reader.ReadBytes (read, buffer, 0); + fs.Write (buffer, 0, read); + left -= read; + } +#endif + unpackedResources.Add (item); } - unpackedResources.Add (item); + rv.Add (item); } - - yield return item; + } catch (Exception e) { + Log.LogMessage (MessageImportance.Low, $"Unable to load the resources from the assembly '{assembly}': {e}"); + return new List (); } - - yield break; + return rv; } static string UnmangleResource (string mangled) @@ -237,27 +256,5 @@ public bool ShouldCopyToBuildServer (ITaskItem item) public IEnumerable GetAdditionalItemsToBeCopied () => ItemsFiles; - IEnumerable GetAssemblyManifestResources (string fileName) - { - if (universe is null) - universe = new MetadataLoadContext (new PathAssemblyResolver (ReferenceAssemblies.Select (v => v.ItemSpec))); - - Assembly assembly; - try { - assembly = universe.LoadFromAssemblyPath (fileName); - } catch (Exception e) { - Log.LogMessage (MessageImportance.Low, $"Unable to load the assembly '{fileName}: {e}"); - yield break; - } - - foreach (var resourceName in assembly.GetManifestResourceNames ()) { - if (string.IsNullOrEmpty (resourceName)) - continue; - var info = assembly.GetManifestResourceInfo (resourceName); - if (!info.ResourceLocation.HasFlag (ResourceLocation.Embedded)) - continue; - yield return new ManifestResource (resourceName, () => assembly.GetManifestResourceStream (resourceName)); - } - } } } diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index 22556e3f38f0..b9e1388c9667 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -1933,7 +1933,9 @@ Copyright (C) 2018 Microsoft. All rights reserved. <_StampDirectory>$(DeviceSpecificIntermediateOutputPath)resourcestamps\ - <_UnpackLibraryResourceItems Include="@(ReferencePath);@(ReferenceDependencyPaths)"> + <_UnpackLibraryResourceItems Include="@(ReferencePath)" Condition="'%(ReferencePath.FrameworkReferenceName)' != 'Microsoft.NETCore.App' And '%(ReferencePath.FrameworkReferenceName)' != 'Microsoft.$(_PlatformName)'" /> + <_UnpackLibraryResourceItems Include="@(ReferenceDependencyPaths)" Condition="'%(ReferenceDependencyPaths.FrameworkReferenceName)' != 'Microsoft.NETCore.App' And '%(ReferenceDependencyPaths.FrameworkReferenceName)' != 'Microsoft.$(_PlatformName)'" /> + <_UnpackLibraryResourceItems> $(_StampDirectory)%(FileName).stamp $(_StampDirectory)%(FileName).items @@ -1982,14 +1984,12 @@ Copyright (C) 2018 Microsoft. All rights reserved. - From 15c1e7527e8d621760b9fe2c6b1ce2382dcab2f7 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 1 Oct 2024 17:54:27 +0200 Subject: [PATCH 017/155] [msbuild/tests] Use 'dotnet test' for the MSBuild tests. (#21263) This is another step towards removing Mono. This required a few changes: * Nullability updates in test code. * Explicitly sorted list of strings in a warning message, to make the warning text stable. * Stopped merging system assemblies in the merged tasks assembly. This was necessary for to solve a problem with duplicate types: * The netstandard2.0 version of `System.Reflection.Metadata.dll` contains the `UnconditionalSuppressMessageAttribute` type (internally). * Since we ILMerge the tasks assembly, this type ends up in Xamarin.iOS.Tasks.dll (internally). * The test assembly can't be a net472 assembly, because that means using the netfx/desktop versions of the Microsoft.Build.* assemblies, which don't work on .NET (they check for Mono, but .NET isn't Mono, so the check fails and a PlatformNotSupportedException is thrown). * So I bumped the test assembly to be a net8.0 assembly, but then there's a conflict between the `UnconditionalSuppressMessageAttribute` shipped in .NET vs the one in `Xamarin.iOS.Tasks.dll` (because the test assembly can see the internals of `Xamarin.iOS.Tasks.dll`). * The fix that seems to work is to *not* merge system assemblies in the `Xamarin.iOS.Tasks.dll` assembly. `Xamarin.iOS.Tasks.Windows.dll` already does this, so hopefully there are no problems on Windows, and on macOS our tests doesn't reveal any problems. --- msbuild/ILMerge.targets | 2 +- .../Tasks/ComputeCodesignItems.cs | 2 +- tests/Makefile | 12 +++++--- .../TaskTests/CompileAppManifestTaskTests.cs | 4 +-- .../TaskTests/CompileEntitlementsTaskTests.cs | 4 +-- .../ComputeCodesignItemsTaskTests.cs | 8 +++--- .../ResolveNativeReferencesTaskTest.cs | 4 +-- .../Xamarin.MacDev.Tasks.Tests.csproj | 14 +++++----- .../TestHelpers/BuildEngine.cs | 2 +- .../Xamarin.MacDev.Tests.csproj | 6 ++-- .../Jenkins/NUnitTestTasksEnumerable.cs | 28 ++++++++----------- 11 files changed, 42 insertions(+), 44 deletions(-) diff --git a/msbuild/ILMerge.targets b/msbuild/ILMerge.targets index 35ff9af16f5b..a0885f68751b 100644 --- a/msbuild/ILMerge.targets +++ b/msbuild/ILMerge.targets @@ -2,7 +2,7 @@ true - true + false diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs index 085e9f067b25..c001208bcb51 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs @@ -161,7 +161,7 @@ public override bool Execute () for (var i = 1; i < all.Length; i++) { var nextMetadata = all [i].CloneCustomMetadataToDictionary (); if (nextMetadata.Count != firstMetadata.Count) { - Log.LogWarning (MSBStrings.W7095, /* Code signing has been requested multiple times for '{0}', with different metadata. The metadata for one are: '{1}', while the metadata for the other are: '{2}' */ group.Key, string.Join (", ", firstMetadata.Keys), string.Join (", ", nextMetadata.Keys)); + Log.LogWarning (MSBStrings.W7095, /* Code signing has been requested multiple times for '{0}', with different metadata. The metadata for one are: '{1}', while the metadata for the other are: '{2}' */ group.Key, string.Join (", ", firstMetadata.Keys.OrderBy (v => v)), string.Join (", ", nextMetadata.Keys.OrderBy (v => v))); } else { foreach (var kvp in firstMetadata) { if (!nextMetadata.TryGetValue (kvp.Key, out var nextValue)) { diff --git a/tests/Makefile b/tests/Makefile index 917286623b74..1e0462c77aa9 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -217,15 +217,19 @@ killall: NUNIT_MSBUILD_DIR=$(TOP)/packages/NUnit.Runners.2.6.4/tools/lib test-ios-tasks: test-macdev-tests test-macdev-tasks +# Example TEST_FILTER: +# TEST_FILTER="--filter FullyQualifiedName~BuildMyCocoaApp" +# Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tests: export MSBUILD_EXE_PATH= test-macdev-tests: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) build "/bl:$@.binlog" $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj /p:Configuration=Debug $(DOTNET_BUILD_VERBOSITY) - cd $(TOP)/tests/msbuild/Xamarin.MacDev.Tests && $(SYSTEM_XIBUILD) -t -- $(abspath $(TOP)/tools/nunit3-console-3.11.1) $(abspath $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/bin/Debug/net472/Xamarin.MacDev.Tests.dll) "--result=$(abspath $(CURDIR)/TestResults_Xamarin.MacDev.Tests.xml);format=nunit2" -labels=After $(TEST_FIXTURE) + $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj $(TEST_FILTER) +# Example TEST_FILTER: +# TEST_FILTER="--filter FullyQualifiedName~BuildMyCocoaApp" +# Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tasks: export MSBUILD_EXE_PATH= test-macdev-tasks: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) build "/bl:$@.binlog" $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj /p:Configuration=Debug $(DOTNET_BUILD_VERBOSITY) - cd $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests && $(SYSTEM_XIBUILD) -t -- $(abspath $(TOP)/tools/nunit3-console-3.11.1) $(abspath $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/bin/Debug/net472/Xamarin.MacDev.Tasks.Tests.dll) "--result=$(abspath $(CURDIR)/TestResults_Xamarin.MacDev.Tasks.Tests.xml)" -labels=After $(TEST_FIXTURE) + $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj $(TEST_FILTER) mac-test-package.zip: ifdef INCLUDE_MAC diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs index 94463d1d8ab1..00c3fa08f935 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs @@ -21,8 +21,8 @@ CompileAppManifest CreateTask (string? tmpdir = null, ApplePlatform platform = A task.AssemblyName = "AssemblyName"; task.AppBundleName = "AppBundleName"; task.CompiledAppManifest = new TaskItem (Path.Combine (tmpdir, "TemporaryAppManifest.plist")); - task.DefaultSdkVersion = Sdks.GetAppleSdk (platform).GetInstalledSdkVersions (false).First ().ToString (); - task.SdkVersion = task.DefaultSdkVersion; + task.DefaultSdkVersion = Sdks.GetAppleSdk (platform).GetInstalledSdkVersions (false).First ().ToString ()!; + task.SdkVersion = task.DefaultSdkVersion ?? string.Empty; task.TargetFrameworkMoniker = TargetFramework.GetTargetFramework (platform, true).ToString (); return task; diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs index 00c90fc9d9a1..17186c306f29 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs @@ -34,8 +34,8 @@ CustomCompileEntitlements CreateEntitlementsTask (out string compiledEntitlement task.AppBundleDir = AppBundlePath; task.BundleIdentifier = "com.xamarin.MySingleView"; task.CompiledEntitlements = new TaskItem (Path.Combine (MonoTouchProjectObjPath, "Entitlements.xcent")); - task.Entitlements = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "Entitlements.plist"); - task.ProvisioningProfile = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "profile.mobileprovision"); + task.Entitlements = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "Entitlements.plist"); + task.ProvisioningProfile = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "profile.mobileprovision"); task.SdkPlatform = "iPhoneOS"; task.SdkVersion = "6.1"; task.TargetFrameworkMoniker = "Xamarin.iOS,v1.0"; diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs index 9255a818a2fc..d72eecdb893b 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs @@ -496,7 +496,7 @@ public void DuplicatedWithDifferentMetadata (ApplePlatform platform, bool isDotN Assert.AreEqual (3, Engine.Logger.WarningsEvents.Count, "Warning Count"); Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata 'OnlyIn1=true' has been set for one item, but not the other.", Engine.Logger.WarningsEvents [0].Message, "Message #0"); Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata 'InOneAndTwoWithDifferentValues' has different values for each item (once it's '1', another time it's '2').", Engine.Logger.WarningsEvents [1].Message, "Message #1"); - Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata for one are: 'RequireCodeSigning, OnlyIn1, InOneAndTwoWithDifferentValues, CodesignStampFile', while the metadata for the other are: 'RequireCodeSigning, CodesignStampFile'", Engine.Logger.WarningsEvents [2].Message, "Message #2"); + Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata for one are: 'CodesignStampFile, InOneAndTwoWithDifferentValues, OnlyIn1, RequireCodeSigning', while the metadata for the other are: 'CodesignStampFile, RequireCodeSigning'", Engine.Logger.WarningsEvents [2].Message, "Message #2"); VerifyCodesigningResults (infos, task.OutputCodesignItems, platform); } finally { @@ -532,7 +532,7 @@ void VerifyCodesigningResults (CodesignInfo [] infos, ITaskItem [] outputCodesig var metadata = item.GetMetadata (kvp.Key); if (metadata == string.Empty && kvp.Value != string.Empty) { failures.Add ($"Item '{info.ItemSpec}': Expected metadata '{kvp.Key}' not found (with value '{kvp.Value}')."); - } else if (!string.Equals (metadata, kvp.Value)) { + } else if (!string.Equals (metadata, kvp.Value, StringComparison.Ordinal)) { failures.Add ($"Item '{info.ItemSpec}': Expected value '{kvp.Value}' for metadata '{kvp.Key}', but got '{metadata}' instead.\nExpected: {kvp.Value}\nActual: {metadata}"); } } @@ -587,7 +587,7 @@ void Touch (string root, params string [] files) if (file.EndsWith (".appex", StringComparison.OrdinalIgnoreCase) || file.EndsWith (".app", StringComparison.OrdinalIgnoreCase)) { Directory.CreateDirectory (f); } else { - Directory.CreateDirectory (Path.GetDirectoryName (file)); + Directory.CreateDirectory (Path.GetDirectoryName (file)!); File.WriteAllText (file, string.Empty); } } @@ -637,7 +637,7 @@ public static Dictionary CopyCustomMetadata (this ITaskItem self { var rv = new Dictionary (); foreach (DictionaryEntry de in self.CloneCustomMetadata ()) { - rv [(string) de.Key] = (string) de.Value; + rv [(string) de.Key!] = (string) de.Value!; } return rv; } diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs index 838d1be627ce..148849779358 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs @@ -38,7 +38,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a // some architecture changes recently, e.g. // in Xcode 12.1+ watchOS does not have an i386 architecture anymore // on Xcode 12.2+ you get arm64 for all (iOS, tvOS and watchOS) simulators - var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-xcode12.2.plist"); + var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-xcode12.2.plist"); var plist = PDictionary.FromFile (path)!; var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); @@ -51,7 +51,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a [TestCase (TargetFramework.Xamarin_WatchOS_1_0_String, true, "i386", "watchos-i386-simulator/XTest.framework/XTest")] public void PreXcode12 (string targetFrameworkMoniker, bool isSimulator, string architecture, string expected) { - var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-prexcode12.plist"); + var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-prexcode12.plist"); var plist = PDictionary.FromFile (path)!; var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj index 126d96deee76..a01b20140e75 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj @@ -1,7 +1,7 @@ - net472 + net$(BundledNETCoreAppTargetFrameworkVersion) false true latest @@ -32,12 +32,12 @@ - - - - - - + + + + + + diff --git a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs index 59b130f99d1d..8043c1875436 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs +++ b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs @@ -246,7 +246,7 @@ static ExecutionResult MSBuild (ApplePlatform platform, string project, string t foreach (var prop in properties) args.Add ($"/p:{prop.Key}={prop.Value}"); } - var binlog = Path.Combine (Path.GetDirectoryName (project), $"log-{target}-{DateTime.Now:yyyyMMdd_HHmmss}.binlog"); + var binlog = Path.Combine (Path.GetDirectoryName (project)!, $"log-{target}-{DateTime.Now:yyyyMMdd_HHmmss}.binlog"); args.Add ($"/bl:{binlog}"); var output = new StringBuilder (); diff --git a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj index 87ff4869076f..771e95f8bcb2 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj @@ -1,7 +1,7 @@ - net472 + net$(BundledNETCoreAppTargetFrameworkVersion) false true latest @@ -11,8 +11,8 @@ - - + + diff --git a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs index 8b807022b6ac..bc991bce25c2 100644 --- a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs +++ b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs @@ -19,27 +19,24 @@ public NUnitTestTasksEnumerable (Jenkins jenkins, IMlaunchProcessManager process public IEnumerator GetEnumerator () { - var netstandard2Project = new TestProject (TestLabel.Msbuild, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "Xamarin.MacDev.Tasks.Tests.csproj"))) { + var msbuildTasksTestsProject = new TestProject (TestLabel.Msbuild, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "Xamarin.MacDev.Tasks.Tests.csproj"))) { IsDotNetProject = true, }; var env = new Dictionary { { "SYSTEM_MONO", this.jenkins.Harness.SYSTEM_MONO }, }; - var buildiOSMSBuild = new MSBuildTask (jenkins: jenkins, testProject: netstandard2Project, processManager: processManager) { + var buildiOSMSBuild = new MSBuildTask (jenkins: jenkins, testProject: msbuildTasksTestsProject, processManager: processManager) { SpecifyPlatform = false, - SpecifyConfiguration = true, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, - SolutionPath = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "..", "msbuild", "Xamarin.MacDev.Tasks.sln")), + Platform = TestPlatform.All, + Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Msbuild), SupportsParallelExecution = false, - Environment = env, }; - var nunitExecutioniOSMSBuild = new NUnitExecuteTask (jenkins, buildiOSMSBuild, processManager) { - TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "bin", "Debug", "net472", "Xamarin.MacDev.Tasks.Tests.dll"), - TestProject = netstandard2Project, + var nunitExecutioniOSMSBuild = new DotNetTestTask (jenkins, buildiOSMSBuild, processManager) { + TestProject = msbuildTasksTestsProject, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, + Platform = TestPlatform.All, TestName = "MSBuild tests", Mode = "Tasks", Timeout = TimeSpan.FromMinutes (60), @@ -53,18 +50,15 @@ public IEnumerator GetEnumerator () }; var buildiOSMSBuildIntegration = new MSBuildTask (jenkins: jenkins, testProject: msbuildIntegrationTestsProject, processManager: processManager) { SpecifyPlatform = false, - SpecifyConfiguration = true, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, - SolutionPath = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "..", "msbuild", "Xamarin.MacDev.Tasks.sln")), + Platform = TestPlatform.All, + Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Msbuild), SupportsParallelExecution = false, - Environment = env, }; - var nunitExecutioniOSMSBuildIntegration = new NUnitExecuteTask (jenkins, buildiOSMSBuildIntegration, processManager) { - TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tests", "bin", "Debug", "net472", "Xamarin.MacDev.Tests.dll"), + var nunitExecutioniOSMSBuildIntegration = new DotNetTestTask (jenkins, buildiOSMSBuildIntegration, processManager) { TestProject = msbuildIntegrationTestsProject, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, + Platform = TestPlatform.All, TestName = "MSBuild tests", Mode = "Integration", Timeout = TimeSpan.FromMinutes (120), From 5a0d412c87de5e55e00303ca6fd99d63341c8cf9 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Tue, 1 Oct 2024 15:42:37 -0400 Subject: [PATCH 018/155] [CI] Use the full path for triggering resources. (#21338) VSTS recommends this in their docs. We are going to do it to make it simpler to track what triggers what. --- tools/devops/automation/run-post-ci-build-macos-tests.yml | 2 +- tools/devops/automation/run-post-ci-build-tests.yml | 3 +-- tools/devops/automation/run-post-pr-build-macos-tests.yml | 2 +- tools/devops/automation/run-post-pr-build-tests.yml | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tools/devops/automation/run-post-ci-build-macos-tests.yml b/tools/devops/automation/run-post-ci-build-macos-tests.yml index bbdb367de5d7..da312f9e6997 100644 --- a/tools/devops/automation/run-post-ci-build-macos-tests.yml +++ b/tools/devops/automation/run-post-ci-build-macos-tests.yml @@ -9,7 +9,7 @@ pr: none resources: pipelines: - pipeline: macios - source: xamarin-macios-ci + source: \Xamarin\Mac-iOS\ci pipelines\xamarin-macios-ci trigger: stages: - build_macos_tests diff --git a/tools/devops/automation/run-post-ci-build-tests.yml b/tools/devops/automation/run-post-ci-build-tests.yml index 5ffbfa0917f6..af8677d8b4e6 100644 --- a/tools/devops/automation/run-post-ci-build-tests.yml +++ b/tools/devops/automation/run-post-ci-build-tests.yml @@ -4,12 +4,11 @@ trigger: none pr: none - # we cannot use a template in a pipeline context resources: pipelines: - pipeline: macios - source: xamarin-macios-ci + source: \Xamarin\Mac-iOS\ci pipelines\xamarin-macios-ci trigger: stages: - build_packages diff --git a/tools/devops/automation/run-post-pr-build-macos-tests.yml b/tools/devops/automation/run-post-pr-build-macos-tests.yml index e324fe5d8b3e..fdda5ca9e088 100644 --- a/tools/devops/automation/run-post-pr-build-macos-tests.yml +++ b/tools/devops/automation/run-post-pr-build-macos-tests.yml @@ -8,7 +8,7 @@ pr: none resources: pipelines: - pipeline: macios - source: xamarin-macios-pr + source: \Xamarin\Mac-iOS\pr pipelines\xamarin-macios-pr trigger: stages: - build_macos_tests diff --git a/tools/devops/automation/run-post-pr-build-tests.yml b/tools/devops/automation/run-post-pr-build-tests.yml index 45a676699994..16bdd59d45bd 100644 --- a/tools/devops/automation/run-post-pr-build-tests.yml +++ b/tools/devops/automation/run-post-pr-build-tests.yml @@ -8,7 +8,7 @@ pr: none resources: pipelines: - pipeline: macios - source: xamarin-macios-pr + source: \Xamarin\Mac-iOS\pr pipelines\xamarin-macios-pr trigger: stages: - build_packages From abcec04b752f26a130498db289d4d67a6c2b8f97 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 2 Oct 2024 19:51:31 +0200 Subject: [PATCH 019/155] Revert "[msbuild/tests] Use 'dotnet test' for the MSBuild tests. (#21263)" (#21356) This reverts commit 15c1e7527e8d621760b9fe2c6b1ce2382dcab2f7. It breaks the Windows tests. --- msbuild/ILMerge.targets | 2 +- .../Tasks/ComputeCodesignItems.cs | 2 +- tests/Makefile | 12 +++----- .../TaskTests/CompileAppManifestTaskTests.cs | 4 +-- .../TaskTests/CompileEntitlementsTaskTests.cs | 4 +-- .../ComputeCodesignItemsTaskTests.cs | 8 +++--- .../ResolveNativeReferencesTaskTest.cs | 4 +-- .../Xamarin.MacDev.Tasks.Tests.csproj | 14 +++++----- .../TestHelpers/BuildEngine.cs | 2 +- .../Xamarin.MacDev.Tests.csproj | 6 ++-- .../Jenkins/NUnitTestTasksEnumerable.cs | 28 +++++++++++-------- 11 files changed, 44 insertions(+), 42 deletions(-) diff --git a/msbuild/ILMerge.targets b/msbuild/ILMerge.targets index a0885f68751b..35ff9af16f5b 100644 --- a/msbuild/ILMerge.targets +++ b/msbuild/ILMerge.targets @@ -2,7 +2,7 @@ true - false + true diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs index c001208bcb51..085e9f067b25 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs @@ -161,7 +161,7 @@ public override bool Execute () for (var i = 1; i < all.Length; i++) { var nextMetadata = all [i].CloneCustomMetadataToDictionary (); if (nextMetadata.Count != firstMetadata.Count) { - Log.LogWarning (MSBStrings.W7095, /* Code signing has been requested multiple times for '{0}', with different metadata. The metadata for one are: '{1}', while the metadata for the other are: '{2}' */ group.Key, string.Join (", ", firstMetadata.Keys.OrderBy (v => v)), string.Join (", ", nextMetadata.Keys.OrderBy (v => v))); + Log.LogWarning (MSBStrings.W7095, /* Code signing has been requested multiple times for '{0}', with different metadata. The metadata for one are: '{1}', while the metadata for the other are: '{2}' */ group.Key, string.Join (", ", firstMetadata.Keys), string.Join (", ", nextMetadata.Keys)); } else { foreach (var kvp in firstMetadata) { if (!nextMetadata.TryGetValue (kvp.Key, out var nextValue)) { diff --git a/tests/Makefile b/tests/Makefile index 1e0462c77aa9..917286623b74 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -217,19 +217,15 @@ killall: NUNIT_MSBUILD_DIR=$(TOP)/packages/NUnit.Runners.2.6.4/tools/lib test-ios-tasks: test-macdev-tests test-macdev-tasks -# Example TEST_FILTER: -# TEST_FILTER="--filter FullyQualifiedName~BuildMyCocoaApp" -# Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tests: export MSBUILD_EXE_PATH= test-macdev-tests: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj $(TEST_FILTER) + $(Q) $(DOTNET) build "/bl:$@.binlog" $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj /p:Configuration=Debug $(DOTNET_BUILD_VERBOSITY) + cd $(TOP)/tests/msbuild/Xamarin.MacDev.Tests && $(SYSTEM_XIBUILD) -t -- $(abspath $(TOP)/tools/nunit3-console-3.11.1) $(abspath $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/bin/Debug/net472/Xamarin.MacDev.Tests.dll) "--result=$(abspath $(CURDIR)/TestResults_Xamarin.MacDev.Tests.xml);format=nunit2" -labels=After $(TEST_FIXTURE) -# Example TEST_FILTER: -# TEST_FILTER="--filter FullyQualifiedName~BuildMyCocoaApp" -# Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tasks: export MSBUILD_EXE_PATH= test-macdev-tasks: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj $(TEST_FILTER) + $(Q) $(DOTNET) build "/bl:$@.binlog" $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj /p:Configuration=Debug $(DOTNET_BUILD_VERBOSITY) + cd $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests && $(SYSTEM_XIBUILD) -t -- $(abspath $(TOP)/tools/nunit3-console-3.11.1) $(abspath $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/bin/Debug/net472/Xamarin.MacDev.Tasks.Tests.dll) "--result=$(abspath $(CURDIR)/TestResults_Xamarin.MacDev.Tasks.Tests.xml)" -labels=After $(TEST_FIXTURE) mac-test-package.zip: ifdef INCLUDE_MAC diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs index 00c3fa08f935..94463d1d8ab1 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs @@ -21,8 +21,8 @@ CompileAppManifest CreateTask (string? tmpdir = null, ApplePlatform platform = A task.AssemblyName = "AssemblyName"; task.AppBundleName = "AppBundleName"; task.CompiledAppManifest = new TaskItem (Path.Combine (tmpdir, "TemporaryAppManifest.plist")); - task.DefaultSdkVersion = Sdks.GetAppleSdk (platform).GetInstalledSdkVersions (false).First ().ToString ()!; - task.SdkVersion = task.DefaultSdkVersion ?? string.Empty; + task.DefaultSdkVersion = Sdks.GetAppleSdk (platform).GetInstalledSdkVersions (false).First ().ToString (); + task.SdkVersion = task.DefaultSdkVersion; task.TargetFrameworkMoniker = TargetFramework.GetTargetFramework (platform, true).ToString (); return task; diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs index 17186c306f29..00c90fc9d9a1 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs @@ -34,8 +34,8 @@ CustomCompileEntitlements CreateEntitlementsTask (out string compiledEntitlement task.AppBundleDir = AppBundlePath; task.BundleIdentifier = "com.xamarin.MySingleView"; task.CompiledEntitlements = new TaskItem (Path.Combine (MonoTouchProjectObjPath, "Entitlements.xcent")); - task.Entitlements = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "Entitlements.plist"); - task.ProvisioningProfile = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "profile.mobileprovision"); + task.Entitlements = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "Entitlements.plist"); + task.ProvisioningProfile = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "profile.mobileprovision"); task.SdkPlatform = "iPhoneOS"; task.SdkVersion = "6.1"; task.TargetFrameworkMoniker = "Xamarin.iOS,v1.0"; diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs index d72eecdb893b..9255a818a2fc 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs @@ -496,7 +496,7 @@ public void DuplicatedWithDifferentMetadata (ApplePlatform platform, bool isDotN Assert.AreEqual (3, Engine.Logger.WarningsEvents.Count, "Warning Count"); Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata 'OnlyIn1=true' has been set for one item, but not the other.", Engine.Logger.WarningsEvents [0].Message, "Message #0"); Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata 'InOneAndTwoWithDifferentValues' has different values for each item (once it's '1', another time it's '2').", Engine.Logger.WarningsEvents [1].Message, "Message #1"); - Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata for one are: 'CodesignStampFile, InOneAndTwoWithDifferentValues, OnlyIn1, RequireCodeSigning', while the metadata for the other are: 'CodesignStampFile, RequireCodeSigning'", Engine.Logger.WarningsEvents [2].Message, "Message #2"); + Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata for one are: 'RequireCodeSigning, OnlyIn1, InOneAndTwoWithDifferentValues, CodesignStampFile', while the metadata for the other are: 'RequireCodeSigning, CodesignStampFile'", Engine.Logger.WarningsEvents [2].Message, "Message #2"); VerifyCodesigningResults (infos, task.OutputCodesignItems, platform); } finally { @@ -532,7 +532,7 @@ void VerifyCodesigningResults (CodesignInfo [] infos, ITaskItem [] outputCodesig var metadata = item.GetMetadata (kvp.Key); if (metadata == string.Empty && kvp.Value != string.Empty) { failures.Add ($"Item '{info.ItemSpec}': Expected metadata '{kvp.Key}' not found (with value '{kvp.Value}')."); - } else if (!string.Equals (metadata, kvp.Value, StringComparison.Ordinal)) { + } else if (!string.Equals (metadata, kvp.Value)) { failures.Add ($"Item '{info.ItemSpec}': Expected value '{kvp.Value}' for metadata '{kvp.Key}', but got '{metadata}' instead.\nExpected: {kvp.Value}\nActual: {metadata}"); } } @@ -587,7 +587,7 @@ void Touch (string root, params string [] files) if (file.EndsWith (".appex", StringComparison.OrdinalIgnoreCase) || file.EndsWith (".app", StringComparison.OrdinalIgnoreCase)) { Directory.CreateDirectory (f); } else { - Directory.CreateDirectory (Path.GetDirectoryName (file)!); + Directory.CreateDirectory (Path.GetDirectoryName (file)); File.WriteAllText (file, string.Empty); } } @@ -637,7 +637,7 @@ public static Dictionary CopyCustomMetadata (this ITaskItem self { var rv = new Dictionary (); foreach (DictionaryEntry de in self.CloneCustomMetadata ()) { - rv [(string) de.Key!] = (string) de.Value!; + rv [(string) de.Key] = (string) de.Value; } return rv; } diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs index 148849779358..838d1be627ce 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs @@ -38,7 +38,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a // some architecture changes recently, e.g. // in Xcode 12.1+ watchOS does not have an i386 architecture anymore // on Xcode 12.2+ you get arm64 for all (iOS, tvOS and watchOS) simulators - var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-xcode12.2.plist"); + var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-xcode12.2.plist"); var plist = PDictionary.FromFile (path)!; var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); @@ -51,7 +51,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a [TestCase (TargetFramework.Xamarin_WatchOS_1_0_String, true, "i386", "watchos-i386-simulator/XTest.framework/XTest")] public void PreXcode12 (string targetFrameworkMoniker, bool isSimulator, string architecture, string expected) { - var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-prexcode12.plist"); + var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-prexcode12.plist"); var plist = PDictionary.FromFile (path)!; var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj index a01b20140e75..126d96deee76 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj @@ -1,7 +1,7 @@ - net$(BundledNETCoreAppTargetFrameworkVersion) + net472 false true latest @@ -32,12 +32,12 @@ - - - - - - + + + + + + diff --git a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs index 8043c1875436..59b130f99d1d 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs +++ b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs @@ -246,7 +246,7 @@ static ExecutionResult MSBuild (ApplePlatform platform, string project, string t foreach (var prop in properties) args.Add ($"/p:{prop.Key}={prop.Value}"); } - var binlog = Path.Combine (Path.GetDirectoryName (project)!, $"log-{target}-{DateTime.Now:yyyyMMdd_HHmmss}.binlog"); + var binlog = Path.Combine (Path.GetDirectoryName (project), $"log-{target}-{DateTime.Now:yyyyMMdd_HHmmss}.binlog"); args.Add ($"/bl:{binlog}"); var output = new StringBuilder (); diff --git a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj index 771e95f8bcb2..87ff4869076f 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj @@ -1,7 +1,7 @@ - net$(BundledNETCoreAppTargetFrameworkVersion) + net472 false true latest @@ -11,8 +11,8 @@ - - + + diff --git a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs index bc991bce25c2..8b807022b6ac 100644 --- a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs +++ b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs @@ -19,24 +19,27 @@ public NUnitTestTasksEnumerable (Jenkins jenkins, IMlaunchProcessManager process public IEnumerator GetEnumerator () { - var msbuildTasksTestsProject = new TestProject (TestLabel.Msbuild, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "Xamarin.MacDev.Tasks.Tests.csproj"))) { + var netstandard2Project = new TestProject (TestLabel.Msbuild, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "Xamarin.MacDev.Tasks.Tests.csproj"))) { IsDotNetProject = true, }; var env = new Dictionary { { "SYSTEM_MONO", this.jenkins.Harness.SYSTEM_MONO }, }; - var buildiOSMSBuild = new MSBuildTask (jenkins: jenkins, testProject: msbuildTasksTestsProject, processManager: processManager) { + var buildiOSMSBuild = new MSBuildTask (jenkins: jenkins, testProject: netstandard2Project, processManager: processManager) { SpecifyPlatform = false, + SpecifyConfiguration = true, ProjectConfiguration = "Debug", - Platform = TestPlatform.All, - Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Msbuild), + Platform = TestPlatform.iOS, + SolutionPath = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "..", "msbuild", "Xamarin.MacDev.Tasks.sln")), SupportsParallelExecution = false, + Environment = env, }; - var nunitExecutioniOSMSBuild = new DotNetTestTask (jenkins, buildiOSMSBuild, processManager) { - TestProject = msbuildTasksTestsProject, + var nunitExecutioniOSMSBuild = new NUnitExecuteTask (jenkins, buildiOSMSBuild, processManager) { + TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "bin", "Debug", "net472", "Xamarin.MacDev.Tasks.Tests.dll"), + TestProject = netstandard2Project, ProjectConfiguration = "Debug", - Platform = TestPlatform.All, + Platform = TestPlatform.iOS, TestName = "MSBuild tests", Mode = "Tasks", Timeout = TimeSpan.FromMinutes (60), @@ -50,15 +53,18 @@ public IEnumerator GetEnumerator () }; var buildiOSMSBuildIntegration = new MSBuildTask (jenkins: jenkins, testProject: msbuildIntegrationTestsProject, processManager: processManager) { SpecifyPlatform = false, + SpecifyConfiguration = true, ProjectConfiguration = "Debug", - Platform = TestPlatform.All, - Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Msbuild), + Platform = TestPlatform.iOS, + SolutionPath = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "..", "msbuild", "Xamarin.MacDev.Tasks.sln")), SupportsParallelExecution = false, + Environment = env, }; - var nunitExecutioniOSMSBuildIntegration = new DotNetTestTask (jenkins, buildiOSMSBuildIntegration, processManager) { + var nunitExecutioniOSMSBuildIntegration = new NUnitExecuteTask (jenkins, buildiOSMSBuildIntegration, processManager) { + TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tests", "bin", "Debug", "net472", "Xamarin.MacDev.Tests.dll"), TestProject = msbuildIntegrationTestsProject, ProjectConfiguration = "Debug", - Platform = TestPlatform.All, + Platform = TestPlatform.iOS, TestName = "MSBuild tests", Mode = "Integration", Timeout = TimeSpan.FromMinutes (120), From 3317327c234613f4079d889582b07737ff8a9140 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 2 Oct 2024 19:53:47 +0200 Subject: [PATCH 020/155] [tests] Fix building the custom-type-assembly assembly from inside a project file. (#21347) Building the custom-type-assembly assembly doesn't work quite right if the RuntimeIdentifier(s) variables are set in the environment from the project file, so don't forward those to the sub-make we execute to build the assembly. This fixes an issue where building monotouch-test would fail locally, because building the custom-type-assembly assembly would fail. Also remove legacy Xamarin logic. --- tests/monotouch-test/dotnet/shared.csproj | 6 +++--- .../custom-type-assembly/Makefile | 17 ++--------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/tests/monotouch-test/dotnet/shared.csproj b/tests/monotouch-test/dotnet/shared.csproj index e72462bc7823..c66a4be6896b 100644 --- a/tests/monotouch-test/dotnet/shared.csproj +++ b/tests/monotouch-test/dotnet/shared.csproj @@ -255,9 +255,9 @@ - - + Condition="!Exists('$(TestLibrariesDirectory)/.libs/dotnet/macos/custom-type-assembly.dll')" > + + diff --git a/tests/test-libraries/custom-type-assembly/Makefile b/tests/test-libraries/custom-type-assembly/Makefile index 29527c3b0295..31af087078fe 100644 --- a/tests/test-libraries/custom-type-assembly/Makefile +++ b/tests/test-libraries/custom-type-assembly/Makefile @@ -2,32 +2,19 @@ TOP=../../.. include $(TOP)/Make.config -.libs/macos/custom-type-assembly.dll: custom-type-assembly.cs Makefile | .libs/macos - $(Q_CSC) $(MAC_mobile_CSC) $< -out:$@ -r:$(MAC_DESTDIR)/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/mono/Xamarin.Mac/Xamarin.Mac.dll -target:library /nologo - .libs/dotnet/macos/custom-type-assembly.dll: bin/Debug/$(DOTNET_TFM)-macos/custom-type-assembly.dll | .libs/dotnet/macos $(Q) $(CP) $< $@ -.libs/macos .libs/dotnet/macos: +.libs/dotnet/macos: $(Q) mkdir -p $@ bin/Debug/$(DOTNET_TFM)-macos/custom-type-assembly.dll: custom-type-assembly.csproj custom-type-assembly.cs - $(Q) unset MSBUILD_EXE_PATH && $(DOTNET) build $< "/bl:$@.binlog" $(MSBUILD_VERBOSITY) + $(Q) unset MSBUILD_EXE_PATH && $(DOTNET) build $< "/bl:$@.binlog" $(DOTNET_BUILD_VERBOSITY) ifdef INCLUDE_MAC - -ifdef INCLUDE_XAMARIN_LEGACY -TARGETS += \ - .libs/macos/custom-type-assembly.dll \ - -endif - -ifdef ENABLE_DOTNET TARGETS += \ .libs/dotnet/macos/custom-type-assembly.dll \ -endif - endif # INCLUDE_MAC build-assembly: $(TARGETS) From f6501e922fbb525dd1f56ed78540adc8672ac9c8 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 2 Oct 2024 19:54:47 +0200 Subject: [PATCH 021/155] [dotnet] Don't link with BrowserEngineKit. Fixes #21324. (#21337) Fixes https://github.com/xamarin/xamarin-macios/issues/21324. --- dotnet/targets/Xamarin.Shared.Sdk.targets | 5 + tests/dotnet/UnitTests/ProjectTest.cs | 652 ++++++++++++++++++ .../dotnet/iOS/introspection.csproj | 2 + .../dotnet/macOS/introspection.csproj | 2 + .../dotnet/tvOS/introspection.csproj | 2 + 5 files changed, 663 insertions(+) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index 61b32c561f43..328735982af5 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -1526,6 +1526,11 @@ <_NativeExecutableFrameworks Include="Security" /> + + <_NativeExecutableFrameworks Remove="BrowserEngineKit" Condition="'$(LinkWithBrowserEngineKit)' != 'true'" /> + <_MainLinkerFlags Include="-lz" /> <_MainLinkerFlags Include="-liconv" /> diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index f3d9e9247a6f..5a7bac5c218d 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -2071,5 +2071,657 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl properties ["SetAppendRuntimeIdentifierToOutputPathToFalse"] = "true"; DotNet.AssertBuild (project_path, properties); } + + static string [] expectedFrameworks_iOS_None = [ + "/System/Library/Frameworks/Accelerate.framework/Accelerate", + "/System/Library/Frameworks/Accessibility.framework/Accessibility", + "/System/Library/Frameworks/AccessorySetupKit.framework/AccessorySetupKit", + "/System/Library/Frameworks/Accounts.framework/Accounts", + "/System/Library/Frameworks/AddressBook.framework/AddressBook", + "/System/Library/Frameworks/AddressBookUI.framework/AddressBookUI", + "/System/Library/Frameworks/AdServices.framework/AdServices", + "/System/Library/Frameworks/AdSupport.framework/AdSupport", + "/System/Library/Frameworks/AppClip.framework/AppClip", + "/System/Library/Frameworks/AppTrackingTransparency.framework/AppTrackingTransparency", + "/System/Library/Frameworks/ARKit.framework/ARKit", + "/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox", + "/System/Library/Frameworks/AuthenticationServices.framework/AuthenticationServices", + "/System/Library/Frameworks/AutomaticAssessmentConfiguration.framework/AutomaticAssessmentConfiguration", + "/System/Library/Frameworks/AVFoundation.framework/AVFoundation", + "/System/Library/Frameworks/AVKit.framework/AVKit", + "/System/Library/Frameworks/AVRouting.framework/AVRouting", + "/System/Library/Frameworks/BackgroundAssets.framework/BackgroundAssets", + "/System/Library/Frameworks/BackgroundTasks.framework/BackgroundTasks", + "/System/Library/Frameworks/BusinessChat.framework/BusinessChat", + "/System/Library/Frameworks/CallKit.framework/CallKit", + "/System/Library/Frameworks/CarPlay.framework/CarPlay", + "/System/Library/Frameworks/CFNetwork.framework/CFNetwork", + "/System/Library/Frameworks/Cinematic.framework/Cinematic", + "/System/Library/Frameworks/ClassKit.framework/ClassKit", + "/System/Library/Frameworks/CloudKit.framework/CloudKit", + "/System/Library/Frameworks/Contacts.framework/Contacts", + "/System/Library/Frameworks/ContactsUI.framework/ContactsUI", + "/System/Library/Frameworks/CoreAudioKit.framework/CoreAudioKit", + "/System/Library/Frameworks/CoreBluetooth.framework/CoreBluetooth", + "/System/Library/Frameworks/CoreData.framework/CoreData", + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", + "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics", + "/System/Library/Frameworks/CoreHaptics.framework/CoreHaptics", + "/System/Library/Frameworks/CoreImage.framework/CoreImage", + "/System/Library/Frameworks/CoreLocation.framework/CoreLocation", + "/System/Library/Frameworks/CoreLocationUI.framework/CoreLocationUI", + "/System/Library/Frameworks/CoreMedia.framework/CoreMedia", + "/System/Library/Frameworks/CoreMIDI.framework/CoreMIDI", + "/System/Library/Frameworks/CoreML.framework/CoreML", + "/System/Library/Frameworks/CoreMotion.framework/CoreMotion", + "/System/Library/Frameworks/CoreNFC.framework/CoreNFC", + "/System/Library/Frameworks/CoreSpotlight.framework/CoreSpotlight", + "/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", + "/System/Library/Frameworks/CoreText.framework/CoreText", + "/System/Library/Frameworks/CoreVideo.framework/CoreVideo", + "/System/Library/Frameworks/CryptoTokenKit.framework/CryptoTokenKit", + "/System/Library/Frameworks/DeviceCheck.framework/DeviceCheck", + "/System/Library/Frameworks/DeviceDiscoveryExtension.framework/DeviceDiscoveryExtension", + "/System/Library/Frameworks/EventKit.framework/EventKit", + "/System/Library/Frameworks/EventKitUI.framework/EventKitUI", + "/System/Library/Frameworks/ExternalAccessory.framework/ExternalAccessory", + "/System/Library/Frameworks/FileProvider.framework/FileProvider", + "/System/Library/Frameworks/FileProviderUI.framework/FileProviderUI", + "/System/Library/Frameworks/Foundation.framework/Foundation", + "/System/Library/Frameworks/GameController.framework/GameController", + "/System/Library/Frameworks/GameKit.framework/GameKit", + "/System/Library/Frameworks/GameplayKit.framework/GameplayKit", + "/System/Library/Frameworks/GLKit.framework/GLKit", + "/System/Library/Frameworks/GSS.framework/GSS", + "/System/Library/Frameworks/HealthKit.framework/HealthKit", + "/System/Library/Frameworks/HealthKitUI.framework/HealthKitUI", + "/System/Library/Frameworks/HomeKit.framework/HomeKit", + "/System/Library/Frameworks/IdentityLookup.framework/IdentityLookup", + "/System/Library/Frameworks/IdentityLookupUI.framework/IdentityLookupUI", + "/System/Library/Frameworks/ImageIO.framework/ImageIO", + "/System/Library/Frameworks/Intents.framework/Intents", + "/System/Library/Frameworks/IntentsUI.framework/IntentsUI", + "/System/Library/Frameworks/IOSurface.framework/IOSurface", + "/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore", + "/System/Library/Frameworks/LinkPresentation.framework/LinkPresentation", + "/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication", + "/System/Library/Frameworks/MapKit.framework/MapKit", + "/System/Library/Frameworks/MediaAccessibility.framework/MediaAccessibility", + "/System/Library/Frameworks/MediaPlayer.framework/MediaPlayer", + "/System/Library/Frameworks/MediaSetup.framework/MediaSetup", + "/System/Library/Frameworks/MediaToolbox.framework/MediaToolbox", + "/System/Library/Frameworks/Messages.framework/Messages", + "/System/Library/Frameworks/MessageUI.framework/MessageUI", + "/System/Library/Frameworks/Metal.framework/Metal", + "/System/Library/Frameworks/MetalFX.framework/MetalFX", + "/System/Library/Frameworks/MetalKit.framework/MetalKit", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/MetalPerformanceShaders", + "/System/Library/Frameworks/MetalPerformanceShadersGraph.framework/MetalPerformanceShadersGraph", + "/System/Library/Frameworks/MetricKit.framework/MetricKit", + "/System/Library/Frameworks/MLCompute.framework/MLCompute", + "/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices", + "/System/Library/Frameworks/ModelIO.framework/ModelIO", + "/System/Library/Frameworks/MultipeerConnectivity.framework/MultipeerConnectivity", + "/System/Library/Frameworks/NaturalLanguage.framework/NaturalLanguage", + "/System/Library/Frameworks/NearbyInteraction.framework/NearbyInteraction", + "/System/Library/Frameworks/Network.framework/Network", + "/System/Library/Frameworks/NetworkExtension.framework/NetworkExtension", + "/System/Library/Frameworks/NotificationCenter.framework/NotificationCenter", + "/System/Library/Frameworks/OpenGLES.framework/OpenGLES", + "/System/Library/Frameworks/OSLog.framework/OSLog", + "/System/Library/Frameworks/PassKit.framework/PassKit", + "/System/Library/Frameworks/PDFKit.framework/PDFKit", + "/System/Library/Frameworks/PencilKit.framework/PencilKit", + "/System/Library/Frameworks/PHASE.framework/PHASE", + "/System/Library/Frameworks/Photos.framework/Photos", + "/System/Library/Frameworks/PhotosUI.framework/PhotosUI", + "/System/Library/Frameworks/PushKit.framework/PushKit", + "/System/Library/Frameworks/PushToTalk.framework/PushToTalk", + "/System/Library/Frameworks/QuartzCore.framework/QuartzCore", + "/System/Library/Frameworks/QuickLook.framework/QuickLook", + "/System/Library/Frameworks/QuickLookThumbnailing.framework/QuickLookThumbnailing", + "/System/Library/Frameworks/ReplayKit.framework/ReplayKit", + "/System/Library/Frameworks/SafariServices.framework/SafariServices", + "/System/Library/Frameworks/SafetyKit.framework/SafetyKit", + "/System/Library/Frameworks/SceneKit.framework/SceneKit", + "/System/Library/Frameworks/ScreenTime.framework/ScreenTime", + "/System/Library/Frameworks/Security.framework/Security", + "/System/Library/Frameworks/SensitiveContentAnalysis.framework/SensitiveContentAnalysis", + "/System/Library/Frameworks/SensorKit.framework/SensorKit", + "/System/Library/Frameworks/SharedWithYou.framework/SharedWithYou", + "/System/Library/Frameworks/SharedWithYouCore.framework/SharedWithYouCore", + "/System/Library/Frameworks/ShazamKit.framework/ShazamKit", + "/System/Library/Frameworks/Social.framework/Social", + "/System/Library/Frameworks/SoundAnalysis.framework/SoundAnalysis", + "/System/Library/Frameworks/Speech.framework/Speech", + "/System/Library/Frameworks/SpriteKit.framework/SpriteKit", + "/System/Library/Frameworks/StoreKit.framework/StoreKit", + "/System/Library/Frameworks/Symbols.framework/Symbols", + "/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration", + "/System/Library/Frameworks/ThreadNetwork.framework/ThreadNetwork", + "/System/Library/Frameworks/Twitter.framework/Twitter", + "/System/Library/Frameworks/UIKit.framework/UIKit", + "/System/Library/Frameworks/UniformTypeIdentifiers.framework/UniformTypeIdentifiers", + "/System/Library/Frameworks/UserNotifications.framework/UserNotifications", + "/System/Library/Frameworks/UserNotificationsUI.framework/UserNotificationsUI", + "/System/Library/Frameworks/VideoSubscriberAccount.framework/VideoSubscriberAccount", + "/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox", + "/System/Library/Frameworks/Vision.framework/Vision", + "/System/Library/Frameworks/VisionKit.framework/VisionKit", + "/System/Library/Frameworks/WatchConnectivity.framework/WatchConnectivity", + "/System/Library/Frameworks/WebKit.framework/WebKit", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static string [] expectedFrameworks_iOS_Full = [ + "/System/Library/Frameworks/CFNetwork.framework/CFNetwork", + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", + "/System/Library/Frameworks/Foundation.framework/Foundation", + "/System/Library/Frameworks/GSS.framework/GSS", + "/System/Library/Frameworks/Security.framework/Security", + "/System/Library/Frameworks/UIKit.framework/UIKit", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static string [] expectedFrameworks_tvOS_None = [ + "/System/Library/Frameworks/Accelerate.framework/Accelerate", + "/System/Library/Frameworks/Accessibility.framework/Accessibility", + "/System/Library/Frameworks/AdSupport.framework/AdSupport", + "/System/Library/Frameworks/AppTrackingTransparency.framework/AppTrackingTransparency", + "/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox", + "/System/Library/Frameworks/AuthenticationServices.framework/AuthenticationServices", + "/System/Library/Frameworks/AVFoundation.framework/AVFoundation", + "/System/Library/Frameworks/AVKit.framework/AVKit", + "/System/Library/Frameworks/BackgroundTasks.framework/BackgroundTasks", + "/System/Library/Frameworks/CFNetwork.framework/CFNetwork", + "/System/Library/Frameworks/Cinematic.framework/Cinematic", + "/System/Library/Frameworks/CloudKit.framework/CloudKit", + "/System/Library/Frameworks/CoreBluetooth.framework/CoreBluetooth", + "/System/Library/Frameworks/CoreData.framework/CoreData", + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", + "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics", + "/System/Library/Frameworks/CoreHaptics.framework/CoreHaptics", + "/System/Library/Frameworks/CoreImage.framework/CoreImage", + "/System/Library/Frameworks/CoreLocation.framework/CoreLocation", + "/System/Library/Frameworks/CoreMedia.framework/CoreMedia", + "/System/Library/Frameworks/CoreMIDI.framework/CoreMIDI", + "/System/Library/Frameworks/CoreML.framework/CoreML", + "/System/Library/Frameworks/CoreSpotlight.framework/CoreSpotlight", + "/System/Library/Frameworks/CoreText.framework/CoreText", + "/System/Library/Frameworks/CoreVideo.framework/CoreVideo", + "/System/Library/Frameworks/CryptoTokenKit.framework/CryptoTokenKit", + "/System/Library/Frameworks/DeviceCheck.framework/DeviceCheck", + "/System/Library/Frameworks/DeviceDiscoveryUI.framework/DeviceDiscoveryUI", + "/System/Library/Frameworks/ExternalAccessory.framework/ExternalAccessory", + "/System/Library/Frameworks/Foundation.framework/Foundation", + "/System/Library/Frameworks/GameController.framework/GameController", + "/System/Library/Frameworks/GameKit.framework/GameKit", + "/System/Library/Frameworks/GameplayKit.framework/GameplayKit", + "/System/Library/Frameworks/GLKit.framework/GLKit", + "/System/Library/Frameworks/HomeKit.framework/HomeKit", + "/System/Library/Frameworks/ImageIO.framework/ImageIO", + "/System/Library/Frameworks/Intents.framework/Intents", + "/System/Library/Frameworks/IOSurface.framework/IOSurface", + "/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore", + "/System/Library/Frameworks/LinkPresentation.framework/LinkPresentation", + "/System/Library/Frameworks/MapKit.framework/MapKit", + "/System/Library/Frameworks/MediaAccessibility.framework/MediaAccessibility", + "/System/Library/Frameworks/MediaPlayer.framework/MediaPlayer", + "/System/Library/Frameworks/MediaToolbox.framework/MediaToolbox", + "/System/Library/Frameworks/Metal.framework/Metal", + "/System/Library/Frameworks/MetalKit.framework/MetalKit", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/MetalPerformanceShaders", + "/System/Library/Frameworks/MetalPerformanceShadersGraph.framework/MetalPerformanceShadersGraph", + "/System/Library/Frameworks/MLCompute.framework/MLCompute", + "/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices", + "/System/Library/Frameworks/ModelIO.framework/ModelIO", + "/System/Library/Frameworks/MultipeerConnectivity.framework/MultipeerConnectivity", + "/System/Library/Frameworks/NaturalLanguage.framework/NaturalLanguage", + "/System/Library/Frameworks/Network.framework/Network", + "/System/Library/Frameworks/NetworkExtension.framework/NetworkExtension", + "/System/Library/Frameworks/OpenGLES.framework/OpenGLES", + "/System/Library/Frameworks/OSLog.framework/OSLog", + "/System/Library/Frameworks/PHASE.framework/PHASE", + "/System/Library/Frameworks/Photos.framework/Photos", + "/System/Library/Frameworks/PhotosUI.framework/PhotosUI", + "/System/Library/Frameworks/QuartzCore.framework/QuartzCore", + "/System/Library/Frameworks/ReplayKit.framework/ReplayKit", + "/System/Library/Frameworks/SceneKit.framework/SceneKit", + "/System/Library/Frameworks/Security.framework/Security", + "/System/Library/Frameworks/SharedWithYou.framework/SharedWithYou", + "/System/Library/Frameworks/ShazamKit.framework/ShazamKit", + "/System/Library/Frameworks/SoundAnalysis.framework/SoundAnalysis", + "/System/Library/Frameworks/SpriteKit.framework/SpriteKit", + "/System/Library/Frameworks/StoreKit.framework/StoreKit", + "/System/Library/Frameworks/Symbols.framework/Symbols", + "/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration", + "/System/Library/Frameworks/TVMLKit.framework/TVMLKit", + "/System/Library/Frameworks/TVServices.framework/TVServices", + "/System/Library/Frameworks/TVUIKit.framework/TVUIKit", + "/System/Library/Frameworks/UIKit.framework/UIKit", + "/System/Library/Frameworks/UniformTypeIdentifiers.framework/UniformTypeIdentifiers", + "/System/Library/Frameworks/UserNotifications.framework/UserNotifications", + "/System/Library/Frameworks/VideoSubscriberAccount.framework/VideoSubscriberAccount", + "/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox", + "/System/Library/Frameworks/Vision.framework/Vision", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static string [] expectedFrameworks_tvOS_Full = [ + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", + "/System/Library/Frameworks/Foundation.framework/Foundation", + "/System/Library/Frameworks/Security.framework/Security", + "/System/Library/Frameworks/UIKit.framework/UIKit", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static string [] expectedFrameworks_macOS_None = [ + "@executable_path/../../Contents/MonoBundle/libclrgc.dylib", + "@executable_path/../../Contents/MonoBundle/libclrjit.dylib", + "@executable_path/../../Contents/MonoBundle/libcoreclr.dylib", + "@executable_path/../../Contents/MonoBundle/libhostfxr.dylib", + "@executable_path/../../Contents/MonoBundle/libhostpolicy.dylib", + "@executable_path/../../Contents/MonoBundle/libmscordaccore.dylib", + "@executable_path/../../Contents/MonoBundle/libmscordbi.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Globalization.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.IO.Compression.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Net.Security.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Security.Cryptography.Native.Apple.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Security.Cryptography.Native.OpenSsl.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate", + "/System/Library/Frameworks/Accessibility.framework/Versions/A/Accessibility", + "/System/Library/Frameworks/Accounts.framework/Versions/A/Accounts", + "/System/Library/Frameworks/AdServices.framework/Versions/A/AdServices", + "/System/Library/Frameworks/AdSupport.framework/Versions/A/AdSupport", + "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices", + "/System/Library/Frameworks/AppTrackingTransparency.framework/Versions/A/AppTrackingTransparency", + "/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox", + "/System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit", + "/System/Library/Frameworks/AuthenticationServices.framework/Versions/A/AuthenticationServices", + "/System/Library/Frameworks/AutomaticAssessmentConfiguration.framework/Versions/A/AutomaticAssessmentConfiguration", + "/System/Library/Frameworks/AVFoundation.framework/Versions/A/AVFoundation", + "/System/Library/Frameworks/AVKit.framework/Versions/A/AVKit", + "/System/Library/Frameworks/AVRouting.framework/Versions/A/AVRouting", + "/System/Library/Frameworks/BackgroundAssets.framework/Versions/A/BackgroundAssets", + "/System/Library/Frameworks/BusinessChat.framework/Versions/A/BusinessChat", + "/System/Library/Frameworks/CallKit.framework/Versions/A/CallKit", + "/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork", + "/System/Library/Frameworks/Cinematic.framework/Versions/A/Cinematic", + "/System/Library/Frameworks/ClassKit.framework/Versions/A/ClassKit", + "/System/Library/Frameworks/CloudKit.framework/Versions/A/CloudKit", + "/System/Library/Frameworks/Contacts.framework/Versions/A/Contacts", + "/System/Library/Frameworks/ContactsUI.framework/Versions/A/ContactsUI", + "/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio", + "/System/Library/Frameworks/CoreAudioKit.framework/Versions/A/CoreAudioKit", + "/System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth", + "/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData", + "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation", + "/System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage", + "/System/Library/Frameworks/CoreLocation.framework/Versions/A/CoreLocation", + "/System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia", + "/System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI", + "/System/Library/Frameworks/CoreML.framework/Versions/A/CoreML", + "/System/Library/Frameworks/CoreMotion.framework/Versions/A/CoreMotion", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices", + "/System/Library/Frameworks/CoreSpotlight.framework/Versions/A/CoreSpotlight", + "/System/Library/Frameworks/CoreText.framework/Versions/A/CoreText", + "/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo", + "/System/Library/Frameworks/CoreWLAN.framework/Versions/A/CoreWLAN", + "/System/Library/Frameworks/CryptoTokenKit.framework/Versions/A/CryptoTokenKit", + "/System/Library/Frameworks/DeviceCheck.framework/Versions/A/DeviceCheck", + "/System/Library/Frameworks/DeviceDiscoveryExtension.framework/Versions/A/DeviceDiscoveryExtension", + "/System/Library/Frameworks/EventKit.framework/Versions/A/EventKit", + "/System/Library/Frameworks/ExecutionPolicy.framework/Versions/A/ExecutionPolicy", + "/System/Library/Frameworks/ExtensionKit.framework/Versions/A/ExtensionKit", + "/System/Library/Frameworks/ExternalAccessory.framework/ExternalAccessory", + "/System/Library/Frameworks/FileProvider.framework/Versions/A/FileProvider", + "/System/Library/Frameworks/FileProviderUI.framework/Versions/A/FileProviderUI", + "/System/Library/Frameworks/FinderSync.framework/Versions/A/FinderSync", + "/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation", + "/System/Library/Frameworks/GameController.framework/Versions/A/GameController", + "/System/Library/Frameworks/GameKit.framework/Versions/A/GameKit", + "/System/Library/Frameworks/GameplayKit.framework/Versions/A/GameplayKit", + "/System/Library/Frameworks/GLKit.framework/Versions/A/GLKit", + "/System/Library/Frameworks/HealthKit.framework/Versions/A/HealthKit", + "/System/Library/Frameworks/ImageCaptureCore.framework/Versions/A/ImageCaptureCore", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO", + "/System/Library/Frameworks/Intents.framework/Versions/A/Intents", + "/System/Library/Frameworks/IntentsUI.framework/Versions/A/IntentsUI", + "/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface", + "/System/Library/Frameworks/iTunesLibrary.framework/Versions/A/iTunesLibrary", + "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/JavaScriptCore", + "/System/Library/Frameworks/LinkPresentation.framework/Versions/A/LinkPresentation", + "/System/Library/Frameworks/LocalAuthentication.framework/Versions/A/LocalAuthentication", + "/System/Library/Frameworks/LocalAuthenticationEmbeddedUI.framework/Versions/A/LocalAuthenticationEmbeddedUI", + "/System/Library/Frameworks/MailKit.framework/Versions/A/MailKit", + "/System/Library/Frameworks/MapKit.framework/Versions/A/MapKit", + "/System/Library/Frameworks/MediaAccessibility.framework/Versions/A/MediaAccessibility", + "/System/Library/Frameworks/MediaExtension.framework/Versions/A/MediaExtension", + "/System/Library/Frameworks/MediaLibrary.framework/Versions/A/MediaLibrary", + "/System/Library/Frameworks/MediaPlayer.framework/Versions/A/MediaPlayer", + "/System/Library/Frameworks/MediaToolbox.framework/Versions/A/MediaToolbox", + "/System/Library/Frameworks/Metal.framework/Versions/A/Metal", + "/System/Library/Frameworks/MetalFX.framework/Versions/A/MetalFX", + "/System/Library/Frameworks/MetalKit.framework/Versions/A/MetalKit", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders", + "/System/Library/Frameworks/MetalPerformanceShadersGraph.framework/Versions/A/MetalPerformanceShadersGraph", + "/System/Library/Frameworks/MetricKit.framework/Versions/A/MetricKit", + "/System/Library/Frameworks/MLCompute.framework/Versions/A/MLCompute", + "/System/Library/Frameworks/ModelIO.framework/Versions/A/ModelIO", + "/System/Library/Frameworks/MultipeerConnectivity.framework/Versions/A/MultipeerConnectivity", + "/System/Library/Frameworks/NaturalLanguage.framework/Versions/A/NaturalLanguage", + "/System/Library/Frameworks/Network.framework/Versions/A/Network", + "/System/Library/Frameworks/NetworkExtension.framework/Versions/A/NetworkExtension", + "/System/Library/Frameworks/NotificationCenter.framework/Versions/A/NotificationCenter", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL", + "/System/Library/Frameworks/OSLog.framework/Versions/A/OSLog", + "/System/Library/Frameworks/PassKit.framework/Versions/A/PassKit", + "/System/Library/Frameworks/PencilKit.framework/Versions/A/PencilKit", + "/System/Library/Frameworks/PHASE.framework/Versions/A/PHASE", + "/System/Library/Frameworks/Photos.framework/Versions/A/Photos", + "/System/Library/Frameworks/PhotosUI.framework/Versions/A/PhotosUI", + "/System/Library/Frameworks/PushKit.framework/Versions/A/PushKit", + "/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz", + "/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore", + "/System/Library/Frameworks/QuickLook.framework/Versions/A/QuickLook", + "/System/Library/Frameworks/QuickLookThumbnailing.framework/Versions/A/QuickLookThumbnailing", + "/System/Library/Frameworks/ReplayKit.framework/Versions/A/ReplayKit", + "/System/Library/Frameworks/SafariServices.framework/Versions/A/SafariServices", + "/System/Library/Frameworks/SafetyKit.framework/Versions/A/SafetyKit", + "/System/Library/Frameworks/SceneKit.framework/Versions/A/SceneKit", + "/System/Library/Frameworks/ScreenCaptureKit.framework/Versions/A/ScreenCaptureKit", + "/System/Library/Frameworks/ScreenTime.framework/Versions/A/ScreenTime", + "/System/Library/Frameworks/ScriptingBridge.framework/Versions/A/ScriptingBridge", + "/System/Library/Frameworks/Security.framework/Versions/A/Security", + "/System/Library/Frameworks/SensitiveContentAnalysis.framework/Versions/A/SensitiveContentAnalysis", + "/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement", + "/System/Library/Frameworks/SharedWithYou.framework/Versions/A/SharedWithYou", + "/System/Library/Frameworks/SharedWithYouCore.framework/Versions/A/SharedWithYouCore", + "/System/Library/Frameworks/ShazamKit.framework/Versions/A/ShazamKit", + "/System/Library/Frameworks/Social.framework/Versions/A/Social", + "/System/Library/Frameworks/SoundAnalysis.framework/Versions/A/SoundAnalysis", + "/System/Library/Frameworks/Speech.framework/Versions/A/Speech", + "/System/Library/Frameworks/SpriteKit.framework/Versions/A/SpriteKit", + "/System/Library/Frameworks/StoreKit.framework/Versions/A/StoreKit", + "/System/Library/Frameworks/Symbols.framework/Versions/A/Symbols", + "/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration", + "/System/Library/Frameworks/ThreadNetwork.framework/Versions/A/ThreadNetwork", + "/System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers", + "/System/Library/Frameworks/UserNotifications.framework/Versions/A/UserNotifications", + "/System/Library/Frameworks/UserNotificationsUI.framework/Versions/A/UserNotificationsUI", + "/System/Library/Frameworks/VideoSubscriberAccount.framework/Versions/A/VideoSubscriberAccount", + "/System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox", + "/System/Library/Frameworks/Vision.framework/Versions/A/Vision", + "/System/Library/Frameworks/WebKit.framework/Versions/A/WebKit", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static string [] expectedFrameworks_macOS_Full = [ + "@executable_path/../../Contents/MonoBundle/libclrgc.dylib", + "@executable_path/../../Contents/MonoBundle/libclrjit.dylib", + "@executable_path/../../Contents/MonoBundle/libcoreclr.dylib", + "@executable_path/../../Contents/MonoBundle/libhostfxr.dylib", + "@executable_path/../../Contents/MonoBundle/libhostpolicy.dylib", + "@executable_path/../../Contents/MonoBundle/libmscordaccore.dylib", + "@executable_path/../../Contents/MonoBundle/libmscordbi.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Globalization.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.IO.Compression.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Net.Security.Native.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Security.Cryptography.Native.Apple.dylib", + "@executable_path/../../Contents/MonoBundle/libSystem.Security.Cryptography.Native.OpenSsl.dylib", + "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices", + "/System/Library/Frameworks/CloudKit.framework/Versions/A/CloudKit", + "/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData", + "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation", + "/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation", + "/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz", + "/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore", + "/System/Library/Frameworks/Security.framework/Versions/A/Security", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static string [] expectedFrameworks_MacCatalyst_None = [ + "/System/iOSSupport/System/Library/Frameworks/AddressBook.framework/Versions/A/AddressBook", + "/System/iOSSupport/System/Library/Frameworks/AppClip.framework/Versions/A/AppClip", + "/System/iOSSupport/System/Library/Frameworks/AuthenticationServices.framework/Versions/A/AuthenticationServices", + "/System/iOSSupport/System/Library/Frameworks/AVKit.framework/Versions/A/AVKit", + "/System/iOSSupport/System/Library/Frameworks/BusinessChat.framework/Versions/A/BusinessChat", + "/System/iOSSupport/System/Library/Frameworks/ContactsUI.framework/Versions/A/ContactsUI", + "/System/iOSSupport/System/Library/Frameworks/CoreAudioKit.framework/Versions/A/CoreAudioKit", + "/System/iOSSupport/System/Library/Frameworks/CoreLocationUI.framework/Versions/A/CoreLocationUI", + "/System/iOSSupport/System/Library/Frameworks/CoreNFC.framework/Versions/A/CoreNFC", + "/System/iOSSupport/System/Library/Frameworks/EventKitUI.framework/Versions/A/EventKitUI", + "/System/iOSSupport/System/Library/Frameworks/GameController.framework/Versions/A/GameController", + "/System/iOSSupport/System/Library/Frameworks/GameKit.framework/Versions/A/GameKit", + "/System/iOSSupport/System/Library/Frameworks/GameplayKit.framework/Versions/A/GameplayKit", + "/System/iOSSupport/System/Library/Frameworks/HealthKitUI.framework/Versions/A/HealthKitUI", + "/System/iOSSupport/System/Library/Frameworks/HomeKit.framework/Versions/A/HomeKit", + "/System/iOSSupport/System/Library/Frameworks/IdentityLookupUI.framework/Versions/A/IdentityLookupUI", + "/System/iOSSupport/System/Library/Frameworks/IntentsUI.framework/Versions/A/IntentsUI", + "/System/iOSSupport/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/JavaScriptCore", + "/System/iOSSupport/System/Library/Frameworks/LinkPresentation.framework/Versions/A/LinkPresentation", + "/System/iOSSupport/System/Library/Frameworks/MapKit.framework/Versions/A/MapKit", + "/System/iOSSupport/System/Library/Frameworks/MediaPlayer.framework/Versions/A/MediaPlayer", + "/System/iOSSupport/System/Library/Frameworks/Messages.framework/Versions/A/Messages", + "/System/iOSSupport/System/Library/Frameworks/MessageUI.framework/Versions/A/MessageUI", + "/System/iOSSupport/System/Library/Frameworks/MetalKit.framework/Versions/A/MetalKit", + "/System/iOSSupport/System/Library/Frameworks/MobileCoreServices.framework/Versions/A/MobileCoreServices", + "/System/iOSSupport/System/Library/Frameworks/MultipeerConnectivity.framework/Versions/A/MultipeerConnectivity", + "/System/iOSSupport/System/Library/Frameworks/PassKit.framework/Versions/A/PassKit", + "/System/iOSSupport/System/Library/Frameworks/PDFKit.framework/Versions/A/PDFKit", + "/System/iOSSupport/System/Library/Frameworks/PencilKit.framework/Versions/A/PencilKit", + "/System/iOSSupport/System/Library/Frameworks/PhotosUI.framework/Versions/A/PhotosUI", + "/System/iOSSupport/System/Library/Frameworks/QuickLook.framework/Versions/A/QuickLook", + "/System/iOSSupport/System/Library/Frameworks/ReplayKit.framework/Versions/A/ReplayKit", + "/System/iOSSupport/System/Library/Frameworks/SafariServices.framework/Versions/A/SafariServices", + "/System/iOSSupport/System/Library/Frameworks/SceneKit.framework/Versions/A/SceneKit", + "/System/iOSSupport/System/Library/Frameworks/ScreenTime.framework/Versions/A/ScreenTime", + "/System/iOSSupport/System/Library/Frameworks/SharedWithYou.framework/Versions/A/SharedWithYou", + "/System/iOSSupport/System/Library/Frameworks/Social.framework/Versions/A/Social", + "/System/iOSSupport/System/Library/Frameworks/SpriteKit.framework/Versions/A/SpriteKit", + "/System/iOSSupport/System/Library/Frameworks/StoreKit.framework/Versions/A/StoreKit", + "/System/iOSSupport/System/Library/Frameworks/UIKit.framework/Versions/A/UIKit", + "/System/iOSSupport/System/Library/Frameworks/UserNotificationsUI.framework/Versions/A/UserNotificationsUI", + "/System/iOSSupport/System/Library/Frameworks/VisionKit.framework/Versions/A/VisionKit", + "/System/iOSSupport/System/Library/Frameworks/WebKit.framework/Versions/A/WebKit", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate", + "/System/Library/Frameworks/Accessibility.framework/Versions/A/Accessibility", + "/System/Library/Frameworks/Accounts.framework/Versions/A/Accounts", + "/System/Library/Frameworks/AdServices.framework/Versions/A/AdServices", + "/System/Library/Frameworks/AdSupport.framework/Versions/A/AdSupport", + "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit", + "/System/Library/Frameworks/AppTrackingTransparency.framework/Versions/A/AppTrackingTransparency", + "/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox", + "/System/Library/Frameworks/AutomaticAssessmentConfiguration.framework/Versions/A/AutomaticAssessmentConfiguration", + "/System/Library/Frameworks/AVFoundation.framework/Versions/A/AVFoundation", + "/System/Library/Frameworks/AVRouting.framework/Versions/A/AVRouting", + "/System/Library/Frameworks/BackgroundAssets.framework/Versions/A/BackgroundAssets", + "/System/Library/Frameworks/BackgroundTasks.framework/Versions/A/BackgroundTasks", + "/System/Library/Frameworks/CallKit.framework/Versions/A/CallKit", + "/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork", + "/System/Library/Frameworks/ClassKit.framework/Versions/A/ClassKit", + "/System/Library/Frameworks/CloudKit.framework/Versions/A/CloudKit", + "/System/Library/Frameworks/Contacts.framework/Versions/A/Contacts", + "/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio", + "/System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth", + "/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData", + "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation", + "/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics", + "/System/Library/Frameworks/CoreHaptics.framework/Versions/A/CoreHaptics", + "/System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage", + "/System/Library/Frameworks/CoreLocation.framework/Versions/A/CoreLocation", + "/System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia", + "/System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI", + "/System/Library/Frameworks/CoreML.framework/Versions/A/CoreML", + "/System/Library/Frameworks/CoreMotion.framework/Versions/A/CoreMotion", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices", + "/System/Library/Frameworks/CoreSpotlight.framework/Versions/A/CoreSpotlight", + "/System/Library/Frameworks/CoreTelephony.framework/Versions/A/CoreTelephony", + "/System/Library/Frameworks/CoreText.framework/Versions/A/CoreText", + "/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo", + "/System/Library/Frameworks/CoreWLAN.framework/Versions/A/CoreWLAN", + "/System/Library/Frameworks/CryptoTokenKit.framework/Versions/A/CryptoTokenKit", + "/System/Library/Frameworks/DeviceCheck.framework/Versions/A/DeviceCheck", + "/System/Library/Frameworks/DeviceDiscoveryExtension.framework/Versions/A/DeviceDiscoveryExtension", + "/System/Library/Frameworks/EventKit.framework/Versions/A/EventKit", + "/System/Library/Frameworks/ExecutionPolicy.framework/Versions/A/ExecutionPolicy", + "/System/Library/Frameworks/ExternalAccessory.framework/ExternalAccessory", + "/System/Library/Frameworks/FileProvider.framework/Versions/A/FileProvider", + "/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation", + "/System/Library/Frameworks/GSS.framework/Versions/A/GSS", + "/System/Library/Frameworks/HealthKit.framework/Versions/A/HealthKit", + "/System/Library/Frameworks/IdentityLookup.framework/Versions/A/IdentityLookup", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO", + "/System/Library/Frameworks/Intents.framework/Versions/A/Intents", + "/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface", + "/System/Library/Frameworks/LocalAuthentication.framework/Versions/A/LocalAuthentication", + "/System/Library/Frameworks/MediaAccessibility.framework/Versions/A/MediaAccessibility", + "/System/Library/Frameworks/MediaToolbox.framework/Versions/A/MediaToolbox", + "/System/Library/Frameworks/Metal.framework/Versions/A/Metal", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders", + "/System/Library/Frameworks/MetalPerformanceShadersGraph.framework/Versions/A/MetalPerformanceShadersGraph", + "/System/Library/Frameworks/MetricKit.framework/Versions/A/MetricKit", + "/System/Library/Frameworks/MLCompute.framework/Versions/A/MLCompute", + "/System/Library/Frameworks/ModelIO.framework/Versions/A/ModelIO", + "/System/Library/Frameworks/NaturalLanguage.framework/Versions/A/NaturalLanguage", + "/System/Library/Frameworks/NearbyInteraction.framework/Versions/A/NearbyInteraction", + "/System/Library/Frameworks/Network.framework/Versions/A/Network", + "/System/Library/Frameworks/NetworkExtension.framework/Versions/A/NetworkExtension", + "/System/Library/Frameworks/OSLog.framework/Versions/A/OSLog", + "/System/Library/Frameworks/PHASE.framework/Versions/A/PHASE", + "/System/Library/Frameworks/Photos.framework/Versions/A/Photos", + "/System/Library/Frameworks/PushKit.framework/Versions/A/PushKit", + "/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore", + "/System/Library/Frameworks/QuickLookThumbnailing.framework/Versions/A/QuickLookThumbnailing", + "/System/Library/Frameworks/Security.framework/Versions/A/Security", + "/System/Library/Frameworks/SensitiveContentAnalysis.framework/Versions/A/SensitiveContentAnalysis", + "/System/Library/Frameworks/SensorKit.framework/Versions/A/SensorKit", + "/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement", + "/System/Library/Frameworks/SharedWithYouCore.framework/Versions/A/SharedWithYouCore", + "/System/Library/Frameworks/ShazamKit.framework/Versions/A/ShazamKit", + "/System/Library/Frameworks/SoundAnalysis.framework/Versions/A/SoundAnalysis", + "/System/Library/Frameworks/Speech.framework/Versions/A/Speech", + "/System/Library/Frameworks/Symbols.framework/Versions/A/Symbols", + "/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration", + "/System/Library/Frameworks/ThreadNetwork.framework/Versions/A/ThreadNetwork", + "/System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers", + "/System/Library/Frameworks/UserNotifications.framework/Versions/A/UserNotifications", + "/System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox", + "/System/Library/Frameworks/Vision.framework/Versions/A/Vision", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static string [] expectedFrameworks_MacCatalyst_Full = [ + "/System/iOSSupport/System/Library/Frameworks/UIKit.framework/Versions/A/UIKit", + "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit", + "/System/Library/Frameworks/CloudKit.framework/Versions/A/CloudKit", + "/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData", + "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation", + "/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics", + "/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation", + "/System/Library/Frameworks/GSS.framework/Versions/A/GSS", + "/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore", + "/System/Library/Frameworks/Security.framework/Versions/A/Security", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libcompression.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libz.1.dylib", + ]; + + static IEnumerable GetLinkedWithNativeLibrariesTestCases () + { + // Generally speaking, whenever we bind a new framework, we'll have to adjust the LinkMode="None" test cases, + // but we shouldn't have to adjust the LinkMode="Full" test cases (which would typically mean that we'll end + // up linking with said framework in every app - it's also an indication that we're not trimming away as much + // as we want, because just adding an (unused) framework shouldn't make it impossible to trim away all the + // code in that framework). + + yield return new TestCaseData (ApplePlatform.iOS, "ios-arm64", "None", expectedFrameworks_iOS_None); + yield return new TestCaseData (ApplePlatform.iOS, "ios-arm64", "Full", expectedFrameworks_iOS_Full); + yield return new TestCaseData (ApplePlatform.TVOS, "tvos-arm64", "None", expectedFrameworks_tvOS_None); + yield return new TestCaseData (ApplePlatform.TVOS, "tvos-arm64", "Full", expectedFrameworks_tvOS_Full); + yield return new TestCaseData (ApplePlatform.MacOSX, "osx-arm64", "None", expectedFrameworks_macOS_None); + yield return new TestCaseData (ApplePlatform.MacOSX, "osx-arm64", "Full", expectedFrameworks_macOS_Full); + yield return new TestCaseData (ApplePlatform.MacCatalyst, "maccatalyst-x64", "None", expectedFrameworks_MacCatalyst_None); + yield return new TestCaseData (ApplePlatform.MacCatalyst, "maccatalyst-x64", "Full", expectedFrameworks_MacCatalyst_Full); + } + + [TestCaseSource (nameof (GetLinkedWithNativeLibrariesTestCases))] + public void LinkedWithNativeLibraries (ApplePlatform platform, string runtimeIdentifiers, string linkMode, string [] expectedFrameworks) + { + var project = "MySimpleApp"; + Configuration.IgnoreIfIgnoredPlatform (platform); + Configuration.AssertRuntimeIdentifiersAvailable (platform, runtimeIdentifiers); + + var project_path = GetProjectPath (project, runtimeIdentifiers: runtimeIdentifiers, platform: platform, out var appPath); + Clean (project_path); + var properties = GetDefaultProperties (runtimeIdentifiers); + properties ["MtouchLink"] = linkMode; + properties ["LinkMode"] = linkMode; + if (platform != ApplePlatform.MacOSX) + properties ["UseInterpreter"] = "true"; // just to speed up the build + DotNet.AssertBuild (project_path, properties); + + var appExecutable = GetNativeExecutable (platform, appPath); + var actualFrameworks = GetLinkedWithFrameworks (appExecutable); + CollectionAssert.AreEquivalent ( + expectedFrameworks.OrderBy (v => v).ToArray (), + actualFrameworks.OrderBy (v => v).ToArray (), + "Frameworks"); + } + + static HashSet GetLinkedWithFrameworks (string path) + { + var rv = new HashSet (); + foreach (var file in MachO.Read (path)) { + foreach (var lc in file.load_commands) { + if (lc is DylibLoadCommand loadCommand) { + rv.Add (loadCommand.name); + } + } + } + return rv; + } } } diff --git a/tests/introspection/dotnet/iOS/introspection.csproj b/tests/introspection/dotnet/iOS/introspection.csproj index 6bd13ee186cf..8aec236aa0ab 100644 --- a/tests/introspection/dotnet/iOS/introspection.csproj +++ b/tests/introspection/dotnet/iOS/introspection.csproj @@ -2,6 +2,8 @@ net$(BundledNETCoreAppTargetFrameworkVersion)-ios + + true diff --git a/tests/introspection/dotnet/macOS/introspection.csproj b/tests/introspection/dotnet/macOS/introspection.csproj index 29307a09fef5..3a187c9a8bd6 100644 --- a/tests/introspection/dotnet/macOS/introspection.csproj +++ b/tests/introspection/dotnet/macOS/introspection.csproj @@ -2,6 +2,8 @@ net$(BundledNETCoreAppTargetFrameworkVersion)-macos + + true diff --git a/tests/introspection/dotnet/tvOS/introspection.csproj b/tests/introspection/dotnet/tvOS/introspection.csproj index e3d65c592a4e..b0232ed33cc2 100644 --- a/tests/introspection/dotnet/tvOS/introspection.csproj +++ b/tests/introspection/dotnet/tvOS/introspection.csproj @@ -2,6 +2,8 @@ net$(BundledNETCoreAppTargetFrameworkVersion)-tvos + + true From 07256bf177987502a74574ada6c053421e4c3b69 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 3 Oct 2024 10:44:54 +0200 Subject: [PATCH 022/155] [tests] Update list of expected native libraries we link with for .NET 9. --- tests/dotnet/UnitTests/ProjectTest.cs | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index 5a5545a460c5..cc8541998b91 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -2294,6 +2294,14 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", + "/System/Library/Frameworks/CryptoKit.framework/CryptoKit", + "/usr/lib/libicucore.A.dylib", + "/usr/lib/swift/libswiftCore.dylib", + "/usr/lib/swift/libswiftCoreFoundation.dylib", + "/usr/lib/swift/libswiftDarwin.dylib", + "/usr/lib/swift/libswiftDispatch.dylib", + "/usr/lib/swift/libswiftFoundation.dylib", + "/usr/lib/swift/libswiftObjectiveC.dylib", ]; static string [] expectedFrameworks_iOS_Full = [ @@ -2306,6 +2314,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libc++.1.dylib", "/usr/lib/libcompression.dylib", "/usr/lib/libiconv.2.dylib", + "/usr/lib/libicucore.A.dylib", "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", @@ -2337,6 +2346,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/System/Library/Frameworks/CoreSpotlight.framework/CoreSpotlight", "/System/Library/Frameworks/CoreText.framework/CoreText", "/System/Library/Frameworks/CoreVideo.framework/CoreVideo", + "/System/Library/Frameworks/CryptoKit.framework/CryptoKit", "/System/Library/Frameworks/CryptoTokenKit.framework/CryptoTokenKit", "/System/Library/Frameworks/DeviceCheck.framework/DeviceCheck", "/System/Library/Frameworks/DeviceDiscoveryUI.framework/DeviceDiscoveryUI", @@ -2395,9 +2405,16 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libc++.1.dylib", "/usr/lib/libcompression.dylib", "/usr/lib/libiconv.2.dylib", + "/usr/lib/libicucore.A.dylib", "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", + "/usr/lib/swift/libswiftCore.dylib", + "/usr/lib/swift/libswiftCoreFoundation.dylib", + "/usr/lib/swift/libswiftDarwin.dylib", + "/usr/lib/swift/libswiftDispatch.dylib", + "/usr/lib/swift/libswiftFoundation.dylib", + "/usr/lib/swift/libswiftObjectiveC.dylib", ]; static string [] expectedFrameworks_tvOS_Full = [ @@ -2408,6 +2425,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libc++.1.dylib", "/usr/lib/libcompression.dylib", "/usr/lib/libiconv.2.dylib", + "/usr/lib/libicucore.A.dylib", "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", @@ -2415,6 +2433,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl static string [] expectedFrameworks_macOS_None = [ "@executable_path/../../Contents/MonoBundle/libclrgc.dylib", + "@executable_path/../../Contents/MonoBundle/libclrgcexp.dylib", "@executable_path/../../Contents/MonoBundle/libclrjit.dylib", "@executable_path/../../Contents/MonoBundle/libcoreclr.dylib", "@executable_path/../../Contents/MonoBundle/libhostfxr.dylib", @@ -2556,6 +2575,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libc++.1.dylib", "/usr/lib/libcompression.dylib", "/usr/lib/libiconv.2.dylib", + "/usr/lib/libicucore.A.dylib", "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", @@ -2563,6 +2583,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl static string [] expectedFrameworks_macOS_Full = [ "@executable_path/../../Contents/MonoBundle/libclrgc.dylib", + "@executable_path/../../Contents/MonoBundle/libclrgcexp.dylib", "@executable_path/../../Contents/MonoBundle/libclrjit.dylib", "@executable_path/../../Contents/MonoBundle/libcoreclr.dylib", "@executable_path/../../Contents/MonoBundle/libhostfxr.dylib", @@ -2587,6 +2608,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libc++.1.dylib", "/usr/lib/libcompression.dylib", "/usr/lib/libiconv.2.dylib", + "/usr/lib/libicucore.A.dylib", "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", @@ -2672,6 +2694,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/System/Library/Frameworks/CoreText.framework/Versions/A/CoreText", "/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo", "/System/Library/Frameworks/CoreWLAN.framework/Versions/A/CoreWLAN", + "/System/Library/Frameworks/CryptoKit.framework/Versions/A/CryptoKit", "/System/Library/Frameworks/CryptoTokenKit.framework/Versions/A/CryptoTokenKit", "/System/Library/Frameworks/DeviceCheck.framework/Versions/A/DeviceCheck", "/System/Library/Frameworks/DeviceDiscoveryExtension.framework/Versions/A/DeviceDiscoveryExtension", @@ -2723,9 +2746,18 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libc++.1.dylib", "/usr/lib/libcompression.dylib", "/usr/lib/libiconv.2.dylib", + "/usr/lib/libicucore.A.dylib", "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", + "/usr/lib/swift/libswiftCore.dylib", + "/usr/lib/swift/libswiftCoreFoundation.dylib", + "/usr/lib/swift/libswiftDarwin.dylib", + "/usr/lib/swift/libswiftDispatch.dylib", + "/usr/lib/swift/libswiftFoundation.dylib", + "/usr/lib/swift/libswiftIOKit.dylib", + "/usr/lib/swift/libswiftObjectiveC.dylib", + "/usr/lib/swift/libswiftXPC.dylib", ]; static string [] expectedFrameworks_MacCatalyst_Full = [ @@ -2742,6 +2774,7 @@ public void AppendRuntimeIdentifierToOutputPath_DisableDirectoryBuildProps (Appl "/usr/lib/libc++.1.dylib", "/usr/lib/libcompression.dylib", "/usr/lib/libiconv.2.dylib", + "/usr/lib/libicucore.A.dylib", "/usr/lib/libobjc.A.dylib", "/usr/lib/libSystem.B.dylib", "/usr/lib/libz.1.dylib", @@ -2754,6 +2787,9 @@ static IEnumerable GetLinkedWithNativeLibrariesTestCases () // up linking with said framework in every app - it's also an indication that we're not trimming away as much // as we want, because just adding an (unused) framework shouldn't make it impossible to trim away all the // code in that framework). + // + // However, new .NET versions often require updates to both the "None" and "Full lists of frameworks and libraries. + // yield return new TestCaseData (ApplePlatform.iOS, "ios-arm64", "None", expectedFrameworks_iOS_None); yield return new TestCaseData (ApplePlatform.iOS, "ios-arm64", "Full", expectedFrameworks_iOS_Full); From 260b12a99dcc8971e9fa74d6952c1de717c2b43b Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 3 Oct 2024 11:13:43 +0200 Subject: [PATCH 023/155] [AppKit] Remove the NS[Open|Save]Panel constructors in XAMCORE_5_0. Fixes #6474. (#21346) These constructors haven't worked since macOS 10.14 (see #6474), so just remove them (when we can make breaking changes). Fixes https://github.com/xamarin/xamarin-macios/issues/6474. --- src/appkit.cs | 6 ++++++ tests/cecil-tests/Documentation.KnownFailures.txt | 2 -- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/appkit.cs b/src/appkit.cs index b97be9410982..9da780ebb521 100644 --- a/src/appkit.cs +++ b/src/appkit.cs @@ -9307,10 +9307,13 @@ interface NSOpenPanel { [ForcedType] // different type used inside a sandbox NSOpenPanel OpenPanel { get; } +#if !XAMCORE_5_0 + [EditorBrowsable (EditorBrowsableState.Never)] [Advice ("You must use 'OpenPanel' method if the application is sandboxed.")] [Deprecated (PlatformName.MacOSX, 10, 15, message: "All open panels now run out-of-process, use 'OpenPanel' method instead")] [Export ("init")] NativeHandle Constructor (); +#endif [Export ("URLs")] NSUrl [] Urls { get; } @@ -13652,10 +13655,13 @@ interface NSSavePanel { [ForcedType] // different type used inside a sandbox NSSavePanel SavePanel { get; } +#if !XAMCORE_5_0 [Advice ("You must use 'SavePanel' method if the application is sandboxed.")] [Deprecated (PlatformName.MacOSX, 10, 15, message: "All save panels now run out-of-process, use 'SavePanel' method instead")] + [EditorBrowsable (EditorBrowsableState.Never)] [Export ("init")] NativeHandle Constructor (); +#endif [Export ("URL")] NSUrl Url { get; } diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 900ecf8af7ed..c8004636b0fe 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -24342,7 +24342,6 @@ M:AppKit.NSOpenGLPixelFormat.#ctor(System.Object[]) M:AppKit.NSOpenGLPixelFormat.#ctor(System.UInt32[]) M:AppKit.NSOpenGLPixelFormat.EncodeTo(Foundation.NSCoder) M:AppKit.NSOpenGLView.#ctor(CoreGraphics.CGRect) -M:AppKit.NSOpenPanel.#ctor M:AppKit.NSOpenPanel.BeginSheet(System.String,System.String,System.String[],AppKit.NSWindow,System.Action) M:AppKit.NSOpenPanel.BeginSheet(System.String,System.String,System.String[],AppKit.NSWindow) M:AppKit.NSOpenSaveExpandingEventArgs.#ctor(System.Boolean) @@ -24687,7 +24686,6 @@ M:AppKit.NSRulerMarkerClientViewDelegation.RulerViewLocation(AppKit.NSView,AppKi M:AppKit.NSRulerMarkerClientViewDelegation.RulerViewPoint(AppKit.NSView,AppKit.NSRulerView,System.Runtime.InteropServices.NFloat) M:AppKit.NSRulerView.#ctor(CoreGraphics.CGRect) M:AppKit.NSRulerView.Dispose(System.Boolean) -M:AppKit.NSSavePanel.#ctor M:AppKit.NSSavePanel.add_DidChangeToDirectory(System.EventHandler{AppKit.NSOpenSavePanelUrlEventArgs}) M:AppKit.NSSavePanel.add_DidSelectType(System.EventHandler{AppKit.NSopenSavePanelUTTypeEventArgs}) M:AppKit.NSSavePanel.add_DirectoryDidChange(System.EventHandler{AppKit.NSOpenSaveFilenameEventArgs}) From 2a3b250aba9c68d0bba0fc5599fc717b9040e94a Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 3 Oct 2024 11:14:31 +0200 Subject: [PATCH 024/155] [tests] Fix FontManagerTest.RegisterFontDescriptors_WithCallback to be a bit more lax. Fixes #6690. (#21348) This way we can actually run the test. Fixes https://github.com/xamarin/xamarin-macios/issues/6690. --- .../CoreText/FontManagerTest.cs | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/tests/monotouch-test/CoreText/FontManagerTest.cs b/tests/monotouch-test/CoreText/FontManagerTest.cs index 098f7789f929..63ab0b683b9a 100644 --- a/tests/monotouch-test/CoreText/FontManagerTest.cs +++ b/tests/monotouch-test/CoreText/FontManagerTest.cs @@ -188,7 +188,6 @@ public void UnregisterFontDescriptors_Null () Assert.Throws (() => CTFontManager.UnregisterFontDescriptors (new CTFontDescriptor [] { null }, CTFontManagerScope.Process, null), "null element"); } -#if !__WATCHOS__ [Test] public void RegisterFontDescriptors_NoCallback () { @@ -205,11 +204,6 @@ public void RegisterFontDescriptors_NoCallback () } } -#if __TVOS__ - [Ignore ("Fails on tvOS with undocumented error code 'The operation couldn’t be completed. (com.apple.CoreText.CTFontManagerErrorDomain error 500.'")] -#elif __IOS__ - [Ignore ("https://github.com/xamarin/xamarin-macios/issues/6690. This began failing for no aparent reason in iOS 13 Beta 5. Check back with GM.")] -#endif [Test] public void RegisterFontDescriptors_WithCallback () { @@ -220,13 +214,30 @@ public void RegisterFontDescriptors_WithCallback () StyleName = "Bold", Size = 16.0f }; + Exception? ex = null; using (CTFontDescriptor fd = new CTFontDescriptor (fda)) { var array = new [] { fd }; - CTFontManager.RegisterFontDescriptors (array, CTFontManagerScope.Process, true, SuccessDone); - CTFontManager.UnregisterFontDescriptors (array, CTFontManagerScope.Process, SuccessDone); + CTFontManager.RegisterFontDescriptors (array, CTFontManagerScope.Process, true, (NSError [] errors, bool done) => { + try { + Assert.True (done, "done: RegisterFontDescriptors"); + } catch (Exception e) { + ex = e; + } + return true; + }); + Assert.That (ex, Is.Null.Or.Not.Null, "RegisterFontDescriptors"); + + CTFontManager.UnregisterFontDescriptors (array, CTFontManagerScope.Process, (NSError [] errors, bool done) => { + try { + Assert.True (done, "done: UnregisterFontDescriptors"); + } catch (Exception e) { + ex = e; + } + return true; + }); + Assert.That (ex, Is.Null.Or.Not.Null, "UnregisterFontDescriptors"); } } -#endif [Test] public void GetFontsNullUrl () From 6002243ee4d3452b7862c394a74c2208cd1a47e5 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 3 Oct 2024 11:15:02 +0200 Subject: [PATCH 025/155] [Vision] Bind VNVisionVersionNumber. Fixes #21342. (#21350) Fixes https://github.com/xamarin/xamarin-macios/issues/21342. --- src/vision.cs | 6 ++++++ tests/cecil-tests/Documentation.KnownFailures.txt | 1 + .../api-annotations-dotnet/common-Vision.ignore | 5 ----- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vision.cs b/src/vision.cs index 421972dfd212..a9e7ddb9ad92 100644 --- a/src/vision.cs +++ b/src/vision.cs @@ -38,6 +38,12 @@ namespace Vision { + [Partial] + interface VNUtils { + [Field ("VNVisionVersionNumber")] + double VisionVersionNumber { get; } + } + /// Enumerates errors associated with Vision requests. [ErrorDomain ("VNErrorDomain")] [MacCatalyst (13, 1)] diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index c8004636b0fe..db2e9ad2042c 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -79918,6 +79918,7 @@ P:Vision.VNTranslationalImageRegistrationRequest.Results P:Vision.VNTranslationalImageRegistrationRequest.SupportedRevisions P:Vision.VNTranslationalImageRegistrationRequest.WeakSupportedRevisions P:Vision.VNUtils.NormalizedIdentityRect +P:Vision.VNUtils.VisionVersionNumber P:Vision.VNVector.Length P:Vision.VNVector.R P:Vision.VNVector.SquaredLength diff --git a/tests/xtro-sharpie/api-annotations-dotnet/common-Vision.ignore b/tests/xtro-sharpie/api-annotations-dotnet/common-Vision.ignore index 4fca98ac62c5..022cd97667f7 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/common-Vision.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/common-Vision.ignore @@ -1,8 +1,3 @@ -# note: framework not available on watchOS - -## we do not expose internal framework versions -!missing-field! VNVisionVersionNumber not bound - ## called indirectly (there's a required native layer for them) !missing-pinvoke! VNImagePointForFaceLandmarkPoint is not bound !missing-pinvoke! VNNormalizedFaceBoundingBoxPointForLandmarkPoint is not bound From 5374856aa15288bbfc233662c3db5146c0453f84 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 3 Oct 2024 11:19:16 +0200 Subject: [PATCH 026/155] Bump API references to latest stable release. (#21355) --- Make.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Make.config b/Make.config index fb8642a8b92c..105b000f40ad 100644 --- a/Make.config +++ b/Make.config @@ -44,10 +44,10 @@ include $(TOP)/Make.versions # The value is taken from the name + version of the Ref pack. # Example: given the Ref pack "Microsoft.iOS.Ref.net8.0_17.5" with the version "17.5.8030", the value # to write here would be the part after "Microsoft.iOS.Ref." + "/" + version: "net8.0_17.5/17.5.8030" -STABLE_NUGET_VERSION_iOS=net8.0_17.5/17.5.8030 -STABLE_NUGET_VERSION_tvOS=net8.0_17.5/17.5.8030 -STABLE_NUGET_VERSION_MacCatalyst=net8.0_17.5/17.5.8030 -STABLE_NUGET_VERSION_macOS=net8.0_14.5/14.5.8030 +STABLE_NUGET_VERSION_iOS=net8.0_18.0/18.0.8303 +STABLE_NUGET_VERSION_tvOS=net8.0_18.0/18.0.8303 +STABLE_NUGET_VERSION_MacCatalyst=net8.0_18.0/18.0.8303 +STABLE_NUGET_VERSION_macOS=net8.0_15.0/15.0.8303 PACKAGE_HEAD_REV=$(shell git rev-parse HEAD) From 129ab97506238f0222a3b65e0d239cb22a6ec7df Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 3 Oct 2024 19:12:57 +0200 Subject: [PATCH 027/155] [tests] Fix generation for a few variables in test[-system].config. (#21344) Lines end with a newline character... --- tests/Makefile | 12 ++++++------ tests/generator/BGenTool.cs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Makefile b/tests/Makefile index 917286623b74..2f7cb8bf75a7 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -85,9 +85,9 @@ test.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Version.De @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(platform)_NUGET_REF_NAME=$($(platform)_NUGET_REF_NAME)\\n)" | sed 's/^ //' >> $@ @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(foreach rid,$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS),$(rid)_NUGET_RUNTIME_NAME=$($(rid)_NUGET_RUNTIME_NAME)\\n))" | sed 's/^ //' >> $@ @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),SUPPORTED_API_VERSIONS_$(platform)='$(SUPPORTED_API_VERSIONS_$(platform))'\\n)" | sed 's/^ //' >> $@ - @printf "ENABLE_XAMARIN=$(ENABLE_XAMARIN)" >> $@ - @printf "XCODE_IS_STABLE=$(XCODE_IS_STABLE)" >> $@ - @printf "XCODE_VERSION=$(XCODE_VERSION)" >> $@ + @printf "ENABLE_XAMARIN=$(ENABLE_XAMARIN)\n" >> $@ + @printf "XCODE_IS_STABLE=$(XCODE_IS_STABLE)\n" >> $@ + @printf "XCODE_VERSION=$(XCODE_VERSION)\n" >> $@ test-system.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Version.Details.xml @rm -f $@ @@ -119,9 +119,9 @@ test-system.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Ver @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(platform)_NUGET_REF_NAME=$($(platform)_NUGET_REF_NAME)\\n)" | sed 's/^ //' >> $@ @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(foreach rid,$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS),$(rid)_NUGET_RUNTIME_NAME=$($(rid)_NUGET_RUNTIME_NAME)\\n))" | sed 's/^ //' >> $@ @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),SUPPORTED_API_VERSIONS_$(platform)='$(SUPPORTED_API_VERSIONS_$(platform))'\\n)" | sed 's/^ //' >> $@ - @printf "ENABLE_XAMARIN=$(ENABLE_XAMARIN)" >> $@ - @printf "XCODE_IS_STABLE=$(XCODE_IS_STABLE)" >> $@ - @printf "XCODE_VERSION=$(XCODE_VERSION)" >> $@ + @printf "ENABLE_XAMARIN=$(ENABLE_XAMARIN)\n" >> $@ + @printf "XCODE_IS_STABLE=$(XCODE_IS_STABLE)\n" >> $@ + @printf "XCODE_VERSION=$(XCODE_VERSION)\n" >> $@ clean-local:: $(Q) $(SYSTEM_XBUILD) /t:Clean /p:Platform=iPhoneSimulator /p:Configuration=$(CONFIG) $(XBUILD_VERBOSITY) tests.sln diff --git a/tests/generator/BGenTool.cs b/tests/generator/BGenTool.cs index 68c3faafe80b..4326c98f24b0 100644 --- a/tests/generator/BGenTool.cs +++ b/tests/generator/BGenTool.cs @@ -247,7 +247,7 @@ public static void AddPreviewNoWarn (IList argumentList) public static string? GetPreviewNoWarn (string? existingNowarn) { if (Configuration.XcodeIsStable) - return null; + return existingNowarn; var previewNoWarn = $"XCODE_{Configuration.XcodeVersion.Major}_{Configuration.XcodeVersion.Minor}_PREVIEW"; if (string.IsNullOrEmpty (existingNowarn)) { From f800899ebc6696f701c7107d621df5058d61efce Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 3 Oct 2024 19:53:11 +0200 Subject: [PATCH 028/155] [tests] Include more information in asserts in MonoTouchFixtures.Security.RecordTest.DeskCase_83099_InmutableDictionary. (#21354) This will hopefully help us track down a random test failure in this test. Ref: https://github.com/xamarin/maccore/issues/868 --- tests/monotouch-test/Security/RecordTest.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/monotouch-test/Security/RecordTest.cs b/tests/monotouch-test/Security/RecordTest.cs index 411efbdc93c1..90b983432142 100644 --- a/tests/monotouch-test/Security/RecordTest.cs +++ b/tests/monotouch-test/Security/RecordTest.cs @@ -315,16 +315,16 @@ public void DeskCase_83099_InmutableDictionary () var testUsername = "testusername"; //TEST 1: Save a keychain value - var test1 = SaveUserPassword (testUsername, "testValue1"); - Assert.IsTrue (test1, "Password could not be saved to keychain"); + var test1 = SaveUserPassword (testUsername, "testValue1", out var queryCode, out var addCode, out var updateCode); + Assert.IsTrue (test1, $"Password could not be saved to keychain. queryCode: {queryCode} addCode: {addCode} updateCode: {updateCode}"); //TEST 2: Get the saved keychain value var test2 = GetUserPassword (testUsername); Assert.IsTrue (StringUtil.StringsEqual (test2, "testValue1", false)); //TEST 3: Update the keychain value - var test3 = SaveUserPassword (testUsername, "testValue2"); - Assert.IsTrue (test3, "Password could not be saved to keychain"); + var test3 = SaveUserPassword (testUsername, "testValue2", out queryCode, out addCode, out updateCode); + Assert.IsTrue (test3, "Password could not be saved to keychain. queryCode: {queryCode} addCode: {addCode} updateCode: {updateCode}"); //TEST 4: Get the updated keychain value var test4 = GetUserPassword (testUsername); @@ -353,14 +353,15 @@ public static string GetUserPassword (string username) return password; } - public static bool SaveUserPassword (string username, string password) + public static bool SaveUserPassword (string username, string password, out SecStatusCode queryCode, out SecStatusCode addCode, out SecStatusCode updateCode) { + addCode = (SecStatusCode) (-1); // pick a value that doesn't already exist in SecStatusCode + updateCode = (SecStatusCode) (-1); // pick a value that doesn't already exist in SecStatusCode var success = false; var searchRecord = CreateSecRecord (SecKind.InternetPassword, server: "Test1", account: username.ToLower () ); - SecStatusCode queryCode; var record = SecKeyChain.QueryAsRecord (searchRecord, out queryCode); if (queryCode == SecStatusCode.ItemNotFound) { record = CreateSecRecord (SecKind.InternetPassword, @@ -368,12 +369,12 @@ record = CreateSecRecord (SecKind.InternetPassword, account: username.ToLower (), valueData: NSData.FromString (password) ); - var addCode = SecKeyChain.Add (record); + addCode = SecKeyChain.Add (record); success = (addCode == SecStatusCode.Success); } if (queryCode == SecStatusCode.Success && record is not null) { record.ValueData = NSData.FromString (password); - var updateCode = SecKeyChain.Update (searchRecord, record); + updateCode = SecKeyChain.Update (searchRecord, record); success = (updateCode == SecStatusCode.Success); } return success; From b7a317d06c24a4602053db2e3782efd6c3f8602e Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 4 Oct 2024 10:00:27 +0200 Subject: [PATCH 029/155] [bgen] Improve performance a little bit when calling functions that return retained objects. (#21297) Instead of doing this: ```cs var obj = Runtime.GetINativeObject<T>(handle, false); NSObject.ReleaseDangerous (handle); ``` we now do this: ```cs var obj = Runtime.GetINativeObject<T>(handle, true); ``` Less generated code, and better performance too. This was found while investigating https://github.com/xamarin/xamarin-macios/issues/21290. --- src/bgen/Generator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bgen/Generator.cs b/src/bgen/Generator.cs index 6752ee0530a7..0208eba94716 100644 --- a/src/bgen/Generator.cs +++ b/src/bgen/Generator.cs @@ -2918,7 +2918,7 @@ void GetReturnsWrappers (MethodInfo mi, MemberInformation minfo, Type declaringT // protocol support means we can return interfaces and, as far as .NET knows, they might not be NSObject if (IsProtocolInterface (mi.ReturnType)) { cast_a = " Runtime.GetINativeObject<" + TypeManager.FormatType (minfo?.type ?? mi.DeclaringType, mi.ReturnType) + "> ("; - cast_b = ", false)!"; + cast_b = $", {(minfo?.is_return_release == true ? "true" : "false")})!"; } else if (minfo is not null && minfo.is_forced) { cast_a = " Runtime.GetINativeObject<" + TypeManager.FormatType (minfo.type, mi.ReturnType) + "> ("; cast_b = $", true, {minfo.is_forced_owns})!"; @@ -3686,7 +3686,7 @@ public void GenerateMethodBody (MemberInformation minfo, MethodInfo mi, string s if (shouldMarshalNativeExceptions) print ("Runtime.ThrowException (exception_gchandle);"); - if (minfo.is_return_release) { + if (minfo.is_return_release && !IsProtocolInterface (mi.ReturnType)) { // Make sure we generate the required signature in Messaging only if needed // bool_objc_msgSendSuper_IntPtr: for respondsToSelector: From 8bb8f6f82ce28ec01c6542f5ad93c3a77b203532 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Fri, 4 Oct 2024 16:09:10 -0400 Subject: [PATCH 030/155] [CI] Split variables to reduce needed rights. (#21371) Split the variables and document their usage. Because we are going to have to add more pipelines we want to limit the amount of secrets a new pipeline requests and uses. The split is as follows: - variables/common.yml: needed by all. - variables/api-scan.yml: needed by the api scan pipeline. - variables/signing.yml: needed by pipeline that need to perform signing. --------- Co-authored-by: Rolf Bjarne Kvinge --- tools/devops/automation/build-cronjob.yml | 2 +- tools/devops/automation/build-lego.yml | 4 +- tools/devops/automation/build-pipeline.yml | 6 +- .../devops/automation/build-pull-request.yml | 7 +-- .../templates/pipelines/api-diff-pipeline.yml | 16 ++--- .../pipelines/run-macos-tests-pipeline.yml | 6 +- .../pipelines/run-tests-pipeline.yml | 6 +- .../devops/automation/templates/variables.yml | 38 ------------ .../templates/variables/api-scan.yml | 3 + .../automation/templates/variables/common.yml | 61 +++++++++++++++++++ .../templates/variables/signing.yml | 7 +++ 11 files changed, 85 insertions(+), 71 deletions(-) delete mode 100644 tools/devops/automation/templates/variables.yml create mode 100644 tools/devops/automation/templates/variables/api-scan.yml create mode 100644 tools/devops/automation/templates/variables/common.yml create mode 100644 tools/devops/automation/templates/variables/signing.yml diff --git a/tools/devops/automation/build-cronjob.yml b/tools/devops/automation/build-cronjob.yml index ab229beac9fb..1e152985ae6a 100644 --- a/tools/devops/automation/build-cronjob.yml +++ b/tools/devops/automation/build-cronjob.yml @@ -16,7 +16,7 @@ parameters: default: false variables: -- template: templates/variables.yml +- template: templates/variables/common.yml - name: MaciosUploadPrefix value: '' diff --git a/tools/devops/automation/build-lego.yml b/tools/devops/automation/build-lego.yml index 4c52d4df3ae8..650d8cd2e46d 100644 --- a/tools/devops/automation/build-lego.yml +++ b/tools/devops/automation/build-lego.yml @@ -12,9 +12,7 @@ parameters: default: true variables: -- template: templates/variables.yml -- name: MaciosUploadPrefix - value: '' +- template: templates/variables/common.yml resources: repositories: diff --git a/tools/devops/automation/build-pipeline.yml b/tools/devops/automation/build-pipeline.yml index a7d0d72d8484..9f26ec4d5aed 100644 --- a/tools/devops/automation/build-pipeline.yml +++ b/tools/devops/automation/build-pipeline.yml @@ -169,11 +169,11 @@ variables: - ${{ if contains(variables['Build.DefinitionName'], 'private') }}: - template: templates/vsts-variables.yml - template: templates/common/vs-release-vars.yml@sdk-insertions - - template: templates/variables.yml + - template: templates/variables/common.yml + - template: templates/variables/api-scan.yml + - template: templates/variables/signing.yml - name: MicrobuildConnector value: 'MicroBuild Signing Task (DevDiv)' - - name: MaciosUploadPrefix - value: '' - name: DisablePipelineConfigDetector value: true diff --git a/tools/devops/automation/build-pull-request.yml b/tools/devops/automation/build-pull-request.yml index 8603fec56c9a..8f9752a25118 100644 --- a/tools/devops/automation/build-pull-request.yml +++ b/tools/devops/automation/build-pull-request.yml @@ -157,12 +157,9 @@ resources: name: 1ESPipelineTemplates/MicroBuildTemplate variables: -- template: templates/variables.yml +- template: templates/variables/common.yml +- template: templates/variables/api-scan.yml - template: templates/common/vs-release-vars.yml@sdk-insertions -- name: MicrobuildConnector - value: '' -- name: MaciosUploadPrefix - value: '' - name: Packaging.EnableSBOMSigning value: false diff --git a/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml b/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml index 0b9e55395b11..b91f24262f6b 100644 --- a/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml @@ -57,18 +57,12 @@ resources: endpoint: xamarin variables: -- ${{ if eq(parameters.isPR, false) }}: - - ${{ if contains(variables['Build.DefinitionName'], 'private') }}: - - template: ../vsts-variables.yml - - template: ../variables.yml - - name: MaciosUploadPrefix - value: '' - - name: DisablePipelineConfigDetector +- template: ../variables/common.yml +- name: DisablePipelineConfigDetector + ${{ if eq(parameters.isPR, false) }}: value: true -- ${{ else }}: - - template: ../variables.yml - - name: MaciosUploadPrefix - value: '' + ${{ else }}: + value: false stages: - template: ../api-diff-stage.yml diff --git a/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml b/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml index 1bf2a4b2c6d3..3a526b26a8d7 100644 --- a/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml @@ -202,11 +202,7 @@ resources: endpoint: xamarin variables: - - ${{ if contains(variables['Build.DefinitionName'], 'private') }}: - - template: ../vsts-variables.yml - - template: ../variables.yml - - name: MaciosUploadPrefix - value: '' + - template: ../variables/common.yml - name: DisablePipelineConfigDetector value: true diff --git a/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml b/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml index 1fde3871aaa4..10bb8c12a2aa 100644 --- a/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml @@ -104,11 +104,7 @@ resources: endpoint: xamarin variables: - - ${{ if contains(variables['Build.DefinitionName'], 'private') }}: - - template: ../vsts-variables.yml - - template: ../variables.yml - - name: MaciosUploadPrefix - value: '' + - template: ../variables/common.yml - name: DisablePipelineConfigDetector value: true diff --git a/tools/devops/automation/templates/variables.yml b/tools/devops/automation/templates/variables.yml deleted file mode 100644 index cabd95d39e32..000000000000 --- a/tools/devops/automation/templates/variables.yml +++ /dev/null @@ -1,38 +0,0 @@ -variables: -- ${{ if contains(variables['Build.DefinitionName'], 'private') }}: - - template: templates/vsts-variables.yml -- group: xamops-azdev-secrets -- group: Xamarin-Secrets -- group: Xamarin Signing -- group: Xamarin Release -- group: Xamarin Notarization -- group: XamarinCompatLab # provisionator-uri setting -- group: VSEng DTL secrets -- name: GitHub.Token # Override the GitHub.Token setting defined in the Xamarin Release group - value: $(github--pat--vs-mobiletools-engineering-service2) # Use a token dedicated to critical production workflows and help avoid GitHub throttling -- name: AzDoBuildAccess.Token - value: $(pat--xamarinc--build-access) -- name: system.debug - value: false -- name: SigningKeychain - value: "builder.keychain" -- name: VSDropsPrefix - value: 'https://vsdrop.corp.microsoft.com/file/v1/xamarin-macios/device-tests' -- name: USE_TCP_TUNNEL # Needed to ensure that devices uses the usb cable to communicate with the devices to run the tests. - value: true -- name: TeamName - value: 'xamarin-macios' -- name: PROVISIONATOR_CHANNEL - value: ${{ parameters.provisionatorChannel }} -- name: PRBuildPool - value: 'VSEng-Xamarin-RedmondMacBuildPool-iOS-Untrusted' -- name: PRBuildPoolUrl - value: 'https://devdiv.visualstudio.com/_settings/agentpools?poolId=366&view=agents' -- name: CIBuildPool - value: 'VSEng-Xamarin-RedmondMacBuildPool-iOS-Trusted' -- name: CIBuildPoolUrl - value: 'https://devdiv.visualstudio.com/_settings/agentpools?poolId=367&view=agents' -- name: CIBuild - value: true -- name: BUILD_REVISION - value: azure-devops-$(Build.SourceVersion) diff --git a/tools/devops/automation/templates/variables/api-scan.yml b/tools/devops/automation/templates/variables/api-scan.yml new file mode 100644 index 000000000000..0d3b37c119be --- /dev/null +++ b/tools/devops/automation/templates/variables/api-scan.yml @@ -0,0 +1,3 @@ +variables: +- name: TeamName + value: 'xamarin-macios' diff --git a/tools/devops/automation/templates/variables/common.yml b/tools/devops/automation/templates/variables/common.yml new file mode 100644 index 000000000000..6ae19e0d4d38 --- /dev/null +++ b/tools/devops/automation/templates/variables/common.yml @@ -0,0 +1,61 @@ +variables: +# provisionator-uri setting +- group: XamarinCompatLab + +# allow to override the provisionator channel via a paramter +- name: PROVISIONATOR_CHANNEL + value: ${{ parameters.provisionatorChannel }} + +- group: xamops-azdev-secrets + +# needed to install the dev certificates in the build machine +- group: Xamarin Notarization +- group: Xamarin Signing + +# Override the GitHub.Token setting defined in the Xamarin Release group +# Use a token dedicated to critical production workflows and help avoid GitHub throttling +# this variable comes from the Xamarin-Secrets group, so we have do have both together +- group: Xamarin-Secrets +- name: GitHub.Token + value: $(github--pat--vs-mobiletools-engineering-service2) + +# Overrude the azdo build access, as with the GitHub token, this variables depend on the +# Xamarin-Secrets group. +- name: AzDoBuildAccess.Token + value: $(pat--xamarinc--build-access) + +- name: AzDoBuildAccess.Token + value: $(pat--xamarinc--build-access) + +# keying to use for the sining +- name: SigningKeychain + value: "builder.keychain" + +# Needed to ensure that devices uses the usb cable to communicate with the devices to run the tests. +- name: USE_TCP_TUNNEL + value: true + +# pool information +- name: PRBuildPool + value: 'VSEng-Xamarin-RedmondMacBuildPool-iOS-Untrusted' +- name: PRBuildPoolUrl + value: 'https://devdiv.visualstudio.com/_settings/agentpools?poolId=366&view=agents' +- name: CIBuildPool + value: 'VSEng-Xamarin-RedmondMacBuildPool-iOS-Trusted' +- name: CIBuildPoolUrl + value: 'https://devdiv.visualstudio.com/_settings/agentpools?poolId=367&view=agents' + +# override the default build revision +- name: BUILD_REVISION + value: azure-devops-$(Build.SourceVersion) + +- name: MaciosUploadPrefix + value: '' + +# set the pipeline to debug mode or not +- name: system.debug + value: false + +# point to the vsdrops that we will be using for the diff uploads. +- name: VSDropsPrefix + value: 'https://vsdrop.corp.microsoft.com/file/v1/xamarin-macios/device-tests' diff --git a/tools/devops/automation/templates/variables/signing.yml b/tools/devops/automation/templates/variables/signing.yml new file mode 100644 index 000000000000..dcfc58ec54fa --- /dev/null +++ b/tools/devops/automation/templates/variables/signing.yml @@ -0,0 +1,7 @@ +# signing related variables +variables: +- group: Xamarin-Secrets +- group: Xamarin Signing +- group: Xamarin Release +- group: Xamarin Notarization +- group: VSEng DTL secrets From 1dc54f624165eee9a1dd602dabd5ba92caa62250 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Mon, 7 Oct 2024 09:14:28 -0400 Subject: [PATCH 031/155] [CI] Remove stages related to the old pkg signing and notarization. (#21376) Clean the CI from all references to the old pkg notarisation and signing. - Remove the templates that did the jobs. - Remove the parameters that allowed to skip the signing and notarisation. - Remove the references to the scripts. This simplifies greatly the yaml. --- tools/devops/automation/build-cronjob.yml | 6 - tools/devops/automation/build-lego.yml | 6 - tools/devops/automation/build-pipeline.yml | 17 - .../devops/automation/build-pull-request.yml | 17 - .../automation/publish-pr-html-results.yml | 6 - tools/devops/automation/scripts/notarize.ps1 | 21 -- .../automation/templates/build/build-pkgs.yml | 4 - .../templates/build/build-stage.yml | 5 - .../automation/templates/common/checkout.yml | 3 - .../automation/templates/main-stage.yml | 42 --- .../templates/pipelines/api-diff-pipeline.yml | 6 - .../templates/pipelines/build-pipeline.yml | 18 - .../pipelines/run-macos-tests-pipeline.yml | 6 - .../pipelines/run-tests-pipeline.yml | 6 - .../artifact-github-comment.yml | 43 --- .../templates/sign-and-notarized/funnel.yml | 193 ----------- .../sign-and-notarized/prepare-pkg-stage.yml | 50 --- .../templates/sign-and-notarized/setup.yml | 77 ----- .../sign-and-notarized/sign-and-notarized.yml | 136 -------- .../sign-and-notarized/upload-azure.yml | 327 ------------------ tools/devops/automation/vs-insertion.yml | 6 - 21 files changed, 995 deletions(-) delete mode 100644 tools/devops/automation/scripts/notarize.ps1 delete mode 100644 tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml delete mode 100644 tools/devops/automation/templates/sign-and-notarized/funnel.yml delete mode 100644 tools/devops/automation/templates/sign-and-notarized/prepare-pkg-stage.yml delete mode 100644 tools/devops/automation/templates/sign-and-notarized/setup.yml delete mode 100644 tools/devops/automation/templates/sign-and-notarized/sign-and-notarized.yml delete mode 100644 tools/devops/automation/templates/sign-and-notarized/upload-azure.yml diff --git a/tools/devops/automation/build-cronjob.yml b/tools/devops/automation/build-cronjob.yml index 1e152985ae6a..a632e6b367b7 100644 --- a/tools/devops/automation/build-cronjob.yml +++ b/tools/devops/automation/build-cronjob.yml @@ -44,12 +44,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - trigger: - main diff --git a/tools/devops/automation/build-lego.yml b/tools/devops/automation/build-lego.yml index 650d8cd2e46d..206cd16e14eb 100644 --- a/tools/devops/automation/build-lego.yml +++ b/tools/devops/automation/build-lego.yml @@ -38,12 +38,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - trigger: branches: include: diff --git a/tools/devops/automation/build-pipeline.yml b/tools/devops/automation/build-pipeline.yml index 9f26ec4d5aed..19aebaec5301 100644 --- a/tools/devops/automation/build-pipeline.yml +++ b/tools/devops/automation/build-pipeline.yml @@ -35,11 +35,6 @@ parameters: type: boolean default: false - - name: skipESRP - displayName: Skip ESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - - name: pushNugets type: boolean displayName: 'Push Nugets (dotnet)' @@ -155,12 +150,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - - repository: CustomPipelineTemplates type: git name: 1ESPipelineTemplates/MicroBuildTemplate @@ -231,7 +220,6 @@ extends: exclude: - repository: yaml-templates - repository: sdk-insertions - - repository: release-scripts stages: - template: templates/main-stage.yml parameters: @@ -242,14 +230,9 @@ extends: pool: ${{ parameters.pool }} runGovernanceTests: ${{ parameters.runGovernanceTests }} forceInsertion: ${{ parameters.forceInsertion }} - skipESRP: ${{ parameters.skipESRP }} pushNugets: ${{ parameters.pushNugets }} pushNugetsToMaestro: ${{ parameters.pushNugetsToMaestro }} ${{ if ne(length(parameters.testConfigurations), 0)}}: testConfigurations: ${{ parameters.testConfigurations }} deviceTestsConfigurations: ${{ parameters.deviceTestsConfigurations }} macTestsConfigurations: ${{ parameters.macTestsConfigurations }} - signingSetupSteps: - - template: ./templates/sign-and-notarized/setup.yml - parameters: - isPR: false diff --git a/tools/devops/automation/build-pull-request.yml b/tools/devops/automation/build-pull-request.yml index 8f9752a25118..ec6c90b03844 100644 --- a/tools/devops/automation/build-pull-request.yml +++ b/tools/devops/automation/build-pull-request.yml @@ -36,11 +36,6 @@ parameters: type: boolean default: false -- name: skipESRP - displayName: Skip ESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - - name: testConfigurations displayName: Test configurations to run type: object @@ -146,12 +141,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - - repository: CustomPipelineTemplates type: git name: 1ESPipelineTemplates/MicroBuildTemplate @@ -216,7 +205,6 @@ extends: exclude: - repository: yaml-templates - repository: sdk-insertions - - repository: release-scripts stages: - template: templates/main-stage.yml parameters: @@ -227,14 +215,9 @@ extends: pool: ${{ parameters.pool }} runGovernanceTests: ${{ parameters.runGovernanceTests }} forceInsertion: ${{ parameters.forceInsertion }} - skipESRP: ${{ parameters.skipESRP }} pushNugets: false pushNugetsToMaestro: false ${{ if ne(length(parameters.testConfigurations), 0)}}: testConfigurations: ${{ parameters.testConfigurations }} deviceTestsConfigurations: ${{ parameters.deviceTestsConfigurations }} macTestsConfigurations: ${{ parameters.macTestsConfigurations }} - signingSetupSteps: - - template: ./templates/sign-and-notarized/setup.yml - parameters: - isPR: true diff --git a/tools/devops/automation/publish-pr-html-results.yml b/tools/devops/automation/publish-pr-html-results.yml index fd58eddcaf96..623a08c408c3 100644 --- a/tools/devops/automation/publish-pr-html-results.yml +++ b/tools/devops/automation/publish-pr-html-results.yml @@ -29,12 +29,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - - repository: macios.ci type: github name: xamarin/macios.ci diff --git a/tools/devops/automation/scripts/notarize.ps1 b/tools/devops/automation/scripts/notarize.ps1 deleted file mode 100644 index cd507cbf1740..000000000000 --- a/tools/devops/automation/scripts/notarize.ps1 +++ /dev/null @@ -1,21 +0,0 @@ -$summaryPath = "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/xamarin-macios/tests/TestSummary.md" -try { - # Notarize - & "$Env:BUILD_SOURCESDIRECTORY/release-scripts/notarize.ps1" -FolderForApps $Env:BUILD_SOURCESDIRECTORY/package/notarized - - # Verify that the notarized output is valid - $notarizedRoot = Join-Path $Env:BUILD_SOURCESDIRECTORY package notarized - Get-ChildItem -Path $notarizedRoot -Filter *.pkg -Recurse -File | ForEach-Object { - Write-Debug "pkgutil --check-signature $($_.FullName)" - pkgutil --check-signature "$($_.FullName)" - if ($LastExitCode -eq 0) { - Write-Debug "Signature check of $($_.FullName) succeeded." - } else { - Write-Debug "Signature check of $($_.FullName) failed (exit code: $LastExitCode)." - throw "Signature check of $($_.FullName) failed (exit code: $LastExitCode)." - } - } -} catch { - Add-Content -Path $summaryPath -Value "# :x: Notarization (ESRP) failed :x:`n`n```````n$PSItem`n```````n" - throw -} diff --git a/tools/devops/automation/templates/build/build-pkgs.yml b/tools/devops/automation/templates/build/build-pkgs.yml index b37b7d06ca8b..7863cb18177f 100644 --- a/tools/devops/automation/templates/build/build-pkgs.yml +++ b/tools/devops/automation/templates/build/build-pkgs.yml @@ -20,10 +20,6 @@ parameters: type: boolean default: true - - name: skipESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - - name: isPR type: boolean diff --git a/tools/devops/automation/templates/build/build-stage.yml b/tools/devops/automation/templates/build/build-stage.yml index 950196987a92..a9abc74ee9d5 100644 --- a/tools/devops/automation/templates/build/build-stage.yml +++ b/tools/devops/automation/templates/build/build-stage.yml @@ -14,10 +14,6 @@ parameters: - name: xqaCertPass type: string - - name: skipESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - - name: pool type: string default: automatic @@ -97,4 +93,3 @@ jobs: keyringPass: ${{ parameters.keyringPass }} gitHubToken: ${{ parameters.gitHubToken }} xqaCertPass: ${{ parameters.xqaCertPass }} - skipESRP: ${{ parameters.skipESRP }} diff --git a/tools/devops/automation/templates/common/checkout.yml b/tools/devops/automation/templates/common/checkout.yml index 6996389bff39..961ccd305307 100644 --- a/tools/devops/automation/templates/common/checkout.yml +++ b/tools/devops/automation/templates/common/checkout.yml @@ -36,9 +36,6 @@ steps: - checkout: yaml-templates clean: true -- checkout: release-scripts - clean: true - - pwsh: ./clean_git_vsts.ps1 -GithubToken "$(GitHub.Token)" -MaccorePath "$(System.DefaultWorkingDirectory)/maccore" displayName: 'Clean git mess from VSTS' workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts diff --git a/tools/devops/automation/templates/main-stage.yml b/tools/devops/automation/templates/main-stage.yml index fe218dcc51e9..2a9f3bf0cf53 100644 --- a/tools/devops/automation/templates/main-stage.yml +++ b/tools/devops/automation/templates/main-stage.yml @@ -24,10 +24,6 @@ parameters: type: boolean default: false - - name: skipESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - - name: pushNugets type: boolean default: true # default to true until otherwhise @@ -159,10 +155,6 @@ parameters: - name: macTestsConfigurations type: object - - name: signingSetupSteps - type: stepList - default: [] - - name: legacyPackageJobs type: object default: [ @@ -264,7 +256,6 @@ stages: keyringPass: $(pass--lab--mac--builder--keychain) gitHubToken: $(Github.Token) xqaCertPass: $(xqa--certificates--password) - skipESRP: ${{ parameters.skipESRP }} pool: ${{ parameters.pool }} - stage: build_macos_tests @@ -284,23 +275,6 @@ stages: xqaCertPass: $(xqa--certificates--password) pool: ${{ parameters.pool }} - - stage: prepare_packages_legacy - displayName: '${{ parameters.stageDisplayNamePrefix }}Prepare legacy packages' - condition: and(eq(dependencies.build_packages.result, 'Succeeded'), eq('${{ parameters.enableLegacySigning }}', true)) - dependsOn: - - build_packages - - configure_build - jobs: - - template: ./sign-and-notarized/prepare-pkg-stage.yml - parameters: - isPR: ${{ parameters.isPR }} - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - signingSetupSteps: ${{ parameters.signingSetupSteps }} - keyringPass: $(pass--lab--mac--builder--keychain) - skipESRP: ${{ parameters.skipESRP }} - packages: ${{ parameters.legacyPackageJobs }} - # .NET Release Prep and VS Insertion Stages, only execute them when the build comes from an official branch and is not a schedule build from OneLoc # setting the stage at this level makes the graph of the UI look better, else the lines overlap and is not clear. - ? ${{ if @@ -328,19 +302,3 @@ stages: commit: ${{ parameters.commit }} pushNugets: ${{ parameters.pushNugets }} pushNugetsToMaestro: ${{ parameters.pushNugetsToMaestro }} - - - stage: funnel - displayName: '${{ parameters.stageDisplayNamePrefix }}Collect signed artifacts' - condition: and(eq(dependencies.prepare_packages_legacy.result, 'Succeeded'), eq('${{ parameters.enableLegacySigning }}', true)) - dependsOn: - - prepare_packages_legacy - - configure_build - jobs: - - template: ./sign-and-notarized/funnel.yml - parameters: - isPR: ${{ parameters.isPR }} - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - packages: # flatten the pkgs for the parameter - - ${{ each pkg in parameters.legacyPackageJobs }}: - - ${{ pkg }} diff --git a/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml b/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml index b91f24262f6b..7ae6cc065a13 100644 --- a/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml @@ -50,12 +50,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - variables: - template: ../variables/common.yml - name: DisablePipelineConfigDetector diff --git a/tools/devops/automation/templates/pipelines/build-pipeline.yml b/tools/devops/automation/templates/pipelines/build-pipeline.yml index 6b6415af3731..9967da9d5c98 100644 --- a/tools/devops/automation/templates/pipelines/build-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/build-pipeline.yml @@ -37,11 +37,6 @@ parameters: type: boolean default: false -- name: skipESRP - displayName: Skip ESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - - name: pushNugets type: boolean default: true @@ -55,10 +50,6 @@ parameters: type: boolean default: false -- name: signingSetupSteps - type: stepList - default: [] - - name: testConfigurations displayName: Test configurations to run type: object @@ -164,13 +155,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - - variables: - ${{ if eq(parameters.isPR, false) }}: - ${{ if contains(variables['Build.DefinitionName'], 'private') }}: @@ -202,7 +186,6 @@ stages: runGovernanceTests: ${{ parameters.runGovernanceTests }} enableAPIDiff: ${{ parameters.enableAPIDiff }} forceInsertion: ${{ parameters.forceInsertion }} - skipESRP: ${{ parameters.skipESRP }} pushNugets: ${{ parameters.pushNugets }} pushNugetsToMaestro: ${{ parameters.pushNugetsToMaestro }} ${{ if ne(length(parameters.testConfigurations), 0)}}: @@ -211,4 +194,3 @@ stages: macTestsConfigurations: ${{ parameters.macTestsConfigurations }} azureStorage: ${{ variables['azureStorage'] }} azureContainer: ${{ variables['azureContainer'] }} - signingSetupSteps: ${{ parameters.signingSetupSteps }} diff --git a/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml b/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml index 3a526b26a8d7..30aefb1eabde 100644 --- a/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml @@ -195,12 +195,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - variables: - template: ../variables/common.yml - name: DisablePipelineConfigDetector diff --git a/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml b/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml index 10bb8c12a2aa..d40034d6782f 100644 --- a/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml @@ -97,12 +97,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/only_codesign - endpoint: xamarin - variables: - template: ../variables/common.yml - name: DisablePipelineConfigDetector diff --git a/tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml b/tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml deleted file mode 100644 index 75a7a6ae8731..000000000000 --- a/tools/devops/automation/templates/sign-and-notarized/artifact-github-comment.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Job that will download the other artifact from the build and will add a comment with the contents. -parameters: - -- name: isPR - type: boolean - -- name: repositoryAlias - type: string - default: self - -- name: commit - type: string - default: HEAD - -steps: - -- template: ../common/checkout.yml - parameters: - isPR: ${{ parameters.isPR }} - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - -- template: ../build/download-artifacts.yml - parameters: - runTests: false # we do not run tests on builds - enableAPIDiff: false # we do not run the api diff here. - -- pwsh: | - Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY\xamarin-macios\tools\devops\automation\scripts\MaciosCI.psd1 - $artifact = New-ArtifactsFromJsonFile -Path "$Env:ARTIFACTS_JSON_PATH" - $gihubComments = New-GitHubCommentsObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $Env:GITHUB_TOKEN -Hash $Env:COMMENT_HASH - $result = $gihubComments.NewCommentFromObject("Artifacts", ":books:", $artifact, "artifacts") - Write-Host $result - env: - GITHUB_TOKEN: $(GitHub.Token) - ACCESSTOKEN: $(System.AccessToken) - ${{ if eq(parameters.repositoryAlias, 'self') }}: - COMMENT_HASH: $(GIT_HASH) - ${{ else }}: - COMMENT_HASH: $(Build.SourceVersion) - displayName: 'Create github comment.' - enabled: true - timeoutInMinutes: 10 diff --git a/tools/devops/automation/templates/sign-and-notarized/funnel.yml b/tools/devops/automation/templates/sign-and-notarized/funnel.yml deleted file mode 100644 index 36ed9035e0be..000000000000 --- a/tools/devops/automation/templates/sign-and-notarized/funnel.yml +++ /dev/null @@ -1,193 +0,0 @@ -# funnel job that will download all the signed artifacts and puts them in the final location -parameters: -- name: packages - type: object - -- name: isPR - type: boolean - -- name: repositoryAlias - type: string - default: self - -- name: commit - type: string - default: HEAD - -- name: uploadPrefix - type: string - default: '$(MaciosUploadPrefix)' - -jobs: -- job: funnel_job - displayName: 'Collect signed artifacts' - condition: and(not(failed()), not(canceled())) # default is succeded(), but that fails if there are any skipped jobs, so change the condition to !failed && !cancelled - timeoutInMinutes: 1000 - variables: - AgentPoolComputed: $[ stageDependencies.configure_build.AgentPoolSelector.outputs['setAgentPool.AgentPoolComputed'] ] - ${{ each pkg in parameters.packages }}: - ${{ pkg.conditionVariable }}: $[ stageDependencies.configure_build.configure.outputs['configure_platforms.${{ pkg.conditionVariable }}'] ] - - pool: - os: macOS - name: $(AgentPoolComputed) - - steps: - - # DO NOT USE THE checkout.yml template. The reason is that the template changes the hash which results in a problem with the artifacts scripts - - template: sdk-unified/steps/checkout/v1.yml@yaml-templates - parameters: - resource: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - clean: true - submodules: recursive - path: s/xamarin-macios - - - checkout: maccore - clean: true - persistCredentials: true # hugely important, else there are some scripts that check a single file from maccore that will fail - - - checkout: yaml-templates - clean: true - - - checkout: release-scripts - clean: true - - - pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' - - - bash: | - sudo rm -Rf $(Build.SourcesDirectory)/package - sudo rm -Rf $(Build.SourcesDirectory)/classic-*-signed - sudo rm -Rf $(Build.SourcesDirectory)/package-internal - displayName: "Remove artifacts" - condition: always() - - - bash: | - mkdir -p $(Build.SourcesDirectory)/package/notarized - displayName: 'Create target directories.' - - - ${{ each pkg in parameters.packages }}: - - task: DownloadPipelineArtifact@2 - displayName: Download notarized build ${{ pkg.name }} - condition: ne('', variables['${{ pkg.conditionVariable }}']) - inputs: - artifact: '${{ parameters.uploadPrefix }}classic-${{ pkg.name }}-signed' - allowFailedBuilds: true - path: '$(Build.ArtifactStagingDirectory)/classic-${{ pkg.name }}-signed' - - - bash: | - set -x - set -e - - FULL_PATH="$(Build.ArtifactStagingDirectory)/classic-${{ pkg.name }}-signed" - ls -lR $FULL_PATH - cp -a "$FULL_PATH/." "$(Build.SourcesDirectory)/package" - displayName: 'Move pkg ${{ pkg.name }} to its final destination' - condition: ne('', variables['${{ pkg.conditionVariable }}']) - - - template: generate-workspace-info.yml@yaml-templates - parameters: - GitHubToken: $(GitHub.Token) - ArtifactDirectory: $(Build.SourcesDirectory)/package-internal - - # download workload json and add it to out package internal dir, this allows the rest of jobs - # not to need several artifacts but just package-internal - - task: DownloadPipelineArtifact@2 - displayName: Download WorkloadRollback.json - inputs: - patterns: '**/WorkloadRollback.json' - allowFailedBuilds: true - path: $(Build.SourcesDirectory)/package-internal - - - task: 1ES.PublishPipelineArtifact@1 - displayName: 'Publish Build Artifacts (notarized)' - inputs: - path: $(Build.SourcesDirectory)/package-internal - artifact: '${{ parameters.uploadPrefix }}package-internal' - continueOnError: true - - # download msbuild.zip and bundle.zip to the 'package' dir, so that they're uploaded into the 'package' artifact, - # since we later depend on these files being there later. - - task: DownloadPipelineArtifact@2 - displayName: Download msbuild.zip and bundle.zip - inputs: - patterns: | - not-signed-package/msbuild.zip - not-signed-package/bundle.zip - allowFailedBuilds: true - path: $(Build.SourcesDirectory)/not-signed-package - - - bash: | - set -x - set -e - ls -la "$BUILD_SOURCESDIRECTORY"/not-signed-package - cp "$BUILD_SOURCESDIRECTORY"/not-signed-package/not-signed-package/*.zip "$BUILD_SOURCESDIRECTORY"/package - ls -la "$BUILD_SOURCESDIRECTORY"/package - displayName: Copy msbuild.zip and bundle.zip to the package artifact - - - task: 1ES.PublishPipelineArtifact@1 - displayName: 'Publish Build Artifacts (notarized)' - inputs: - path: $(Build.SourcesDirectory)/package - artifact: '${{ parameters.uploadPrefix }}package' - continueOnError: true - -# This job uploads the pkgs generated by the build step in the azure blob storage. This has to be done in a different job -# because the azure blob storate tools DO NOT work on mac OS meaning that we need a bot running Windows. build uploads the contents -# to the pipeline artefacts and we download and upload to azure in this job. -- job: upload_azure_blob - displayName: 'Upload packages to Azure & SBOM' - timeoutInMinutes: 1000 - templateContext: # disable some of the sdl tasks for this job - sdl: - credscan: # run in the sdl stage - enabled: false - binskim: # job does not compile anything - enabled: false - eslint: # no js or anything similar - enabled: false - bandit: # we have no python - enabled: false - dependsOn: - - funnel_job - condition: and(not(failed()), not(canceled())) # default is succeded(), but that fails if there are any skipped jobs, so change the condition to !failed && !cancelled - - variables: - Parameters.outputStorageUri: '' - SKIP_NUGETS: $[ stageDependencies.configure_build.configure.outputs['labels.skip_nugets'] ] - INCLUDE_LEGACY_IOS: $[ stageDependencies.configure_build.configure.outputs['configure_platforms.INCLUDE_LEGACY_IOS'] ] - INCLUDE_LEGACY_MAC: $[ stageDependencies.configure_build.configure.outputs['configure_platforms.INCLUDE_LEGACY_MAC'] ] - - pool: - name: azurepipelines-EO - demands: - - ImageOverride -equals 1ESPT-Windows2022 - steps: - - template: upload-azure.yml - parameters: - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - sbomFilter: '*.nupkg;*.pkg;*.msi' - -# Job that runs on a vm that downloads the artifacts information and adds a github comment pointing to the results of the build. -- job: artifacts_github_comment - displayName: 'Publish GitHub Comment - Artifacts' - timeoutInMinutes: 1000 - dependsOn: - - upload_azure_blob - condition: succeededOrFailed() - variables: - PR_ID: $[ stageDependencies.configure_build.configure.outputs['labels.pr_number'] ] - TESTS_BOT: $[ stageDependencies.build_packages.build.outputs['build.TESTS_BOT'] ] # we build in a diff bot than the ones used for the comments - GIT_HASH: $[ stageDependencies.build_packages.build.outputs['fix_commit.GIT_HASH'] ] - pool: - name: AzurePipelines-EO - demands: - - ImageOverride -equals 1ESPT-Windows2022 - steps: - - template: artifact-github-comment.yml - parameters: - isPR: ${{ parameters.isPR }} - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} diff --git a/tools/devops/automation/templates/sign-and-notarized/prepare-pkg-stage.yml b/tools/devops/automation/templates/sign-and-notarized/prepare-pkg-stage.yml deleted file mode 100644 index 54c4bf3a98e5..000000000000 --- a/tools/devops/automation/templates/sign-and-notarized/prepare-pkg-stage.yml +++ /dev/null @@ -1,50 +0,0 @@ -parameters: - -- name: keyringPass - type: string - -- name: skipESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - -- name: signingSetupSteps - type: stepList - default: [] - -- name: isPR - type: boolean - -- name: repositoryAlias - type: string - default: self - -- name: commit - type: string - default: HEAD - -- name: packages - type: object - default: [] - -jobs: -- ${{ each pkg in parameters.packages }}: - - job: ${{ pkg.job }} - dependsOn: - displayName: 'Sign & Notarize ${{ pkg.name }}' - condition: ne(stageDependencies.configure_build.configure.outputs['configure_platforms.${{ pkg.conditionVariable }}'],'') - timeoutInMinutes: 1000 - pool: - name: 'VSEng-Xamarin-RedmondMacBuildPool-iOS-Trusted' # always use the trusted pool for signing. - os: macOS - - steps: - - template: sign-and-notarized.yml - parameters: - isPR: ${{ parameters.isPR }} - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - signingSetupSteps: ${{ parameters.signingSetupSteps }} - keyringPass: ${{ parameters.keyringPass }} - skipESRP: ${{ parameters.skipESRP }} - packageName: ${{ pkg.name }} - packagePattern: ${{ pkg.pattern }} diff --git a/tools/devops/automation/templates/sign-and-notarized/setup.yml b/tools/devops/automation/templates/sign-and-notarized/setup.yml deleted file mode 100644 index b6c212bf4f7a..000000000000 --- a/tools/devops/automation/templates/sign-and-notarized/setup.yml +++ /dev/null @@ -1,77 +0,0 @@ -# template that setups all the diff plugins needed to perform the sign and notarize step -parameters: - -- name: signatureType - type: string - default: 'Real' - -- name: isPR - type: boolean - -- name: repositoryAlias - type: string - default: self - -- name: commit - type: string - default: HEAD - -- name: condition - default: succeeded() - -steps: - -# DO NOT USE THE checkout.yml template. The reason is that the template changes the hash which results in a problem with the artifacts scripts -- template: sdk-unified/steps/checkout/v1.yml@yaml-templates - parameters: - resource: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - clean: true - submodules: recursive - path: s/xamarin-macios - -- checkout: maccore - clean: true - persistCredentials: true # hugely important, else there are some scripts that check a single file from maccore that will fail - -- checkout: yaml-templates - clean: true - -- checkout: release-scripts - clean: true - -# the ddsign plugin needs this version or it will crash and will make the sign step fail - -- ${{ if eq(parameters.isPR, false) }}: - - task: UsePythonVersion@0 - inputs: - versionSpec: '3.11.x' - - - task: UseDotNet@2 - inputs: - packageType: sdk - version: 3.x - displayName: 'Install .NET Core SDK 3.x needed for ESRP' - - - pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' - - - task: MicroBuildSigningPlugin@4 - displayName: 'Install Signing Plugin' - inputs: - signType: '${{ parameters.signatureType }}' - azureSubscription: $(MicrobuildConnector) - zipSources: false # we do not use the feature and makes the installation to last 10/12 mins instead of < 1 min - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - condition: ${{ parameters.condition }} - - - task: MicroBuildSigningPlugin@4 - displayName: 'Install Notarizing Plugin' - inputs: - signType: 'Real' # test is not present for mac.. - azureSubscription: $(MicrobuildConnector) - zipSources: false # we do not use the feature and makes the installation to last 10/12 mins instead of < 1 min - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - condition: ${{ parameters.condition }} diff --git a/tools/devops/automation/templates/sign-and-notarized/sign-and-notarized.yml b/tools/devops/automation/templates/sign-and-notarized/sign-and-notarized.yml deleted file mode 100644 index d4b403888828..000000000000 --- a/tools/devops/automation/templates/sign-and-notarized/sign-and-notarized.yml +++ /dev/null @@ -1,136 +0,0 @@ -# Provides all the steps to sign and notarize pks and msi -parameters: - -- name: signatureType - type: string - default: 'Real' - -- name: skipESRP - type: boolean - default: false # only to be used when testing the CI and we do not need a signed pkg - -- name: keyringPass - type: string - -- name: packageName - type: string - -- name: packagePattern - type: string - -- name: condition - default: succeeded() - -- name: signingSetupSteps - type: stepList - default: [] - -- name: isPR - type: boolean - -- name: repositoryAlias - type: string - default: self - -- name: commit - type: string - default: HEAD - -- name: uploadPrefix - type: string - default: '$(MaciosUploadPrefix)' - -steps: - -- ${{ each step in parameters.signingSetupSteps }}: - - ${{ each pair in step }}: - ${{ pair.key }}: ${{ pair.value }} - -- bash: | - sudo rm -Rf $(Build.SourcesDirectory)/package - displayName: "Remove artifacts" - condition: always() - -- task: DownloadPipelineArtifact@2 - displayName: Download not notarized build - inputs: - artifact: '${{ parameters.uploadPrefix }}not-signed-package' - patterns: ${{ parameters.packagePattern }} - allowFailedBuilds: true - path: $(Build.SourcesDirectory)/package - -- bash: | - set -x - set -e - - PACKAGES=$(find $(Build.SourcesDirectory)/package -type f -name "${{ parameters.packagePattern }}" | xargs basename) - if [ -z "$PACKAGES" ]; then - echo "Packages ${{ parameters.packageName }} not found." - else - PACKAGES_PATH="$(Build.SourcesDirectory)/package/$PACKAGES" - set +x - echo "##vso[task.setvariable variable=PACKAGES;]$PACKAGES_PATH" - echo "${{ parameters.packageName }} package found at $PACKAGES_PATH" - set -x - fi - displayName: 'Retrieve packages to sign' - condition: ${{ parameters.condition }} - timeoutInMinutes: 180 - -- bash: $(Build.SourcesDirectory)/xamarin-macios/tools/devops/automation/scripts/disable-codeql-arm64.sh - displayName: 'Disable CodeQL' - name: disableCodeQLOnArm64 - -- ${{ if and(eq(parameters.skipESRP, false), eq(parameters.isPR, false)) }}: - - bash: | - set -exo pipefail - if [[ "$SYSTEM_DEBUG" == "true" ]]; then - export ESRP_TEMP="$WORKING_DIR/esrp" - echo "Temp dir is $ESRP_TEMP" - mkdir -p "$ESRP_TEMP" - fi - - echo "$PACKAGES" | xargs -t python3 $(Build.SourcesDirectory)/release-scripts/esrp_sign.py -vv -c "8025" -d $(Build.SourcesDirectory)/package/notarized -e "$MAC_ENTITLEMENTS" - ls -R $(Build.SourcesDirectory)/package - env: - WORKING_DIR: $(System.DefaultWorkingDirectory) - PRODUCTSIGN_KEYCHAIN_PASSWORD: ${{ parameters.keyringPass }} - MAC_ENTITLEMENTS: $(Build.SourcesDirectory)/xamarin-macios/mac-entitlements.plist - name: notarize - displayName: 'Signing Release Build (ESRP)' - timeoutInMinutes: 180 - condition: ${{ parameters.condition }} - -- ${{ if eq(parameters.isPR, false) }}: - - task: ArchiveFiles@1 - displayName: 'Archive ESRP temp' - inputs: - rootFolder: '$(System.DefaultWorkingDirectory)/esrp' - includeRootFolder: false - archiveFile: '$(Build.ArtifactStagingDirectory)/esrp.zip' - continueOnError: true - condition: ${{ and(eq(parameters.condition, true), eq(variables['System.debug'], 'true')) }} - - # Upload the esrp temp dir - - task: 1ES.PublishPipelineArtifact@1 - displayName: 'Publish Artifact: ESRP temp' - inputs: - path: '$(Build.ArtifactStagingDirectory)/esrp.zip' - artifact: '${{ parameters.uploadPrefix }}ESRP-tmp-${{ parameters.packageName }}' - continueOnError: true - condition: ${{ and(eq(parameters.condition, true), eq(variables['System.debug'], 'true')) }} - -- ${{ if eq(parameters.isPR, false) }}: - - task: PowerShell@2 - inputs: - filePath: $(Build.SourcesDirectory)/xamarin-macios/tools/devops/automation/scripts/notarize.ps1 - displayName: 'Notarize & verify packages (ESRP)' - condition: ${{ parameters.condition }} - -# always upload no matter what, since if we are not signing we need the artifact in the pipeline -- task: 1ES.PublishPipelineArtifact@1 - displayName: 'Publish Notarized Classic Artifacts' - inputs: - path: $(Build.SourcesDirectory)/package - artifact: '${{ parameters.uploadPrefix }}classic-${{ parameters.packageName }}-signed' - continueOnError: true diff --git a/tools/devops/automation/templates/sign-and-notarized/upload-azure.yml b/tools/devops/automation/templates/sign-and-notarized/upload-azure.yml deleted file mode 100644 index 24aa23ad50d0..000000000000 --- a/tools/devops/automation/templates/sign-and-notarized/upload-azure.yml +++ /dev/null @@ -1,327 +0,0 @@ -parameters: -- name: sbomFilter - type: string - default: '*' # Supports multiple filters separated by semi-colon such as *.msi;*.nupkg - -- name: repositoryAlias - type: string - default: self - -- name: commit - type: string - default: HEAD - -- name: uploadPrefix - type: string - default: '$(MaciosUploadPrefix)' - -- name: packages - type: object - default: [ - "package", - ] - -steps: -# Do not use the templates/common/checkout.yaml for this job else the azure upload tool will fail because -# it cannot find the correct branch to be used. -- template: sdk-unified/steps/checkout/v1.yml@yaml-templates - parameters: - resource: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - clean: true - persistCredentials: true - path: s/xamarin-macios - -- checkout: maccore - clean: true - persistCredentials: true # hugely important, else there are some scripts that check a single file from maccore that will fail - -# checkout an extra repo to ensure that we have the same tree structure in the working directory in all pipelines. -# if you delete this checkout the unified pipeline will have issues. -- checkout: yaml-templates - clean: true - -- pwsh: | - if (Test-Path "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/artifacts" -PathType Container) { - Remove-Item -Path "$Env:BUILD_SOURCESDIRECTORY/artifacts" -Force -Recurse - } - displayName: "Remove artifacts" - condition: always() - -# Download the Html Report that was added by the tests job. -- ${{ each pkg in parameters.packages }}: - - task: DownloadPipelineArtifact@2 - displayName: Download packages - inputs: - artifactName: ${{ parameters.uploadPrefix }}${{ pkg }} - allowFailedBuilds: true - path: $(Build.SourcesDirectory)/artifacts/${{ parameters.uploadPrefix }}${{ pkg }} - -- pwsh: | - Get-ChildItem -Path "$(Build.SourcesDirectory)\\artifacts" - displayName: "Show downloaded artifacts" - -- pwsh: | - $DropServiceUrl = "https://devdiv.artifacts.visualstudio.com/DefaultCollection" - $StatusDropUrl = "https://vsdrop.microsoft.com/file/v1" - $BuildShortHash = "$(Build.SourceVersion)".subString(0, 7) - $ProjectPathUrl = "Products/$(System.TeamProject)/$(Build.Repository.Name)/$(Build.SourceBranchName)/$BuildShortHash/$(Build.BuildId)" - $PackagePrefix = "$StatusDropUrl/$ProjectPathUrl/${{ parameters.uploadPrefix }}package" - - Write-Host "##vso[task.setvariable variable=PackagePrefix]$PackagePrefix" - displayName: "Set drop status URL variables" - -- pwsh: | - $files = Get-ChildItem -Path "$(Build.SourcesDirectory)\\artifacts\\${{ parameters.uploadPrefix }}package" -File -Force -Name - $manifestFile = "$(Build.SourcesDirectory)\\artifacts\${{ parameters.uploadPrefix }}package\\manifest" - foreach ($f in $files) { - Add-Content -Path "$manifestFile" -Value "$(PackagePrefix);$f" - } - Add-Content -Path "$manifestFile" -Value "$(PackagePrefix);$artifacts.json" - Add-Content -Path "$manifestFile" -Value "$(PackagePrefix);manifest" - env: - VIRTUAL_PATH: $(Build.SourceBranchName)/$(Build.SourceVersion)/$(Build.BuildId) - displayName: "Build manifest" - -# Important needed for the next step -- template: generate-workspace-info.yml@yaml-templates - parameters: - GitHubToken: $(GitHub.Token) - ArtifactDirectory: $(Build.SourcesDirectory)/${{ parameters.uploadPrefix }}package-internal - -- template: upload-to-drop/v1.yml@yaml-templates - parameters: - SourcesDirectory: $(Build.SourcesDirectory)/xamarin-macios - ArtifactsDirectory: $(Build.SourcesDirectory)/artifacts/${{ parameters.uploadPrefix }}package - Azure.DropPrefix: ${{ parameters.uploadPrefix }}package - GitHub.Context: 'vsts-devdiv artifacts' - -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' - -- pwsh: | - Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY\\xamarin-macios\\tools\\devops\\automation\\scripts\\MaciosCI.psd1 - $statuses = New-GitHubStatusesObjectFromUrl -Url "$(Build.Repository.Uri)" -Token $(GitHub.Token) - - Dir "$(Build.SourcesDirectory)\\artifacts\\${{ parameters.uploadPrefix }}package" - - # the azure step sets the env variable, but it points to the wrong url since it uses the one in bosstorage, we - # need to use the dl version. - $pkgsVirtualUrl = "$(PackagePrefix)" - Write-Host "Urls is $pkgsVirtualUrl" - - $pkgsPath = "$(Build.SourcesDirectory)\\artifacts\\${{ parameters.uploadPrefix }}package" - - $iOSPkg = Get-ChildItem -Path $pkgsPath -File -Force -Name xamarin.ios-*.pkg - Write-Host "iOS PKG is $iOSPkg" - - - if ($Env:BUILD_REASON -eq "PullRequest") { - $notarizedShouldExist = $false; - } else { - $notarizedShouldExist = $true; - } - - # create an array with objects so that we can set each of the statuses: - if (![string]::IsNullOrEmpty($Env:INCLUDE_LEGACY_IOS)) { - $iOSPkg = Get-ChildItem -Path $pkgsPath -File -Force -Name xamarin.ios-*.pkg - Write-Host "iOS PKG is $iOSPkg" - - $statusInfo += @( - @{ - Path = "$pkgsPath\\$iOSPkg"; - Context = "PKG-Xamarin.iOS"; - Description = $iOSPkg; - TargetUrl = "$pkgsVirtualUrl;$iOSPkg"; - Error = "xamarin.ios pkg not found"; - ShouldExist = $true; - }, - @{ - Path = "$pkgsPath\\notarized\\xamarin.ios-*.pkg"; - Context = "PKG-Xamarin.iOS-notarized" - Description = "$iOSPkg (Notarized)" ; - TargetUrl = "$pkgsVirtualUrl/notarized;$iOSPkg" ; - Error = "Notarized xamarin.ios pkg not found" ; - ShouldExist = $notarizedShouldExist; - } - ) - } else { - Write-Host "Legacy iOS build is disabled" - } - - if (![string]::IsNullOrEmpty($Env:INCLUDE_LEGACY_MAC)) { - $macPkg = Get-ChildItem -Path $pkgsPath -File -Force -Name xamarin.mac-*.pkg - Write-Host "mac PKG is $macPkg" - - $statusInfo += @( - @{ - Path = "$pkgsPath\\xamarin.mac-*.pkg" ; - Context = "PKG-Xamarin.Mac" ; - Description = "$macPkg" ; - TargetUrl = "$pkgsVirtualUrl;$macPkg" ; - Error = "xamarin.mac pkg not found." ; - ShouldExist = $true; - }, - @{ - Path = "$pkgsPath\\notarized\\xamarin.mac-*.pkg" ; - Context = "PKG-Xamarin.Mac-notarized" ; - Description = "$macPkg (Notarized)" ; - TargetUrl = "$pkgsVirtualUrl/notarized;$macPkg" ; - Error = "Notarized xamarin.mac pkg not found." ; - ShouldExist = $notarizedShouldExist; - } - ) - } else { - Write-Host "Legacy macOS build is disabled" - } - - # bundle.zip and msbuild.zip should always exist - $statusInfo += @( - @{ - Path = "$pkgsPath\\bundle.zip" ; - Context = "bundle.zip" ; - Description = "bundle.zip" ; - TargetUrl = "$pkgsVirtualUrl;bundle.zip" ; - Error = "bundle.zip not found." ; - ShouldExist = $true; - }, - @{ - Path = "$pkgsPath\msbuild.zip" ; - Context = "msbuild.zip" ; - Description = "msbuild.zip" ; - TargetUrl = "$pkgsVirtualUrl;msbuild.zip" ; - Error = "msbuild.zip not found." ; - ShouldExist = $true; - } - ) - - foreach ($info in $statusInfo) { - if (Test-Path $info.Path -PathType Leaf) { - $statuses.SetStatus("success", $info.Description, $info.Context, $info.TargetUrl) - } elseif ($info.ShouldExist) { - $statuses.SetStatus("error", $info.Error, $info.Context) - } - } - - $msi = Get-ChildItem -Path $pkgsPath -Filter *.msi -File -Name - - foreach ($n in $msi) { - $statuses.SetStatus("success", "$n", "$n", "$pkgsVirtualUrl;$n") - } - - Write-Host "Setting SBOM.PackagesPath: ${pkgsPath}" - Write-Host "##vso[task.setvariable variable=SBOM.PackagesPath]$pkgsPath" - env: - GITHUB_TOKEN: $(GitHub.Token) - ACCESSTOKEN: $(System.AccessToken) - VIRTUAL_PATH: $(Build.SourceBranchName)/$(Build.SourceVersion)/$(Build.BuildId) - displayName: 'Set GithubStatus' - -# Executive Order (EO): Software Bill of Materials (SBOM): https://www.1eswiki.com/wiki/ADO_sbom_Generator -- pwsh: | - # https://stackoverflow.com/questions/188892/glob-pattern-matching-in-net - function Is-Match([string] $Text, [string] $Filter) - { - $isMatch = $false - - $regexGlobEquivalent = [Regex]::Escape($Filter).Replace("\*", ".*").Replace("\?", ".") - $pattern = "^${regexGlobEquivalent}$" - - # https://stackoverflow.com/questions/42700341/how-can-i-use-powershell-to-do-a-net-regex-matches-method-and-add-a-timeout - $regEx = New-Object -TypeName regex -ArgumentList $pattern, ([Text.RegularExpressions.RegexOptions]::Singleline, [Text.RegularExpressions.RegexOptions]::IgnoreCase) - $isMatch = $regEx.IsMatch($Text) - - return $isMatch - } - - $filter = "${{ parameters.sbomFilter }}" - Write-Host "sbomFilter: ${filter}" - - $sbomStagingDirectory = "$(Build.ArtifactStagingDirectory)/sbom" - Write-Host "Creating SBOM staging directory: ${sbomStagingDirectory}" - - if (-not ([IO.Directory]::Exists($sbomStagingDirectory))) { - [IO.Directory]::CreateDirectory($sbomStagingDirectory) - } - - $pkgsPath = "$(SBOM.PackagesPath)" - Write-Host "Packages path: ${pkgsPath}" - - if ([string]::IsNullOrEmpty($filter)) { - $filter = '*' # Even if the caller attempts to force the parameter to an empty string treat empty as all '*' - } - - $filters = $filter.Split(';', [StringSplitOptions]::RemoveEmptyEntries) - Write-Host "Copying files based on ${filter}" - - $files = [IO.Directory]::GetFiles($pkgsPath) - $files | foreach { - $filename = [IO.Path]::GetFileName($_) - $isMatch = $false - $filters | foreach { - if (-not $isMatch) { - $isMatch = Is-Match -Text $filename -Filter $_ - } - } - - if ($isMatch) { - $destPathAndFilename = [IO.Path]::Combine($sbomStagingDirectory, $filename) - Write-Host "Copying $_ to ${destPathAndFilename}. Filter: ${filter}" - [IO.File]::Copy($_, $destPathAndFilename) - } else { - Write-Host "Skipped file copy based on filter ${filter}: ${filename}" - } - } - displayName: 'SBOM: Staging' - -- pwsh: | - function Get-PackageFileNames([string] $PkgsPath) { - $files = [IO.Directory]::GetFiles($PkgsPath) - $pkgFiles = $files | foreach { [IO.Path]::GetFileName($_) } - return $pkgFiles - } - - $pkgsPath = "$(SBOM.PackagesPath)" - Write-Host "Packages path: ${pkgsPath}" - - $packageFileNames = Get-PackageFileNames -PkgsPath $pkgsPath - $packageFileNames = @($packageFileNames) - Write-Host "Package files: $($packageFileNames.Count)" - $packageFileNames | foreach { Write-Host $_ } - - Write-Host "Setting SBOM.ProductName: Xamarin iOS" - Write-Host "##vso[task.setvariable variable=SBOM.ProductName]Xamarin iOS" # SBOM generation only lets us use a single package name and so choose 'Xamarin iOS' instead of 'Xamarin Mac' - - $sbomManifestVersion = "$(Build.BuildId)" - Write-Host "Setting SBOM.ProductVersion to the build number: ${sbomManifestVersion}" - Write-Host "##vso[task.setvariable variable=SBOM.ProductVersion]$sbomManifestVersion" - displayName: 'SBOM: Set ProductVersion' - -- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 - displayName: 'SBOM: Generation' - inputs: - BuildDropPath: '$(Build.ArtifactStagingDirectory)/sbom' - PackageName: '$(SBOM.ProductName)' - PackageVersion: '$(SBOM.ProductVersion)' - Verbosity: Verbose - -- pwsh: | - # The pkg files are already included under the drop-x64 and drop-arm locations - # We only needed them temporarily here as a means to produce the Software Bill of Materials (SBOM) manifest - # No need to include the pkg files (and duplicate them) in the SBOM drop - $sbomStagingDirectory = "$(Build.ArtifactStagingDirectory)/sbom" - - # Delete all top-level package files. This should leave the SBOM '_manifest' directory intact - $pkgFiles = [IO.Directory]::GetFiles($sbomStagingDirectory) - $pkgFiles | foreach { - Write-Host "Deleting PKG: $_" - [IO.File]::Delete($_) - } - displayName: 'SBOM: Cleanup' - -- task: 1ES.PublishPipelineArtifact@1 - displayName: 'SBOM: Publish' - inputs: - artifact: '${{ parameters.uploadPrefix }}sbom' - path: $(Build.ArtifactStagingDirectory)/sbom - condition: succeeded() diff --git a/tools/devops/automation/vs-insertion.yml b/tools/devops/automation/vs-insertion.yml index 177ae4456788..31d7d1b7d754 100644 --- a/tools/devops/automation/vs-insertion.yml +++ b/tools/devops/automation/vs-insertion.yml @@ -21,12 +21,6 @@ resources: ref: refs/heads/main endpoint: xamarin - - repository: release-scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/sign-and-notarized - endpoint: xamarin - # we need all stages to be completed, else we do not have the test results, this trigger is just for CI, because we have # but because we have device issues, and it needs to be gree to trigger, we will deal with it later pipelines: From 5ef0d91b33122c6587ae0378ac2b2b47c99749a8 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 7 Oct 2024 18:14:01 +0200 Subject: [PATCH 032/155] [msbuild/tests] Use 'dotnet test' for the MSBuild tests (take 2). (#21363) This is another step towards removing Mono. This required a few changes: * Nullability updates in test code. * Explicitly sorted list of strings in a warning message, to make the warning text stable. * Stopped allowing the test assemblies to see internals of the task assembly. This was necessary for to solve a problem with duplicate types: * The netstandard2.0 version of `System.Reflection.Metadata.dll` contains the `UnconditionalSuppressMessageAttribute` type (internally). * Since we ILMerge the tasks assembly, this type ends up in Xamarin.iOS.Tasks.dll (internally). * The test assembly can't be a net472 assembly, because that means using the netfx/desktop versions of the Microsoft.Build.* assemblies, which don't work on .NET (they check for Mono, but .NET isn't Mono, so the check fails and a PlatformNotSupportedException is thrown). * So I bumped the test assembly to be a net8.0 assembly, but then there's a conflict between the `UnconditionalSuppressMessageAttribute` shipped in .NET vs the one in `Xamarin.iOS.Tasks.dll` (because the test assembly can see the internals of `Xamarin.iOS.Tasks.dll`). * The fix that _doesn't work_ is to not merge system assemblies in the `Xamarin.iOS.Tasks.dll` assembly anymore. `Xamarin.iOS.Tasks.Windows.dll` already does this, but it doesn't work when building remotely. * The fix that seems to work is to just not allow the test assemblies to see the internals of the task assembly. This is really an anti-pattern anyway, so no big loss. This required a few changes (make some API in the task assembly public, remove some legacy tests that don't apply anymore in .NET, etc.) --- msbuild/Makefile | 9 +- .../Properties/AssemblyInfo.cs | 3 - .../Tasks/ComputeCodesignItems.cs | 2 +- .../Tasks/ResolveNativeReferences.cs | 2 +- .../Properties/AssemblyInfo.cs | 3 - tests/Makefile | 16 ++- .../TaskTests/CompileAppManifestTaskTests.cs | 4 +- .../TaskTests/CompileEntitlementsTaskTests.cs | 4 +- .../ComputeCodesignItemsTaskTests.cs | 8 +- .../TaskTests/MTouchTaskTests.cs | 107 ------------------ .../ResolveNativeReferencesTaskTest.cs | 4 +- .../Xamarin.MacDev.Tasks.Tests.csproj | 17 +-- .../TestHelpers/BuildEngine.cs | 2 +- .../Xamarin.MacDev.Tests.csproj | 6 +- .../Jenkins/NUnitTestTasksEnumerable.cs | 28 ++--- 15 files changed, 49 insertions(+), 166 deletions(-) diff --git a/msbuild/Makefile b/msbuild/Makefile index 373a0c5642dc..f614321fc427 100644 --- a/msbuild/Makefile +++ b/msbuild/Makefile @@ -546,13 +546,8 @@ install-local:: $(MSBUILD_PRODUCTS) @echo Targets files are valid XML @touch $@ -test run-test: run-test-ios run-test-mac - -run-test-ios: - $(MAKE) -C $(TOP)/tests test-ios-tasks - -run-test-mac: - $(MAKE) -C $(TOP)/tests run-mac-msbuild +test run-test run-tests tests run-tests-msbuild: + $(Q) $(MAKE) -C $(TOP)/tests run-tests-msbuild clean-local:: git clean -xfdq diff --git a/msbuild/Xamarin.Mac.Tasks/Properties/AssemblyInfo.cs b/msbuild/Xamarin.Mac.Tasks/Properties/AssemblyInfo.cs index 90fec8c96c9e..552667a2136e 100644 --- a/msbuild/Xamarin.Mac.Tasks/Properties/AssemblyInfo.cs +++ b/msbuild/Xamarin.Mac.Tasks/Properties/AssemblyInfo.cs @@ -8,6 +8,3 @@ [assembly: AssemblyProductAttribute ("Xamarin.Mac.Tasks")] [assembly: AssemblyTitleAttribute ("Xamarin.Mac.Tasks")] [assembly: AssemblyVersionAttribute (VersionConstants.XamarinMacVersion)] - -[assembly: InternalsVisibleTo ("Xamarin.MacDev.Tasks.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")] -[assembly: InternalsVisibleTo ("Xamarin.MacDev.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")] diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs index 085e9f067b25..c001208bcb51 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeCodesignItems.cs @@ -161,7 +161,7 @@ public override bool Execute () for (var i = 1; i < all.Length; i++) { var nextMetadata = all [i].CloneCustomMetadataToDictionary (); if (nextMetadata.Count != firstMetadata.Count) { - Log.LogWarning (MSBStrings.W7095, /* Code signing has been requested multiple times for '{0}', with different metadata. The metadata for one are: '{1}', while the metadata for the other are: '{2}' */ group.Key, string.Join (", ", firstMetadata.Keys), string.Join (", ", nextMetadata.Keys)); + Log.LogWarning (MSBStrings.W7095, /* Code signing has been requested multiple times for '{0}', with different metadata. The metadata for one are: '{1}', while the metadata for the other are: '{2}' */ group.Key, string.Join (", ", firstMetadata.Keys.OrderBy (v => v)), string.Join (", ", nextMetadata.Keys.OrderBy (v => v))); } else { foreach (var kvp in firstMetadata) { if (!nextMetadata.TryGetValue (kvp.Key, out var nextValue)) { diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs index 0d39e8e91a00..60cdf434d23b 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs @@ -444,7 +444,7 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFr /// The target architectures /// A relative path to the resolved native library within the xcframework. /// True if a native library was successfully found. Otherwise false, and an error will have been printed to the log. - internal static bool TryResolveXCFramework (TaskLoggingHelper log, PDictionary plist, string xcframeworkPath, string targetFrameworkMoniker, bool isSimulator, string architectures, [NotNullWhen (true)] out string? nativeLibraryPath) + public static bool TryResolveXCFramework (TaskLoggingHelper log, PDictionary plist, string xcframeworkPath, string targetFrameworkMoniker, bool isSimulator, string architectures, [NotNullWhen (true)] out string? nativeLibraryPath) { nativeLibraryPath = null; var platform = PlatformFrameworkHelper.GetFramework (targetFrameworkMoniker); diff --git a/msbuild/Xamarin.iOS.Tasks/Properties/AssemblyInfo.cs b/msbuild/Xamarin.iOS.Tasks/Properties/AssemblyInfo.cs index 7295e77dcd44..f4fbada51c3e 100644 --- a/msbuild/Xamarin.iOS.Tasks/Properties/AssemblyInfo.cs +++ b/msbuild/Xamarin.iOS.Tasks/Properties/AssemblyInfo.cs @@ -8,6 +8,3 @@ [assembly: AssemblyProductAttribute ("Xamarin.iOS.Tasks")] [assembly: AssemblyTitleAttribute ("Xamarin.iOS.Tasks")] [assembly: AssemblyVersionAttribute (VersionConstants.XamarinIOSVersion)] - -[assembly: InternalsVisibleTo ("Xamarin.MacDev.Tasks.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")] -[assembly: InternalsVisibleTo ("Xamarin.MacDev.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")] diff --git a/tests/Makefile b/tests/Makefile index 2f7cb8bf75a7..43868d18a19b 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -214,18 +214,22 @@ killall: @killall "iOS Simulator" >/dev/null 2>&1 || true @killall Touch.Server >/dev/null 2>&1 || true -NUNIT_MSBUILD_DIR=$(TOP)/packages/NUnit.Runners.2.6.4/tools/lib -test-ios-tasks: test-macdev-tests test-macdev-tasks +test-msbuild run-tests-msbuild: + $(MAKE) test-macdev-tests test-macdev-tasks +# Example TEST_FILTER: +# TEST_FILTER="--filter FullyQualifiedName~BuildMyCocoaApp" +# Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tests: export MSBUILD_EXE_PATH= test-macdev-tests: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) build "/bl:$@.binlog" $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj /p:Configuration=Debug $(DOTNET_BUILD_VERBOSITY) - cd $(TOP)/tests/msbuild/Xamarin.MacDev.Tests && $(SYSTEM_XIBUILD) -t -- $(abspath $(TOP)/tools/nunit3-console-3.11.1) $(abspath $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/bin/Debug/net472/Xamarin.MacDev.Tests.dll) "--result=$(abspath $(CURDIR)/TestResults_Xamarin.MacDev.Tests.xml);format=nunit2" -labels=After $(TEST_FIXTURE) + $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj $(TEST_FILTER) +# Example TEST_FILTER: +# TEST_FILTER="--filter FullyQualifiedName~BuildMyCocoaApp" +# Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tasks: export MSBUILD_EXE_PATH= test-macdev-tasks: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) build "/bl:$@.binlog" $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj /p:Configuration=Debug $(DOTNET_BUILD_VERBOSITY) - cd $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests && $(SYSTEM_XIBUILD) -t -- $(abspath $(TOP)/tools/nunit3-console-3.11.1) $(abspath $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/bin/Debug/net472/Xamarin.MacDev.Tasks.Tests.dll) "--result=$(abspath $(CURDIR)/TestResults_Xamarin.MacDev.Tasks.Tests.xml)" -labels=After $(TEST_FIXTURE) + $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj $(TEST_FILTER) mac-test-package.zip: ifdef INCLUDE_MAC diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs index 94463d1d8ab1..00c3fa08f935 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs @@ -21,8 +21,8 @@ CompileAppManifest CreateTask (string? tmpdir = null, ApplePlatform platform = A task.AssemblyName = "AssemblyName"; task.AppBundleName = "AppBundleName"; task.CompiledAppManifest = new TaskItem (Path.Combine (tmpdir, "TemporaryAppManifest.plist")); - task.DefaultSdkVersion = Sdks.GetAppleSdk (platform).GetInstalledSdkVersions (false).First ().ToString (); - task.SdkVersion = task.DefaultSdkVersion; + task.DefaultSdkVersion = Sdks.GetAppleSdk (platform).GetInstalledSdkVersions (false).First ().ToString ()!; + task.SdkVersion = task.DefaultSdkVersion ?? string.Empty; task.TargetFrameworkMoniker = TargetFramework.GetTargetFramework (platform, true).ToString (); return task; diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs index 00c90fc9d9a1..17186c306f29 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs @@ -34,8 +34,8 @@ CustomCompileEntitlements CreateEntitlementsTask (out string compiledEntitlement task.AppBundleDir = AppBundlePath; task.BundleIdentifier = "com.xamarin.MySingleView"; task.CompiledEntitlements = new TaskItem (Path.Combine (MonoTouchProjectObjPath, "Entitlements.xcent")); - task.Entitlements = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "Entitlements.plist"); - task.ProvisioningProfile = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "profile.mobileprovision"); + task.Entitlements = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "Entitlements.plist"); + task.ProvisioningProfile = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "profile.mobileprovision"); task.SdkPlatform = "iPhoneOS"; task.SdkVersion = "6.1"; task.TargetFrameworkMoniker = "Xamarin.iOS,v1.0"; diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs index 9255a818a2fc..d72eecdb893b 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ComputeCodesignItemsTaskTests.cs @@ -496,7 +496,7 @@ public void DuplicatedWithDifferentMetadata (ApplePlatform platform, bool isDotN Assert.AreEqual (3, Engine.Logger.WarningsEvents.Count, "Warning Count"); Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata 'OnlyIn1=true' has been set for one item, but not the other.", Engine.Logger.WarningsEvents [0].Message, "Message #0"); Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata 'InOneAndTwoWithDifferentValues' has different values for each item (once it's '1', another time it's '2').", Engine.Logger.WarningsEvents [1].Message, "Message #1"); - Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata for one are: 'RequireCodeSigning, OnlyIn1, InOneAndTwoWithDifferentValues, CodesignStampFile', while the metadata for the other are: 'RequireCodeSigning, CodesignStampFile'", Engine.Logger.WarningsEvents [2].Message, "Message #2"); + Assert.AreEqual ("Code signing has been requested multiple times for 'Bundle.app/Contents/MonoBundle/createdump', with different metadata. The metadata for one are: 'CodesignStampFile, InOneAndTwoWithDifferentValues, OnlyIn1, RequireCodeSigning', while the metadata for the other are: 'CodesignStampFile, RequireCodeSigning'", Engine.Logger.WarningsEvents [2].Message, "Message #2"); VerifyCodesigningResults (infos, task.OutputCodesignItems, platform); } finally { @@ -532,7 +532,7 @@ void VerifyCodesigningResults (CodesignInfo [] infos, ITaskItem [] outputCodesig var metadata = item.GetMetadata (kvp.Key); if (metadata == string.Empty && kvp.Value != string.Empty) { failures.Add ($"Item '{info.ItemSpec}': Expected metadata '{kvp.Key}' not found (with value '{kvp.Value}')."); - } else if (!string.Equals (metadata, kvp.Value)) { + } else if (!string.Equals (metadata, kvp.Value, StringComparison.Ordinal)) { failures.Add ($"Item '{info.ItemSpec}': Expected value '{kvp.Value}' for metadata '{kvp.Key}', but got '{metadata}' instead.\nExpected: {kvp.Value}\nActual: {metadata}"); } } @@ -587,7 +587,7 @@ void Touch (string root, params string [] files) if (file.EndsWith (".appex", StringComparison.OrdinalIgnoreCase) || file.EndsWith (".app", StringComparison.OrdinalIgnoreCase)) { Directory.CreateDirectory (f); } else { - Directory.CreateDirectory (Path.GetDirectoryName (file)); + Directory.CreateDirectory (Path.GetDirectoryName (file)!); File.WriteAllText (file, string.Empty); } } @@ -637,7 +637,7 @@ public static Dictionary CopyCustomMetadata (this ITaskItem self { var rv = new Dictionary (); foreach (DictionaryEntry de in self.CloneCustomMetadata ()) { - rv [(string) de.Key] = (string) de.Value; + rv [(string) de.Key!] = (string) de.Value!; } return rv; } diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MTouchTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MTouchTaskTests.cs index 0f357b4c8d1e..8831a7b4890a 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MTouchTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MTouchTaskTests.cs @@ -206,26 +206,6 @@ public void BuildEntitlementFlagsTest () Assert.That (args, Does.Contain ("Entitlements.plist"), "#2"); } - [Test] - public void ReferenceFrameworkFileResolution_WhenReceivedReferencePathExists () - { - using (var sdk = new TempSdk ()) { - Task.TargetFrameworkMoniker = "MonoTouch,v1.0"; - - var expectedPath = Path.Combine (Cache.CreateTemporaryDirectory (), "tmpfile"); - - Task.References = new [] { new TaskItem (expectedPath, new Dictionary { { "FrameworkFile", "true" } }) }; - - var args = Task.GenerateCommandLineCommands (); - - if (Environment.OSVersion.Platform == PlatformID.Win32NT) - // In Windows, the path slashes are escaped. - expectedPath = expectedPath.Replace ("\\", "\\\\"); - - Assert.IsTrue (Task.ResponseFile.Contains (expectedPath)); - } - } - [Test] public void ResponseFileTest () { @@ -233,70 +213,6 @@ public void ResponseFileTest () Assert.IsTrue (args.Contains ($"@{Task.ResponseFilePath}"), "#@response-file"); } - [TestCase ("Xamarin.iOS,v1.0", "Xamarin.iOS")] - public void ReferenceFrameworkFileResolution_WhenFacadeFileExists (string targetFrameworkMoniker, string frameworkDir) - { - using (var sdk = new TempSdk ()) { - Task.TargetFrameworkMoniker = targetFrameworkMoniker; - var expectedPath = Path.Combine (Sdks.XamIOS.LibDir, "mono", frameworkDir, "Facades", "System.Collections.dll"); - Directory.CreateDirectory (Path.GetDirectoryName (expectedPath)); - File.WriteAllText (expectedPath, ""); - - Task.References = new [] { new TaskItem ("System.Collections.dll", new Dictionary { { "FrameworkFile", "true" } }) }; - - var args = Task.GenerateCommandLineCommands (); - - if (Environment.OSVersion.Platform == PlatformID.Win32NT) - // In Windows, the path slashes are escaped. - expectedPath = expectedPath.Replace ("\\", "\\\\"); - - Assert.IsTrue (Task.ResponseFile.Contains (expectedPath), string.Format ( - @"Failed to resolve facade assembly to the Sdk path. - Expected path:{0} - - Actual args:{1}", expectedPath, Task.ResponseFile)); - } - } - - [TestCase ("Xamarin.iOS,v1.0", "Xamarin.iOS")] - public void ReferenceFrameworkFileResolution_WhenFrameworkFileExists (string targetFrameworkMoniker, string frameworkDir) - { - using (var sdk = new TempSdk ()) { - Task.TargetFrameworkMoniker = targetFrameworkMoniker; - var expectedPath = Path.Combine (Sdks.XamIOS.LibDir, "mono", frameworkDir, "System.Collections.dll"); - Directory.CreateDirectory (Path.GetDirectoryName (expectedPath)); - File.WriteAllText (expectedPath, ""); - - Task.References = new [] { new TaskItem ("System.Collections.dll", new Dictionary { { "FrameworkFile", "true" } }) }; - - var args = Task.GenerateCommandLineCommands (); - - if (Environment.OSVersion.Platform == PlatformID.Win32NT) - // In Windows, the path slashes are escaped. - expectedPath = expectedPath.Replace ("\\", "\\\\"); - - Assert.IsTrue (Task.ResponseFile.Contains (expectedPath), string.Format ( - @"Failed to resolve facade assembly to the Sdk path. - Expected path:{0} - - Actual args:{1}", expectedPath, Task.ResponseFile)); - } - } - - [TestCase ("Xamarin.iOS,v1.0", "Xamarin.iOS")] - public void ReferenceFrameworkFileResolution_WhenResolutionFails (string targetFrameworkMoniker, string frameworkDir) - { - using (var sdk = new TempSdk ()) { - Task.TargetFrameworkMoniker = targetFrameworkMoniker; - - Task.References = new [] { new TaskItem ("/usr/foo/System.Collections.dll", new Dictionary { { "FrameworkFile", "true" } }) }; - - var args = Task.GenerateCommandLineCommands (); - - Assert.IsTrue (Task.ResponseFile.Contains ("/usr/foo/System.Collections.dll")); - } - } - [Test] public void NativeReference_None () { @@ -344,28 +260,5 @@ public void NativeReference_Framework () // 3 additional files (as we do not duplicate the TaskItem for the native library itself) Assert.That (items.Count (), Is.EqualTo (3), "framework files"); } - - class TempSdk : IDisposable { - MonoTouchSdk sdk; - - public TempSdk () - { - SdkDir = Cache.CreateTemporaryDirectory (); - Directory.CreateDirectory (Path.Combine (SdkDir, "bin")); - File.WriteAllText (Path.Combine (SdkDir, "Version"), "1.0.0.0"); // Fake Version file so that MonoTouchSdk detects this as a real Sdk location. - File.WriteAllText (Path.Combine (SdkDir, "bin", "mtouch"), "echo \"fake mtouch\""); // Fake mtouch binary so that MonoTouchSdk detects this as a real Sdk location. - Directory.CreateDirectory (Path.Combine (SdkDir, "lib")); - sdk = Sdks.XamIOS; - - Sdks.XamIOS = new MonoTouchSdk (SdkDir); - } - - public string SdkDir { get; private set; } - - public void Dispose () - { - Sdks.XamIOS = sdk; - } - } } } diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs index 838d1be627ce..148849779358 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs @@ -38,7 +38,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a // some architecture changes recently, e.g. // in Xcode 12.1+ watchOS does not have an i386 architecture anymore // on Xcode 12.2+ you get arm64 for all (iOS, tvOS and watchOS) simulators - var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-xcode12.2.plist"); + var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-xcode12.2.plist"); var plist = PDictionary.FromFile (path)!; var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); @@ -51,7 +51,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a [TestCase (TargetFramework.Xamarin_WatchOS_1_0_String, true, "i386", "watchos-i386-simulator/XTest.framework/XTest")] public void PreXcode12 (string targetFrameworkMoniker, bool isSimulator, string architecture, string expected) { - var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-prexcode12.plist"); + var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-prexcode12.plist"); var plist = PDictionary.FromFile (path)!; var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj index 126d96deee76..23074d2e2d40 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj @@ -1,7 +1,7 @@ - net472 + net$(BundledNETCoreAppTargetFrameworkVersion) false true latest @@ -32,12 +32,12 @@ - - - - - - + + + + + + @@ -64,6 +64,9 @@ external\ErrorHelper.tests.cs + + external\StringUtils.cs + diff --git a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs index 59b130f99d1d..8043c1875436 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs +++ b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs @@ -246,7 +246,7 @@ static ExecutionResult MSBuild (ApplePlatform platform, string project, string t foreach (var prop in properties) args.Add ($"/p:{prop.Key}={prop.Value}"); } - var binlog = Path.Combine (Path.GetDirectoryName (project), $"log-{target}-{DateTime.Now:yyyyMMdd_HHmmss}.binlog"); + var binlog = Path.Combine (Path.GetDirectoryName (project)!, $"log-{target}-{DateTime.Now:yyyyMMdd_HHmmss}.binlog"); args.Add ($"/bl:{binlog}"); var output = new StringBuilder (); diff --git a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj index 87ff4869076f..771e95f8bcb2 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj @@ -1,7 +1,7 @@ - net472 + net$(BundledNETCoreAppTargetFrameworkVersion) false true latest @@ -11,8 +11,8 @@ - - + + diff --git a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs index 8b807022b6ac..bc991bce25c2 100644 --- a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs +++ b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs @@ -19,27 +19,24 @@ public NUnitTestTasksEnumerable (Jenkins jenkins, IMlaunchProcessManager process public IEnumerator GetEnumerator () { - var netstandard2Project = new TestProject (TestLabel.Msbuild, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "Xamarin.MacDev.Tasks.Tests.csproj"))) { + var msbuildTasksTestsProject = new TestProject (TestLabel.Msbuild, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "Xamarin.MacDev.Tasks.Tests.csproj"))) { IsDotNetProject = true, }; var env = new Dictionary { { "SYSTEM_MONO", this.jenkins.Harness.SYSTEM_MONO }, }; - var buildiOSMSBuild = new MSBuildTask (jenkins: jenkins, testProject: netstandard2Project, processManager: processManager) { + var buildiOSMSBuild = new MSBuildTask (jenkins: jenkins, testProject: msbuildTasksTestsProject, processManager: processManager) { SpecifyPlatform = false, - SpecifyConfiguration = true, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, - SolutionPath = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "..", "msbuild", "Xamarin.MacDev.Tasks.sln")), + Platform = TestPlatform.All, + Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Msbuild), SupportsParallelExecution = false, - Environment = env, }; - var nunitExecutioniOSMSBuild = new NUnitExecuteTask (jenkins, buildiOSMSBuild, processManager) { - TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "bin", "Debug", "net472", "Xamarin.MacDev.Tasks.Tests.dll"), - TestProject = netstandard2Project, + var nunitExecutioniOSMSBuild = new DotNetTestTask (jenkins, buildiOSMSBuild, processManager) { + TestProject = msbuildTasksTestsProject, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, + Platform = TestPlatform.All, TestName = "MSBuild tests", Mode = "Tasks", Timeout = TimeSpan.FromMinutes (60), @@ -53,18 +50,15 @@ public IEnumerator GetEnumerator () }; var buildiOSMSBuildIntegration = new MSBuildTask (jenkins: jenkins, testProject: msbuildIntegrationTestsProject, processManager: processManager) { SpecifyPlatform = false, - SpecifyConfiguration = true, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, - SolutionPath = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "..", "msbuild", "Xamarin.MacDev.Tasks.sln")), + Platform = TestPlatform.All, + Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Msbuild), SupportsParallelExecution = false, - Environment = env, }; - var nunitExecutioniOSMSBuildIntegration = new NUnitExecuteTask (jenkins, buildiOSMSBuildIntegration, processManager) { - TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tests", "bin", "Debug", "net472", "Xamarin.MacDev.Tests.dll"), + var nunitExecutioniOSMSBuildIntegration = new DotNetTestTask (jenkins, buildiOSMSBuildIntegration, processManager) { TestProject = msbuildIntegrationTestsProject, ProjectConfiguration = "Debug", - Platform = TestPlatform.iOS, + Platform = TestPlatform.All, TestName = "MSBuild tests", Mode = "Integration", Timeout = TimeSpan.FromMinutes (120), From c0c457e32b21bf7498e8924d9ba5b3654c84c3e5 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Mon, 7 Oct 2024 14:55:07 -0400 Subject: [PATCH 033/155] [CI] Intermediate step to move the api scan out of the build. (#21357) Due to the way that resource triggers are implemented in VSTS, we are triggering tests more than once. To solve the issue, we need to move the diff stages to different pipelines. This is the first step to allow use to get less stages in the build so that we can reduce the number of tests that are triggered. --- .../automation/run-post-ci-build-api-scan.yml | 18 ++++ .../automation/run-post-pr-build-api-scan.yml | 18 ++++ .../automation/templates/governance/stage.yml | 5 +- .../templates/pipelines/run-api-scan.yml | 90 +++++++++++++++++++ 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 tools/devops/automation/run-post-ci-build-api-scan.yml create mode 100644 tools/devops/automation/run-post-pr-build-api-scan.yml create mode 100644 tools/devops/automation/templates/pipelines/run-api-scan.yml diff --git a/tools/devops/automation/run-post-ci-build-api-scan.yml b/tools/devops/automation/run-post-ci-build-api-scan.yml new file mode 100644 index 000000000000..bddf49deed90 --- /dev/null +++ b/tools/devops/automation/run-post-ci-build-api-scan.yml @@ -0,0 +1,18 @@ +# pipeline to run after a ci build that will execute the apiscan and other governance tests +trigger: none +pr: none + +# we cannot use a template in a pipeline context +resources: + pipelines: + - pipeline: macios + source: \Xamarin\Mac-iOS\ci pipelines\xamarin-macios-ci + trigger: + stages: + - build_packages + +extends: + template: templates/pipelines/run-api-scan.yml + parameters: + isPR: false + diff --git a/tools/devops/automation/run-post-pr-build-api-scan.yml b/tools/devops/automation/run-post-pr-build-api-scan.yml new file mode 100644 index 000000000000..d00b7c9fdf34 --- /dev/null +++ b/tools/devops/automation/run-post-pr-build-api-scan.yml @@ -0,0 +1,18 @@ +# pipeline to run after a PR build that will execute the apiscan and other governance tests +trigger: none +pr: none + +# we cannot use a template in a pipeline context +resources: + pipelines: + - pipeline: macios + source: \Xamarin\Mac-iOS\pr pipelines\xamarin-macios-pr + trigger: + stages: + - build_packages + +extends: + template: templates/pipelines/run-tests-pipeline.yml + parameters: + isPR: true + diff --git a/tools/devops/automation/templates/governance/stage.yml b/tools/devops/automation/templates/governance/stage.yml index 1b81ae6ca5d5..1bd09358faa2 100644 --- a/tools/devops/automation/templates/governance/stage.yml +++ b/tools/devops/automation/templates/governance/stage.yml @@ -16,11 +16,14 @@ parameters: type: string default: '' +- name: dependsOn + type: object + default: [configure_build, build_packages] stages: - stage: governance_checks displayName: '${{ parameters.stageDisplayNamePrefix }}API Scan' - dependsOn: [ configure_build, build_packages] + dependsOn: ${{ parameters.dependsOn }} jobs: - job: apiscan diff --git a/tools/devops/automation/templates/pipelines/run-api-scan.yml b/tools/devops/automation/templates/pipelines/run-api-scan.yml new file mode 100644 index 000000000000..af250dffb93c --- /dev/null +++ b/tools/devops/automation/templates/pipelines/run-api-scan.yml @@ -0,0 +1,90 @@ +# template that can be extended by pipelines that will be used to run the api-scan tests. This +# allows to share resources and parameters +parameters: + + - name: isPR + displayName: Is PR build + type: boolean + default: false + +resources: + repositories: + - repository: self + checkoutOptions: + submodules: true + + - repository: yaml-templates + type: github + name: xamarin/yaml-templates + ref: refs/heads/main + endpoint: xamarin + + - repository: maccore + type: github + name: xamarin/maccore + ref: refs/heads/main + endpoint: xamarin + + - repository: release-scripts + type: github + name: xamarin/release-scripts + ref: refs/heads/only_codesign + endpoint: xamarin + +variables: + - template: ../variables/common.yml + - template: ../variables/api-scan.yml + - name: DisablePipelineConfigDetector + ${{ if eq(parameters.isPR, false) }}: + value: true + ${{ else }}: + value: false + +stages: + - stage: configure_build + displayName: '${{ parameters.stageDisplayNamePrefix }}Configure' + jobs: + + - ${{ if eq(parameters.pool, 'automatic') }}: + - job: AgentPoolSelector # https://docs.microsoft.com/en-us/azure/devops/pipelines/process/phases?view=azure-devops&tabs=yaml + pool: # Consider using an agentless (server) job here, but would need to host selection logic as an Azure function: https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema#server + vmImage: ubuntu-latest + steps: + - checkout: none # https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema#checkout + + # Selects appropriate agent pool based on trigger type (PR or CI); manually triggered builds target the PR pool + - template: azure-devops-pools/agent-pool-selector.yml@yaml-templates + parameters: + agentPoolPR: $(PRBuildPool) + agentPoolPRUrl: $(PRBuildPoolUrl) + agentPoolCI: $(CIBuildPool) + agentPoolCIUrl: $(CIBuildPoolUrl) + + - job: configure + displayName: 'Configure build' + pool: + vmImage: windows-latest + + variables: + isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] + isScheduled: $[eq(variables['Build.Reason'], 'Schedule')] + BRANCH_NAME: $[ replace(variables['Build.SourceBranch'], 'refs/heads/', '') ] + + steps: + - template: ../common/configuration.yml + parameters: + repositoryAlias: ${{ parameters.repositoryAlias }} + commit: ${{ parameters.commit }} + testConfigurations: ${{ parameters.testConfigurations }} + supportedPlatforms: ${{ parameters.supportedPlatforms }} + testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests' + statusContext: 'VSTS: simulator tests' + uploadArtifacts: true + + - template: ../governance/stage.yml + parameters: + isPR: ${{ parameters.isPR }} + repositoryAlias: ${{ parameters.repositoryAlias }} + commit: ${{ parameters.commit }} + stageDisplayNamePrefix: ${{ parameters.stageDisplayNamePrefix }} + dependsOn: configure_build From 4544df6755f5570df860b5c2f0f47e7f47f05905 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Mon, 7 Oct 2024 14:56:07 -0400 Subject: [PATCH 034/155] [CI] Stop building classic pkgs. (#21382) --- .../automation/templates/build/build-pkgs.yml | 40 ------------------- .../automation/templates/tests/build.yml | 11 ----- 2 files changed, 51 deletions(-) diff --git a/tools/devops/automation/templates/build/build-pkgs.yml b/tools/devops/automation/templates/build/build-pkgs.yml index 7863cb18177f..d841163a1a75 100644 --- a/tools/devops/automation/templates/build/build-pkgs.yml +++ b/tools/devops/automation/templates/build/build-pkgs.yml @@ -46,18 +46,6 @@ steps: gitHubToken: ${{ parameters.gitHubToken }} xqaCertPass: ${{ parameters.xqaCertPass }} buildSteps: - # build not signed .pkgs for the SDK - - bash: | - set -x - set -e - rm -Rf $(Build.SourcesDirectory)/package/*.pkg - rm -Rf $(Build.SourcesDirectory)/package/notarized/*.pkg - time make -C $(Build.SourcesDirectory)/xamarin-macios/ package - name: packages - displayName: 'Build Packages' - condition: and(succeeded(), contains(variables['configuration.BuildPkgs'], 'True')) - timeoutInMinutes: 180 - # build nugets - bash: $(Build.SourcesDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/build-nugets.sh displayName: 'Build Nugets' @@ -75,34 +63,6 @@ steps: artifact: '${{ parameters.uploadPrefix }}WorkloadRollback' continueOnError: true - - bash: | - var=$(make -C $(Build.SourcesDirectory)/xamarin-macios/tools/devops print-variable VARIABLE=IOS_PACKAGE_VERSION) - IOS_PACKAGE_VERSION=${var#*=} - IOS_PACKAGE_VERSION=$(echo $IOS_PACKAGE_VERSION | cut -d "+" -f1) - - var=$(make -C $(Build.SourcesDirectory)/xamarin-macios/tools/devops print-variable VARIABLE=MAC_PACKAGE_VERSION) - MAC_PACKAGE_VERSION=${var#*=} - MAC_PACKAGE_VERSION=$(echo $MAC_PACKAGE_VERSION | cut -d "+" -f1) - - PKG_DST="$(Build.SourcesDirectory)/PkgsVersions.json" - - echo "{" > $PKG_DST - echo "\"iOS\": \"$IOS_PACKAGE_VERSION\"," >> $PKG_DST - echo "\"macOS\": \"$MAC_PACKAGE_VERSION\"" >> $PKG_DST - echo "}" >> $PKG_DST - - echo "PkgVersions.json file contents:" - echo "$(cat $PKG_DST)" - name: pkg_versions_file - displayName: 'Generate PkgsVersions.json' - - - task: 1ES.PublishPipelineArtifact@1 - displayName: 'Publish PkgsVersions.json' - inputs: - path: $(Build.SourcesDirectory)/PkgsVersions.json - artifact: '${{ parameters.uploadPrefix }}PkgsVersions' - continueOnError: true - # upload each of the pkgs into the pipeline artifacts - task: 1ES.PublishPipelineArtifact@1 displayName: 'Publish Build Artifacts' diff --git a/tools/devops/automation/templates/tests/build.yml b/tools/devops/automation/templates/tests/build.yml index e8b12d92a345..58396ef89bd5 100644 --- a/tools/devops/automation/templates/tests/build.yml +++ b/tools/devops/automation/templates/tests/build.yml @@ -155,10 +155,6 @@ steps: # use a diff step depending if we have been trigger by a pipeline of by a PR/Commit - ${{ if or(contains(variables['Build.Reason'], 'ResourceTrigger'), contains(variables['Build.Reason'], 'BuildCompletion'), contains(variables['Build.DefinitionName'], 'xamarin-macios-ci-tests'), contains(variables['Build.DefinitionName'], 'xamarin-macios-pr-tests')) }}: - - download: macios - displayName: Download PkgsVersions.json - artifact: PkgsVersions - - download: macios displayName: Download WorkloadRollback.json artifact: WorkloadRollback @@ -185,13 +181,6 @@ steps: displayName: Move artifacts to the expected location - ${{ else }}: - - task: DownloadPipelineArtifact@2 - displayName: Download PkgsVersions.json - inputs: - allowFailedBuilds: true - patterns: '**/PkgsVersions.json' - path: $(Build.SourcesDirectory)/artifacts - - task: DownloadPipelineArtifact@2 displayName: Download WorkloadRollback.json inputs: From 85b7f563bb551d58504546a4dc759b7b7d44193d Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Tue, 8 Oct 2024 12:21:31 -0400 Subject: [PATCH 035/155] [CI] Fix errors in the new apiscan pipelines. (#21385) Allow the pipeline to run correctly. We could not test it before we landed the yaml, this commit fixes all the issues we have. --- .../automation/run-post-pr-build-api-scan.yml | 2 +- .../templates/governance/apiscan.yml | 24 +++++-- .../automation/templates/governance/stage.yml | 5 ++ .../templates/pipelines/run-api-scan.yml | 66 +++++++++++++++---- 4 files changed, 78 insertions(+), 19 deletions(-) diff --git a/tools/devops/automation/run-post-pr-build-api-scan.yml b/tools/devops/automation/run-post-pr-build-api-scan.yml index d00b7c9fdf34..84ebf69d6e44 100644 --- a/tools/devops/automation/run-post-pr-build-api-scan.yml +++ b/tools/devops/automation/run-post-pr-build-api-scan.yml @@ -12,7 +12,7 @@ resources: - build_packages extends: - template: templates/pipelines/run-tests-pipeline.yml + template: templates/pipelines/run-api-scan.yml parameters: isPR: true diff --git a/tools/devops/automation/templates/governance/apiscan.yml b/tools/devops/automation/templates/governance/apiscan.yml index 9c241139abba..c68489fc2152 100644 --- a/tools/devops/automation/templates/governance/apiscan.yml +++ b/tools/devops/automation/templates/governance/apiscan.yml @@ -15,6 +15,10 @@ parameters: type: string default: '$(MaciosUploadPrefix)' +- name: use1ES + type: boolean + default: true + steps: - template: ../common/checkout.yml @@ -88,9 +92,17 @@ steps: GdnBreakOutputSuppressionFile: $(Build.ArtifactStagingDirectory)\GuardianSuppressions\falsepositives.gdnsuppress GdnBreakOutputSuppressionSet: falsepositives -- task: 1ES.PublishPipelineArtifact@1 - displayName: Publish Artifact for Guardian Supressions - inputs: - path: $(Build.ArtifactStagingDirectory)\GuardianSuppressions - artifact: Guardian Suppressions APIScan $(PLATFORM) $(VERSION) - condition: failed() +- ${{ if eq(parameters.use1ES, true) }}: + - task: 1ES.PublishPipelineArtifact@1 + displayName: Publish Artifact for Guardian Supressions + inputs: + path: $(Build.ArtifactStagingDirectory)\GuardianSuppressions + artifact: Guardian Suppressions APIScan $(PLATFORM) $(VERSION) + condition: failed() +- ${{ else }}: + - task: PublishPipelineArtifact@1 + displayName: Publish Artifact for Guardian Supressions + inputs: + targetPath: $(Build.ArtifactStagingDirectory)\GuardianSuppressions + artifactName: Guardian Suppressions APIScan $(PLATFORM) $(VERSION) + condition: failed() diff --git a/tools/devops/automation/templates/governance/stage.yml b/tools/devops/automation/templates/governance/stage.yml index 1bd09358faa2..10bcf4ac2321 100644 --- a/tools/devops/automation/templates/governance/stage.yml +++ b/tools/devops/automation/templates/governance/stage.yml @@ -20,6 +20,10 @@ parameters: type: object default: [configure_build, build_packages] +- name: use1ES + type: boolean + default: true + stages: - stage: governance_checks displayName: '${{ parameters.stageDisplayNamePrefix }}API Scan' @@ -43,3 +47,4 @@ stages: isPR: ${{ parameters.isPR }} repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} + use1ES: ${{ parameters.use1ES }} diff --git a/tools/devops/automation/templates/pipelines/run-api-scan.yml b/tools/devops/automation/templates/pipelines/run-api-scan.yml index af250dffb93c..14f6ae850785 100644 --- a/tools/devops/automation/templates/pipelines/run-api-scan.yml +++ b/tools/devops/automation/templates/pipelines/run-api-scan.yml @@ -7,6 +7,47 @@ parameters: type: boolean default: false + - name: pool + type: string + displayName: Bot pool to use + default: automatic + values: + - pr + - ci + - automatic + + - name: testConfigurations + displayName: Test configurations to run + type: object + default: [] + + - name: supportedPlatforms + type: object + default: [ + { + platform: iOS, + isDotNetPlatform: true, + }, + { + platform: macOS, + isDotNetPlatform: true, + }, + { + platform: tvOS, + isDotNetPlatform: true, + }, + { + platform: MacCatalyst, + isDotNetPlatform: true, + }, + { + # when running platform-specific test runs, we also need a special test run that executes tests that only runs when multiple platforms are enabled + platform: Multiple, + isDotNetPlatform: true, + } + ] + + resources: repositories: - repository: self @@ -34,15 +75,16 @@ resources: variables: - template: ../variables/common.yml - template: ../variables/api-scan.yml - - name: DisablePipelineConfigDetector - ${{ if eq(parameters.isPR, false) }}: - value: true - ${{ else }}: - value: false + - ${{ if eq(parameters.isPR, false) }}: + - name: DisablePipelineConfigDetector + value: true + - ${{ else }}: + - name: DisablePipelineConfigDetector + value: false stages: - stage: configure_build - displayName: '${{ parameters.stageDisplayNamePrefix }}Configure' + displayName: 'Configure' jobs: - ${{ if eq(parameters.pool, 'automatic') }}: @@ -71,10 +113,10 @@ stages: BRANCH_NAME: $[ replace(variables['Build.SourceBranch'], 'refs/heads/', '') ] steps: - - template: ../common/configuration.yml + - template: ../common/configure.yml parameters: - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} + repositoryAlias: self + commit: HEAD testConfigurations: ${{ parameters.testConfigurations }} supportedPlatforms: ${{ parameters.supportedPlatforms }} testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests' @@ -84,7 +126,7 @@ stages: - template: ../governance/stage.yml parameters: isPR: ${{ parameters.isPR }} - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - stageDisplayNamePrefix: ${{ parameters.stageDisplayNamePrefix }} + repositoryAlias: self + commit: HEAD dependsOn: configure_build + use1ES: false From 0db186c75896a516b409274b45136714230d60ab Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Tue, 8 Oct 2024 12:37:10 -0400 Subject: [PATCH 036/155] [CI] Move the release steps to a new pipeline. (#21383) This new pipeline will only be executed when the CI build is completed by any of the branches that have been listed to be included in the trigger. This pipeline because it does a release has to extend the 1ES template. --------- Co-authored-by: Rolf Bjarne Kvinge --- .../run-post-ci-build-vs-insertion.yml | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 tools/devops/automation/run-post-ci-build-vs-insertion.yml diff --git a/tools/devops/automation/run-post-ci-build-vs-insertion.yml b/tools/devops/automation/run-post-ci-build-vs-insertion.yml new file mode 100644 index 000000000000..b11f9fda1085 --- /dev/null +++ b/tools/devops/automation/run-post-ci-build-vs-insertion.yml @@ -0,0 +1,87 @@ +# YAML pipeline for post build operations. +# This pipeline will sign the nugets and will prepare them for a release. + +trigger: none +pr: none + +parameters: + + - name: stageDisplayNamePrefix + type: string + default: '' + + - name: repositoryAlias + type: string + default: self + + - name: commit + type: string + default: HEAD + + - name: pushNugets + type: boolean + default: true # default to true until otherwhise + + - name: pushNugetsToMaestro + type: boolean + default: true + +# we cannot use a template in a pipeline context +resources: + pipelines: + - pipeline: macios + source: \Xamarin\Mac-iOS\ci pipelines\xamarin-macios-ci + trigger: + branches: + include: + - main + - release-test/* + - release/* + - net7.0 + - net8.0 + - net9.0 + - net10.0 + - xcode?? + stages: + - build_packages + +extends: + template: azure-pipelines/MicroBuild.1ES.Official.yml@CustomPipelineTemplates + parameters: + pool: # default pool to be used for validation jobs + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + os: windows + sdl: + baseline: + baselineFile: '$(System.DefaultWorkingDirectory)\\xamarin-macios\\tools\\devops\\governance\\baselines.gdnbaselines' + suppression: + suppressionFile: '$(System.DefaultWorkingDirectory)\\xamarin-macios\\tools\\devops\\governance\\suppress.gdnsuppress' + sourceAnalysisPool: + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + os: windows + tsa: + configFile: '$(System.DefaultWorkingDirectory)\\xamarin-macios\\tools\\devops\\governance\\tsa_config.gdntsa' + sbom: + enabled: false # we run our on sbom generation + credscan: + suppressionsFile: '$(System.DefaultWorkingDirectory)\\xamarin-macios\\tools\\devops\\governance\\CredScanSuppressions.json' + policheck: + exclusionsFile: '$(System.DefaultWorkingDirectory)\\xamarin-macios\\tools\\devops\\governance\\PoliCheckExclusions.xml' + sourceRepositoriesToScan: + runInSingleJob: true # run both maccore and macios in the same job + include: + - repository: maccore + exclude: + - repository: yaml-templates + - repository: sdk-insertions + stages: + - template: templates/release/vs-insertion-prep.yml + parameters: + stageDisplayNamePrefix: ${{ parameters.stageDisplayNamePrefix }} + isPR: false + repositoryAlias: ${{ parameters.repositoryAlias }} + commit: ${{ parameters.commit }} + pushNugets: ${{ parameters.pushNugets }} + pushNugetsToMaestro: ${{ parameters.pushNugetsToMaestro }} From d2634a9d62cdfeafd4c740f938eb74bdc3743667 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Tue, 8 Oct 2024 12:50:11 -0400 Subject: [PATCH 037/155] [xcode16.1] Bump Xcode to Xcode 16.1 (#21386) Co-authored-by: Rolf Bjarne Kvinge --- Make.config | 10 +- Make.versions | 10 +- Versions-ios.plist.in | 6 + builds/Versions-MacCatalyst.plist.in | 4 + builds/Versions-iOS.plist.in | 2 + builds/Versions-macOS.plist.in | 2 + builds/Versions-tvOS.plist.in | 2 + src/coreimage.cs | 12 + src/scenekit.cs | 2 +- .../Documentation.KnownFailures.txt | 11 + tests/common/TestRuntime.cs | 12 + tests/introspection/iOS/iOSApiProtocolTest.cs | 4 +- .../MacCatalyst-CoreGraphics.todo | 3 + .../MacCatalyst-HealthKit.todo | 16 ++ .../MacCatalyst-NetworkExtension.todo | 1 + .../MacCatalyst-UIKit.todo | 7 + .../iOS-CoreGraphics.todo | 3 + .../api-annotations-dotnet/iOS-HealthKit.todo | 18 ++ .../iOS-NetworkExtension.todo | 1 + .../api-annotations-dotnet/iOS-PencilKit.todo | 1 + .../api-annotations-dotnet/iOS-UIKit.todo | 7 + .../macOS-AppKit.ignore | 2 - .../macOS-CoreGraphics.todo | 3 + .../api-annotations-dotnet/macOS-FSKit.todo | 256 ++++++++++++++++++ .../macOS-HealthKit.todo | 16 ++ .../macOS-NetworkExtension.todo | 1 + .../tvOS-CoreGraphics.todo | 3 + .../tvOS-NetworkExtension.todo | 1 + .../tvOS-TVServices.todo | 1 + .../api-annotations-dotnet/tvOS-UIKit.todo | 3 + tools/common/SdkVersions.cs | 34 +-- tools/devops/automation/build-pipeline.yml | 2 +- .../devops/automation/build-pull-request.yml | 2 +- .../templates/pipelines/api-diff-pipeline.yml | 2 +- .../templates/pipelines/build-pipeline.yml | 2 +- .../pipelines/run-tests-pipeline.yml | 2 +- 36 files changed, 427 insertions(+), 37 deletions(-) create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-CoreGraphics.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-CoreGraphics.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/macOS-CoreGraphics.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/macOS-FSKit.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-CoreGraphics.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo diff --git a/Make.config b/Make.config index 6842ebe01c79..978c479d99d7 100644 --- a/Make.config +++ b/Make.config @@ -218,11 +218,11 @@ MACCATALYST_NUGET_VERSION_NO_METADATA=$(MACCATALYST_NUGET_VERSION)$(NUGET_PREREL MACCATALYST_NUGET_VERSION_FULL=$(MACCATALYST_NUGET_VERSION_NO_METADATA)$(NUGET_BUILD_METADATA) # Xcode version should have both a major and a minor version (even if the minor version is 0) -XCODE_VERSION=16.0 -XCODE_URL=https://dl.internalx.com/internal-files/xcodes/Xcode_16.xip -XCODE_IOS_SIMULATOR_FILENAME=iOS_18_Simulator_Runtime.dmg -XCODE_IOS_SIMULATOR_VERSION=22A3351 -XCODE_DEVELOPER_ROOT=/Applications/Xcode_16.0.0.app/Contents/Developer +XCODE_VERSION=16.1 +XCODE_URL=https://dl.internalx.com/internal-files/xcodes/Xcode_16.1_beta_3.xip +XCODE_IOS_SIMULATOR_FILENAME=iOS_18.1_beta_6_Simulator_Runtime.dmg +XCODE_IOS_SIMULATOR_VERSION=22B5069a +XCODE_DEVELOPER_ROOT=/Applications/Xcode_16.1.0-beta3.app/Contents/Developer XCODE_PRODUCT_BUILD_VERSION:=$(shell /usr/libexec/PlistBuddy -c 'Print :ProductBuildVersion' $(XCODE_DEVELOPER_ROOT)/../version.plist 2>/dev/null || echo " $(shell tput setaf 1 2>/dev/null)The required Xcode ($(XCODE_VERSION)) is not installed in $(basename $(basename $(XCODE_DEVELOPER_ROOT)))$(shell tput sgr0 2>/dev/null)" >&2) # We define stable Xcode as the Xcode app being named like "Xcode_#.#[.#].app" diff --git a/Make.versions b/Make.versions index 7182fdd9abc8..dd791ec982f9 100644 --- a/Make.versions +++ b/Make.versions @@ -65,11 +65,11 @@ MAC_PACKAGE_VERSION=9.99.0.$(MAC_COMMIT_DISTANCE) # WARNING: Do **not** use versions higher than the available Xcode SDK or else we will have issues with mtouch (See https://github.com/xamarin/xamarin-macios/issues/7705) -IOS_NUGET_OS_VERSION=18.0 -TVOS_NUGET_OS_VERSION=18.0 -WATCHOS_NUGET_OS_VERSION=11.0 -MACOS_NUGET_OS_VERSION=15.0 -MACCATALYST_NUGET_OS_VERSION=18.0 +IOS_NUGET_OS_VERSION=18.1 +TVOS_NUGET_OS_VERSION=18.1 +WATCHOS_NUGET_OS_VERSION=11.1 +MACOS_NUGET_OS_VERSION=15.1 +MACCATALYST_NUGET_OS_VERSION=18.1 # In theory we should define the default platform version if it's not specified in the TFM. The default should not change for a given .NET version: diff --git a/Versions-ios.plist.in b/Versions-ios.plist.in index ffc7208a4316..fd3f609a0390 100644 --- a/Versions-ios.plist.in +++ b/Versions-ios.plist.in @@ -43,6 +43,7 @@ 17.4 17.5 18.0 + 18.1 tvOS @@ -76,6 +77,7 @@ 17.4 17.5 18.0 + 18.1 watchOS @@ -105,6 +107,7 @@ 10.4 10.5 11.0 + 11.1 MacCatalyst @@ -119,6 +122,7 @@ 17.4 17.5 18.0 + 18.1 MacCatalystVersionMap @@ -163,6 +167,8 @@ 14.5 18.0 15.0 + 18.1 + 15.1 RecommendedXcodeVersion @XCODE_VERSION@ diff --git a/builds/Versions-MacCatalyst.plist.in b/builds/Versions-MacCatalyst.plist.in index 0e66d8d26b29..473439e89adf 100644 --- a/builds/Versions-MacCatalyst.plist.in +++ b/builds/Versions-MacCatalyst.plist.in @@ -19,6 +19,7 @@ 17.4 17.5 18.0 + 18.1 SupportedTargetPlatformVersions @@ -48,6 +49,7 @@ 17.4 17.5 18.0 + 18.1 MacCatalystVersionMap @@ -92,6 +94,8 @@ 14.5 18.0 15.0 + 18.1 + 15.1 RecommendedXcodeVersion @XCODE_VERSION@ diff --git a/builds/Versions-iOS.plist.in b/builds/Versions-iOS.plist.in index dd2571895d1b..84fee70abc84 100644 --- a/builds/Versions-iOS.plist.in +++ b/builds/Versions-iOS.plist.in @@ -36,6 +36,7 @@ 17.4 17.5 18.0 + 18.1 SupportedTargetPlatformVersions @@ -84,6 +85,7 @@ 17.4 17.5 18.0 + 18.1 RecommendedXcodeVersion diff --git a/builds/Versions-macOS.plist.in b/builds/Versions-macOS.plist.in index b6e2035c2bd0..1b4f7506193f 100644 --- a/builds/Versions-macOS.plist.in +++ b/builds/Versions-macOS.plist.in @@ -21,6 +21,7 @@ 14.4 14.5 15.0 + 15.1 SupportedTargetPlatformVersions @@ -48,6 +49,7 @@ 14.4 14.5 15.0 + 15.1 RecommendedXcodeVersion diff --git a/builds/Versions-tvOS.plist.in b/builds/Versions-tvOS.plist.in index 7d9610d8d9c1..48b8ba92d30c 100644 --- a/builds/Versions-tvOS.plist.in +++ b/builds/Versions-tvOS.plist.in @@ -31,6 +31,7 @@ 17.4 17.5 18.0 + 18.1 SupportedTargetPlatformVersions @@ -74,6 +75,7 @@ 17.4 17.5 18.0 + 18.1 RecommendedXcodeVersion diff --git a/src/coreimage.cs b/src/coreimage.cs index a2c5dec598fe..d35e58fd10bf 100644 --- a/src/coreimage.cs +++ b/src/coreimage.cs @@ -10274,6 +10274,18 @@ interface CIAreaBoundsRed : CIAreaBoundsRedProtocol { [Protocol (Name = "CIAreaBoundsRed")] interface CIAreaBoundsRedProtocol : CIAreaReductionFilterProtocol { } + + [CoreImageFilter] + [TV (18, 1), Mac (15, 1), iOS (18, 1), MacCatalyst (18, 1)] + [BaseType (typeof (CIFilter))] + interface CIDistanceGradientFromRedMask : CIFilterProtocol { + + [CoreImageFilterProperty ("inputImage")] + CIImage InputImage { get; set; } + + [CoreImageFilterProperty ("inputMaximumDistance")] + int MaximumDistance { get; set; } + } #endregion } diff --git a/src/scenekit.cs b/src/scenekit.cs index 0822a5ed6f84..b26ad1b3aa65 100644 --- a/src/scenekit.cs +++ b/src/scenekit.cs @@ -1967,7 +1967,7 @@ interface SCNSceneLoadingOptions { [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] interface SCNNode : SCNAnimatable, SCNBoundingVolume, SCNActionable, NSCopying, NSSecureCoding -#if IOS || TVOS +#if (IOS || TVOS) && !XAMCORE_5_0 // Conformance Removed in Xcode 16.1 , UIFocusItem #endif { diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index db2e9ad2042c..b8c2ff54ccba 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -32183,6 +32183,10 @@ M:CoreImage.CIDissolveTransition.#ctor M:CoreImage.CIDissolveTransition.#ctor(Foundation.NSCoder) M:CoreImage.CIDissolveTransition.#ctor(Foundation.NSObjectFlag) M:CoreImage.CIDissolveTransition.#ctor(ObjCRuntime.NativeHandle) +M:CoreImage.CIDistanceGradientFromRedMask.#ctor +M:CoreImage.CIDistanceGradientFromRedMask.#ctor(Foundation.NSCoder) +M:CoreImage.CIDistanceGradientFromRedMask.#ctor(Foundation.NSObjectFlag) +M:CoreImage.CIDistanceGradientFromRedMask.#ctor(ObjCRuntime.NativeHandle) M:CoreImage.CIDistortionFilter.#ctor(Foundation.NSCoder) M:CoreImage.CIDistortionFilter.#ctor(Foundation.NSObjectFlag) M:CoreImage.CIDistortionFilter.#ctor(ObjCRuntime.NativeHandle) @@ -63149,6 +63153,9 @@ P:CoreImage.CIDisplacementDistortion.DisplacementImage P:CoreImage.CIDisplacementDistortion.InputImage P:CoreImage.CIDisplacementDistortion.OutputImage P:CoreImage.CIDisplacementDistortion.Scale +P:CoreImage.CIDistanceGradientFromRedMask.InputImage +P:CoreImage.CIDistanceGradientFromRedMask.MaximumDistance +P:CoreImage.CIDistanceGradientFromRedMask.OutputImage P:CoreImage.CIDistortionFilter.InputImage P:CoreImage.CIDistortionFilter.Radius P:CoreImage.CIDither.InputImage @@ -67892,6 +67899,7 @@ P:Foundation.NSUserActivity.EligibleForSearch P:Foundation.NSUserActivity.IsClassKitDeepLink P:Foundation.NSUserActivity.ReadableTypeIdentifiers P:Foundation.NSUserActivity.SuggestedInvocationPhrase +P:Foundation.NSUserActivity.TargetContentIdentifier P:Foundation.NSUserActivity.WritableTypeIdentifiers P:Foundation.NSUserActivity.WritableTypeIdentifiersForItemProvider P:Foundation.NSUserActivityContinuation.Arg1 @@ -77940,6 +77948,7 @@ P:UIKit.UIMenu.SelectedElements P:UIKit.UIMenuController.DidHideMenuNotification P:UIKit.UIMenuController.DidShowMenuNotification P:UIKit.UIMenuController.MenuFrameDidChangeNotification +P:UIKit.UIMenuController.MenuVisible P:UIKit.UIMenuController.WillHideMenuNotification P:UIKit.UIMenuController.WillShowMenuNotification P:UIKit.UIMenuElement.AccessibilityIdentifier @@ -78022,6 +78031,7 @@ P:UIKit.UIPasteboard.Automatic P:UIKit.UIPasteboard.ChangedNotification P:UIKit.UIPasteboard.ChangedTypesAddedKey P:UIKit.UIPasteboard.ChangedTypesRemovedKey +P:UIKit.UIPasteboard.Persistent P:UIKit.UIPasteboard.RemovedNotification P:UIKit.UIPasteboard.TypeListColor P:UIKit.UIPasteboard.TypeListImage @@ -82335,6 +82345,7 @@ T:CoreImage.CIDepthDisparityConverter T:CoreImage.CIDepthToDisparity T:CoreImage.CIDetectorOptions T:CoreImage.CIDisparityToDepth +T:CoreImage.CIDistanceGradientFromRedMask T:CoreImage.CIDither T:CoreImage.CIDocumentEnhancer T:CoreImage.CIEdgePreserveUpsampleFilter diff --git a/tests/common/TestRuntime.cs b/tests/common/TestRuntime.cs index ef55f085cc8c..572d42e51dc2 100644 --- a/tests/common/TestRuntime.cs +++ b/tests/common/TestRuntime.cs @@ -470,6 +470,18 @@ public static bool CheckXcodeVersion (int major, int minor, int build = 0) return CheckMacSystemVersion (15, 0); #else throw new NotImplementedException ($"Missing platform case for Xcode {major}.{minor}"); +#endif + case 1: +#if __WATCHOS__ + return CheckWatchOSSystemVersion (11, 1); +#elif __TVOS__ + return ChecktvOSSystemVersion (18, 1); +#elif __IOS__ + return CheckiOSSystemVersion (18, 1); +#elif MONOMAC + return CheckMacSystemVersion (15, 1); +#else + throw new NotImplementedException ($"Missing platform case for Xcode {major}.{minor}"); #endif default: throw new NotImplementedException ($"Missing version logic for checking for Xcode {major}.{minor}"); diff --git a/tests/introspection/iOS/iOSApiProtocolTest.cs b/tests/introspection/iOS/iOSApiProtocolTest.cs index 8d7c19d5c7a0..3ddc32a7b762 100644 --- a/tests/introspection/iOS/iOSApiProtocolTest.cs +++ b/tests/introspection/iOS/iOSApiProtocolTest.cs @@ -975,7 +975,7 @@ protected override bool Skip (Type type, string protocolName) return !TestRuntime.CheckXcodeVersion (8, 0); case "SCNNode": case "SCNReferenceNode": - return !TestRuntime.CheckXcodeVersion (9, 0); + return TestRuntime.CheckXcodeVersion (16, 1); // Conformance removed in Xcode 16.1 will be removed in XAMCORE_5_0 } break; @@ -1095,7 +1095,7 @@ protected override bool Skip (Type type, string protocolName) return !TestRuntime.CheckXcodeVersion (8, 0); case "SCNNode": case "SCNReferenceNode": - return !TestRuntime.CheckXcodeVersion (9, 0); + return TestRuntime.CheckXcodeVersion (16, 1); // Conformance removed in Xcode 16.1 will be removed in XAMCORE_5_0 } break; diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-CoreGraphics.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-CoreGraphics.todo new file mode 100644 index 000000000000..bb9397dd4d7d --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-CoreGraphics.todo @@ -0,0 +1,3 @@ +!missing-field! kCGUseLegacyHDREcosystem not bound +!missing-pinvoke! CGColorConversionInfoConvertData is not bound +!missing-pinvoke! CGColorConversionInfoCreateForToneMapping is not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo new file mode 100644 index 000000000000..151890b0201c --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo @@ -0,0 +1,16 @@ +!missing-enum! HKAudiogramConductionType not bound +!missing-enum! HKAudiogramSensitivityTestSide not bound +!missing-selector! +HKAudiogramSample::audiogramSampleWithSensitivityPoints:startDate:endDate:device:metadata: not bound +!missing-selector! +HKAudiogramSensitivityPoint::sensitivityPointWithFrequency:tests:error: not bound +!missing-selector! +HKAudiogramSensitivityPointClampingRange::clampingRangeWithLowerBound:upperBound:error: not bound +!missing-selector! HKAudiogramSensitivityPoint::tests not bound +!missing-selector! HKAudiogramSensitivityPointClampingRange::lowerBound not bound +!missing-selector! HKAudiogramSensitivityPointClampingRange::upperBound not bound +!missing-selector! HKAudiogramSensitivityTest::clampingRange not bound +!missing-selector! HKAudiogramSensitivityTest::initWithSensitivity:type:masked:side:clampingRange:error: not bound +!missing-selector! HKAudiogramSensitivityTest::masked not bound +!missing-selector! HKAudiogramSensitivityTest::sensitivity not bound +!missing-selector! HKAudiogramSensitivityTest::side not bound +!missing-selector! HKAudiogramSensitivityTest::type not bound +!missing-type! HKAudiogramSensitivityPointClampingRange not bound +!missing-type! HKAudiogramSensitivityTest not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo new file mode 100644 index 000000000000..1d2d71785638 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo @@ -0,0 +1 @@ +!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo new file mode 100644 index 000000000000..59b0d796c122 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo @@ -0,0 +1,7 @@ +!missing-enum-value! UIPressType native value UIPressTypeTVRemoteFourColors = 33 not bound +!missing-enum-value! UIPressType native value UIPressTypeTVRemoteOneTwoThree = 32 not bound +!missing-field! UIMenuOpen not bound +!missing-selector! NSObject::accessibilityTextInputResponder not bound +!missing-selector! NSObject::accessibilityTextInputResponderBlock not bound +!missing-selector! NSObject::setAccessibilityTextInputResponder: not bound +!missing-selector! NSObject::setAccessibilityTextInputResponderBlock: not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-CoreGraphics.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-CoreGraphics.todo new file mode 100644 index 000000000000..bb9397dd4d7d --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-CoreGraphics.todo @@ -0,0 +1,3 @@ +!missing-field! kCGUseLegacyHDREcosystem not bound +!missing-pinvoke! CGColorConversionInfoConvertData is not bound +!missing-pinvoke! CGColorConversionInfoCreateForToneMapping is not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo new file mode 100644 index 000000000000..e8d1a930da7a --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo @@ -0,0 +1,18 @@ +!deprecated-attribute-missing! HKAudiogramSensitivityPoint::leftEarSensitivity missing a [Deprecated] attribute +!deprecated-attribute-missing! HKAudiogramSensitivityPoint::rightEarSensitivity missing a [Deprecated] attribute +!missing-enum! HKAudiogramConductionType not bound +!missing-enum! HKAudiogramSensitivityTestSide not bound +!missing-selector! +HKAudiogramSample::audiogramSampleWithSensitivityPoints:startDate:endDate:device:metadata: not bound +!missing-selector! +HKAudiogramSensitivityPoint::sensitivityPointWithFrequency:tests:error: not bound +!missing-selector! +HKAudiogramSensitivityPointClampingRange::clampingRangeWithLowerBound:upperBound:error: not bound +!missing-selector! HKAudiogramSensitivityPoint::tests not bound +!missing-selector! HKAudiogramSensitivityPointClampingRange::lowerBound not bound +!missing-selector! HKAudiogramSensitivityPointClampingRange::upperBound not bound +!missing-selector! HKAudiogramSensitivityTest::clampingRange not bound +!missing-selector! HKAudiogramSensitivityTest::initWithSensitivity:type:masked:side:clampingRange:error: not bound +!missing-selector! HKAudiogramSensitivityTest::masked not bound +!missing-selector! HKAudiogramSensitivityTest::sensitivity not bound +!missing-selector! HKAudiogramSensitivityTest::side not bound +!missing-selector! HKAudiogramSensitivityTest::type not bound +!missing-type! HKAudiogramSensitivityPointClampingRange not bound +!missing-type! HKAudiogramSensitivityTest not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo new file mode 100644 index 000000000000..1d2d71785638 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo @@ -0,0 +1 @@ +!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo new file mode 100644 index 000000000000..34d8fbc559ed --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo @@ -0,0 +1 @@ +!missing-protocol-member! PKCanvasViewDelegate::canvasView:didRefineStrokes:withNewStrokes: not found diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo new file mode 100644 index 000000000000..59b0d796c122 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo @@ -0,0 +1,7 @@ +!missing-enum-value! UIPressType native value UIPressTypeTVRemoteFourColors = 33 not bound +!missing-enum-value! UIPressType native value UIPressTypeTVRemoteOneTwoThree = 32 not bound +!missing-field! UIMenuOpen not bound +!missing-selector! NSObject::accessibilityTextInputResponder not bound +!missing-selector! NSObject::accessibilityTextInputResponderBlock not bound +!missing-selector! NSObject::setAccessibilityTextInputResponder: not bound +!missing-selector! NSObject::setAccessibilityTextInputResponderBlock: not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-AppKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/macOS-AppKit.ignore index 85789b1901b0..c42597e7b1c7 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/macOS-AppKit.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/macOS-AppKit.ignore @@ -1679,5 +1679,3 @@ !incorrect-protocol-member! NSAccessibility::setAccessibilityUserInputLabels: is REQUIRED and should be abstract # introduced and deprecated in the same version -!missing-protocol-member! NSTextInputTraits::setWritingToolsAllowedInputOptions: not found -!missing-protocol-member! NSTextInputTraits::writingToolsAllowedInputOptions not found diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-CoreGraphics.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-CoreGraphics.todo new file mode 100644 index 000000000000..bb9397dd4d7d --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/macOS-CoreGraphics.todo @@ -0,0 +1,3 @@ +!missing-field! kCGUseLegacyHDREcosystem not bound +!missing-pinvoke! CGColorConversionInfoConvertData is not bound +!missing-pinvoke! CGColorConversionInfoCreateForToneMapping is not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-FSKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-FSKit.todo new file mode 100644 index 000000000000..33a0da7a7f0a --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/macOS-FSKit.todo @@ -0,0 +1,256 @@ +!missing-enum! FSAccessMask not bound +!missing-enum! FSBlockmapFlags not bound +!missing-enum! FSContainerState not bound +!missing-enum! FSDeactivateOptions not bound +!missing-enum! FSExtentType not bound +!missing-enum! FSItemAttribute not bound +!missing-enum! FSItemType not bound +!missing-enum! FSMatchResult not bound +!missing-enum! FSPreallocateFlags not bound +!missing-enum! FSSetXattrPolicy not bound +!missing-enum! FSVolumeErrorCode not bound +!missing-enum! FSVolumeOpenModes not bound +!missing-field! FSDirectoryCookieInitial not bound +!missing-field! FSDirectoryVerifierInitial not bound +!missing-field! FSKitVersionNumber not bound +!missing-field! FSKitVersionString not bound +!missing-field! FSModuleIdentityAttributeActivateOptionSyntax not bound +!missing-field! FSModuleIdentityAttributeCheckOptionSyntax not bound +!missing-field! FSModuleIdentityAttributeFormatOptionSyntax not bound +!missing-field! FSModuleIdentityAttributeMediaTypes not bound +!missing-field! FSModuleIdentityAttributePersonalities not bound +!missing-field! FSModuleIdentityAttributeShortName not bound +!missing-field! FSModuleIdentityAttributeSupportsBlockResources not bound +!missing-field! FSModuleIdentityAttributeSupportsKOIO not bound +!missing-field! FSModuleIdentityAttributeSupportsServerURLs not bound +!missing-field! FSVolumeErrorDomain not bound +!missing-pinvoke! fs_errorForCocoaError is not bound +!missing-pinvoke! fs_errorForMachError is not bound +!missing-pinvoke! fs_errorForPOSIXError is not bound +!missing-pinvoke! fskit_std_log is not bound +!missing-protocol! FSBlockDeviceOperations not bound +!missing-protocol! FSFileSystemBase not bound +!missing-protocol! FSManageableResourceMaintenanceOperations not bound +!missing-protocol! FSUnaryFileSystemOperations not bound +!missing-protocol! FSVolumeAccessCheckOperations not bound +!missing-protocol! FSVolumeKOIOOperations not bound +!missing-protocol! FSVolumeOpenCloseOperations not bound +!missing-protocol! FSVolumeOperations not bound +!missing-protocol! FSVolumePathConfOperations not bound +!missing-protocol! FSVolumePreallocateOperations not bound +!missing-protocol! FSVolumeReadWriteOperations not bound +!missing-protocol! FSVolumeRenameOperations not bound +!missing-protocol! FSVolumeXattrOperations not bound +!missing-selector! +FSBlockDeviceResource::proxyResourceForBSDName: not bound +!missing-selector! +FSBlockDeviceResource::proxyResourceForBSDName:isWritable: not bound +!missing-selector! +FSClient::fetchInstalledExtensionsWithCompletionHandler: not bound +!missing-selector! +FSClient::installedExtensionsWithError: not bound +!missing-selector! +FSEntityIdentifier::identifier not bound +!missing-selector! +FSEntityIdentifier::identifierWithUUID: not bound +!missing-selector! +FSEntityIdentifier::identifierWithUUID:byteQualifier: not bound +!missing-selector! +FSEntityIdentifier::identifierWithUUID:data: not bound +!missing-selector! +FSEntityIdentifier::identifierWithUUID:longByteQualifier: not bound +!missing-selector! +FSFileName::nameWithBytes:length: not bound +!missing-selector! +FSFileName::nameWithCString: not bound +!missing-selector! +FSFileName::nameWithData: not bound +!missing-selector! +FSFileName::nameWithString: not bound +!missing-selector! +FSGenericURLResource::resourceWithURL: not bound +!missing-selector! +FSMetadataBlockRange::rangeWithOffset:blockLength:numberOfBlocks: not bound +!missing-selector! +FSProbeResult::resultWithResult:name:containerID: not bound +!missing-selector! FSBlockDeviceResource::blockCount not bound +!missing-selector! FSBlockDeviceResource::blockSize not bound +!missing-selector! FSBlockDeviceResource::BSDName not bound +!missing-selector! FSBlockDeviceResource::delayedMetadataWriteFrom:startingAt:length:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::isTerminated not bound +!missing-selector! FSBlockDeviceResource::isWritable not bound +!missing-selector! FSBlockDeviceResource::metadataWriteFrom:startingAt:length:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::physicalBlockSize not bound +!missing-selector! FSBlockDeviceResource::readInto:startingAt:length:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousMetadataClear:wait:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousMetadataFlushWithReplyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousMetadataPurge:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousMetadataReadInto:startingAt:length:readAheadExtents:readAheadCount:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousMetadataReadInto:startingAt:length:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousMetadataWriteFrom:startingAt:length:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousReadInto:startingAt:length:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::synchronousWriteFrom:startingAt:length:replyHandler: not bound +!missing-selector! FSBlockDeviceResource::terminate not bound +!missing-selector! FSBlockDeviceResource::writeFrom:startingAt:length:replyHandler: not bound +!missing-selector! FSContainerIdentifier::volumeIdentifier not bound +!missing-selector! FSEntityIdentifier::init not bound +!missing-selector! FSEntityIdentifier::initWithUUID: not bound +!missing-selector! FSEntityIdentifier::initWithUUID:byteQualifier: not bound +!missing-selector! FSEntityIdentifier::initWithUUID:data: not bound +!missing-selector! FSEntityIdentifier::initWithUUID:longByteQualifier: not bound +!missing-selector! FSEntityIdentifier::qualifier not bound +!missing-selector! FSEntityIdentifier::setQualifier: not bound +!missing-selector! FSEntityIdentifier::setUuid: not bound +!missing-selector! FSEntityIdentifier::uuid not bound +!missing-selector! FSFileName::data not bound +!missing-selector! FSFileName::debugDescription not bound +!missing-selector! FSFileName::initWithBytes:length: not bound +!missing-selector! FSFileName::initWithCString: not bound +!missing-selector! FSFileName::initWithData: not bound +!missing-selector! FSFileName::initWithString: not bound +!missing-selector! FSFileName::string not bound +!missing-selector! FSGenericURLResource::URL not bound +!missing-selector! FSItemAttributes::accessTime not bound +!missing-selector! FSItemAttributes::addedTime not bound +!missing-selector! FSItemAttributes::allocSize not bound +!missing-selector! FSItemAttributes::backupTime not bound +!missing-selector! FSItemAttributes::birthTime not bound +!missing-selector! FSItemAttributes::changeTime not bound +!missing-selector! FSItemAttributes::fileID not bound +!missing-selector! FSItemAttributes::flags not bound +!missing-selector! FSItemAttributes::gid not bound +!missing-selector! FSItemAttributes::inhibitKOIO not bound +!missing-selector! FSItemAttributes::invalidateAllProperties not bound +!missing-selector! FSItemAttributes::isValid: not bound +!missing-selector! FSItemAttributes::linkCount not bound +!missing-selector! FSItemAttributes::mode not bound +!missing-selector! FSItemAttributes::modifyTime not bound +!missing-selector! FSItemAttributes::parentID not bound +!missing-selector! FSItemAttributes::setAccessTime: not bound +!missing-selector! FSItemAttributes::setAddedTime: not bound +!missing-selector! FSItemAttributes::setAllocSize: not bound +!missing-selector! FSItemAttributes::setBackupTime: not bound +!missing-selector! FSItemAttributes::setBirthTime: not bound +!missing-selector! FSItemAttributes::setChangeTime: not bound +!missing-selector! FSItemAttributes::setFileID: not bound +!missing-selector! FSItemAttributes::setFlags: not bound +!missing-selector! FSItemAttributes::setGid: not bound +!missing-selector! FSItemAttributes::setInhibitKOIO: not bound +!missing-selector! FSItemAttributes::setLinkCount: not bound +!missing-selector! FSItemAttributes::setMode: not bound +!missing-selector! FSItemAttributes::setModifyTime: not bound +!missing-selector! FSItemAttributes::setParentID: not bound +!missing-selector! FSItemAttributes::setSize: not bound +!missing-selector! FSItemAttributes::setSupportsLimitedXAttrs: not bound +!missing-selector! FSItemAttributes::setType: not bound +!missing-selector! FSItemAttributes::setUid: not bound +!missing-selector! FSItemAttributes::size not bound +!missing-selector! FSItemAttributes::supportsLimitedXAttrs not bound +!missing-selector! FSItemAttributes::type not bound +!missing-selector! FSItemAttributes::uid not bound +!missing-selector! FSItemGetAttributesRequest::isWanted: not bound +!missing-selector! FSItemGetAttributesRequest::setWantedAttributes: not bound +!missing-selector! FSItemGetAttributesRequest::wantedAttributes not bound +!missing-selector! FSItemSetAttributesRequest::consumedAttributes not bound +!missing-selector! FSItemSetAttributesRequest::setConsumedAttributes: not bound +!missing-selector! FSItemSetAttributesRequest::wasConsumed: not bound +!missing-selector! FSMessageConnection::didCompleteWithError:completionHandler: not bound +!missing-selector! FSMessageConnection::logMessage: not bound +!missing-selector! FSMetadataBlockRange::blockLength not bound +!missing-selector! FSMetadataBlockRange::initWithOffset:blockLength:numberOfBlocks: not bound +!missing-selector! FSMetadataBlockRange::numberOfBlocks not bound +!missing-selector! FSMetadataBlockRange::startBlockOffset not bound +!missing-selector! FSModuleIdentity::attributes not bound +!missing-selector! FSModuleIdentity::bundleIdentifier not bound +!missing-selector! FSModuleIdentity::isEnabled not bound +!missing-selector! FSModuleIdentity::isSystem not bound +!missing-selector! FSModuleIdentity::url not bound +!missing-selector! FSProbeResult::containerID not bound +!missing-selector! FSProbeResult::name not bound +!missing-selector! FSProbeResult::result not bound +!missing-selector! FSResource::isRevoked not bound +!missing-selector! FSResource::makeProxy not bound +!missing-selector! FSResource::revoke not bound +!missing-selector! FSStatFSResult::availableBlocks not bound +!missing-selector! FSStatFSResult::availableBytes not bound +!missing-selector! FSStatFSResult::blockSize not bound +!missing-selector! FSStatFSResult::filesystemSubType not bound +!missing-selector! FSStatFSResult::filesystemTypeName not bound +!missing-selector! FSStatFSResult::freeBlocks not bound +!missing-selector! FSStatFSResult::freeBytes not bound +!missing-selector! FSStatFSResult::freeFiles not bound +!missing-selector! FSStatFSResult::initWithFSTypeName: not bound +!missing-selector! FSStatFSResult::ioSize not bound +!missing-selector! FSStatFSResult::setAvailableBlocks: not bound +!missing-selector! FSStatFSResult::setAvailableBytes: not bound +!missing-selector! FSStatFSResult::setBlockSize: not bound +!missing-selector! FSStatFSResult::setFilesystemSubType: not bound +!missing-selector! FSStatFSResult::setFreeBlocks: not bound +!missing-selector! FSStatFSResult::setFreeBytes: not bound +!missing-selector! FSStatFSResult::setFreeFiles: not bound +!missing-selector! FSStatFSResult::setIoSize: not bound +!missing-selector! FSStatFSResult::setTotalBlocks: not bound +!missing-selector! FSStatFSResult::setTotalBytes: not bound +!missing-selector! FSStatFSResult::setTotalFiles: not bound +!missing-selector! FSStatFSResult::setUsedBlocks: not bound +!missing-selector! FSStatFSResult::setUsedBytes: not bound +!missing-selector! FSStatFSResult::totalBlocks not bound +!missing-selector! FSStatFSResult::totalBytes not bound +!missing-selector! FSStatFSResult::totalFiles not bound +!missing-selector! FSStatFSResult::usedBlocks not bound +!missing-selector! FSStatFSResult::usedBytes not bound +!missing-selector! FSUnaryItem::queue not bound +!missing-selector! FSVolume::initWithVolumeID:volumeName: not bound +!missing-selector! FSVolume::name not bound +!missing-selector! FSVolume::setName: not bound +!missing-selector! FSVolume::volumeID not bound +!missing-selector! FSVolumeSupportedCapabilities::doesNotSupportImmutableFiles not bound +!missing-selector! FSVolumeSupportedCapabilities::doesNotSupportRootTimes not bound +!missing-selector! FSVolumeSupportedCapabilities::doesNotSupportSettingFilePermissions not bound +!missing-selector! FSVolumeSupportedCapabilities::doesNotSupportVolumeSizes not bound +!missing-selector! FSVolumeSupportedCapabilities::setDoesNotSupportImmutableFiles: not bound +!missing-selector! FSVolumeSupportedCapabilities::setDoesNotSupportRootTimes: not bound +!missing-selector! FSVolumeSupportedCapabilities::setDoesNotSupportSettingFilePermissions: not bound +!missing-selector! FSVolumeSupportedCapabilities::setDoesNotSupportVolumeSizes: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupports2TBFiles: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupports64BitObjectIDs: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsActiveJournal: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsCasePreservingNames: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsCaseSensitiveNames: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsDocumentID: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsFastStatFS: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsHardLinks: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsHiddenFiles: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsJournal: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsOpenDenyModes: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsPersistentObjectIDs: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsSharedSpace: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsSparseFiles: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsSymbolicLinks: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsVolumeGroups: not bound +!missing-selector! FSVolumeSupportedCapabilities::setSupportsZeroRuns: not bound +!missing-selector! FSVolumeSupportedCapabilities::supports2TBFiles not bound +!missing-selector! FSVolumeSupportedCapabilities::supports64BitObjectIDs not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsActiveJournal not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsCasePreservingNames not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsCaseSensitiveNames not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsDocumentID not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsFastStatFS not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsHardLinks not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsHiddenFiles not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsJournal not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsOpenDenyModes not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsPersistentObjectIDs not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsSharedSpace not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsSparseFiles not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsSymbolicLinks not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsVolumeGroups not bound +!missing-selector! FSVolumeSupportedCapabilities::supportsZeroRuns not bound +!missing-selector! NSUUID::fs_containerIdentifier not bound +!missing-selector! NSUUID::fs_entityIdentifier not bound +!missing-selector! NSUUID::fs_volumeIdentifier not bound +!missing-type! FSBlockDeviceResource not bound +!missing-type! FSClient not bound +!missing-type! FSContainerIdentifier not bound +!missing-type! FSEntityIdentifier not bound +!missing-type! FSFileName not bound +!missing-type! FSGenericURLResource not bound +!missing-type! FSItem not bound +!missing-type! FSItemAttributes not bound +!missing-type! FSItemGetAttributesRequest not bound +!missing-type! FSItemSetAttributesRequest not bound +!missing-type! FSMessageConnection not bound +!missing-type! FSMetadataBlockRange not bound +!missing-type! FSModuleIdentity not bound +!missing-type! FSProbeResult not bound +!missing-type! FSResource not bound +!missing-type! FSStatFSResult not bound +!missing-type! FSUnaryFileSystem not bound +!missing-type! FSUnaryItem not bound +!missing-type! FSVolume not bound +!missing-type! FSVolumeIdentifier not bound +!missing-type! FSVolumeSupportedCapabilities not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo new file mode 100644 index 000000000000..151890b0201c --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo @@ -0,0 +1,16 @@ +!missing-enum! HKAudiogramConductionType not bound +!missing-enum! HKAudiogramSensitivityTestSide not bound +!missing-selector! +HKAudiogramSample::audiogramSampleWithSensitivityPoints:startDate:endDate:device:metadata: not bound +!missing-selector! +HKAudiogramSensitivityPoint::sensitivityPointWithFrequency:tests:error: not bound +!missing-selector! +HKAudiogramSensitivityPointClampingRange::clampingRangeWithLowerBound:upperBound:error: not bound +!missing-selector! HKAudiogramSensitivityPoint::tests not bound +!missing-selector! HKAudiogramSensitivityPointClampingRange::lowerBound not bound +!missing-selector! HKAudiogramSensitivityPointClampingRange::upperBound not bound +!missing-selector! HKAudiogramSensitivityTest::clampingRange not bound +!missing-selector! HKAudiogramSensitivityTest::initWithSensitivity:type:masked:side:clampingRange:error: not bound +!missing-selector! HKAudiogramSensitivityTest::masked not bound +!missing-selector! HKAudiogramSensitivityTest::sensitivity not bound +!missing-selector! HKAudiogramSensitivityTest::side not bound +!missing-selector! HKAudiogramSensitivityTest::type not bound +!missing-type! HKAudiogramSensitivityPointClampingRange not bound +!missing-type! HKAudiogramSensitivityTest not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo new file mode 100644 index 000000000000..1d2d71785638 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo @@ -0,0 +1 @@ +!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-CoreGraphics.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-CoreGraphics.todo new file mode 100644 index 000000000000..bb9397dd4d7d --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-CoreGraphics.todo @@ -0,0 +1,3 @@ +!missing-field! kCGUseLegacyHDREcosystem not bound +!missing-pinvoke! CGColorConversionInfoConvertData is not bound +!missing-pinvoke! CGColorConversionInfoCreateForToneMapping is not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo new file mode 100644 index 000000000000..1d2d71785638 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo @@ -0,0 +1 @@ +!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo new file mode 100644 index 000000000000..5758ef88de70 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo @@ -0,0 +1 @@ +!missing-field! TVUserActivityTypeBrowsingEntertainmentContent not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo new file mode 100644 index 000000000000..acc0c342e623 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo @@ -0,0 +1,3 @@ +!missing-enum-value! UIPressType native value UIPressTypeTVRemoteFourColors = 33 not bound +!missing-enum-value! UIPressType native value UIPressTypeTVRemoteOneTwoThree = 32 not bound +!missing-field! UIMenuOpen not bound diff --git a/tools/common/SdkVersions.cs b/tools/common/SdkVersions.cs index eb863c6ceec6..ff9018a54da3 100644 --- a/tools/common/SdkVersions.cs +++ b/tools/common/SdkVersions.cs @@ -14,12 +14,12 @@ namespace Xamarin { static class SdkVersions { - public const string Xcode = "16.0"; - public const string OSX = "15.0"; - public const string iOS = "18.0"; - public const string WatchOS = "11.0"; - public const string TVOS = "18.0"; - public const string MacCatalyst = "18.0"; + public const string Xcode = "16.1"; + public const string OSX = "15.1"; + public const string iOS = "18.1"; + public const string WatchOS = "11.1"; + public const string TVOS = "18.1"; + public const string MacCatalyst = "18.1"; #if NET public const string MinOSX = "12.0"; @@ -48,19 +48,19 @@ static class SdkVersions { public const string MinWatchOSCompanionSimulator = "15.0"; public const string MinTVOSSimulator = "15.0"; - public const string MaxiOSSimulator = "18.0"; - public const string MaxWatchOSSimulator = "11.0"; - public const string MaxWatchOSCompanionSimulator = "18.0"; - public const string MaxTVOSSimulator = "18.0"; + public const string MaxiOSSimulator = "18.1"; + public const string MaxWatchOSSimulator = "11.1"; + public const string MaxWatchOSCompanionSimulator = "18.1"; + public const string MaxTVOSSimulator = "18.1"; - public const string MaxiOSDeploymentTarget = "18.0"; - public const string MaxWatchDeploymentTarget = "11.0"; - public const string MaxTVOSDeploymentTarget = "18.0"; + public const string MaxiOSDeploymentTarget = "18.1"; + public const string MaxWatchDeploymentTarget = "11.1"; + public const string MaxTVOSDeploymentTarget = "18.1"; - public const string TargetPlatformVersioniOS = "18.0"; - public const string TargetPlatformVersiontvOS = "18.0"; - public const string TargetPlatformVersionmacOS = "15.0"; - public const string TargetPlatformVersionMacCatalyst = "18.0"; + public const string TargetPlatformVersioniOS = "18.1"; + public const string TargetPlatformVersiontvOS = "18.1"; + public const string TargetPlatformVersionmacOS = "15.1"; + public const string TargetPlatformVersionMacCatalyst = "18.1"; public static Version OSXVersion { get { return new Version (OSX); } } public static Version iOSVersion { get { return new Version (iOS); } } diff --git a/tools/devops/automation/build-pipeline.yml b/tools/devops/automation/build-pipeline.yml index 19aebaec5301..fe701d8555df 100644 --- a/tools/devops/automation/build-pipeline.yml +++ b/tools/devops/automation/build-pipeline.yml @@ -223,7 +223,7 @@ extends: stages: - template: templates/main-stage.yml parameters: - xcodeChannel: Stable + xcodeChannel: Beta macOSName: ${{ parameters.macOSName }} isPR: false provisionatorChannel: ${{ parameters.provisionatorChannel }} diff --git a/tools/devops/automation/build-pull-request.yml b/tools/devops/automation/build-pull-request.yml index ec6c90b03844..06b990e88212 100644 --- a/tools/devops/automation/build-pull-request.yml +++ b/tools/devops/automation/build-pull-request.yml @@ -208,7 +208,7 @@ extends: stages: - template: templates/main-stage.yml parameters: - xcodeChannel: Stable + xcodeChannel: Beta macOSName: ${{ parameters.macOSName }} isPR: true provisionatorChannel: ${{ parameters.provisionatorChannel }} diff --git a/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml b/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml index 7ae6cc065a13..eda9d56fa630 100644 --- a/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/api-diff-pipeline.yml @@ -61,7 +61,7 @@ variables: stages: - template: ../api-diff-stage.yml parameters: - xcodeChannel: Stable + xcodeChannel: Beta macOSName: ${{ parameters.macOSName }} isPR: ${{ parameters.isPR }} provisionatorChannel: ${{ parameters.provisionatorChannel }} diff --git a/tools/devops/automation/templates/pipelines/build-pipeline.yml b/tools/devops/automation/templates/pipelines/build-pipeline.yml index 9967da9d5c98..9badcbd5ac00 100644 --- a/tools/devops/automation/templates/pipelines/build-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/build-pipeline.yml @@ -178,7 +178,7 @@ variables: stages: - template: ../main-stage.yml parameters: - xcodeChannel: Stable + xcodeChannel: Beta macOSName: ${{ parameters.macOSName }} isPR: ${{ parameters.isPR }} provisionatorChannel: ${{ parameters.provisionatorChannel }} diff --git a/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml b/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml index d40034d6782f..45a9aa87fd10 100644 --- a/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/run-tests-pipeline.yml @@ -105,7 +105,7 @@ variables: stages: - template: ../tests-stage.yml parameters: - xcodeChannel: Stable + xcodeChannel: Beta macOSName: ${{ parameters.macOSName }} isPR: ${{ parameters.isPR }} provisionatorChannel: ${{ parameters.provisionatorChannel }} From e860f533dae394929c0cbd83d9de46a05daf1c9a Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 9 Oct 2024 16:57:00 +0200 Subject: [PATCH 038/155] [build] Fix installing the arm64 version of .NET. (#21396) On the bots we're executing with Rosetta, and 'arch' returns 'i386' under Rosetta, so detect when we're executing under Rosetta, and install the arm64 version of .NET in that case as well. Also fix a bug in the same area in our tests. --- builds/Makefile | 4 +++- tests/packaged-macos-tests.mk | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/builds/Makefile b/builds/Makefile index 3a33d9754283..31d213946add 100644 --- a/builds/Makefile +++ b/builds/Makefile @@ -6,6 +6,8 @@ include $(TOP)/Make.config ifeq ($(shell arch),arm64) DOTNET_ARCH=arm64 +else ifeq ($(shell sysctl -n sysctl.proc_translated 2>/dev/null),1) +DOTNET_ARCH=arm64 else DOTNET_ARCH=x64 endif @@ -70,7 +72,7 @@ downloads/%: downloads/%.nupkg $(Q) echo "Unzipped $*." downloads/$(DOTNET_INSTALL_NAME): dotnet-install.sh - $(Q) echo "Downloading and installing .NET $(DOTNET_VERSION) into $@..." + $(Q) echo "Downloading and installing .NET $(DOTNET_VERSION) ($(DOTNET_ARCH)) into $@..." $(Q) ./dotnet-install.sh --install-dir "$@.tmp" --version "$(DOTNET_VERSION)" --architecture $(DOTNET_ARCH) --no-path $$DOTNET_INSTALL_EXTRA_ARGS $(Q) rm -Rf "$@" $(Q) mv "$@.tmp" "$@" diff --git a/tests/packaged-macos-tests.mk b/tests/packaged-macos-tests.mk index 2f21c0c557f8..fa506b9b6beb 100644 --- a/tests/packaged-macos-tests.mk +++ b/tests/packaged-macos-tests.mk @@ -7,7 +7,7 @@ include $(TOP)/Make.config export TargetFrameworkFallbackSearchPaths:=$(MAC_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild-frameworks export MSBuildExtensionsPathFallbackPathsOverride:=$(MAC_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild -ifeq ($(shell uname -a),"arm64") +ifeq ($(shell arch),"arm64") IS_ARM64=1 IS_APPLE_SILICON=1 endif From 5affb0b4e9c64347a3edcce5d242389de6c3b4ec Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 09:41:56 +0200 Subject: [PATCH 039/155] [tests] Remove legacy logic to package and run macOS tests. (#21384) --- tests/package-mac-tests.sh | 50 +--- tests/packaged-macos-tests.mk | 238 +----------------- .../xharness/Jenkins/TestTasks/MSBuildTask.cs | 4 +- .../automation/scripts/run_mac_tests.ps1 | 2 +- 4 files changed, 17 insertions(+), 277 deletions(-) diff --git a/tests/package-mac-tests.sh b/tests/package-mac-tests.sh index b3ff5765d1d4..c096193d9224 100755 --- a/tests/package-mac-tests.sh +++ b/tests/package-mac-tests.sh @@ -16,50 +16,33 @@ mkdir -p "$DIR" make test.config cat test.config -INCLUDE_XAMARIN_LEGACY=$(grep ^INCLUDE_XAMARIN_LEGACY= test.config | sed 's/.*=//') -ENABLE_DOTNET=$(grep ^ENABLE_DOTNET= test.config | sed 's/.*=//') INCLUDE_MAC=$(grep ^INCLUDE_MAC= test.config | sed 's/.*=//') INCLUDE_MACCATALYST=$(grep ^INCLUDE_MACCATALYST= test.config | sed 's/.*=//') XCODE_DEVELOPER_ROOT=$(grep ^XCODE_DEVELOPER_ROOT= test.config | sed 's/.*=//') -MAC_DESTDIR=$(grep ^MAC_DESTDIR= test.config | sed 's/.*=//') export MD_APPLE_SDK_ROOT="$(dirname "$(dirname "$XCODE_DEVELOPER_ROOT")")" -export XAMMAC_FRAMEWORK_PATH=$MAC_DESTDIR/Library/Frameworks/Xamarin.Mac.framework/Versions/Current -export XamarinMacFrameworkRoot=$MAC_DESTDIR/Library/Frameworks/Xamarin.Mac.framework/Versions/Current -export TargetFrameworkFallbackSearchPaths=$MAC_DESTDIR/Library/Frameworks/Mono.framework/External/xbuild-frameworks -export MSBuildExtensionsPathFallbackPathsOverride=$MAC_DESTDIR/Library/Frameworks/Mono.framework/External/xbuild export RootTestsDirectory="$(pwd)" make make .stamp-xharness-configure -if test -n "$INCLUDE_XAMARIN_LEGACY"; then - ../tools/xibuild/xibuild -- /r ../external/Touch.Unit/Touch.Client/macOS/mobile/Touch.Client-macOS-mobile.csproj - ../tools/xibuild/xibuild -- /r ../external/Touch.Unit/Touch.Client/macOS/full/Touch.Client-macOS-full.csproj - ../tools/xibuild/xibuild -- /r bindings-test/macOS/bindings-test.csproj -fi TEST_SUITE_DEPENDENCIES+=(bindings-test) TEST_SUITE_DEPENDENCIES+=(EmbeddedResources) TEST_SUITE_DEPENDENCIES+=(fsharplibrary) TEST_SUITE_DEPENDENCIES+=(BundledResources) -if test -n "$ENABLE_DOTNET"; then - for dep in "${TEST_SUITE_DEPENDENCIES[@]}"; do - if test -n "$INCLUDE_MAC"; then - make -C "$dep"/dotnet/macOS build - fi - if test -n "$INCLUDE_MACCATALYST"; then - make -C "$dep"/dotnet/MacCatalyst build - fi - done -fi +for dep in "${TEST_SUITE_DEPENDENCIES[@]}"; do + if test -n "$INCLUDE_MAC"; then + make -C "$dep"/dotnet/macOS build + fi + if test -n "$INCLUDE_MACCATALYST"; then + make -C "$dep"/dotnet/MacCatalyst build + fi +done TEST_SUITES+=(build-dontlink) TEST_SUITES+=(build-linksdk) TEST_SUITES+=(build-linkall) TEST_SUITES+=(build-introspection) -if test -n "$INCLUDE_XAMARIN_LEGACY"; then - TEST_SUITES+=(build-xammac_tests) -fi TEST_SUITES+=(build-monotouch-test) # Don't build in parallel in CI, it fails randomly due to trying to write to the same files. @@ -69,19 +52,10 @@ fi make -f packaged-macos-tests.mk "${TEST_SUITES[@]}" $MAKE_FLAGS -if test -n "$INCLUDE_XAMARIN_LEGACY"; then - for app in */bin/x86/*/*.app linker/mac/*/bin/x86/*/*.app linker/mac/*/generated-projects/*/bin/x86/*/*.app introspection/Mac/bin/x86/*/*.app; do - mkdir -p "$DIR/tests/$app" - $CP -R "$app" "$DIR/tests/$app/.." - done -fi - -if test -n "$ENABLE_DOTNET"; then - for app in linker/*/*/dotnet/*/bin/*/*/*/*.app */dotnet/*/bin/*/*/*/*.app; do - mkdir -p "$DIR/tests/$app" - $CP -R "$app" "$DIR/tests/$app/.." - done -fi +for app in linker/*/*/dotnet/*/bin/*/*/*/*.app */dotnet/*/bin/*/*/*/*.app; do + mkdir -p "$DIR/tests/$app" + $CP -R "$app" "$DIR/tests/$app/.." +done $CP -p packaged-macos-tests.mk "$DIR/tests" $CP -p run-with-timeout.* "$DIR/tests" diff --git a/tests/packaged-macos-tests.mk b/tests/packaged-macos-tests.mk index fa506b9b6beb..f0c4f7de41a8 100644 --- a/tests/packaged-macos-tests.mk +++ b/tests/packaged-macos-tests.mk @@ -2,11 +2,6 @@ TOP=.. include $(TOP)/Make.config -# Env Variables to use local not system XM - -export TargetFrameworkFallbackSearchPaths:=$(MAC_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild-frameworks -export MSBuildExtensionsPathFallbackPathsOverride:=$(MAC_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild - ifeq ($(shell arch),"arm64") IS_ARM64=1 IS_APPLE_SILICON=1 @@ -16,110 +11,14 @@ IS_ROSETTA=1 IS_APPLE_SILICON=1 endif -MACOS_VERSION:=$(shell sw_vers -productVersion) -MACOS_MAJOR_VERSION:=$(shell echo $(MACOS_VERSION) | awk -F'.' '{print $$1}') -MACOS_MINOR_VERSION:=$(shell echo $(MACOS_VERSION) | awk -F'.' '{print $$2}') -SUPPORTS_MACCATALYST:=$(shell echo '$(MACOS_MAJOR_VERSION).$(MACOS_MINOR_VERSION) >= 10.15' | bc) - CONFIG?=Debug LAUNCH_ARGUMENTS=--autostart --autoexit # Time test runs out after 5 minutes (300 seconds) RUN_WITH_TIMEOUT=./run-with-timeout.csharp 300 -# Some tests need a bit more time... (introspection, monotouch-test/xammac_tests) +# Some tests need a bit more time... (introspection, monotouch-test) RUN_WITH_TIMEOUT_LONGER=./run-with-timeout.csharp 600 -.stamp-configure-projects-mac: Makefile xharness/xharness.exe - $(Q) $(MAKE) .stamp-xharness-configure - $(Q) touch $@ - -PACKAGES_CONFIG:=$(shell git ls-files -- '*.csproj' '*/packages.config' | sed 's/ /\\ /g') -ifdef INCLUDE_XAMARIN_LEGACY -.stamp-nuget-restore-mac: tests-mac.sln $(PACKAGES_CONFIG) - $(Q_XBUILD) $(SYSTEM_XIBUILD) -t -- /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/nuget/NuGet.exe restore tests-mac.sln - $(Q) touch $@ -else -.stamp-nuget-restore-mac: - $(Q) echo "Legacy Xamarin is disabled, so nothing to restore" - $(Q) touch $@ -endif - -# -# dont link -# - -## macOS/legacy/modern -build-mac-modern-dontlink: linker/mac/dont\ link/dont\ link-mac.csproj .stamp-nuget-restore-mac - $(Q_XBUILD) $(SYSTEM_XIBUILD) -- "/property:Configuration=$(CONFIG)" /r /t:Build $(XBUILD_VERBOSITY) "linker/mac/dont link/dont link-mac.csproj" - -exec-mac-modern-dontlink: - @echo "ℹ️ Executing the 'dont link' test for Xamarin.Mac (Modern profile) ℹ️" - $(Q) "linker/mac/dont link/bin/x86/$(CONFIG)/dont link.app/Contents/MacOS/dont link" - -# macOS/legacy/full -build-mac-full-dontlink: linker/mac/dont\ link/generated-projects/full/dont\ link-mac-full.csproj .stamp-nuget-restore-mac - $(Q_XBUILD) $(SYSTEM_XIBUILD) -- "/property:Configuration=$(CONFIG)" /r /t:Build $(XBUILD_VERBOSITY) "linker/mac/dont link/generated-projects/full/dont link-mac-full.csproj" - -exec-mac-full-dontlink: - @echo "ℹ️ Executing the 'dont link' test for Xamarin.Mac (Full profile) ℹ️" - $(Q) $(RUN_WITH_TIMEOUT) "linker/mac/dont link/generated-projects/full/bin/x86/$(CONFIG)-full/dont link.app/Contents/MacOS/dont link" - -# macOS/legacy/system -build-mac-system-dontlink: linker/mac/dont\ link/generated-projects/system/dont\ link-mac-system.csproj .stamp-nuget-restore-mac - $(Q_XBUILD) $(SYSTEM_XIBUILD) -- "/property:Configuration=$(CONFIG)" /r /t:Build $(XBUILD_VERBOSITY) "linker/mac/dont link/generated-projects/system/dont link-mac-system.csproj" - -exec-mac-system-dontlink: - @echo "ℹ️ Executing the 'dont link' test for Xamarin.Mac (System profile) ℹ️" - $(Q) $(RUN_WITH_TIMEOUT) "linker/mac/dont link/generated-projects/system/bin/x86/$(CONFIG)-system/dont link.app/Contents/MacOS/dont link" - -# -# introspection -# - -## macOS/legacy/modern -build-mac-modern-introspection: introspection/Mac/introspection-mac.csproj .stamp-nuget-restore-mac - $(Q_XBUILD) $(SYSTEM_XIBUILD) -- "/property:Configuration=$(CONFIG)" /r /t:Build $(XBUILD_VERBOSITY) "introspection/Mac/introspection-mac.csproj" - -exec-mac-modern-introspection: - @echo "ℹ️ Executing the 'introspection' test for Xamarin.Mac (Modern profile) ℹ️" - $(Q) $(RUN_WITH_TIMEOUT) introspection/Mac/bin/x86/$(CONFIG)/introspection.app/Contents/MacOS/introspection - -# -# xammac tests -# - -## macOS/legacy/modern -build-mac-modern-xammac_tests: xammac_tests/xammac_tests.csproj .stamp-nuget-restore-mac - $(Q_XBUILD) $(SYSTEM_XIBUILD) -- "/property:Configuration=$(CONFIG)" /r /t:Build $(XBUILD_VERBOSITY) "xammac_tests/xammac_tests.csproj" - -exec-mac-modern-xammac_tests: - @echo "ℹ️ Executing the 'xammac' test for Xamarin.Mac (Modern profile) ℹ️" - $(Q) $(RUN_WITH_TIMEOUT_LONGER) xammac_tests/bin/x86/$(CONFIG)/xammac_tests.app/Contents/MacOS/xammac_tests - -# -# link all -# - -## macOS/legacy/modern -build-mac-modern-linkall: linker/mac/link\ all/link\ all-mac.csproj .stamp-nuget-restore-mac - $(Q_XBUILD) $(SYSTEM_XIBUILD) -- "/property:Configuration=$(CONFIG)" /r /t:Build $(XBUILD_VERBOSITY) "linker/mac/link all/link all-mac.csproj" - -exec-mac-modern-linkall: - @echo "ℹ️ Executing the 'link all' test for Xamarin.Mac (Modern profile) ℹ️" - $(Q) $(RUN_WITH_TIMEOUT) "./linker/mac/link all/bin/x86/$(CONFIG)/link all.app/Contents/MacOS/link all" - -# -# link sdk -# - -## macOS/legacy/modern -build-mac-modern-linksdk: linker/mac/link\ sdk/link\ sdk-mac.csproj .stamp-nuget-restore-mac - $(Q_XBUILD) $(SYSTEM_XIBUILD) -- "/property:Configuration=$(CONFIG)" /r /t:Build $(XBUILD_VERBOSITY) "linker/mac/link sdk/link sdk-mac.csproj" - -exec-mac-modern-linksdk: - @echo "ℹ️ Executing the 'link sdk' test for Xamarin.Mac (Modern profile) ℹ️" - $(Q) $(RUN_WITH_TIMEOUT) "./linker/mac/link sdk/bin/x86/$(CONFIG)/link sdk.app/Contents/MacOS/link sdk" - ### .NET dependency projects # We have library projects that are used in multiple test projects. @@ -129,7 +28,6 @@ exec-mac-modern-linksdk: # on eachother. So here we build those library projects first, serialized, # so that when the test projects need them, they're already built. - define DotNetDependentProject .stamp-dotnet-dependency-$(2)-$(1): Makefile $$(Q) $$(MAKE) -C "$(1)/dotnet/$(2)" build @@ -151,67 +49,43 @@ build-mac-dotnet-x64-$(1): .stamp-dotnet-dependency-macOS $$(Q) $$(MAKE) -C "$(1)/dotnet/macOS" build BUILD_ARGUMENTS=/p:RuntimeIdentifier=osx-x64 exec-mac-dotnet-x64-$(1): -ifdef ENABLE_DOTNET @echo "ℹ️ Executing the '$(1)' test for macOS/.NET (x64) ℹ️" $$(Q) $(RUN_WITH_TIMEOUT$(3)) "./$(1)/dotnet/macOS/bin/$(CONFIG)/$(DOTNET_TFM)-macos/osx-x64/$(2).app/Contents/MacOS/$(2)" -else - $(Q) echo "Not executing $@, because .NET is not enabled" -endif # macOS/.NET/arm64 build-mac-dotnet-arm64-$(1): .stamp-dotnet-dependency-macOS $$(Q) $$(MAKE) -C "$(1)/dotnet/macOS" build BUILD_ARGUMENTS=/p:RuntimeIdentifier=osx-arm64 exec-mac-dotnet-arm64-$(1): -ifdef ENABLE_DOTNET ifeq ($(IS_APPLE_SILICON),1) @echo "ℹ️ Executing the '$(1)' test for macOS/.NET (arm64) ℹ️" $$(Q) $(RUN_WITH_TIMEOUT$(3)) "./$(1)/dotnet/macOS/bin/$(CONFIG)/$(DOTNET_TFM)-macos/osx-arm64/$(2).app/Contents/MacOS/$(2)" else @echo "⚠️ Not executing the '$(1)' test for macOS/.NET (arm64) - not executing on Apple Silicon ⚠️" endif -else - $(Q) echo "Not executing $@, because .NET is not enabled" -endif # MacCatalyst/.NET/x64 build-maccatalyst-dotnet-x64-$(1): .stamp-dotnet-dependency-MacCatalyst $$(Q_BUILD) $$(MAKE) -C "$(1)/dotnet/MacCatalyst" build BUILD_ARGUMENTS=/p:RuntimeIdentifier=maccatalyst-x64 exec-maccatalyst-dotnet-x64-$(1): -ifdef ENABLE_DOTNET -ifeq ($(SUPPORTS_MACCATALYST),1) @echo "ℹ️ Executing the '$(1)' test for Mac Catalyst/.NET (x64) ℹ️" $$(Q) $(RUN_WITH_TIMEOUT$(3)) "./$(1)/dotnet/MacCatalyst/bin/$(CONFIG)/$(DOTNET_TFM)-maccatalyst/maccatalyst-x64/$(2).app/Contents/MacOS/$(2)" $(LAUNCH_ARGUMENTS) -else - @echo "⚠️ Not executing the '$(1)' test for Mac Catalyst/.NET (x64) - macOS version $(MACOS_VERSION) is too old ⚠️" -endif -else - $(Q) echo "Not executing $@, because .NET is not enabled" -endif # MacCatalyst/.NET/arm64 build-maccatalyst-dotnet-arm64-$(1):.stamp-dotnet-dependency-MacCatalyst $$(Q) $$(MAKE) -C "$(1)/dotnet/MacCatalyst" build BUILD_ARGUMENTS=/p:RuntimeIdentifier=maccatalyst-arm64 exec-maccatalyst-dotnet-arm64-$(1): -ifdef ENABLE_DOTNET ifeq ($(IS_APPLE_SILICON),1) @echo "ℹ️ Executing the '$(1)' test for Mac Catalyst/.NET (arm64) ℹ️" $$(Q) $(RUN_WITH_TIMEOUT$(3)) "./$(1)/dotnet/MacCatalyst/bin/$(CONFIG)/$(DOTNET_TFM)-maccatalyst/maccatalyst-arm64/$(2).app/Contents/MacOS/$(2)" $(LAUNCH_ARGUMENTS) else @echo "⚠️ Not executing the '$(1)' test for Mac Catalyst/.NET (arm64) - not executing on Apple Silicon ⚠️" endif -else - $(Q) echo "Not executing $@, because .NET is not enabled" -endif -build-$(1): .stamp-nuget-restore-mac +build-$(1): $$(Q) rm -f ".$$@-failure.stamp" -ifdef INCLUDE_XAMARIN_LEGACY - $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-legacy-$(1) || echo "build-legacy-$(1) failed" >> ".$$@-failure.stamp" -endif -ifdef ENABLE_DOTNET ifdef INCLUDE_MAC $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-mac-dotnet-x64-$(1) || echo "build-mac-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-mac-dotnet-arm64-$(1) || echo "build-mac-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" @@ -219,16 +93,11 @@ endif ifdef INCLUDE_MACCATALYST $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-maccatalyst-dotnet-x64-$(1) || echo "build-maccatalyst-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-maccatalyst-dotnet-arm64-$(1) || echo "build-maccatalyst-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" -endif endif $$(Q) if test -e ".$$@-failure.stamp"; then cat ".$$@-failure.stamp"; rm ".$$@-failure.stamp"; exit 1; fi exec-$(1): $$(Q) rm -f ".$$@-failure.stamp" -ifdef INCLUDE_XAMARIN_LEGACY - $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-legacy-$(1) || echo "exec-legacy-$(1) failed" >> ".$$@-failure.stamp" -endif -ifdef ENABLE_DOTNET ifdef INCLUDE_MAC $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-mac-dotnet-x64-$(1) || echo "exec-mac-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-mac-dotnet-arm64-$(1) || echo "exec-mac-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" @@ -236,7 +105,6 @@ endif ifdef INCLUDE_MACCATALYST $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-maccatalyst-dotnet-x64-$(1) || echo "exec-maccatalyst-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-maccatalyst-dotnet-arm64-$(1) || echo "exec-maccatalyst-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" -endif endif $$(Q) if test -e ".$$@-failure.stamp"; then cat ".$$@-failure.stamp"; rm ".$$@-failure.stamp"; exit 1; fi endef @@ -272,12 +140,8 @@ build-maccatalyst-dotnet-x64-$(1): .stamp-dotnet-dependency-MacCatalyst $$(Q_BUILD) $$(MAKE) -C "linker/ios/$(2)/dotnet/MacCatalyst" build BUILD_ARGUMENTS=/p:RuntimeIdentifier=maccatalyst-x64 exec-maccatalyst-dotnet-x64-$(1): -ifeq ($(SUPPORTS_MACCATALYST),1) @echo "ℹ️ Executing the '$(2)' test for Mac Catalyst/.NET (x64) ℹ️" $$(Q) $(RUN_WITH_TIMEOUT) "./linker/ios/$(2)/dotnet/MacCatalyst/bin/$(CONFIG)/$(DOTNET_TFM)-maccatalyst/maccatalyst-x64/$(2).app/Contents/MacOS/$(2)" $(LAUNCH_ARGUMENTS) -else - @echo "⚠️ Not executing the '$(2)' test for Mac Catalyst/.NET (x64) - macOS version $(MACOS_VERSION) is too old ⚠️" -endif # MacCatalyst/.NET/arm64 build-maccatalyst-dotnet-arm64-$(1): .stamp-dotnet-dependency-MacCatalyst @@ -291,12 +155,8 @@ else @echo "⚠️ Not executing the '$(2)' test for Mac Catalyst/.NET (arm64) - not executing on Apple Silicon ⚠️" endif -build-$(1): .stamp-nuget-restore-mac +build-$(1): $$(Q) rm -f ".$$@-failure.stamp" -ifdef INCLUDE_XAMARIN_LEGACY - $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-legacy-$(1) || echo "build-legacy-$(1) failed" >> ".$$@-failure.stamp" -endif -ifdef ENABLE_DOTNET ifdef INCLUDE_MAC $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-mac-dotnet-x64-$(1) || echo "build-mac-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-mac-dotnet-arm64-$(1) || echo "build-mac-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" @@ -304,16 +164,11 @@ endif ifdef INCLUDE_MACCATALYST $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-maccatalyst-dotnet-x64-$(1) || echo "build-maccatalyst-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk build-maccatalyst-dotnet-arm64-$(1) || echo "build-maccatalyst-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" -endif endif $$(Q) if test -e ".$$@-failure.stamp"; then cat ".$$@-failure.stamp"; rm ".$$@-failure.stamp"; exit 1; fi exec-$(1): $$(Q) rm -f ".$$@-failure.stamp" -ifdef INCLUDE_XAMARIN_LEGACY - $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-legacy-$(1) || echo "exec-legacy-$(1) failed" >> ".$$@-failure.stamp" -endif -ifdef ENABLE_DOTNET ifdef INCLUDE_MAC $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-mac-dotnet-x64-$(1) || echo "exec-mac-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-mac-dotnet-arm64-$(1) || echo "exec-mac-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" @@ -321,7 +176,6 @@ endif ifdef INCLUDE_MACCATALYST $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-maccatalyst-dotnet-x64-$(1) || echo "exec-maccatalyst-dotnet-x64-$(1) failed" >> ".$$@-failure.stamp" $$(Q) $$(MAKE) -f packaged-macos-tests.mk exec-maccatalyst-dotnet-arm64-$(1) || echo "exec-maccatalyst-dotnet-arm64-$(1) failed" >> ".$$@-failure.stamp" -endif endif $$(Q) if test -e ".$$@-failure.stamp"; then cat ".$$@-failure.stamp"; rm ".$$@-failure.stamp"; exit 1; fi endef @@ -329,89 +183,3 @@ endef $(eval $(call DotNetLinkerTest,dontlink,dont link)) $(eval $(call DotNetLinkerTest,linksdk,link sdk)) $(eval $(call DotNetLinkerTest,linkall,link all)) - -# Container targets that run multiple test projects - -# build targets - -build-legacy-dontlink: .stamp-nuget-restore-mac - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk build-mac-modern-dontlink || echo "build-mac-modern-dontlink failed" >> ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk build-mac-full-dontlink || echo "build-mac-full-dontlink failed" >> ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk build-mac-system-dontlink || echo "build-mac-system-dontlink failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi - -build-legacy-introspection: .stamp-nuget-restore-mac - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk build-mac-modern-introspection || echo "build-mac-modern-introspection failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi - -build-xammac_tests: .stamp-nuget-restore-mac - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk build-mac-modern-xammac_tests || echo "build-mac-modern-xammac_tests failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi - -build-legacy-monotouch-test: ; - # nothing to do here - -build-legacy-linkall: .stamp-nuget-restore-mac - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk build-mac-modern-linkall || echo "build-mac-modern-link all failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi - -build-legacy-linksdk: .stamp-nuget-restore-mac - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk build-mac-modern-linksdk || echo "build-mac-modern-linksdk failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi - -# execution targets - -exec-legacy-dontlink: -ifdef INCLUDE_XAMARIN_LEGACY - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk exec-mac-modern-dontlink || echo "exec-mac-modern-dont link failed" >> ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk exec-mac-full-dontlink || echo "exec-mac-full-dont link failed" >> ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk exec-mac-system-dontlink || echo "exec-mac-system-dont link failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi -else - $(Q) echo "Not executing $@, because legacy Xamarin is not enabled" -endif - -exec-legacy-introspection: -ifdef INCLUDE_XAMARIN_LEGACY - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk exec-mac-modern-introspection || echo "exec-mac-modern-introspection failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi -else - $(Q) echo "Not executing $@, because legacy Xamarin is not enabled" -endif - -exec-xammac_tests: -ifdef INCLUDE_XAMARIN_LEGACY - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk exec-mac-modern-xammac_tests || echo "exec-mac-modern-xammac_tests failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi -else - $(Q) echo "Not executing $@, because legacy Xamarin is not enabled" -endif - -exec-legacy-monotouch-test: ; - # nothing to do here - -exec-legacy-linkall: -ifdef INCLUDE_XAMARIN_LEGACY - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk exec-mac-modern-linkall || echo "exec-mac-modern-linkall failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi -else - $(Q) echo "Not executing $@, because legacy Xamarin is not enabled" -endif - -exec-legacy-linksdk: -ifdef INCLUDE_XAMARIN_LEGACY - $(Q) rm -f ".$@-failure.stamp" - $(Q) $(MAKE) -f packaged-macos-tests.mk exec-mac-modern-linksdk || echo "exec-mac-modern-link sdk failed" >> ".$@-failure.stamp" - $(Q) if test -e ".$@-failure.stamp"; then cat ".$@-failure.stamp"; rm ".$@-failure.stamp"; exit 1; fi -else - $(Q) echo "Not executing $@, because legacy Xamarin is not enabled" -endif diff --git a/tests/xharness/Jenkins/TestTasks/MSBuildTask.cs b/tests/xharness/Jenkins/TestTasks/MSBuildTask.cs index c846f2d25acf..c407e45b08f2 100644 --- a/tests/xharness/Jenkins/TestTasks/MSBuildTask.cs +++ b/tests/xharness/Jenkins/TestTasks/MSBuildTask.cs @@ -9,9 +9,7 @@ namespace Xharness.Jenkins.TestTasks { class MSBuildTask : BuildProjectTask { protected virtual string ToolName { get { - if (TestProject.IsDotNetProject) - return Jenkins.Harness.GetDotNetExecutable (Path.GetDirectoryName (ProjectFile)); - return Jenkins.Harness.XIBuildPath; + return Jenkins.Harness.GetDotNetExecutable (Path.GetDirectoryName (ProjectFile)); } } diff --git a/tools/devops/automation/scripts/run_mac_tests.ps1 b/tools/devops/automation/scripts/run_mac_tests.ps1 index 67011801bd5c..ff459df5ae15 100644 --- a/tools/devops/automation/scripts/run_mac_tests.ps1 +++ b/tools/devops/automation/scripts/run_mac_tests.ps1 @@ -36,7 +36,7 @@ dir env: # Claim that the tests timed out before we start Set-Content -Path "$GithubFailureCommentFile" -Value "Tests timed out" -$macTest = @("dontlink", "introspection", "linksdk", "linkall", "xammac_tests", "monotouch-test") +$macTest = @("dontlink", "introspection", "linksdk", "linkall", "monotouch-test") foreach ($t in $macTest) { $testName = "exec-$t" Write-Host "Execution test $testName" From 8134042f749b56cdd546c47b89335547a04d4600 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 09:43:15 +0200 Subject: [PATCH 040/155] [fsharp] Remove all build logic. (#21352) We don't ship any F# code in .NET. --- Makefile | 2 +- fsharp/.gitignore | 4 - fsharp/Makefile | 214 ---------------------------------------------- 3 files changed, 1 insertion(+), 219 deletions(-) delete mode 100644 fsharp/.gitignore delete mode 100644 fsharp/Makefile diff --git a/Makefile b/Makefile index 5f79a6024671..780e3ff3803b 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ TOP=. -SUBDIRS=builds runtime fsharp src msbuild tools +SUBDIRS=builds runtime src msbuild tools include $(TOP)/Make.config include $(TOP)/mk/versions.mk diff --git a/fsharp/.gitignore b/fsharp/.gitignore deleted file mode 100644 index ee3d10ec8d6b..000000000000 --- a/fsharp/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -build.stamp -Makefile.inc -fsharp - diff --git a/fsharp/Makefile b/fsharp/Makefile deleted file mode 100644 index 6930e8414c92..000000000000 --- a/fsharp/Makefile +++ /dev/null @@ -1,214 +0,0 @@ -TOP=.. -include $(TOP)/Make.config - -# By default we'll get the F# binaries from the macios-binaries repository. -# It's still possible to build from source, by passing "FSHARP_BUILD_FROM_SOURCE=1" when building, -# which will automatically clone the fsharp repository, and build what's needed. -# The FSHARP_SOURCE_HASH variable below defines which fsharp hash to build. - -FSHARP_SOURCE_HASH=7171700877115e2243b4edbc4e2eb88d019e02b0 -FSHARP_SOURCE_BRANCH=master - -FSHARP_BINARIES_PATH=$(abspath $(MACIOS_BINARIES_PATH)/fsharp) -FSHARP_SOURCE_PATH=$(abspath $(CURDIR)/fsharp) - -ifeq ($(FSHARP_BUILD_FROM_SOURCE),) -FSHARP_PATH=$(FSHARP_BINARIES_PATH) -FSHARP_BUILD_PATH=$(FSHARP_BINARIES_PATH) -else -FSHARP_PATH=$(FSHARP_SOURCE_PATH) -FSHARP_BUILD_PATH=build - -# Create a list of all the source files in the fsharp repo to use as dependencies. -# But skip any files with spaces, because make + spaces is not a good combination. -Makefile.inc: $(FSHARP_SOURCE_PATH) - $(Q) printf "FSHARP_FILES := \\\\\\n" >> $@.tmp - $(Q) git --git-dir=$(FSHARP_SOURCE_PATH)/.git --work-tree=$(FSHARP_SOURCE_PATH) ls-tree --full-tree -r HEAD --name-only | grep -v ' ' | sed -e 's_^\(.*\)_ $(FSHARP_SOURCE_PATH)/\1 \\_' >> $@.tmp - $(Q) mv $@.tmp $@ --include Makefile.inc -endif - -FSHARP_TARGET_FILES = \ - FSharp.Core.dll \ - FSharp.Core.dll.mdb \ - FSharp.Core.optdata \ - FSharp.Core.sigdata \ - FSharp.Core.xml \ - -$(FSHARP_SOURCE_PATH): - $(Q) echo "Cloning the fsharp repository..." - $(Q) git clone -q https://github.com/fsharp/fsharp fsharp - $(Q) cd fsharp && git checkout $(FSHARP_SOURCE_BRANCH) && git reset --hard $(FSHARP_SOURCE_HASH) - -BIN_DIR=$(FSHARP_PATH)/lib/release -IOS_BIN_DIR = $(FSHARP_PATH)/lib/release/monotouch -WATCH_BIN_DIR = $(FSHARP_PATH)/lib/release/xamarinwatchos -TVOS_BIN_DIR = $(FSHARP_PATH)/lib/release/xamarintvos -MAC_MOBILE_BIN_DIR = $(FSHARP_PATH)/lib/release/xamarinmacmobile -MAC_45_BIN_DIR = $(FSHARP_PATH)/lib/release/xamarinmacfull - -# Xamarin.iOS - -IOS_FSHARP_TARGETS = \ - $(foreach file,$(FSHARP_TARGET_FILES),$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/$(file)) \ - $(foreach file,$(FSHARP_TARGET_FILES),$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/$(file)) \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/LICENSE-fsharp \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/LICENSE-fsharp \ - -IOS_FSHARP_DIRECTORIES = \ - build/monotouch \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS \ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/LICENSE-fsharp: $(FSHARP_PATH)/LICENSE | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/%.dll: $(FSHARP_BUILD_PATH)/monotouch/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/%: $(IOS_BIN_DIR)/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/LICENSE-fsharp: $(FSHARP_PATH)/LICENSE | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/%.dll: $(FSHARP_BUILD_PATH)/monotouch/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/%: $(IOS_BIN_DIR)/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS - $(Q) install -m 0644 $< $@ - -# Xamarin.WatchOS - - -WATCH_FSHARP_TARGETS = \ - $(foreach file,$(FSHARP_TARGET_FILES),$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/$(file)) \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/LICENSE-fsharp \ - -WATCH_FSHARP_DIRECTORIES = \ - build/xamarinwatchos \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS \ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/LICENSE-fsharp: $(FSHARP_PATH)/LICENSE | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/%.dll: $(FSHARP_BUILD_PATH)/xamarinwatchos/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/%: $(WATCH_BIN_DIR)/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS - $(Q) install -m 0644 $< $@ - -# Xamarin.TVOS - - -TVOS_FSHARP_TARGETS = \ - $(foreach file,$(FSHARP_TARGET_FILES),$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/$(file)) \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/LICENSE-fsharp \ - -TVOS_FSHARP_DIRECTORIES = \ - build/xamarintvos \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS \ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/LICENSE-fsharp: $(FSHARP_PATH)/LICENSE | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/%.dll: $(FSHARP_BUILD_PATH)/xamarintvos/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/%: $(TVOS_BIN_DIR)/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS - $(Q) install -m 0644 $< $@ - -# Xamarin.Mac - -MAC_FSHARP_TARGETS = \ - $(foreach file,$(FSHARP_TARGET_FILES),$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/$(file)) \ - $(foreach file,$(FSHARP_TARGET_FILES),$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/$(file)) \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/LICENSE-fsharp \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/LICENSE-fsharp \ - -MAC_FSHARP_DIRECTORIES = \ - build/xamarinmacfull \ - build/xamarinmacmobile \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5 \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac \ - -## XM full - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/LICENSE-fsharp: $(FSHARP_PATH)/LICENSE | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5 - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/%.dll: $(FSHARP_BUILD_PATH)/xamarinmacfull/%.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5 - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/%: $(MAC_45_BIN_DIR)/% | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5 - $(Q) install -m 0644 $< $@ - -## XM mobile - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/LICENSE-fsharp: $(FSHARP_PATH)/LICENSE | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/%.dll: $(FSHARP_BUILD_PATH)/xamarinmacmobile/%.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/%: $(MAC_MOBILE_BIN_DIR)/% | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac - $(Q) install -m 0644 $< $@ - -# Common - -ifdef INCLUDE_IOS -FSHARP_TARGETS += $(IOS_FSHARP_TARGETS) -FSHARP_DIRECTORIES += $(IOS_FSHARP_DIRECTORIES) -FSHARP_BUILD_TARGETS += only-monotouch -ifdef INCLUDE_WATCH -FSHARP_TARGETS += $(WATCH_FSHARP_TARGETS) -FSHARP_DIRECTORIES += $(WATCH_FSHARP_DIRECTORIES) -FSHARP_BUILD_TARGETS += only-xamarinwatchos -endif -ifdef INCLUDE_TVOS -FSHARP_TARGETS += $(TVOS_FSHARP_TARGETS) -FSHARP_DIRECTORIES += $(TVOS_FSHARP_DIRECTORIES) -FSHARP_BUILD_TARGETS += only-xamarintvos -endif -endif - -ifdef INCLUDE_MAC -FSHARP_TARGETS += $(MAC_FSHARP_TARGETS) -FSHARP_DIRECTORIES += $(MAC_FSHARP_DIRECTORIES) -FSHARP_BUILD_TARGETS += only-xamarinmac -endif - -$(FSHARP_DIRECTORIES): - $(Q) mkdir -p $@ - -### Sign the assemblies. This is done in a temporary directory so that we don't have to re-sign on every install. -build/%.dll: $(BIN_DIR)/%.dll | build/monotouch build/xamarinmacmobile build/xamarinmacfull build/xamarinwatchos build/xamarintvos - $(Q) $(CP) $< $@ - $(Q_SN) MONO_CFG_DIR="$(TOP)" $(SYSTEM_SN) -q -R "$@" "$(PRODUCT_KEY_PATH)" - -build.stamp: export TargetFrameworkFallbackSearchPaths=$(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild-frameworks -build.stamp: export MSBuildExtensionsPathFallbackPathsOverride=$(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild -build.stamp: $(FSHARP_FILES) $(FSHARP_PATH)/Makefile - $(MAKE) -C $(FSHARP_PATH)/src/fsharp build-proto - $(MAKE) -C $(FSHARP_PATH)/src/fsharp $(FSHARP_BUILD_TARGETS) - $(Q) touch $@ - -ifneq ($(FSHARP_BUILD_FROM_SOURCE),) -$(FSHARP_TARGETS): build.stamp -endif - -all-local:: $(FSHARP_TARGETS) -install-local:: $(FSHARP_TARGETS) - -$(FSHARP_PATH)/autogen.sh: $(FSHARP_SOURCE_PATH) - -$(FSHARP_PATH)/Makefile: $(FSHARP_PATH)/autogen.sh $(FSHARP_FILES) /Library/Frameworks/Mono.framework/Versions/Current/updateinfo - @echo "Executing autogen for fsharp..." - $(Q) cd $(FSHARP_PATH) && ./autogen.sh --prefix=/Library/Frameworks/Mono.framework/Versions/Current - @echo "Executed autogen for fsharp" - -clean-local:: - git clean -xfd - cd $(FSHARP_PATH) && git clean -xfd - -include $(TOP)/mk/rules.mk From 3a16b7f0adce7bc1035aa3d9747c3ff61c6d5820 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 09:51:01 +0200 Subject: [PATCH 041/155] [msbuild] Resolve the full path to the compiled entitlements in the CompileEntitlements task. (#21372) This saves a round-trip between the Mac and Windows machine for remote builds. --- .../Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs | 5 +++++ msbuild/Xamarin.Shared/Xamarin.Shared.targets | 9 --------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs index 97b957bc65c1..9bf8ee809c47 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs @@ -521,6 +521,11 @@ public override bool Execute () SaveArchivedExpandedEntitlements (archived); + /* The path to the entitlements must be resolved to the full path, because we might want to reference it from a containing project that just references this project, + * and in that case it becomes a bit complicated to resolve to a full path on disk when building remotely from Windows. Instead just resolve to a full path here, + * and use that from now on. This has to be done from a task, so that we get the full path on the mac when executed remotely from Windows. */ + CompiledEntitlements = new TaskItem (Path.GetFullPath (CompiledEntitlements!.ItemSpec)); + if (Platform == Utils.ApplePlatform.MacCatalyst) { EntitlementsInSignature = CompiledEntitlements; } else if (SdkIsSimulator) { diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index 6c9d3ebf9d4a..34adc65727dd 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -695,15 +695,6 @@ Copyright (C) 2018 Microsoft. All rights reserved. - - - - - - - From 55baa59437830aae297ea56cca0323fbaf52e1ef Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 10:22:10 +0200 Subject: [PATCH 042/155] [UIKit] Fix a few UITraitCollection bindings. Fixes #21377. (#21380) The methods 'GetTraitCollectionWithTraits' and 'GetTraitCollectionByModifyingTraits' takes a callback, but the callback had the wrong signature. So introduce a new overload for each of these methods, using a delegate with the correct signature. Also deprecate 'FromTraitsFromCollections' according to both headers and documentation. Fixes https://github.com/xamarin/xamarin-macios/issues/21377. --- src/UIKit/UITraitCollection.cs | 25 ++++++++++++------- src/uikit.cs | 16 +++++++++++- .../Documentation.KnownFailures.txt | 1 + 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/UIKit/UITraitCollection.cs b/src/UIKit/UITraitCollection.cs index 9dc58421e8ff..fa93b7330118 100644 --- a/src/UIKit/UITraitCollection.cs +++ b/src/UIKit/UITraitCollection.cs @@ -8,6 +8,8 @@ // using System; +using System.ComponentModel; + using ObjCRuntime; using Foundation; @@ -15,17 +17,22 @@ #nullable disable namespace UIKit { -#if !WATCH public partial class UITraitCollection { - -#if !NET - [Obsolete ("Please use the static 'Create' method instead.")] - public UITraitCollection FromPreferredContentSizeCategory (UIContentSizeCategory category) - => Create (category); -#endif - public static UITraitCollection Create (UIContentSizeCategory category) => FromPreferredContentSizeCategory (category.GetConstant ()); - } + +#if !XAMCORE_5_0 + [Obsolete ("Use the overload that takes a 'UITraitMutations' parameter instead.", false)] + [EditorBrowsable (EditorBrowsableState.Never)] + [SupportedOSPlatform ("tvos17.0")] + [SupportedOSPlatform ("ios17.0")] + [SupportedOSPlatform ("maccatalyst17.0")] + [BindingImpl (BindingImplOptions.GeneratedCode | BindingImplOptions.Optimizable)] + public virtual UITraitCollection GetTraitCollectionByModifyingTraits (Func mutations) + { + // there's nothing useful this method can do. + throw new NotSupportedException ($"Use the overload that takes a 'UITraitMutations' parameter instead."); + } #endif + } } diff --git a/src/uikit.cs b/src/uikit.cs index a8c8a1bb48fc..f1d33b25bb51 100644 --- a/src/uikit.cs +++ b/src/uikit.cs @@ -18635,6 +18635,8 @@ partial interface UITraitEnvironment { void TraitCollectionDidChange ([NullAllowed] UITraitCollection previousTraitCollection); } + delegate void UITraitMutations (IUIMutableTraits mutableTraits); + [NoWatch] [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] @@ -18664,6 +18666,9 @@ partial interface UITraitCollection : NSCopying, NSSecureCoding { [Export ("containsTraitsInCollection:")] bool Contains (UITraitCollection trait); + [Deprecated (PlatformName.iOS, 17, 0, message: "Use 'GetTraitCollectionWithTraits(UITraitMutations)' and 'GetTraitCollectionByModifyingTraits(UITraitMutations)' instead.")] + [Deprecated (PlatformName.MacCatalyst, 17, 0, message: "Use 'GetTraitCollectionWithTraits(UITraitMutations)' and 'GetTraitCollectionByModifyingTraits(UITraitMutations)' instead.")] + [Deprecated (PlatformName.TvOS, 17, 0, message: "Use 'GetTraitCollectionWithTraits(UITraitMutations)' and 'GetTraitCollectionByModifyingTraits(UITraitMutations)' instead.")] [Static, Export ("traitCollectionWithTraitsFromCollections:")] UITraitCollection FromTraitsFromCollections (UITraitCollection [] traitCollections); @@ -18812,14 +18817,23 @@ partial interface UITraitCollection : NSCopying, NSSecureCoding { [Export ("toolbarItemPresentationSize")] UINSToolbarItemPresentationSize ToolbarItemPresentationSize { get; } +#if !XAMCORE_5_0 + [Obsolete ("Use the overload that takes a 'UITraitMutations' parameter instead.")] + [EditorBrowsable (EditorBrowsableState.Never)] [Watch (10, 0), TV (17, 0), iOS (17, 0), MacCatalyst (17, 0)] [Static] [Export ("traitCollectionWithTraits:")] UITraitCollection GetTraitCollectionWithTraits (Func mutations); +#endif + + [Watch (10, 0), TV (17, 0), iOS (17, 0), MacCatalyst (17, 0)] + [Static] + [Export ("traitCollectionWithTraits:")] + UITraitCollection GetTraitCollectionWithTraits (UITraitMutations mutations); [Watch (10, 0), TV (17, 0), iOS (17, 0), MacCatalyst (17, 0)] [Export ("traitCollectionByModifyingTraits:")] - UITraitCollection GetTraitCollectionByModifyingTraits (Func mutations); + UITraitCollection GetTraitCollectionByModifyingTraits (UITraitMutations mutations); [Watch (10, 0), TV (17, 0), iOS (17, 0), MacCatalyst (17, 0)] [Static] diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index db2e9ad2042c..3e025923b416 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -86759,6 +86759,7 @@ T:UIKit.UITouchProperties T:UIKit.UITouchType T:UIKit.UITraitEnvironment T:UIKit.UITraitEnvironmentLayoutDirection +T:UIKit.UITraitMutations T:UIKit.UITransitionContext T:UIKit.UITransitionViewControllerKind T:UIKit.UIUpdateLinkCallback From 569a5d47e68942f23851f717ecdfb5ff3698c864 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 10:27:00 +0200 Subject: [PATCH 043/155] Remove the opentk submodule. (#21370) It's only used in legacy Xamarin, so it's no longer needed. --- .gitmodules | 4 ---- Make.config | 2 -- external/opentk | 1 - mk/versions.mk | 1 - 4 files changed, 8 deletions(-) delete mode 160000 external/opentk diff --git a/.gitmodules b/.gitmodules index aab80f6e4568..1e4489016f1e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,10 +2,6 @@ path = external/macios-binaries url = ../../xamarin/macios-binaries branch = main -[submodule "external/opentk"] - path = external/opentk - url = ../../mono/opentk.git - branch = main [submodule "external/Touch.Unit"] path = external/Touch.Unit url = ../../xamarin/Touch.Unit.git diff --git a/Make.config b/Make.config index 6842ebe01c79..38f3fa1f666a 100644 --- a/Make.config +++ b/Make.config @@ -545,11 +545,9 @@ MACOS_X64_SWIFTFLAGS=$(MACOS_COMMON_SWIFTFLAGS) -target x86_64-apple-macos$(MIN_ # things in other places if they absolutely must. MONO_PATH=$(TOP)/external/mono TOUCH_UNIT_PATH=$(TOP)/external/Touch.Unit -OPENTK_PATH=$(TOP)/external/opentk XAMARIN_MACDEV_PATH=$(TOP)/external/Xamarin.MacDev MACCORE_PATH=$(TOP)/../maccore MACIOS_BINARIES_PATH=$(TOP)/external/macios-binaries -IKVM_PATH=$(TOP)/external/ikvm-fork MONOTOUCH_DIALOG_PATH=$(TOP)/external/MonoTouch.Dialog API_TOOLS_PATH=$(TOP)/external/api-tools diff --git a/external/opentk b/external/opentk deleted file mode 160000 index 396bc90c7ac2..000000000000 --- a/external/opentk +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 396bc90c7ac2e7ce442840a5e8bd91e5e79b381e diff --git a/mk/versions.mk b/mk/versions.mk index e1ff5444d13f..d182a3909ba9 100644 --- a/mk/versions.mk +++ b/mk/versions.mk @@ -65,7 +65,6 @@ endef $(shell rm -f .check-versions-failure) $(eval $(call CheckSubmoduleTemplate,Touch.Unit,TOUCH_UNIT)) -$(eval $(call CheckSubmoduleTemplate,opentk,OPENTK)) $(eval $(call CheckSubmoduleTemplate,Xamarin.MacDev,XAMARIN_MACDEV)) $(eval $(call CheckSubmoduleTemplate,macios-binaries,MACIOS_BINARIES)) $(eval $(call CheckSubmoduleTemplate,MonoTouch.Dialog,MONOTOUCH_DIALOG)) From 7781c5184e9695860fa7b5c20482fe22c8865fea Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 11:23:39 +0200 Subject: [PATCH 044/155] [system-dependencies] Remove the cmake dependency. (#21375) It was needed to build Mono from source, which we haven't done in quite a few years now. --- Make.config | 4 --- system-dependencies.sh | 49 +--------------------------- tests/test-dependencies.sh | 2 +- tools/devops/provision-shared.in.csx | 1 - 4 files changed, 2 insertions(+), 54 deletions(-) diff --git a/Make.config b/Make.config index 38f3fa1f666a..f43673443b79 100644 --- a/Make.config +++ b/Make.config @@ -261,10 +261,6 @@ MIN_MONO_URL=https://download.mono-project.com/archive/6.12.0/macos-10-universal # Minimum Mono version for Xamarin.Mac apps using the system mono MIN_XM_MONO_VERSION=6.4.0.94 -# Minimum CMake version -MIN_CMAKE_URL=https://cmake.org/files/v3.6/cmake-3.6.2-Darwin-x86_64.dmg -MIN_CMAKE_VERSION=2.8.8 - # ObjectiveSharpie min/max versions MIN_SHARPIE_VERSION=3.5.115 MAX_SHARPIE_VERSION=3.5.999 diff --git a/system-dependencies.sh b/system-dependencies.sh index 730279a1bcee..886f493a4d81 100755 --- a/system-dependencies.sh +++ b/system-dependencies.sh @@ -43,11 +43,6 @@ while ! test -z $1; do unset IGNORE_MONO shift ;; - --provision-cmake) - PROVISION_CMAKE=1 - unset IGNORE_CMAKE - shift - ;; --provision-7z) PROVISION_7Z=1 unset IGNORE_7Z @@ -103,8 +98,6 @@ while ! test -z $1; do unset IGNORE_VISUAL_STUDIO PROVISION_XCODE=1 unset IGNORE_XCODE - PROVISION_CMAKE=1 - unset IGNORE_CMAKE PROVISION_7Z=1 unset IGNORE_7Z PROVISION_HOMEBREW=1 @@ -130,7 +123,6 @@ while ! test -z $1; do IGNORE_MONO=1 IGNORE_VISUAL_STUDIO=1 IGNORE_XCODE=1 - IGNORE_CMAKE=1 IGNORE_7Z=1 IGNORE_HOMEBREW=1 IGNORE_SHARPIE=1 @@ -165,10 +157,6 @@ while ! test -z $1; do IGNORE_PYTHON3=1 shift ;; - --ignore-cmake) - IGNORE_CMAKE=1 - shift - ;; --ignore-7z) IGNORE_7Z=1 shift @@ -787,40 +775,6 @@ function check_checkout_dir () { ok "Checkout location will not result in test problems." } - -function install_cmake () { - if ! brew --version >& /dev/null; then - fail "Asked to install cmake, but brew is not installed." - return - fi - - brew install cmake -} - -function check_cmake () { - if ! test -z $IGNORE_CMAKE; then return; fi - - local MIN_CMAKE_VERSION=`grep MIN_CMAKE_VERSION= Make.config | sed 's/.*=//'` - local CMAKE_URL=`grep CMAKE_URL= Make.config | sed 's/.*=//'` - - if ! cmake --version &> /dev/null; then - if ! test -z $PROVISION_CMAKE; then - install_cmake - else - fail "You must install CMake ($CMAKE_URL)" - fi - return - fi - - ACTUAL_CMAKE_VERSION=$(cmake --version | grep "cmake version" | sed 's/cmake version //') - if ! is_at_least_version $ACTUAL_CMAKE_VERSION $MIN_CMAKE_VERSION; then - fail "You must have at least CMake $MIN_CMAKE_VERSION (found $ACTUAL_CMAKE_VERSION)" - return - fi - - ok "Found CMake $ACTUAL_CMAKE_VERSION (at least $MIN_CMAKE_VERSION is required)" -} - function install_7z () { if ! brew --version >& /dev/null; then fail "Asked to install 7z, but brew is not installed." @@ -861,7 +815,7 @@ IFS=' HOMEBREW_VERSION=($(brew --version 2>/dev/null)) log "Installed Homebrew ($HOMEBREW_VERSION)" else - warn "Could not find Homebrew. Homebrew is required to auto-provision some dependencies (cmake), but not required otherwise." + warn "Could not find Homebrew. Homebrew is required to auto-provision some dependencies (p7zip), but not required otherwise." fi IFS=$IFS_tmp } @@ -1012,7 +966,6 @@ check_shellcheck check_yamllint check_python3 check_mono -check_cmake check_7z check_objective_sharpie check_old_simulators diff --git a/tests/test-dependencies.sh b/tests/test-dependencies.sh index 0e23982874ce..844befe448df 100755 --- a/tests/test-dependencies.sh +++ b/tests/test-dependencies.sh @@ -1,4 +1,4 @@ #!/bin/bash -ex cd "$(dirname "$0")" -./system-dependencies.sh --provision-mono --ignore-xamarin-studio --ignore-xcode --ignore-osx --ignore-cmake --ignore-dotnet --ignore-shellcheck --ignore-yamllint +./system-dependencies.sh --provision-mono --ignore-xamarin-studio --ignore-xcode --ignore-osx --ignore-dotnet --ignore-shellcheck --ignore-yamllint diff --git a/tools/devops/provision-shared.in.csx b/tools/devops/provision-shared.in.csx index 53816241322a..bd0989fc68d8 100644 --- a/tools/devops/provision-shared.in.csx +++ b/tools/devops/provision-shared.in.csx @@ -70,7 +70,6 @@ void ProvisionBrewPackages () BrewPackages ( "shellcheck", "yamllint", - "cmake", "p7zip", "msitools", "wget", From 953a2b4564bc46cadcd0dbd62598f508a175bccb Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 11:26:25 +0200 Subject: [PATCH 045/155] [src] Remove legacy build logic. (#21353) --- src/.gitignore | 12 +- src/AddressBook/ABPerson.cs | 4 - src/AssemblyInfo.cs.in | 14 +- src/Constants.watch.cs.in | 20 - src/Foundation/NSIndexPath.cs | 10 - src/Foundation/NSNumber2.cs | 18 +- src/ImageIO/CGImageAnimation.cs | 8 - src/Makefile | 910 +----------------- src/Makefile.generator | 198 +--- src/MetalPerformanceShaders/MPSDefs.cs | 4 - ...noTouch.NUnitLite.maccatalyst.templ.csproj | 46 - src/MonoTouch.NUnitLite.templ.csproj | 47 - src/MonoTouch.NUnitLite.tvos.templ.csproj | 47 - src/MonoTouch.NUnitLite.watchos.templ.csproj | 46 - src/NativeTypes/Makefile | 12 - src/NativeTypes/Primitives.tt | 455 --------- src/NativeTypes/TODO | 31 - src/NativeTypes/test.cs | 33 - src/ObjCRuntime/Runtime.cs | 10 - src/OpenTK.dll.sources | 56 -- src/README.md | 11 - .../PointSizeRectangleTypeForwarders.cs | 8 - src/UIKit/NSLayoutManager.cs | 14 - src/Version.in | 1 - src/bgen/Generator.cs | 91 -- src/bgen/bgen.csproj | 2 +- src/bmac.ikvm | 67 -- src/btouch-native | 7 - src/btouch-native.in | 2 - src/btv | 7 - .../{ => dotnet}/generator-frameworks.g.cs | 0 src/bwatch | 7 - src/bwatch.in | 3 - src/custom-make.sh | 7 - src/frameworks.sources | 1 - src/generator.csproj | 196 ---- src/generator.sln | 51 - src/opentk.csproj | 246 ----- src/opentk.mk | 63 -- src/packages.config | 5 - src/rosetta.pl | 21 - src/touch-unit.sources | 299 ------ src/xamios.tmpl.csproj | 56 -- src/xammac.pc.in | 9 - src/xammac.tmpl.csproj | 53 - src/xammaccatalyst.tmpl.csproj | 56 -- src/xamtvos.tmpl.csproj | 56 -- src/xamwatch.tmpl.csproj | 56 -- tools/common/Make.common | 4 +- tools/common/ProjectInspector.csproj | 2 +- .../automation/templates/tests/run-tests.yml | 9 - tools/mmp/mmp.csproj | 4 +- tools/mtouch/Makefile | 2 +- 53 files changed, 51 insertions(+), 3346 deletions(-) delete mode 100644 src/Constants.watch.cs.in delete mode 100644 src/MonoTouch.NUnitLite.maccatalyst.templ.csproj delete mode 100644 src/MonoTouch.NUnitLite.templ.csproj delete mode 100644 src/MonoTouch.NUnitLite.tvos.templ.csproj delete mode 100644 src/MonoTouch.NUnitLite.watchos.templ.csproj delete mode 100644 src/NativeTypes/Makefile delete mode 100644 src/NativeTypes/Primitives.tt delete mode 100644 src/NativeTypes/TODO delete mode 100644 src/NativeTypes/test.cs delete mode 100644 src/OpenTK.dll.sources delete mode 100644 src/System.Drawing/PointSizeRectangleTypeForwarders.cs delete mode 100644 src/Version.in delete mode 100755 src/bmac.ikvm delete mode 100755 src/btouch-native delete mode 100644 src/btouch-native.in delete mode 100755 src/btv rename src/build/{ => dotnet}/generator-frameworks.g.cs (100%) delete mode 100755 src/bwatch delete mode 100644 src/bwatch.in delete mode 100755 src/custom-make.sh delete mode 100644 src/generator.csproj delete mode 100644 src/generator.sln delete mode 100644 src/opentk.csproj delete mode 100644 src/opentk.mk delete mode 100644 src/packages.config delete mode 100644 src/rosetta.pl delete mode 100644 src/touch-unit.sources delete mode 100644 src/xamios.tmpl.csproj delete mode 100644 src/xammac.pc.in delete mode 100644 src/xammac.tmpl.csproj delete mode 100644 src/xammaccatalyst.tmpl.csproj delete mode 100644 src/xamtvos.tmpl.csproj delete mode 100644 src/xamwatch.tmpl.csproj diff --git a/src/.gitignore b/src/.gitignore index 7bac7c02b964..0fe08a7f6e4a 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1,15 +1,5 @@ build -MonoTouch.NUnitLite.csproj -MonoTouch.NUnitLite.tvos.csproj -MonoTouch.NUnitLite.unified.csproj -MonoTouch.NUnitLite.watchos.csproj -MonoTouch.NUnitLite.maccatalyst.csproj -xamios.csproj -xammac.csproj -xamtvos.csproj -xamwatch.csproj -xammaccatalyst.csproj -generator.csproj.inc +bgen.csproj.inc *~ *.rsp MinimumVersions.cs diff --git a/src/AddressBook/ABPerson.cs b/src/AddressBook/ABPerson.cs index 05d8eaf4f4dc..6d665b24ccbf 100644 --- a/src/AddressBook/ABPerson.cs +++ b/src/AddressBook/ABPerson.cs @@ -1021,11 +1021,7 @@ public void SetRelatedNames (ABMultiValue? value) public NSData? GetImage (ABPersonImageFormat format) { -#if ARCH_32 - return Runtime.GetNSObject (ABPersonCopyImageDataWithFormat (Handle, (nint)(int)format)); -#else return Runtime.GetNSObject (ABPersonCopyImageDataWithFormat (Handle, (nint) (long) format)); -#endif } [DllImport (Constants.AddressBookLibrary)] diff --git a/src/AssemblyInfo.cs.in b/src/AssemblyInfo.cs.in index 01573ff30652..76cae03392a2 100644 --- a/src/AssemblyInfo.cs.in +++ b/src/AssemblyInfo.cs.in @@ -10,26 +10,15 @@ using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.CompilerServices; -#if NET [assembly: AssemblyInformationalVersion ("@NUGET_VERSION_NO_METADATA@; git-rev-head:@PACKAGE_HEAD_REV@; git-branch:@PACKAGE_HEAD_BRANCH@")] [assembly: AssemblyTitle ("Microsoft.@DOTNET_PLATFORM@")] [assembly: AssemblyProduct ("Microsoft.@DOTNET_PLATFORM@")] -#else -[assembly: AssemblyInformationalVersion ("@PACKAGE_VERSION_MAJOR@.@PACKAGE_VERSION_MINOR@.@PACKAGE_VERSION_REV@.@PACKAGE_VERSION_BUILD@; git-rev-head:@PACKAGE_HEAD_REV@; git-branch:@PACKAGE_HEAD_BRANCH@")] -[assembly: AssemblyTitle ("@PRODUCT_NAME@")] -[assembly: AssemblyProduct ("@PRODUCT_NAME@")] -#endif // FIXME: Probably need to add Copyright 2009-2011 Novell Inc. // [assembly: AssemblyCopyright ("Copyright 2011-2014 Xamarin Inc.")] [assembly: AssemblyCompany ("Microsoft Corp.")] [assembly: AssemblyMetadata ("IsTrimmable", "True")] -#if !NET -[assembly: InternalsVisibleTo ("System.Net.Http,PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] -#endif - -#if NET // Use a two-part version, because there shouldn't be any API changes when the third or fourth digit changes (according to Semver 2.0 rules). // In other words: the following scenario is safe: // - Assembly A builds against Microsoft.*.dll v1.0.1 @@ -38,8 +27,7 @@ using System.Runtime.CompilerServices; // To avoid scenarios where everybody would have to update to the latest patch version of Microsoft.*.dll // in order to compile stuff, we erase the third and fourth number and only use 0 for both. [assembly: AssemblyVersion ("@NUGET_VERSION_MAJOR@.@NUGET_VERSION_MINOR@.0.0")] -#endif -#if NET && !XCODE_IS_STABLE && !COREBUILD +#if !XCODE_IS_STABLE && !COREBUILD [assembly: Experimental("XCODE_@XCODE_VERSION@_PREVIEW", UrlFormat = "https://github.com/xamarin/xamarin-macios/blob/main/docs/preview-apis.md")] #endif diff --git a/src/Constants.watch.cs.in b/src/Constants.watch.cs.in deleted file mode 100644 index d23a3524bf56..000000000000 --- a/src/Constants.watch.cs.in +++ /dev/null @@ -1,20 +0,0 @@ -namespace ObjCRuntime { - public static partial class Constants { - public const string Version = "@VERSION@"; - internal const string Revision = "@REVISION@"; - public const string SdkVersion = "@WATCH_SDK_VERSION@"; - - // WatchOS 2.0 - public const string CFNetworkLibrary = "/System/Library/Frameworks/CFNetwork.framework/CFNetwork"; - internal const string CoreServicesLibrary = "/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices"; - public const string libcompressionLibrary = "/usr/lib/libcompression.dylib"; - - // WatchOS 3.2 - public const string AccelerateImageLibrary = "/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/vImage"; - - // WatchOS 4.0 -#if !NET - public const string VisionLibrary = "/System/Library/Frameworks/Vision.framework/Vision"; -#endif - } -} diff --git a/src/Foundation/NSIndexPath.cs b/src/Foundation/NSIndexPath.cs index 9b7b2486e1b0..c3cd5dd2a59c 100644 --- a/src/Foundation/NSIndexPath.cs +++ b/src/Foundation/NSIndexPath.cs @@ -40,12 +40,7 @@ public unsafe static NSIndexPath Create (params int [] indexes) if (indexes is null) throw new ArgumentNullException ("indexes"); -#if ARCH_32 - fixed (int* ptr = indexes) -#else fixed (nint* ptr = Array.ConvertAll (indexes, (v) => v)) -#endif - return _FromIndex ((IntPtr) ptr, indexes.Length); } @@ -54,12 +49,7 @@ public unsafe static NSIndexPath Create (params uint [] indexes) if (indexes is null) throw new ArgumentNullException ("indexes"); -#if ARCH_32 - fixed (uint* ptr = indexes) -#else fixed (nuint* ptr = Array.ConvertAll (indexes, (v) => v)) -#endif - return _FromIndex ((IntPtr) ptr, indexes.Length); } diff --git a/src/Foundation/NSNumber2.cs b/src/Foundation/NSNumber2.cs index 7def06d4e0f9..87e90f53a5fd 100644 --- a/src/Foundation/NSNumber2.cs +++ b/src/Foundation/NSNumber2.cs @@ -131,31 +131,19 @@ public static explicit operator bool (NSNumber source) } public NSNumber (nfloat value) : -#if ARCH_64 - this ((double)value) -#else - this ((float) value) -#endif + this ((double) value) { } public nfloat NFloatValue { get { -#if ARCH_64 - return (nfloat)DoubleValue; -#else - return (nfloat) FloatValue; -#endif + return (nfloat) DoubleValue; } } public static NSNumber FromNFloat (nfloat value) { -#if ARCH_64 - return (FromDouble ((double)value)); -#else - return (FromFloat ((float) value)); -#endif + return (FromDouble ((double) value)); } public override string ToString () diff --git a/src/ImageIO/CGImageAnimation.cs b/src/ImageIO/CGImageAnimation.cs index a8bd2e48f96a..c9158e71847c 100644 --- a/src/ImageIO/CGImageAnimation.cs +++ b/src/ImageIO/CGImageAnimation.cs @@ -67,9 +67,6 @@ public static class CGImageAnimation { [BindingImpl (BindingImplOptions.Optimizable)] public static CGImageAnimationStatus AnimateImage (NSUrl url, CGImageAnimationOptions options, CGImageSourceAnimationHandler handler) { -#if IOS && ARCH_32 - throw new PlatformNotSupportedException ("This API is not supported on this version of iOS"); -#else if (url is null) ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (url)); if (handler is null) @@ -85,7 +82,6 @@ public static CGImageAnimationStatus AnimateImage (NSUrl url, CGImageAnimationOp #endif return CGAnimateImageAtURLWithBlock (url.Handle, options.GetHandle (), &block); } -#endif } #if NET @@ -101,9 +97,6 @@ public static CGImageAnimationStatus AnimateImage (NSUrl url, CGImageAnimationOp [BindingImpl (BindingImplOptions.Optimizable)] public static CGImageAnimationStatus AnimateImage (NSData data, CGImageAnimationOptions options, CGImageSourceAnimationHandler handler) { -#if IOS && ARCH_32 - throw new PlatformNotSupportedException ("This API is not supported on this version of iOS"); -#else if (data is null) ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (data)); if (handler is null) @@ -119,7 +112,6 @@ public static CGImageAnimationStatus AnimateImage (NSData data, CGImageAnimation #endif return CGAnimateImageDataWithBlock (data.Handle, options.GetHandle (), &block); } -#endif } // diff --git a/src/Makefile b/src/Makefile index 19c2027a39d3..ea2a4162dcb4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -9,17 +9,6 @@ PROJECT_DIR=. include $(TOP)/src/frameworks.sources include $(TOP)/mk/rules.mk -include $(TOP)/src/touch-unit.sources - -export MD_MTOUCH_SDK_ROOT=$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX) -export XamarinMacFrameworkRoot=$(MAC_DESTDIR)/Library/Frameworks/Xamarin.Mac.framework/Versions/Current - -MACOS_BUILD_DIR=$(BUILD_DIR)/mac -IOS_BUILD_DIR=$(BUILD_DIR)/ios -WATCH_BUILD_DIR=$(BUILD_DIR)/watch -TVOS_BUILD_DIR=$(BUILD_DIR)/tvos -MACCATALYST_BUILD_DIR=$(BUILD_DIR)/maccatalyst - MACOS_DOTNET_BUILD_DIR=$(DOTNET_BUILD_DIR)/macos IOS_DOTNET_BUILD_DIR=$(DOTNET_BUILD_DIR)/ios TVOS_DOTNET_BUILD_DIR=$(DOTNET_BUILD_DIR)/tvos @@ -29,23 +18,6 @@ GENERATOR_FLAGS=-process-enums -core -nologo -nostdlib -noconfig -native-excepti GENERATOR_TF_VERSION=$(subst net,,$(DOTNET_TFM)) -# This is a workaround to create assemblies with a higher version than the -# stable versions we released for Xcode 13.3. The stable versions we released -# for Xcode 13.3 has a ..300 version number, but that -# version scheme has been changed, where the third digit from now on will -# always be 0 in the assembly version. However, this means that until Apple -# releases new OS versions (and we bind those versions), the assembly version -# will be lower than the stable version wherever we've implemented the new -# versioning scheme. This complicates testing, so just bump the third digit to -# 600 until we're using a new Xcode (and thus presumably new OS versions as -# well). This workaround can be removed at that point, but implement it so -# that it will just be skipped/ignored if it isn't removed. -ifeq ($(XCODE_VERSION),13.3) -NUGET_VERSION_THIRD_DIGIT_WORKAROUND=600 -else -NUGET_VERSION_THIRD_DIGIT_WORKAROUND=0 -endif - DOTNET_REFERENCES = \ /r:$(DOTNET_BCL_DIR)/System.Buffers.dll \ /r:$(DOTNET_BCL_DIR)/System.Collections.Concurrent.dll \ @@ -131,88 +103,57 @@ DOTNET_WARNINGS_TO_FIX = -nowarn:$(CSC_WARNINGS_TO_FIX) DOTNET_CORE_WARNINGS_TO_FIX = -nowarn:$(CSC_WARNINGS_TO_FIX),$(BGEN_WARNINGS_TO_FIX) include ./Makefile.generator -include ./opentk.mk - include ./generator-diff.mk -COMMON_TARGET_DIRS = \ - $(BUILD_DIR) \ - $(BUILD_DIR)/common \ - $(BUILD_DIR)/common/NativeTypes \ - -ARGS_32 = -define:ARCH_32 -ARGS_64 = -define:ARCH_64 - -SHARED_SYSTEM_DRAWING_SOURCES = System.Drawing/PointSizeRectangleTypeForwarders.cs SHARED_RESX = $(TOP)/tools/mtouch/Errors.resx -SHARED_DESIGNER_CS = $(BUILD_DIR)/common/Errors.Designer.cs +SHARED_DESIGNER_CS = $(DOTNET_BUILD_DIR)/common/Errors.Designer.cs -$(SHARED_DESIGNER_CS): $(SHARED_RESX) +$(SHARED_DESIGNER_CS): $(SHARED_RESX) | $(DOTNET_BUILD_DIR)/common $(Q_GEN) ./generate-errors.csharp > $(SHARED_DESIGNER_CS) +DOTNET_TARGETS_DIRS += $(DOTNET_BUILD_DIR)/common + # -# Xamarin.iOS +# iOS # # Add new bindings + source files in frameworks.sources, not here. IOS_DOTNET_EXTRA_SOURCES = \ - $(IOS_BUILD_DIR)/Constants.cs \ - $(DOTNET_BUILD_DIR)/Constants.ios.generated.cs \ - $(IOS_BUILD_DIR)/AssemblyInfo.cs \ - $(SHARED_DESIGNER_CS) \ - -IOS_EXTRA_SOURCES = \ - $(IOS_OPENTK_1_0_CORE_SOURCES) \ - $(IOS_BUILD_DIR)/Constants.cs \ - $(BUILD_DIR)/Constants.ios.generated.cs \ - $(IOS_BUILD_DIR)/AssemblyInfo.cs \ + $(IOS_DOTNET_BUILD_DIR)/Constants.cs \ + $(IOS_DOTNET_BUILD_DIR)/Constants.generated.cs \ + $(IOS_DOTNET_BUILD_DIR)/AssemblyInfo.cs \ $(SHARED_DESIGNER_CS) \ - $(SHARED_SYSTEM_DRAWING_SOURCES) \ IOS_DOTNET_HTTP_SOURCES = \ Foundation/NSUrlSessionHandler.cs \ System.Net.Http/CFContentStream.cs \ System.Net.Http/CFNetworkHandler.cs \ -IOS_HTTP_SOURCES = \ - Foundation/NSUrlSessionHandler.cs \ - System.Net.Http/CFContentStream.cs \ - System.Net.Http/CFNetworkHandler.cs \ - IOS_DOTNET_CORE_SOURCES += $(IOS_DOTNET_EXTRA_SOURCES) -IOS_CORE_SOURCES += $(IOS_EXTRA_SOURCES) IOS_DOTNET_SOURCES += $(IOS_DOTNET_EXTRA_SOURCES) $(IOS_DOTNET_HTTP_SOURCES) -IOS_SOURCES += $(IOS_EXTRA_SOURCES) $(IOS_HTTP_SOURCES) IOS_GENERATOR_FLAGS = -inline-selectors -d:IOS -process-enums $(IOS_GENERATOR_WARNASERROR) IOS_DEFINES = -define:IPHONE -define:IOS -define:MONOTOUCH -d:__IOS__ -d:SYSTEM_NET_HTTP -IOS_GENERATOR=$(BUILD_DIR)/common/bgen.exe -IOS_GENERATE=$(SYSTEM_MONO) --debug $(IOS_GENERATOR) IOS_CORE_DEFINES=-define:COREBUILD $(IOS_DEFINES) -$(IOS_BUILD_DIR)/Constants.cs: Constants.iOS.cs.in Makefile $(TOP)/Make.config.inc | $(IOS_BUILD_DIR) +$(IOS_DOTNET_BUILD_DIR)/Constants.cs: Constants.iOS.cs.in Makefile $(TOP)/Make.config.inc | $(IOS_DOTNET_BUILD_DIR) $(call Q_PROF_GEN,ios) sed \ - -e "s/@VERSION@/$(IOS_PACKAGE_VERSION_MAJOR).$(IOS_PACKAGE_VERSION_MINOR).$(IOS_PACKAGE_VERSION_REV)/g" \ + -e "s/@VERSION@/$(IOS_NUGET_VERSION_MAJOR).$(IOS_NUGET_VERSION_MINOR).$(IOS_NUGET_VERSION_PATCH)/g" \ -e 's/@REVISION@/$(IOS_COMMIT_DISTANCE) ($(CURRENT_BRANCH_SED_ESCAPED): $(shell git log -1 --pretty=%h))/g' \ -e "s/@IOS_SDK_VERSION@/$(IOS_SDK_VERSION)/g" \ $< > $@ -$(IOS_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in | $(IOS_BUILD_DIR) +$(IOS_DOTNET_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in | $(IOS_DOTNET_BUILD_DIR) $(call Q_PROF_GEN,ios) sed \ -e 's|@PRODUCT_NAME@|$(IOS_PRODUCT)|g' \ -e 's|@PACKAGE_HEAD_REV@|$(PACKAGE_HEAD_REV)|g' \ -e 's|@PACKAGE_HEAD_BRANCH@|$(CURRENT_BRANCH_SED_ESCAPED)|g' \ - -e 's|@PACKAGE_VERSION_MAJOR@|$(IOS_PACKAGE_VERSION_MAJOR)|g' \ - -e 's|@PACKAGE_VERSION_MINOR@|$(IOS_PACKAGE_VERSION_MINOR)|g' \ - -e 's|@PACKAGE_VERSION_REV@|$(IOS_PACKAGE_VERSION_REV)|g' \ - -e 's|@PACKAGE_VERSION_BUILD@|$(IOS_PACKAGE_VERSION_BUILD)|g' \ -e 's|@NUGET_VERSION_NO_METADATA@|$(IOS_NUGET_VERSION_NO_METADATA)|g' \ -e 's|@NUGET_VERSION_MAJOR@|$(IOS_NUGET_VERSION_MAJOR)|g' \ -e 's|@NUGET_VERSION_MINOR@|$(IOS_NUGET_VERSION_MINOR)|g' \ - -e 's|@NUGET_VERSION_THIRD_DIGIT_WORKAROUND@|$(NUGET_VERSION_THIRD_DIGIT_WORKAROUND)|g' \ -e 's|@NUGET_VERSION_REV@|$(IOS_NUGET_VERSION_PATCH)|g' \ -e 's|@NUGET_VERSION_BUILD@|$(IOS_NUGET_COMMIT_DISTANCE)|g' \ -e 's|@DOTNET_PLATFORM@|iOS|g' \ @@ -222,250 +163,31 @@ $(IOS_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in | $(IOS_BUILD_DI $(Q) rm -f $@.tmp $(Q) touch $@ -# core.dll -$(IOS_BUILD_DIR)/native/core.dll: $(IOS_CORE_SOURCES) frameworks.sources $(RSP_DIR)/ios-defines.rsp - $(Q) mkdir -p $(IOS_BUILD_DIR)native - $(call Q_PROF_CSC,ios) $(IOS_CSC) -nologo -out:$@ -target:library -debug -unsafe \ - $(CORE_WARNINGS_TO_FIX) \ - @$(RSP_DIR)/ios-defines.rsp \ - $(IOS_CORE_DEFINES) \ - $(IOS_CORE_SOURCES) - -# generated_sources -$(IOS_BUILD_DIR)/native/generated_sources: $(IOS_GENERATOR) $(IOS_APIS) $(IOS_BUILD_DIR)/native/core.dll $(IOS_BUILD_DIR)/native/Xamarin.iOS.BindingAttributes.dll $(BUILD_DIR)/ios.rsp - $(call Q_PROF_GEN,ios) $(IOS_GENERATE) @$(BUILD_DIR)/ios.rsp - -$(BUILD_DIR)/ios.rsp: Makefile Makefile.generator frameworks.sources - $(Q_GEN) echo \ - $(IOS_GENERATOR_FLAGS) \ - -core \ - -sourceonly=$(IOS_BUILD_DIR)/native/generated_sources \ - -compiler=$(IOS_CSC) \ - -nologo -nostdlib -noconfig \ - -tmpdir=$(IOS_BUILD_DIR)/native \ - -baselib=$(IOS_BUILD_DIR)/native/core.dll \ - -attributelib=$(IOS_BUILD_DIR)/native/Xamarin.iOS.BindingAttributes.dll \ - -native-exception-marshalling \ - --ns=ObjCRuntime \ - --target-framework=Xamarin.iOS,v1.0 \ - $(IOS_APIS) \ - @$(RSP_DIR)/ios-defines.rsp \ - > $@ - -define IOS_TARGETS_template -# Xamarin.iOS.dll -$(IOS_BUILD_DIR)/native-$(1)%Xamarin.iOS.dll $(IOS_BUILD_DIR)/native-$(1)%Xamarin.iOS.pdb $(4): $$(IOS_SOURCES) $(IOS_BUILD_DIR)/native/generated_sources $(PRODUCT_KEY_PATH) | $(IOS_BUILD_DIR)/reference - @mkdir -p $(IOS_BUILD_DIR)/native-$(1) - $$(call Q_PROF_CSC,ios/$(1) bit) $$(IOS_CSC) -nologo -out:$(IOS_BUILD_DIR)/native-$(1)/Xamarin.iOS.dll -target:library -debug -unsafe -optimize \ - -deterministic \ - $$(ARGS_$(1)) \ - -publicsign -keyfile:$(PRODUCT_KEY_PATH) $$(IOS_DEFINES) \ - $(5) \ - $(WARNINGS_TO_FIX) \ - -warnaserror:$(NULLABILITY_WARNINGS) \ - $$(IOS_CSC_FLAGS_XI) \ - @$(RSP_DIR)/ios-defines.rsp \ - $$(IOS_SOURCES) @$(IOS_BUILD_DIR)/native/generated_sources -endef - -$(IOS_BUILD_DIR)/compat/%: $(MACIOS_BINARIES_PATH)/% | $(IOS_BUILD_DIR)/compat - $(Q) $(CP) $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/%: $(IOS_BUILD_DIR)/compat/% - $(Q) $(CP) $< $@ - -$(eval $(call IOS_TARGETS_template,32)) -$(eval $(call IOS_TARGETS_template,64,,,$(IOS_BUILD_DIR)/reference%Xamarin.iOS.dll,-refout:$(IOS_BUILD_DIR)/reference/Xamarin.iOS.dll)) - -# MonoTouch.Dialog-1 -$(IOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.dll: $(MACIOS_BINARIES_PATH)/MonoTouch.Dialog-Unified/ios/MonoTouch.Dialog-1.dll | $(IOS_BUILD_DIR)/reference - $(Q) $(CP) $< $@ - -$(IOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.pdb: $(MACIOS_BINARIES_PATH)/MonoTouch.Dialog-Unified/ios/MonoTouch.Dialog-1.pdb | $(IOS_BUILD_DIR)/reference - $(Q) $(CP) $< $@ - -# MonoTouch.NUnitLite -$(IOS_BUILD_DIR)/reference%MonoTouch.NUnitLite.dll $(IOS_BUILD_DIR)/reference%MonoTouch.NUnitLite.pdb: $(IOS_TOUCHUNIT_SOURCES) $(IOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.dll $(PRODUCT_KEY_PATH) $(IOS_BUILD_DIR)/reference/Xamarin.iOS.dll - $(call Q_PROF_CSC,ios) $(IOS_CSC) -nologo -out:$(basename $@).dll -target:library -debug:portable -optimize -publicsign \ - -deterministic \ - -keyfile:$(PRODUCT_KEY_PATH) -r:$(IOS_BUILD_DIR)/reference/Xamarin.iOS.dll -define:MONO -r:$(IOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.dll -r:$(MONOTOUCH_MONO_PATH)/System.dll -r:$(MONOTOUCH_MONO_PATH)/System.Xml.dll \ - -r:$(MONOTOUCH_MONO_PATH)/System.Core.dll \ - -nowarn:3006,612,649,414,1635,659 \ - -define:NUNITLITE,CLR_4_0,NET_4_5,__MOBILE__,MONO $(IOS_DEFINES) \ - -define:XAMCORE_2_0,__UNIFIED__ \ - $(IOS_TOUCHUNIT_SOURCES) - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/% : $(MACIOS_BINARIES_PATH)/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 - $(Q) $(CP) $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/Facades/% : $(MACIOS_BINARIES_PATH)/Facades/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/Facades - $(Q) $(CP) $< $@ - -$(IOS_BUILD_DIR)/compat/%: $(MACIOS_BINARIES_PATH)/% | $(IOS_BUILD_DIR)/compat - $(Q) $(CP) $< $@ - -clean-local:: - rm -rf build - rm -f $(IOS_TARGETS) generated_sources *.mdb *.pdb - -ifdef INCLUDE_IOS -IOS_TARGETS_DIRS += \ - $(IOS_BUILD_DIR) \ - $(IOS_BUILD_DIR)/compat \ - $(IOS_BUILD_DIR)/compat/Facades \ - $(IOS_BUILD_DIR)/reference \ - $(IOS_BUILD_DIR)/reference/Facades \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/share/doc/MonoTouch \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/iOS \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/iOS \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/Facades \ - -IOS_TARGETS += \ - $(PROJECT_DIR)/xamios.csproj \ - $(PROJECT_DIR)/MonoTouch.NUnitLite.csproj \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/monotouch.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/monotouch.dll.mdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/OpenTK.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/OpenTK.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/OpenTK-1.0.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/OpenTK-1.0.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/OpenTK-1.0.dll.config \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/MonoTouch.Dialog-1.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/MonoTouch.Dialog-1.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/MonoTouch.NUnitLite.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/MonoTouch.NUnitLite.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/Facades/System.Drawing.Primitives.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/Facades/netstandard.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/MonoTouch.Dialog-1.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/MonoTouch.Dialog-1.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/MonoTouch.NUnitLite.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/MonoTouch.NUnitLite.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/OpenTK-1.0.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/OpenTK-1.0.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/OpenTK-1.0.dll.config \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/iOS/Xamarin.iOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/iOS/Xamarin.iOS.pdb \ - -ifdef IOS_SUPPORTS_32BIT_ARCHITECTURES -IOS_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/iOS/Xamarin.iOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/iOS/Xamarin.iOS.pdb \ - -endif - -endif - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/%.dll: $(IOS_BUILD_DIR)/compat/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/Facades - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/%.pdb: $(IOS_BUILD_DIR)/compat/%.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/%.mdb: $(IOS_BUILD_DIR)/compat/%.mdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1/%.config: $(IOS_BUILD_DIR)/compat/%.config | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/2.1 - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/share/doc/MonoTouch/%: api-diffs/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/share/doc/MonoTouch - $(Q) install -m 0644 $< $@ - -# reference assemblies, this is just for compilation with XS -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/%.dll: $(IOS_BUILD_DIR)/reference/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Facades - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/%.pdb: $(IOS_BUILD_DIR)/reference/%.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/%.config: $(IOS_BUILD_DIR)/reference/%.config | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS - $(Q) install -m 0644 $< $@ - -# the actual architecture-specific versions -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/iOS/Xamarin.iOS.dll: $(IOS_BUILD_DIR)/native-32/Xamarin.iOS.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/iOS - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/iOS/Xamarin.iOS.pdb: $(IOS_BUILD_DIR)/native-32/Xamarin.iOS.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/iOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/iOS/Xamarin.iOS.dll: $(IOS_BUILD_DIR)/native-64/Xamarin.iOS.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/iOS - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/iOS/Xamarin.iOS.pdb: $(IOS_BUILD_DIR)/native-64/Xamarin.iOS.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/iOS - $(Q) install -m 0644 $< $@ - -$(IOS_TARGETS_DIRS): - $(Q) mkdir -p $@ - -$(PROJECT_DIR)/xamios.csproj: xamios.tmpl.csproj Makefile $(wildcard $(TOP)/src/*.sources) - @sed -e 's**$(foreach file,$(IOS_SOURCES),)*' -e 's**$(foreach file,$(IOS_APIS),)*' $< | xmllint --format - > $@ - -$(PROJECT_DIR)/MonoTouch.NUnitLite.csproj: MonoTouch.NUnitLite.templ.csproj Makefile touch-unit.sources $(TOP)/Make.config $(TOP)/mk/mono.mk - $(Q) sed -e 's**$(foreach file,$(IOS_TOUCHUNIT_SOURCES),)*' $< | xmllint --format - > $@ - -PROJECT_FILES += $(PROJECT_DIR)/xamios.csproj $(PROJECT_DIR)/MonoTouch.NUnitLite.csproj - -ifdef INCLUDE_IOS -all-ios: $(IOS_TARGETS) -install-ios: $(IOS_TARGETS) -endif - -ifdef INCLUDE_XAMARIN_LEGACY -ifdef INCLUDE_IOS -INSTALL_TARGETS+=install-ios -ALL_TARGETS+=all-ios -endif -endif - # -# Xamarin.Mac +# macOS # MAC_COMMON_DEFINES = -define:MONOMAC -d:__MACOS__ -MAC_full_ARGS = -define:NO_SYSTEM_DRAWING -define:XAMMAC_SYSTEM_MONO -MAC_mobile_ARGS = MACOS_GENERATOR_FLAGS = -d:MONOMAC -d:__MACOS__ MACOS_CORE_DEFINES = $(MAC_COMMON_DEFINES),COREBUILD MACOS_DEFINES = $(MAC_COMMON_DEFINES) -D:XAMARIN_MODERN -$(MACOS_BUILD_DIR)/$(1)/$(3).pdb: $(MACOS_BUILD_DIR)/$(1)/$(3).dll - SN_KEY = $(PRODUCT_KEY_PATH) MAC_DOTNET_EXTRA_CORE_SOURCES += \ - $(MACOS_BUILD_DIR)/Constants.cs \ - $(DOTNET_BUILD_DIR)/Constants.macos.generated.cs \ - -MAC_EXTRA_CORE_SOURCES += \ - $(MACOS_BUILD_DIR)/Constants.cs \ - $(BUILD_DIR)/Constants.macos.generated.cs \ + $(MACOS_DOTNET_BUILD_DIR)/Constants.cs \ + $(MACOS_DOTNET_BUILD_DIR)/Constants.generated.cs \ # Add new bindings + source files in frameworks.sources, not here. MACOS_DOTNET_CORE_SOURCES += \ $(MAC_DOTNET_EXTRA_CORE_SOURCES) \ -MACOS_CORE_SOURCES += \ - $(MAC_EXTRA_CORE_SOURCES) \ - MACOS_DOTNET_SOURCES += \ $(MAC_DOTNET_EXTRA_CORE_SOURCES) \ - $(MACOS_BUILD_DIR)/AssemblyInfo.cs \ + $(MACOS_DOTNET_BUILD_DIR)/AssemblyInfo.cs \ $(SHARED_DESIGNER_CS) \ -MACOS_SOURCES += \ - $(MAC_EXTRA_CORE_SOURCES) \ - $(MACOS_BUILD_DIR)/AssemblyInfo.cs \ - $(SHARED_DESIGNER_CS) \ - -# CFNetwork is shipped: -# * In a separate library (XamMac.CFNetwork.dll) for Classic. -# * Inside the other platform assemblies (Xamarin.Mac.dll) for all the other profiles. -# This means we can't use the standard framework logic for these sources. - MAC_CFNETWORK_SOURCES = \ CFNetwork/Content.cs \ CFNetwork/MessageHandler.cs \ @@ -482,32 +204,21 @@ MACOS_DOTNET_SOURCES += \ $(MAC_CFNETWORK_SOURCES) \ $(MAC_HTTP_SOURCES) \ -$(MACOS_BUILD_DIR)/Constants.cs: Constants.mac.cs.in Makefile $(TOP)/Make.config.inc | $(MACOS_BUILD_DIR) +$(MACOS_DOTNET_BUILD_DIR)/Constants.cs: Constants.mac.cs.in Makefile $(TOP)/Make.config.inc | $(MACOS_DOTNET_BUILD_DIR) $(Q) sed \ - -e "s/@VERSION@/$(MAC_PACKAGE_VERSION_MAJOR).$(MAC_PACKAGE_VERSION_MINOR).$(MAC_PACKAGE_VERSION_REV)/g" \ + -e "s/@VERSION@/$(MACOS_NUGET_VERSION_MAJOR).$(MACOS_NUGET_VERSION_MINOR).$(MACOS_NUGET_VERSION_PATCH)/g" \ -e 's/@REVISION@/$(MAC_COMMIT_DISTANCE) ($(CURRENT_BRANCH_SED_ESCAPED): $(shell git log -1 --pretty=%h))/g' \ -e "s/@MACOS_SDK_VERSION@/$(MACOS_SDK_VERSION)/g" \ -e "s/@MIN_XM_MONO_VERSION@/$(MIN_XM_MONO_VERSION)/g" \ $< > $@ -$(PROJECT_DIR)/xammac.csproj: xammac.tmpl.csproj Makefile $(wildcard $(TOP)/src/*.sources) - @sed -e 's**$(foreach file,$(MACOS_SOURCES) $(SHARED_SYSTEM_DRAWING_SOURCES),)*' -e 's**$(foreach file,$(MACOS_APIS),)*' $< | xmllint --format - > $@ - -PROJECT_FILES += $(PROJECT_DIR)/xammac.csproj - -$(MACOS_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in | $(MACOS_BUILD_DIR) +$(MACOS_DOTNET_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in | $(MACOS_DOTNET_BUILD_DIR) $(call Q_PROF_GEN,mac) sed \ -e 's|@PRODUCT_NAME@|$(MAC_PRODUCT)|g' \ -e 's|@PACKAGE_HEAD_REV@|$(PACKAGE_HEAD_REV)|g' \ - -e 's|@PACKAGE_HEAD_BRANCH@|$(CURRENT_BRANCH_SED_ESCAPED)|g' \ - -e 's|@PACKAGE_VERSION_MAJOR@|$(MAC_PACKAGE_VERSION_MAJOR)|g' \ - -e 's|@PACKAGE_VERSION_MINOR@|$(MAC_PACKAGE_VERSION_MINOR)|g' \ - -e 's|@PACKAGE_VERSION_REV@|$(MAC_PACKAGE_VERSION_REV)|g' \ - -e 's|@PACKAGE_VERSION_BUILD@|$(MAC_PACKAGE_VERSION_BUILD)|g' \ -e 's|@NUGET_VERSION_NO_METADATA@|$(MACOS_NUGET_VERSION_NO_METADATA)|g' \ -e 's|@NUGET_VERSION_MAJOR@|$(MACOS_NUGET_VERSION_MAJOR)|g' \ -e 's|@NUGET_VERSION_MINOR@|$(MACOS_NUGET_VERSION_MINOR)|g' \ - -e 's|@NUGET_VERSION_THIRD_DIGIT_WORKAROUND@|$(NUGET_VERSION_THIRD_DIGIT_WORKAROUND)|g' \ -e 's|@NUGET_VERSION_REV@|$(MACOS_NUGET_VERSION_PATCH)|g' \ -e 's|@NUGET_VERSION_BUILD@|$(MACOS_NUGET_COMMIT_DISTANCE)|g' \ -e 's|@DOTNET_PLATFORM@|macOS|g' \ @@ -517,394 +228,23 @@ $(MACOS_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in | $(MACOS_BUIL $(Q) rm -f $@.tmp $(Q) touch $@ -# We can't pass the --target-framework values as parameters to the templates, because the commas interfere with Make's parameter parsing. -xm_full_profile=--target-framework=Xamarin.Mac,Version=v4.5,Profile=Full -xm_mobile_profile=--target-framework=Xamarin.Mac,Version=v2.0,Profile=Mobile - -MAC_GENERATOR=$(BUILD_DIR)/common/bgen.exe -MAC_GENERATE=$(SYSTEM_MONO) --debug $(MAC_GENERATOR) - -define MAC_GENERATOR_template -$(MACOS_BUILD_DIR)/$(1)/core.dll: $(MACOS_CORE_SOURCES) frameworks.sources $(RSP_DIR)/macos-defines.rsp - @mkdir -p $(MACOS_BUILD_DIR)/$(1) - $$(call Q_PROF_CSC,mac/$(1)) \ - $$(MAC_$(1)_CSC) -nologo -out:$$@ -target:library -debug -unsafe $(CORE_WARNINGS_TO_FIX) \ - @$(RSP_DIR)/macos-defines.rsp \ - $$(MACOS_CORE_DEFINES) \ - $(2) \ - $$(MACOS_CORE_SOURCES) - -$(MACOS_BUILD_DIR)/$(1)/generated-sources: $$(MAC_GENERATOR) $(MACOS_APIS) $(MACOS_BUILD_DIR)/$(1)/core.dll $(MACOS_BUILD_DIR)/Xamarin.Mac-$(1).BindingAttributes.dll $(BUILD_DIR)/mac-$(1).rsp - $$(call Q_PROF_GEN,mac/$(1)) $$(MAC_GENERATE) @$(BUILD_DIR)/mac-$(1).rsp - -$(BUILD_DIR)/mac-$(1).rsp: Makefile Makefile.generator frameworks.sources - $$(Q_GEN) echo \ - $(MACOS_GENERATOR_FLAGS) \ - -compiler:$$(MAC_$(1)_CSC) \ - -nologo \ - -process-enums \ - $(MACOS_GENERATOR_WARNASERROR) \ - -native-exception-marshalling \ - -core \ - -sourceonly:$(MACOS_BUILD_DIR)/$(1)/generated-sources \ - -tmpdir:$(MACOS_BUILD_DIR)/$(1) \ - -baselib:$(MACOS_BUILD_DIR)/$(1)/core.dll \ - -attributelib:$(MACOS_BUILD_DIR)/Xamarin.Mac-$(1).BindingAttributes.dll \ - -d:NO_SYSTEM_DRAWING \ - --ns=ObjCRuntime \ - $(2) \ - $(xm_$(1)_profile) \ - $(MACOS_APIS) \ - @$(RSP_DIR)/macos-defines.rsp \ - > $$@ -endef - -$(eval $(call MAC_GENERATOR_template,full,-d:NO_SYSTEM_DRAWING)) -$(eval $(call MAC_GENERATOR_template,mobile,$(SHARED_SYSTEM_DRAWING_SOURCES))) - -define MACOS_TARGETS_template -$(MACOS_BUILD_DIR)/$(1)-64/Xamarin.Mac%dll $(MACOS_BUILD_DIR)/$(1)-64/Xamarin.Mac%pdb: $(MACOS_BUILD_DIR)/$(1)/generated-sources $(MACOS_SOURCES) $(MAC_CFNETWORK_SOURCES) $(MAC_CLASSIC_SOURCES) $(SN_KEY) - @mkdir -p $(MACOS_BUILD_DIR)/$(1)-64 - $$(call Q_PROF_CSC,mac/$(1)-64) \ - $$(MAC_$(1)_CSC) -nologo -out:$$(basename $$@).dll -target:library -debug -unsafe \ - -deterministic \ - $$(MAC_COMMON_DEFINES) \ - $$(MAC_$(1)_ARGS) \ - $$(ARGS_64) \ - -publicsign -keyfile:$(SN_KEY) \ - $(WARNINGS_TO_FIX) \ - -warnaserror:$(NULLABILITY_WARNINGS) \ - $$(MAC_CSC_FLAGS_XM) \ - $(MAC_CFNETWORK_SOURCES) $(MAC_HTTP_SOURCES) \ - $(2) \ - $$(MACOS_SOURCES) \ - @$(RSP_DIR)/macos-defines.rsp \ - @$$< - -endef - -$(eval $(call MACOS_TARGETS_template,mobile,$(SHARED_SYSTEM_DRAWING_SOURCES))) -$(eval $(call MACOS_TARGETS_template,full,)) - -$(MACOS_BUILD_DIR)/%-reference/Xamarin.Mac.dll: $(MACOS_BUILD_DIR)/%-64/Xamarin.Mac.dll - @mkdir -p $(@D) - $(Q) $(CP) $^ $@ - -$(MACOS_BUILD_DIR)/%-reference/Xamarin.Mac.pdb: $(MACOS_BUILD_DIR)/%-64/Xamarin.Mac.pdb - @mkdir -p $(@D) - $(Q) $(CP) $^ $@ - -MAC_VARIANTS_TARGETS = \ - $(MACOS_BUILD_DIR)/mobile-64/Xamarin.Mac.dll \ - $(MACOS_BUILD_DIR)/full-64/Xamarin.Mac.dll \ - $(MACOS_BUILD_DIR)/mobile-reference/Xamarin.Mac.dll \ - $(MACOS_BUILD_DIR)/full-reference/Xamarin.Mac.dll \ - -ifdef INCLUDE_XAMARIN_LEGACY -ifdef INCLUDE_MAC -INSTALL_TARGETS+=install-mac -ALL_TARGETS+=all-mac -endif -endif - -MACOS_TARGETS_DIRS += \ - $(MACOS_BUILD_DIR) \ - $(MACOS_BUILD_DIR)/mobile \ - $(MACOS_BUILD_DIR)/mobile/Facades \ - $(MACOS_BUILD_DIR)/full \ - $(MACOS_BUILD_DIR)/compat \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/net_4_5 \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5 \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/pkgconfig \ - -MACOS_TARGETS += \ - $(PROJECT_DIR)/xammac.csproj \ - $(MAC_VARIANTS_TARGETS) \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/XamMac.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile/Xamarin.Mac.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile/Xamarin.Mac.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full/Xamarin.Mac.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full/Xamarin.Mac.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile/Xamarin.Mac.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile/Xamarin.Mac.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full/Xamarin.Mac.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full/Xamarin.Mac.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/Xamarin.Mac.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/Xamarin.Mac.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/Xamarin.Mac.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/Xamarin.Mac.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/pkgconfig/xammac.pc - -# The XamMac.dll file must exist for VSfM to be able to open XM/Classic projects (so that people can use the migration wizard) -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/XamMac.dll: $(MACIOS_BINARIES_PATH)/XamMac.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono - $(Q) install -m 0755 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile/Xamarin.Mac.dll: $(MACOS_BUILD_DIR)/mobile-reference/Xamarin.Mac.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile - $(Q) install -m 0755 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile/Xamarin.Mac.pdb: $(MACOS_BUILD_DIR)/mobile-reference/Xamarin.Mac.pdb | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile/Xamarin.Mac.dll: $(MACOS_BUILD_DIR)/mobile-64/Xamarin.Mac.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile - $(Q) install -m 0755 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile/Xamarin.Mac.pdb: $(MACOS_BUILD_DIR)/mobile-64/Xamarin.Mac.pdb | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full/Xamarin.Mac.dll: $(MACOS_BUILD_DIR)/full-reference/Xamarin.Mac.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full - $(Q) install -m 0755 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full/Xamarin.Mac.pdb : $(MACOS_BUILD_DIR)/full-reference/Xamarin.Mac.pdb | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full/Xamarin.Mac.dll: $(MACOS_BUILD_DIR)/full-64/Xamarin.Mac.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full - $(Q) install -m 0755 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full/Xamarin.Mac.pdb: $(MACOS_BUILD_DIR)/full-64/Xamarin.Mac.pdb | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/Xamarin.Mac.dll $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/Xamarin.Mac.pdb: | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac - $(Q) ln -sF ../../reference/mobile/$(@F) $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/Xamarin.Mac.dll $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/Xamarin.Mac.pdb: | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5 - $(Q) ln -sF ../../reference/full/$(@F) $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/pkgconfig/xammac.pc: $(TOP)/Make.config | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/pkgconfig - $(Q) sed -e "s/@PACKAGE_VERSION@/$(MAC_PACKAGE_VERSION)/g" xammac.pc.in > $@ - $(Q) chmod 0644 $@ - -$(MACOS_TARGETS_DIRS): - $(Q) mkdir -p $@ - -ifdef INCLUDE_MAC -install-mac: $(MACOS_TARGETS) -all-mac: $(MACOS_TARGETS) -endif - -# -# Xamarin.WatchOS -# - -WATCH_DEFINES = -define:IPHONE -define:MONOTOUCH -d:WATCH -d:XAMCORE_3_0 -d:__WATCHOS__ -d:SYSTEM_NET_HTTP -WATCH_GENERATOR=$(BUILD_DIR)/common/bgen.exe -WATCH_GENERATE=$(SYSTEM_MONO) --debug $(WATCH_GENERATOR) -WATCH_GENERATED_DEFINES= -d:WATCH -d:XAMCORE_3_0 - -WATCHOS_CORE_DEFINES = $(WATCH_DEFINES) -define:COREBUILD - -WATCHOS_EXTRA_CORE_SOURCES = \ - $(WATCH_BUILD_DIR)/Constants.cs \ - $(BUILD_DIR)/Constants.watchos.generated.cs \ - $(WATCH_BUILD_DIR)/AssemblyInfo.cs \ - $(IOS_OPENTK_1_0_CORE_SOURCES) \ - AudioToolbox/AudioBuffers.cs \ - AudioToolbox/AudioType.cs \ - AudioToolbox/AudioFormat.cs \ - $(SHARED_SYSTEM_DRAWING_SOURCES) \ - System.Drawing/ColorKnownColorTypeForwarders.cs \ - -WATCHOS_HTTP_SOURCES = \ - Foundation/NSUrlSessionHandler.cs \ - -WATCHOS_CORE_SOURCES += \ - $(WATCHOS_EXTRA_CORE_SOURCES) \ - -WATCHOS_SOURCES += \ - $(WATCHOS_EXTRA_CORE_SOURCES) \ - $(WATCHOS_HTTP_SOURCES) \ - $(SHARED_DESIGNER_CS) \ - -$(WATCH_BUILD_DIR)/Constants.cs: $(TOP)/src/Constants.watch.cs.in Makefile $(TOP)/Make.config.inc | $(WATCH_BUILD_DIR) - $(call Q_PROF_GEN,watch) sed \ - -e "s/@VERSION@/$(IOS_PACKAGE_VERSION_MAJOR).$(IOS_PACKAGE_VERSION_MINOR).$(IOS_PACKAGE_VERSION_REV)/g" \ - -e 's/@REVISION@/$(IOS_COMMIT_DISTANCE) ($(CURRENT_BRANCH_SED_ESCAPED): $(shell git log -1 --pretty=%h))/g' \ - -e "s/@WATCH_SDK_VERSION@/$(WATCH_SDK_VERSION)/g" \ - $< > $@ - -$(WATCH_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in $(TOP)/Make.config $(GIT_DIRECTORY)/HEAD | $(WATCH_BUILD_DIR) - $(call Q_PROF_GEN,watch) sed \ - -e 's|@PRODUCT_NAME@|Xamarin.WatchOS|g' \ - -e 's|@PACKAGE_HEAD_REV@|$(PACKAGE_HEAD_REV)|g' \ - -e 's|@PACKAGE_HEAD_BRANCH@|$(CURRENT_BRANCH_SED_ESCAPED)|g' \ - -e 's|@PACKAGE_VERSION_MAJOR@|$(IOS_PACKAGE_VERSION_MAJOR)|g' \ - -e 's|@PACKAGE_VERSION_MINOR@|$(IOS_PACKAGE_VERSION_MINOR)|g' \ - -e 's|@PACKAGE_VERSION_REV@|$(IOS_PACKAGE_VERSION_REV)|g' \ - -e 's|@PACKAGE_VERSION_BUILD@|$(IOS_PACKAGE_VERSION_BUILD)|g' \ - -e 's|@XCODE_VERSION@|$(subst .,_,$(XCODE_VERSION))|g' \ - $< > $@.tmp - $(Q) diff $@ $@.tmp >/dev/null 2>&1 || mv -f $@.tmp $@ - $(Q) rm -f $@.tmp - $(Q) touch $@ - -$(WATCH_BUILD_DIR)/watch/core.dll: $(WATCHOS_CORE_SOURCES) frameworks.sources $(RSP_DIR)/watchos-defines.rsp | $(WATCH_BUILD_DIR)/watch - @mkdir -p $(WATCH_BUILD_DIR)/watch - $(call Q_PROF_CSC,watch) $(WATCH_CSC) -nologo -out:$@ -target:library -debug -unsafe \ - $(CORE_WARNINGS_TO_FIX) \ - @$(RSP_DIR)/watchos-defines.rsp \ - $(WATCHOS_CORE_DEFINES) \ - $(WATCHOS_CORE_SOURCES) - -# generated_sources -$(WATCH_BUILD_DIR)/watch/generated_sources: $(WATCH_GENERATOR) $(WATCHOS_APIS) $(WATCH_BUILD_DIR)/watch/core.dll $(WATCH_BUILD_DIR)/Xamarin.WatchOS.BindingAttributes.dll $(BUILD_DIR)/watchos.rsp - $(call Q_PROF_GEN,watch) $(WATCH_GENERATE) @$(BUILD_DIR)/watchos.rsp - -$(BUILD_DIR)/watchos.rsp: Makefile Makefile.generator frameworks.sources - $(Q_GEN) echo \ - -inline-selectors \ - -process-enums \ - $(WATCH_GENERATOR_WARNASERROR) \ - -core \ - -sourceonly=$(WATCH_BUILD_DIR)/watch/generated_sources \ - -compiler=$(WATCH_CSC) \ - -nologo -nostdlib -noconfig \ - -tmpdir=$(WATCH_BUILD_DIR)/watch \ - -baselib=$(WATCH_BUILD_DIR)/watch/core.dll \ - -attributelib=$(WATCH_BUILD_DIR)/Xamarin.WatchOS.BindingAttributes.dll \ - -native-exception-marshalling \ - $(WATCH_GENERATED_DEFINES) \ - --ns:ObjCRuntime \ - $(WATCHOS_APIS) \ - --target-framework=Xamarin.WatchOS,v1.0 \ - @$(RSP_DIR)/watchos-defines.rsp \ - > $@ - -$(WATCH_BUILD_DIR)/watch-32/Xamarin.WatchOS%dll $(WATCH_BUILD_DIR)/watch-32/Xamarin.WatchOS%pdb: $(WATCHOS_SOURCES) $(WATCH_BUILD_DIR)/watch/generated_sources $(PRODUCT_KEY_PATH) | $(WATCH_BUILD_DIR)/watch-32 - $(call Q_PROF_CSC,watch) $(WATCH_CSC) -nologo -out:$(basename $@).dll -target:library -debug -unsafe -optimize \ - -publicsign -keyfile:$(PRODUCT_KEY_PATH) $(WATCH_DEFINES) \ - -deterministic \ - $(ARGS_32) \ - $(WARNINGS_TO_FIX) \ - @$(RSP_DIR)/watchos-defines.rsp \ - $(WATCHOS_SOURCES) @$(WATCH_BUILD_DIR)/watch/generated_sources - -$(WATCH_BUILD_DIR)/watch-64/Xamarin.WatchOS%dll $(WATCH_BUILD_DIR)/watch-64/Xamarin.WatchOS%pdb $(WATCH_BUILD_DIR)/reference/Xamarin.WatchOS%dll: $(WATCHOS_SOURCES) $(WATCH_BUILD_DIR)/watch/generated_sources $(PRODUCT_KEY_PATH) | $(WATCH_BUILD_DIR)/watch-64 $(WATCH_BUILD_DIR)/reference - $(call Q_PROF_CSC,watch) $(WATCH_CSC) -nologo -out:$(WATCH_BUILD_DIR)/watch-64/Xamarin.WatchOS.dll -target:library -debug -unsafe -optimize \ - -publicsign -keyfile:$(PRODUCT_KEY_PATH) $(WATCH_DEFINES) \ - -deterministic \ - $(ARGS_64) \ - $(WARNINGS_TO_FIX) \ - @$(RSP_DIR)/watchos-defines.rsp \ - -refout:$(WATCH_BUILD_DIR)/reference/Xamarin.WatchOS.dll \ - $(WATCHOS_SOURCES) @$(WATCH_BUILD_DIR)/watch/generated_sources - -# MonoTouch.NUnitLite -$(WATCH_BUILD_DIR)/reference/MonoTouch.NUnitLite%dll $(WATCH_BUILD_DIR)/reference/MonoTouch.NUnitLite%pdb: $(WATCHOS_TOUCHUNIT_SOURCES) $(PRODUCT_KEY_PATH) $(WATCH_BUILD_DIR)/reference/Xamarin.WatchOS.dll - $(call Q_PROF_CSC,watch) $(SYSTEM_CSC) -features:strict -nologo -out:$(basename $@).dll -target:library -debug:portable -optimize -publicsign -noconfig -nostdlib \ - -keyfile:$(PRODUCT_KEY_PATH) -r:$(WATCH_BUILD_DIR)/reference/Xamarin.WatchOS.dll -r:$(MONOTOUCH_WATCH_MONO_PATH)/mscorlib.dll -r:$(MONOTOUCH_WATCH_MONO_PATH)/System.dll -r:$(MONOTOUCH_WATCH_MONO_PATH)/System.Xml.dll \ - -r:$(MONOTOUCH_WATCH_MONO_PATH)/System.Core.dll \ - -nowarn:3006,612,649,414,1635,659 \ - -define:NUNITLITE,CLR_4_0,NET_4_5,__MOBILE__,MONO $(WATCH_DEFINES) \ - -define:XAMCORE_2_0,__UNIFIED__ \ - -deterministic \ - $(WATCHOS_TOUCHUNIT_SOURCES) - -$(PROJECT_DIR)/xamwatch.csproj: xamwatch.tmpl.csproj Makefile $(wildcard $(TOP)/*.sources) - @sed -e 's**$(foreach file,$(WATCHOS_SOURCES),)*' -e 's**$(foreach file,$(WATCHOS_APIS),)*' $< | xmllint --format - > $@ - -$(PROJECT_DIR)/MonoTouch.NUnitLite.watchos.csproj: MonoTouch.NUnitLite.watchos.templ.csproj Makefile touch-unit.sources $(TOP)/Make.config $(TOP)/mk/mono.mk - $(Q) sed -e 's**$(foreach file,$(WATCHOS_TOUCHUNIT_SOURCES),)*' $< | xmllint --format - > $@ - -PROJECT_FILES += $(PROJECT_DIR)/xamwatch.csproj $(PROJECT_DIR)/MonoTouch.NUnitLite.watchos.csproj - -clean-watch: - $(Q) rm -rf $(WATCH_BUILD_DIR) - $(Q) rm -f $(WATCH_TARGETS) - -WATCH_TARGETS_DIRS += \ - $(WATCH_BUILD_DIR) \ - $(WATCH_BUILD_DIR)/watch \ - $(WATCH_BUILD_DIR)/watch-32 \ - $(WATCH_BUILD_DIR)/watch-64 \ - $(WATCH_BUILD_DIR)/reference \ - $(WATCH_BUILD_DIR)/reference/Facades \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/share/doc/Xamarin.WatchOS\ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/watchOS \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/watchOS \ - -WATCH_TARGETS += \ - $(PROJECT_DIR)/xamwatch.csproj \ - $(PROJECT_DIR)/MonoTouch.NUnitLite.watchos.csproj \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/Xamarin.WatchOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/watchOS/Xamarin.WatchOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/watchOS/Xamarin.WatchOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/watchOS/Xamarin.WatchOS.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/watchOS/Xamarin.WatchOS.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/MonoTouch.NUnitLite.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/MonoTouch.NUnitLite.pdb - -# reference assemblies, this is just for compilation with XS -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/%.dll: $(WATCH_BUILD_DIR)/reference/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/Facades - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/%.pdb: $(WATCH_BUILD_DIR)/reference/%.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/%.config: $(WATCH_BUILD_DIR)/reference/%.config | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS - $(Q) install -m 0644 $< $@ - -# the actual architecture-specific versions -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/watchOS/Xamarin.WatchOS.dll: $(WATCH_BUILD_DIR)/watch-32/Xamarin.WatchOS.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/watchOS - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/watchOS/Xamarin.WatchOS.dll: $(WATCH_BUILD_DIR)/watch-64/Xamarin.WatchOS.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/watchOS - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/watchOS/Xamarin.WatchOS.pdb: $(WATCH_BUILD_DIR)/watch-32/Xamarin.WatchOS.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/32bits/watchOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/watchOS/Xamarin.WatchOS.pdb: $(WATCH_BUILD_DIR)/watch-64/Xamarin.WatchOS.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/watchOS - $(Q) install -m 0644 $< $@ - -$(WATCH_TARGETS_DIRS): - $(Q) mkdir -p $@ - -all-watch: $(WATCH_TARGETS) -install-watch: $(WATCH_TARGETS) - -ifdef INCLUDE_XAMARIN_LEGACY -ifdef INCLUDE_WATCH -ALL_TARGETS += all-watch -INSTALL_TARGETS += install-watch -endif -endif - # -# Xamarin.TVOS +# tvOS # TVOS_DEFINES = -define:IPHONE -define:MONOTOUCH -d:TVOS -d:XAMCORE_3_0 -d:__TVOS__ -d:SYSTEM_NET_HTTP -TVOS_GENERATOR=$(BUILD_DIR)/common/bgen.exe -TVOS_GENERATE=$(SYSTEM_MONO) --debug $(TVOS_GENERATOR) TVOS_CORE_DEFINES=$(TVOS_DEFINES) -d:COREBUILD TVOS_GENERATOR_FLAGS = -d:TVOS -d:XAMCORE_3_0 -inline-selectors TVOS_DOTNET_EXTRA_CORE_SOURCES = \ - $(TVOS_BUILD_DIR)/Constants.cs \ - $(DOTNET_BUILD_DIR)/Constants.tvos.generated.cs \ - $(TVOS_BUILD_DIR)/AssemblyInfo.cs \ - -TVOS_EXTRA_CORE_SOURCES = \ - $(TVOS_BUILD_DIR)/Constants.cs \ - $(BUILD_DIR)/Constants.tvos.generated.cs \ - $(TVOS_BUILD_DIR)/AssemblyInfo.cs \ - $(IOS_OPENTK_1_0_CORE_SOURCES) \ - $(SHARED_SYSTEM_DRAWING_SOURCES) \ + $(TVOS_DOTNET_BUILD_DIR)/Constants.cs \ + $(TVOS_DOTNET_BUILD_DIR)/Constants.generated.cs \ + $(TVOS_DOTNET_BUILD_DIR)/AssemblyInfo.cs \ TVOS_DOTNET_CORE_SOURCES += \ $(TVOS_DOTNET_EXTRA_CORE_SOURCES) \ -TVOS_CORE_SOURCES += \ - $(TVOS_EXTRA_CORE_SOURCES) \ - TVOS_DOTNET_HTTP_SOURCES = \ Foundation/NSUrlSessionHandler.cs \ System.Net.Http/CFContentStream.cs \ @@ -921,30 +261,21 @@ TVOS_DOTNET_SOURCES += \ $(TVOS_DOTNET_EXTRA_CORE_SOURCES) \ $(TVOS_HTTP_SOURCES) \ -TVOS_SOURCES += \ - $(TVOS_EXTRA_CORE_SOURCES) \ - $(TVOS_HTTP_SOURCES) \ - -$(TVOS_BUILD_DIR)/Constants.cs: $(TOP)/src/Constants.tvos.cs.in Makefile $(TOP)/Make.config.inc | $(TVOS_BUILD_DIR) +$(TVOS_DOTNET_BUILD_DIR)/Constants.cs: $(TOP)/src/Constants.tvos.cs.in Makefile $(TOP)/Make.config.inc | $(TVOS_DOTNET_BUILD_DIR) $(call Q_PROF_GEN,tvos) sed \ - -e "s/@VERSION@/$(IOS_PACKAGE_VERSION_MAJOR).$(IOS_PACKAGE_VERSION_MINOR).$(IOS_PACKAGE_VERSION_REV)/g" \ + -e "s/@VERSION@/$(TVOS_NUGET_VERSION_MAJOR).$(TVOS_NUGET_VERSION_MINOR).$(TVOS_NUGET_VERSION_PATCH)/g" \ -e 's/@REVISION@/$(IOS_COMMIT_DISTANCE) ($(CURRENT_BRANCH_SED_ESCAPED): $(shell git log -1 --pretty=%h))/g' \ -e "s/@TVOS_SDK_VERSION@/$(TVOS_SDK_VERSION)/g" \ $< > $@ -$(TVOS_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in $(TOP)/Make.config $(GIT_DIRECTORY)/HEAD | $(TVOS_BUILD_DIR) +$(TVOS_DOTNET_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in $(TOP)/Make.config $(GIT_DIRECTORY)/HEAD | $(TVOS_DOTNET_BUILD_DIR) $(call Q_PROF_GEN,tvos) sed \ -e 's|@PRODUCT_NAME@|Xamarin.TVOS|g' \ -e 's|@PACKAGE_HEAD_REV@|$(PACKAGE_HEAD_REV)|g' \ -e 's|@PACKAGE_HEAD_BRANCH@|$(CURRENT_BRANCH_SED_ESCAPED)|g' \ - -e 's|@PACKAGE_VERSION_MAJOR@|$(IOS_PACKAGE_VERSION_MAJOR)|g' \ - -e 's|@PACKAGE_VERSION_MINOR@|$(IOS_PACKAGE_VERSION_MINOR)|g' \ - -e 's|@PACKAGE_VERSION_REV@|$(IOS_PACKAGE_VERSION_REV)|g' \ - -e 's|@PACKAGE_VERSION_BUILD@|$(IOS_PACKAGE_VERSION_BUILD)|g' \ -e 's|@NUGET_VERSION_NO_METADATA@|$(TVOS_NUGET_VERSION_NO_METADATA)|g' \ -e 's|@NUGET_VERSION_MAJOR@|$(TVOS_NUGET_VERSION_MAJOR)|g' \ -e 's|@NUGET_VERSION_MINOR@|$(TVOS_NUGET_VERSION_MINOR)|g' \ - -e 's|@NUGET_VERSION_THIRD_DIGIT_WORKAROUND@|$(NUGET_VERSION_THIRD_DIGIT_WORKAROUND)|g' \ -e 's|@NUGET_VERSION_REV@|$(TVOS_NUGET_VERSION_PATCH)|g' \ -e 's|@NUGET_VERSION_BUILD@|$(TVOS_NUGET_COMMIT_DISTANCE)|g' \ -e 's|@DOTNET_PLATFORM@|tvOS|g' \ @@ -954,120 +285,20 @@ $(TVOS_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in $(TOP)/Make.con $(Q) rm -f $@.tmp $(Q) touch $@ -$(TVOS_BUILD_DIR)/tvos/core.dll: $(TVOS_CORE_SOURCES) frameworks.sources Makefile $(RSP_DIR)/tvos-defines.rsp | $(TVOS_BUILD_DIR)/tvos - @mkdir -p $(TVOS_BUILD_DIR)/tvos - $(call Q_PROF_CSC,tvos) $(TV_CSC) -nologo -out:$@ -target:library -debug -unsafe \ - $(CORE_WARNINGS_TO_FIX) \ - @$(RSP_DIR)/tvos-defines.rsp \ - $(TVOS_CORE_DEFINES) \ - $(TVOS_CORE_SOURCES) - -# generated_sources -$(TVOS_BUILD_DIR)/tvos/generated_sources: $(TVOS_GENERATOR) $(TVOS_APIS) $(TVOS_BUILD_DIR)/tvos/core.dll $(TVOS_BUILD_DIR)/Xamarin.TVOS.BindingAttributes.dll $(BUILD_DIR)/tvos.rsp - $(call Q_PROF_GEN,tvos) $(TVOS_GENERATE) @$(BUILD_DIR)/tvos.rsp - -$(BUILD_DIR)/tvos.rsp: Makefile Makefile.generator frameworks.sources - $(Q_GEN) echo \ - -inline-selectors \ - -process-enums \ - $(TVOS_GENERATOR_WARNASERROR) \ - -core \ - -sourceonly=$(TVOS_BUILD_DIR)/tvos/generated_sources \ - -compiler=$(TV_CSC) \ - -nologo -nostdlib -noconfig \ - -tmpdir=$(TVOS_BUILD_DIR)/tvos \ - -baselib=$(TVOS_BUILD_DIR)/tvos/core.dll \ - -attributelib=$(TVOS_BUILD_DIR)/Xamarin.TVOS.BindingAttributes.dll \ - $(TVOS_GENERATOR_FLAGS) \ - -native-exception-marshalling \ - --ns:ObjCRuntime \ - $(TVOS_APIS) \ - --target-framework=Xamarin.TVOS,v1.0 \ - @$(RSP_DIR)/tvos-defines.rsp \ - > $@ - -$(TVOS_BUILD_DIR)/tvos-64/Xamarin.TVOS%dll $(TVOS_BUILD_DIR)/tvos-64/Xamarin.TVOS%pdb $(TVOS_BUILD_DIR)/reference/Xamarin.TVOS%dll: $(TVOS_SOURCES) $(TVOS_BUILD_DIR)/tvos/generated_sources $(PRODUCT_KEY_PATH) | $(TVOS_BUILD_DIR)/tvos-64 $(TVOS_BUILD_DIR)/reference - $(call Q_PROF_CSC,tvos) $(TV_CSC) -nologo -out:$(TVOS_BUILD_DIR)/tvos-64/Xamarin.TVOS.dll -target:library -debug -unsafe -optimize \ - -publicsign -keyfile:$(PRODUCT_KEY_PATH) $(TVOS_DEFINES) \ - -deterministic \ - $(ARGS_64) \ - $(WARNINGS_TO_FIX) \ - @$(RSP_DIR)/tvos-defines.rsp \ - -refout:$(TVOS_BUILD_DIR)/reference/Xamarin.TVOS.dll \ - $(TVOS_SOURCES) @$(TVOS_BUILD_DIR)/tvos/generated_sources - -# MonoTouch.NUnitLite -$(TVOS_BUILD_DIR)/reference/MonoTouch.NUnitLite%dll $(TVOS_BUILD_DIR)/reference/MonoTouch.NUnitLite%pdb: $(TVOS_TOUCHUNIT_SOURCES) $(PRODUCT_KEY_PATH) $(TVOS_BUILD_DIR)/reference/Xamarin.TVOS.dll $(TVOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.dll - $(call Q_PROF_CSC,tvos) $(SYSTEM_CSC) -features:strict -nologo -r:$(MONOTOUCH_TV_MONO_PATH)/mscorlib.dll -out:$(basename $@).dll -target:library -debug:portable -optimize -noconfig -nostdlib -publicsign \ - -keyfile:$(PRODUCT_KEY_PATH) -r:$(TVOS_BUILD_DIR)/reference/Xamarin.TVOS.dll -r:$(TVOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.dll -r:$(MONOTOUCH_TV_MONO_PATH)/System.dll -r:$(MONOTOUCH_TV_MONO_PATH)/System.Xml.dll \ - -r:$(MONOTOUCH_TV_MONO_PATH)/System.Core.dll \ - -nowarn:3006,612,649,414,1635,659 \ - -define:NUNITLITE,CLR_4_0,NET_4_5,__MOBILE__,MONO $(TVOS_DEFINES) \ - -define:XAMCORE_2_0,__UNIFIED__ \ - -deterministic \ - $(TVOS_TOUCHUNIT_SOURCES) - -# MonoTouch.Dialog-1 -$(TVOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.dll: $(MACIOS_BINARIES_PATH)/MonoTouch.Dialog-Unified/tvos/MonoTouch.Dialog-1.dll | $(TVOS_BUILD_DIR)/reference - $(Q) $(CP) $< $@ - -$(TVOS_BUILD_DIR)/reference/MonoTouch.Dialog-1.pdb: $(MACIOS_BINARIES_PATH)/MonoTouch.Dialog-Unified/tvos/MonoTouch.Dialog-1.pdb | $(TVOS_BUILD_DIR)/reference - $(Q) $(CP) $< $@ - -$(PROJECT_DIR)/xamtvos.csproj: xamtvos.tmpl.csproj Makefile $(wildcard $(TOP)/*.sources) - @sed -e 's**$(foreach file,$(TVOS_SOURCES),)*' -e 's**$(foreach file,$(TVOS_APIS),)*' $< | xmllint --format - > $@ - -$(PROJECT_DIR)/MonoTouch.NUnitLite.tvos.csproj: MonoTouch.NUnitLite.tvos.templ.csproj Makefile touch-unit.sources $(TOP)/Make.config $(TOP)/mk/mono.mk - $(Q) sed -e 's**$(foreach file,$(TVOS_TOUCHUNIT_SOURCES),)*' $< | xmllint --format - > $@ - -PROJECT_FILES += $(PROJECT_DIR)/xamtvos.csproj $(PROJECT_DIR)/MonoTouch.NUnitLite.tvos.csproj - -clean-tvos: - $(Q) rm -rf $(TVOS_BUILD_DIR) - $(Q) rm -f $(TVOS_TARGETS) - -TVOS_TARGETS_DIRS += \ - $(TVOS_BUILD_DIR) \ - $(TVOS_BUILD_DIR)/tvos \ - $(TVOS_BUILD_DIR)/tvos-64 \ - $(TVOS_BUILD_DIR)/reference \ - $(TVOS_BUILD_DIR)/reference/Facades \ - $(TVOS_BUILD_DIR)/NativeTypes \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/Facades \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/share/doc/Xamarin.TVOS \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/tvOS \ - -TVOS_TARGETS += \ - $(PROJECT_DIR)/xamtvos.csproj \ - $(PROJECT_DIR)/MonoTouch.NUnitLite.tvos.csproj \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/Xamarin.TVOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/tvOS/Xamarin.TVOS.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/tvOS/Xamarin.TVOS.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/OpenTK-1.0.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/OpenTK-1.0.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/OpenTK-1.0.dll.config \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/MonoTouch.Dialog-1.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/MonoTouch.Dialog-1.pdb \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/MonoTouch.NUnitLite.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/MonoTouch.NUnitLite.pdb - # -# Xamarin.MacCatalyst +# Mac Catalyst # # MacCatalyst is a variant of iOS, so it defines the iOS variables as well. MACCATALYST_DEFINES = -define:IPHONE -define:IOS -define:MONOTOUCH -d:__IOS__ -d:__MACCATALYST__ -d:SYSTEM_NET_HTTP -MACCATALYST_GENERATOR=$(BUILD_DIR)/common/bgen.exe -MACCATALYST_GENERATE=$(SYSTEM_MONO) --debug $(MACCATALYST_GENERATOR) MACCATALYST_CORE_DEFINES=$(MACCATALYST_DEFINES) -d:COREBUILD MACCATALYST_GENERATOR_FLAGS = -d:__MACCATALYST__ -d:IOS -inline-selectors MACCATALYST_DOTNET_EXTRA_CORE_SOURCES = \ - $(MACCATALYST_BUILD_DIR)/Constants.cs \ - $(DOTNET_BUILD_DIR)/Constants.maccatalyst.generated.cs \ - $(MACCATALYST_BUILD_DIR)/AssemblyInfo.cs \ + $(MACCATALYST_DOTNET_BUILD_DIR)/Constants.cs \ + $(MACCATALYST_DOTNET_BUILD_DIR)/Constants.generated.cs \ + $(MACCATALYST_DOTNET_BUILD_DIR)/AssemblyInfo.cs \ MACCATALYST_DOTNET_CORE_SOURCES += \ $(MACCATALYST_DOTNET_EXTRA_CORE_SOURCES) \ @@ -1078,40 +309,25 @@ MACCATALYST_DOTNET_HTTP_SOURCES = \ System.Net.Http/CFNetworkHandler.cs \ $(SHARED_DESIGNER_CS) \ -MACCATALYST_HTTP_SOURCES = \ - Foundation/NSUrlSessionHandler.cs \ - System.Net.Http/CFContentStream.cs \ - System.Net.Http/CFNetworkHandler.cs \ - $(SHARED_DESIGNER_CS) \ - MACCATALYST_DOTNET_SOURCES += \ $(MACCATALYST_DOTNET_EXTRA_CORE_SOURCES) \ $(MACCATALYST_DOTNET_HTTP_SOURCES) \ -MACCATALYST_SOURCES += \ - $(MACCATALYST_EXTRA_CORE_SOURCES) \ - $(MACCATALYST_HTTP_SOURCES) \ - -$(MACCATALYST_BUILD_DIR)/Constants.cs: $(TOP)/src/Constants.maccatalyst.cs.in Makefile $(TOP)/Make.config.inc | $(MACCATALYST_BUILD_DIR) +$(MACCATALYST_DOTNET_BUILD_DIR)/Constants.cs: $(TOP)/src/Constants.maccatalyst.cs.in Makefile $(TOP)/Make.config.inc | $(MACCATALYST_DOTNET_BUILD_DIR) $(call Q_PROF_GEN,maccatalyst) sed \ - -e "s/@VERSION@/$(IOS_PACKAGE_VERSION_MAJOR).$(IOS_PACKAGE_VERSION_MINOR).$(IOS_PACKAGE_VERSION_REV)/g" \ + -e "s/@VERSION@/$(MACCATALYST_NUGET_VERSION_MAJOR).$(MACCATALYST_NUGET_VERSION_MINOR).$(MACCATALYST_NUGET_VERSION_PATCH)/g" \ -e 's/@REVISION@/$(IOS_COMMIT_DISTANCE) ($(CURRENT_BRANCH_SED_ESCAPED): $(shell git log -1 --pretty=%h))/g' \ -e "s/@MACCATALYST_SDK_VERSION@/$(MACCATALYST_SDK_VERSION)/g" \ $< > $@ -$(MACCATALYST_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in $(TOP)/Make.config $(GIT_DIRECTORY)/HEAD | $(MACCATALYST_BUILD_DIR) +$(MACCATALYST_DOTNET_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in $(TOP)/Make.config $(GIT_DIRECTORY)/HEAD | $(MACCATALYST_DOTNET_BUILD_DIR) $(call Q_PROF_GEN,maccatalyst) sed \ -e 's|@PRODUCT_NAME@|Xamarin.MacCatalyst|g' \ -e 's|@PACKAGE_HEAD_REV@|$(PACKAGE_HEAD_REV)|g' \ -e 's|@PACKAGE_HEAD_BRANCH@|$(CURRENT_BRANCH_SED_ESCAPED)|g' \ - -e 's|@PACKAGE_VERSION_MAJOR@|$(IOS_PACKAGE_VERSION_MAJOR)|g' \ - -e 's|@PACKAGE_VERSION_MINOR@|$(IOS_PACKAGE_VERSION_MINOR)|g' \ - -e 's|@PACKAGE_VERSION_REV@|$(IOS_PACKAGE_VERSION_REV)|g' \ - -e 's|@PACKAGE_VERSION_BUILD@|$(IOS_PACKAGE_VERSION_BUILD)|g' \ -e 's|@NUGET_VERSION_NO_METADATA@|$(MACCATALYST_NUGET_VERSION_NO_METADATA)|g' \ -e 's|@NUGET_VERSION_MAJOR@|$(MACCATALYST_NUGET_VERSION_MAJOR)|g' \ -e 's|@NUGET_VERSION_MINOR@|$(MACCATALYST_NUGET_VERSION_MINOR)|g' \ - -e 's|@NUGET_VERSION_THIRD_DIGIT_WORKAROUND@|$(NUGET_VERSION_THIRD_DIGIT_WORKAROUND)|g' \ -e 's|@NUGET_VERSION_REV@|$(MACCATALYST_NUGET_VERSION_PATCH)|g' \ -e 's|@NUGET_VERSION_BUILD@|$(MACCATALYST_NUGET_COMMIT_DISTANCE)|g' \ -e 's|@DOTNET_PLATFORM@|MacCatalyst|g' \ @@ -1121,49 +337,6 @@ $(MACCATALYST_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in $(TOP)/M $(Q) rm -f $@.tmp $(Q) touch $@ -$(PROJECT_DIR)/xammaccatalyst.csproj: xammaccatalyst.tmpl.csproj Makefile $(wildcard $(TOP)/*.sources) - @sed -e 's**$(foreach file,$(MACCATALYST_SOURCES),)*' -e 's**$(foreach file,$(MACCATALYST_APIS),)*' $< | xmllint --format - > $@ - -$(PROJECT_DIR)/MonoTouch.NUnitLite.maccatalyst.csproj: MonoTouch.NUnitLite.maccatalyst.templ.csproj Makefile touch-unit.sources $(TOP)/Make.config $(TOP)/mk/mono.mk - $(Q) sed -e 's**$(foreach file,$(MACCATALYST_TOUCHUNIT_SOURCES),)*' $< | xmllint --format - > $@ - -MACCATALYST_TARGETS_DIRS += \ - $(MACCATALYST_BUILD_DIR) \ - -# reference assemblies, this is just for compilation with XS -$(MACCATALYST_TARGETS_DIRS): - $(Q) mkdir -p $@ - -# reference assemblies, this is just for compilation with XS -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/%.dll: $(TVOS_BUILD_DIR)/reference/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/Facades - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/%.pdb: $(TVOS_BUILD_DIR)/reference/%.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS - $(Q) install -m 0644 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/%.config: $(TVOS_BUILD_DIR)/reference/%.config | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS - $(Q) install -m 0644 $< $@ - -# the actual architecture-specific versions -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/tvOS/Xamarin.TVOS.dll: $(TVOS_BUILD_DIR)/tvos-64/Xamarin.TVOS.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/tvOS - $(Q) install -m 0755 $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/tvOS/Xamarin.TVOS.pdb: $(TVOS_BUILD_DIR)/tvos-64/Xamarin.TVOS.pdb | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/64bits/tvOS - $(Q) install -m 0644 $< $@ - -$(TVOS_TARGETS_DIRS): - $(Q) mkdir -p $@ - -all-tvos: $(TVOS_TARGETS) -install-tvos: $(TVOS_TARGETS) - -ifdef INCLUDE_XAMARIN_LEGACY -ifdef INCLUDE_TVOS -ALL_TARGETS += all-tvos -INSTALL_TARGETS += install-tvos -endif -endif - ### .NET ### define BuildDotNetIntermediateAssembly @@ -1345,9 +518,6 @@ SHARED_PATH := ../runtime $(SHARED_PATH)/Delegates.generated.cs: $(SHARED_PATH)/Delegates.cs.t4 $(SHARED_PATH)/delegates.t4 $(Q) $(MAKE) -C $(SHARED_PATH) Delegates.generated.cs -$(BUILD_DIR)/common/NativeTypes/%.cs: $(TOP)/src/NativeTypes/%.tt | $(BUILD_DIR)/common/NativeTypes - $(Q_GEN) $(TT) $(abspath $<) -o $(abspath $@) 1>/dev/null - $(COMMON_TARGET_DIRS): $(Q) mkdir -p $@ @@ -1356,24 +526,14 @@ $(DOTNET_COMPILER): Makefile $(TOP)/Make.config | $(DOTNET_BUILD_DIR) $(Q) echo "exec $(DOTNET_CSC) $(DOTNET_FLAGS) \"\$$@\"" >> $@ $(Q) chmod +x $@ -GENERATE_FRAMEWORKS_CONSTANTS=generate-frameworks-constants/legacy/bin/Debug/generate-frameworks-constants.exe DOTNET_GENERATE_FRAMEWORKS_CONSTANTS=generate-frameworks-constants/dotnet/bin/Debug/$(DOTNET_TFM)/generate-frameworks-constants.dll -$(GENERATE_FRAMEWORKS_CONSTANTS): $(wildcard generate-frameworks-constants/*.cs*) $(TOP)/tools/common/Frameworks.cs Makefile - $(Q) $(SYSTEM_MSBUILD) "/bl:$@.binlog" /r generate-frameworks-constants/legacy/generate-frameworks-constants.csproj $(MSBUILD_VERBOSITY) - $(Q) touch $@ # Running MSBuild doesn't always touch the target, so make sure we do here, otherwise make can end up confused. - $(DOTNET_GENERATE_FRAMEWORKS_CONSTANTS): $(wildcard generate-frameworks-constants/*.cs*) $(TOP)/tools/common/Frameworks.cs Makefile $(Q) $(DOTNET) build "/bl:$@.binlog" /r generate-frameworks-constants/dotnet/generate-frameworks-constants.csproj $(MSBUILD_VERBOSITY) $(Q) touch $@ # Running 'dotnet build' doesn't always touch the target, so make sure we do here, otherwise make can end up confused. # This rule means: generate a Constants..generated.cs for the frameworks in the variable _FRAMEWORKS -$(BUILD_DIR)/Constants.%.generated.cs: Makefile $(GENERATE_FRAMEWORKS_CONSTANTS) | $(BUILD_DIR) - $(Q) mono --debug $(GENERATE_FRAMEWORKS_CONSTANTS) "$*" "$@.tmp" - $(Q) mv "$@.tmp" "$@" - -# This rule means: generate a Constants..generated.cs for the frameworks in the variable _FRAMEWORKS -$(DOTNET_BUILD_DIR)/Constants.%.generated.cs: Makefile $(DOTNET_GENERATE_FRAMEWORKS_CONSTANTS) | $(DOTNET_BUILD_DIR) +$(DOTNET_BUILD_DIR)/%/Constants.generated.cs: Makefile $(DOTNET_GENERATE_FRAMEWORKS_CONSTANTS) | $(DOTNET_BUILD_DIR) $(Q) $(DOTNET) $(DOTNET_GENERATE_FRAMEWORKS_CONSTANTS) "$*" "$@.tmp" $(Q) mv "$@.tmp" "$@" @@ -1383,7 +543,6 @@ all-local:: $(ALL_TARGETS) $(DOTNET_TARGETS_DIRS): $(Q) mkdir -p $@ -ifdef ENABLE_DOTNET define DotNetProjectFiles $(DOTNET_BUILD_DIR)/projects/$(1)/$(1).csproj: dotnet.tmpl.csproj Makefile $$(wildcard $(CURDIR)/*.sources) @mkdir -p $$(dir $$@) @@ -1396,12 +555,9 @@ $(DOTNET_BUILD_DIR)/projects/$(1)/$(1).csproj: dotnet.tmpl.csproj Makefile $$(wi PROJECT_FILES += $(DOTNET_BUILD_DIR)/projects/$(1)/$(1).csproj endef $(foreach platform,$(DOTNET_PLATFORMS),$(eval $(call DotNetProjectFiles,$(platform),$(shell echo $(platform) | tr '[:lower:]' '[:upper:]')))) -endif dotnet: $(DOTNET_TARGETS) -ifdef ENABLE_DOTNET all-local:: $(DOTNET_TARGETS) -endif project-files: $(PROJECT_FILES) diff --git a/src/Makefile.generator b/src/Makefile.generator index 7a7eb098880a..a88c56ec1d50 100644 --- a/src/Makefile.generator +++ b/src/Makefile.generator @@ -2,41 +2,21 @@ # Generator # -# copy generator.csproj to the build dir so that we can use our shared .csproj.inc target from rules.mk to create generator.csproj.inc -# we need any generated files in this directory to go into the build directory, and the shared target will output the csproj.inc into the same directory as the csproj -$(BUILD_DIR)/generator.csproj: generator.csproj | $(BUILD_DIR) - $(Q) $(CP) $< $@ - -# generator.csproj.inc contains the generator_dependencies variable used to determine if the generator needs to be rebuilt or not. -$(BUILD_DIR)/generator.csproj.inc: export BUILD_VERBOSITY=$(MSBUILD_VERBOSITY) --include $(BUILD_DIR)/generator.csproj.inc +bgen.csproj.inc: export BUILD_EXECUTABLE=$(DOTNET) build +bgen.csproj.inc: export BUILD_VERBOSITY=$(MSBUILD_VERBOSITY) -$(BUILD_DIR)/common/bgen.exe: $(generator_dependencies) Makefile.generator $(BUILD_DIR)/generator-frameworks.g.cs - $(Q_GEN) $(SYSTEM_MSBUILD) "/bl:$@.binlog" $(XBUILD_VERBOSITY) /p:Configuration=Debug generator.csproj /p:IntermediateOutputPath=$(BUILD_DIR)/IDE/obj/common/ /p:OutputPath=$(BUILD_DIR)/common /restore - -# copy generator.csproj to the build dir so that we can use our shared .csproj.inc target from rules.mk to create generator.csproj.inc -# we need any generated files in this directory to go into the build directory, and the shared target will output the csproj.inc into the same directory as the csproj -$(DOTNET_BUILD_DIR)/bgen.csproj: $(BUILD_DIR)/generator.csproj | $(BUILD_DIR) +# bgen.csproj.inc contains the generator_dependencies variable used to determine if the generator needs to be rebuilt or not. +$(DOTNET_BUILD_DIR)/bgen.csproj.inc: bgen/bgen.csproj.inc $(Q) $(CP) $< $@ -# bgen.csproj.inc contains the generator_dependencies variable used to determine if the generator needs to be rebuilt or not. -$(DOTNET_BUILD_DIR)/bgen.csproj.inc: export BUILD_VERBOSITY=$(MSBUILD_VERBOSITY) -include $(DOTNET_BUILD_DIR)/bgen.csproj.inc -$(DOTNET_BUILD_DIR)/bgen/bgen: $(bgen_dependencies) Makefile.generator $(BUILD_DIR)/generator-frameworks.g.cs | $(DOTNET_BUILD_DIR)/bgen +$(DOTNET_BUILD_DIR)/bgen/bgen: $(bgen_dependencies) Makefile.generator $(DOTNET_BUILD_DIR)/generator-frameworks.g.cs | $(DOTNET_BUILD_DIR)/bgen $(Q_DOTNET_BUILD) $(DOTNET) publish bgen/bgen.csproj $(DOTNET_BUILD_VERBOSITY) /p:Configuration=Debug /p:IntermediateOutputPath=$(abspath $(DOTNET_BUILD_DIR)/IDE/obj/common/bgen)/ /p:OutputPath=$(abspath $(DOTNET_BUILD_DIR)/IDE/bin/common/bgen/)/ $(Q) $(CP) $(DOTNET_BUILD_DIR)/IDE/bin/common/bgen/publish/* $(dir $@) $(Q) printf 'exec $(DOTNET) "$$(dirname "$$0")"/bgen.dll $$@\n' > $@ $(Q) chmod +x $@ -# Serialize the building of the legacy bgen and the .NET version, because they can both try to restore the same NuGet package at the same time, and that runs into race conditions -# This is done by adding a dependency from the legacy bgen to the .NET bgen, so the legacy bgen doesn't start building until the .NET one is done. -ifdef INCLUDE_XAMARIN_LEGACY -ifdef ENABLE_DOTNET -$(BUILD_DIR)/common/bgen.exe: $(DOTNET_BUILD_DIR)/bgen/bgen -endif -endif - define BGenTargets $(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)/tools/lib/bgen/bgen: $(DOTNET_BUILD_DIR)/bgen/bgen | $(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)/tools/lib/bgen $$(Q) rm -Rf "$$(dir $$@)" @@ -72,7 +52,7 @@ DOTNET_TARGETS_DIRS += \ # Common # -$(BUILD_DIR)/generator-frameworks.g.cs: frameworks.sources Makefile.generator generate-frameworks.csharp +$(DOTNET_BUILD_DIR)/generator-frameworks.g.cs: frameworks.sources Makefile.generator generate-frameworks.csharp @mkdir -p $(dir $@) $(Q) ./generate-frameworks.csharp $@.tmp '$(IOS_FRAMEWORKS)' '$(MACOS_FRAMEWORKS)' '$(WATCHOS_FRAMEWORKS)' '$(TVOS_FRAMEWORKS)' '$(MACCATALYST_FRAMEWORKS)' $(Q) if ! diff $@ $@.tmp >/dev/null; then $(CP) $@.tmp $@; git diff "$@"; echo "The file $@ has been automatically re-generated; please commit the changes."; exit 1; fi @@ -93,169 +73,3 @@ $(RSP_DIR)/dotnet/%-defines-dotnet.rsp: frameworks.sources Makefile.generator ge $(DOTNET_BUILD_DIR)/Xamarin.Apple.BindingAttributes.dll: bgen/Attributes.cs Makefile.generator | $(DOTNET_BUILD_DIR) $(Q_DOTNET_BUILD) $(SYSTEM_CSC) $(DOTNET_FLAGS) -out:$@ $< -# -# Xamarin.iOS (btouch) -# - -IOS_TARGETS_DIRS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/btouch \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen \ - -IOS_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.iOS.BindingAttributes.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/bgen.exe \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/bgen \ - -IOS_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/btouch \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/btouch-native \ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/bgen: bgen/bgen | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin - $(Q) $(CP) $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/btouch: Makefile.generator | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin - $(Q_GEN) printf "#!/bin/sh -e\n\necho \"error BI0088: btouch: MonoTouch binding projects are not supported anymore. Please upgrade the binding project to a Xamarin.iOS (Unified) binding project.\"\nexit 1\n" > $@ - $(Q) chmod +x $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/btouch-native: btouch-native | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin - $(Q) $(CP) $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/%.dll: $(IOS_BUILD_DIR)/native/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen - $(Q) install -m 0755 $< $@ - $(Q) install -m 0644 $(<:.dll=.pdb) $(@:.dll=.pdb) - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/bgen.exe: $(BUILD_DIR)/common/bgen.exe | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen - $(Q) install -m 0755 $< $@ - $(Q) install -m 0644 $< $(@:.exe=.pdb) - $(Q) install -m 0755 "$(dir $<)"/*.dll "$(dir $@)" - -$(IOS_BUILD_DIR)/native/Xamarin.iOS.BindingAttributes.dll: bgen/Attributes.cs Makefile.generator - $(Q) mkdir -p $(dir $@) - $(Q_GEN) $(IOS_CSC) -features:strict -nologo -out:$@ -debug bgen/Attributes.cs -target:library -deterministic - -# -# Xamarin.Watch (bwatch) -# - -WATCH_TARGETS_DIRS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bwatch \ - -WATCH_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.WatchOS.BindingAttributes.dll \ - -WATCH_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/bwatch \ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/bwatch: bwatch | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin - $(Q) $(CP) $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/%.dll: $(WATCH_BUILD_DIR)/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen - $(Q) install -m 0755 $< $@ - $(Q) install -m 0644 $(<:.dll=.pdb) $(@:.dll=.pdb) - -$(WATCH_BUILD_DIR)/Xamarin.WatchOS.BindingAttributes.dll: bgen/Attributes.cs Makefile.generator - $(Q) mkdir -p $(dir $@) - $(Q_GEN) $(WATCH_CSC) -features:strict -nologo -debug -out:$@ -debug bgen/Attributes.cs -target:library -deterministic - -# # -# # Xamarin.TVOS (btv) -# # - -TVOS_TARGETS_DIRS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/btv \ - -TVOS_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.TVOS.BindingAttributes.dll \ - -TVOS_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/btv \ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/btv: btv | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin - $(Q) $(CP) $< $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/%.dll: $(TVOS_BUILD_DIR)/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen - $(Q) install -m 0755 $< $@ - $(Q) install -m 0644 $(<:.dll=.pdb) $(@:.dll=.pdb) - -$(TVOS_BUILD_DIR)/Xamarin.TVOS.BindingAttributes.dll: bgen/Attributes.cs Makefile.generator - $(Q) mkdir -p $(dir $@) - $(Q_GEN) $(TV_CSC) -features:strict -nologo -debug -out:$@ -debug bgen/Attributes.cs -target:library -deterministic - -# -# Xamarin.MacCatalyst -# - -MACCATALYST_TARGETS += \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.MacCatalyst.BindingAttributes.dll \ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/%.dll: $(MACCATALYST_BUILD_DIR)/%.dll | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen - $(Q) install -m 0755 $< $@ - $(Q) install -m 0644 $(<:.dll=.pdb) $(@:.dll=.pdb) - -$(MACCATALYST_BUILD_DIR)/Xamarin.MacCatalyst.BindingAttributes.dll: bgen/Attributes.cs Makefile.generator - $(Q) mkdir -p $(dir $@) - $(Q_GEN) $(MACCATALYST_CSC) -features:strict -nologo -debug -out:$@ -debug bgen/Attributes.cs -target:library -deterministic - -# -# Xamarin.Mac (bmac) -# - -MACOS_TARGETS_DIRS += \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bmac \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen \ - -MACOS_TARGETS += \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin/bgen \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin/bgen-classic \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/bgen.exe \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/Xamarin.Mac-full.BindingAttributes.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/Xamarin.Mac-mobile.BindingAttributes.dll \ - -MACOS_TARGETS += \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin/bmac \ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin/bgen: bgen/bgen | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin - $(Q) $(CP) $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin/bgen-classic: Makefile.generator | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin - $(Q_GEN) printf "#!/bin/sh -e\n\necho \"error BI0087: bgen-classic: Xamarin.Mac Classic binding projects are not supported anymore. Please upgrade the binding project to a Xamarin.Mac Unified binding project.\"\nexit 1\n" > $@ - $(Q) chmod +x $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin/bmac: bmac.ikvm | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin - $(Q) install -m 0755 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/%.dll: $(MACOS_BUILD_DIR)/%.dll | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen - $(Q) install -m 0755 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/%.pdb: $(MACOS_BUILD_DIR)/%.pdb | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/%.mdb: $(MACOS_BUILD_DIR)/%.mdb | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen - $(Q) install -m 0644 $< $@ - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/%.exe: $(BUILD_DIR)/common/bgen.exe | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen - $(Q) install -m 0755 $< $@ - $(Q) install -m 0644 $< $(@:.exe=.pdb) - $(Q) install -m 0755 "$(dir $<)"/*.dll "$(dir $@)" - -define MAC_BINDINGATTRIBUTES_template -$$(MACOS_BUILD_DIR)/Xamarin.Mac-$(1).BindingAttributes.dll: bgen/Attributes.cs Makefile.generator - $$(Q) mkdir -p $$(dir $$@) - $$(Q_GEN) $$(MAC_$(1)_CSC) -features:strict -nologo -debug -out:$$@ -debug bgen/Attributes.cs -target:library -deterministic -endef - -$(eval $(call MAC_BINDINGATTRIBUTES_template,full)) -$(eval $(call MAC_BINDINGATTRIBUTES_template,mobile)) - -install-bgen: \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin/bgen \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/bgen.exe \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/Xamarin.Mac-full.BindingAttributes.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/bgen/Xamarin.Mac-mobile.BindingAttributes.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.iOS.BindingAttributes.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.TVOS.BindingAttributes.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.WatchOS.BindingAttributes.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/Xamarin.MacCatalyst.BindingAttributes.dll \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/bgen/bgen.exe \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/bgen \ - diff --git a/src/MetalPerformanceShaders/MPSDefs.cs b/src/MetalPerformanceShaders/MPSDefs.cs index 913747b86cbc..13b39da667a5 100644 --- a/src/MetalPerformanceShaders/MPSDefs.cs +++ b/src/MetalPerformanceShaders/MPSDefs.cs @@ -130,11 +130,7 @@ public struct MPSImageRegion { public struct MPSImageHistogramInfo { [FieldOffset (0)] public nuint NumberOfHistogramEntries; -#if ARCH_64 [FieldOffset (8)] -#else - [FieldOffset (4)] -#endif public bool HistogramForAlpha; [FieldOffset (16)] public Vector4 MinPixelValue; diff --git a/src/MonoTouch.NUnitLite.maccatalyst.templ.csproj b/src/MonoTouch.NUnitLite.maccatalyst.templ.csproj deleted file mode 100644 index 955ca3dff852..000000000000 --- a/src/MonoTouch.NUnitLite.maccatalyst.templ.csproj +++ /dev/null @@ -1,46 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - MonoTouch.NUnitLite - True - NUNITLITE;CLR_4_0;NET_4_5;XAMCORE_2_0;MONOTOUCH;MONO - build\maccatalyst\reference - $(OutputPath) - true - ..\product.snk - false - - - true - full - false - prompt - 4 - true - True - - - none - false - prompt - 4 - true - - - - - - - - - - - diff --git a/src/MonoTouch.NUnitLite.templ.csproj b/src/MonoTouch.NUnitLite.templ.csproj deleted file mode 100644 index 61eefd2debf1..000000000000 --- a/src/MonoTouch.NUnitLite.templ.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - MonoTouch.NUnitLite - True - NUNITLITE;CLR_4_0;NET_4_5;XAMCORE_2_0;MONOTOUCH;MONO - build\ios\reference - $(OutputPath) - true - ..\product.snk - false - - - true - full - false - prompt - 4 - true - True - - - none - false - prompt - 4 - true - - - - - - - - - - - - diff --git a/src/MonoTouch.NUnitLite.tvos.templ.csproj b/src/MonoTouch.NUnitLite.tvos.templ.csproj deleted file mode 100644 index 2ab13b9dc27f..000000000000 --- a/src/MonoTouch.NUnitLite.tvos.templ.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {072C1DD1-7566-4387-B9EC-466891558ACC} - {06FA79CB-D6CD-4721-BB4B-1BD202089C55};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - MonoTouch.NUnitLite - True - NUNITLITE;CLR_4_0;NET_4_5;XAMCORE_2_0;XAMCORE_3_0;MONOTOUCH;MONO - build\tvos\reference - $(OutputPath) - true - ..\product.snk - false - - - true - full - false - prompt - 4 - true - True - - - none - false - prompt - 4 - true - - - - - - - - - - - - diff --git a/src/MonoTouch.NUnitLite.watchos.templ.csproj b/src/MonoTouch.NUnitLite.watchos.templ.csproj deleted file mode 100644 index a38f936b4fee..000000000000 --- a/src/MonoTouch.NUnitLite.watchos.templ.csproj +++ /dev/null @@ -1,46 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {B84C539D-971D-4703-8ABC-E1077FDA651C} - {FC940695-DFE0-4552-9F25-99AF4A5619A1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - MonoTouch.NUnitLite - True - NUNITLITE;CLR_4_0;NET_4_5;XAMCORE_2_0;XAMCORE_3_0;MONOTOUCH;MONO - build\watch\reference - $(OutputPath) - true - ..\product.snk - false - - - true - full - false - prompt - 4 - true - True - - - none - false - prompt - 4 - true - - - - - - - - - - - diff --git a/src/NativeTypes/Makefile b/src/NativeTypes/Makefile deleted file mode 100644 index 154598184c4b..000000000000 --- a/src/NativeTypes/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -.PHONY: all test clean - -all: test.exe - -test.exe: ../build/common/NativeTypes/Primitives.cs ../build/common/NativeTypes/Drawing.cs test.cs - mcs -unsafe -debug -out:$@ $+ -r:System.Drawing - -test: test.exe - mono --debug $< - -clean: - rm -f test.exe{,.mdb} diff --git a/src/NativeTypes/Primitives.tt b/src/NativeTypes/Primitives.tt deleted file mode 100644 index e78013356d2f..000000000000 --- a/src/NativeTypes/Primitives.tt +++ /dev/null @@ -1,455 +0,0 @@ -// !!! WARNING - GENERATED CODE - DO NOT EDIT !!! -// -// Generated by Primitives.tt, a T4 template. -// -// Primitives.cs: basic types with 32 or 64 bit sizes: -// -// - nint -// - nuint -// - nfloat -// -// The primitive n* types are optimized by the Mono JIT to perform -// at native int/long/float/double speeds. When NINT_JIT_OPTIMIZED -// is defined, all operators will throw NotImplementedException to -// ensure the JIT works as expected. Otherwise operations are -// carried out slowly using managed code. -// -// If ARCH_32 is defined, the underlying types for n* types will be -// 32 bit (int, uint, float). If not defined, the underlying types -// will be 64 bit (long, ulong, double). -// -// Authors: -// Aaron Bockover -// -// Copyright 2013 Xamarin, Inc. All rights reserved. -// - -#if NET -#define OBJCRUNTIME_nfloat -#endif - -<#@ template language="C#v3.5" #> -<#@ import namespace="System" #> -<#@ import namespace="System.Collections.Generic" #> - -#if !NET - -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; - -using ObjCRuntime; - -<# - foreach (var type in new [] { - new { NSName = "nint", CilName32 = "Int32", CilName64 = "Int64", IsIntegerType = true }, - new { NSName = "nuint", CilName32 = "UInt32", CilName64 = "UInt64", IsIntegerType = true }, - new { NSName = "nfloat", CilName32 = "Single", CilName64 = "Double", IsIntegerType = false } - }) { - var unops = new List { "+" }; - if (type.NSName != "nuint") { - unops.Add ("-"); - } - - if (type.IsIntegerType) { - unops.Add ("~"); - } - - var binops = new List { "+", "-", "*", "/", "%" }; - if (type.IsIntegerType) { - binops.Add ("&"); - binops.Add ("|"); - binops.Add ("^"); - } -#> -#if OBJCRUNTIME_<#= type.NSName #> -namespace ObjCRuntime -#else -namespace System -#endif -{ -#if !SKIP_<#= type.NSName #> - [Serializable] - [DebuggerDisplay ("{v,nq}")] - public unsafe struct <#= type.NSName #> : IFormattable, IConvertible, IComparable, IComparable<<#= type.NSName #>>, IEquatable <<#= type.NSName #>> - { - internal <#= type.NSName #> (<#= type.NSName #> v) { this.v = v.v; } - public <#= type.NSName #> (<#= type.CilName32 #> v) { this.v = v; } - -#if ARCH_32 - public static readonly int Size = 4; - - public static readonly <#= type.NSName #> MaxValue = <#= type.CilName32 #>.MaxValue; - public static readonly <#= type.NSName #> MinValue = <#= type.CilName32 #>.MinValue; -<# if (type.NSName == "nfloat") { #> - public static readonly nfloat Epsilon = (nfloat)<#= type.CilName32 #>.Epsilon; - public static readonly nfloat NaN = (nfloat)<#= type.CilName32 #>.NaN; - public static readonly nfloat NegativeInfinity = (nfloat)<#= type.CilName32 #>.NegativeInfinity; - public static readonly nfloat PositiveInfinity = (nfloat)<#= type.CilName32 #>.PositiveInfinity; -<# } #> - - [DebuggerBrowsable (DebuggerBrowsableState.Never)] - internal <#= type.CilName32 #> v; - - public <#= type.NSName #> (<#= type.CilName64 #> v) { this.v = (<#= type.CilName32 #>)v; } -#else - public static readonly int Size = 8; - - public static readonly <#= type.NSName #> MaxValue = (<#= type.NSName #>) <#= type.CilName64 #>.MaxValue; // 64-bit only codepath - public static readonly <#= type.NSName #> MinValue = (<#= type.NSName #>) <#= type.CilName64 #>.MinValue; // 64-bit only codepath -<# if (type.NSName == "nfloat") { #> - public static readonly nfloat Epsilon = (nfloat)<#= type.CilName64 #>.Epsilon; - public static readonly nfloat NaN = (nfloat)<#= type.CilName64 #>.NaN; - public static readonly nfloat NegativeInfinity = (nfloat)<#= type.CilName64 #>.NegativeInfinity; - public static readonly nfloat PositiveInfinity = (nfloat)<#= type.CilName64 #>.PositiveInfinity; -<# } #> - - [DebuggerBrowsable (DebuggerBrowsableState.Never)] - internal <#= type.CilName64 #> v; - - public <#= type.NSName #> (<#= type.CilName64 #> v) { this.v = v; } -#endif - -<# - Action Conversion = (conversionKind, fromType, toType) => { - // Console.Error.WriteLine ("{0}\t{1}\t{2}", conversionKind, fromType, toType); - - WriteLine ("\t\tpublic static {0} operator {1} ({2} v)\n\t\t{{", conversionKind, toType, fromType); - - Func Cast = arch => { - switch (toType) { - case "nint": - return arch == 32 ? "int" : "long"; - case "nuint": - return arch == 32 ? "uint" : "ulong"; - case "nfloat": - return arch == 32 ? "float" : "double"; - default: - return toType; - } - }; - - WriteLine ("#if NINT_JIT_OPTIMIZED"); - WriteLine ("\t\t\tthrow new NotImplementedException ();"); - WriteLine ("#elif ARCH_32"); - - foreach (var arch in new [] { 32, 64 }) { - Write ("\t\t\treturn "); - - var closeParen = false; - switch (toType) { - case "nint": - case "nuint": - case "nfloat": - closeParen = true; - Write ("new {0} (", toType); - break; - } - - if (fromType == "IntPtr" || fromType == "UIntPtr") { - Write ("*(({0} *)&v)", Cast (arch)); - } else if (toType == "IntPtr" || toType == "UIntPtr") { - Write ("*(({0} *)&v.v)", toType); - } else { - Write ("({0})", Cast (arch)); - - switch (fromType) { - case "nint": - case "nuint": - case "nfloat": - Write ("v.v"); - break; - default: - Write ("v"); - break; - } - } - - if (closeParen) - Write (")"); - - WriteLine (";"); - - if (arch == 32) - WriteLine ("#else"); - } - - WriteLine ("#endif"); - WriteLine ("\t\t}\n"); - }; - - Action Exp = (from, to) => Conversion ("explicit", from, to); - Action Imp = (from, to) => Conversion ("implicit", from, to); - - switch (type.NSName) { - case "nint": - Exp ("nuint", "nint"); - Exp ("nint", "nuint"); - Exp ("nfloat", "nint"); - Imp ("nint", "nfloat"); - Exp ("IntPtr", "nint"); - Exp ("nint", "IntPtr"); - Imp ("sbyte", "nint"); - Exp ("nint", "sbyte"); - Imp ("byte", "nint"); - Exp ("nint", "byte"); - Imp ("char", "nint"); - Exp ("nint", "char"); - Imp ("short", "nint"); - Exp ("nint", "short"); - Exp ("ushort", "nint"); - Exp ("nint", "ushort"); - Imp ("int", "nint"); - Exp ("nint", "int"); - Exp ("uint", "nint"); - Exp ("nint", "uint"); - Exp ("long", "nint"); - Imp ("nint", "long"); - Exp ("ulong", "nint"); - Exp ("nint", "ulong"); - Exp ("float", "nint"); - Imp ("nint", "float"); - Exp ("double", "nint"); - Imp ("nint", "double"); - Exp ("decimal", "nint"); - Imp ("nint", "decimal"); - break; - case "nuint": - Exp ("nfloat", "nuint"); - Imp ("nuint", "nfloat"); - Exp ("IntPtr", "nuint"); - Exp ("nuint", "IntPtr"); - Exp ("UIntPtr", "nuint"); - Exp ("nuint", "UIntPtr"); - Exp ("sbyte", "nuint"); - Exp ("nuint", "sbyte"); - Imp ("byte", "nuint"); - Exp ("nuint", "byte"); - Imp ("char", "nuint"); - Exp ("nuint", "char"); - Exp ("short", "nuint"); - Exp ("nuint", "short"); - Imp ("ushort", "nuint"); - Exp ("nuint", "ushort"); - Exp ("int", "nuint"); - Exp ("nuint", "int"); - Imp ("uint", "nuint"); - Exp ("nuint", "uint"); - Exp ("long", "nuint"); - Exp ("nuint", "long"); - Exp ("ulong", "nuint"); - Imp ("nuint", "ulong"); - Exp ("float", "nuint"); - Imp ("nuint", "float"); - Exp ("double", "nuint"); - Imp ("nuint", "double"); - Exp ("decimal", "nuint"); - Imp ("nuint", "decimal"); - break; - case "nfloat": - Exp ("IntPtr", "nfloat"); - Exp ("nfloat", "IntPtr"); - Imp ("sbyte", "nfloat"); - Exp ("nfloat", "sbyte"); - Imp ("byte", "nfloat"); - Exp ("nfloat", "byte"); - Imp ("char", "nfloat"); - Exp ("nfloat", "char"); - Imp ("short", "nfloat"); - Exp ("nfloat", "short"); - Imp ("ushort", "nfloat"); - Exp ("nfloat", "ushort"); - Imp ("int", "nfloat"); - Exp ("nfloat", "int"); - Imp ("uint", "nfloat"); - Exp ("nfloat", "uint"); - Imp ("long", "nfloat"); - Exp ("nfloat", "long"); - Imp ("ulong", "nfloat"); - Exp ("nfloat", "ulong"); - Imp ("float", "nfloat"); - Exp ("nfloat", "float"); - Exp ("double", "nfloat"); - Imp ("nfloat", "double"); - Exp ("decimal", "nfloat"); - Exp ("nfloat", "decimal"); - break; - } -#> -#if NINT_JIT_OPTIMIZED -<# foreach (var op in unops) { #> - public static <#= type.NSName #> operator <#= op #> (<#= type.NSName #> v) { throw new NotImplementedException (); } -<# } #> -#else -<# foreach (var op in unops) { #> - public static <#= type.NSName #> operator <#= op #> (<#= type.NSName #> v) { return new <#= type.NSName #> (<#= op #>v.v); } -<# } #> -#endif - -#if NINT_JIT_OPTIMIZED -<# foreach (var op in new [] { '+', '-' }) { #> - public static <#= type.NSName #> operator <#= op #><#= op #> (<#= type.NSName #> v) { throw new NotImplementedException (); } -<# } #> -#else -<# foreach (var op in new [] { '+', '-' }) { #> - public static <#= type.NSName #> operator <#= op #><#= op #> (<#= type.NSName #> v) { return new <#= type.NSName #> (v.v <#= op #> 1); } -<# } #> -#endif - -#if NINT_JIT_OPTIMIZED -<# foreach (var op in binops) { #> - public static <#= type.NSName #> operator <#= op #> (<#= type.NSName #> l, <#= type.NSName #> r) { throw new NotImplementedException (); } -<# } #> -<# if (type.IsIntegerType) { #> - -<# foreach (var op in new [] { "<<", ">>" }) { #> - public static <#= type.NSName #> operator <#= op #> (<#= type.NSName #> l, int r) { throw new NotImplementedException (); } -<# } } #> -#else -<# foreach (var op in binops) { #> - public static <#= type.NSName #> operator <#= op #> (<#= type.NSName #> l, <#= type.NSName #> r) { return new <#= type.NSName #> (l.v <#= op #> r.v); } -<# } #> -<# if (type.IsIntegerType) { #> - -<# foreach (var op in new [] { "<<", ">>" }) { #> - public static <#= type.NSName #> operator <#= op #> (<#= type.NSName #> l, int r) { return new <#= type.NSName #> (l.v <#= op #> r); } -<# } } #> -#endif - -#if NINT_JIT_OPTIMIZED -<# foreach (var op in new [] { "==", "!=", "<", ">", "<=", ">=" }) { #> - public static bool operator <#= op.PadRight (2) #> (<#= type.NSName #> l, <#= type.NSName #> r) { throw new NotImplementedException (); } -<# } #> -#else -<# foreach (var op in new [] { "==", "!=", "<", ">", "<=", ">=" }) { #> - public static bool operator <#= op.PadRight (2) #> (<#= type.NSName #> l, <#= type.NSName #> r) { return l.v <#= op #> r.v; } -<# } #> -#endif - - public int CompareTo (<#= type.NSName #> value) { return v.CompareTo (value.v); } - public int CompareTo (object value) - { - if (value is <#= type.NSName #>) - return v.CompareTo (((<#= type.NSName #>) value).v); - return v.CompareTo (value); - } - public bool Equals (<#= type.NSName #> obj) { return v.Equals (obj.v); } - public override bool Equals (object obj) - { - if (obj is <#= type.NSName #>) - return v.Equals (((<#= type.NSName #>) obj).v); - return v.Equals (obj); - } - public override int GetHashCode () { return v.GetHashCode (); } - -#if ARCH_32 -<# foreach (var cilName in new [] { type.CilName32, type.CilName64 }) { #> -<# if (type.NSName == "nfloat") { #> - public static bool IsNaN (nfloat f) { return <#= cilName #>.IsNaN ((<#= cilName #>)f); } - public static bool IsInfinity (nfloat f) { return <#= cilName #>.IsInfinity ((<#= cilName #>)f); } - public static bool IsPositiveInfinity (nfloat f) { return <#= cilName #>.IsPositiveInfinity ((<#= cilName #>)f); } - public static bool IsNegativeInfinity (nfloat f) { return <#= cilName #>.IsNegativeInfinity ((<#= cilName #>)f); } - -<# } #> - public static <#= type.NSName #> Parse (string s, IFormatProvider provider) { return (<#= type.NSName #>)<#= cilName #>.Parse (s, provider); } - public static <#= type.NSName #> Parse (string s, NumberStyles style) { return (<#= type.NSName #>)<#= cilName #>.Parse (s, style); } - public static <#= type.NSName #> Parse (string s) { return (<#= type.NSName #>)<#= cilName #>.Parse (s); } - public static <#= type.NSName #> Parse (string s, NumberStyles style, IFormatProvider provider) { - return (<#= type.NSName #>)<#= cilName #>.Parse (s, style, provider); - } - - public static bool TryParse (string s, out <#= type.NSName #> result) - { - <#= cilName #> v; - var r = <#= cilName #>.TryParse (s, out v); - result = (<#= type.NSName #>)v; - return r; - } - - public static bool TryParse (string s, NumberStyles style, IFormatProvider provider, out <#= type.NSName #> result) - { - <#= cilName #> v; - var r = <#= cilName #>.TryParse (s, style, provider, out v); - result = (<#= type.NSName #>)v; - return r; - } -<# if (cilName == type.CilName32) { #> -#else -<# } } #> -#endif - - public override string ToString () { return v.ToString (); } - public string ToString (IFormatProvider provider) { return v.ToString (provider); } - public string ToString (string format) { return v.ToString (format); } - public string ToString (string format, IFormatProvider provider) { return v.ToString (format, provider); } - - public TypeCode GetTypeCode () { return v.GetTypeCode (); } - - bool IConvertible.ToBoolean (IFormatProvider provider) { return ((IConvertible)v).ToBoolean (provider); } - byte IConvertible.ToByte (IFormatProvider provider) { return ((IConvertible)v).ToByte (provider); } - char IConvertible.ToChar (IFormatProvider provider) { return ((IConvertible)v).ToChar (provider); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) { return ((IConvertible)v).ToDateTime (provider); } - decimal IConvertible.ToDecimal (IFormatProvider provider) { return ((IConvertible)v).ToDecimal (provider); } - double IConvertible.ToDouble (IFormatProvider provider) { return ((IConvertible)v).ToDouble (provider); } - short IConvertible.ToInt16 (IFormatProvider provider) { return ((IConvertible)v).ToInt16 (provider); } - int IConvertible.ToInt32 (IFormatProvider provider) { return ((IConvertible)v).ToInt32 (provider); } - long IConvertible.ToInt64 (IFormatProvider provider) { return ((IConvertible)v).ToInt64 (provider); } - sbyte IConvertible.ToSByte (IFormatProvider provider) { return ((IConvertible)v).ToSByte (provider); } - float IConvertible.ToSingle (IFormatProvider provider) { return ((IConvertible)v).ToSingle (provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) { return ((IConvertible)v).ToUInt16 (provider); } - uint IConvertible.ToUInt32 (IFormatProvider provider) { return ((IConvertible)v).ToUInt32 (provider); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) { return ((IConvertible)v).ToUInt64 (provider); } - - object IConvertible.ToType (Type targetType, IFormatProvider provider) { - return ((IConvertible)v).ToType (targetType, provider); - } - - [Obsolete ("This API is not available in .NET, use Buffer.MemoryCopy instead.")] - [EditorBrowsable (EditorBrowsableState.Never)] - public static void CopyArray (IntPtr source, <#= type.NSName #> [] destination, int startIndex, int length) - { - if (source == IntPtr.Zero) - throw new ArgumentNullException ("source"); - if (destination is null) - throw new ArgumentNullException ("destination"); - if (destination.Rank != 1) - throw new ArgumentException ("destination", "array is multi-dimensional"); - if (startIndex < 0) - throw new ArgumentException ("startIndex", "must be >= 0"); - if (length < 0) - throw new ArgumentException ("length", "must be >= 0"); - if (startIndex + length > destination.Length) - throw new ArgumentException ("length", "startIndex + length > destination.Length"); - - for (int i = 0; i < length; i++) - destination [i + startIndex] = (<#= type.NSName #>)Marshal.ReadIntPtr (source, i * <#= type.NSName #>.Size); - } - - [Obsolete ("This API is not available in .NET, use Buffer.MemoryCopy instead.")] - [EditorBrowsable (EditorBrowsableState.Never)] - public static void CopyArray (<#= type.NSName #> [] source, int startIndex, IntPtr destination, int length) - { - if (source is null) - throw new ArgumentNullException ("source"); - if (destination == IntPtr.Zero) - throw new ArgumentNullException ("destination"); - if (source.Rank != 1) - throw new ArgumentException ("source", "array is multi-dimensional"); - if (startIndex < 0) - throw new ArgumentException ("startIndex", "must be >= 0"); - if (length < 0) - throw new ArgumentException ("length", "must be >= 0"); - if (startIndex + length > source.Length) - throw new ArgumentException ("length", "startIndex + length > source.Length"); - - for (int i = 0; i < length; i++) - Marshal.WriteIntPtr (destination, i * <#= type.NSName #>.Size, (IntPtr)source [i + startIndex]); - } - } -#endif // !SKIP_<#= type.NSName #> -} -<# } #> - -#endif // !NET diff --git a/src/NativeTypes/TODO b/src/NativeTypes/TODO deleted file mode 100644 index ea63abc9b0b8..000000000000 --- a/src/NativeTypes/TODO +++ /dev/null @@ -1,31 +0,0 @@ -- Determine namespace - + No namespace - + System - + MonoTouch/MonoMac.Foundation - -- Implement extra interfaces? - + Currently: - struct NSInteger : IComparable, IEquatable - + Should we also add? - : IComparable, IEquatable ... on 32 - : IComparable, IEquatable ... on 64 - -- Verify constructors - -- Verify explicit/implicit - -- Add explicit/implicit? - + explicit: CGPoint -> PointF - + implicit: PointF -> CGPoint - ... - This will take a dep on System.Drawing though - -- Remove implicit Rectangle->CGRect? - -- Drop some methods? - + CGSize.ToRoundedCGSize - + CGSize.ToSize (obsoleted for ToRoundedSize) - + CGSize.ToCGPoint - + CGSize.ToPointF (obsoleted for ToCGPoint) - -- Write tests diff --git a/src/NativeTypes/test.cs b/src/NativeTypes/test.cs deleted file mode 100644 index c2c3ab33ef70..000000000000 --- a/src/NativeTypes/test.cs +++ /dev/null @@ -1,33 +0,0 @@ -#nullable enable - -using System; -using System.Drawing; -using CoreGraphics; -namespace Foundation { - public class NSDictionary { } -} - -unsafe static class Test { - static void Main () - { - nint a = 55; - a *= 3; - Console.WriteLine (a + 32); - Console.WriteLine (a.GetType ()); - - short s = 100; - nint b = s; - Console.WriteLine (b); - - Console.WriteLine (sizeof (nint)); - - - var fr = new RectangleF (1.5f, 2.5f, 3.5f, 4.5f); - var dr = fr; - Console.WriteLine (fr); - Console.WriteLine (dr); - fr = (RectangleF) dr; - Console.WriteLine (fr); - - } -} diff --git a/src/ObjCRuntime/Runtime.cs b/src/ObjCRuntime/Runtime.cs index 2286d7909f90..5db823dfa3e1 100644 --- a/src/ObjCRuntime/Runtime.cs +++ b/src/ObjCRuntime/Runtime.cs @@ -2722,22 +2722,12 @@ public static void ThrowException (IntPtr gchandle) [EditorBrowsable (EditorBrowsableState.Advanced)] public static ulong ConvertNativeEnumValueToManaged (nuint value, bool targetTypeHasMaxValue) { -#if ARCH_32 - // Check if we got UInt32.MaxValue, which should probably be UInt64.MaxValue - if (targetTypeHasMaxValue && value == nuint.MaxValue) - return ulong.MaxValue; -#endif return (ulong) value; } [EditorBrowsable (EditorBrowsableState.Advanced)] public static long ConvertNativeEnumValueToManaged (nint value, bool targetTypeHasMaxValue) { -#if ARCH_32 - // Check if we got Int32.MaxValue, which should probably be Int64.MaxValue - if (targetTypeHasMaxValue && value == nint.MaxValue) - return long.MaxValue; -#endif return (long) value; } diff --git a/src/OpenTK.dll.sources b/src/OpenTK.dll.sources deleted file mode 100644 index 5f7d803b3133..000000000000 --- a/src/OpenTK.dll.sources +++ /dev/null @@ -1,56 +0,0 @@ -System.Drawing/ColorKnownColorTypeForwarders.cs -OpenGLES/OpenTK/Audio/AudioContext.cs -OpenGLES/OpenTK/Audio/AudioContextException.cs -OpenGLES/OpenTK/Audio/AudioDeviceEnumerator.cs -OpenGLES/OpenTK/Audio/AudioDeviceErrorChecker.cs -OpenGLES/OpenTK/Audio/AudioDeviceException.cs -OpenGLES/OpenTK/Audio/AudioException.cs -OpenGLES/OpenTK/Audio/AudioValueException.cs -OpenGLES/OpenTK/Audio/OpenAL/AL/AL.cs -OpenGLES/OpenTK/Audio/OpenAL/AL/ALEnums.cs -OpenGLES/OpenTK/Audio/OpenAL/AL/EffectsExtension.cs -OpenGLES/OpenTK/Audio/OpenAL/AL/EffectsExtensionEnums.cs -OpenGLES/OpenTK/Audio/OpenAL/AL/EffectsExtensionPresets.cs -OpenGLES/OpenTK/Audio/OpenAL/AL/XRamExtension.cs -OpenGLES/OpenTK/Audio/OpenAL/Alc/Alc.cs -OpenGLES/OpenTK/Audio/OpenAL/Alc/AlcEnums.cs -OpenGLES/OpenTK/AutoGeneratedAttribute.cs -OpenGLES/OpenTK/BlittableValueType.cs -OpenGLES/OpenTK/Configuration.cs -OpenGLES/OpenTK/ContextHandle.cs -OpenGLES/OpenTK/ContextHandleEqualityComparer.cs -OpenGLES/OpenTK/DisplayResolution.cs -OpenGLES/OpenTK/FrameEventArgs.cs -OpenGLES/OpenTK/Graphics/ColorFormat.cs -OpenGLES/OpenTK/Graphics/ES11.iPhone/Enums.cs -OpenGLES/OpenTK/Graphics/ES11.iPhone/GL.Core.cs -OpenGLES/OpenTK/Graphics/ES11.iPhone/GL.cs -OpenGLES/OpenTK/Graphics/ES11.iPhone/GL.Delegates.cs -OpenGLES/OpenTK/Graphics/ES11.iPhone/Helper.cs -OpenGLES/OpenTK/Graphics/ES20.iPhone/Enums.cs -OpenGLES/OpenTK/Graphics/ES20.iPhone/GL.Core.cs -OpenGLES/OpenTK/Graphics/ES20.iPhone/GL.cs -OpenGLES/OpenTK/Graphics/ES20.iPhone/GL.Delegates.cs -OpenGLES/OpenTK/Graphics/ES20.iPhone/Helper.cs -OpenGLES/OpenTK/Graphics/GraphicsContext.cs -OpenGLES/OpenTK/Graphics/GraphicsContextException.cs -OpenGLES/OpenTK/Graphics/GraphicsContextFlags.cs -OpenGLES/OpenTK/Graphics/GraphicsContextMissingException.cs -OpenGLES/OpenTK/Graphics/GraphicsMode.cs -OpenGLES/OpenTK/Graphics/GraphicsModeException.cs -OpenGLES/OpenTK/Graphics/IGraphicsContext.cs -OpenGLES/OpenTK/Graphics/IGraphicsMode.cs -OpenGLES/OpenTK/IGameWindow.cs -OpenGLES/OpenTK/INativeWindow.cs -OpenGLES/OpenTK/KeyPressEventArgs.cs -OpenGLES/OpenTK/Minimal.cs -OpenGLES/OpenTK/Platform/Factory.iPhone.cs -OpenGLES/OpenTK/Platform/iPhoneOS/iPhoneOSGameView.cs -OpenGLES/OpenTK/Platform/iPhoneOS/iPhoneOSGraphicsContext.cs -OpenGLES/OpenTK/Platform/iPhoneOS/iPhoneOSGraphicsMode.cs -OpenGLES/OpenTK/Platform/IWindowInfo.cs -OpenGLES/OpenTK/Platform/Utilities.iPhone.cs -OpenGLES/OpenTK/WindowBorder.cs -OpenGLES/OpenTK/WindowState.cs -CoreVideo/CVOpenGLESTexture.cs -CoreVideo/CVOpenGLESTextureCache.cs diff --git a/src/README.md b/src/README.md index e0bab7d651f1..af322faa3ea4 100644 --- a/src/README.md +++ b/src/README.md @@ -178,19 +178,8 @@ conditional compilation: | Variable | Description | | --------- | ------------| | `MONOMAC` | defined for Xamarin.Mac builds; not defined for Xamarin.iOS | -| `ARCH_32` | defined when the target architecture is 32-bit; this will be defined for Classic and the Unified 32-bit assemblies | -| `ARCH_64` | defined when the target architecture is 64-bit; this will be defined only for the Unified 64-bit assembly | | `COREBUILD` | defined when building the intermediate `core.dll` assembly against which the code generator will produce bindings | -For example, to build an API for all of iOS but only 64-bit OS X (Xamarin.Mac): - -```csharp -#if !MONOMAC || (MONOMAC && ARCH_64) -... -#endif -``` - - ## Source Localization ## Coming soon! diff --git a/src/System.Drawing/PointSizeRectangleTypeForwarders.cs b/src/System.Drawing/PointSizeRectangleTypeForwarders.cs deleted file mode 100644 index 858b1015f841..000000000000 --- a/src/System.Drawing/PointSizeRectangleTypeForwarders.cs +++ /dev/null @@ -1,8 +0,0 @@ -#if !NET -[assembly: System.Runtime.CompilerServices.TypeForwardedTo (typeof (System.Drawing.Point))] -[assembly: System.Runtime.CompilerServices.TypeForwardedTo (typeof (System.Drawing.PointF))] -[assembly: System.Runtime.CompilerServices.TypeForwardedTo (typeof (System.Drawing.Rectangle))] -[assembly: System.Runtime.CompilerServices.TypeForwardedTo (typeof (System.Drawing.RectangleF))] -[assembly: System.Runtime.CompilerServices.TypeForwardedTo (typeof (System.Drawing.Size))] -[assembly: System.Runtime.CompilerServices.TypeForwardedTo (typeof (System.Drawing.SizeF))] -#endif diff --git a/src/UIKit/NSLayoutManager.cs b/src/UIKit/NSLayoutManager.cs index 87c53b998421..ad558cc45887 100644 --- a/src/UIKit/NSLayoutManager.cs +++ b/src/UIKit/NSLayoutManager.cs @@ -51,15 +51,8 @@ public unsafe nuint GetGlyphs ( fixed (short* glyphs = glyphBuffer) { nuint rv; -#if ARCH_32 - // Unified/32: the output array is not the correct size, it needs to be int[], and it's an array of NSGlyphProperty (which is long) - nint[] tmpArray = null; - if (props is not null) - tmpArray = new nint [props.Length]; -#else // Unified/64 + Classic: the input array is the correct size var tmpArray = props; -#endif fixed (void* properties = tmpArray) { fixed (nuint* charIBuffer = charIndexBuffer) { fixed (byte* bidi = bidiLevelBuffer) { @@ -67,13 +60,6 @@ public unsafe nuint GetGlyphs ( } } } -#if ARCH_32 - // Marshal back from the tmpArray. - if (tmpArray is not null) { - for (int i = 0; i < props.Length; i++) - props [i] = (NSGlyphProperty) (long) tmpArray [i]; - } -#endif return rv; } diff --git a/src/Version.in b/src/Version.in deleted file mode 100644 index d78bda93422e..000000000000 --- a/src/Version.in +++ /dev/null @@ -1 +0,0 @@ -@VERSION@ diff --git a/src/bgen/Generator.cs b/src/bgen/Generator.cs index 0208eba94716..47cbefb4c0a6 100644 --- a/src/bgen/Generator.cs +++ b/src/bgen/Generator.cs @@ -1144,24 +1144,6 @@ bool GetNativeEnumToManagedExpression (Type enumType, out string preExpression, postExpression = string.Empty; } - // Check if we got UInt32.MaxValue, which should probably be UInt64.MaxValue (if the enum - // in question actually has that value at least). Same goes for Int32.MinValue/Int64.MinValue. - // var isDefined = enumType.IsEnumDefined (maxValue); - var definedMaxField = enumType.GetFields ().Where (v => v.IsLiteral).FirstOrDefault (isMaxDefinedFunc); - if (definedMaxField is not null && postproc is not null) { - postproc.AppendLine ("#if ARCH_32"); - postproc.AppendFormat ("if (({0}) ret == ({0}) {1}.MaxValue)\n", underlyingTypeName, itype); - postproc.AppendFormat ("\tret = {0}.{1}; // = {2}.MaxValue\n", renderedEnumType, definedMaxField.Name, underlyingTypeName); - if (underlyingEnumType == TypeCache.System_Int64) { - var definedMinField = enumType.GetFields ().Where (v => v.IsLiteral).FirstOrDefault (isMinDefinedFunc); - if (definedMinField is not null) { - postproc.AppendFormat ("else if (({0}) ret == ({0}) {1}.MinValue)\n", underlyingTypeName, itype); - postproc.AppendFormat ("\tret = {0}.{1}; // = {2}.MinValue\n", renderedEnumType, definedMinField.Name, underlyingTypeName); - } - } - postproc.AppendLine ("#endif"); - } - return true; } @@ -3253,22 +3235,6 @@ AvailabilityBaseAttribute GetIntroduced (MethodInfo mi, PropertyInfo pi) return mi.GetAvailability (AvailabilityKind.Introduced, this) ?? pi.GetAvailability (AvailabilityKind.Introduced, this); } - bool Is64BitiOSOnly (ICustomAttributeProvider provider) - { - if (BindThirdPartyLibrary) - return false; - if (BindingTouch.CurrentPlatform != PlatformName.iOS) - return false; - var attrib = provider.GetAvailability (AvailabilityKind.Introduced, this); - if (attrib is null) { - var minfo = provider as MemberInfo; - if (minfo is not null && minfo.DeclaringType is not null) - return Is64BitiOSOnly (minfo.DeclaringType); - return false; - } - return attrib.Version?.Major >= 11; - } - // // Generates the code necessary to lower the MonoTouch-APIs to something suitable // to be passed to Objective-C. @@ -4205,12 +4171,6 @@ void GenerateProperty (Type type, PropertyInfo pi, List instance_fields_ #endif } else { print ("get {"); - var is32BitNotSupported = Is64BitiOSOnly (pi); - if (is32BitNotSupported) { - print ("#if ARCH_32"); - print ("\tthrow new PlatformNotSupportedException (\"This API is not supported on this version of iOS\");"); - print ("#else"); - } if (debug) print ("Console.WriteLine (\"In {0}\");", pi.GetGetMethod ()); if (is_model) @@ -4237,8 +4197,6 @@ void GenerateProperty (Type type, PropertyInfo pi, List instance_fields_ indent--; } } - if (is32BitNotSupported) - print ("#endif"); print ("}\n"); } } @@ -4279,12 +4237,6 @@ void GenerateProperty (Type type, PropertyInfo pi, List instance_fields_ #endif } else { print ("set {"); - var is32BitNotSupported = Is64BitiOSOnly (pi); - if (is32BitNotSupported) { - print ("#if ARCH_32"); - print ("\tthrow new PlatformNotSupportedException (\"This API is not supported on this version of iOS\");"); - print ("#else"); - } if (debug) print ("Console.WriteLine (\"In {0}\");", pi.GetSetMethod ()); @@ -4312,8 +4264,6 @@ void GenerateProperty (Type type, PropertyInfo pi, List instance_fields_ } } } - if (is32BitNotSupported) - print ("#endif"); print ("}"); } } @@ -4655,12 +4605,6 @@ void GenerateMethod (MemberInformation minfo) print ("{"); - var is32BitNotSupported = Is64BitiOSOnly ((ICustomAttributeProvider) minfo.Method ?? minfo.Property); - if (is32BitNotSupported) { - print ("#if ARCH_32"); - print ("\tthrow new PlatformNotSupportedException (\"This API is not supported on this version of iOS\");"); - print ("#else"); - } if (debug) print ("\tConsole.WriteLine (\"In {0}\");", mi); @@ -4703,8 +4647,6 @@ void GenerateMethod (MemberInformation minfo) indent--; } } - if (is32BitNotSupported) - print ("#endif"); print ("}\n"); } @@ -5957,18 +5899,7 @@ public void Generate (Type type) if (!is_model) { print_generated_code (); - var is32BitNotSupported = Is64BitiOSOnly (type); - if (is32BitNotSupported) { - // potentially avoid a .cctor and extra, unusable code - print ("#if ARCH_32"); - print ("#pragma warning disable {0}", is_static_class ? "169" : "649"); - print ("static readonly {0} class_ptr;", NativeHandleType); - print ("#pragma warning restore {0}", is_static_class ? "169" : "649"); - print ("#else"); - } print ("static readonly {1} class_ptr = Class.GetHandle (\"{0}\");", objc_type_name, NativeHandleType); - if (is32BitNotSupported) - print ("#endif"); print (""); } } @@ -6016,7 +5947,6 @@ public void Generate (Type type) var initSelector = (InlineSelectors || BindThirdPartyLibrary) ? "Selector.GetHandle (\"init\")" : "Selector.Init"; var initWithCoderSelector = (InlineSelectors || BindThirdPartyLibrary) ? "Selector.GetHandle (\"initWithCoder:\")" : "Selector.InitWithCoder"; string v = (class_mod == "abstract " && default_ctor_visibility is null) ? "protected" : ctor_visibility; - var is32BitNotSupported = Is64BitiOSOnly (type); if (external) { if (!disable_default_ctor) { if (BindingTouch.SupportsXmlDocumentation) { @@ -6029,19 +5959,12 @@ public void Generate (Type type) sw.WriteLine ("\t\t[Export (\"init\")]"); sw.WriteLine ("\t\t{0} {1} () : base (NSObjectFlag.Empty)", v, TypeName); sw.WriteLine ("\t\t{"); - if (is32BitNotSupported) { - sw.WriteLine ("\t\t#if ARCH_32"); - sw.WriteLine ("\tthrow new PlatformNotSupportedException (\"This API is not supported on this version of iOS\");"); - sw.WriteLine ("\t\t#else"); - } if (is_direct_binding_value is not null) sw.WriteLine ("\t\t\tIsDirectBinding = {0};", is_direct_binding_value); if (debug) sw.WriteLine ("\t\t\tConsole.WriteLine (\"{0}.ctor ()\");", TypeName); sw.WriteLine ("\t\t\tInitializeHandle (global::{1}.IntPtr_objc_msgSend (this.Handle, global::ObjCRuntime.{0}), \"init\");", initSelector, NamespaceCache.Messaging); sw.WriteLine ("\t\t\t"); - if (is32BitNotSupported) - sw.WriteLine ("\t\t#endif"); sw.WriteLine ("\t\t}"); } } else { @@ -6056,11 +5979,6 @@ public void Generate (Type type) sw.WriteLine ("\t\t[Export (\"init\")]"); sw.WriteLine ("\t\t{0} {1} () : base (NSObjectFlag.Empty)", v, TypeName); sw.WriteLine ("\t\t{"); - if (is32BitNotSupported) { - sw.WriteLine ("\t\t#if ARCH_32"); - sw.WriteLine ("\tthrow new PlatformNotSupportedException (\"This API is not supported on this version of iOS\");"); - sw.WriteLine ("\t\t#else"); - } if (type_needs_thread_checks) { sw.Write ("\t\t\t"); GenerateThreadCheck (sw); @@ -6071,8 +5989,6 @@ public void Generate (Type type) () => string.Format ("InitializeHandle (global::{1}.IntPtr_objc_msgSendSuper (this.SuperHandle, global::ObjCRuntime.{0}), \"init\");", initSelector, NamespaceCache.Messaging)); WriteMarkDirtyIfDerived (sw, type); - if (is32BitNotSupported) - sw.WriteLine ("\t\t#endif"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } @@ -6093,11 +6009,6 @@ public void Generate (Type type) sw.WriteLine ("\t\t[Export (\"initWithCoder:\")]"); sw.WriteLine ("\t\t{0} {1} (NSCoder coder) : base (NSObjectFlag.Empty)", v, TypeName); sw.WriteLine ("\t\t{"); - if (is32BitNotSupported) { - sw.WriteLine ("\t\t#if ARCH_32"); - sw.WriteLine ("\tthrow new PlatformNotSupportedException (\"This API is not supported on this version of iOS\");"); - sw.WriteLine ("\t\t#else"); - } if (nscoding) { if (debug) sw.WriteLine ("\t\t\tConsole.WriteLine (\"{0}.ctor (NSCoder)\");", TypeName); @@ -6113,8 +6024,6 @@ public void Generate (Type type) } else { sw.WriteLine ("\t\t\tthrow new InvalidOperationException (\"Type does not conform to NSCoding\");"); } - if (is32BitNotSupported) - sw.WriteLine ("\t\t#endif"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } diff --git a/src/bgen/bgen.csproj b/src/bgen/bgen.csproj index db14ea38600f..1444c86b365a 100644 --- a/src/bgen/bgen.csproj +++ b/src/bgen/bgen.csproj @@ -34,7 +34,7 @@ - + diff --git a/src/bmac.ikvm b/src/bmac.ikvm deleted file mode 100755 index d7b17b1f3b94..000000000000 --- a/src/bmac.ikvm +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -sdk= -new_style= -refs= -full_profile= -mobile_profile= - -BIN_DIR=`dirname $0` -if [ `basename $BIN_DIR` == "Commands" ]; then -BIN_DIR="`dirname $BIN_DIR`/Versions/Current/bin" -fi - -ROOT_DIR=$BIN_DIR/.. - -bgen_path=$BIN_DIR/bgen - -btouch_arguments=() -for arg in "$@"; do - if [[ $sdk == next-arg ]]; then - sdk=$arg - elif [[ $arg =~ ^(/|-{1,2})sdk ]]; then - sdk=${arg#*=}; sdk=${sdk#*:} - if [[ $sdk == $arg ]]; then - sdk=next-arg - fi - elif [[ $arg =~ ^(/|-{1,2})new-style$ ]]; then - new_style=1 - mobile_profile=1 - continue - elif [[ $arg =~ ^(/|-{1,2})unified-full-profile$ ]]; then - full_profile=1 - new_style=1 - elif [[ $arg =~ ^(/|-{1,2})unified-mobile-profile$ ]]; then - mobile_profile=1 - new_style=1 - fi - btouch_arguments+=("${arg}") -done - -sdk=$(echo $sdk | tr '[:upper:]' '[:lower:]') - -case $sdk in -xammac) - echo "error BI0087: bgen-classic: Xamarin.Mac Classic binding projects are not supported anymore. Please upgrade the binding project to a Xamarin.Mac Unified binding project." - exit 1 - ;; -mobile|xamarin.mac) - refs="--target-framework=Xamarin.Mac,Version=v2.0,Profile=Mobile" - ;; -*) - if [[ -z "$new_style" ]]; then - echo "error BI0087: bgen-classic: Xamarin.Mac Classic binding projects are not supported anymore. Please upgrade the binding project to a Xamarin.Mac Unified binding project." - exit 1 - else - if [[ "$full_profile" -eq 1 ]]; then - refs="--target-framework=Xamarin.Mac,Version=v4.5,Profile=Full" - elif [[ "$mobile_profile" -eq 1 ]]; then - refs="--target-framework=Xamarin.Mac,Version=v2.0,Profile=Mobile" - else - refs="--target-framework=Xamarin.Mac,Version=v4.5,Profile=System" - fi - fi - ;; -esac - -exec $bgen_path $refs "${btouch_arguments[@]}" diff --git a/src/btouch-native b/src/btouch-native deleted file mode 100755 index 20078f9d54b5..000000000000 --- a/src/btouch-native +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -e - -pushd "$(dirname "$0")/.." > /dev/null -MONOTOUCH_PREFIX=$(pwd -P) -popd > /dev/null - -exec /Library/Frameworks/Mono.framework/Commands/mono64 --debug "$MONOTOUCH_PREFIX/lib/bgen/bgen.exe" --target-framework=Xamarin.iOS,v1.0 "$@" diff --git a/src/btouch-native.in b/src/btouch-native.in deleted file mode 100644 index da7fddb2805a..000000000000 --- a/src/btouch-native.in +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -MONO_PATH=@MONOTOUCH_PREFIX@/lib/mono/Xamarin.iOS @MONOTOUCH_PREFIX@/bin/btouch-mono --debug @MONOTOUCH_PREFIX@/lib/btouch/btouch-native.exe --target-framework=Xamarin.iOS,v1.0 "$@" diff --git a/src/btv b/src/btv deleted file mode 100755 index a39374179b10..000000000000 --- a/src/btv +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -e - -pushd "$(dirname "$0")/.." > /dev/null -MONOTOUCH_PREFIX=$(pwd -P) -popd > /dev/null - -exec /Library/Frameworks/Mono.framework/Commands/mono64 --debug "$MONOTOUCH_PREFIX/lib/bgen/bgen.exe" --target-framework=Xamarin.TVOS,v1.0 "$@" diff --git a/src/build/generator-frameworks.g.cs b/src/build/dotnet/generator-frameworks.g.cs similarity index 100% rename from src/build/generator-frameworks.g.cs rename to src/build/dotnet/generator-frameworks.g.cs diff --git a/src/bwatch b/src/bwatch deleted file mode 100755 index f5cefb38821c..000000000000 --- a/src/bwatch +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -e - -pushd "$(dirname "$0")/.." > /dev/null -MONOTOUCH_PREFIX=$(pwd -P) -popd > /dev/null - -exec /Library/Frameworks/Mono.framework/Commands/mono64 --debug "$MONOTOUCH_PREFIX/lib/bgen/bgen.exe" --target-framework=Xamarin.WatchOS,v1.0 "$@" diff --git a/src/bwatch.in b/src/bwatch.in deleted file mode 100644 index dc8a288442aa..000000000000 --- a/src/bwatch.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -MONO_PATH=@MONOTOUCH_PREFIX@/lib/mono/Xamarin.WatchOS @MONOTOUCH_PREFIX@/bin/bwatch-mono --debug @MONOTOUCH_PREFIX@/lib/bwatch/bwatch.exe "$@" - diff --git a/src/custom-make.sh b/src/custom-make.sh deleted file mode 100755 index 4a258c3834a3..000000000000 --- a/src/custom-make.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -ex - -# -# This is a hack to make monotouch.csproj compile in XS. A big hack. -# - -make -j20 \ No newline at end of file diff --git a/src/frameworks.sources b/src/frameworks.sources index 4de299e162b0..e129ca7cd91b 100644 --- a/src/frameworks.sources +++ b/src/frameworks.sources @@ -2012,7 +2012,6 @@ SHARED_CORE_SOURCES = \ DotNetGlobals.cs \ MinimumVersions.cs \ MonoPInvokeCallbackAttribute.cs \ - $(BUILD_DIR)/common/NativeTypes/Primitives.cs \ ObjCRuntime/ArgumentSemantic.cs \ ObjCRuntime/BindAsAttribute.cs \ ObjCRuntime/Blocks.cs \ diff --git a/src/generator.csproj b/src/generator.csproj deleted file mode 100644 index 04b1bb76380d..000000000000 --- a/src/generator.csproj +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Debug - AnyCPU - {D2EE02C0-9BFD-477D-AC92-4DE2D8490790} - Exe - bgen - bgen - v4.6.1 - $(BUILD_DIR)\ - build\ - latest - 8601,8618 - Nullable - enable - - - True - full - False - build\common - build\IDE\obj\common\ - DEBUG;BGENERATOR;NET_4_0;NO_AUTHENTICODE;STATIC;NO_SYMBOL_WRITER - prompt - 4 - True - - - - - - - - - - - Project - - $(ProjectDir) - - - - - - - Project - @build/$(RunConfiguration).rsp - $(ProjectDir) - - - - - - Project - @build/$(RunConfiguration).rsp - $(ProjectDir) - - - - - - Project - @build/$(RunConfiguration).rsp - $(ProjectDir) - - - - - - Project - @build/$(RunConfiguration).rsp - $(ProjectDir) - - - - - - Project - @build/$(RunConfiguration).rsp - $(ProjectDir) - - - - - - Project - @build/$(RunConfiguration).rsp - $(ProjectDir) - - - - - - - generator-errors.md - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Execution.cs - - - NullableAttributes.cs - - - - - - - - - - - - - - - - - - - - - - - - Resources.resx - - - - Driver.execution.cs - - - SdkVersions.cs - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - diff --git a/src/generator.sln b/src/generator.sln deleted file mode 100644 index b46f33d7e410..000000000000 --- a/src/generator.sln +++ /dev/null @@ -1,51 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "generator", "generator.csproj", "{D2EE02C0-9BFD-477D-AC92-4DE2D8490790}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "generator-tests", "..\tests\generator\generator-tests.csproj", "{10790816-D00E-40A0-8653-2A8AB4DD33A9}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D2EE02C0-9BFD-477D-AC92-4DE2D8490790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2EE02C0-9BFD-477D-AC92-4DE2D8490790}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2EE02C0-9BFD-477D-AC92-4DE2D8490790}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2EE02C0-9BFD-477D-AC92-4DE2D8490790}.Release|Any CPU.Build.0 = Release|Any CPU - {10790816-D00E-40A0-8653-2A8AB4DD33A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {10790816-D00E-40A0-8653-2A8AB4DD33A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {10790816-D00E-40A0-8653-2A8AB4DD33A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {10790816-D00E-40A0-8653-2A8AB4DD33A9}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - Policies = $0 - $0.TextStylePolicy = $1 - $1.FileWidth = 180 - $1.TabWidth = 8 - $1.IndentWidth = 8 - $1.scope = text/x-csharp - $0.CSharpFormattingPolicy = $2 - $2.IndentSwitchSection = False - $2.NewLinesForBracesInProperties = False - $2.NewLinesForBracesInAccessors = False - $2.NewLinesForBracesInAnonymousMethods = False - $2.NewLinesForBracesInControlBlocks = False - $2.NewLinesForBracesInAnonymousTypes = False - $2.NewLinesForBracesInObjectCollectionArrayInitializers = False - $2.NewLinesForBracesInLambdaExpressionBody = False - $2.NewLineForElse = False - $2.NewLineForCatch = False - $2.NewLineForFinally = False - $2.NewLineForMembersInObjectInit = False - $2.NewLineForMembersInAnonymousTypes = False - $2.NewLineForClausesInQuery = False - $2.SpacingAfterMethodDeclarationName = True - $2.SpaceAfterMethodCallName = True - $2.SpaceBeforeOpenSquareBracket = True - $2.scope = text/x-csharp - $2.SpaceAfterCast = True - EndGlobalSection -EndGlobal diff --git a/src/opentk.csproj b/src/opentk.csproj deleted file mode 100644 index 0be562e39c3c..000000000000 --- a/src/opentk.csproj +++ /dev/null @@ -1,246 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {D7E171B6-4B94-49FB-87CC-006B906FBECC} - {6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - opentk - opentk - - - true - full - false - bin\Debug - IPHONE;MINIMAL;MONOTOUCH - prompt - 4 - false - true - True - 3021,3014,3003 - - - none - false - bin\Release - prompt - 4 - false - true - - - - - - - - - - OpenGLES\OpenTK\Audio\AudioContext.cs - - - OpenGLES\OpenTK\Audio\AudioContextException.cs - - - OpenGLES\OpenTK\Audio\AudioDeviceEnumerator.cs - - - OpenGLES\OpenTK\Audio\AudioDeviceErrorChecker.cs - - - OpenGLES\OpenTK\Audio\AudioDeviceException.cs - - - OpenGLES\OpenTK\Audio\AudioException.cs - - - OpenGLES\OpenTK\Audio\AudioValueException.cs - - - OpenGLES\OpenTK\Audio\OpenAL\AL\AL.cs - - - OpenGLES\OpenTK\Audio\OpenAL\AL\ALEnums.cs - - - OpenGLES\OpenTK\Audio\OpenAL\AL\EffectsExtension.cs - - - OpenGLES\OpenTK\Audio\OpenAL\AL\EffectsExtensionEnums.cs - - - OpenGLES\OpenTK\Audio\OpenAL\AL\EffectsExtensionPresets.cs - - - OpenGLES\OpenTK\Audio\OpenAL\AL\XRamExtension.cs - - - OpenGLES\OpenTK\Audio\OpenAL\Alc\Alc.cs - - - OpenGLES\OpenTK\Audio\OpenAL\Alc\AlcEnums.cs - - - OpenGLES\OpenTK\AutoGeneratedAttribute.cs - - - OpenGLES\OpenTK\BlittableValueType.cs - - - OpenGLES\OpenTK\Configuration.cs - - - OpenGLES\OpenTK\ContextHandle.cs - - - OpenGLES\OpenTK\DisplayResolution.cs - - - OpenGLES\OpenTK\FrameEventArgs.cs - - - OpenGLES\OpenTK\IGameWindow.cs - - - OpenGLES\OpenTK\INativeWindow.cs - - - OpenGLES\OpenTK\KeyPressEventArgs.cs - - - OpenGLES\OpenTK\Minimal.cs - - - OpenGLES\OpenTK\WindowBorder.cs - - - OpenGLES\OpenTK\WindowState.cs - - - OpenGLES\OpenTK\Graphics\Color4.cs - - - OpenGLES\OpenTK\Graphics\ColorFormat.cs - - - OpenGLES\OpenTK\Graphics\GraphicsContext.cs - - - OpenGLES\OpenTK\Graphics\GraphicsContextException.cs - - - OpenGLES\OpenTK\Graphics\GraphicsContextFlags.cs - - - OpenGLES\OpenTK\Graphics\GraphicsContextMissingException.cs - - - OpenGLES\OpenTK\Graphics\GraphicsMode.cs - - - OpenGLES\OpenTK\Graphics\GraphicsModeException.cs - - - OpenGLES\OpenTK\Graphics\IGraphicsContext.cs - - - OpenGLES\OpenTK\Graphics\IGraphicsMode.cs - - - OpenGLES\OpenTK\Platform\IWindowInfo.cs - - - OpenGLES\OpenTK\Toolkit.cs - - - OpenGLES\OpenTK\Graphics\ES11.iPhone\Helper.cs - - - - - OpenGLES\OpenTK\Platform\iPhoneOS\BindingsBase.iPhone.cs - - - OpenGLES\OpenTK\Platform\iPhoneOS\Factory.iPhone.cs - - - OpenGLES\OpenTK\Platform\iPhoneOS\GraphicsBindingsBase.iPhone.cs - - - OpenGLES\OpenTK\Platform\iPhoneOS\Utilities.iPhone.cs - - - OpenGLES\OpenTK\Platform\iPhoneOS\iPhoneOSGameView.cs - - - OpenGLES\OpenTK\Platform\iPhoneOS\iPhoneOSGraphicsContext.cs - - - OpenGLES\OpenTK\Platform\iPhoneOS\iPhoneOSGraphicsMode.cs - - - OpenGLES\OpenTK\Graphics\ES11.iPhone\Core.cs - - - OpenGLES\OpenTK\Graphics\ES11.iPhone\Delegates.cs - - - OpenGLES\OpenTK\Graphics\ES11.iPhone\ES.Obsolete.cs - - - OpenGLES\OpenTK\Graphics\ES11.iPhone\ES.cs - - - OpenGLES\OpenTK\Graphics\ES11.iPhone\Enums.cs - - - OpenGLES\OpenTK\Graphics\ES20.iPhone\Core.cs - - - OpenGLES\OpenTK\Graphics\ES20.iPhone\Delegates.cs - - - OpenGLES\OpenTK\Graphics\ES20.iPhone\ES.Obsolete.cs - - - OpenGLES\OpenTK\Graphics\ES20.iPhone\ES.cs - - - OpenGLES\OpenTK\Graphics\ES20.iPhone\Enums.cs - - - OpenGLES\OpenTK\Graphics\ES20.iPhone\Helper.cs - - - OpenGLES\OpenTK\Graphics\ES30.iPhone\Core.cs - - - OpenGLES\OpenTK\Graphics\ES30.iPhone\Delegates.cs - - - OpenGLES\OpenTK\Graphics\ES30.iPhone\ES.Obsolete.cs - - - OpenGLES\OpenTK\Graphics\ES30.iPhone\ES.cs - - - OpenGLES\OpenTK\Graphics\ES30.iPhone\Enums.cs - - - OpenGLES\OpenTK\Graphics\ES30.iPhone\Helper.cs - - - System.Drawing\ColorKnownColorTypeForwarders.cs - - - - - - - - diff --git a/src/opentk.mk b/src/opentk.mk deleted file mode 100644 index 293fa73ab85d..000000000000 --- a/src/opentk.mk +++ /dev/null @@ -1,63 +0,0 @@ - -# -# OpenTK[-1.0] -# -IOS_OPENTK_1_0_CORE_SOURCES = \ - $(OPENTK_PATH)/Source/OpenTK/Math/BezierCurve.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/BezierCurveCubic.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/BezierCurveQuadric.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Box2.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Functions.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Half.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/MathHelper.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Matrix2.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Matrix3.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Matrix3d.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Matrix4.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Matrix4d.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Quaternion.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Quaterniond.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector2.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector2d.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector2h.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector3.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector3d.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector3h.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector4.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector4d.cs \ - $(OPENTK_PATH)/Source/OpenTK/Math/Vector4h.cs \ - OpenGLES/OpenTK/Math/Vector2i.cs \ - OpenGLES/OpenTK/Math/Vector3i.cs \ - OpenGLES/OpenTK/Math/Vector4i.cs \ - -# Xamarin.iOS - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/OpenTK-1.0%: $(MACIOS_BINARIES_PATH)/OpenTK/ios/OpenTK-1.0% - $(Q) $(CP) $< $@ - -# Xamarin.TVOS - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/OpenTK-1.0%: $(MACIOS_BINARIES_PATH)/OpenTK/tvos/OpenTK-1.0% - $(Q) $(CP) $< $@ - -# Xamarin.Mac - -$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/%: $(MACIOS_BINARIES_PATH)/OpenTK/macos/lib/% - $(Q) mkdir -p $(dir $@) - $(Q) $(CP) $^ $@ - -MACOS_TARGETS += \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile/OpenTK.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/mobile/OpenTK.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile/OpenTK.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/mobile/OpenTK.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full/OpenTK.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/full/OpenTK.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full/OpenTK.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/64bits/full/OpenTK.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/OpenTK.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/Xamarin.Mac/OpenTK.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/net_4_5/OpenTK.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/reference/net_4_5/OpenTK.pdb \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/OpenTK.dll \ - $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mono/4.5/OpenTK.pdb \ diff --git a/src/packages.config b/src/packages.config deleted file mode 100644 index 59a196a90eb2..000000000000 --- a/src/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/rosetta.pl b/src/rosetta.pl deleted file mode 100644 index 4feeec8db8fd..000000000000 --- a/src/rosetta.pl +++ /dev/null @@ -1,21 +0,0 @@ -print "MonoTouch Rosetta Stone"; - -while (<>){ - print "

Namespace $1

\n" if $_ =~ /namespace(.*){/; - print "

Class $1

\n" if $_ =~ /interface (.*){/; - - if (/Export/){ - ($sel) = $_ =~ /"(.*)"/; - chop; - $a = <>; - chop $a; - $a =~ s/^[ \t]*//; - if ($a =~ /get;|set;/){ - $t = "Property:"; - } else { - $t = "Method:"; - } - print "\t
Selector: $sel\t
\n\t$t $a
\n"; - } -} -print ""; diff --git a/src/touch-unit.sources b/src/touch-unit.sources deleted file mode 100644 index e6fbbbb5c5f8..000000000000 --- a/src/touch-unit.sources +++ /dev/null @@ -1,299 +0,0 @@ -NUNITLITE_SOURCES = \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/AssemblyInfo.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Assert.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/AssertionHelper.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Assume.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Contains.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Env.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/GlobalSettings.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Guard.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Has.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/IExpectException.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Is.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Iz.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/ListMapper.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/MessageMatch.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/ObjectList.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/SpecialValue.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/TestCaseData.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/TestContext.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Throws.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ExpectedExceptionData.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/IParameterDataSource.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/IPropertyBag.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITest.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestAssemblyBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestAssemblyRunner.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestCaseData.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestCaseSource.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestCaseSourceProvider.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestListener.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ITestResult.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/IXmlNodeBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/PropertyEntry.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/ResultState.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/RunState.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/TestOutput.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/TestStatus.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Api/XmlNode.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/CategoryAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/CombinatorialAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/CultureAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/DataAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/DatapointAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/DatapointSourceAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/DatapointsAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/DescriptionAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/ExpectedExceptionAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/ExplicitAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/IgnoreAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/IncludeExcludeAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/MaxTimeAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/NUnitAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/PairwiseAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/PlatformAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/PropertyAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/RandomAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/RangeAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/RepeatAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/SequentialAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/SetCultureAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/SetUICultureAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/SetUpAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TearDownAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TestAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TestCaseAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TestCaseSourceAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TestFixtureAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TestFixtureSetUpAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TestFixtureTearDownAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TheoryAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/TimeoutAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/ValueSourceAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Attributes/ValuesAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/AllItemsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/AndConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/AssignableFromConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/AssignableToConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/AttributeConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/AttributeExistsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/BasicConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/BinaryConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/BinarySerializableConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/CollectionConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/CollectionContainsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/CollectionEquivalentConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/CollectionItemsEqualConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/CollectionOrderedConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/CollectionSubsetConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/CollectionTally.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ComparisonAdapter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ComparisonConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Constraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ConstraintBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ConstraintExpression.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ConstraintExpressionBase.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ConstraintFactory.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ContainsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/DelayedConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/EmptyCollectionConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/EmptyConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/EmptyDirectoryConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/EmptyStringConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/EndsWithConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/EqualConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/EqualityAdapter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ExactCountConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ExactTypeConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ExceptionTypeConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/FalseConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/FloatingPointNumerics.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/GreaterThanConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/GreaterThanOrEqualConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/IResolveConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/InstanceOfTypeConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/LessThanConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/LessThanOrEqualConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/MessageWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/MsgUtils.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/NUnitComparer.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/NUnitEqualityComparer.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/NaNConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/NoItemConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/NotConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/NullConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/NullOrEmptyStringConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Numerics.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/OrConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/PathConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/PredicateConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/PrefixConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/PropertyConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/PropertyExistsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/RangeConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/RegexConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ResolvableConstraintExpression.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ReusableConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/SameAsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/SamePathConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/SamePathOrUnderConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/SomeItemsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/StartsWithConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/StringConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/SubstringConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ThrowsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ThrowsNothingConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Tolerance.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/ToleranceMode.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/TrueConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/TypeConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/UniqueItemsConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/XmlSerializableConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/AndOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/AttributeOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/BinaryOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/CollectionOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/ConstraintOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/ExactCountOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/NotOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/OrOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/PrefixOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/PropOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/SelfResolvingOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/ThrowsOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/WithOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Exceptions/AssertionException.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Exceptions/IgnoreException.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Exceptions/InconclusiveException.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Exceptions/SuccessException.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Extensibility/IParameterDataProvider.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Extensibility/ISuiteBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Extensibility/ITestCaseBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Extensibility/ITestCaseProvider.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/FinallyDelegate.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/AssemblyHelper.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/CultureDetector.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/ExceptionHelper.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/IApplyToContext.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/IApplyToTest.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/InvalidTestFixtureException.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/MethodHelper.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/NUnitException.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/NUnitLiteTestAssemblyBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/NUnitLiteTestAssemblyRunner.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/OSPlatform.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/ParameterSet.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/PlatformHelper.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/PropertyBag.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/PropertyNames.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Randomizer.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Reflect.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/RuntimeFramework.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/StackFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/TestExecutionContext.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/TestFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/TestFixtureBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/TestListener.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/TextMessageWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/ThreadUtility.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/TypeHelper.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/CombinatorialStrategy.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/CombinatorialTestCaseProvider.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/CombiningStrategy.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/DataAttributeTestCaseProvider.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/DatapointProvider.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/NUnitTestCaseBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/NUnitTestFixtureBuilder.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/PairwiseStrategy.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/ParameterDataProvider.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/ProviderCache.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Builders/SequentialStrategy.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/ApplyChangesToContextCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/CommandDecoratorList.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/CommandStage.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/DelegatingTestCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/ExpectedExceptionCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/ICommandDecorator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/MaxTimeCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/RepeatedTestCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/SetUpTearDownCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/SkipCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/TestCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/TestMethodCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Extensibility/ParameterDataProviders.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Extensibility/TestCaseProviders.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Filters/AndFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Filters/CategoryExpression.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Filters/CategoryFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Filters/NotFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Filters/OrFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Filters/SimpleNameFilter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Results/TestCaseResult.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Results/TestResult.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Results/TestSuiteResult.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Tests/ParameterizedFixtureSuite.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Tests/ParameterizedMethodSuite.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Tests/Test.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Tests/TestAssembly.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Tests/TestFixture.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Tests/TestMethod.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Tests/TestSuite.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CompositeWorkItem.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CountdownEvent.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/SimpleWorkItem.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItemState.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/CommandLineOptions.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/ConsoleWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/DebugWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/ResultSummary.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/TcpWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/OutputWriters/NUnit2XmlOutputWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/OutputWriters/NUnit3XmlOutputWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/OutputWriters/OutputWriter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/AllOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/NoneOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/Operators/SomeOperator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/FailurePoint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Constraints/SubPathConstraint.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Compatibility/SerializableAttribute.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Runner/ResultReporter.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/AsyncInvocationRegion.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/AsyncSynchronizationContext.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/RandomGenerator.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/StringUtil.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/FlakyTestRetriesCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/OneTimeSetUpCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/OneTimeTearDownCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/TheoryResultCommand.cs \ - $(MONO_IOS_SDK_DESTDIR)/ios-sources/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Filters/SimpleCategoryExpression.cs \ - -IOS_TOUCHUNIT_SOURCES = \ - $(NUNITLITE_SOURCES) \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/HttpTextWriter.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/Options.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/NUnitOutputTextWriter.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TestCaseElement.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TestElement.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TestSuiteElement.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TouchRunner.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TouchViewController.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TcpTextWriter.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TouchOptions.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TestRocks.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TestResultElement.cs \ - -TVOS_TOUCHUNIT_SOURCES = \ - $(IOS_TOUCHUNIT_SOURCES) \ - - -WATCHOS_TOUCHUNIT_SOURCES = \ - $(NUNITLITE_SOURCES) \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/HttpTextWriter.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/Options.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/NUnitOutputTextWriter.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TouchRunner.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TcpTextWriter.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TouchOptions.cs \ - $(TOUCH_UNIT_PATH)/NUnitLite/TouchRunner/TestRocks.cs \ diff --git a/src/xamios.tmpl.csproj b/src/xamios.tmpl.csproj deleted file mode 100644 index 00ed0609ff1d..000000000000 --- a/src/xamios.tmpl.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - Xamarin.iOS - true - ..\product.snk - build\IDE\obj\iOS\$(Configuration) - latest - - - true - full - false - build\IDE\bin\iOS\Debug - IPHONE;IOS;MINIMAL;MONOTOUCH - prompt - 4 - false - true - True - 3021,3014,3003 - - - none - false - build\IDE\bin\iOS\Release - IPHONE;IOS;MINIMAL;MONOTOUCH - prompt - 4 - false - true - - - - - - - - - - - build\ios\native\%(RecursiveDir)%(Filename).cs - - - - - - diff --git a/src/xammac.pc.in b/src/xammac.pc.in deleted file mode 100644 index 04dfc44e23a9..000000000000 --- a/src/xammac.pc.in +++ /dev/null @@ -1,9 +0,0 @@ -prefix=${pcfiledir}/../.. -exec_prefix=${prefix} -libdir=${exec_prefix}/lib/mono -GacPackage=false - -Name: Xamarin.Mac -Description: Xamarin.Mac -Version: @PACKAGE_VERSION@ -Libs: -r:${libdir}/XamMac.dll diff --git a/src/xammac.tmpl.csproj b/src/xammac.tmpl.csproj deleted file mode 100644 index 0887b24c5441..000000000000 --- a/src/xammac.tmpl.csproj +++ /dev/null @@ -1,53 +0,0 @@ - - - - Debug - AnyCPU - {87042AD2-CDC9-4A53-9193-56226B668B88} - {A3F8F2AB-B479-4A4A-A458-A89E7DC349F1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - Xamarin.Mac - v2.0 - Xamarin.Mac - true - ..\product.snk - build\IDE\obj\macOS-mobile\$(Configuration) - latest - - - true - full - false - build\IDE\bin\macOS-mobile\Debug - DEBUG;MONOMAC;NO_SYSTEM_DRAWING - prompt - 4 - false - true - - - full - true - build\IDE\bin\macOS-mobile\Release - MONOMAC;NO_SYSTEM_DRAWING - prompt - 4 - false - true - - - - - - - - - - build\mac\mobile\%(RecursiveDir)%(Filename).cs - - - - - - diff --git a/src/xammaccatalyst.tmpl.csproj b/src/xammaccatalyst.tmpl.csproj deleted file mode 100644 index a1d610867f5d..000000000000 --- a/src/xammaccatalyst.tmpl.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - Xamarin.MacCatalyst - true - ..\product.snk - build\IDE\obj\MacCatalyst\$(Configuration) - latest - - - true - full - false - build\IDE\bin\MacCatalyst\Debug - IPHONE;MACCATALYST;MINIMAL;MONOTOUCH - prompt - 4 - false - true - True - 3021,3014,3003 - - - none - false - build\IDE\bin\MacCatalyst\Release - IPHONE;MACCATALYST;MINIMAL;MONOTOUCH - prompt - 4 - false - true - - - - - - - - - - - build\maccatalyst\native\%(RecursiveDir)%(Filename).cs - - - - - - diff --git a/src/xamtvos.tmpl.csproj b/src/xamtvos.tmpl.csproj deleted file mode 100644 index be995872e0f3..000000000000 --- a/src/xamtvos.tmpl.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {072C1DD1-7566-4387-B9EC-466891558ACC} - {06FA79CB-D6CD-4721-BB4B-1BD202089C55};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - Xamarin.TVOS - true - ..\product.snk - build\IDE\obj\tvOS\$(Configuration) - latest - - - true - full - false - build\IDE\bin\tvOS\Debug - MONOTOUCH;IPHONE;TVOS;XAMCORE_3_0 - prompt - 4 - false - true - True - 3021,3014,3003 - - - none - false - build\IDE\bin\tvOS\Release - MONOTOUCH;TVOS - prompt - 4 - false - true - - - - - - - - - - - build\tvos\tvos\%(RecursiveDir)%(Filename).cs - - - - - - diff --git a/src/xamwatch.tmpl.csproj b/src/xamwatch.tmpl.csproj deleted file mode 100644 index 1f6b12d370f4..000000000000 --- a/src/xamwatch.tmpl.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {B84C539D-971D-4703-8ABC-E1077FDA651C} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - - Xamarin.WatchOS - true - ..\product.snk - build\IDE\obj\watchOS\$(Configuration) - latest - - - true - full - false - build\IDE\bin\watchOS\Debug - MONOTOUCH;WATCH;XAMCORE_3_0 - prompt - 4 - false - true - True - 3021,3014,3003 - - - none - false - build\IDE\bin\watchOS\Release - MONOTOUCH;WATCH;XAMCORE_3_0 - prompt - 4 - false - true - - - - - - - - - - - build\watch\watch\%(RecursiveDir)%(Filename).cs - - - - - - diff --git a/tools/common/Make.common b/tools/common/Make.common index 838256b0934d..530d21d7e4cd 100644 --- a/tools/common/Make.common +++ b/tools/common/Make.common @@ -1,6 +1,6 @@ # We check in SdkVersions.cs so that it's easier to use this file when building tests on Windows. -../common/SdkVersions.cs: ../common/SdkVersions.in.cs Makefile $(TOP)/Make.config $(TOP)/Make.versions +$(abspath ../common/SdkVersions.cs): ../common/SdkVersions.in.cs Makefile $(TOP)/Make.config $(TOP)/Make.versions $(Q_GEN) sed \ -e 's/@IOS_SDK_VERSION@/$(IOS_SDK_VERSION)/g' -e 's/@WATCHOS_SDK_VERSION@/$(WATCH_SDK_VERSION)/' -e 's/@TVOS_SDK_VERSION@/$(TVOS_SDK_VERSION)/' -e 's/@MACOS_SDK_VERSION@/$(MACOS_SDK_VERSION)/' \ -e 's/@MACCATALYST_SDK_VERSION@/$(MACCATALYST_SDK_VERSION)/g' \ @@ -63,7 +63,7 @@ $(Q) if ! diff $@ $@.tmp >/dev/null; then $(CP) $@.tmp $@; git diff "$@"; echo "The file $(TOP)/tools/common/SdkVersions.cs has been automatically re-generated; please commit the changes."; exit 1; fi $(Q) touch $@ -../common/ProductConstants.cs: ../common/ProductConstants.in.cs Makefile $(TOP)/Make.config $(GIT_DIRECTORY)/index +$(abspath ../common/ProductConstants.cs): ../common/ProductConstants.in.cs Makefile $(TOP)/Make.config $(GIT_DIRECTORY)/index $(Q_GEN) sed \ -e "s/@IOS_VERSION@/$(IOS_PACKAGE_VERSION_MAJOR).$(IOS_PACKAGE_VERSION_MINOR).$(IOS_PACKAGE_VERSION_REV)/g" \ -e "s/@TVOS_VERSION@/$(IOS_PACKAGE_VERSION_MAJOR).$(IOS_PACKAGE_VERSION_MINOR).$(IOS_PACKAGE_VERSION_REV)/g" \ diff --git a/tools/common/ProjectInspector.csproj b/tools/common/ProjectInspector.csproj index 4dfa51eabbc8..0d6674088a90 100644 --- a/tools/common/ProjectInspector.csproj +++ b/tools/common/ProjectInspector.csproj @@ -23,7 +23,7 @@ diff --git a/tools/devops/automation/templates/tests/run-tests.yml b/tools/devops/automation/templates/tests/run-tests.yml index f625ab48d289..9f5943d59514 100644 --- a/tools/devops/automation/templates/tests/run-tests.yml +++ b/tools/devops/automation/templates/tests/run-tests.yml @@ -108,15 +108,6 @@ steps: env: MACIOS_UPLOAD_PREFIX: ${{ parameters.uploadPrefix }} -- bash: | - set -x - set -e - - make -C src build/ios.rsp - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-macios - displayName: Generate rsp files - timeoutInMinutes: 30 - - bash: | set -x set -e diff --git a/tools/mmp/mmp.csproj b/tools/mmp/mmp.csproj index c8522084c3b8..46ac1152a2a9 100644 --- a/tools/mmp/mmp.csproj +++ b/tools/mmp/mmp.csproj @@ -318,8 +318,8 @@ tools\linker\MonoTouch.Tuner\PreserveSmartEnumConversions.cs - - src\build\mac\Constants.cs + + src\build\dotnet\macos\Constants.cs src\ObjCRuntime\Constants.cs diff --git a/tools/mtouch/Makefile b/tools/mtouch/Makefile index b09ac77dff9a..6e63837bae44 100644 --- a/tools/mtouch/Makefile +++ b/tools/mtouch/Makefile @@ -238,7 +238,7 @@ mtouch.csproj.inc: export BUILD_VERBOSITY=$(MSBUILD_VERBOSITY) $(MTOUCH_DIR)/mtouch.exe: $(mtouch_dependencies) $(Q_GEN) $(SYSTEM_MSBUILD) mtouch.csproj /r $(XBUILD_VERBOSITY) /p:Configuration=$(MTOUCH_CONF) -Constants.cs: Constants.cs.in Makefile $(TOP)/Make.config.inc +$(abspath Constants.cs): Constants.cs.in Makefile $(TOP)/Make.config.inc $(Q_GEN) sed \ -e "s/@VERSION@/$(IOS_PACKAGE_VERSION_MAJOR).$(IOS_PACKAGE_VERSION_MINOR).$(IOS_PACKAGE_VERSION_REV)/g" \ -e 's/@REVISION@/$(IOS_COMMIT_DISTANCE) ($(CURRENT_BRANCH_SED_ESCAPED): $(CURRENT_HASH))/g' \ From 9daafdae64d372f150769a57d4e8ac3853e99292 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 14:21:42 +0200 Subject: [PATCH 046/155] [builds] Remove all legacy logic. (#21307) We still need some of the source files from the legacy Mono library, but it's only a few files, so just add them to the git repo. Also implement caching of the .NET download, which speeds up clean rebuilds significantly. Note: all the files in the `builds/mono-ios-sdk-destdir` are a straight import from the Mono archive, so those shouldn't need much reviewing (nor will I change them unless absolutely necessary). --- Make.config | 17 +- builds/.gitignore | 28 - builds/Makefile | 85 +- builds/Mono.framework-Info.plist | 58 - builds/Mono.framework-tvos.Info.plist | 56 - builds/Mono.framework-watchos.Info.plist | 56 - builds/mac-System.config | 3 - .../src/linker/Linker.Steps/BaseStep.cs | 83 + .../src/linker/Linker.Steps/BlacklistStep.cs | 146 + .../src/linker/Linker.Steps/CleanStep.cs | 106 + .../linker/src/linker/Linker.Steps/IStep.cs | 34 + .../linker/Linker.Steps/LoadI18nAssemblies.cs | 103 + .../linker/Linker.Steps/LoadReferencesStep.cs | 61 + .../src/linker/Linker.Steps/MarkStep.cs | 3350 +++++++++++++++++ .../src/linker/Linker.Steps/OutputStep.cs | 301 ++ .../PreserveDependencyLookupStep.cs | 99 + .../linker/Linker.Steps/RegenerateGuidStep.cs | 48 + .../Linker.Steps/ResolveFromAssemblyStep.cs | 249 ++ .../Linker.Steps/ResolveFromXApiStep.cs | 138 + .../linker/Linker.Steps/ResolveFromXmlStep.cs | 727 ++++ .../src/linker/Linker.Steps/ResolveStep.cs | 56 + .../src/linker/Linker.Steps/SweepStep.cs | 714 ++++ .../src/linker/Linker.Steps/TypeMapStep.cs | 371 ++ .../linker/src/linker/Linker/Annotations.cs | 464 +++ .../src/linker/Linker/AssemblyAction.cs | 55 + .../src/linker/Linker/AssemblyResolver.cs | 157 + .../src/linker/Linker/AssemblyUtilities.cs | 16 + .../external/linker/src/linker/Linker/BCL.cs | 84 + .../linker/src/linker/Linker/ConsoleLogger.cs | 9 + .../src/linker/Linker/I18nAssemblies.cs | 47 + .../src/linker/Linker/IDependencyRecorder.cs | 42 + .../linker/src/linker/Linker/ILogger.cs | 12 + .../Linker/IReflectionPatternRecorder.cs | 60 + .../linker/src/linker/Linker/IXApiVisitor.cs | 47 + .../linker/src/linker/Linker/Inflater.cs | 101 + .../linker/src/linker/Linker/KnownMembers.cs | 29 + .../linker/src/linker/Linker/LinkContext.cs | 461 +++ .../linker/src/linker/Linker/LoadException.cs | 15 + .../LoggingReflectionPatternRecorder.cs | 47 + .../linker/src/linker/Linker/MarkException.cs | 25 + .../src/linker/Linker/MarkingHelpers.cs | 20 + .../linker/src/linker/Linker/MethodAction.cs | 38 + .../src/linker/Linker/MethodBodyScanner.cs | 165 + .../Linker/MethodDefinitionExtensions.cs | 95 + .../Linker/MethodReferenceExtensions.cs | 26 + .../src/linker/Linker/OutputException.cs | 15 + .../src/linker/Linker/OverrideInformation.cs | 39 + .../linker/src/linker/Linker/Pipeline.cs | 152 + .../linker/src/linker/Linker/Tracer.cs | 113 + .../linker/Linker/TypeDefinitionExtensions.cs | 44 + .../src/linker/Linker/TypeNameParser.cs | 49 + .../linker/src/linker/Linker/TypePreserve.cs | 37 + .../linker/Linker/TypeReferenceExtensions.cs | 239 ++ .../linker/src/linker/Linker/XApiReader.cs | 384 ++ .../linker/Linker/XmlDependencyRecorder.cs | 213 ++ .../Mono.Tuner/ApplyPreserveAttributeBase.cs | 164 + .../linker/src/tuner/Mono.Tuner/CecilRocks.cs | 519 +++ .../src/tuner/Mono.Tuner/CustomizeActions.cs | 93 + .../linker/src/tuner/Mono.Tuner/Dispatcher.cs | 310 ++ .../linker/src/tuner/Mono.Tuner/Extensions.cs | 36 + .../src/tuner/Mono.Tuner/FixModuleFlags.cs | 20 + .../src/tuner/Mono.Tuner/PreserveCrypto.cs | 122 + .../Mono.Tuner/PreserveSoapHttpClients.cs | 90 + .../linker/src/tuner/Mono.Tuner/Profile.cs | 78 + .../tuner/Mono.Tuner/RemoveAttributesBase.cs | 103 + .../src/tuner/Mono.Tuner/RemoveResources.cs | 63 + .../src/tuner/Mono.Tuner/RemoveSecurity.cs | 50 + .../src/tuner/Mono.Tuner/TunerAnnotations.cs | 55 + builds/mono-wrapper.in | 7 - tests/Makefile | 4 +- tests/xharness/Harness.cs | 2 - tests/xharness/IHarness.cs | 1 - .../scripts/bash/export-mono-filenames.sh | 27 - .../automation/templates/build/build.yml | 14 - .../automation/templates/tests/run-tests.yml | 2 - 75 files changed, 11603 insertions(+), 346 deletions(-) delete mode 100644 builds/Mono.framework-Info.plist delete mode 100644 builds/Mono.framework-tvos.Info.plist delete mode 100644 builds/Mono.framework-watchos.Info.plist delete mode 100644 builds/mac-System.config create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BaseStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BlacklistStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/CleanStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/IStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadI18nAssemblies.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadReferencesStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/MarkStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/OutputStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/PreserveDependencyLookupStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/RegenerateGuidStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromAssemblyStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXApiStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXmlStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/SweepStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/TypeMapStep.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Annotations.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyAction.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyResolver.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyUtilities.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/BCL.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ConsoleLogger.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/I18nAssemblies.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IDependencyRecorder.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ILogger.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IReflectionPatternRecorder.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IXApiVisitor.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Inflater.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/KnownMembers.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LinkContext.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoadException.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoggingReflectionPatternRecorder.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkException.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkingHelpers.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodAction.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodBodyScanner.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodDefinitionExtensions.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodReferenceExtensions.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OutputException.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OverrideInformation.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Pipeline.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Tracer.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeDefinitionExtensions.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeNameParser.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypePreserve.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeReferenceExtensions.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XApiReader.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XmlDependencyRecorder.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/ApplyPreserveAttributeBase.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CecilRocks.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CustomizeActions.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Dispatcher.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Extensions.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/FixModuleFlags.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveCrypto.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveSoapHttpClients.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Profile.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveAttributesBase.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveResources.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveSecurity.cs create mode 100644 builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/TunerAnnotations.cs delete mode 100644 builds/mono-wrapper.in delete mode 100755 tools/devops/automation/scripts/bash/export-mono-filenames.sh diff --git a/Make.config b/Make.config index f43673443b79..c01ca83b4a83 100644 --- a/Make.config +++ b/Make.config @@ -637,22 +637,7 @@ JENKINS_RESULTS_DIRECTORY ?= $(abspath $(TOP)/jenkins-results) # Clone files instead of copying them on APFS file systems. Much faster. CP:=$(shell df -t apfs / >/dev/null 2>&1 && echo "cp -c" || echo "cp") -# WORKAROUND, Ideally it should be xcode-$(XCODE_PRODUCT_BUILD_VERSION) but mono does not build binaries for each xcode release -# Xcode 12.4 Build 12D4e -XCODE_IOS_ARCHIVE_VERSION=xcode-12D4e -# Xcode 12.4 Build 12D4e -XCODE_MACOS_ARCHIVE_VERSION=xcode-12D4e -MONO_IOS_FILENAME:=ios-release-Darwin-$(MONO_HASH).7z -MONO_IOS_URL:=https://download.mono-project.com/mono-sdks/$(XCODE_IOS_ARCHIVE_VERSION)/$(MONO_IOS_FILENAME) - -# Setup various variables depending on whether mono is downloaded or built from source -ifeq ($(MONO_BUILD_FROM_SOURCE),) -MONO_IOS_SDK_DESTDIR:=$(abspath $(TOP)/builds/downloads/$(basename $(MONO_IOS_FILENAME))) -MONO_BUILD_MODE=download-mono -else -MONO_IOS_SDK_DESTDIR:=$(abspath $(MONO_PATH)/sdks/out) -MONO_BUILD_MODE=compile-mono -endif +MONO_IOS_SDK_DESTDIR:=$(abspath $(TOP)/builds/downloads/mono-ios-sdk-destdir) # This variable includes all the platforms we support, even those that might be disabled in this build. ALL_PLATFORMS=iOS tvOS watchOS macOS diff --git a/builds/.gitignore b/builds/.gitignore index dad605eee05e..e258969d6dcd 100644 --- a/builds/.gitignore +++ b/builds/.gitignore @@ -3,31 +3,3 @@ dotnet-install.sh BundledNETCorePlatformsPackageVersion.txt downloads .stamp* -.deps.*.mk -*.config.cache -install -mac32 -mac64 -llvm -llvm64 -simulator86 -simulator64 -watchsimulator -tvsimulator -tools64 -cross -cross64 -crosstv -cross-watch -target7 -target7s -target64 -targettv -targetwatch -watchbcl -mono-ios-sdk-destdir -*.dylib -*.o -x86-64-slice* -*.pkg - diff --git a/builds/Makefile b/builds/Makefile index 31d213946add..bfe48c600615 100644 --- a/builds/Makefile +++ b/builds/Makefile @@ -12,68 +12,22 @@ else DOTNET_ARCH=x64 endif -## -## Mono download vs. build -## - -download: download-mono -download-mono: \ - downloads/$(basename $(MONO_IOS_FILENAME)) \ - -downloads/$(basename $(MONO_IOS_FILENAME)): MONO_URL=$(MONO_IOS_URL) - include $(TOP)/mk/colors.mk -DOWNLOADS = \ - downloads/$(MONO_IOS_FILENAME) \ - -# This target downloads the mono archives, there's one for Xamarin.iOS and one for Xamarin.Mac. -# If doing many clean builds, it's possible to copy the downloaded zip file to ~/Library/Caches/xamarin-macios -# to avoid having to download it every time. The zip files have to be copied manually, otherwise -# we'd end up filling up a lot of hard drives around the world. -$(DOWNLOADS): - $(Q) mkdir -p downloads - $(Q) echo "Downloading $(MONO_URL)..." - $(Q) if test -f ~/Library/Caches/xamarin-macios/$(notdir $@); then \ - echo "Found a cached version of $(MONO_URL) in ~/Library/Caches/xamarin-macios/$(notdir $@)."; \ - $(CP) ~/Library/Caches/xamarin-macios/$(notdir $@) $@.tmp; \ - else \ - EC=0; \ - $(CURL_RETRY) $(MONO_URL) --output $@.tmp || EC=$$?; \ - if [[ x$$EC == x22 ]]; then \ - MSG="Could not download the archive %s because the URL doesn't exist. This can happen if bumping mono very soon after the corresponding commit was pushed to mono (i.e. the archive hasn't been built yet). If so, please wait a bit and try again."; \ - printf "$(COLOR_RED)*** $$MSG$(COLOR_CLEAR)\n" "$(notdir $@)"; \ - if test -n "$$FAILURE_REASON_PATH"; then printf "$$MSG\n" "[$(notdir $@)]($(MONO_URL))" >> "$$FAILURE_REASON_PATH"; fi; \ - fi; \ - if [[ x$$EC != x0 ]]; then exit $$EC; fi; \ - if [[ "x$$MACIOS_CACHE_DOWNLOADS" != "x" ]]; then \ - mkdir -p ~/Library/Caches/xamarin-macios/; \ - $(CP) $@.tmp ~/Library/Caches/xamarin-macios/"$(notdir $@)"; \ - echo "Cached the download of $(notdir $@) in ~/Library/Caches/xamarin-macios"; \ - fi; \ - fi - $(Q) mv $@.tmp $@ - $(Q) echo "Downloaded $(MONO_URL)" - -downloads/%: downloads/%.7z - $(Q) echo "Unzipping $*..." - $(Q) rm -Rf $@.tmp - $(Q) 7z x $< -o$@.tmp - $(Q) find $@.tmp -exec touch {} + - $(Q) mv $@.tmp $@ - $(Q) echo "Unzipped $*." - -downloads/%: downloads/%.nupkg - $(Q) echo "Unzipping $*..." - $(Q) rm -Rf $@.tmp - $(Q) unzip -d $@.tmp $< - $(Q) find $@.tmp -exec touch {} + - $(Q) mv $@.tmp $@ - $(Q) echo "Unzipped $*." +DOTNET_FILENAME=$(DOTNET_VERSION).tar.gz +DOTNET_CACHE_FILENAME=$(HOME)/Library/Caches/xamarin-macios/$(DOTNET_FILENAME) downloads/$(DOTNET_INSTALL_NAME): dotnet-install.sh $(Q) echo "Downloading and installing .NET $(DOTNET_VERSION) ($(DOTNET_ARCH)) into $@..." - $(Q) ./dotnet-install.sh --install-dir "$@.tmp" --version "$(DOTNET_VERSION)" --architecture $(DOTNET_ARCH) --no-path $$DOTNET_INSTALL_EXTRA_ARGS + $(Q) if test -f $(DOTNET_CACHE_FILENAME); then \ + echo "Found a cached version of .NET $(DOTNET_VERSION) in $(DOTNET_CACHE_FILENAME)."; \ + mkdir -p "$@.tmp"; \ + tar -xzf $(DOTNET_CACHE_FILENAME) -C "$@.tmp"; \ + else \ + ./dotnet-install.sh --install-dir "$@.tmp" --version "$(DOTNET_VERSION)" --architecture $(DOTNET_ARCH) --no-path --keep-zip --zip-path "downloads/$(DOTNET_FILENAME)" $$DOTNET_INSTALL_EXTRA_ARGS; \ + cp -c downloads/$(DOTNET_FILENAME) $(DOTNET_CACHE_FILENAME); \ + echo "Cached the download of $(DOTNET_FILENAME) in ~/Library/Caches/xamarin-macios"; \ + fi $(Q) rm -Rf "$@" $(Q) mv "$@.tmp" "$@" $(Q) echo "Downloaded and installed .NET $(DOTNET_VERSION) into $@." @@ -108,10 +62,6 @@ dotnet-install.sh: Makefile $(Q) chmod +x $@.tmp $(Q) mv $@.tmp $@ -.stamp-download-mono: $(TOP)/Make.config $(TOP)/mk/mono.mk - $(MAKE) download-mono - $(Q) touch $@ - ifdef CUSTOM_DOTNET DOWNLOAD_DOTNET_VERSION=$(CUSTOM_DOTNET_VERSION) else @@ -170,17 +120,7 @@ dotnet:: $(DOTNET_DOWNLOADS) all-local:: $(DOTNET_DOWNLOADS) clean-local:: - $(Q) rm -Rf downloads .stamp-download-mono - -all-local:: .stamp-mono-ios-sdk-destdir - -.stamp-mono-ios-sdk-destdir: .stamp-$(MONO_BUILD_MODE) - ln -sf $(MONO_IOS_SDK_DESTDIR) mono-ios-sdk-destdir - $(Q) touch $@ - -# -# .NET -# + $(Q) rm -Rf downloads DOTNET_COMMON_DIRECTORIES += \ $(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(DOTNET_DESTDIR)/$($(platform)_NUGET_SDK_NAME)) \ @@ -214,4 +154,3 @@ $(DOTNET_COMMON_DIRECTORIES): install-dotnet: $(DOTNET_COMMON_TARGETS) install-local:: install-dotnet all-local:: install-dotnet - diff --git a/builds/Mono.framework-Info.plist b/builds/Mono.framework-Info.plist deleted file mode 100644 index 216a744ca55b..000000000000 --- a/builds/Mono.framework-Info.plist +++ /dev/null @@ -1,58 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.ios.mono-framework - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Mono - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - Mono - - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - iPhoneOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - iphoneos - DTPlatformVersion - 8.2 - DTSDKBuild - 12D508 - DTSDKName - iphoneos8.2 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 12.2 - UIDeviceFamily - - 1 - 2 - - - diff --git a/builds/Mono.framework-tvos.Info.plist b/builds/Mono.framework-tvos.Info.plist deleted file mode 100644 index c0db855ee5ab..000000000000 --- a/builds/Mono.framework-tvos.Info.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.tvos.mono-framework - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Mono - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - Mono - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - AppleTVOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - appletvos - DTPlatformVersion - 9.0 - DTSDKBuild - 12D508 - DTSDKName - appletvos9.0 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 12.2 - UIDeviceFamily - - 3 - - - diff --git a/builds/Mono.framework-watchos.Info.plist b/builds/Mono.framework-watchos.Info.plist deleted file mode 100644 index d49a2c154e7f..000000000000 --- a/builds/Mono.framework-watchos.Info.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.watchos.mono-framework - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Mono - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - Mono - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - WatchOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - watchos - DTPlatformVersion - 2.0 - DTSDKBuild - 12D508 - DTSDKName - watchos2.2 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 4.0 - UIDeviceFamily - - 4 - - - diff --git a/builds/mac-System.config b/builds/mac-System.config deleted file mode 100644 index ebb9b2987fd1..000000000000 --- a/builds/mac-System.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BaseStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BaseStep.cs new file mode 100644 index 000000000000..39210adc9eeb --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BaseStep.cs @@ -0,0 +1,83 @@ +// +// BaseStep.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public abstract class BaseStep : IStep { + + private LinkContext _context; + + public LinkContext Context { + get { return _context; } + } + + public AnnotationStore Annotations { + get { return _context.Annotations; } + } + + public Tracer Tracer { + get { return _context.Tracer; } + } + + public MarkingHelpers MarkingHelpers => _context.MarkingHelpers; + + public void Process (LinkContext context) + { + _context = context; + + if (!ConditionToProcess ()) + return; + + Process (); + + foreach (AssemblyDefinition assembly in context.GetAssemblies ()) + ProcessAssembly (assembly); + + EndProcess (); + } + + protected virtual bool ConditionToProcess () + { + return true; + } + + protected virtual void Process () + { + } + + protected virtual void EndProcess () + { + } + + protected virtual void ProcessAssembly (AssemblyDefinition assembly) + { + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BlacklistStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BlacklistStep.cs new file mode 100644 index 000000000000..6448374c6f06 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/BlacklistStep.cs @@ -0,0 +1,146 @@ +// +// Blacklist.cs +// +// Author: +// Jb Evain (jb@nurv.fr) +// +// (C) 2007 Novell Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Linq; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.XPath; + +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class BlacklistStep : BaseStep { + + protected override void Process () + { + foreach (string name in Assembly.GetExecutingAssembly ().GetManifestResourceNames ()) { + if (!name.EndsWith (".xml", StringComparison.OrdinalIgnoreCase) || !ShouldProcessAssemblyResource (GetAssemblyName (name))) + continue; + + try { + Context.LogMessage ($"Processing resource linker descriptor: {name}"); + AddToPipeline (GetResolveStep (name)); + } catch (XmlException ex) { + /* This could happen if some broken XML file is included. */ + Context.LogMessage ($"Error processing {name}: {ex}"); + } + } + + foreach (var asm in Context.GetAssemblies ()) { + foreach (var rsc in asm.Modules + .SelectMany (mod => mod.Resources) + .Where (res => res.ResourceType == ResourceType.Embedded) + .Where (res => res.Name.EndsWith (".xml", StringComparison.OrdinalIgnoreCase)) + .Where (res => ShouldProcessAssemblyResource (GetAssemblyName (res.Name))) + .Cast ()) { + try { + Context.LogMessage ($"Processing embedded resource linker descriptor: {rsc.Name}"); + + AddToPipeline (GetExternalResolveStep (rsc, asm)); + } catch (XmlException ex) { + /* This could happen if some broken XML file is embedded. */ + Context.LogMessage ($"Error processing {rsc.Name}: {ex}"); + } + } + } + } + + static string GetAssemblyName (string descriptor) + { + int pos = descriptor.LastIndexOf ('.'); + if (pos == -1) + return descriptor; + + return descriptor.Substring (0, pos); + } + + bool ShouldProcessAssemblyResource (string name) + { + AssemblyDefinition assembly = GetAssemblyIfReferenced (name); + + if (assembly is null) + return false; + + switch (Annotations.GetAction (assembly)) { + case AssemblyAction.Link: + case AssemblyAction.AddBypassNGen: + case AssemblyAction.AddBypassNGenUsed: + case AssemblyAction.Copy: + return true; + default: + return false; + } + } + + AssemblyDefinition GetAssemblyIfReferenced (string name) + { + foreach (AssemblyDefinition assembly in Context.GetAssemblies ()) + if (assembly.Name.Name == name) + return assembly; + + return null; + } + + protected virtual void AddToPipeline (IStep resolveStep) + { + Context.Pipeline.AddStepAfter (typeof (BlacklistStep), resolveStep); + } + + protected virtual IStep GetExternalResolveStep (EmbeddedResource resource, AssemblyDefinition assembly) + { + return new ResolveFromXmlStep (GetExternalDescriptor (resource), resource.Name, assembly, "resource " + resource.Name + " in " + assembly.FullName); + } + + static ResolveFromXmlStep GetResolveStep (string descriptor) + { + return new ResolveFromXmlStep (GetDescriptor (descriptor), "descriptor " + descriptor + " from " + Assembly.GetExecutingAssembly ().FullName); + } + + protected static XPathDocument GetExternalDescriptor (EmbeddedResource resource) + { + using (var sr = new StreamReader (resource.GetResourceStream ())) { + return new XPathDocument (sr); + } + } + + static XPathDocument GetDescriptor (string descriptor) + { + using (StreamReader sr = new StreamReader (GetResource (descriptor))) { + return new XPathDocument (sr); + } + } + + static Stream GetResource (string descriptor) + { + return Assembly.GetExecutingAssembly ().GetManifestResourceStream (descriptor); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/CleanStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/CleanStep.cs new file mode 100644 index 000000000000..fd6c1063046d --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/CleanStep.cs @@ -0,0 +1,106 @@ +// +// CleanStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class CleanStep : BaseStep { + + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + if (Annotations.GetAction (assembly) == AssemblyAction.Link) + CleanAssembly (assembly); + } + + static void CleanAssembly (AssemblyDefinition asm) + { + foreach (TypeDefinition type in asm.MainModule.Types) + CleanType (type); + } + + static void CleanType (TypeDefinition type) + { + if (type.HasProperties) + CleanProperties (type); + if (type.HasEvents) + CleanEvents (type); + + if (type.HasNestedTypes) + foreach (var nested in type.NestedTypes) + CleanType (nested); + } + + static MethodDefinition CheckMethod (TypeDefinition type, MethodDefinition method) + { + if (method is null) + return null; + + return type.Methods.Contains (method) ? method : null; + } + + static void CleanEvents (TypeDefinition type) + { + var events = type.Events; + + for (int i = 0; i < events.Count; i++) { + var evt = events [i]; + evt.AddMethod = CheckMethod (type, evt.AddMethod); + evt.InvokeMethod = CheckMethod (type, evt.InvokeMethod); + evt.RemoveMethod = CheckMethod (type, evt.RemoveMethod); + + if (!IsEventUsed (evt)) + events.RemoveAt (i--); + } + } + + static bool IsEventUsed (EventDefinition evt) + { + return evt.AddMethod is not null || evt.InvokeMethod is not null || evt.RemoveMethod is not null; + } + + static void CleanProperties (TypeDefinition type) + { + var properties = type.Properties; + + for (int i = 0; i < properties.Count; i++) { + var prop = properties [i]; + prop.GetMethod = CheckMethod (type, prop.GetMethod); + prop.SetMethod = CheckMethod (type, prop.SetMethod); + + if (!IsPropertyUsed (prop)) + properties.RemoveAt (i--); + } + } + + static bool IsPropertyUsed (PropertyDefinition prop) + { + return prop.GetMethod is not null || prop.SetMethod is not null; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/IStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/IStep.cs new file mode 100644 index 000000000000..c01ef1e6b3fa --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/IStep.cs @@ -0,0 +1,34 @@ +// +// IStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +namespace Mono.Linker.Steps { + + public interface IStep { + void Process (LinkContext context); + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadI18nAssemblies.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadI18nAssemblies.cs new file mode 100644 index 000000000000..da8bb3921746 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadI18nAssemblies.cs @@ -0,0 +1,103 @@ +// +// LoadI18nAssemblies.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Linq; +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class LoadI18nAssemblies : BaseStep { + + static readonly byte [] _pktoken = new byte [] { 0x07, 0x38, 0xeb, 0x9f, 0x13, 0x2e, 0xd7, 0x56 }; + + I18nAssemblies _assemblies; + + public LoadI18nAssemblies (I18nAssemblies assemblies) + { + _assemblies = assemblies; + } + + protected override bool ConditionToProcess () + { + return _assemblies != I18nAssemblies.None && + Context.GetAssemblies ().FirstOrDefault (a => a.Name.Name == "mscorlib")?.MainModule.GetType ("System.MonoType") is not null; + } + + protected override void Process () + { + LoadAssembly (GetAssemblyName (I18nAssemblies.Base)); + + LoadI18nAssembly (I18nAssemblies.CJK); + LoadI18nAssembly (I18nAssemblies.MidEast); + LoadI18nAssembly (I18nAssemblies.Other); + LoadI18nAssembly (I18nAssemblies.Rare); + LoadI18nAssembly (I18nAssemblies.West); + } + + bool ShouldCopyAssembly (I18nAssemblies current) + { + return (current & _assemblies) != 0; + } + + void LoadI18nAssembly (I18nAssemblies asm) + { + if (!ShouldCopyAssembly (asm)) + return; + + AssemblyNameReference name = GetAssemblyName (asm); + LoadAssembly (name); + } + + void LoadAssembly (AssemblyNameReference name) + { + AssemblyDefinition assembly = Context.Resolve (name); + Context.Annotations.SetAction (assembly, AssemblyAction.Copy); + ResolveFromAssemblyStep.ProcessLibrary (Context, assembly, ResolveFromAssemblyStep.RootVisibility.Any); + } + + AssemblyNameReference GetAssemblyName (I18nAssemblies assembly) + { + AssemblyNameReference name = new AssemblyNameReference ("I18N", GetCorlibVersion ()); + if (assembly != I18nAssemblies.Base) + name.Name += "." + assembly; + + name.PublicKeyToken = _pktoken; + return name; + } + + Version GetCorlibVersion () + { + foreach (AssemblyDefinition assembly in Context.GetAssemblies ()) + if (assembly.Name.Name == "mscorlib") + return assembly.Name.Version; + + return new Version (); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadReferencesStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadReferencesStep.cs new file mode 100644 index 000000000000..06684edb61cb --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/LoadReferencesStep.cs @@ -0,0 +1,61 @@ +// +// LoadReferencesStep.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; + +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class LoadReferencesStep : BaseStep { + + readonly HashSet references = new HashSet (); + + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + ProcessReferences (assembly); + } + + protected void ProcessReferences (AssemblyDefinition assembly) + { + if (!references.Add (assembly.Name)) + return; + + Context.RegisterAssembly (assembly); + + foreach (AssemblyDefinition referenceDefinition in Context.ResolveReferences (assembly)) { + try { + ProcessReferences (referenceDefinition); + } catch (Exception ex) { + throw new LoadException (string.Format ("Error while processing references of '{0}'", assembly.FullName), ex); + } + } + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/MarkStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/MarkStep.cs new file mode 100644 index 000000000000..ff46157cbaeb --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/MarkStep.cs @@ -0,0 +1,3350 @@ +// +// MarkStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text.RegularExpressions; + +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Collections.Generic; + +namespace Mono.Linker.Steps { + + public partial class MarkStep : IStep { + + protected LinkContext _context; + protected Queue _methods; + protected List _virtual_methods; + protected Queue _assemblyLevelAttributes; + protected Queue _lateMarkedAttributes; + protected List _typesWithInterfaces; + protected List _unreachableBodies; + + public MarkStep () + { + _methods = new Queue (); + _virtual_methods = new List (); + _assemblyLevelAttributes = new Queue (); + _lateMarkedAttributes = new Queue (); + _typesWithInterfaces = new List (); + _unreachableBodies = new List (); + } + + public AnnotationStore Annotations => _context.Annotations; + public Tracer Tracer => _context.Tracer; + + public virtual void Process (LinkContext context) + { + _context = context; + + Initialize (); + Process (); + Complete (); + } + + void Initialize () + { + foreach (AssemblyDefinition assembly in _context.GetAssemblies ()) + InitializeAssembly (assembly); + } + + protected virtual void InitializeAssembly (AssemblyDefinition assembly) + { + Tracer.Push (assembly); + try { + switch (_context.Annotations.GetAction (assembly)) { + case AssemblyAction.Copy: + case AssemblyAction.Save: + MarkEntireAssembly (assembly); + break; + case AssemblyAction.Link: + case AssemblyAction.AddBypassNGen: + case AssemblyAction.AddBypassNGenUsed: + MarkAssembly (assembly); + + foreach (TypeDefinition type in assembly.MainModule.Types) + InitializeType (type); + + break; + } + } finally { + Tracer.Pop (); + } + } + + void Complete () + { + foreach (var body in _unreachableBodies) { + Annotations.SetAction (body.Method, MethodAction.ConvertToThrow); + } + } + + void InitializeType (TypeDefinition type) + { + if (type.HasNestedTypes) { + foreach (var nested in type.NestedTypes) + InitializeType (nested); + } + + if (!Annotations.IsMarked (type)) + return; + + MarkType (type); + + if (type.HasFields) + InitializeFields (type); + if (type.HasMethods) + InitializeMethods (type.Methods); + } + + protected bool IsFullyPreserved (TypeDefinition type) + { + if (Annotations.TryGetPreserve (type, out TypePreserve preserve) && preserve == TypePreserve.All) + return true; + + switch (Annotations.GetAction (type.Module.Assembly)) { + case AssemblyAction.Save: + case AssemblyAction.Copy: + case AssemblyAction.CopyUsed: + case AssemblyAction.AddBypassNGen: + case AssemblyAction.AddBypassNGenUsed: + return true; + } + + return false; + } + + void InitializeFields (TypeDefinition type) + { + foreach (FieldDefinition field in type.Fields) + if (Annotations.IsMarked (field)) + MarkField (field); + } + + void InitializeMethods (Collection methods) + { + foreach (MethodDefinition method in methods) + if (Annotations.IsMarked (method)) + EnqueueMethod (method); + } + + void MarkEntireType (TypeDefinition type) + { + if (type.HasNestedTypes) { + foreach (TypeDefinition nested in type.NestedTypes) + MarkEntireType (nested); + } + + Annotations.Mark (type); + MarkCustomAttributes (type); + MarkTypeSpecialCustomAttributes (type); + + if (type.HasInterfaces) { + foreach (InterfaceImplementation iface in type.Interfaces) { + MarkInterfaceImplementation (iface); + } + } + + MarkGenericParameterProvider (type); + + if (type.HasFields) { + foreach (FieldDefinition field in type.Fields) { + MarkField (field); + } + } + + if (type.HasMethods) { + foreach (MethodDefinition method in type.Methods) { + Annotations.Mark (method); + Annotations.SetAction (method, MethodAction.ForceParse); + EnqueueMethod (method); + } + } + + if (type.HasProperties) { + foreach (var property in type.Properties) { + MarkProperty (property); + } + } + + if (type.HasEvents) { + foreach (var ev in type.Events) { + MarkEvent (ev); + } + } + } + + void Process () + { + while (ProcessPrimaryQueue () || ProcessLazyAttributes () || ProcessLateMarkedAttributes ()) + + // deal with [TypeForwardedTo] pseudo-attributes + foreach (AssemblyDefinition assembly in _context.GetAssemblies ()) { + if (!assembly.MainModule.HasExportedTypes) + continue; + + foreach (var exported in assembly.MainModule.ExportedTypes) { + bool isForwarder = exported.IsForwarder; + var declaringType = exported.DeclaringType; + while (!isForwarder && (declaringType is not null)) { + isForwarder = declaringType.IsForwarder; + declaringType = declaringType.DeclaringType; + } + + if (!isForwarder) + continue; + TypeDefinition type = exported.Resolve (); + if (type is null) + continue; + if (!Annotations.IsMarked (type)) + continue; + Tracer.Push (type); + try { + _context.MarkingHelpers.MarkExportedType (exported, assembly.MainModule); + } finally { + Tracer.Pop (); + } + } + } + } + + bool ProcessPrimaryQueue () + { + if (QueueIsEmpty ()) + return false; + + while (!QueueIsEmpty ()) { + ProcessQueue (); + ProcessVirtualMethods (); + ProcessMarkedTypesWithInterfaces (); + ProcessPendingBodies (); + DoAdditionalProcessing (); + } + + return true; + } + + void ProcessQueue () + { + while (!QueueIsEmpty ()) { + MethodDefinition method = _methods.Dequeue (); + Tracer.Push (method); + try { + ProcessMethod (method); + } catch (Exception e) { + throw new MarkException (string.Format ("Error processing method: '{0}' in assembly: '{1}'", method.FullName, method.Module.Name), e, method); + } finally { + Tracer.Pop (); + } + } + } + + bool QueueIsEmpty () + { + return _methods.Count == 0; + } + + protected virtual void EnqueueMethod (MethodDefinition method) + { + _methods.Enqueue (method); + } + + void ProcessVirtualMethods () + { + foreach (MethodDefinition method in _virtual_methods) { + Tracer.Push (method); + ProcessVirtualMethod (method); + Tracer.Pop (); + } + } + + void ProcessMarkedTypesWithInterfaces () + { + // We may mark an interface type later on. Which means we need to reprocess any time with one or more interface implementations that have not been marked + // and if an interface type is found to be marked and implementation is not marked, then we need to mark that implementation + + // copy the data to avoid modified while enumerating error potential, which can happen under certain conditions. + var typesWithInterfaces = _typesWithInterfaces.ToArray (); + + foreach (var type in typesWithInterfaces) { + // Exception, types that have not been flagged as instantiated yet. These types may not need their interfaces even if the + // interface type is marked + if (!Annotations.IsInstantiated (type)) + continue; + + MarkInterfaceImplementations (type); + } + } + + void ProcessPendingBodies () + { + for (int i = 0; i < _unreachableBodies.Count; i++) { + var body = _unreachableBodies [i]; + if (Annotations.IsInstantiated (body.Method.DeclaringType)) { + MarkMethodBody (body); + _unreachableBodies.RemoveAt (i--); + } + } + } + + void ProcessVirtualMethod (MethodDefinition method) + { + var overrides = Annotations.GetOverrides (method); + if (overrides is null) + return; + + foreach (OverrideInformation @override in overrides) + ProcessOverride (@override); + } + + void ProcessOverride (OverrideInformation overrideInformation) + { + var method = overrideInformation.Override; + var @base = overrideInformation.Base; + if (!Annotations.IsMarked (method.DeclaringType)) + return; + + if (Annotations.IsProcessed (method)) + return; + + if (Annotations.IsMarked (method)) + return; + + var isInstantiated = Annotations.IsInstantiated (method.DeclaringType); + + // We don't need to mark overrides until it is possible that the type could be instantiated + // Note : The base type is interface check should be removed once we have base type sweeping + if (IsInterfaceOverrideThatDoesNotNeedMarked (overrideInformation, isInstantiated)) + return; + + if (!isInstantiated && !@base.IsAbstract && _context.IsOptimizationEnabled (CodeOptimizations.OverrideRemoval)) + return; + + MarkMethod (method); + ProcessVirtualMethod (method); + } + + bool IsInterfaceOverrideThatDoesNotNeedMarked (OverrideInformation overrideInformation, bool isInstantiated) + { + if (!overrideInformation.IsOverrideOfInterfaceMember || isInstantiated) + return false; + + if (overrideInformation.MatchingInterfaceImplementation is not null) + return !Annotations.IsMarked (overrideInformation.MatchingInterfaceImplementation); + + var interfaceType = overrideInformation.InterfaceType; + var overrideDeclaringType = overrideInformation.Override.DeclaringType; + + if (!IsInterfaceImplementationMarked (overrideDeclaringType, interfaceType)) { + var derivedInterfaceTypes = Annotations.GetDerivedInterfacesForInterface (interfaceType); + + // There are no derived interface types that could be marked, it's safe to skip marking this override + if (derivedInterfaceTypes is null) + return true; + + // If none of the other interfaces on the type that implement the interface from the @base type are marked, then it's safe to skip + // marking this override + if (!derivedInterfaceTypes.Any (d => IsInterfaceImplementationMarked (overrideDeclaringType, d))) + return true; + } + + return false; + } + + bool IsInterfaceImplementationMarked (TypeDefinition type, TypeDefinition interfaceType) + { + return type.HasInterface (@interfaceType, out InterfaceImplementation implementation) && Annotations.IsMarked (implementation); + } + + void MarkMarshalSpec (IMarshalInfoProvider spec) + { + if (!spec.HasMarshalInfo) + return; + + if (spec.MarshalInfo is CustomMarshalInfo marshaler) + MarkType (marshaler.ManagedType); + } + + void MarkCustomAttributes (ICustomAttributeProvider provider) + { + if (!provider.HasCustomAttributes) + return; + + bool markOnUse = _context.KeepUsedAttributeTypesOnly && Annotations.GetAction (GetAssemblyFromCustomAttributeProvider (provider)) == AssemblyAction.Link; + + Tracer.Push (provider); + try { + foreach (CustomAttribute ca in provider.CustomAttributes) { + if (IsUserDependencyMarker (ca.AttributeType) && provider is MemberReference mr) { + MarkUserDependency (mr, ca); + + if (_context.KeepDependencyAttributes) { + MarkCustomAttribute (ca); + continue; + } + + if (Annotations.GetAction (mr.Module.Assembly) == AssemblyAction.Link) + continue; + } + + if (markOnUse) { + _lateMarkedAttributes.Enqueue (new AttributeProviderPair (ca, provider)); + continue; + } + + MarkCustomAttribute (ca); + MarkSpecialCustomAttributeDependencies (ca); + } + } finally { + Tracer.Pop (); + } + } + + static AssemblyDefinition GetAssemblyFromCustomAttributeProvider (ICustomAttributeProvider provider) + { + return provider switch { + MemberReference mr => mr.Module.Assembly, + AssemblyDefinition ad => ad, + ModuleDefinition md => md.Assembly, + InterfaceImplementation ii => ii.InterfaceType.Module.Assembly, + GenericParameterConstraint gpc => gpc.ConstraintType.Module.Assembly, + ParameterDefinition pd => pd.ParameterType.Module.Assembly, + MethodReturnType mrt => mrt.ReturnType.Module.Assembly, + _ => throw new NotImplementedException (provider.GetType ().ToString ()), + }; + } + + protected virtual bool IsUserDependencyMarker (TypeReference type) + { + return PreserveDependencyLookupStep.IsPreserveDependencyAttribute (type); + } + + protected virtual void MarkUserDependency (MemberReference context, CustomAttribute ca) + { + if (ca.HasProperties && ca.Properties [0].Name == "Condition") { + var condition = ca.Properties [0].Argument.Value as string; + switch (condition) { + case "": + case null: + break; + case "DEBUG": + if (!_context.KeepMembersForDebugger) + return; + + break; + default: + // Don't have yet a way to match the general condition so everything is excluded + return; + } + } + + AssemblyDefinition assembly; + var args = ca.ConstructorArguments; + if (args.Count >= 3 && args [2].Value is string assemblyName) { + if (!_context.Resolver.AssemblyCache.TryGetValue (assemblyName, out assembly)) { + _context.LogMessage (MessageImportance.Low, $"Could not resolve '{assemblyName}' assembly dependency"); + return; + } + } else { + assembly = null; + } + + TypeDefinition td; + if (args.Count >= 2 && args [1].Value is string typeName) { + td = FindType (assembly ?? context.Module.Assembly, typeName); + + if (td is null) { + _context.LogMessage (MessageImportance.Low, $"Could not resolve '{typeName}' type dependency"); + return; + } + } else { + td = context.DeclaringType.Resolve (); + } + + string member = null; + string [] signature = null; + if (args.Count >= 1 && args [0].Value is string memberSignature) { + memberSignature = memberSignature.Replace (" ", ""); + var sign_start = memberSignature.IndexOf ('('); + var sign_end = memberSignature.LastIndexOf (')'); + if (sign_start > 0 && sign_end > sign_start) { + var parameters = memberSignature.Substring (sign_start + 1, sign_end - sign_start - 1); + signature = string.IsNullOrEmpty (parameters) ? Array.Empty () : parameters.Split (','); + member = memberSignature.Substring (0, sign_start); + } else { + member = memberSignature; + } + } + + if (member == "*") { + MarkEntireType (td); + return; + } + + if (MarkDependencyMethod (td, member, signature)) + return; + + if (MarkDependencyField (td, member)) + return; + + _context.LogMessage (MessageImportance.High, $"Could not resolve dependency member '{member}' declared in type '{td.FullName}'"); + } + + static TypeDefinition FindType (AssemblyDefinition assembly, string fullName) + { + fullName = fullName.ToCecilName (); + + var type = assembly.MainModule.GetType (fullName); + return type?.Resolve (); + } + + bool MarkDependencyMethod (TypeDefinition type, string name, string [] signature) + { + bool marked = false; + + int arity_marker = name.IndexOf ('`'); + if (arity_marker < 1 || !int.TryParse (name.Substring (arity_marker + 1), out int arity)) { + arity = 0; + } else { + name = name.Substring (0, arity_marker); + } + + foreach (var m in type.Methods) { + if (m.Name != name) + continue; + + if (m.GenericParameters.Count != arity) + continue; + + if (signature is null) { + MarkIndirectlyCalledMethod (m); + marked = true; + continue; + } + + var mp = m.Parameters; + if (mp.Count != signature.Length) + continue; + + int i = 0; + for (; i < signature.Length; ++i) { + if (mp [i].ParameterType.FullName != signature [i].Trim ().ToCecilName ()) { + i = -1; + break; + } + } + + if (i < 0) + continue; + + MarkIndirectlyCalledMethod (m); + marked = true; + } + + return marked; + } + + bool MarkDependencyField (TypeDefinition type, string name) + { + foreach (var f in type.Fields) { + if (f.Name == name) { + MarkField (f); + return true; + } + } + + return false; + } + + void LazyMarkCustomAttributes (ICustomAttributeProvider provider, AssemblyDefinition assembly) + { + if (!provider.HasCustomAttributes) + return; + + foreach (CustomAttribute ca in provider.CustomAttributes) + _assemblyLevelAttributes.Enqueue (new AttributeProviderPair (ca, assembly)); + } + + protected virtual void MarkCustomAttribute (CustomAttribute ca) + { + Tracer.Push ((object) ca.AttributeType ?? (object) ca); + try { + Annotations.Mark (ca); + MarkMethod (ca.Constructor); + + MarkCustomAttributeArguments (ca); + + TypeReference constructor_type = ca.Constructor.DeclaringType; + TypeDefinition type = constructor_type.Resolve (); + + if (type is null) { + HandleUnresolvedType (constructor_type); + return; + } + + MarkCustomAttributeProperties (ca, type); + MarkCustomAttributeFields (ca, type); + } finally { + Tracer.Pop (); + } + } + + protected virtual bool ShouldMarkCustomAttribute (CustomAttribute ca, ICustomAttributeProvider provider) + { + var attr_type = ca.AttributeType; + + if (_context.KeepUsedAttributeTypesOnly) { + switch (attr_type.FullName) { + // These are required by the runtime + case "System.ThreadStaticAttribute": + case "System.ContextStaticAttribute": + case "System.Runtime.CompilerServices.IsByRefLikeAttribute": + return true; + // Attributes related to `fixed` keyword used to declare fixed length arrays + case "System.Runtime.CompilerServices.FixedBufferAttribute": + return true; + case "System.Runtime.InteropServices.InterfaceTypeAttribute": + case "System.Runtime.InteropServices.GuidAttribute": + case "System.Runtime.CompilerServices.InternalsVisibleToAttribute": + return true; + } + + if (!Annotations.IsMarked (attr_type.Resolve ())) + return false; + } + + return true; + } + + protected virtual bool ShouldMarkTypeStaticConstructor (TypeDefinition type) + { + if (Annotations.HasPreservedStaticCtor (type)) + return false; + + if (type.IsBeforeFieldInit && _context.IsOptimizationEnabled (CodeOptimizations.BeforeFieldInit)) + return false; + + return true; + } + + protected void MarkStaticConstructor (TypeDefinition type) + { + if (MarkMethodIf (type.Methods, IsNonEmptyStaticConstructor) is not null) + Annotations.SetPreservedStaticCtor (type); + } + + protected virtual bool ShouldMarkTopLevelCustomAttribute (AttributeProviderPair app, MethodDefinition resolvedConstructor) + { + var ca = app.Attribute; + + if (!ShouldMarkCustomAttribute (app.Attribute, app.Provider)) + return false; + + // If an attribute's module has not been marked after processing all types in all assemblies and the attribute itself has not been marked, + // then surely nothing is using this attribute and there is no need to mark it + if (!Annotations.IsMarked (resolvedConstructor.Module) && + !Annotations.IsMarked (ca.AttributeType) && + Annotations.GetAction (resolvedConstructor.Module.Assembly) == AssemblyAction.Link) + return false; + + if (ca.Constructor.DeclaringType.Namespace == "System.Diagnostics") { + string attributeName = ca.Constructor.DeclaringType.Name; + if (attributeName == "DebuggerDisplayAttribute" || attributeName == "DebuggerTypeProxyAttribute") { + var displayTargetType = GetDebuggerAttributeTargetType (app.Attribute, (AssemblyDefinition) app.Provider); + if (displayTargetType is null || !Annotations.IsMarked (displayTargetType)) + return false; + } + } + + return true; + } + + protected void MarkSecurityDeclarations (ISecurityDeclarationProvider provider) + { + // most security declarations are removed (if linked) but user code might still have some + // and if the attributes references types then they need to be marked too + if ((provider is null) || !provider.HasSecurityDeclarations) + return; + + foreach (var sd in provider.SecurityDeclarations) + MarkSecurityDeclaration (sd); + } + + protected virtual void MarkSecurityDeclaration (SecurityDeclaration sd) + { + if (!sd.HasSecurityAttributes) + return; + + foreach (var sa in sd.SecurityAttributes) + MarkSecurityAttribute (sa); + } + + protected virtual void MarkSecurityAttribute (SecurityAttribute sa) + { + TypeReference security_type = sa.AttributeType; + TypeDefinition type = security_type.Resolve (); + if (type is null) { + HandleUnresolvedType (security_type); + return; + } + + MarkType (security_type); + MarkSecurityAttributeProperties (sa, type); + MarkSecurityAttributeFields (sa, type); + } + + protected void MarkSecurityAttributeProperties (SecurityAttribute sa, TypeDefinition attribute) + { + if (!sa.HasProperties) + return; + + foreach (var named_argument in sa.Properties) + MarkCustomAttributeProperty (named_argument, attribute); + } + + protected void MarkSecurityAttributeFields (SecurityAttribute sa, TypeDefinition attribute) + { + if (!sa.HasFields) + return; + + foreach (var named_argument in sa.Fields) + MarkCustomAttributeField (named_argument, attribute); + } + + protected void MarkCustomAttributeProperties (CustomAttribute ca, TypeDefinition attribute) + { + if (!ca.HasProperties) + return; + + foreach (var named_argument in ca.Properties) + MarkCustomAttributeProperty (named_argument, attribute); + } + + protected void MarkCustomAttributeProperty (CustomAttributeNamedArgument namedArgument, TypeDefinition attribute) + { + PropertyDefinition property = GetProperty (attribute, namedArgument.Name); + Tracer.Push (property); + if (property is not null) + MarkMethod (property.SetMethod); + + MarkCustomAttributeArgument (namedArgument.Argument); + Tracer.Pop (); + } + + PropertyDefinition GetProperty (TypeDefinition type, string propertyname) + { + while (type is not null) { + PropertyDefinition property = type.Properties.FirstOrDefault (p => p.Name == propertyname); + if (property is not null) + return property; + + type = type.BaseType?.Resolve (); + } + + return null; + } + + protected void MarkCustomAttributeFields (CustomAttribute ca, TypeDefinition attribute) + { + if (!ca.HasFields) + return; + + foreach (var named_argument in ca.Fields) + MarkCustomAttributeField (named_argument, attribute); + } + + protected void MarkCustomAttributeField (CustomAttributeNamedArgument namedArgument, TypeDefinition attribute) + { + FieldDefinition field = GetField (attribute, namedArgument.Name); + if (field is not null) + MarkField (field); + + MarkCustomAttributeArgument (namedArgument.Argument); + } + + FieldDefinition GetField (TypeDefinition type, string fieldname) + { + while (type is not null) { + FieldDefinition field = type.Fields.FirstOrDefault (f => f.Name == fieldname); + if (field is not null) + return field; + + type = type.BaseType?.Resolve (); + } + + return null; + } + + MethodDefinition GetMethodWithNoParameters (TypeDefinition type, string methodname) + { + while (type is not null) { + MethodDefinition method = type.Methods.FirstOrDefault (m => m.Name == methodname && !m.HasParameters); + if (method is not null) + return method; + + type = type.BaseType.Resolve (); + } + + return null; + } + + void MarkCustomAttributeArguments (CustomAttribute ca) + { + if (!ca.HasConstructorArguments) + return; + + foreach (var argument in ca.ConstructorArguments) + MarkCustomAttributeArgument (argument); + } + + void MarkCustomAttributeArgument (CustomAttributeArgument argument) + { + var at = argument.Type; + + if (at.IsArray) { + var et = at.GetElementType (); + + MarkType (et); + if (argument.Value is null) + return; + + foreach (var caa in (CustomAttributeArgument []) argument.Value) + MarkCustomAttributeArgument (caa); + + return; + } + + if (at.Namespace == "System") { + switch (at.Name) { + case "Type": + MarkType (argument.Type); + MarkType ((TypeReference) argument.Value); + return; + + case "Object": + var boxed_value = (CustomAttributeArgument) argument.Value; + MarkType (boxed_value.Type); + MarkCustomAttributeArgument (boxed_value); + return; + } + } + } + + protected bool CheckProcessed (IMetadataTokenProvider provider) + { + if (Annotations.IsProcessed (provider)) + return true; + + Annotations.Processed (provider); + return false; + } + + protected void MarkAssembly (AssemblyDefinition assembly) + { + if (CheckProcessed (assembly)) + return; + + ProcessModule (assembly); + + MarkAssemblyCustomAttributes (assembly); + + MarkSecurityDeclarations (assembly); + + foreach (ModuleDefinition module in assembly.Modules) + LazyMarkCustomAttributes (module, assembly); + } + + void MarkEntireAssembly (AssemblyDefinition assembly) + { + MarkCustomAttributes (assembly); + MarkCustomAttributes (assembly.MainModule); + + if (assembly.MainModule.HasExportedTypes) { + // TODO: This needs more work accross all steps + } + + foreach (TypeDefinition type in assembly.MainModule.Types) + MarkEntireType (type); + } + + void ProcessModule (AssemblyDefinition assembly) + { + // Pre-mark if there is any methods as they need to be executed + // at assembly load time + foreach (TypeDefinition type in assembly.MainModule.Types) { + if (type.Name == "" && type.HasMethods) { + MarkType (type); + break; + } + } + } + + bool ProcessLazyAttributes () + { + if (Annotations.HasMarkedAnyIndirectlyCalledMethods () && MarkDisablePrivateReflectionAttribute ()) + return true; + + var startingQueueCount = _assemblyLevelAttributes.Count; + if (startingQueueCount == 0) + return false; + + var skippedItems = new List (); + var markOccurred = false; + + while (_assemblyLevelAttributes.Count != 0) { + var assemblyLevelAttribute = _assemblyLevelAttributes.Dequeue (); + var customAttribute = assemblyLevelAttribute.Attribute; + + var resolved = customAttribute.Constructor.Resolve (); + if (resolved is null) { + HandleUnresolvedMethod (customAttribute.Constructor); + continue; + } + + if (!ShouldMarkTopLevelCustomAttribute (assemblyLevelAttribute, resolved)) { + skippedItems.Add (assemblyLevelAttribute); + continue; + } + + string attributeFullName = customAttribute.Constructor.DeclaringType.FullName; + switch (attributeFullName) { + case "System.Diagnostics.DebuggerDisplayAttribute": + MarkTypeWithDebuggerDisplayAttribute (GetDebuggerAttributeTargetType (assemblyLevelAttribute.Attribute, (AssemblyDefinition) assemblyLevelAttribute.Provider), customAttribute); + break; + case "System.Diagnostics.DebuggerTypeProxyAttribute": + MarkTypeWithDebuggerTypeProxyAttribute (GetDebuggerAttributeTargetType (assemblyLevelAttribute.Attribute, (AssemblyDefinition) assemblyLevelAttribute.Provider), customAttribute); + break; + } + + markOccurred = true; + MarkCustomAttribute (customAttribute); + } + + // requeue the items we skipped in case we need to make another pass + foreach (var item in skippedItems) + _assemblyLevelAttributes.Enqueue (item); + + return markOccurred; + } + + bool ProcessLateMarkedAttributes () + { + var startingQueueCount = _lateMarkedAttributes.Count; + if (startingQueueCount == 0) + return false; + + var skippedItems = new List (); + var markOccurred = false; + + while (_lateMarkedAttributes.Count != 0) { + var attributeProviderPair = _lateMarkedAttributes.Dequeue (); + var customAttribute = attributeProviderPair.Attribute; + + var resolved = customAttribute.Constructor.Resolve (); + if (resolved is null) { + HandleUnresolvedMethod (customAttribute.Constructor); + continue; + } + + if (!ShouldMarkCustomAttribute (customAttribute, attributeProviderPair.Provider)) { + skippedItems.Add (attributeProviderPair); + continue; + } + + markOccurred = true; + MarkCustomAttribute (customAttribute); + MarkSpecialCustomAttributeDependencies (customAttribute); + } + + // requeue the items we skipped in case we need to make another pass + foreach (var item in skippedItems) + _lateMarkedAttributes.Enqueue (item); + + return markOccurred; + } + + protected void MarkField (FieldReference reference) + { + if (reference.DeclaringType is GenericInstanceType) + MarkType (reference.DeclaringType); + + FieldDefinition field = reference.Resolve (); + + if (field is null) { + HandleUnresolvedField (reference); + return; + } + + MarkField (field); + } + + void MarkField (FieldDefinition field) + { + if (CheckProcessed (field)) + return; + + MarkType (field.DeclaringType); + MarkType (field.FieldType); + MarkCustomAttributes (field); + MarkMarshalSpec (field); + DoAdditionalFieldProcessing (field); + + var parent = field.DeclaringType; + if (!Annotations.HasPreservedStaticCtor (parent)) + MarkStaticConstructor (parent); + + if (Annotations.HasSubstitutedInit (field)) { + Annotations.SetPreservedStaticCtor (parent); + Annotations.SetSubstitutedInit (parent); + } + + Annotations.Mark (field); + } + + protected virtual bool IgnoreScope (IMetadataScope scope) + { + AssemblyDefinition assembly = ResolveAssembly (scope); + return Annotations.GetAction (assembly) != AssemblyAction.Link; + } + + void MarkScope (IMetadataScope scope) + { + if (scope is IMetadataTokenProvider provider) + Annotations.Mark (provider); + } + + protected virtual void MarkSerializable (TypeDefinition type) + { + MarkDefaultConstructor (type); + MarkMethodsIf (type.Methods, IsSpecialSerializationConstructor); + } + + protected virtual TypeDefinition MarkType (TypeReference reference) + { + if (reference is null) + return null; + + reference = GetOriginalType (reference); + + if (reference is FunctionPointerType) + return null; + + if (reference is GenericParameter) + return null; + + // if (IgnoreScope (reference.Scope)) + // return null; + + TypeDefinition type = reference.Resolve (); + + if (type is null) { + HandleUnresolvedType (reference); + return null; + } + + if (CheckProcessed (type)) + return null; + + Tracer.Push (type); + + MarkScope (type.Scope); + MarkType (type.BaseType); + MarkType (type.DeclaringType); + MarkCustomAttributes (type); + MarkSecurityDeclarations (type); + + if (type.IsMulticastDelegate ()) { + MarkMulticastDelegate (type); + } + + if (type.IsSerializable ()) + MarkSerializable (type); + + if (!_context.IsFeatureExcluded ("etw") && BCL.EventTracingForWindows.IsEventSourceImplementation (type, _context)) { + MarkEventSourceProviders (type); + } + + MarkTypeSpecialCustomAttributes (type); + + MarkGenericParameterProvider (type); + + // keep fields for value-types and for classes with LayoutKind.Sequential or Explicit + if (type.IsValueType || !type.IsAutoLayout) + MarkFields (type, type.IsEnum); + + // There are a number of markings we can defer until later when we know it's possible a reference type could be instantiated + // For example, if no instance of a type exist, then we don't need to mark the interfaces on that type + // However, for some other types there is no benefit to deferring + if (type.IsInterface) { + // There's no benefit to deferring processing of an interface type until we know a type implementing that interface is marked + MarkRequirementsForInstantiatedTypes (type); + } else if (type.IsValueType) { + // Note : Technically interfaces could be removed from value types in some of the same cases as reference types, however, it's harder to know when + // a value type instance could exist. You'd have to track initobj and maybe locals types. Going to punt for now. + MarkRequirementsForInstantiatedTypes (type); + } else if (IsFullyPreserved (type)) { + // Here for a couple reasons: + // * Edge case to cover a scenario where a type has preserve all, implements interfaces, but does not have any instance ctors. + // Normally TypePreserve.All would cause an instance ctor to be marked and that would in turn lead to MarkInterfaceImplementations being called + // Without an instance ctor, MarkInterfaceImplementations is not called and then TypePreserve.All isn't truly respected. + // * If an assembly has the action Copy and had ResolveFromAssemblyStep ran for the assembly, then InitializeType will have led us here + // When the entire assembly is preserved, then all interfaces, base, etc will be preserved on the type, so we need to make sure + // all of these types are marked. For example, if an interface implementation is of a type in another assembly that is linked, + // and there are no other usages of that interface type, then we need to make sure the interface type is still marked because + // this type is going to retain the interface implementation + MarkRequirementsForInstantiatedTypes (type); + } else if (AlwaysMarkTypeAsInstantiated (type)) { + MarkRequirementsForInstantiatedTypes (type); + } + + if (type.HasInterfaces) + _typesWithInterfaces.Add (type); + + if (type.HasMethods) { + MarkMethodsIf (type.Methods, IsVirtualNeededByTypeDueToPreservedScope); + if (ShouldMarkTypeStaticConstructor (type)) + MarkStaticConstructor (type); + + MarkMethodsIf (type.Methods, HasSerializationAttribute); + } + + DoAdditionalTypeProcessing (type); + + Tracer.Pop (); + + Annotations.Mark (type); + + ApplyPreserveInfo (type); + + return type; + } + + // Allow subclassers to mark additional things in the main processing loop + protected virtual void DoAdditionalProcessing () + { + } + + // Allow subclassers to mark additional things + protected virtual void DoAdditionalTypeProcessing (TypeDefinition type) + { + } + + // Allow subclassers to mark additional things + protected virtual void DoAdditionalFieldProcessing (FieldDefinition field) + { + } + + // Allow subclassers to mark additional things + protected virtual void DoAdditionalPropertyProcessing (PropertyDefinition property) + { + } + + // Allow subclassers to mark additional things + protected virtual void DoAdditionalEventProcessing (EventDefinition evt) + { + } + + // Allow subclassers to mark additional things + protected virtual void DoAdditionalInstantiatedTypeProcessing (TypeDefinition type) + { + } + + void MarkAssemblyCustomAttributes (AssemblyDefinition assembly) + { + if (!assembly.HasCustomAttributes) + return; + + foreach (CustomAttribute attribute in assembly.CustomAttributes) + _assemblyLevelAttributes.Enqueue (new AttributeProviderPair (attribute, assembly)); + } + + TypeDefinition GetDebuggerAttributeTargetType (CustomAttribute ca, AssemblyDefinition asm) + { + TypeReference targetTypeReference = null; + foreach (var property in ca.Properties) { + if (property.Name == "Target") { + targetTypeReference = (TypeReference) property.Argument.Value; + break; + } + + if (property.Name == "TargetTypeName") { + if (TypeNameParser.TryParseTypeAssemblyQualifiedName ((string) property.Argument.Value, out string typeName, out string assemblyName)) { + if (string.IsNullOrEmpty (assemblyName)) + targetTypeReference = asm.MainModule.GetType (typeName); + else + targetTypeReference = _context.GetAssemblies ().FirstOrDefault (a => a.Name.Name == assemblyName)?.MainModule.GetType (typeName); + } + break; + } + } + + return targetTypeReference?.Resolve (); + } + + void MarkTypeSpecialCustomAttributes (TypeDefinition type) + { + if (!type.HasCustomAttributes) + return; + + foreach (CustomAttribute attribute in type.CustomAttributes) { + var attrType = attribute.Constructor.DeclaringType; + switch (attrType.Name) { + case "XmlSchemaProviderAttribute" when attrType.Namespace == "System.Xml.Serialization": + MarkXmlSchemaProvider (type, attribute); + break; + case "DebuggerDisplayAttribute" when attrType.Namespace == "System.Diagnostics": + MarkTypeWithDebuggerDisplayAttribute (type, attribute); + break; + case "DebuggerTypeProxyAttribute" when attrType.Namespace == "System.Diagnostics": + MarkTypeWithDebuggerTypeProxyAttribute (type, attribute); + break; + case "EventDataAttribute" when attrType.Namespace == "System.Diagnostics.Tracing": + MarkMethodsIf (type.Methods, MethodDefinitionExtensions.IsPublicInstancePropertyMethod); + break; + case "TypeDescriptionProviderAttribute" when attrType.Namespace == "System.ComponentModel": + MarkTypeConverterLikeDependency (attribute, l => l.IsDefaultConstructor ()); + break; + } + } + } + + // + // Used for known framework attributes which can be applied to any element + // + bool MarkSpecialCustomAttributeDependencies (CustomAttribute ca) + { + var dt = ca.Constructor.DeclaringType; + if (dt.Name == "TypeConverterAttribute" && dt.Namespace == "System.ComponentModel") { + MarkTypeConverterLikeDependency (ca, l => + l.IsDefaultConstructor () || + l.Parameters.Count == 1 && l.Parameters [0].ParameterType.IsTypeOf ("System", "Type")); + return true; + } + + return false; + } + + void MarkMethodSpecialCustomAttributes (MethodDefinition method) + { + if (!method.HasCustomAttributes) + return; + + foreach (CustomAttribute attribute in method.CustomAttributes) { + switch (attribute.Constructor.DeclaringType.FullName) { + case "System.Web.Services.Protocols.SoapHeaderAttribute": + MarkSoapHeader (method, attribute); + break; + } + } + } + + void MarkXmlSchemaProvider (TypeDefinition type, CustomAttribute attribute) + { + if (TryGetStringArgument (attribute, out string name)) + MarkNamedMethod (type, name); + } + + protected virtual void MarkTypeConverterLikeDependency (CustomAttribute attribute, Func predicate) + { + var args = attribute.ConstructorArguments; + if (args.Count < 1) + return; + + TypeDefinition tdef = null; + switch (attribute.ConstructorArguments [0].Value) { + case string s: + tdef = ResolveFullyQualifiedTypeName (s); + break; + case TypeReference type: + tdef = type.Resolve (); + break; + } + + if (tdef is null) + return; + + MarkMethodsIf (tdef.Methods, predicate); + } + + void MarkTypeWithDebuggerDisplayAttribute (TypeDefinition type, CustomAttribute attribute) + { + if (_context.KeepMembersForDebugger) { + + string displayString = (string) attribute.ConstructorArguments [0].Value; + + Regex regex = new Regex ("{[^{}]+}", RegexOptions.Compiled); + + foreach (Match match in regex.Matches (displayString)) { + // Remove '{' and '}' + string realMatch = match.Value.Substring (1, match.Value.Length - 2); + + // Remove ",nq" suffix if present + // (it asks the expression evaluator to remove the quotes when displaying the final value) + if (Regex.IsMatch (realMatch, @".+,\s*nq")) { + realMatch = realMatch.Substring (0, realMatch.LastIndexOf (',')); + } + + if (realMatch.EndsWith ("()")) { + string methodName = realMatch.Substring (0, realMatch.Length - 2); + MethodDefinition method = GetMethodWithNoParameters (type, methodName); + if (method is not null) { + MarkMethod (method); + continue; + } + } else { + FieldDefinition field = GetField (type, realMatch); + if (field is not null) { + MarkField (field); + continue; + } + + PropertyDefinition property = GetProperty (type, realMatch); + if (property is not null) { + if (property.GetMethod is not null) { + MarkMethod (property.GetMethod); + } + if (property.SetMethod is not null) { + MarkMethod (property.SetMethod); + } + continue; + } + } + + while (type is not null) { + MarkMethods (type); + MarkFields (type, includeStatic: true); + type = type.BaseType?.Resolve (); + } + return; + } + } + } + + void MarkTypeWithDebuggerTypeProxyAttribute (TypeDefinition type, CustomAttribute attribute) + { + if (_context.KeepMembersForDebugger) { + object constructorArgument = attribute.ConstructorArguments [0].Value; + TypeReference proxyTypeReference = constructorArgument as TypeReference; + if (proxyTypeReference is null) { + if (constructorArgument is string proxyTypeReferenceString) { + proxyTypeReference = type.Module.GetType (proxyTypeReferenceString, runtimeName: true); + } + } + + if (proxyTypeReference is null) { + return; + } + + MarkType (proxyTypeReference); + + TypeDefinition proxyType = proxyTypeReference.Resolve (); + if (proxyType is not null) { + MarkMethods (proxyType); + MarkFields (proxyType, includeStatic: true); + } + } + } + + static bool TryGetStringArgument (CustomAttribute attribute, out string argument) + { + argument = null; + + if (attribute.ConstructorArguments.Count < 1) + return false; + + argument = attribute.ConstructorArguments [0].Value as string; + + return argument is not null; + } + + protected int MarkNamedMethod (TypeDefinition type, string method_name) + { + if (!type.HasMethods) + return 0; + + int count = 0; + foreach (MethodDefinition method in type.Methods) { + if (method.Name != method_name) + continue; + + MarkMethod (method); + count++; + } + + return count; + } + + void MarkSoapHeader (MethodDefinition method, CustomAttribute attribute) + { + if (!TryGetStringArgument (attribute, out string member_name)) + return; + + MarkNamedField (method.DeclaringType, member_name); + MarkNamedProperty (method.DeclaringType, member_name); + } + + void MarkNamedField (TypeDefinition type, string field_name) + { + if (!type.HasFields) + return; + + foreach (FieldDefinition field in type.Fields) { + if (field.Name != field_name) + continue; + + MarkField (field); + } + } + + void MarkNamedProperty (TypeDefinition type, string property_name) + { + if (!type.HasProperties) + return; + + foreach (PropertyDefinition property in type.Properties) { + if (property.Name != property_name) + continue; + + Tracer.Push (property); + MarkMethod (property.GetMethod); + MarkMethod (property.SetMethod); + Tracer.Pop (); + } + } + + void MarkInterfaceImplementations (TypeDefinition type) + { + if (!type.HasInterfaces) + return; + + foreach (var iface in type.Interfaces) { + // Only mark interface implementations of interface types that have been marked. + // This enables stripping of interfaces that are never used + var resolvedInterfaceType = iface.InterfaceType.Resolve (); + if (resolvedInterfaceType is null) { + HandleUnresolvedType (iface.InterfaceType); + continue; + } + + if (ShouldMarkInterfaceImplementation (type, iface, resolvedInterfaceType)) + MarkInterfaceImplementation (iface); + } + } + + void MarkGenericParameterProvider (IGenericParameterProvider provider) + { + if (!provider.HasGenericParameters) + return; + + foreach (GenericParameter parameter in provider.GenericParameters) + MarkGenericParameter (parameter); + } + + void MarkGenericParameter (GenericParameter parameter) + { + MarkCustomAttributes (parameter); + if (!parameter.HasConstraints) + return; + + foreach (var constraint in parameter.Constraints) { + MarkCustomAttributes (constraint); + MarkType (constraint.ConstraintType); + } + } + + bool IsVirtualNeededByTypeDueToPreservedScope (MethodDefinition method) + { + if (!method.IsVirtual) + return false; + + var base_list = Annotations.GetBaseMethods (method); + if (base_list is null) + return false; + + foreach (MethodDefinition @base in base_list) { + // Just because the type is marked does not mean we need interface methods. + // if the type is never instantiated, interfaces will be removed + if (@base.DeclaringType.IsInterface) + continue; + + // If the type is marked, we need to keep overrides of abstract members defined in assemblies + // that are copied. However, if the base method is virtual, then we don't need to keep the override + // until the type could be instantiated + if (!@base.IsAbstract) + continue; + + if (IgnoreScope (@base.DeclaringType.Scope)) + return true; + + if (IsVirtualNeededByTypeDueToPreservedScope (@base)) + return true; + } + + return false; + } + + bool IsVirtualNeededByInstantiatedTypeDueToPreservedScope (MethodDefinition method) + { + if (!method.IsVirtual) + return false; + + var base_list = Annotations.GetBaseMethods (method); + if (base_list is null) + return false; + + foreach (MethodDefinition @base in base_list) { + if (IgnoreScope (@base.DeclaringType.Scope)) + return true; + + if (IsVirtualNeededByTypeDueToPreservedScope (@base)) + return true; + } + + return false; + } + + static bool IsSpecialSerializationConstructor (MethodDefinition method) + { + if (!method.IsInstanceConstructor ()) + return false; + + var parameters = method.Parameters; + if (parameters.Count != 2) + return false; + + return parameters [0].ParameterType.Name == "SerializationInfo" && + parameters [1].ParameterType.Name == "StreamingContext"; + } + + protected void MarkMethodsIf (Collection methods, Func predicate) + { + foreach (MethodDefinition method in methods) + if (predicate (method)) + MarkMethod (method); + } + + protected MethodDefinition MarkMethodIf (Collection methods, Func predicate) + { + foreach (MethodDefinition method in methods) { + if (predicate (method)) { + return MarkMethod (method); + } + } + + return null; + } + + protected bool MarkDefaultConstructor (TypeDefinition type) + { + if (type?.HasMethods != true) + return false; + + return MarkMethodIf (type.Methods, MethodDefinitionExtensions.IsDefaultConstructor) is not null; + } + + static bool IsNonEmptyStaticConstructor (MethodDefinition method) + { + if (!method.IsStaticConstructor ()) + return false; + + if (!method.HasBody || !method.IsIL) + return true; + + if (method.Body.CodeSize != 1) + return true; + + return method.Body.Instructions [0].OpCode.Code != Code.Ret; + } + + static bool HasSerializationAttribute (MethodDefinition method) + { + if (!method.HasCustomAttributes) + return false; + foreach (var ca in method.CustomAttributes) { + var cat = ca.AttributeType; + if (cat.Namespace != "System.Runtime.Serialization") + continue; + switch (cat.Name) { + case "OnDeserializedAttribute": + case "OnDeserializingAttribute": + case "OnSerializedAttribute": + case "OnSerializingAttribute": + return true; + } + } + return false; + } + + protected virtual bool AlwaysMarkTypeAsInstantiated (TypeDefinition td) + { + switch (td.Name) { + // These types are created from native code which means we are unable to track when they are instantiated + // Since these are such foundational types, let's take the easy route and just always assume an instance of one of these + // could exist + case "Delegate": + case "MulticastDelegate": + case "ValueType": + case "Enum": + return td.Namespace == "System"; + } + + return false; + } + + void MarkEventSourceProviders (TypeDefinition td) + { + foreach (var nestedType in td.NestedTypes) { + if (BCL.EventTracingForWindows.IsProviderName (nestedType.Name)) + MarkStaticFields (nestedType); + } + } + + protected virtual void MarkMulticastDelegate (TypeDefinition type) + { + MarkMethodCollection (type.Methods); + } + + TypeDefinition ResolveFullyQualifiedTypeName (string name) + { + if (!TypeNameParser.TryParseTypeAssemblyQualifiedName (name, out string typeName, out string assemblyName)) + return null; + + foreach (var assemblyDefinition in _context.GetAssemblies ()) { + if (assemblyName is not null && assemblyDefinition.Name.Name != assemblyName) + continue; + + var foundType = assemblyDefinition.MainModule.GetType (typeName); + if (foundType is null) + continue; + + return foundType; + } + + return null; + } + + protected TypeReference GetOriginalType (TypeReference type) + { + while (type is TypeSpecification) { + if (type is GenericInstanceType git) + MarkGenericArguments (git); + + if (type is IModifierType mod) + MarkModifierType (mod); + + if (type is FunctionPointerType fnptr) { + MarkParameters (fnptr); + MarkType (fnptr.ReturnType); + break; // FunctionPointerType is the original type + } + + type = ((TypeSpecification) type).ElementType; + } + + return type; + } + + void MarkParameters (FunctionPointerType fnptr) + { + if (!fnptr.HasParameters) + return; + + for (int i = 0; i < fnptr.Parameters.Count; i++) { + MarkType (fnptr.Parameters [i].ParameterType); + } + } + + void MarkModifierType (IModifierType mod) + { + MarkType (mod.ModifierType); + } + + void MarkGenericArguments (IGenericInstance instance) + { + foreach (TypeReference argument in instance.GenericArguments) + MarkType (argument); + + MarkGenericArgumentConstructors (instance); + } + + void MarkGenericArgumentConstructors (IGenericInstance instance) + { + var arguments = instance.GenericArguments; + + var generic_element = GetGenericProviderFromInstance (instance); + if (generic_element is null) + return; + + var parameters = generic_element.GenericParameters; + + if (arguments.Count != parameters.Count) + return; + + for (int i = 0; i < arguments.Count; i++) { + var argument = arguments [i]; + var parameter = parameters [i]; + + if (!parameter.HasDefaultConstructorConstraint) + continue; + + var argument_definition = argument.Resolve (); + MarkDefaultConstructor (argument_definition); + } + } + + static IGenericParameterProvider GetGenericProviderFromInstance (IGenericInstance instance) + { + if (instance is GenericInstanceMethod method) + return method.ElementMethod.Resolve (); + + if (instance is GenericInstanceType type) + return type.ElementType.Resolve (); + + return null; + } + + void ApplyPreserveInfo (TypeDefinition type) + { + ApplyPreserveMethods (type); + + if (!Annotations.TryGetPreserve (type, out TypePreserve preserve)) + return; + + switch (preserve) { + case TypePreserve.All: + MarkFields (type, true); + MarkMethods (type); + break; + case TypePreserve.Fields: + if (!MarkFields (type, true, true)) + _context.LogMessage ($"Type {type.FullName} has no fields to preserve"); + break; + case TypePreserve.Methods: + if (!MarkMethods (type)) + _context.LogMessage ($"Type {type.FullName} has no methods to preserve"); + break; + } + } + + void ApplyPreserveMethods (TypeDefinition type) + { + var list = Annotations.GetPreservedMethods (type); + if (list is null) + return; + + MarkMethodCollection (list); + } + + void ApplyPreserveMethods (MethodDefinition method) + { + var list = Annotations.GetPreservedMethods (method); + if (list is null) + return; + + MarkMethodCollection (list); + } + + protected bool MarkFields (TypeDefinition type, bool includeStatic, bool markBackingFieldsOnlyIfPropertyMarked = false) + { + if (!type.HasFields) + return false; + + foreach (FieldDefinition field in type.Fields) { + if (!includeStatic && field.IsStatic) + continue; + + if (markBackingFieldsOnlyIfPropertyMarked && field.Name.EndsWith (">k__BackingField", StringComparison.Ordinal)) { + // We can't reliably construct the expected property name from the backing field name for all compilers + // because csc shortens the name of the backing field in some cases + // For example: + // Field Name = .Bar>k__BackingField + // Property Name = IFoo.Bar + // + // instead we will search the properties and find the one that makes use of the current backing field + var propertyDefinition = SearchPropertiesForMatchingFieldDefinition (field); + if (propertyDefinition is not null && !Annotations.IsMarked (propertyDefinition)) + continue; + } + MarkField (field); + } + + return true; + } + + static PropertyDefinition SearchPropertiesForMatchingFieldDefinition (FieldDefinition field) + { + foreach (var property in field.DeclaringType.Properties) { + var instr = property.GetMethod?.Body?.Instructions; + if (instr is null) + continue; + + foreach (var ins in instr) { + if (ins?.Operand == field) + return property; + } + } + + return null; + } + + protected void MarkStaticFields (TypeDefinition type) + { + if (!type.HasFields) + return; + + foreach (FieldDefinition field in type.Fields) { + if (field.IsStatic) + MarkField (field); + } + } + + protected virtual bool MarkMethods (TypeDefinition type) + { + if (!type.HasMethods) + return false; + + MarkMethodCollection (type.Methods); + return true; + } + + void MarkMethodCollection (IList methods) + { + foreach (MethodDefinition method in methods) + MarkMethod (method); + } + + protected void MarkIndirectlyCalledMethod (MethodDefinition method) + { + MarkMethod (method); + Annotations.MarkIndirectlyCalledMethod (method); + } + + protected virtual MethodDefinition MarkMethod (MethodReference reference) + { + reference = GetOriginalMethod (reference); + + if (reference.DeclaringType is ArrayType) + return null; + + Tracer.Push (reference); + if (reference.DeclaringType is GenericInstanceType) + MarkType (reference.DeclaringType); + + // if (IgnoreScope (reference.DeclaringType.Scope)) + // return; + + MethodDefinition method = reference.Resolve (); + + try { + if (method is null) { + HandleUnresolvedMethod (reference); + return null; + } + + if (Annotations.GetAction (method) == MethodAction.Nothing) + Annotations.SetAction (method, MethodAction.Parse); + + EnqueueMethod (method); + } finally { + Tracer.Pop (); + } + Tracer.AddDependency (method); + + return method; + } + + AssemblyDefinition ResolveAssembly (IMetadataScope scope) + { + AssemblyDefinition assembly = _context.Resolve (scope); + MarkAssembly (assembly); + return assembly; + } + + protected MethodReference GetOriginalMethod (MethodReference method) + { + while (method is MethodSpecification) { + if (method is GenericInstanceMethod gim) + MarkGenericArguments (gim); + + method = ((MethodSpecification) method).ElementMethod; + } + + return method; + } + + protected virtual void ProcessMethod (MethodDefinition method) + { + if (CheckProcessed (method)) + return; + + Tracer.Push (method); + MarkType (method.DeclaringType); + MarkCustomAttributes (method); + MarkSecurityDeclarations (method); + + MarkGenericParameterProvider (method); + + if (ShouldMarkAsInstancePossible (method)) + MarkRequirementsForInstantiatedTypes (method.DeclaringType); + + if (method.IsConstructor) { + if (!Annotations.ProcessSatelliteAssemblies && KnownMembers.IsSatelliteAssemblyMarker (method)) + Annotations.ProcessSatelliteAssemblies = true; + } else if (method.IsPropertyMethod ()) + MarkProperty (method.GetProperty ()); + else if (method.IsEventMethod ()) + MarkEvent (method.GetEvent ()); + + if (method.HasParameters) { + foreach (ParameterDefinition pd in method.Parameters) { + MarkType (pd.ParameterType); + MarkCustomAttributes (pd); + MarkMarshalSpec (pd); + } + } + + if (method.HasOverrides) { + foreach (MethodReference ov in method.Overrides) { + MarkMethod (ov); + MarkExplicitInterfaceImplementation (method, ov); + } + } + + MarkMethodSpecialCustomAttributes (method); + + if (method.IsVirtual) + _virtual_methods.Add (method); + + MarkNewCodeDependencies (method); + + MarkBaseMethods (method); + + MarkType (method.ReturnType); + MarkCustomAttributes (method.MethodReturnType); + MarkMarshalSpec (method.MethodReturnType); + + if (method.IsPInvokeImpl || method.IsInternalCall) { + ProcessInteropMethod (method); + } + + if (ShouldParseMethodBody (method)) + MarkMethodBody (method.Body); + + DoAdditionalMethodProcessing (method); + + Annotations.Mark (method); + + ApplyPreserveMethods (method); + Tracer.Pop (); + } + + // Allow subclassers to mark additional things when marking a method + protected virtual void DoAdditionalMethodProcessing (MethodDefinition method) + { + } + + protected virtual bool ShouldMarkAsInstancePossible (MethodDefinition method) + { + // We don't need to mark it multiple times + if (Annotations.IsInstantiated (method.DeclaringType)) + return false; + + if (method.IsInstanceConstructor ()) + return true; + + if (method.DeclaringType.IsInterface) + return true; + + return false; + } + + protected virtual void MarkRequirementsForInstantiatedTypes (TypeDefinition type) + { + if (Annotations.IsInstantiated (type)) + return; + + Annotations.MarkInstantiated (type); + + MarkInterfaceImplementations (type); + + foreach (var method in GetRequiredMethodsForInstantiatedType (type)) + MarkMethod (method); + + DoAdditionalInstantiatedTypeProcessing (type); + } + + /// + /// Collect methods that must be marked once a type is determined to be instantiated. + /// + /// This method is virtual in order to give derived mark steps an opportunity to modify the collection of methods that are needed + /// + /// + /// + protected virtual IEnumerable GetRequiredMethodsForInstantiatedType (TypeDefinition type) + { + foreach (var method in type.Methods) { + if (method.IsFinalizer () || IsVirtualNeededByInstantiatedTypeDueToPreservedScope (method)) + yield return method; + } + } + + void MarkExplicitInterfaceImplementation (MethodDefinition method, MethodReference ov) + { + var resolvedOverride = ov.Resolve (); + + if (resolvedOverride is null) { + HandleUnresolvedMethod (ov); + return; + } + + if (resolvedOverride.DeclaringType.IsInterface) { + foreach (var ifaceImpl in method.DeclaringType.Interfaces) { + var resolvedInterfaceType = ifaceImpl.InterfaceType.Resolve (); + if (resolvedInterfaceType is null) { + HandleUnresolvedType (ifaceImpl.InterfaceType); + continue; + } + + if (resolvedInterfaceType == resolvedOverride.DeclaringType) { + MarkInterfaceImplementation (ifaceImpl); + return; + } + } + } + } + + void MarkNewCodeDependencies (MethodDefinition method) + { + switch (Annotations.GetAction (method)) { + case MethodAction.ConvertToStub: + if (!method.IsInstanceConstructor ()) + return; + + var baseType = method.DeclaringType.BaseType.Resolve (); + if (!MarkDefaultConstructor (baseType)) + throw new NotSupportedException ($"Cannot stub constructor on '{method.DeclaringType}' when base type does not have default constructor"); + + break; + + case MethodAction.ConvertToThrow: + MarkAndCacheConvertToThrowExceptionCtor (); + break; + } + } + + protected virtual void MarkAndCacheConvertToThrowExceptionCtor () + { + if (_context.MarkedKnownMembers.NotSupportedExceptionCtorString is not null) + return; + + var nse = BCL.FindPredefinedType ("System", "NotSupportedException", _context); + if (nse is null) + throw new NotSupportedException ("Missing predefined 'System.NotSupportedException' type"); + + MarkType (nse); + + var nseCtor = MarkMethodIf (nse.Methods, KnownMembers.IsNotSupportedExceptionCtorString); + if (nseCtor is null) + throw new MarkException ($"Could not find constructor on '{nse.FullName}'"); + + _context.MarkedKnownMembers.NotSupportedExceptionCtorString = nseCtor; + + var objectType = BCL.FindPredefinedType ("System", "Object", _context); + if (objectType is null) + throw new NotSupportedException ("Missing predefined 'System.Object' type"); + + MarkType (objectType); + + var objectCtor = MarkMethodIf (objectType.Methods, MethodDefinitionExtensions.IsDefaultConstructor); + if (objectCtor is null) + throw new MarkException ($"Could not find constructor on '{objectType.FullName}'"); + + _context.MarkedKnownMembers.ObjectCtor = objectCtor; + } + + bool MarkDisablePrivateReflectionAttribute () + { + if (_context.MarkedKnownMembers.DisablePrivateReflectionAttributeCtor is not null) + return false; + + var nse = BCL.FindPredefinedType ("System.Runtime.CompilerServices", "DisablePrivateReflectionAttribute", _context); + if (nse is null) + throw new NotSupportedException ("Missing predefined 'System.Runtime.CompilerServices.DisablePrivateReflectionAttribute' type"); + + MarkType (nse); + + var ctor = MarkMethodIf (nse.Methods, MethodDefinitionExtensions.IsDefaultConstructor); + if (ctor is null) + throw new MarkException ($"Could not find constructor on '{nse.FullName}'"); + + _context.MarkedKnownMembers.DisablePrivateReflectionAttributeCtor = ctor; + return true; + } + + void MarkBaseMethods (MethodDefinition method) + { + var base_methods = Annotations.GetBaseMethods (method); + if (base_methods is null) + return; + + foreach (MethodDefinition base_method in base_methods) { + if (base_method.DeclaringType.IsInterface && !method.DeclaringType.IsInterface) + continue; + + MarkMethod (base_method); + MarkBaseMethods (base_method); + } + } + + void ProcessInteropMethod (MethodDefinition method) + { + TypeDefinition returnTypeDefinition = method.ReturnType.Resolve (); + + const bool includeStaticFields = false; + if (returnTypeDefinition is not null && !returnTypeDefinition.IsImport) { + MarkDefaultConstructor (returnTypeDefinition); + MarkFields (returnTypeDefinition, includeStaticFields); + } + + if (method.HasThis && !method.DeclaringType.IsImport) { + MarkFields (method.DeclaringType, includeStaticFields); + } + + foreach (ParameterDefinition pd in method.Parameters) { + TypeReference paramTypeReference = pd.ParameterType; + if (paramTypeReference is TypeSpecification) { + paramTypeReference = (paramTypeReference as TypeSpecification).ElementType; + } + TypeDefinition paramTypeDefinition = paramTypeReference.Resolve (); + if (paramTypeDefinition is not null && !paramTypeDefinition.IsImport) { + MarkFields (paramTypeDefinition, includeStaticFields); + if (pd.ParameterType.IsByReference) { + MarkDefaultConstructor (paramTypeDefinition); + } + } + } + } + + protected virtual bool ShouldParseMethodBody (MethodDefinition method) + { + if (!method.HasBody) + return false; + + switch (Annotations.GetAction (method)) { + case MethodAction.ForceParse: + return true; + case MethodAction.Parse: + AssemblyDefinition assembly = ResolveAssembly (method.DeclaringType.Scope); + switch (Annotations.GetAction (assembly)) { + case AssemblyAction.Link: + case AssemblyAction.Copy: + case AssemblyAction.CopyUsed: + case AssemblyAction.AddBypassNGen: + case AssemblyAction.AddBypassNGenUsed: + return true; + default: + return false; + } + default: + return false; + } + } + + protected void MarkProperty (PropertyDefinition prop) + { + MarkCustomAttributes (prop); + DoAdditionalPropertyProcessing (prop); + } + + protected virtual void MarkEvent (EventDefinition evt) + { + MarkCustomAttributes (evt); + MarkMethodIfNotNull (evt.AddMethod); + MarkMethodIfNotNull (evt.InvokeMethod); + MarkMethodIfNotNull (evt.RemoveMethod); + DoAdditionalEventProcessing (evt); + } + + void MarkMethodIfNotNull (MethodReference method) + { + if (method is null) + return; + + MarkMethod (method); + } + + protected virtual void MarkMethodBody (MethodBody body) + { + if (_context.IsOptimizationEnabled (CodeOptimizations.UnreachableBodies) && IsUnreachableBody (body)) { + MarkAndCacheConvertToThrowExceptionCtor (); + _unreachableBodies.Add (body); + return; + } + + foreach (VariableDefinition var in body.Variables) + MarkType (var.VariableType); + + foreach (ExceptionHandler eh in body.ExceptionHandlers) + if (eh.HandlerType == ExceptionHandlerType.Catch) + MarkType (eh.CatchType); + + foreach (Instruction instruction in body.Instructions) + MarkInstruction (instruction); + + MarkInterfacesNeededByBodyStack (body); + + MarkReflectionLikeDependencies (body); + + PostMarkMethodBody (body); + } + + bool IsUnreachableBody (MethodBody body) + { + return !body.Method.IsStatic + && !Annotations.IsInstantiated (body.Method.DeclaringType) + && MethodBodyScanner.IsWorthConvertingToThrow (body); + } + + + partial void PostMarkMethodBody (MethodBody body); + + void MarkInterfacesNeededByBodyStack (MethodBody body) + { + // If a type could be on the stack in the body and an interface it implements could be on the stack on the body + // then we need to mark that interface implementation. When this occurs it is not safe to remove the interface implementation from the type + // even if the type is never instantiated + var implementations = MethodBodyScanner.GetReferencedInterfaces (_context.Annotations, body); + if (implementations is null) + return; + + foreach (var implementation in implementations) + MarkInterfaceImplementation (implementation); + } + + protected virtual void MarkInstruction (Instruction instruction) + { + switch (instruction.OpCode.OperandType) { + case OperandType.InlineField: + MarkField ((FieldReference) instruction.Operand); + break; + case OperandType.InlineMethod: + MarkMethod ((MethodReference) instruction.Operand); + break; + case OperandType.InlineTok: + object token = instruction.Operand; + if (token is TypeReference) + MarkType ((TypeReference) token); + else if (token is MethodReference) + MarkMethod ((MethodReference) token); + else + MarkField ((FieldReference) token); + break; + case OperandType.InlineType: + MarkType ((TypeReference) instruction.Operand); + break; + default: + break; + } + } + + protected virtual void HandleUnresolvedType (TypeReference reference) + { + if (!_context.IgnoreUnresolved) { + throw new ResolutionException (reference); + } + } + + protected virtual void HandleUnresolvedMethod (MethodReference reference) + { + if (!_context.IgnoreUnresolved) { + throw new ResolutionException (reference); + } + } + + protected virtual void HandleUnresolvedField (FieldReference reference) + { + if (!_context.IgnoreUnresolved) { + throw new ResolutionException (reference); + } + } + + protected virtual bool ShouldMarkInterfaceImplementation (TypeDefinition type, InterfaceImplementation iface, TypeDefinition resolvedInterfaceType) + { + if (Annotations.IsMarked (iface)) + return false; + + if (Annotations.IsMarked (resolvedInterfaceType)) + return true; + + if (!_context.IsOptimizationEnabled (CodeOptimizations.UnusedInterfaces)) + return true; + + // It's hard to know if a com or windows runtime interface will be needed from managed code alone, + // so as a precaution we will mark these interfaces once the type is instantiated + if (resolvedInterfaceType.IsImport || resolvedInterfaceType.IsWindowsRuntime) + return true; + + return IsFullyPreserved (type); + } + + protected virtual void MarkInterfaceImplementation (InterfaceImplementation iface) + { + MarkCustomAttributes (iface); + MarkType (iface.InterfaceType); + Annotations.Mark (iface); + } + + bool HasManuallyTrackedDependency (MethodBody methodBody) + { + return PreserveDependencyLookupStep.HasPreserveDependencyAttribute (methodBody.Method); + } + + // + // Extension point for reflection logic handling customization + // + protected virtual bool ProcessReflectionDependency (MethodBody body, Instruction instruction) + { + return false; + } + + // + // Tries to mark additional dependencies used in reflection like calls (e.g. typeof (MyClass).GetField ("fname")) + // + protected virtual void MarkReflectionLikeDependencies (MethodBody body) + { + if (HasManuallyTrackedDependency (body)) + return; + + var instructions = body.Instructions; + ReflectionPatternDetector detector = new ReflectionPatternDetector (this, body.Method); + + // + // Starting at 1 because all patterns require at least 1 instruction backward lookup + // + for (var i = 1; i < instructions.Count; i++) { + var instruction = instructions [i]; + + if (instruction.OpCode != OpCodes.Call && instruction.OpCode != OpCodes.Callvirt) + continue; + + if (ProcessReflectionDependency (body, instruction)) + continue; + + if (!(instruction.Operand is MethodReference methodCalled)) + continue; + + var methodCalledDefinition = methodCalled.Resolve (); + if (methodCalledDefinition is null) + continue; + + ReflectionPatternContext reflectionContext = new ReflectionPatternContext (_context, body.Method, methodCalledDefinition, i); + try { + detector.Process (ref reflectionContext); + } finally { + reflectionContext.Dispose (); + } + } + } + + /// + /// Helper struct to pass around context information about reflection pattern + /// as a single parameter (and have a way to extend this in the future if we need to easily). + /// Also implements a simple validation mechanism to check that the code does report patter recognition + /// results for all methods it works on. + /// The promise of the pattern recorder is that for a given reflection method, it will either not talk + /// about it ever, or it will always report recognized/unrecognized. + /// + struct ReflectionPatternContext : IDisposable { + readonly LinkContext _context; +#if DEBUG + bool _patternAnalysisAttempted; + bool _patternReported; +#endif + + public MethodDefinition MethodCalling { get; private set; } + public MethodDefinition MethodCalled { get; private set; } + public int InstructionIndex { get; private set; } + + public ReflectionPatternContext (LinkContext context, MethodDefinition methodCalling, MethodDefinition methodCalled, int instructionIndex) + { + _context = context; + MethodCalling = methodCalling; + MethodCalled = methodCalled; + InstructionIndex = instructionIndex; + +#if DEBUG + _patternAnalysisAttempted = false; + _patternReported = false; +#endif + } + + [Conditional ("DEBUG")] + public void AnalyzingPattern () + { +#if DEBUG + _patternAnalysisAttempted = true; +#endif + } + + public void RecordRecognizedPattern (T accessedItem, Action mark) + where T : IMemberDefinition + { +#if DEBUG + Debug.Assert (_patternAnalysisAttempted, "To correctly report all patterns, when starting to analyze a pattern the AnalyzingPattern must be called first."); + _patternReported = true; +#endif + + _context.Tracer.Push ($"Reflection-{accessedItem}"); + try { + mark (); + _context.ReflectionPatternRecorder.RecognizedReflectionAccessPattern (MethodCalling, MethodCalled, accessedItem); + } finally { + _context.Tracer.Pop (); + } + } + + public void RecordUnrecognizedPattern (string message) + { +#if DEBUG + Debug.Assert (_patternAnalysisAttempted, "To correctly report all patterns, when starting to analyze a pattern the AnalyzingPattern must be called first."); + _patternReported = true; +#endif + + _context.ReflectionPatternRecorder.UnrecognizedReflectionAccessPattern (MethodCalling, MethodCalled, message); + } + + public void Dispose () + { +#if DEBUG + Debug.Assert (!_patternAnalysisAttempted || _patternReported, "A reflection pattern was analyzed, but no result was reported."); +#endif + } + } + + class ReflectionPatternDetector { + readonly MarkStep _markStep; + readonly MethodDefinition _methodCalling; + readonly Collection _instructions; + + public ReflectionPatternDetector (MarkStep markStep, MethodDefinition callingMethod) + { + _markStep = markStep; + _methodCalling = callingMethod; + _instructions = _methodCalling.Body.Instructions; + } + + public void Process (ref ReflectionPatternContext reflectionContext) + { + var methodCalled = reflectionContext.MethodCalled; + var instructionIndex = reflectionContext.InstructionIndex; + var methodCalledType = methodCalled.DeclaringType; + + switch (methodCalledType.Name) { + // + // System.Type + // + case "Type" when methodCalledType.Namespace == "System": + + // Some of the overloads are implemented by calling another overload of the same name. + // These "internal" calls are not interesting to analyze, the outermost call is the one + // which needs to be analyzed. The assumption is that all overloads have the same semantics. + // (for example that all overload of GetConstructor if used require the specified type to have a .ctor). + if (_methodCalling.DeclaringType == methodCalled.DeclaringType && _methodCalling.Name == methodCalled.Name) + break; + + switch (methodCalled.Name) { + // + // GetConstructor (Type []) + // GetConstructor (BindingFlags, Binder, Type [], ParameterModifier []) + // GetConstructor (BindingFlags, Binder, CallingConventions, Type [], ParameterModifier []) + // + case "GetConstructor": + if (!methodCalled.IsStatic) + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Constructor, instructionIndex - 1); + + break; + + // + // GetMethod (string) + // GetMethod (string, BindingFlags) + // GetMethod (string, Type[]) + // GetMethod (string, Type[], ParameterModifier[]) + // GetMethod (string, BindingFlags, Binder, Type[], ParameterModifier[]) + // GetMethod (string, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[]) + // + // TODO: .NET Core extensions + // GetMethod (string, int, Type[]) + // GetMethod (string, int, Type[], ParameterModifier[]?) + // GetMethod (string, int, BindingFlags, Binder?, Type[], ParameterModifier[]?) + // GetMethod (string, int, BindingFlags, Binder?, CallingConventions, Type[], ParameterModifier[]?) + // + case "GetMethod": + if (!methodCalled.IsStatic) + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Method, instructionIndex - 1); + + break; + + // + // GetField (string) + // GetField (string, BindingFlags) + // + case "GetField": + if (!methodCalled.IsStatic) + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Field, instructionIndex - 1); + + break; + + // + // GetEvent (string) + // GetEvent (string, BindingFlags) + // + case "GetEvent": + if (!methodCalled.IsStatic) + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Event, instructionIndex - 1); + + break; + + // + // GetProperty (string) + // GetProperty (string, BindingFlags) + // GetProperty (string, Type) + // GetProperty (string, Type[]) + // GetProperty (string, Type, Type[]) + // GetProperty (string, Type, Type[], ParameterModifier[]) + // GetProperty (string, BindingFlags, Binder, Type, Type[], ParameterModifier[]) + // + case "GetProperty": + if (!methodCalled.IsStatic) + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Property, instructionIndex - 1); + + break; + + // + // GetType (string) + // GetType (string, Boolean) + // GetType (string, Boolean, Boolean) + // GetType (string, Func, Func) + // GetType (string, Func, Func, Boolean) + // GetType (string, Func, Func, Boolean, Boolean) + // + case "GetType": + if (!methodCalled.IsStatic) { + break; + } else { + reflectionContext.AnalyzingPattern (); + + var first_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, methodCalled.Parameters.Count); + if (first_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + break; + } + + // + // The next value must be string constant (we don't handle anything else) + // + var first_arg = _instructions [first_arg_instr]; + if (first_arg.OpCode != OpCodes.Ldstr) { + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with argument which cannot be analyzed"); + break; + } + + string typeName = (string) first_arg.Operand; + TypeDefinition foundType = _markStep.ResolveFullyQualifiedTypeName (typeName); + if (foundType is null) { + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with type name `{typeName}` which can't be resolved."); + break; + } + + reflectionContext.RecordRecognizedPattern (foundType, () => _markStep.MarkType (foundType)); + } + break; + } + + break; + + // + // System.Linq.Expressions.Expression + // + case "Expression" when methodCalledType.Namespace == "System.Linq.Expressions": + Instruction second_argument; + TypeDefinition declaringType; + + if (!methodCalled.IsStatic) + break; + + switch (methodCalled.Name) { + + // + // static Call (Type, String, Type[], Expression[]) + // + case "Call": { + reflectionContext.AnalyzingPattern (); + + var first_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, 4); + if (first_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + break; + } + + var first_arg = _instructions [first_arg_instr]; + if (first_arg.OpCode == OpCodes.Ldtoken) + first_arg_instr++; + + declaringType = FindReflectionTypeForLookup (_instructions, first_arg_instr); + if (declaringType is null) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with 1st argument which cannot be analyzed"); + break; + } + + var second_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, 3); + second_argument = _instructions [second_arg_instr]; + if (second_argument.OpCode != OpCodes.Ldstr) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with 2nd argument which cannot be analyzed"); + break; + } + + var name = (string) second_argument.Operand; + + MarkMethodsFromReflectionCall (ref reflectionContext, declaringType, name, null, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + } + + break; + + // + // static Property(Expression, Type, String) + // static Field (Expression, Type, String) + // + case "Property": + case "Field": { + reflectionContext.AnalyzingPattern (); + + var second_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, 2); + if (second_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + break; + } + + var second_arg = _instructions [second_arg_instr]; + if (second_arg.OpCode == OpCodes.Ldtoken) + second_arg_instr++; + + declaringType = FindReflectionTypeForLookup (_instructions, second_arg_instr); + if (declaringType is null) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with 2nd argument which cannot be analyzed"); + break; + } + + var third_arg_inst = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, 1); + var third_argument = _instructions [third_arg_inst]; + if (third_argument.OpCode != OpCodes.Ldstr) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with the 3rd argument which cannot be analyzed"); + break; + } + + var name = (string) third_argument.Operand; + + // + // The first argument can be any expression but we are looking only for simple null + // which we can convert to static only field lookup + // + var first_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, 3); + bool staticOnly = false; + + if (first_arg_instr >= 0) { + var first_arg = _instructions [first_arg_instr]; + if (first_arg.OpCode == OpCodes.Ldnull) + staticOnly = true; + } + + if (methodCalled.Name [0] == 'P') + MarkPropertiesFromReflectionCall (ref reflectionContext, declaringType, name, staticOnly); + else + MarkFieldsFromReflectionCall (ref reflectionContext, declaringType, name, staticOnly); + } + + break; + + // + // static New (Type) + // + case "New": { + reflectionContext.AnalyzingPattern (); + + var first_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, 1); + if (first_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + break; + } + + var first_arg = _instructions [first_arg_instr]; + if (first_arg.OpCode == OpCodes.Ldtoken) + first_arg_instr++; + + declaringType = FindReflectionTypeForLookup (_instructions, first_arg_instr); + if (declaringType is null) { + reflectionContext.RecordUnrecognizedPattern ($"Expression call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with 1st argument which cannot be analyzed"); + break; + } + + MarkMethodsFromReflectionCall (ref reflectionContext, declaringType, ".ctor", 0, BindingFlags.Instance, parametersCount: 0); + } + break; + } + + break; + + // + // System.Reflection.RuntimeReflectionExtensions + // + case "RuntimeReflectionExtensions" when methodCalledType.Namespace == "System.Reflection": + switch (methodCalled.Name) { + // + // static GetRuntimeField (this Type type, string name) + // + case "GetRuntimeField": + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Field, instructionIndex - 1, thisExtension: true); + break; + + // + // static GetRuntimeMethod (this Type type, string name, Type[] parameters) + // + case "GetRuntimeMethod": + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Method, instructionIndex - 1, thisExtension: true); + break; + + // + // static GetRuntimeProperty (this Type type, string name) + // + case "GetRuntimeProperty": + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Property, instructionIndex - 1, thisExtension: true); + break; + + // + // static GetRuntimeEvent (this Type type, string name) + // + case "GetRuntimeEvent": + ProcessSystemTypeGetMemberLikeCall (ref reflectionContext, System.Reflection.MemberTypes.Event, instructionIndex - 1, thisExtension: true); + break; + } + + break; + + // + // System.AppDomain + // + case "AppDomain" when methodCalledType.Namespace == "System": + // + // CreateInstance (string assemblyName, string typeName) + // CreateInstance (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes) + // CreateInstance (string assemblyName, string typeName, object? []? activationAttributes) + // + // CreateInstanceAndUnwrap (string assemblyName, string typeName) + // CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes) + // CreateInstanceAndUnwrap (string assemblyName, string typeName, object? []? activationAttributes) + // + // CreateInstanceFrom (string assemblyFile, string typeName) + // CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes) + // CreateInstanceFrom (string assemblyFile, string typeName, object? []? activationAttributes) + // + // CreateInstanceFromAndUnwrap (string assemblyFile, string typeName) + // CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes) + // CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, object? []? activationAttributes) + // + switch (methodCalled.Name) { + case "CreateInstance": + case "CreateInstanceAndUnwrap": + case "CreateInstanceFrom": + case "CreateInstanceFromAndUnwrap": + ProcessActivatorCallWithStrings (ref reflectionContext, instructionIndex - 1, methodCalled.Parameters.Count < 4); + break; + } + + break; + + // + // System.Reflection.Assembly + // + case "Assembly" when methodCalledType.Namespace == "System.Reflection": + // + // CreateInstance (string typeName) + // CreateInstance (string typeName, bool ignoreCase) + // CreateInstance (string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder? binder, object []? args, CultureInfo? culture, object []? activationAttributes) + // + if (methodCalled.Name == "CreateInstance") { + // + // TODO: This could be supported for `this` only calls + // + reflectionContext.AnalyzingPattern (); + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' is not yet supported"); + break; + } + + break; + + // + // System.Activator + // + case "Activator" when methodCalledType.Namespace == "System": + if (!methodCalled.IsStatic) + break; + + switch (methodCalled.Name) { + // + // static T CreateInstance () + // + case "CreateInstance" when methodCalled.ContainsGenericParameter: + // Not sure it's worth implementing as we cannot expant T and simple cases can be rewritten + reflectionContext.AnalyzingPattern (); + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' is not supported"); + break; + + // + // static CreateInstance (string assemblyName, string typeName) + // static CreateInstance (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes) + // static CreateInstance (string assemblyName, string typeName, object?[]? activationAttributes) + // + // static CreateInstance (System.Type type) + // static CreateInstance (System.Type type, bool nonPublic) + // static CreateInstance (System.Type type, params object?[]? args) + // static CreateInstance (System.Type type, object?[]? args, object?[]? activationAttributes) + // static CreateInstance (System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture) + // static CreateInstance (System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes) { throw null; } + // + case "CreateInstance": { + reflectionContext.AnalyzingPattern (); + + var parameters = methodCalled.Parameters; + if (parameters.Count < 1) + break; + + if (parameters [0].ParameterType.MetadataType == MetadataType.String) { + ProcessActivatorCallWithStrings (ref reflectionContext, instructionIndex - 1, parameters.Count < 4); + break; + } + + var first_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, methodCalled.Parameters.Count); + if (first_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + break; + } + + if (parameters [0].ParameterType.IsTypeOf ("System", "Type")) { + declaringType = FindReflectionTypeForLookup (_instructions, first_arg_instr + 1); + if (declaringType is null) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{methodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with 1st argument expression which cannot be analyzed"); + break; + } + + BindingFlags bindingFlags = BindingFlags.Instance; + int? parametersCount = null; + + if (methodCalled.Parameters.Count == 1) { + parametersCount = 0; + } else { + var second_arg_instr = GetInstructionAtStackDepth (_instructions, instructionIndex - 1, methodCalled.Parameters.Count - 1); + second_argument = _instructions [second_arg_instr]; + switch (second_argument.OpCode.Code) { + case Code.Ldc_I4_0 when parameters [1].ParameterType.MetadataType == MetadataType.Boolean: + parametersCount = 0; + bindingFlags |= BindingFlags.Public; + break; + case Code.Ldc_I4_1 when parameters [1].ParameterType.MetadataType == MetadataType.Boolean: + parametersCount = 0; + break; + case Code.Ldc_I4_S when parameters [1].ParameterType.IsTypeOf ("System.Reflection", "BindingFlags"): + bindingFlags = (BindingFlags) (sbyte) second_argument.Operand; + break; + } + } + + MarkMethodsFromReflectionCall (ref reflectionContext, declaringType, ".ctor", 0, bindingFlags, parametersCount); + break; + } + } + + break; + + // + // static CreateInstanceFrom (string assemblyFile, string typeName) + // static CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes) + // static CreateInstanceFrom (string assemblyFile, string typeName, object? []? activationAttributes) + // + case "CreateInstanceFrom": + ProcessActivatorCallWithStrings (ref reflectionContext, instructionIndex - 1, methodCalled.Parameters.Count < 4); + break; + } + + break; + } + + } + + // + // Handles static method calls in form of Create (string assemblyFile, string typeName, ......) + // + void ProcessActivatorCallWithStrings (ref ReflectionPatternContext reflectionContext, int startIndex, bool defaultCtorOnly) + { + reflectionContext.AnalyzingPattern (); + + var parameters = reflectionContext.MethodCalled.Parameters; + if (parameters.Count < 2) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' is not supported"); + return; + } + + if (parameters [0].ParameterType.MetadataType != MetadataType.String && parameters [1].ParameterType.MetadataType != MetadataType.String) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' is not supported"); + return; + } + + var first_arg_instr = GetInstructionAtStackDepth (_instructions, startIndex, reflectionContext.MethodCalled.Parameters.Count); + if (first_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + return; + } + + var first_arg = _instructions [first_arg_instr]; + if (first_arg.OpCode != OpCodes.Ldstr) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with the 1st argument which cannot be analyzed"); + return; + } + + var second_arg_instr = GetInstructionAtStackDepth (_instructions, startIndex, reflectionContext.MethodCalled.Parameters.Count - 1); + if (second_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + return; + } + + var second_arg = _instructions [second_arg_instr]; + if (second_arg.OpCode != OpCodes.Ldstr) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with the 2nd argument which cannot be analyzed"); + return; + } + + string assembly_name = (string) first_arg.Operand; + if (!_markStep._context.Resolver.AssemblyCache.TryGetValue (assembly_name, out var assembly)) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' references assembly '{assembly_name}' which could not be found"); + return; + } + + string type_name = (string) second_arg.Operand; + var declaringType = FindType (assembly, type_name); + + if (declaringType is null) { + reflectionContext.RecordUnrecognizedPattern ($"Activator call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' references type '{type_name}' which could not be found"); + return; + } + + MarkMethodsFromReflectionCall (ref reflectionContext, declaringType, ".ctor", 0, null, defaultCtorOnly ? 0 : (int?) null); + } + + // + // Handles instance methods called over typeof (Foo) with string name as the first argument + // + void ProcessSystemTypeGetMemberLikeCall (ref ReflectionPatternContext reflectionContext, System.Reflection.MemberTypes memberTypes, int startIndex, bool thisExtension = false) + { + reflectionContext.AnalyzingPattern (); + + int first_instance_arg = reflectionContext.MethodCalled.Parameters.Count; + if (thisExtension) + --first_instance_arg; + + var first_arg_instr = GetInstructionAtStackDepth (_instructions, startIndex, first_instance_arg); + if (first_arg_instr < 0) { + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' couldn't be decomposed"); + return; + } + + var first_arg = _instructions [first_arg_instr]; + BindingFlags? bindingFlags = default; + string name = default; + + if (memberTypes == System.Reflection.MemberTypes.Constructor) { + if (first_arg.OpCode == OpCodes.Ldc_I4_S && reflectionContext.MethodCalled.Parameters.Count > 0 && reflectionContext.MethodCalled.Parameters [0].ParameterType.IsTypeOf ("System.Reflection", "BindingFlags")) { + bindingFlags = (BindingFlags) (sbyte) first_arg.Operand; + } + } else { + // + // The next value must be string constant (we don't handle anything else) + // + if (first_arg.OpCode != OpCodes.Ldstr) { + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' was detected with argument which cannot be analyzed"); + return; + } + + name = (string) first_arg.Operand; + + var pos_arg = _instructions [first_arg_instr + 1]; + if (pos_arg.OpCode == OpCodes.Ldc_I4_S && reflectionContext.MethodCalled.Parameters.Count > 1 && reflectionContext.MethodCalled.Parameters [1].ParameterType.IsTypeOf ("System.Reflection", "BindingFlags")) { + bindingFlags = (BindingFlags) (sbyte) pos_arg.Operand; + } + } + + var declaringType = FindReflectionTypeForLookup (_instructions, first_arg_instr - 1); + if (declaringType is null) { + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' does not use detectable instance type extraction"); + return; + } + + switch (memberTypes) { + case System.Reflection.MemberTypes.Constructor: + MarkMethodsFromReflectionCall (ref reflectionContext, declaringType, ".ctor", 0, bindingFlags); + break; + case System.Reflection.MemberTypes.Method: + MarkMethodsFromReflectionCall (ref reflectionContext, declaringType, name, 0, bindingFlags); + break; + case System.Reflection.MemberTypes.Field: + MarkFieldsFromReflectionCall (ref reflectionContext, declaringType, name); + break; + case System.Reflection.MemberTypes.Property: + MarkPropertiesFromReflectionCall (ref reflectionContext, declaringType, name); + break; + case System.Reflection.MemberTypes.Event: + MarkEventsFromReflectionCall (ref reflectionContext, declaringType, name); + break; + default: + Debug.Fail ("Unsupported member type"); + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{_methodCalling.FullName}' is of unexpected member type."); + break; + } + } + + // + // arity is null for name match regardless of arity + // + void MarkMethodsFromReflectionCall (ref ReflectionPatternContext reflectionContext, TypeDefinition declaringType, string name, int? arity, BindingFlags? bindingFlags, int? parametersCount = null) + { + bool foundMatch = false; + foreach (var method in declaringType.Methods) { + var mname = method.Name; + + // Either exact match or generic method with any arity when unspecified + if (mname != name && !(arity is null && mname.StartsWith (name, StringComparison.Ordinal) && mname.Length > name.Length + 2 && mname [name.Length + 1] == '`')) { + continue; + } + + if ((bindingFlags & (BindingFlags.Instance | BindingFlags.Static)) == BindingFlags.Static && !method.IsStatic) + continue; + + if ((bindingFlags & (BindingFlags.Instance | BindingFlags.Static)) == BindingFlags.Instance && method.IsStatic) + continue; + + if ((bindingFlags & (BindingFlags.Public | BindingFlags.NonPublic)) == BindingFlags.Public && !method.IsPublic) + continue; + + if ((bindingFlags & (BindingFlags.Public | BindingFlags.NonPublic)) == BindingFlags.NonPublic && method.IsPublic) + continue; + + if (parametersCount is not null && parametersCount != method.Parameters.Count) + continue; + + foundMatch = true; + reflectionContext.RecordRecognizedPattern (method, () => _markStep.MarkIndirectlyCalledMethod (method)); + } + + if (!foundMatch) + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{reflectionContext.MethodCalling.FullName}' could not resolve method `{name}` on type `{declaringType.FullName}`."); + } + + void MarkPropertiesFromReflectionCall (ref ReflectionPatternContext reflectionContext, TypeDefinition declaringType, string name, bool staticOnly = false) + { + bool foundMatch = false; + foreach (var property in declaringType.Properties) { + if (property.Name != name) + continue; + + bool markedAny = false; + + // It is not easy to reliably detect in the IL code whether the getter or setter (or both) are used. + // Be conservative and mark everything for the property. + var getter = property.GetMethod; + if (getter is not null && (!staticOnly || staticOnly && getter.IsStatic)) { + reflectionContext.RecordRecognizedPattern (getter, () => _markStep.MarkIndirectlyCalledMethod (getter)); + markedAny = true; + } + + var setter = property.SetMethod; + if (setter is not null && (!staticOnly || staticOnly && setter.IsStatic)) { + reflectionContext.RecordRecognizedPattern (setter, () => _markStep.MarkIndirectlyCalledMethod (setter)); + markedAny = true; + } + + if (markedAny) { + foundMatch = true; + reflectionContext.RecordRecognizedPattern (property, () => _markStep.MarkProperty (property)); + } + } + + if (!foundMatch) + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{reflectionContext.MethodCalling.FullName}' could not resolve property `{name}` on type `{declaringType.FullName}`."); + } + + void MarkFieldsFromReflectionCall (ref ReflectionPatternContext reflectionContext, TypeDefinition declaringType, string name, bool staticOnly = false) + { + bool foundMatch = false; + foreach (var field in declaringType.Fields) { + if (field.Name != name) + continue; + + if (staticOnly && !field.IsStatic) + continue; + + foundMatch = true; + reflectionContext.RecordRecognizedPattern (field, () => _markStep.MarkField (field)); + break; + } + + if (!foundMatch) + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{reflectionContext.MethodCalling.FullName}' could not resolve field `{name}` on type `{declaringType.FullName}`."); + } + + void MarkEventsFromReflectionCall (ref ReflectionPatternContext reflectionContext, TypeDefinition declaringType, string name) + { + bool foundMatch = false; + foreach (var eventInfo in declaringType.Events) { + if (eventInfo.Name != name) + continue; + + foundMatch = true; + reflectionContext.RecordRecognizedPattern (eventInfo, () => _markStep.MarkEvent (eventInfo)); + } + + if (!foundMatch) + reflectionContext.RecordUnrecognizedPattern ($"Reflection call '{reflectionContext.MethodCalled.FullName}' inside '{reflectionContext.MethodCalling.FullName}' could not resolve event `{name}` on type `{declaringType.FullName}`."); + } + } + + static int GetInstructionAtStackDepth (Collection instructions, int startIndex, int stackSizeToBacktrace) + { + for (int i = startIndex; i >= 0; --i) { + var instruction = instructions [i]; + + switch (instruction.OpCode.StackBehaviourPop) { + case StackBehaviour.Pop0: + break; + case StackBehaviour.Pop1: + case StackBehaviour.Popi: + case StackBehaviour.Popref: + stackSizeToBacktrace++; + break; + case StackBehaviour.Pop1_pop1: + case StackBehaviour.Popi_pop1: + case StackBehaviour.Popi_popi: + case StackBehaviour.Popi_popi8: + case StackBehaviour.Popi_popr4: + case StackBehaviour.Popi_popr8: + case StackBehaviour.Popref_pop1: + case StackBehaviour.Popref_popi: + stackSizeToBacktrace += 2; + break; + case StackBehaviour.Popref_popi_popi: + case StackBehaviour.Popref_popi_popi8: + case StackBehaviour.Popref_popi_popr4: + case StackBehaviour.Popref_popi_popr8: + case StackBehaviour.Popref_popi_popref: + stackSizeToBacktrace += 3; + break; + case StackBehaviour.Varpop: + switch (instruction.OpCode.Code) { + case Code.Call: + case Code.Calli: + case Code.Callvirt: + if (instruction.Operand is MethodReference mr) { + stackSizeToBacktrace += mr.Parameters.Count; + if (mr.Resolve ()?.IsStatic == false) + stackSizeToBacktrace++; + } + + break; + case Code.Newobj: + if (instruction.Operand is MethodReference ctor) { + stackSizeToBacktrace += ctor.Parameters.Count; + } + break; + case Code.Ret: + // TODO: Need method return type for correct stack size but this path should not be hit yet + break; + default: + return -3; + } + break; + } + + switch (instruction.OpCode.StackBehaviourPush) { + case StackBehaviour.Push0: + break; + case StackBehaviour.Push1: + case StackBehaviour.Pushi: + case StackBehaviour.Pushi8: + case StackBehaviour.Pushr4: + case StackBehaviour.Pushr8: + case StackBehaviour.Pushref: + stackSizeToBacktrace--; + break; + case StackBehaviour.Push1_push1: + stackSizeToBacktrace -= 2; + break; + case StackBehaviour.Varpush: + // + // Only call, calli, callvirt will hit this + // + if (instruction.Operand is MethodReference mr && mr.ReturnType.MetadataType != MetadataType.Void) { + stackSizeToBacktrace--; + } + break; + } + + if (stackSizeToBacktrace == 0) + return i; + + if (stackSizeToBacktrace < 0) + return -1; + } + + return -2; + } + + static TypeDefinition FindReflectionTypeForLookup (Collection instructions, int startIndex) + { + while (startIndex >= 1) { + int storeIndex = -1; + var instruction = instructions [startIndex]; + switch (instruction.OpCode.Code) { + // + // Pattern #1 + // + // typeof (Foo).ReflectionCall () + // + case Code.Call: + if (!(instruction.Operand is MethodReference mr) || mr.Name != "GetTypeFromHandle") + return null; + + var ldtoken = instructions [startIndex - 1]; + + if (ldtoken.OpCode != OpCodes.Ldtoken) + return null; + + return (ldtoken.Operand as TypeReference).Resolve (); + + // + // Patern #2 + // + // var temp = typeof (Foo); + // temp.ReflectionCall () + // + case Code.Ldloc_0: + storeIndex = GetIndexOfInstruction (instructions, OpCodes.Stloc_0, startIndex - 1); + startIndex = storeIndex - 1; + break; + case Code.Ldloc_1: + storeIndex = GetIndexOfInstruction (instructions, OpCodes.Stloc_1, startIndex - 1); + startIndex = storeIndex - 1; + break; + case Code.Ldloc_2: + storeIndex = GetIndexOfInstruction (instructions, OpCodes.Stloc_2, startIndex - 1); + startIndex = storeIndex - 1; + break; + case Code.Ldloc_3: + storeIndex = GetIndexOfInstruction (instructions, OpCodes.Stloc_3, startIndex - 1); + startIndex = storeIndex - 1; + break; + case Code.Ldloc_S: + storeIndex = GetIndexOfInstruction (instructions, OpCodes.Stloc_S, startIndex - 1, l => (VariableReference) l.Operand == (VariableReference) instruction.Operand); + startIndex = storeIndex - 1; + break; + case Code.Ldloc: + storeIndex = GetIndexOfInstruction (instructions, OpCodes.Stloc, startIndex - 1, l => (VariableReference) l.Operand == (VariableReference) instruction.Operand); + startIndex = storeIndex - 1; + break; + + case Code.Nop: + startIndex--; + break; + + default: + return null; + } + } + + return null; + } + + static int GetIndexOfInstruction (Collection instructions, OpCode opcode, int startIndex, Predicate comparer = null) + { + while (startIndex >= 0) { + var instr = instructions [startIndex]; + if (instr.OpCode == opcode && (comparer is null || comparer (instr))) + return startIndex; + + startIndex--; + } + + return -1; + } + + protected class AttributeProviderPair { + public AttributeProviderPair (CustomAttribute attribute, ICustomAttributeProvider provider) + { + Attribute = attribute; + Provider = provider; + } + + public CustomAttribute Attribute { get; private set; } + public ICustomAttributeProvider Provider { get; private set; } + } + } + + // Make our own copy of the BindingFlags enum, so that we don't depend on System.Reflection. + [Flags] + enum BindingFlags { + Default = 0, + IgnoreCase = 1, + DeclaredOnly = 2, + Instance = 4, + Static = 8, + Public = 16, + NonPublic = 32, + FlattenHierarchy = 64, + InvokeMethod = 256, + CreateInstance = 512, + GetField = 1024, + SetField = 2048, + GetProperty = 4096, + SetProperty = 8192, + PutDispProperty = 16384, + PutRefDispProperty = 32768, + ExactBinding = 65536, + SuppressChangeType = 131072, + OptionalParamBinding = 262144, + IgnoreReturn = 16777216 + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/OutputStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/OutputStep.cs new file mode 100644 index 000000000000..d4e52806c53d --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/OutputStep.cs @@ -0,0 +1,301 @@ +// +// OutputStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.PE; + +namespace Mono.Linker.Steps { + + public class OutputStep : BaseStep { + private static Dictionary architectureMap; + + private enum NativeOSOverride { + Apple = 0x4644, + FreeBSD = 0xadc4, + Linux = 0x7b79, + NetBSD = 0x1993, + Default = 0 + } + + List assembliesWritten; + + public OutputStep () + { + assembliesWritten = new List (); + } + + static TargetArchitecture CalculateArchitecture (TargetArchitecture readyToRunArch) + { + if (architectureMap is null) { + architectureMap = new Dictionary (); + foreach (var os in Enum.GetValues (typeof (NativeOSOverride))) { + ushort osVal = (ushort) (NativeOSOverride) os; + foreach (var arch in Enum.GetValues (typeof (TargetArchitecture))) { + ushort archVal = (ushort) (TargetArchitecture) arch; + architectureMap.Add ((ushort) (archVal ^ osVal), (TargetArchitecture) arch); + } + } + } + + TargetArchitecture pureILArch; + if (architectureMap.TryGetValue ((ushort) readyToRunArch, out pureILArch)) { + return pureILArch; + } + throw new BadImageFormatException ("unrecognized module attributes"); + } + + protected override void Process () + { + CheckOutputDirectory (); + Tracer.Finish (); + } + + protected override void EndProcess () + { + if (Context.AssemblyListFile is not null) { + using (var w = File.CreateText (Context.AssemblyListFile)) { + w.WriteLine ("[" + String.Join (", ", assembliesWritten.Select (a => "\"" + a + "\"").ToArray ()) + "]"); + } + } + } + + void CheckOutputDirectory () + { + if (Directory.Exists (Context.OutputDirectory)) + return; + + Directory.CreateDirectory (Context.OutputDirectory); + } + + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + OutputAssembly (assembly); + } + + protected void WriteAssembly (AssemblyDefinition assembly, string directory) + { + WriteAssembly (assembly, directory, SaveSymbols (assembly)); + } + + protected virtual void WriteAssembly (AssemblyDefinition assembly, string directory, WriterParameters writerParameters) + { + foreach (var module in assembly.Modules) { + // Write back pure IL even for crossgen-ed assemblies + if (module.IsCrossgened ()) { + module.Attributes |= ModuleAttributes.ILOnly; + module.Attributes ^= ModuleAttributes.ILLibrary; + module.Architecture = CalculateArchitecture (module.Architecture); + } + } + + string outputName = GetAssemblyFileName (assembly, directory); + try { + assembly.Write (outputName, writerParameters); + } catch (Exception e) { + throw new OutputException ($"Failed to write '{outputName}", e); + } + } + + void OutputAssembly (AssemblyDefinition assembly) + { + string directory = Context.OutputDirectory; + + CopyConfigFileIfNeeded (assembly, directory); + + var action = Annotations.GetAction (assembly); + Context.LogMessage (MessageImportance.Low, $"Output action: {action,8} assembly: {assembly}"); + + switch (action) { + case AssemblyAction.Save: + case AssemblyAction.Link: + case AssemblyAction.AddBypassNGen: + Context.Tracer.AddDependency (assembly); + WriteAssembly (assembly, directory); + CopySatelliteAssembliesIfNeeded (assembly, directory); + assembliesWritten.Add (GetOriginalAssemblyFileInfo (assembly).Name); + break; + case AssemblyAction.Copy: + Context.Tracer.AddDependency (assembly); + CloseSymbols (assembly); + CopyAssembly (assembly, directory); + CopySatelliteAssembliesIfNeeded (assembly, directory); + assembliesWritten.Add (GetOriginalAssemblyFileInfo (assembly).Name); + break; + case AssemblyAction.Delete: + CloseSymbols (assembly); + DeleteAssembly (assembly, directory); + break; + default: + CloseSymbols (assembly); + break; + } + } + + protected virtual void DeleteAssembly (AssemblyDefinition assembly, string directory) + { + var target = GetAssemblyFileName (assembly, directory); + if (File.Exists (target)) { + File.Delete (target); + File.Delete (target + ".mdb"); + File.Delete (Path.ChangeExtension (target, "pdb")); + File.Delete (GetConfigFile (target)); + } + } + + void CloseSymbols (AssemblyDefinition assembly) + { + Annotations.CloseSymbolReader (assembly); + } + + WriterParameters SaveSymbols (AssemblyDefinition assembly) + { + var parameters = new WriterParameters { + DeterministicMvid = Context.DeterministicOutput + }; + + if (!Context.LinkSymbols) + return parameters; + + if (!assembly.MainModule.HasSymbols) + return parameters; + + // Use a string check to avoid a hard dependency on Mono.Cecil.Pdb + if (Environment.OSVersion.Platform != PlatformID.Win32NT && assembly.MainModule.SymbolReader.GetType ().FullName == "Mono.Cecil.Pdb.NativePdbReader") + return parameters; + + if (Context.SymbolWriterProvider is not null) + parameters.SymbolWriterProvider = Context.SymbolWriterProvider; + else + parameters.WriteSymbols = true; + return parameters; + } + + + void CopySatelliteAssembliesIfNeeded (AssemblyDefinition assembly, string directory) + { + if (!Annotations.ProcessSatelliteAssemblies) + return; + + FileInfo original = GetOriginalAssemblyFileInfo (assembly); + string resourceFile = GetAssemblyResourceFileName (original.FullName); + + foreach (var subDirectory in Directory.EnumerateDirectories (original.DirectoryName)) { + var satelliteAssembly = Path.Combine (subDirectory, resourceFile); + if (!File.Exists (satelliteAssembly)) + continue; + + string cultureName = subDirectory.Substring (subDirectory.LastIndexOf (Path.DirectorySeparatorChar) + 1); + string culturePath = Path.Combine (directory, cultureName); + + Directory.CreateDirectory (culturePath); + File.Copy (satelliteAssembly, Path.Combine (culturePath, resourceFile), true); + } + } + + void CopyConfigFileIfNeeded (AssemblyDefinition assembly, string directory) + { + string config = GetConfigFile (GetOriginalAssemblyFileInfo (assembly).FullName); + if (!File.Exists (config)) + return; + + string target = Path.GetFullPath (GetConfigFile (GetAssemblyFileName (assembly, directory))); + + if (config == target) + return; + + File.Copy (config, GetConfigFile (GetAssemblyFileName (assembly, directory)), true); + } + + static string GetAssemblyResourceFileName (string assembly) + { + return Path.GetFileNameWithoutExtension (assembly) + ".resources.dll"; + } + + static string GetConfigFile (string assembly) + { + return assembly + ".config"; + } + + static FileInfo GetOriginalAssemblyFileInfo (AssemblyDefinition assembly) + { + return new FileInfo (assembly.MainModule.FileName); + } + + protected virtual void CopyAssembly (AssemblyDefinition assembly, string directory) + { + // Special case. When an assembly has embedded pdbs, link symbols is not enabled, and the assembly's action is copy, + // we want to match the behavior of assemblies with the other symbol types and end up with an assembly that does not have symbols. + // In order to do that, we can't simply copy files. We need to write the assembly without symbols + if (assembly.MainModule.HasSymbols && !Context.LinkSymbols && assembly.MainModule.SymbolReader is EmbeddedPortablePdbReader) { + WriteAssembly (assembly, directory, new WriterParameters ()); + return; + } + + FileInfo fi = GetOriginalAssemblyFileInfo (assembly); + string target = Path.GetFullPath (Path.Combine (directory, fi.Name)); + string source = fi.FullName; + if (source == target) + return; + + CopyFileAndRemoveReadOnly (source, target); + + if (!Context.LinkSymbols) + return; + + var mdb = source + ".mdb"; + if (File.Exists (mdb)) + CopyFileAndRemoveReadOnly (mdb, target + ".mdb"); + + var pdb = Path.ChangeExtension (source, "pdb"); + if (File.Exists (pdb)) + CopyFileAndRemoveReadOnly (pdb, Path.ChangeExtension (target, "pdb")); + } + + static void CopyFileAndRemoveReadOnly (string src, string dest) + { + File.Copy (src, dest, true); + + System.IO.FileAttributes attrs = File.GetAttributes (dest); + + if ((attrs & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) + File.SetAttributes (dest, attrs & ~System.IO.FileAttributes.ReadOnly); + } + + protected virtual string GetAssemblyFileName (AssemblyDefinition assembly, string directory) + { + string file = GetOriginalAssemblyFileInfo (assembly).Name; + return Path.Combine (directory, file); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/PreserveDependencyLookupStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/PreserveDependencyLookupStep.cs new file mode 100644 index 000000000000..0ff917d71666 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/PreserveDependencyLookupStep.cs @@ -0,0 +1,99 @@ +// +// PreserveDependencyLookupStep.cs +// +// Author: +// Marek Safar (marek.safar@gmail.com) +// +// Copyright (C) 2018 Microsoft Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using Mono.Cecil; +using Mono.Collections.Generic; + +namespace Mono.Linker.Steps { + public class PreserveDependencyLookupStep : LoadReferencesStep { + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + var module = assembly.MainModule; + + foreach (var type in module.Types) { + if (type.HasMethods) { + foreach (var method in type.GetMethods ()) { + var md = method.Resolve (); + if (md?.HasCustomAttributes != true) + continue; + + ProcessPreserveDependencyAttribute (md.CustomAttributes); + } + } + + if (type.HasFields) { + foreach (var field in type.Fields) { + var md = field.Resolve (); + if (md?.HasCustomAttributes != true) + continue; + + ProcessPreserveDependencyAttribute (md.CustomAttributes); + } + } + } + } + + public static bool IsPreserveDependencyAttribute (TypeReference tr) + { + return tr.Name == "PreserveDependencyAttribute" && tr.Namespace == "System.Runtime.CompilerServices"; + } + + public static bool HasPreserveDependencyAttribute (MethodDefinition method) + { + if (!method.HasCustomAttributes) + return false; + + foreach (var ca in method.CustomAttributes) { + if (IsPreserveDependencyAttribute (ca.AttributeType)) + return true; + } + + return false; + } + + void ProcessPreserveDependencyAttribute (Collection attributes) + { + foreach (var ca in attributes) { + if (!IsPreserveDependencyAttribute (ca.AttributeType)) + continue; + + if (ca.ConstructorArguments.Count != 3) + continue; + + var assemblyName = ca.ConstructorArguments [2].Value as string; + if (assemblyName is null) + continue; + + var newDependency = Context.Resolve (new AssemblyNameReference (assemblyName, new Version ())); + if (newDependency is not null) + ProcessReferences (newDependency); + } + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/RegenerateGuidStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/RegenerateGuidStep.cs new file mode 100644 index 000000000000..6b2558e8352d --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/RegenerateGuidStep.cs @@ -0,0 +1,48 @@ +// +// CleanStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2008 Novell, Inc. (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; + +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class RegenerateGuidStep : BaseStep { + + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + if (Annotations.GetAction (assembly) == AssemblyAction.Link) + RegenerateGuid (assembly); + } + + static void RegenerateGuid (AssemblyDefinition asm) + { + asm.MainModule.Mvid = Guid.NewGuid (); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromAssemblyStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromAssemblyStep.cs new file mode 100644 index 000000000000..94d317e9f153 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromAssemblyStep.cs @@ -0,0 +1,249 @@ +// +// ResolveFromAssemblyStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Mono.Cecil; +using Mono.Collections.Generic; + +namespace Mono.Linker.Steps { + + public class ResolveFromAssemblyStep : ResolveStep { + + AssemblyDefinition _assembly; + string _file; + RootVisibility _rootVisibility; + + public enum RootVisibility { + Any = 0, + PublicAndFamily = 1, + PublicAndFamilyAndAssembly = 2 + } + + + public ResolveFromAssemblyStep (string assembly, RootVisibility rootVisibility = RootVisibility.Any) + { + _file = assembly; + _rootVisibility = rootVisibility; + } + + public ResolveFromAssemblyStep (AssemblyDefinition assembly) + { + _assembly = assembly; + } + + protected override void Process () + { + if (_assembly is not null) + Context.Resolver.CacheAssembly (_assembly); + + var ignoreUnresolved = Context.Resolver.IgnoreUnresolved; + if (_rootVisibility == RootVisibility.PublicAndFamily) { + Context.Resolver.IgnoreUnresolved = false; + } + + AssemblyDefinition assembly = _assembly ?? Context.Resolve (_file); + Context.Resolver.IgnoreUnresolved = ignoreUnresolved; + if (_rootVisibility != RootVisibility.Any && HasInternalsVisibleTo (assembly)) { + _rootVisibility = RootVisibility.PublicAndFamilyAndAssembly; + } + + switch (assembly.MainModule.Kind) { + case ModuleKind.Dll: + ProcessLibrary (assembly); + break; + default: + ProcessExecutable (assembly); + break; + } + } + + protected virtual void ProcessLibrary (AssemblyDefinition assembly) + { + ProcessLibrary (Context, assembly, _rootVisibility); + } + + public static void ProcessLibrary (LinkContext context, AssemblyDefinition assembly, RootVisibility rootVisibility = RootVisibility.Any) + { + var action = rootVisibility == RootVisibility.Any ? AssemblyAction.Copy : AssemblyAction.Link; + context.SetAction (assembly, action); + + context.Tracer.Push (assembly); + + foreach (TypeDefinition type in assembly.MainModule.Types) + MarkType (context, type, rootVisibility); + + if (assembly.MainModule.HasExportedTypes) { + foreach (var exported in assembly.MainModule.ExportedTypes) { + bool isForwarder = exported.IsForwarder; + var declaringType = exported.DeclaringType; + while (!isForwarder && (declaringType is not null)) { + isForwarder = declaringType.IsForwarder; + declaringType = declaringType.DeclaringType; + } + + if (!isForwarder) + continue; + TypeDefinition resolvedExportedType = exported.Resolve (); + + if (resolvedExportedType is null) { + // + // It's quite common for assemblies to have broken exported types + // + // One source of them is from native csc which added all nested types of + // type-forwarded types automatically including private ones. + // + // Next source of broken type-forwarders is from custom metadata writers which + // simply write bogus information. + // + // Both cases are bugs not on our end but we still want to link all assemblies + // especially when such types cannot be used anyway + // + context.LogMessage ($"Cannot find declaration of exported type '{exported}' from the assembly '{assembly}'"); + + continue; + } + + context.Resolve (resolvedExportedType.Scope); + MarkType (context, resolvedExportedType, rootVisibility); + context.MarkingHelpers.MarkExportedType (exported, assembly.MainModule); + } + } + + context.Tracer.Pop (); + } + + static void MarkType (LinkContext context, TypeDefinition type, RootVisibility rootVisibility) + { + bool markType; + switch (rootVisibility) { + default: + markType = true; + break; + + case RootVisibility.PublicAndFamilyAndAssembly: + markType = !type.IsNestedPrivate; + break; + + case RootVisibility.PublicAndFamily: + markType = type.IsPublic || type.IsNestedPublic || type.IsNestedFamily || type.IsNestedFamilyOrAssembly; + break; + } + + if (!markType) { + return; + } + + context.Annotations.MarkAndPush (type); + + if (type.HasFields) + MarkFields (context, type.Fields, rootVisibility); + if (type.HasMethods) + MarkMethods (context, type.Methods, rootVisibility); + if (type.HasNestedTypes) + foreach (var nested in type.NestedTypes) + MarkType (context, nested, rootVisibility); + + context.Tracer.Pop (); + } + + void ProcessExecutable (AssemblyDefinition assembly) + { + Context.SetAction (assembly, AssemblyAction.Link); + + Tracer.Push (assembly); + + Annotations.Mark (assembly.EntryPoint.DeclaringType); + + MarkMethod (Context, assembly.EntryPoint, MethodAction.Parse, RootVisibility.Any); + + Tracer.Pop (); + } + + static void MarkFields (LinkContext context, Collection fields, RootVisibility rootVisibility) + { + foreach (FieldDefinition field in fields) { + bool markField; + switch (rootVisibility) { + default: + markField = true; + break; + + case RootVisibility.PublicAndFamily: + markField = field.IsPublic || field.IsFamily || field.IsFamilyOrAssembly; + break; + + case RootVisibility.PublicAndFamilyAndAssembly: + markField = field.IsPublic || field.IsFamily || field.IsFamilyOrAssembly || field.IsAssembly || field.IsFamilyAndAssembly; + break; + } + if (markField) { + context.Annotations.Mark (field); + } + } + } + + static void MarkMethods (LinkContext context, Collection methods, RootVisibility rootVisibility) + { + foreach (MethodDefinition method in methods) + MarkMethod (context, method, MethodAction.ForceParse, rootVisibility); + } + + static void MarkMethod (LinkContext context, MethodDefinition method, MethodAction action, RootVisibility rootVisibility) + { + bool markMethod; + switch (rootVisibility) { + default: + markMethod = true; + break; + + case RootVisibility.PublicAndFamily: + markMethod = method.IsPublic || method.IsFamily || method.IsFamilyOrAssembly; + break; + + case RootVisibility.PublicAndFamilyAndAssembly: + markMethod = method.IsPublic || method.IsFamily || method.IsFamilyOrAssembly || method.IsAssembly || method.IsFamilyAndAssembly; + break; + } + + if (markMethod) { + context.Annotations.Mark (method); + context.Annotations.SetAction (method, action); + } + } + + static bool HasInternalsVisibleTo (AssemblyDefinition assembly) + { + foreach (CustomAttribute attribute in assembly.CustomAttributes) { + if (attribute.Constructor.DeclaringType.FullName == + "System.Runtime.CompilerServices.InternalsVisibleToAttribute") + return true; + } + + return false; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXApiStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXApiStep.cs new file mode 100644 index 000000000000..3d4f7099cea1 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXApiStep.cs @@ -0,0 +1,138 @@ +// +// ResolveFromXApiStep.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Xml.XPath; + +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class ResolveFromXApiStep : ResolveStep, IXApiVisitor { + + static readonly string _name = "name"; + static readonly string _ns = string.Empty; + + XPathDocument _document; + + public ResolveFromXApiStep (XPathDocument document) + { + _document = document; + } + + protected override void Process () + { + XApiReader reader = new XApiReader (_document, this); + reader.Process (Context); + } + + public void OnAssembly (XPathNavigator nav, AssemblyDefinition assembly) + { + } + + public void OnAttribute (XPathNavigator nav) + { + string name = GetName (nav); + + TypeDefinition type = Context.GetType (name); + if (type is not null) + MarkType (type); + } + + public void OnClass (XPathNavigator nav, TypeDefinition type) + { + MarkType (type); + } + + public void OnInterface (XPathNavigator nav, TypeDefinition type) + { + MarkType (type); + } + + public void OnField (XPathNavigator nav, FieldDefinition field) + { + MarkField (field); + } + + public void OnMethod (XPathNavigator nav, MethodDefinition method) + { + MarkMethod (method); + } + + public void OnConstructor (XPathNavigator nav, MethodDefinition method) + { + MarkMethod (method); + } + + public void OnProperty (XPathNavigator nav, PropertyDefinition property) + { + } + + public void OnEvent (XPathNavigator nav, EventDefinition evt) + { + if (evt.AddMethod is not null) + MarkMethod (evt.AddMethod); + if (evt.InvokeMethod is not null) + MarkMethod (evt.InvokeMethod); + if (evt.RemoveMethod is not null) + MarkMethod (evt.RemoveMethod); + } + + static string GetName (XPathNavigator nav) + { + return GetAttribute (nav, _name); + } + + static string GetAttribute (XPathNavigator nav, string attribute) + { + return nav.GetAttribute (attribute, _ns); + } + + void MarkType (TypeDefinition type) + { + InternalMark (type); + } + + void MarkField (FieldDefinition field) + { + InternalMark (field); + } + + void InternalMark (IMetadataTokenProvider provider) + { + Annotations.Mark (provider); + Annotations.SetPublic (provider); + } + + void MarkMethod (MethodDefinition method) + { + InternalMark (method); + Annotations.MarkIndirectlyCalledMethod (method); + Annotations.SetAction (method, MethodAction.Parse); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXmlStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXmlStep.cs new file mode 100644 index 000000000000..8f794173b839 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveFromXmlStep.cs @@ -0,0 +1,727 @@ +// +// ResolveFromXmlStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// (C) 2007 Novell, Inc. +// Copyright 2013 Xamarin Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.XPath; + +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class XmlResolutionException : Exception { + public XmlResolutionException (string message, Exception innerException) + : base (message, innerException) + { + } + } + + public class ResolveFromXmlStep : ResolveStep { + + static readonly string _signature = "signature"; + static readonly string _fullname = "fullname"; + static readonly string _required = "required"; + static readonly string _preserve = "preserve"; + static readonly string _accessors = "accessors"; + static readonly string _ns = string.Empty; + + static readonly string [] _accessorsAll = new string [] { "all" }; + static readonly char [] _accessorsSep = new char [] { ';' }; + + XPathDocument _document; + string _xmlDocumentLocation; + string _resourceName; + AssemblyDefinition _resourceAssembly; + + public ResolveFromXmlStep (XPathDocument document, string xmlDocumentLocation = "") + { + _document = document; + _xmlDocumentLocation = xmlDocumentLocation; + } + + public ResolveFromXmlStep (XPathDocument document, string resourceName, AssemblyDefinition resourceAssembly, string xmlDocumentLocation = "") + : this (document, xmlDocumentLocation) + { + if (string.IsNullOrEmpty (resourceName)) + throw new ArgumentNullException (nameof (resourceName)); + + if (resourceAssembly is null) + throw new ArgumentNullException (nameof (resourceAssembly)); + + _resourceName = resourceName; + _resourceAssembly = resourceAssembly; + } + + protected override void Process () + { + XPathNavigator nav = _document.CreateNavigator (); + + // This step can be created with XML files that aren't necessarily + // linker descriptor files. So bail if we don't have a element. + if (!nav.MoveToChild ("linker", _ns)) + return; + + try { + ProcessAssemblies (Context, nav.SelectChildren ("assembly", _ns)); + + if (!string.IsNullOrEmpty (_resourceName) && Context.StripResources) + Context.Annotations.AddResourceToRemove (_resourceAssembly, _resourceName); + } catch (Exception ex) when (!(ex is XmlResolutionException)) { + throw new XmlResolutionException (string.Format ("Failed to process XML description: {0}", _xmlDocumentLocation), ex); + } + } + + protected virtual void ProcessAssemblies (LinkContext context, XPathNodeIterator iterator) + { + while (iterator.MoveNext ()) { + AssemblyDefinition assembly = GetAssembly (context, GetAssemblyName (iterator.Current)); + if (assembly is not null) + ProcessAssembly (assembly, iterator); + } + } + + protected virtual void ProcessAssembly (AssemblyDefinition assembly, XPathNodeIterator iterator) + { + if (IsExcluded (iterator.Current)) + return; + + Tracer.Push (assembly); + if (GetTypePreserve (iterator.Current) == TypePreserve.All) { + foreach (var type in assembly.MainModule.Types) + MarkAndPreserveAll (type); + } else { + ProcessTypes (assembly, iterator.Current.SelectChildren ("type", _ns)); + ProcessNamespaces (assembly, iterator.Current.SelectChildren ("namespace", _ns)); + } + Tracer.Pop (); + } + + void ProcessNamespaces (AssemblyDefinition assembly, XPathNodeIterator iterator) + { + while (iterator.MoveNext ()) { + string fullname = GetFullName (iterator.Current); + foreach (TypeDefinition type in assembly.MainModule.Types) { + if (type.Namespace != fullname) + continue; + + MarkAndPreserveAll (type); + } + } + } + + void MarkAndPreserveAll (TypeDefinition type) + { + Annotations.MarkAndPush (type); + Annotations.SetPreserve (type, TypePreserve.All); + + if (!type.HasNestedTypes) { + Tracer.Pop (); + return; + } + + foreach (TypeDefinition nested in type.NestedTypes) + MarkAndPreserveAll (nested); + + Tracer.Pop (); + } + + void ProcessTypes (AssemblyDefinition assembly, XPathNodeIterator iterator) + { + while (iterator.MoveNext ()) { + XPathNavigator nav = iterator.Current; + + string fullname = GetFullName (nav); + + if (IsTypePattern (fullname)) { + ProcessTypePattern (fullname, assembly, nav); + continue; + } + + TypeDefinition type = assembly.MainModule.GetType (fullname); + + if (type is null) { + if (assembly.MainModule.HasExportedTypes) { + foreach (var exported in assembly.MainModule.ExportedTypes) { + if (fullname == exported.FullName) { + Tracer.Push (exported); + MarkingHelpers.MarkExportedType (exported, assembly.MainModule); + var resolvedExternal = exported.Resolve (); + Tracer.Pop (); + if (resolvedExternal is not null) { + type = resolvedExternal; + break; + } + } + } + } + } + + if (type is null) + continue; + + ProcessType (type, nav); + } + } + + static bool IsTypePattern (string fullname) + { + return fullname.IndexOf ("*") != -1; + } + + static Regex CreateRegexFromPattern (string pattern) + { + return new Regex (pattern.Replace (".", @"\.").Replace ("*", "(.*)")); + } + + void MatchType (TypeDefinition type, Regex regex, XPathNavigator nav) + { + if (regex.Match (type.FullName).Success) + ProcessType (type, nav); + + if (!type.HasNestedTypes) + return; + + foreach (var nt in type.NestedTypes) + MatchType (nt, regex, nav); + } + + void MatchExportedType (ExportedType exportedType, ModuleDefinition module, Regex regex, XPathNavigator nav) + { + if (regex.Match (exportedType.FullName).Success) { + MarkingHelpers.MarkExportedType (exportedType, module); + TypeDefinition type = exportedType.Resolve (); + if (type is not null) { + ProcessType (type, nav); + } + } + } + + + void ProcessTypePattern (string fullname, AssemblyDefinition assembly, XPathNavigator nav) + { + Regex regex = CreateRegexFromPattern (fullname); + + foreach (TypeDefinition type in assembly.MainModule.Types) { + MatchType (type, regex, nav); + } + + if (assembly.MainModule.HasExportedTypes) { + foreach (var exported in assembly.MainModule.ExportedTypes) { + MatchExportedType (exported, assembly.MainModule, regex, nav); + } + } + } + + protected virtual void ProcessType (TypeDefinition type, XPathNavigator nav) + { + if (IsExcluded (nav)) + return; + + TypePreserve preserve = GetTypePreserve (nav); + + if (!IsRequired (nav)) { + Annotations.SetPreserve (type, preserve); + return; + } + + if (Annotations.IsMarked (type)) { + var existingLevel = Annotations.TryGetPreserve (type, out TypePreserve existingPreserve) ? existingPreserve : TypePreserve.Nothing; + var duplicateLevel = preserve != TypePreserve.Nothing ? preserve : nav.HasChildren ? TypePreserve.Nothing : TypePreserve.All; + Context.LogMessage ($"Duplicate preserve in {_xmlDocumentLocation} of {type.FullName} ({existingLevel}). Duplicate uses ({duplicateLevel})"); + } + + Annotations.MarkAndPush (type); + Tracer.AddDirectDependency (this, type); + + if (type.IsNested) { + var parent = type; + while (parent.IsNested) { + parent = parent.DeclaringType; + Annotations.Mark (parent); + } + } + + if (preserve != TypePreserve.Nothing) + Annotations.SetPreserve (type, preserve); + + if (nav.HasChildren) { + MarkSelectedFields (nav, type); + MarkSelectedMethods (nav, type); + MarkSelectedEvents (nav, type); + MarkSelectedProperties (nav, type); + } + Tracer.Pop (); + } + + void MarkSelectedFields (XPathNavigator nav, TypeDefinition type) + { + XPathNodeIterator fields = nav.SelectChildren ("field", _ns); + if (fields.Count == 0) + return; + + ProcessFields (type, fields); + } + + void MarkSelectedMethods (XPathNavigator nav, TypeDefinition type) + { + XPathNodeIterator methods = nav.SelectChildren ("method", _ns); + if (methods.Count == 0) + return; + + ProcessMethods (type, methods); + } + + void MarkSelectedEvents (XPathNavigator nav, TypeDefinition type) + { + XPathNodeIterator events = nav.SelectChildren ("event", _ns); + if (events.Count == 0) + return; + + ProcessEvents (type, events); + } + + void MarkSelectedProperties (XPathNavigator nav, TypeDefinition type) + { + XPathNodeIterator properties = nav.SelectChildren ("property", _ns); + if (properties.Count == 0) + return; + + ProcessProperties (type, properties); + } + + static TypePreserve GetTypePreserve (XPathNavigator nav) + { + string attribute = GetAttribute (nav, _preserve); + if (string.IsNullOrEmpty (attribute)) + return nav.HasChildren ? TypePreserve.Nothing : TypePreserve.All; + + TypePreserve result; + if (Enum.TryParse (attribute, true, out result)) + return result; + return TypePreserve.Nothing; + } + + void ProcessFields (TypeDefinition type, XPathNodeIterator iterator) + { + while (iterator.MoveNext ()) + ProcessField (type, iterator); + } + + protected virtual void ProcessField (TypeDefinition type, XPathNodeIterator iterator) + { + if (IsExcluded (iterator.Current)) + return; + + string value = GetSignature (iterator.Current); + if (!String.IsNullOrEmpty (value)) + ProcessFieldSignature (type, value); + + value = GetAttribute (iterator.Current, "name"); + if (!String.IsNullOrEmpty (value)) + ProcessFieldName (type, value); + } + + void ProcessFieldSignature (TypeDefinition type, string signature) + { + FieldDefinition field = GetField (type, signature); + MarkField (type, field, signature); + } + + void MarkField (TypeDefinition type, FieldDefinition field, string signature) + { + if (field is not null) { + if (Annotations.IsMarked (field)) + Context.LogMessage ($"Duplicate preserve in {_xmlDocumentLocation} of {field.FullName}"); + + Annotations.Mark (field); + } else { + AddUnresolveMarker (string.Format ("T: {0}; F: {1}", type, signature)); + } + } + + void ProcessFieldName (TypeDefinition type, string name) + { + if (!type.HasFields) + return; + + foreach (FieldDefinition field in type.Fields) + if (field.Name == name) + MarkField (type, field, name); + } + + protected static FieldDefinition GetField (TypeDefinition type, string signature) + { + if (!type.HasFields) + return null; + + foreach (FieldDefinition field in type.Fields) + if (signature == GetFieldSignature (field)) + return field; + + return null; + } + + static string GetFieldSignature (FieldDefinition field) + { + return field.FieldType.FullName + " " + field.Name; + } + + void ProcessMethods (TypeDefinition type, XPathNodeIterator iterator) + { + while (iterator.MoveNext ()) + ProcessMethod (type, iterator); + } + + protected virtual void ProcessMethod (TypeDefinition type, XPathNodeIterator iterator) + { + if (IsExcluded (iterator.Current)) + return; + + string value = GetSignature (iterator.Current); + if (!String.IsNullOrEmpty (value)) + ProcessMethodSignature (type, value); + + value = GetAttribute (iterator.Current, "name"); + if (!String.IsNullOrEmpty (value)) + ProcessMethodName (type, value); + } + + void ProcessMethodSignature (TypeDefinition type, string signature) + { + MethodDefinition meth = GetMethod (type, signature); + MarkMethod (type, meth, signature); + } + + void MarkMethod (TypeDefinition type, MethodDefinition method, string signature) + { + if (method is not null) { + MarkMethod (method); + } else + AddUnresolveMarker (string.Format ("T: {0}; M: {1}", type, signature)); + } + + void MarkMethod (MethodDefinition method) + { + if (Annotations.IsMarked (method)) + Context.LogMessage ($"Duplicate preserve in {_xmlDocumentLocation} of {method.FullName}"); + + Annotations.Mark (method); + Annotations.MarkIndirectlyCalledMethod (method); + Tracer.AddDirectDependency (this, method); + Annotations.SetAction (method, MethodAction.Parse); + } + + void MarkMethodIfNotNull (MethodDefinition method) + { + if (method is null) + return; + + MarkMethod (method); + } + + void ProcessMethodName (TypeDefinition type, string name) + { + if (!type.HasMethods) + return; + + foreach (MethodDefinition method in type.Methods) + if (name == method.Name) + MarkMethod (type, method, name); + } + + protected static MethodDefinition GetMethod (TypeDefinition type, string signature) + { + if (type.HasMethods) + foreach (MethodDefinition meth in type.Methods) + if (signature == GetMethodSignature (meth, false)) + return meth; + + return null; + } + + public static string GetMethodSignature (MethodDefinition meth, bool includeGenericParameters) + { + StringBuilder sb = new StringBuilder (); + sb.Append (meth.ReturnType.FullName); + sb.Append (" "); + sb.Append (meth.Name); + if (includeGenericParameters && meth.HasGenericParameters) { + sb.Append ("`"); + sb.Append (meth.GenericParameters.Count); + } + + sb.Append ("("); + if (meth.HasParameters) { + for (int i = 0; i < meth.Parameters.Count; i++) { + if (i > 0) + sb.Append (","); + + sb.Append (meth.Parameters [i].ParameterType.FullName); + } + } + sb.Append (")"); + return sb.ToString (); + } + + void ProcessEvents (TypeDefinition type, XPathNodeIterator iterator) + { + while (iterator.MoveNext ()) + ProcessEvent (type, iterator); + } + + protected virtual void ProcessEvent (TypeDefinition type, XPathNodeIterator iterator) + { + if (IsExcluded (iterator.Current)) + return; + + string value = GetSignature (iterator.Current); + if (!String.IsNullOrEmpty (value)) + ProcessEventSignature (type, value); + + value = GetAttribute (iterator.Current, "name"); + if (!String.IsNullOrEmpty (value)) + ProcessEventName (type, value); + } + + void ProcessEventSignature (TypeDefinition type, string signature) + { + EventDefinition @event = GetEvent (type, signature); + MarkEvent (type, @event, signature); + } + + void MarkEvent (TypeDefinition type, EventDefinition @event, string signature) + { + if (@event is not null) { + if (Annotations.IsMarked (@event)) + Context.LogMessage ($"Duplicate preserve in {_xmlDocumentLocation} of {@event.FullName}"); + + Annotations.Mark (@event); + + MarkMethod (@event.AddMethod); + MarkMethod (@event.RemoveMethod); + MarkMethodIfNotNull (@event.InvokeMethod); + } else + AddUnresolveMarker (string.Format ("T: {0}; E: {1}", type, signature)); + } + + void ProcessEventName (TypeDefinition type, string name) + { + if (!type.HasEvents) + return; + + foreach (EventDefinition @event in type.Events) + if (@event.Name == name) + MarkEvent (type, @event, name); + } + + protected static EventDefinition GetEvent (TypeDefinition type, string signature) + { + if (!type.HasEvents) + return null; + + foreach (EventDefinition @event in type.Events) + if (signature == GetEventSignature (@event)) + return @event; + + return null; + } + + static string GetEventSignature (EventDefinition @event) + { + return @event.EventType.FullName + " " + @event.Name; + } + + void ProcessProperties (TypeDefinition type, XPathNodeIterator iterator) + { + while (iterator.MoveNext ()) + ProcessProperty (type, iterator); + } + + protected virtual void ProcessProperty (TypeDefinition type, XPathNodeIterator iterator) + { + if (IsExcluded (iterator.Current)) + return; + + string value = GetSignature (iterator.Current); + if (!String.IsNullOrEmpty (value)) + ProcessPropertySignature (type, value, GetAccessors (iterator.Current)); + + value = GetAttribute (iterator.Current, "name"); + if (!String.IsNullOrEmpty (value)) + ProcessPropertyName (type, value, _accessorsAll); + } + + void ProcessPropertySignature (TypeDefinition type, string signature, string [] accessors) + { + PropertyDefinition property = GetProperty (type, signature); + MarkProperty (type, property, signature, accessors); + } + + void MarkProperty (TypeDefinition type, PropertyDefinition property, string signature, string [] accessors) + { + if (property is not null) { + if (Annotations.IsMarked (property)) + Context.LogMessage ($"Duplicate preserve in {_xmlDocumentLocation} of {property.FullName}"); + + Annotations.Mark (property); + + MarkPropertyAccessors (type, property, accessors); + } else + AddUnresolveMarker (string.Format ("T: {0}; P: {1}", type, signature)); + } + + void MarkPropertyAccessors (TypeDefinition type, PropertyDefinition property, string [] accessors) + { + if (Array.IndexOf (accessors, "all") >= 0) { + MarkMethodIfNotNull (property.GetMethod); + MarkMethodIfNotNull (property.SetMethod); + + return; + } + if (property.GetMethod is not null + && Array.IndexOf (accessors, "get") >= 0) + MarkMethod (property.GetMethod); + else if (property.GetMethod is null) + AddUnresolveMarker (string.Format ("T: {0}' M: {1} get_{2}", type, property.PropertyType, property.Name)); + + if (property.SetMethod is not null + && Array.IndexOf (accessors, "set") >= 0) + MarkMethod (property.SetMethod); + else if (property.SetMethod is null) + AddUnresolveMarker (string.Format ("T: {0}' M: System.Void set_{2} ({1})", type, property.PropertyType, property.Name)); + } + + void ProcessPropertyName (TypeDefinition type, string name, string [] accessors) + { + if (!type.HasProperties) + return; + + foreach (PropertyDefinition property in type.Properties) + if (property.Name == name) + MarkProperty (type, property, name, accessors); + } + + protected static PropertyDefinition GetProperty (TypeDefinition type, string signature) + { + if (!type.HasProperties) + return null; + + foreach (PropertyDefinition property in type.Properties) + if (signature == GetPropertySignature (property)) + return property; + + return null; + } + + static string GetPropertySignature (PropertyDefinition property) + { + return property.PropertyType.FullName + " " + property.Name; + } + + protected AssemblyDefinition GetAssembly (LinkContext context, AssemblyNameReference assemblyName) + { + var assembly = context.Resolve (assemblyName); + ProcessReferences (assembly, context); + return assembly; + } + + protected virtual AssemblyNameReference GetAssemblyName (XPathNavigator nav) + { + return AssemblyNameReference.Parse (GetFullName (nav)); + } + + static void ProcessReferences (AssemblyDefinition assembly, LinkContext context) + { + context.ResolveReferences (assembly); + } + + static bool IsRequired (XPathNavigator nav) + { + string attribute = GetAttribute (nav, _required); + if (attribute is null || attribute.Length == 0) + return true; + + bool result; + if (bool.TryParse (attribute, out result)) + return result; + return false; + } + + protected static string GetSignature (XPathNavigator nav) + { + return GetAttribute (nav, _signature); + } + + static string GetFullName (XPathNavigator nav) + { + return GetAttribute (nav, _fullname); + } + + protected static string [] GetAccessors (XPathNavigator nav) + { + string accessorsValue = GetAttribute (nav, _accessors); + + if (accessorsValue is not null) { + string [] accessors = accessorsValue.Split ( + _accessorsSep, StringSplitOptions.RemoveEmptyEntries); + + if (accessors.Length > 0) { + for (int i = 0; i < accessors.Length; ++i) + accessors [i] = accessors [i].ToLower (); + + return accessors; + } + } + return _accessorsAll; + } + + protected static string GetAttribute (XPathNavigator nav, string attribute) + { + return nav.GetAttribute (attribute, _ns); + } + + protected virtual bool IsExcluded (XPathNavigator nav) + { + var value = GetAttribute (nav, "feature"); + if (string.IsNullOrEmpty (value)) + return false; + + return Context.IsFeatureExcluded (value); + } + + + public override string ToString () + { + return "ResolveFromXmlStep: " + _xmlDocumentLocation; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveStep.cs new file mode 100644 index 000000000000..604728bef247 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/ResolveStep.cs @@ -0,0 +1,56 @@ +// +// ResolveStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Collections.Generic; + +namespace Mono.Linker.Steps { + + public abstract class ResolveStep : BaseStep { + + readonly List _unResolved; + + protected ResolveStep () + { + _unResolved = new List (); + } + + public bool AllMarkerResolved { + get { return _unResolved.Count == 0; } + } + + public string [] GetUnresolvedMarkers () + { + return _unResolved.ToArray (); + } + + protected void AddUnresolveMarker (string signature) + { + _unResolved.Add (signature); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/SweepStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/SweepStep.cs new file mode 100644 index 000000000000..dd1e411be8c1 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/SweepStep.cs @@ -0,0 +1,714 @@ +// +// SweepStep.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Collections.Generic; +using System.Linq; +using Mono.Cecil; +using Mono.Collections.Generic; +using Mono.Cecil.Cil; + +namespace Mono.Linker.Steps { + + public class SweepStep : BaseStep { + AssemblyDefinition [] assemblies; + readonly bool sweepSymbols; + readonly HashSet BypassNGenToSave = new HashSet (); + + public SweepStep (bool sweepSymbols = true) + { + this.sweepSymbols = sweepSymbols; + } + + protected override void Process () + { + assemblies = Context.Annotations.GetAssemblies ().ToArray (); + + foreach (var assembly in assemblies) { + RemoveUnusedAssembly (assembly); + } + + foreach (var assembly in assemblies) { + ProcessAssemblyAction (assembly); + } + } + + void RemoveUnusedAssembly (AssemblyDefinition assembly) + { + switch (Annotations.GetAction (assembly)) { + case AssemblyAction.AddBypassNGenUsed: + case AssemblyAction.CopyUsed: + case AssemblyAction.Link: + if (!IsUsedAssembly (assembly)) + RemoveAssembly (assembly); + + break; + } + } + + protected void ProcessAssemblyAction (AssemblyDefinition assembly) + { + switch (Annotations.GetAction (assembly)) { + case AssemblyAction.AddBypassNGenUsed: + Annotations.SetAction (assembly, AssemblyAction.AddBypassNGen); + goto case AssemblyAction.AddBypassNGen; + + case AssemblyAction.AddBypassNGen: + // FIXME: AddBypassNGen is just wrong, it should not be action as we need to + // turn it to Action.Save here to e.g. correctly update debug symbols + if (!Context.KeepTypeForwarderOnlyAssemblies || BypassNGenToSave.Contains (assembly)) { + goto case AssemblyAction.Save; + } + + break; + + case AssemblyAction.CopyUsed: + Annotations.SetAction (assembly, AssemblyAction.Copy); + goto case AssemblyAction.Copy; + + case AssemblyAction.Copy: + // + // Facade assemblies can have unused forwarders pointing to + // removed type (when facades are kept) + // + // main.exe -> facade.dll -> lib.dll + // link | copy | link + // + // when main.exe has unused reference to type in lib.dll + // + if (SweepTypeForwarders (assembly)) + Annotations.SetAction (assembly, AssemblyAction.Save); + + break; + + case AssemblyAction.Link: + SweepAssembly (assembly); + break; + + case AssemblyAction.Save: + // + // Save means we need to rewrite the assembly due to removed assembly + // reference. We do any additional removed assembly reference clean up here + // + UpdateForwardedTypesScope (assembly); + UpdateCustomAttributesTypesScopes (assembly); + SweepTypeForwarders (assembly); + break; + } + } + + protected virtual void SweepAssembly (AssemblyDefinition assembly) + { + var types = new List (); + + foreach (TypeDefinition type in assembly.MainModule.Types) { + if (Annotations.IsMarked (type)) { + SweepType (type); + types.Add (type); + continue; + } + + if (type.Name == "") + types.Add (type); + else + ElementRemoved (type); + } + + assembly.MainModule.Types.Clear (); + foreach (TypeDefinition type in types) + assembly.MainModule.Types.Add (type); + + SweepResources (assembly); + SweepCustomAttributes (assembly); + + foreach (var module in assembly.Modules) + SweepCustomAttributes (module); + + SweepTypeForwarders (assembly); + + UpdateForwardedTypesScope (assembly); + } + + bool IsUsedAssembly (AssemblyDefinition assembly) + { + if (IsMarkedAssembly (assembly)) + return true; + + if (assembly.MainModule.HasExportedTypes && Context.KeepTypeForwarderOnlyAssemblies) + return true; + + return false; + } + + bool IsMarkedAssembly (AssemblyDefinition assembly) + { + return Annotations.IsMarked (assembly.MainModule); + } + + protected virtual void RemoveAssembly (AssemblyDefinition assembly) + { + Annotations.SetAction (assembly, AssemblyAction.Delete); + + foreach (var a in assemblies) { + switch (Annotations.GetAction (a)) { + case AssemblyAction.Skip: + case AssemblyAction.Delete: + continue; + } + + SweepReferences (a, assembly); + } + } + + void SweepResources (AssemblyDefinition assembly) + { + var resourcesToRemove = Annotations.GetResourcesToRemove (assembly); + if (resourcesToRemove is not null) { + var resources = assembly.MainModule.Resources; + + for (int i = 0; i < resources.Count; i++) { + var resource = resources [i] as EmbeddedResource; + if (resource is null) + continue; + + if (resourcesToRemove.Contains (resource.Name)) + resources.RemoveAt (i--); + } + } + } + + void SweepReferences (AssemblyDefinition assembly, AssemblyDefinition referenceToRemove) + { + if (assembly == referenceToRemove) + return; + + bool reference_removed = false; + + var references = assembly.MainModule.AssemblyReferences; + for (int i = 0; i < references.Count; i++) { + var reference = references [i]; + + AssemblyDefinition ad = Context.Resolver.Resolve (reference); + if (ad is null || !AreSameReference (ad.Name, referenceToRemove.Name)) + continue; + + ReferenceRemoved (assembly, reference); + references.RemoveAt (i--); + reference_removed = true; + } + + if (reference_removed) { + switch (Annotations.GetAction (assembly)) { + case AssemblyAction.CopyUsed: + if (IsUsedAssembly (assembly)) { + goto case AssemblyAction.Copy; + } + break; + + case AssemblyAction.Copy: + // + // Assembly has a reference to another assembly which has been fully removed. This can + // happen when for example the reference assembly is 'copy-used' and it's not needed. + // + // or + // + // Assembly can contain type references with + // type forwarders to deleted assembly (facade) when + // facade assemblies are not kept. For that reason we need to + // rewrite the copy to save to update the scopes not to point + // forwarding assembly (facade). + // + // foo.dll -> facade.dll -> lib.dll + // copy | copy (delete) | link + // + Annotations.SetAction (assembly, AssemblyAction.Save); + break; + + case AssemblyAction.AddBypassNGenUsed: + if (IsUsedAssembly (assembly)) { + Annotations.SetAction (assembly, AssemblyAction.AddBypassNGen); + goto case AssemblyAction.AddBypassNGen; + } + break; + + case AssemblyAction.AddBypassNGen: + BypassNGenToSave.Add (assembly); + break; + } + } + } + + bool SweepTypeForwarders (AssemblyDefinition assembly) + { + if (assembly.MainModule.HasExportedTypes) { + return SweepCollectionMetadata (assembly.MainModule.ExportedTypes); + } + + return false; + } + + void UpdateForwardedTypesScope (AssemblyDefinition assembly) + { + var changed_types = new Dictionary (); + + foreach (TypeReference tr in assembly.MainModule.GetTypeReferences ()) { + if (tr.IsWindowsRuntimeProjection) + continue; + + TypeDefinition td; + try { + td = tr.Resolve (); + } catch (AssemblyResolutionException) { + // Don't crash on unresolved assembly + continue; + } + + // at this stage reference might include things that can't be resolved + // and if it is (resolved) it needs to be kept only if marked (#16213) + if (td is null || !Annotations.IsMarked (td)) + continue; + + IMetadataScope scope = assembly.MainModule.ImportReference (td).Scope; + if (tr.Scope != scope) + changed_types.Add (tr, scope); + } + + // + // Resolved everything first before updating scopes. + // If we set the scope to null, then calling Resolve() on any of its + // nested types would crash. + // + foreach (var e in changed_types) { + e.Key.Scope = e.Value; + } + + if (assembly.MainModule.HasExportedTypes) { + foreach (var et in assembly.MainModule.ExportedTypes) { + var td = et.Resolve (); + if (td is null) + continue; + + et.Scope = assembly.MainModule.ImportReference (td).Scope; + } + } + } + + static void UpdateCustomAttributesTypesScopes (AssemblyDefinition assembly) + { + UpdateCustomAttributesTypesScopes ((ICustomAttributeProvider) assembly); + + foreach (var module in assembly.Modules) + UpdateCustomAttributesTypesScopes (module); + + foreach (var type in assembly.MainModule.Types) + UpdateCustomAttributesTypesScopes (type); + } + + static void UpdateCustomAttributesTypesScopes (TypeDefinition typeDefinition) + { + UpdateCustomAttributesTypesScopes ((ICustomAttributeProvider) typeDefinition); + + if (typeDefinition.HasEvents) + UpdateCustomAttributesTypesScopes (typeDefinition.Events); + + if (typeDefinition.HasFields) + UpdateCustomAttributesTypesScopes (typeDefinition.Fields); + + if (typeDefinition.HasMethods) + UpdateCustomAttributesTypesScopes (typeDefinition.Methods); + + if (typeDefinition.HasProperties) + UpdateCustomAttributesTypesScopes (typeDefinition.Properties); + + if (typeDefinition.HasGenericParameters) + UpdateCustomAttributesTypesScopes (typeDefinition.GenericParameters); + + if (typeDefinition.HasNestedTypes) { + foreach (var nestedType in typeDefinition.NestedTypes) { + UpdateCustomAttributesTypesScopes (nestedType); + } + } + } + + static void UpdateCustomAttributesTypesScopes (Collection providers) where T : ICustomAttributeProvider + { + foreach (var provider in providers) + UpdateCustomAttributesTypesScopes (provider); + } + + static void UpdateCustomAttributesTypesScopes (Collection genericParameters) + { + foreach (var gp in genericParameters) { + UpdateCustomAttributesTypesScopes (gp); + + if (gp.HasConstraints) + UpdateCustomAttributesTypesScopes (gp.Constraints); + } + } + + static void UpdateCustomAttributesTypesScopes (ICustomAttributeProvider customAttributeProvider) + { + if (!customAttributeProvider.HasCustomAttributes) + return; + + foreach (var ca in customAttributeProvider.CustomAttributes) + UpdateForwardedTypesScope (ca); + } + + static void UpdateForwardedTypesScope (CustomAttribute attribute) + { + AssemblyDefinition assembly = attribute.Constructor.Module.Assembly; + + if (attribute.HasConstructorArguments) { + foreach (var ca in attribute.ConstructorArguments) + UpdateForwardedTypesScope (ca, assembly); + } + + if (attribute.HasFields) { + foreach (var field in attribute.Fields) + UpdateForwardedTypesScope (field.Argument, assembly); + } + + if (attribute.HasProperties) { + foreach (var property in attribute.Properties) + UpdateForwardedTypesScope (property.Argument, assembly); + } + } + + static void UpdateForwardedTypesScope (CustomAttributeArgument attributeArgument, AssemblyDefinition assembly) + { + UpdateTypeScope (attributeArgument.Type, assembly); + + switch (attributeArgument.Value) { + case TypeReference tr: + UpdateTypeScope (tr, assembly); + break; + case CustomAttributeArgument caa: + UpdateForwardedTypesScope (caa, assembly); + break; + case CustomAttributeArgument [] array: + foreach (var item in array) + UpdateForwardedTypesScope (item, assembly); + break; + } + } + + static void UpdateTypeScope (TypeReference type, AssemblyDefinition assembly) + { + // Can't update the scope of windows runtime projections + if (type.IsWindowsRuntimeProjection) + return; + + if (type is GenericInstanceType git && git.HasGenericArguments) { + UpdateTypeScope (git.ElementType, assembly); + foreach (var ga in git.GenericArguments) + UpdateTypeScope (ga, assembly); + return; + } + + if (type is ArrayType at) { + UpdateTypeScope (at.ElementType, assembly); + return; + } + + TypeDefinition td = type.Resolve (); + if (td is null) + return; + + IMetadataScope scope = assembly.MainModule.ImportReference (td).Scope; + if (type.Scope != scope) + type.Scope = td.Scope; + } + + protected virtual void SweepType (TypeDefinition type) + { + if (type.HasFields) + SweepCollectionWithCustomAttributes (type.Fields); + + if (type.HasMethods) + SweepMethods (type.Methods); + + if (type.HasNestedTypes) + SweepNestedTypes (type); + + if (type.HasInterfaces) + SweepInterfaces (type); + + if (type.HasCustomAttributes) + SweepCustomAttributes (type); + + if (type.HasGenericParameters) + SweepGenericParameters (type.GenericParameters); + + if (type.HasProperties) + SweepCustomAttributeCollection (type.Properties); + + if (type.HasEvents) + SweepCustomAttributeCollection (type.Events); + + if (type.HasFields && !type.IsBeforeFieldInit && !Annotations.HasPreservedStaticCtor (type) && !type.IsEnum) + type.IsBeforeFieldInit = true; + } + + protected void SweepNestedTypes (TypeDefinition type) + { + for (int i = 0; i < type.NestedTypes.Count; i++) { + var nested = type.NestedTypes [i]; + if (Annotations.IsMarked (nested)) { + SweepType (nested); + } else { + ElementRemoved (type.NestedTypes [i]); + type.NestedTypes.RemoveAt (i--); + } + } + } + + protected void SweepInterfaces (TypeDefinition type) + { + for (int i = type.Interfaces.Count - 1; i >= 0; i--) { + var iface = type.Interfaces [i]; + if (Annotations.IsMarked (iface)) { + SweepCustomAttributes (iface); + continue; + } + InterfaceRemoved (type, iface); + type.Interfaces.RemoveAt (i); + } + } + + protected void SweepGenericParameters (Collection genericParameters) + { + foreach (var gp in genericParameters) { + SweepCustomAttributes (gp); + + if (gp.HasConstraints) + SweepCustomAttributeCollection (gp.Constraints); + } + } + + protected void SweepCustomAttributes (TypeDefinition type) + { + var removed = SweepCustomAttributes (type as ICustomAttributeProvider); + + if (ShouldSetHasSecurityToFalse (type, type, type.HasSecurity, removed)) + type.HasSecurity = false; + } + + protected void SweepCustomAttributes (MethodDefinition method) + { + var removed = SweepCustomAttributes (method as ICustomAttributeProvider); + + if (ShouldSetHasSecurityToFalse (method, method, method.HasSecurity, removed)) + method.HasSecurity = false; + } + + bool ShouldSetHasSecurityToFalse (ISecurityDeclarationProvider providerAsSecurity, ICustomAttributeProvider provider, bool existingHasSecurity, IList removedAttributes) + { + if (existingHasSecurity && removedAttributes.Count > 0 && !providerAsSecurity.HasSecurityDeclarations) { + // If the method or type had security before and all attributes were removed, or no remaining attributes are security attributes, + // then we need to set HasSecurity to false + if (provider.CustomAttributes.Count == 0 || provider.CustomAttributes.All (attr => !IsSecurityAttributeType (attr.AttributeType.Resolve ()))) + return true; + } + + return false; + } + + static bool IsSecurityAttributeType (TypeDefinition definition) + { + if (definition is null) + return false; + + if (definition.Namespace == "System.Security") { + switch (definition.FullName) { + // This seems to be one attribute in the System.Security namespace that doesn't count + // as an attribute that requires HasSecurity to be true + case "System.Security.SecurityCriticalAttribute": + return false; + } + + return true; + } + + if (definition.BaseType is null) + return false; + + return IsSecurityAttributeType (definition.BaseType.Resolve ()); + } + + protected IList SweepCustomAttributes (ICustomAttributeProvider provider) + { + var removed = new List (); + + for (int i = provider.CustomAttributes.Count - 1; i >= 0; i--) { + var attribute = provider.CustomAttributes [i]; + if (Annotations.IsMarked (attribute)) { + UpdateForwardedTypesScope (attribute); + } else { + CustomAttributeUsageRemoved (provider, attribute); + removed.Add (provider.CustomAttributes [i]); + provider.CustomAttributes.RemoveAt (i); + } + } + + return removed; + } + + protected void SweepCustomAttributeCollection (Collection providers) where T : ICustomAttributeProvider + { + foreach (var provider in providers) + SweepCustomAttributes (provider); + } + + protected virtual void SweepMethods (Collection methods) + { + SweepCollectionWithCustomAttributes (methods); + if (sweepSymbols) + SweepDebugInfo (methods); + + foreach (var method in methods) { + if (method.HasGenericParameters) + SweepGenericParameters (method.GenericParameters); + + SweepCustomAttributes (method.MethodReturnType); + + if (!method.HasParameters) + continue; + + foreach (var parameter in method.Parameters) + SweepCustomAttributes (parameter); + } + } + + void SweepDebugInfo (Collection methods) + { + List sweptScopes = null; + foreach (var m in methods) { + if (m.DebugInformation is null) + continue; + + var scope = m.DebugInformation.Scope; + if (scope is null) + continue; + + if (sweptScopes is null) { + sweptScopes = new List (); + } else if (sweptScopes.Contains (scope)) { + continue; + } + + sweptScopes.Add (scope); + + if (scope.HasConstants) { + var constants = scope.Constants; + for (int i = 0; i < constants.Count; ++i) { + if (!Annotations.IsMarked (constants [i].ConstantType)) + constants.RemoveAt (i--); + } + } + + var import = scope.Import; + while (import is not null) { + if (import.HasTargets) { + var targets = import.Targets; + for (int i = 0; i < targets.Count; ++i) { + var ttype = targets [i].Type; + if (ttype is not null && !Annotations.IsMarked (ttype)) + targets.RemoveAt (i--); + + // TODO: Clear also AssemblyReference and Namespace when not marked + } + } + + import = import.Parent; + } + } + } + + protected void SweepCollectionWithCustomAttributes (IList list) where T : ICustomAttributeProvider + { + for (int i = 0; i < list.Count; i++) + if (ShouldRemove (list [i])) { + ElementRemoved (list [i]); + list.RemoveAt (i--); + } else { + SweepCustomAttributes (list [i]); + } + } + + protected bool SweepCollectionMetadata (IList list) where T : IMetadataTokenProvider + { + bool removed = false; + + for (int i = 0; i < list.Count; i++) { + if (ShouldRemove (list [i])) { + ElementRemoved (list [i]); + list.RemoveAt (i--); + removed = true; + } + } + + return removed; + } + + protected virtual bool ShouldRemove (T element) where T : IMetadataTokenProvider + { + return !Annotations.IsMarked (element); + } + + static bool AreSameReference (AssemblyNameReference a, AssemblyNameReference b) + { + if (a == b) + return true; + + if (a.Name != b.Name) + return false; + + if (a.Version > b.Version) + return false; + + return true; + } + + protected virtual void ElementRemoved (IMetadataTokenProvider element) + { + } + + protected virtual void ReferenceRemoved (AssemblyDefinition assembly, AssemblyNameReference reference) + { + } + + protected virtual void InterfaceRemoved (TypeDefinition type, InterfaceImplementation iface) + { + } + + protected virtual void CustomAttributeUsageRemoved (ICustomAttributeProvider provider, CustomAttribute attribute) + { + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/TypeMapStep.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/TypeMapStep.cs new file mode 100644 index 000000000000..053ad77373d9 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker.Steps/TypeMapStep.cs @@ -0,0 +1,371 @@ +// +// TypeMapStep.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2009 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Collections.Generic; +using Mono.Cecil; + +namespace Mono.Linker.Steps { + + public class TypeMapStep : BaseStep { + + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + foreach (TypeDefinition type in assembly.MainModule.Types) + MapType (type); + } + + protected virtual void MapType (TypeDefinition type) + { + MapVirtualMethods (type); + MapInterfaceMethodsInTypeHierarchy (type); + MapInterfaceHierarchy (type); + MapBaseTypeHierarchy (type); + + if (!type.HasNestedTypes) + return; + + foreach (var nested in type.NestedTypes) + MapType (nested); + } + + void MapInterfaceHierarchy (TypeDefinition type) + { + if (!type.IsInterface || !type.HasInterfaces) + return; + + foreach (var iface in type.Interfaces) { + var resolved = iface.InterfaceType.Resolve (); + if (resolved is null) + continue; + + Annotations.AddDerivedInterfaceForInterface (resolved, type); + } + } + + void MapInterfaceMethodsInTypeHierarchy (TypeDefinition type) + { + if (!type.HasInterfaces) + return; + + foreach (var @interface in type.Interfaces) { + var interfaceType = @interface.InterfaceType; + var iface = interfaceType.Resolve (); + if (iface is null || !iface.HasMethods) + continue; + + foreach (MethodDefinition interfaceMethod in iface.Methods) { + if (TryMatchMethod (type, interfaceMethod) is not null) + continue; + + var @base = GetBaseMethodInTypeHierarchy (type, interfaceMethod); + if (@base is not null) + AnnotateMethods (interfaceMethod, @base, @interface); + + if (interfaceType is GenericInstanceType genericInterfaceInstance) { + var genericContext = new Inflater.GenericContext (genericInterfaceInstance, null); + var baseInflated = GetBaseInflatedInterfaceMethodInTypeHierarchy (genericContext, type, interfaceMethod); + if (baseInflated is not null) + Annotations.AddOverride (interfaceMethod, baseInflated, @interface); + } + } + } + } + + static MethodReference CreateGenericInstanceCandidate (Inflater.GenericContext context, TypeDefinition candidateType, MethodDefinition interfaceMethod) + { + var methodReference = new MethodReference (interfaceMethod.Name, interfaceMethod.ReturnType, candidateType) { HasThis = interfaceMethod.HasThis }; + + foreach (var genericMethodParameter in interfaceMethod.GenericParameters) + methodReference.GenericParameters.Add (new GenericParameter (genericMethodParameter.Name, methodReference)); + + if (interfaceMethod.ReturnType.IsGenericParameter || interfaceMethod.ReturnType.IsGenericInstance) + methodReference.ReturnType = Inflater.InflateType (context, interfaceMethod.ReturnType); + + foreach (var p in interfaceMethod.Parameters) { + var parameterType = p.ParameterType; + if (parameterType.IsGenericParameter || parameterType.IsGenericInstance) + parameterType = Inflater.InflateType (context, parameterType); + + methodReference.Parameters.Add (new ParameterDefinition (p.Name, p.Attributes, parameterType)); + } + + return methodReference; + } + + void MapVirtualMethods (TypeDefinition type) + { + if (!type.HasMethods) + return; + + foreach (MethodDefinition method in type.Methods) { + if (!method.IsVirtual) + continue; + + MapVirtualMethod (method); + + if (method.HasOverrides) + MapOverrides (method); + } + } + + void MapVirtualMethod (MethodDefinition method) + { + MapVirtualBaseMethod (method); + MapVirtualInterfaceMethod (method); + } + + void MapVirtualBaseMethod (MethodDefinition method) + { + MethodDefinition @base = GetBaseMethodInTypeHierarchy (method); + if (@base is null) + return; + + AnnotateMethods (@base, method); + } + + void MapVirtualInterfaceMethod (MethodDefinition method) + { + foreach (MethodDefinition @base in GetBaseMethodsInInterfaceHierarchy (method)) + AnnotateMethods (@base, method); + } + + void MapOverrides (MethodDefinition method) + { + foreach (MethodReference override_ref in method.Overrides) { + MethodDefinition @override = override_ref.Resolve (); + if (@override is null) + continue; + + AnnotateMethods (@override, method); + } + } + + void MapBaseTypeHierarchy (TypeDefinition type) + { + if (!type.IsClass) + return; + + var bases = new List (); + var current = type.BaseType; + + while (current is not null) { + var resolved = current.Resolve (); + if (resolved is null) + break; + + // Exclude Object. That's implied and adding it to the list will just lead to lots of extra unnecessary processing + if (resolved.BaseType is null) + break; + + bases.Add (resolved); + current = resolved.BaseType; + } + + Annotations.SetClassHierarchy (type, bases); + } + + void AnnotateMethods (MethodDefinition @base, MethodDefinition @override, InterfaceImplementation matchingInterfaceImplementation = null) + { + Annotations.AddBaseMethod (@override, @base); + Annotations.AddOverride (@base, @override, matchingInterfaceImplementation); + } + + static MethodDefinition GetBaseMethodInTypeHierarchy (MethodDefinition method) + { + return GetBaseMethodInTypeHierarchy (method.DeclaringType, method); + } + + static MethodDefinition GetBaseMethodInTypeHierarchy (TypeDefinition type, MethodDefinition method) + { + TypeReference @base = type.GetInflatedBaseType (); + while (@base is not null) { + MethodDefinition base_method = TryMatchMethod (@base, method); + if (base_method is not null) + return base_method; + + @base = @base.GetInflatedBaseType (); + } + + return null; + } + + static MethodDefinition GetBaseInflatedInterfaceMethodInTypeHierarchy (Inflater.GenericContext context, TypeDefinition type, MethodDefinition interfaceMethod) + { + TypeReference @base = type.GetInflatedBaseType (); + while (@base is not null) { + var candidate = CreateGenericInstanceCandidate (context, @base.Resolve (), interfaceMethod); + + MethodDefinition base_method = TryMatchMethod (@base, candidate); + if (base_method is not null) + return base_method; + + @base = @base.GetInflatedBaseType (); + } + + return null; + } + + static IEnumerable GetBaseMethodsInInterfaceHierarchy (MethodDefinition method) + { + return GetBaseMethodsInInterfaceHierarchy (method.DeclaringType, method); + } + + static IEnumerable GetBaseMethodsInInterfaceHierarchy (TypeReference type, MethodDefinition method) + { + foreach (TypeReference @interface in type.GetInflatedInterfaces ()) { + MethodDefinition base_method = TryMatchMethod (@interface, method); + if (base_method is not null) + yield return base_method; + + foreach (MethodDefinition @base in GetBaseMethodsInInterfaceHierarchy (@interface, method)) + yield return @base; + } + } + + static MethodDefinition TryMatchMethod (TypeReference type, MethodReference method) + { + foreach (var candidate in type.GetMethods ()) { + if (MethodMatch (candidate, method)) + return candidate.Resolve (); + } + + return null; + } + + static bool MethodMatch (MethodReference candidate, MethodReference method) + { + var candidateDef = candidate.Resolve (); + + if (!candidateDef.IsVirtual) + return false; + + if (candidate.HasParameters != method.HasParameters) + return false; + + if (candidate.Name != method.Name) + return false; + + if (candidate.HasGenericParameters != method.HasGenericParameters) + return false; + + // we need to track what the generic parameter represent - as we cannot allow it to + // differ between the return type or any parameter + if (!TypeMatch (candidate.GetReturnType (), method.GetReturnType ())) + return false; + + if (!candidate.HasParameters) + return true; + + var cp = candidate.Parameters; + var mp = method.Parameters; + if (cp.Count != mp.Count) + return false; + + if (candidate.GenericParameters.Count != method.GenericParameters.Count) + return false; + + for (int i = 0; i < cp.Count; i++) { + if (!TypeMatch (candidate.GetParameterType (i), method.GetParameterType (i))) + return false; + } + + return true; + } + + static bool TypeMatch (IModifierType a, IModifierType b) + { + if (!TypeMatch (a.ModifierType, b.ModifierType)) + return false; + + return TypeMatch (a.ElementType, b.ElementType); + } + + static bool TypeMatch (TypeSpecification a, TypeSpecification b) + { + var gita = a as GenericInstanceType; + if (gita is not null) + return TypeMatch (gita, (GenericInstanceType) b); + + var mta = a as IModifierType; + if (mta is not null) + return TypeMatch (mta, (IModifierType) b); + + return TypeMatch (a.ElementType, b.ElementType); + } + + static bool TypeMatch (GenericInstanceType a, GenericInstanceType b) + { + if (!TypeMatch (a.ElementType, b.ElementType)) + return false; + + if (a.HasGenericArguments != b.HasGenericArguments) + return false; + + if (!a.HasGenericArguments) + return true; + + var gaa = a.GenericArguments; + var gab = b.GenericArguments; + if (gaa.Count != gab.Count) + return false; + + for (int i = 0; i < gaa.Count; i++) { + if (!TypeMatch (gaa [i], gab [i])) + return false; + } + + return true; + } + + static bool TypeMatch (GenericParameter a, GenericParameter b) + { + if (a.Position != b.Position) + return false; + + if (a.Type != b.Type) + return false; + + return true; + } + + static bool TypeMatch (TypeReference a, TypeReference b) + { + if (a is TypeSpecification || b is TypeSpecification) { + if (a.GetType () != b.GetType ()) + return false; + + return TypeMatch ((TypeSpecification) a, (TypeSpecification) b); + } + + if (a is GenericParameter && b is GenericParameter) + return TypeMatch ((GenericParameter) a, (GenericParameter) b); + + return a.FullName == b.FullName; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Annotations.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Annotations.cs new file mode 100644 index 000000000000..c060892ba545 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Annotations.cs @@ -0,0 +1,464 @@ +// +// Annotations.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Mono.Linker { + + public partial class AnnotationStore { + + protected readonly LinkContext context; + + protected readonly Dictionary assembly_actions = new Dictionary (); + protected readonly Dictionary method_actions = new Dictionary (); + protected readonly Dictionary method_stub_values = new Dictionary (); + protected readonly Dictionary field_values = new Dictionary (); + protected readonly HashSet field_init = new HashSet (); + protected readonly HashSet fieldType_init = new HashSet (); + protected readonly HashSet marked = new HashSet (); + protected readonly HashSet processed = new HashSet (); + protected readonly Dictionary preserved_types = new Dictionary (); + protected readonly Dictionary> preserved_methods = new Dictionary> (); + protected readonly HashSet public_api = new HashSet (); + protected readonly Dictionary> override_methods = new Dictionary> (); + protected readonly Dictionary> base_methods = new Dictionary> (); + protected readonly Dictionary symbol_readers = new Dictionary (); + protected readonly Dictionary> class_type_base_hierarchy = new Dictionary> (); + protected readonly Dictionary> derived_interfaces = new Dictionary> (); + + protected readonly Dictionary> custom_annotations = new Dictionary> (); + protected readonly Dictionary> resources_to_remove = new Dictionary> (); + protected readonly HashSet marked_attributes = new HashSet (); + readonly HashSet marked_types_with_cctor = new HashSet (); + protected readonly HashSet marked_instantiated = new HashSet (); + protected readonly HashSet indirectly_called = new HashSet (); + + + public AnnotationStore (LinkContext context) => this.context = context; + + public bool ProcessSatelliteAssemblies { get; set; } + + protected Tracer Tracer { + get { + return context.Tracer; + } + } + + [Obsolete ("Use Tracer in LinkContext directly")] + public void PrepareDependenciesDump () + { + Tracer.AddRecorder (new XmlDependencyRecorder (context)); + } + + [Obsolete ("Use Tracer in LinkContext directly")] + public void PrepareDependenciesDump (string filename) + { + Tracer.AddRecorder (new XmlDependencyRecorder (context, filename)); + } + + public ICollection GetAssemblies () + { + return assembly_actions.Keys; + } + + public AssemblyAction GetAction (AssemblyDefinition assembly) + { + AssemblyAction action; + if (assembly_actions.TryGetValue (assembly, out action)) + return action; + + throw new InvalidOperationException ($"No action for the assembly {assembly.Name} defined"); + } + + public MethodAction GetAction (MethodDefinition method) + { + MethodAction action; + if (method_actions.TryGetValue (method, out action)) + return action; + + return MethodAction.Nothing; + } + + public void SetAction (AssemblyDefinition assembly, AssemblyAction action) + { + assembly_actions [assembly] = action; + } + + public bool HasAction (AssemblyDefinition assembly) + { + return assembly_actions.ContainsKey (assembly); + } + + public void SetAction (MethodDefinition method, MethodAction action) + { + method_actions [method] = action; + } + + public void SetMethodStubValue (MethodDefinition method, object value) + { + method_stub_values [method] = value; + } + + public void SetFieldValue (FieldDefinition field, object value) + { + field_values [field] = value; + } + + public void SetSubstitutedInit (FieldDefinition field) + { + field_init.Add (field); + } + + public bool HasSubstitutedInit (FieldDefinition field) + { + return field_init.Contains (field); + } + + public void SetSubstitutedInit (TypeDefinition type) + { + fieldType_init.Add (type); + } + + public bool HasSubstitutedInit (TypeDefinition type) + { + return fieldType_init.Contains (type); + } + + public void Mark (IMetadataTokenProvider provider) + { + marked.Add (provider); + Tracer.AddDependency (provider, true); + } + + public void Mark (CustomAttribute attribute) + { + marked_attributes.Add (attribute); + } + + public void MarkAndPush (IMetadataTokenProvider provider) + { + Mark (provider); + Tracer.Push (provider, false); + } + + public bool IsMarked (IMetadataTokenProvider provider) + { + return marked.Contains (provider); + } + + public bool IsMarked (CustomAttribute attribute) + { + return marked_attributes.Contains (attribute); + } + + public void MarkIndirectlyCalledMethod (MethodDefinition method) + { + if (!context.AddReflectionAnnotations) + return; + + indirectly_called.Add (method); + } + + public bool HasMarkedAnyIndirectlyCalledMethods () + { + return indirectly_called.Count != 0; + } + + public bool IsIndirectlyCalled (MethodDefinition method) + { + return indirectly_called.Contains (method); + } + + public void MarkInstantiated (TypeDefinition type) + { + marked_instantiated.Add (type); + } + + public bool IsInstantiated (TypeDefinition type) + { + return marked_instantiated.Contains (type); + } + + public void Processed (IMetadataTokenProvider provider) + { + processed.Add (provider); + } + + public bool IsProcessed (IMetadataTokenProvider provider) + { + return processed.Contains (provider); + } + + public bool IsPreserved (TypeDefinition type) + { + return preserved_types.ContainsKey (type); + } + + public void SetPreserve (TypeDefinition type, TypePreserve preserve) + { + TypePreserve existing; + if (preserved_types.TryGetValue (type, out existing)) + preserved_types [type] = ChoosePreserveActionWhichPreservesTheMost (existing, preserve); + else + preserved_types.Add (type, preserve); + } + + public static TypePreserve ChoosePreserveActionWhichPreservesTheMost (TypePreserve leftPreserveAction, TypePreserve rightPreserveAction) + { + if (leftPreserveAction == rightPreserveAction) + return leftPreserveAction; + + if (leftPreserveAction == TypePreserve.All || rightPreserveAction == TypePreserve.All) + return TypePreserve.All; + + if (leftPreserveAction == TypePreserve.Nothing) + return rightPreserveAction; + + if (rightPreserveAction == TypePreserve.Nothing) + return leftPreserveAction; + + if ((leftPreserveAction == TypePreserve.Methods && rightPreserveAction == TypePreserve.Fields) || + (leftPreserveAction == TypePreserve.Fields && rightPreserveAction == TypePreserve.Methods)) + return TypePreserve.All; + + return rightPreserveAction; + } + + public TypePreserve GetPreserve (TypeDefinition type) + { + TypePreserve preserve; + if (preserved_types.TryGetValue (type, out preserve)) + return preserve; + + throw new NotSupportedException ($"No type preserve information for `{type}`"); + } + + public bool TryGetPreserve (TypeDefinition type, out TypePreserve preserve) + { + return preserved_types.TryGetValue (type, out preserve); + } + + public bool TryGetMethodStubValue (MethodDefinition method, out object value) + { + return method_stub_values.TryGetValue (method, out value); + } + + public bool TryGetFieldUserValue (FieldDefinition field, out object value) + { + return field_values.TryGetValue (field, out value); + } + + public HashSet GetResourcesToRemove (AssemblyDefinition assembly) + { + HashSet resources; + if (resources_to_remove.TryGetValue (assembly, out resources)) + return resources; + + return null; + } + + public void AddResourceToRemove (AssemblyDefinition assembly, string name) + { + HashSet resources; + if (!resources_to_remove.TryGetValue (assembly, out resources)) { + resources = resources_to_remove [assembly] = new HashSet (); + } + + resources.Add (name); + } + + public void SetPublic (IMetadataTokenProvider provider) + { + public_api.Add (provider); + } + + public bool IsPublic (IMetadataTokenProvider provider) + { + return public_api.Contains (provider); + } + + public void AddOverride (MethodDefinition @base, MethodDefinition @override, InterfaceImplementation matchingInterfaceImplementation = null) + { + var methods = GetOverrides (@base); + if (methods is null) { + methods = new List (); + override_methods [@base] = methods; + } + + methods.Add (new OverrideInformation (@base, @override, matchingInterfaceImplementation)); + } + + public List GetOverrides (MethodDefinition method) + { + List overrides; + if (override_methods.TryGetValue (method, out overrides)) + return overrides; + + return null; + } + + public void AddBaseMethod (MethodDefinition method, MethodDefinition @base) + { + var methods = GetBaseMethods (method); + if (methods is null) { + methods = new List (); + base_methods [method] = methods; + } + + methods.Add (@base); + } + + public List GetBaseMethods (MethodDefinition method) + { + List bases; + if (base_methods.TryGetValue (method, out bases)) + return bases; + + return null; + } + + public List GetPreservedMethods (TypeDefinition type) + { + return GetPreservedMethods (type as IMemberDefinition); + } + + public void AddPreservedMethod (TypeDefinition type, MethodDefinition method) + { + AddPreservedMethod (type as IMemberDefinition, method); + } + + public List GetPreservedMethods (MethodDefinition method) + { + return GetPreservedMethods (method as IMemberDefinition); + } + + public void AddPreservedMethod (MethodDefinition key, MethodDefinition method) + { + AddPreservedMethod (key as IMemberDefinition, method); + } + + List GetPreservedMethods (IMemberDefinition definition) + { + List preserved; + if (preserved_methods.TryGetValue (definition, out preserved)) + return preserved; + + return null; + } + + void AddPreservedMethod (IMemberDefinition definition, MethodDefinition method) + { + var methods = GetPreservedMethods (definition); + if (methods is null) { + methods = new List (); + preserved_methods [definition] = methods; + } + + methods.Add (method); + } + + public void AddSymbolReader (AssemblyDefinition assembly, ISymbolReader symbolReader) + { + symbol_readers [assembly] = symbolReader; + } + + public void CloseSymbolReader (AssemblyDefinition assembly) + { + ISymbolReader symbolReader; + if (!symbol_readers.TryGetValue (assembly, out symbolReader)) + return; + + symbol_readers.Remove (assembly); + symbolReader.Dispose (); + } + + public Dictionary GetCustomAnnotations (object key) + { + Dictionary slots; + if (custom_annotations.TryGetValue (key, out slots)) + return slots; + + slots = new Dictionary (); + custom_annotations.Add (key, slots); + return slots; + } + + public bool HasPreservedStaticCtor (TypeDefinition type) + { + return marked_types_with_cctor.Contains (type); + } + + public bool SetPreservedStaticCtor (TypeDefinition type) + { + return marked_types_with_cctor.Add (type); + } + + public void SetClassHierarchy (TypeDefinition type, List bases) + { + class_type_base_hierarchy [type] = bases; + } + + public List GetClassHierarchy (TypeDefinition type) + { + if (class_type_base_hierarchy.TryGetValue (type, out List bases)) + return bases; + + return null; + } + + public void AddDerivedInterfaceForInterface (TypeDefinition @base, TypeDefinition derived) + { + if (!@base.IsInterface) + throw new ArgumentException ($"{nameof (@base)} must be an interface"); + + if (!derived.IsInterface) + throw new ArgumentException ($"{nameof (derived)} must be an interface"); + + List derivedInterfaces; + if (!derived_interfaces.TryGetValue (@base, out derivedInterfaces)) + derived_interfaces [@base] = derivedInterfaces = new List (); + + derivedInterfaces.Add (derived); + } + + public List GetDerivedInterfacesForInterface (TypeDefinition @interface) + { + if (!@interface.IsInterface) + throw new ArgumentException ($"{nameof (@interface)} must be an interface"); + + List derivedInterfaces; + if (derived_interfaces.TryGetValue (@interface, out derivedInterfaces)) + return derivedInterfaces; + + return null; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyAction.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyAction.cs new file mode 100644 index 000000000000..341339cd1597 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyAction.cs @@ -0,0 +1,55 @@ +// +// AssemblyAction.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +namespace Mono.Linker { + + public enum AssemblyAction { + // Ignore the assembly + Skip, + // Copy the existing files, assembly and symbols, into the output destination. E.g. .dll and .mdb + // The linker still analyzes the assemblies (to know what they require) but does not modify them. + Copy, + // Copy the existing files, assembly and symbols, into the output destination if and only if + // anything from the assembly is used. + // The linker still analyzes the assemblies (to know what they require) but does not modify them. + CopyUsed, + // Link the assembly + Link, + // Remove the assembly from the output + Delete, + // Save the assembly/symbols in memory without linking it. + // E.g. useful to remove unneeded assembly references (as done in SweepStep), + // resolving [TypeForwardedTo] attributes (like PCL) to their final location + Save, + // Keep all types, methods, and fields but add System.Runtime.BypassNGenAttribute to unmarked methods. + AddBypassNGen, + // Keep all types, methods, and fields in marked assemblies but add System.Runtime.BypassNGenAttribute to unmarked methods. + // Delete unmarked assemblies. + AddBypassNGenUsed + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyResolver.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyResolver.cs new file mode 100644 index 000000000000..0b7367539c00 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyResolver.cs @@ -0,0 +1,157 @@ +// +// AssemblyResolver.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.IO; +using Mono.Cecil; +using Mono.Collections.Generic; + +namespace Mono.Linker { + +#if FEATURE_ILLINK + public class AssemblyResolver : DirectoryAssemblyResolver { +#else + public class AssemblyResolver : BaseAssemblyResolver { +#endif + + readonly Dictionary _assemblies; + HashSet _unresolvedAssemblies; + bool _ignoreUnresolved; + LinkContext _context; + readonly Collection _references; + + + public IDictionary AssemblyCache { + get { return _assemblies; } + } + + public AssemblyResolver () + : this (new Dictionary (StringComparer.OrdinalIgnoreCase)) + { + } + + public AssemblyResolver (Dictionary assembly_cache) + { + _assemblies = assembly_cache; + _references = new Collection () { }; + } + + public bool IgnoreUnresolved { + get { return _ignoreUnresolved; } + set { _ignoreUnresolved = value; } + } + + public LinkContext Context { + get { return _context; } + set { _context = value; } + } + +#if !FEATURE_ILLINK + // The base class's definition of GetAssembly is visible when using DirectoryAssemblyResolver. + AssemblyDefinition GetAssembly (string file, ReaderParameters parameters) + { + if (parameters.AssemblyResolver is null) + parameters.AssemblyResolver = this; + + return ModuleDefinition.ReadModule (file, parameters).Assembly; + } +#endif + + AssemblyDefinition ResolveFromReferences (AssemblyNameReference name, Collection references, ReaderParameters parameters) + { + var fileName = name.Name + ".dll"; + foreach (var reference in references) { + if (Path.GetFileName (reference) != fileName) + continue; + try { + return GetAssembly (reference, parameters); + } catch (BadImageFormatException) { + continue; + } + } + + return null; + } + + public override AssemblyDefinition Resolve (AssemblyNameReference name, ReaderParameters parameters) + { + // Validate arguments, similarly to how the base class does it. + if (name is null) + throw new ArgumentNullException ("name"); + if (parameters is null) + throw new ArgumentNullException ("parameters"); + + AssemblyDefinition asm = null; + if (!_assemblies.TryGetValue (name.Name, out asm) && (_unresolvedAssemblies is null || !_unresolvedAssemblies.Contains (name.Name))) { + try { + // Any full path explicit reference takes precedence over other look up logic + asm = ResolveFromReferences (name, _references, parameters); + + // Fall back to the base class resolution logic + if (asm is null) + asm = base.Resolve (name, parameters); + + _assemblies [name.Name] = asm; + } catch (AssemblyResolutionException) { + if (!_ignoreUnresolved) + throw; + _context.LogMessage ($"warning: Ignoring unresolved assembly '{name.Name}'."); + if (_unresolvedAssemblies is null) + _unresolvedAssemblies = new HashSet (); + _unresolvedAssemblies.Add (name.Name); + } + } + + return asm; + } + + public virtual AssemblyDefinition CacheAssembly (AssemblyDefinition assembly) + { + _assemblies [assembly.Name.Name] = assembly; + base.AddSearchDirectory (Path.GetDirectoryName (assembly.MainModule.FileName)); + return assembly; + } + + public void AddReferenceAssembly (string referencePath) + { + _references.Add (referencePath); + } + + protected override void Dispose (bool disposing) + { + foreach (var asm in _assemblies.Values) { + asm.Dispose (); + } + + _assemblies.Clear (); + if (_unresolvedAssemblies is not null) + _unresolvedAssemblies.Clear (); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyUtilities.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyUtilities.cs new file mode 100644 index 000000000000..a0da2a92fb7a --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/AssemblyUtilities.cs @@ -0,0 +1,16 @@ +using System; +using Mono.Cecil; + +namespace Mono.Linker { + + public static class AssemblyUtilities { + + public static bool IsCrossgened (this ModuleDefinition module) + { + return (module.Attributes & ModuleAttributes.ILOnly) == 0 && + (module.Attributes & ModuleAttributes.ILLibrary) != 0; + } + + } + +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/BCL.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/BCL.cs new file mode 100644 index 000000000000..c0f504e587dc --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/BCL.cs @@ -0,0 +1,84 @@ +using Mono.Cecil; + +namespace Mono.Linker { + public static class BCL { + public static class EventTracingForWindows { + public static bool IsEventSourceImplementation (TypeDefinition type, LinkContext context = null) + { + if (!type.IsClass) + return false; + + while (type.BaseType is not null) { + var bt = type.BaseType.Resolve (); + + if (bt is null) { + if (context is not null && !context.IgnoreUnresolved) + throw new ResolutionException (type.BaseType); + + break; + } + + if (IsEventSourceType (bt)) + return true; + + type = bt; + } + + return false; + } + + public static bool IsEventSourceType (TypeReference type) + { + return type.Namespace == "System.Diagnostics.Tracing" && type.Name == "EventSource"; + } + + public static bool IsNonEventAtribute (TypeReference type) + { + return type.Namespace == "System.Diagnostics.Tracing" && type.Name == "NonEventAttribute"; + } + + public static bool IsProviderName (string name) + { + return name == "Keywords" || name == "Tasks" || name == "Opcodes"; + } + } + + public static bool IsIDisposableImplementation (MethodDefinition method) + { + if (method.Name != "Dispose" || method.ReturnType.MetadataType != MetadataType.Void) + return false; + + if (method.HasParameters || method.HasGenericParameters || method.IsStatic) + return false; + + if (!method.IsFinal) + return false; + + return true; + } + + static readonly string [] corlibNames = new [] { + "mscorlib", + "System.Runtime", + "System.Private.CoreLib", + "netstandard" + }; + + public static TypeDefinition FindPredefinedType (string ns, string name, LinkContext context) + { + var cache = context.Resolver.AssemblyCache; + + foreach (var corlibName in corlibNames) { + if (!cache.TryGetValue (corlibName, out AssemblyDefinition corlib)) + continue; + + TypeDefinition type = corlib.MainModule.GetType (ns, name); + // The assembly could be a facade with type forwarders, in which case we don't find the type in this assembly. + if (type is not null) + return type; + } + + return null; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ConsoleLogger.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ConsoleLogger.cs new file mode 100644 index 000000000000..49305240d619 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ConsoleLogger.cs @@ -0,0 +1,9 @@ +using System; +namespace Mono.Linker { + public class ConsoleLogger : ILogger { + public void LogMessage (MessageImportance importance, string message, params object [] values) + { + Console.WriteLine (message, values); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/I18nAssemblies.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/I18nAssemblies.cs new file mode 100644 index 000000000000..a14c58fe2aed --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/I18nAssemblies.cs @@ -0,0 +1,47 @@ +// +// I18nAssemblies.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; + +namespace Mono.Linker { + + [Flags] + public enum I18nAssemblies { + + None = 0, + + CJK = 1, + MidEast = 2, + Other = 4, + Rare = 8, + West = 16, + + All = CJK | MidEast | Other | Rare | West, + Base + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IDependencyRecorder.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IDependencyRecorder.cs new file mode 100644 index 000000000000..7ad5b6b8c553 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IDependencyRecorder.cs @@ -0,0 +1,42 @@ +// +// IDependencyRecorder.cs +// +// Copyright (C) 2017 Microsoft Corporation (http://www.microsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +namespace Mono.Linker { + /// + /// Abstraction exposed by the linker (mostly MarkStep, but not only) - it will call this interface + /// every time it finds a dependency between two parts of the dependency graph. + /// + public interface IDependencyRecorder { + /// + /// Reports a dependency detected by the linker. + /// + /// The source of the dependency (for example the caller method). + /// The target of the dependency (for example the callee method). + /// true if the target is also marked by the MarkStep. + /// The source and target are typically Cecil metadata objects (MethodDefinition, TypeDefinition, ...) + /// but they can also be the linker steps or really any other object. + void RecordDependency (object source, object target, bool marked); + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ILogger.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ILogger.cs new file mode 100644 index 000000000000..6aa49124b883 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/ILogger.cs @@ -0,0 +1,12 @@ +using System; +namespace Mono.Linker { + public enum MessageImportance { + High, + Low, + Normal, + } + + public interface ILogger { + void LogMessage (MessageImportance importance, string message, params object [] values); + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IReflectionPatternRecorder.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IReflectionPatternRecorder.cs new file mode 100644 index 000000000000..a3b236a86dea --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IReflectionPatternRecorder.cs @@ -0,0 +1,60 @@ +// +// IReflectionPatternRecorder.cs +// +// Copyright (C) 2017 Microsoft Corporation (http://www.microsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Mono.Cecil; + +namespace Mono.Linker { + /// + /// Interface which is called every time the linker inspects a pattern of code involving reflection to determine a more complex + /// dependency. + /// + /// + /// The rules are such that if a given callsite of a "reflectionMethod" gets examined + /// linker will always report it one way or another: + /// - it will either call RecognizedReflectionAccessPattern method when it can figure out exactly the dependency. + /// - or it will call UnrecognizedReflectionAccessPattern with an optional message describing why it could not recognize + /// the pattern. + /// + public interface IReflectionPatternRecorder { + /// + /// Called when the linker recognized a reflection access pattern (and thus was able to correctly apply marking to the accessed item). + /// + /// The method which contains the reflection access pattern. + /// The reflection method which is at the heart of the access pattern. + /// The item accessed through reflection. This can be one of: + /// TypeDefinition, MethodDefinition, PropertyDefinition, FieldDefinition, EventDefinition. + void RecognizedReflectionAccessPattern (MethodDefinition sourceMethod, MethodDefinition reflectionMethod, IMemberDefinition accessedItem); + + /// + /// Called when the linker detected a reflection access but was not able to recognize the entire pattern. + /// + /// The method which contains the reflection access code. + /// The reflection method which is at the heart of the access code. + /// Humanly readable message describing what failed during the pattern recognition. + /// This effectively means that there's a potential hole in the linker marking - some items which are accessed only through + /// reflection may not be marked correctly and thus may fail at runtime. + void UnrecognizedReflectionAccessPattern (MethodDefinition sourceMethod, MethodDefinition reflectionMethod, string message); + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IXApiVisitor.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IXApiVisitor.cs new file mode 100644 index 000000000000..204d699ee14e --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/IXApiVisitor.cs @@ -0,0 +1,47 @@ +// +// XApiVisitor.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Xml.XPath; + +using Mono.Cecil; + +namespace Mono.Linker { + + public interface IXApiVisitor { + + void OnAssembly (XPathNavigator nav, AssemblyDefinition assembly); + void OnAttribute (XPathNavigator nav); + void OnClass (XPathNavigator nav, TypeDefinition type); + void OnInterface (XPathNavigator nav, TypeDefinition type); + void OnField (XPathNavigator nav, FieldDefinition field); + void OnMethod (XPathNavigator nav, MethodDefinition method); + void OnConstructor (XPathNavigator nav, MethodDefinition method); + void OnProperty (XPathNavigator nav, PropertyDefinition property); + void OnEvent (XPathNavigator nav, EventDefinition evt); + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Inflater.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Inflater.cs new file mode 100644 index 000000000000..54c710cf93a4 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Inflater.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Mono.Cecil; + +namespace Mono.Linker { + class Inflater { + public static TypeReference InflateType (GenericContext context, TypeReference typeReference) + { + var typeDefinition = InflateTypeWithoutException (context, typeReference); + if (typeDefinition is null) + throw new InvalidOperationException ($"Unable to resolve a reference to the type '{typeReference.FullName}' in the assembly '{typeReference.Module.Assembly.FullName}'. Does this type exist in a different assembly in the project?"); + + return typeDefinition; + } + + public static GenericInstanceType InflateType (GenericContext context, TypeDefinition typeDefinition) + { + return ConstructGenericType (context, typeDefinition, typeDefinition.GenericParameters); + } + + public static GenericInstanceType InflateType (GenericContext context, GenericInstanceType genericInstanceType) + { + var inflatedType = ConstructGenericType (context, genericInstanceType.Resolve (), genericInstanceType.GenericArguments); + inflatedType.MetadataToken = genericInstanceType.MetadataToken; + return inflatedType; + } + + public static TypeReference InflateTypeWithoutException (GenericContext context, TypeReference typeReference) + { + var genericParameter = typeReference as GenericParameter; + if (genericParameter is not null) { + if (context.Method is null && genericParameter.Type != GenericParameterType.Type) { + // If no method is specified assume only partial inflation is desired. + return typeReference; + } + + var genericArgumentType = genericParameter.Type == GenericParameterType.Type + ? context.Type.GenericArguments [genericParameter.Position] + : context.Method.GenericArguments [genericParameter.Position]; + + var inflatedType = genericArgumentType; + return inflatedType; + } + var genericInstanceType = typeReference as GenericInstanceType; + if (genericInstanceType is not null) + return InflateType (context, genericInstanceType); + + var arrayType = typeReference as ArrayType; + if (arrayType is not null) + return new ArrayType (InflateType (context, arrayType.ElementType), arrayType.Rank); + + var byReferenceType = typeReference as ByReferenceType; + if (byReferenceType is not null) + return new ByReferenceType (InflateType (context, byReferenceType.ElementType)); + + var pointerType = typeReference as PointerType; + if (pointerType is not null) + return new PointerType (InflateType (context, pointerType.ElementType)); + + var reqModType = typeReference as RequiredModifierType; + if (reqModType is not null) + return InflateTypeWithoutException (context, reqModType.ElementType); + + var optModType = typeReference as OptionalModifierType; + if (optModType is not null) + return InflateTypeWithoutException (context, optModType.ElementType); + + return typeReference.Resolve (); + } + + static GenericInstanceType ConstructGenericType (GenericContext context, TypeDefinition typeDefinition, IEnumerable genericArguments) + { + var inflatedType = new GenericInstanceType (typeDefinition); + + foreach (var genericArgument in genericArguments) + inflatedType.GenericArguments.Add (InflateType (context, genericArgument)); + + return inflatedType; + } + + public class GenericContext { + private readonly GenericInstanceType _type; + private readonly GenericInstanceMethod _method; + + public GenericContext (GenericInstanceType type, GenericInstanceMethod method) + { + _type = type; + _method = method; + } + + public GenericInstanceType Type { + get { return _type; } + } + + public GenericInstanceMethod Method { + get { return _method; } + } + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/KnownMembers.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/KnownMembers.cs new file mode 100644 index 000000000000..7fc1023de6c2 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/KnownMembers.cs @@ -0,0 +1,29 @@ +using Mono.Cecil; + +namespace Mono.Linker { + public class KnownMembers { + public MethodDefinition NotSupportedExceptionCtorString { get; set; } + public MethodDefinition DisablePrivateReflectionAttributeCtor { get; set; } + public MethodDefinition ObjectCtor { get; set; } + + public static bool IsNotSupportedExceptionCtorString (MethodDefinition method) + { + if (!method.IsConstructor || method.IsStatic || !method.HasParameters) + return false; + + if (method.Parameters.Count != 1 || method.Parameters [0].ParameterType.MetadataType != MetadataType.String) + return false; + + return true; + } + + public static bool IsSatelliteAssemblyMarker (MethodDefinition method) + { + if (!method.IsConstructor || method.IsStatic) + return false; + + var declaringType = method.DeclaringType; + return declaringType.Name == "ResourceManager" && declaringType.Namespace == "System.Resources"; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LinkContext.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LinkContext.cs new file mode 100644 index 000000000000..d03dacb8aa25 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LinkContext.cs @@ -0,0 +1,461 @@ +// +// LinkContext.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.IO; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Mono.Linker { + + public class UnintializedContextFactory { + virtual public AnnotationStore CreateAnnotationStore (LinkContext context) => new AnnotationStore (context); + virtual public MarkingHelpers CreateMarkingHelpers (LinkContext context) => new MarkingHelpers (context); + virtual public Tracer CreateTracer (LinkContext context) => new Tracer (context); + } + + public class LinkContext : IDisposable { + + Pipeline _pipeline; + AssemblyAction _coreAction; + AssemblyAction _userAction; + Dictionary _actions; + string _outputDirectory; + readonly Dictionary _parameters; + bool _linkSymbols; + bool _keepTypeForwarderOnlyAssemblies; + bool _keepMembersForDebugger; + bool _ignoreUnresolved; + + AssemblyResolver _resolver; + + ReaderParameters _readerParameters; + ISymbolReaderProvider _symbolReaderProvider; + ISymbolWriterProvider _symbolWriterProvider; + + AnnotationStore _annotations; + + public Pipeline Pipeline { + get { return _pipeline; } + } + + public AnnotationStore Annotations { + get { return _annotations; } + } + + public bool DeterministicOutput { get; set; } + + public string OutputDirectory { + get { return _outputDirectory; } + set { _outputDirectory = value; } + } + + public AssemblyAction CoreAction { + get { return _coreAction; } + set { _coreAction = value; } + } + + public AssemblyAction UserAction { + get { return _userAction; } + set { _userAction = value; } + } + + public bool LinkSymbols { + get { return _linkSymbols; } + set { _linkSymbols = value; } + } + + public bool KeepTypeForwarderOnlyAssemblies { + get { return _keepTypeForwarderOnlyAssemblies; } + set { _keepTypeForwarderOnlyAssemblies = value; } + } + + public bool KeepMembersForDebugger { + get { return _keepMembersForDebugger; } + set { _keepMembersForDebugger = value; } + } + + public bool IgnoreUnresolved { + get { return _ignoreUnresolved; } + set { _ignoreUnresolved = value; } + } + + public bool EnableReducedTracing { get; set; } + + public bool KeepUsedAttributeTypesOnly { get; set; } + + public bool KeepDependencyAttributes { get; set; } + + public bool StripResources { get; set; } + + public List Substitutions { get; private set; } + + public System.Collections.IDictionary Actions { + get { return _actions; } + } + + public AssemblyResolver Resolver { + get { return _resolver; } + } + + public ReaderParameters ReaderParameters { + get { return _readerParameters; } + } + + public ISymbolReaderProvider SymbolReaderProvider { + get { return _symbolReaderProvider; } + set { _symbolReaderProvider = value; } + } + + public ISymbolWriterProvider SymbolWriterProvider { + get { return _symbolWriterProvider; } + set { _symbolWriterProvider = value; } + } + + public bool LogMessages { get; set; } + + public ILogger Logger { private get; set; } = new ConsoleLogger (); + + public MarkingHelpers MarkingHelpers { get; private set; } + + public KnownMembers MarkedKnownMembers { get; private set; } + + public Tracer Tracer { get; private set; } + + public IReflectionPatternRecorder ReflectionPatternRecorder { get; set; } + + public string [] ExcludedFeatures { get; set; } + + public CodeOptimizations DisabledOptimizations { get; set; } + + public bool AddReflectionAnnotations { get; set; } + + public string AssemblyListFile { get; set; } + + public LinkContext (Pipeline pipeline) + : this (pipeline, new AssemblyResolver ()) + { + } + + public LinkContext (Pipeline pipeline, AssemblyResolver resolver) + : this (pipeline, resolver, new ReaderParameters { + AssemblyResolver = resolver + }, new UnintializedContextFactory ()) + { + } + + public LinkContext (Pipeline pipeline, AssemblyResolver resolver, ReaderParameters readerParameters, UnintializedContextFactory factory) + { + _pipeline = pipeline; + _resolver = resolver; + _resolver.Context = this; + _actions = new Dictionary (); + _parameters = new Dictionary (); + _readerParameters = readerParameters; + + SymbolReaderProvider = new DefaultSymbolReaderProvider (false); + + if (factory is null) + throw new ArgumentNullException (nameof (factory)); + + _annotations = factory.CreateAnnotationStore (this); + MarkingHelpers = factory.CreateMarkingHelpers (this); + Tracer = factory.CreateTracer (this); + ReflectionPatternRecorder = new LoggingReflectionPatternRecorder (this); + MarkedKnownMembers = new KnownMembers (); + StripResources = true; + + // See https://github.com/mono/linker/issues/612 + DisabledOptimizations |= CodeOptimizations.UnreachableBodies; + DisabledOptimizations |= CodeOptimizations.ClearInitLocals; + DisabledOptimizations |= CodeOptimizations.IPConstantPropagation; + } + + public void AddSubstitutionFile (string file) + { + if (Substitutions is null) { + Substitutions = new List (); + Substitutions.Add (file); + return; + } + + if (Substitutions.Contains (file)) + return; + + Substitutions.Add (file); + } + + public TypeDefinition GetType (string fullName) + { + int pos = fullName.IndexOf (","); + fullName = TypeReferenceExtensions.ToCecilName (fullName); + if (pos == -1) { + foreach (AssemblyDefinition asm in GetAssemblies ()) { + var type = asm.MainModule.GetType (fullName); + if (type is not null) + return type; + } + + return null; + } + + string asmname = fullName.Substring (pos + 1); + fullName = fullName.Substring (0, pos); + AssemblyDefinition assembly = Resolve (AssemblyNameReference.Parse (asmname)); + return assembly.MainModule.GetType (fullName); + } + + public AssemblyDefinition Resolve (string name) + { + if (File.Exists (name)) { + try { + AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly (name, _readerParameters); + return _resolver.CacheAssembly (assembly); + } catch (Exception e) { + throw new AssemblyResolutionException (new AssemblyNameReference (name, new Version ()), e); + } + } + + return Resolve (new AssemblyNameReference (name, new Version ())); + } + + public AssemblyDefinition Resolve (IMetadataScope scope) + { + AssemblyNameReference reference = GetReference (scope); + try { + AssemblyDefinition assembly = _resolver.Resolve (reference, _readerParameters); + + if (assembly is not null) + RegisterAssembly (assembly); + + return assembly; + } catch (Exception e) { + throw new AssemblyResolutionException (reference, e); + } + } + + public void RegisterAssembly (AssemblyDefinition assembly) + { + if (SeenFirstTime (assembly)) { + SafeReadSymbols (assembly); + SetDefaultAction (assembly); + } + } + + protected bool SeenFirstTime (AssemblyDefinition assembly) + { + return !_annotations.HasAction (assembly); + } + + public virtual void SafeReadSymbols (AssemblyDefinition assembly) + { + if (assembly.MainModule.HasSymbols) + return; + + if (_symbolReaderProvider is null) + throw new ArgumentNullException (nameof (_symbolReaderProvider)); + + try { + var symbolReader = _symbolReaderProvider.GetSymbolReader ( + assembly.MainModule, + assembly.MainModule.FileName); + + if (symbolReader is null) + return; + + try { + assembly.MainModule.ReadSymbols (symbolReader); + } catch { + symbolReader.Dispose (); + return; + } + + // Add symbol reader to annotations only if we have successfully read it + _annotations.AddSymbolReader (assembly, symbolReader); + } catch { } + } + + public virtual ICollection ResolveReferences (AssemblyDefinition assembly) + { + List references = new List (); + if (assembly is null) + return references; + foreach (AssemblyNameReference reference in assembly.MainModule.AssemblyReferences) { + AssemblyDefinition definition = Resolve (reference); + if (definition is not null) + references.Add (definition); + } + return references; + } + + static AssemblyNameReference GetReference (IMetadataScope scope) + { + AssemblyNameReference reference; + if (scope is ModuleDefinition) { + AssemblyDefinition asm = ((ModuleDefinition) scope).Assembly; + reference = asm.Name; + } else + reference = (AssemblyNameReference) scope; + + return reference; + } + + public void SetAction (AssemblyDefinition assembly, AssemblyAction defaultAction) + { + RegisterAssembly (assembly); + + if (!_actions.TryGetValue (assembly.Name.Name, out AssemblyAction action)) + action = defaultAction; + + Annotations.SetAction (assembly, action); + } + + protected void SetDefaultAction (AssemblyDefinition assembly) + { + AssemblyAction action; + + AssemblyNameDefinition name = assembly.Name; + + if (_actions.TryGetValue (name.Name, out action)) { + } else if (IsCore (name)) { + action = _coreAction; + } else { + action = _userAction; + } + + _annotations.SetAction (assembly, action); + } + + public static bool IsCore (AssemblyNameReference name) + { + switch (name.Name) { + case "mscorlib": + case "Accessibility": + case "Mono.Security": + // WPF + case "PresentationFramework": + case "PresentationCore": + case "WindowsBase": + case "UIAutomationProvider": + case "UIAutomationTypes": + case "PresentationUI": + case "ReachFramework": + case "netstandard": + return true; + default: + return name.Name.StartsWith ("System") + || name.Name.StartsWith ("Microsoft"); + } + } + + public virtual AssemblyDefinition [] GetAssemblies () + { + var cache = _resolver.AssemblyCache; + AssemblyDefinition [] asms = new AssemblyDefinition [cache.Count]; + cache.Values.CopyTo (asms, 0); + return asms; + } + + public void SetParameter (string key, string value) + { + _parameters [key] = value; + } + + public bool HasParameter (string key) + { + return _parameters.ContainsKey (key); + } + + public string GetParameter (string key) + { + string val = null; + _parameters.TryGetValue (key, out val); + return val; + } + + public void Dispose () + { + _resolver.Dispose (); + } + + public bool IsFeatureExcluded (string featureName) + { + return ExcludedFeatures is not null && Array.IndexOf (ExcludedFeatures, featureName) >= 0; + } + + public bool IsOptimizationEnabled (CodeOptimizations optimization) + { + return (DisabledOptimizations & optimization) == 0; + } + + public void LogMessage (string message) + { + LogMessage (MessageImportance.Normal, message); + } + + public void LogMessage (MessageImportance importance, string message) + { + if (LogMessages && Logger is not null) + Logger.LogMessage (importance, "{0}", message); + } + } + + [Flags] + public enum CodeOptimizations { + BeforeFieldInit = 1 << 0, + + /// + /// Option to disable removal of overrides of virtual methods when a type is never instantiated + /// + /// Being able to disable this optimization is helpful when trying to troubleshoot problems caused by types created via reflection or from native + /// that do not get an instance constructor marked. + /// + OverrideRemoval = 1 << 1, + + /// + /// Option to disable delaying marking of instance methods until an instance of that type could exist + /// + UnreachableBodies = 1 << 2, + + /// + /// Option to clear the initlocals flag on methods + /// + ClearInitLocals = 1 << 3, + + /// + /// Option to remove .interfaceimpl for interface types that are not used + /// + UnusedInterfaces = 1 << 4, + + /// + /// Option to do interprocedural constant propagation on return values + /// + IPConstantPropagation = 1 << 5 + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoadException.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoadException.cs new file mode 100644 index 000000000000..2b11298d3a21 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoadException.cs @@ -0,0 +1,15 @@ +using System; + +namespace Mono.Linker { + public class LoadException : Exception { + public LoadException (string message) + : base (message) + { + } + + public LoadException (string message, Exception innerException) + : base (message, innerException) + { + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoggingReflectionPatternRecorder.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoggingReflectionPatternRecorder.cs new file mode 100644 index 000000000000..b64b1a792089 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/LoggingReflectionPatternRecorder.cs @@ -0,0 +1,47 @@ +// +// LoggingReflectionPatternRecorder.cs +// +// Copyright (C) 2017 Microsoft Corporation (http://www.microsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Mono.Cecil; + +namespace Mono.Linker { + class LoggingReflectionPatternRecorder : IReflectionPatternRecorder { + private readonly LinkContext _context; + + public LoggingReflectionPatternRecorder (LinkContext context) + { + _context = context; + } + + public void RecognizedReflectionAccessPattern (MethodDefinition sourceMethod, MethodDefinition reflectionMethod, IMemberDefinition accessedItem) + { + // Do nothing - there's no logging for successfully recognized patterns + } + + public void UnrecognizedReflectionAccessPattern (MethodDefinition sourceMethod, MethodDefinition reflectionMethod, string message) + { + _context.LogMessage (MessageImportance.Low, message); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkException.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkException.cs new file mode 100644 index 000000000000..7c84e5646386 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkException.cs @@ -0,0 +1,25 @@ +using System; + +using Mono.Cecil; + +namespace Mono.Linker { + public class MarkException : Exception { + public MethodDefinition Method { get; private set; } + + public MarkException (string message) + : base (message) + { + } + + public MarkException (string message, Exception innerException) + : base (message, innerException) + { + } + + public MarkException (string message, Exception innerException, MethodDefinition method) + : base (message, innerException) + { + Method = method; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkingHelpers.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkingHelpers.cs new file mode 100644 index 000000000000..4fa7ac0325a7 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MarkingHelpers.cs @@ -0,0 +1,20 @@ +using System; +using Mono.Cecil; + +namespace Mono.Linker { + public class MarkingHelpers { + protected readonly LinkContext _context; + + public MarkingHelpers (LinkContext context) + { + _context = context; + } + + public void MarkExportedType (ExportedType type, ModuleDefinition module) + { + _context.Annotations.Mark (type); + if (_context.KeepTypeForwarderOnlyAssemblies) + _context.Annotations.Mark (module); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodAction.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodAction.cs new file mode 100644 index 000000000000..a3550e78396b --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodAction.cs @@ -0,0 +1,38 @@ +// +// MethodAction.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +namespace Mono.Linker { + + public enum MethodAction { + Nothing, + Parse, + ForceParse, + ConvertToStub, + ConvertToThrow, + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodBodyScanner.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodBodyScanner.cs new file mode 100644 index 000000000000..ca726c63260f --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodBodyScanner.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Mono.Linker { + public static class MethodBodyScanner { + public static bool IsWorthConvertingToThrow (MethodBody body) + { + // Some bodies are cheaper size wise to leave alone than to convert to a throw + Instruction previousMeaningful = null; + int meaningfulCount = 0; + foreach (var ins in body.Instructions) { + // Handle ignoring noops because because (1) it's a valid case to ignore + // and (2) When running the tests on .net core roslyn tosses in no ops + // and that leads to a difference in test results between mcs and .net framework csc. + if (ins.OpCode.Code == Code.Nop) + continue; + + meaningfulCount++; + + if (meaningfulCount == 1 && ins.OpCode.Code == Code.Ret) + return false; + + if (meaningfulCount == 2 && ins.OpCode.Code == Code.Ret && previousMeaningful is not null) { + if (previousMeaningful.OpCode.StackBehaviourPop == StackBehaviour.Pop0) { + switch (previousMeaningful.OpCode.StackBehaviourPush) { + case StackBehaviour.Pushi: + case StackBehaviour.Pushi8: + case StackBehaviour.Pushr4: + case StackBehaviour.Pushr8: + return false; + } + + switch (previousMeaningful.OpCode.Code) { + case Code.Ldnull: + return false; + } + } + } + + if (meaningfulCount >= 2) + return true; + + previousMeaningful = ins; + } + + return true; + } + + public static IEnumerable GetReferencedInterfaces (AnnotationStore annotations, MethodBody body) + { + var possibleStackTypes = AllPossibleStackTypes (body.Method); + if (possibleStackTypes.Count == 0) + return null; + + var interfaceTypes = possibleStackTypes.Where (t => t.IsInterface).ToArray (); + if (interfaceTypes.Length == 0) + return null; + + var interfaceImplementations = new HashSet (); + + // If a type could be on the stack in the body and an interface it implements could be on the stack on the body + // then we need to mark that interface implementation. When this occurs it is not safe to remove the interface implementation from the type + // even if the type is never instantiated + foreach (var type in possibleStackTypes) { + // We only sweep interfaces on classes so that's why we only care about classes + if (!type.IsClass) + continue; + + AddMatchingInterfaces (interfaceImplementations, type, interfaceTypes); + var bases = annotations.GetClassHierarchy (type); + foreach (var @base in bases) { + AddMatchingInterfaces (interfaceImplementations, @base, interfaceTypes); + } + } + + return interfaceImplementations; + } + + static HashSet AllPossibleStackTypes (MethodDefinition method) + { + if (!method.HasBody) + throw new ArgumentException (); + + var body = method.Body; + var types = new HashSet (); + + foreach (VariableDefinition var in body.Variables) + AddIfResolved (types, var.VariableType); + + foreach (var parameter in body.Method.Parameters) + AddIfResolved (types, parameter.ParameterType); + + foreach (ExceptionHandler eh in body.ExceptionHandlers) { + if (eh.HandlerType == ExceptionHandlerType.Catch) { + AddIfResolved (types, eh.CatchType); + } + } + + foreach (Instruction instruction in body.Instructions) { + if (instruction.Operand is FieldReference fieldReference) { + AddIfResolved (types, fieldReference.Resolve ()?.FieldType); + } else if (instruction.Operand is MethodReference methodReference) { + if (methodReference is GenericInstanceMethod genericInstanceMethod) + AddFromGenericInstance (types, genericInstanceMethod); + + if (methodReference.DeclaringType is GenericInstanceType genericInstanceType) + AddFromGenericInstance (types, genericInstanceType); + + var resolvedMethod = methodReference.Resolve (); + if (resolvedMethod is not null) { + if (resolvedMethod.HasParameters) { + foreach (var param in resolvedMethod.Parameters) + AddIfResolved (types, param.ParameterType); + } + + AddFromGenericParameterProvider (types, resolvedMethod); + AddFromGenericParameterProvider (types, resolvedMethod.DeclaringType); + AddIfResolved (types, resolvedMethod.ReturnType); + } + } + } + + return types; + } + + static void AddMatchingInterfaces (HashSet results, TypeDefinition type, TypeDefinition [] interfaceTypes) + { + foreach (var interfaceType in interfaceTypes) { + if (type.HasInterface (interfaceType, out InterfaceImplementation implementation)) + results.Add (implementation); + } + } + + static void AddFromGenericInstance (HashSet set, IGenericInstance instance) + { + if (!instance.HasGenericArguments) + return; + + foreach (var genericArgument in instance.GenericArguments) + AddIfResolved (set, genericArgument); + } + + static void AddFromGenericParameterProvider (HashSet set, IGenericParameterProvider provider) + { + if (!provider.HasGenericParameters) + return; + + foreach (var genericParameter in provider.GenericParameters) { + foreach (var constraint in genericParameter.Constraints) + AddIfResolved (set, constraint.ConstraintType); + } + } + + static void AddIfResolved (HashSet set, TypeReference item) + { + var resolved = item?.Resolve (); + if (resolved is null) + return; + set.Add (resolved); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodDefinitionExtensions.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodDefinitionExtensions.cs new file mode 100644 index 000000000000..cc1d5b6896ee --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodDefinitionExtensions.cs @@ -0,0 +1,95 @@ +using Mono.Cecil; + +namespace Mono.Linker { + public static class MethodDefinitionExtensions { + public static bool IsDefaultConstructor (this MethodDefinition method) + { + return IsInstanceConstructor (method) && !method.HasParameters; + } + + public static bool IsInstanceConstructor (this MethodDefinition method) + { + return method.IsConstructor && !method.IsStatic; + } + + public static bool IsIntrinsic (this MethodDefinition method) + { + if (!method.HasCustomAttributes) + return false; + + foreach (var ca in method.CustomAttributes) { + var caType = ca.AttributeType; + if (caType.Name == "IntrinsicAttribute" && caType.Namespace == "System.Runtime.CompilerServices") + return true; + } + + return false; + } + + public static bool IsPropertyMethod (this MethodDefinition md) + { + return (md.SemanticsAttributes & MethodSemanticsAttributes.Getter) != 0 || + (md.SemanticsAttributes & MethodSemanticsAttributes.Setter) != 0; + } + + public static bool IsPublicInstancePropertyMethod (this MethodDefinition md) + { + return md.IsPublic && !md.IsStatic && IsPropertyMethod (md); + } + + public static bool IsEventMethod (this MethodDefinition md) + { + return (md.SemanticsAttributes & MethodSemanticsAttributes.AddOn) != 0 || + (md.SemanticsAttributes & MethodSemanticsAttributes.Fire) != 0 || + (md.SemanticsAttributes & MethodSemanticsAttributes.RemoveOn) != 0; + } + + public static PropertyDefinition GetProperty (this MethodDefinition md) + { + TypeDefinition declaringType = md.DeclaringType; + foreach (PropertyDefinition prop in declaringType.Properties) + if (prop.GetMethod == md || prop.SetMethod == md) + return prop; + + return null; + } + + public static EventDefinition GetEvent (this MethodDefinition md) + { + TypeDefinition declaringType = md.DeclaringType; + foreach (EventDefinition evt in declaringType.Events) + if (evt.AddMethod == md || evt.InvokeMethod == md || evt.RemoveMethod == md) + return evt; + + return null; + } + + public static bool IsStaticConstructor (this MethodDefinition method) + { + return method.IsConstructor && method.IsStatic; + } + + public static bool IsFinalizer (this MethodDefinition method) + { + if (method.Name != "Finalize" || method.ReturnType.MetadataType != MetadataType.Void) + return false; + + if (method.HasParameters || method.HasGenericParameters || method.IsStatic) + return false; + + return true; + } + + public static void ClearDebugInformation (this MethodDefinition method) + { + // TODO: This always allocates, update when Cecil catches up + var di = method.DebugInformation; + di.SequencePoints.Clear (); + if (di.Scope is not null) { + di.Scope.Variables.Clear (); + di.Scope.Constants.Clear (); + di.Scope = null; + } + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodReferenceExtensions.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodReferenceExtensions.cs new file mode 100644 index 000000000000..4b9c599fc3d4 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/MethodReferenceExtensions.cs @@ -0,0 +1,26 @@ +using System; +using Mono.Cecil; + +namespace Mono.Linker { + public static class MethodReferenceExtensions { + public static TypeReference GetReturnType (this MethodReference method) + { + var genericInstance = method.DeclaringType as GenericInstanceType; + + if (genericInstance is not null) + return TypeReferenceExtensions.InflateGenericType (genericInstance, method.ReturnType); + + return method.ReturnType; + } + + public static TypeReference GetParameterType (this MethodReference method, int parameterIndex) + { + var genericInstance = method.DeclaringType as GenericInstanceType; + + if (genericInstance is not null) + return TypeReferenceExtensions.InflateGenericType (genericInstance, method.Parameters [parameterIndex].ParameterType); + + return method.Parameters [parameterIndex].ParameterType; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OutputException.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OutputException.cs new file mode 100644 index 000000000000..d6c25ff3f7ef --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OutputException.cs @@ -0,0 +1,15 @@ +using System; + +namespace Mono.Linker { + public class OutputException : Exception { + public OutputException (string message) + : base (message) + { + } + + public OutputException (string message, Exception innerException) + : base (message, innerException) + { + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OverrideInformation.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OverrideInformation.cs new file mode 100644 index 000000000000..b9a5448b37c5 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/OverrideInformation.cs @@ -0,0 +1,39 @@ +using System.Diagnostics; +using Mono.Cecil; + +namespace Mono.Linker { + [DebuggerDisplay ("{Override}")] + public class OverrideInformation { + public readonly MethodDefinition Base; + public readonly MethodDefinition Override; + public readonly InterfaceImplementation MatchingInterfaceImplementation; + + public OverrideInformation (MethodDefinition @base, MethodDefinition @override, InterfaceImplementation matchingInterfaceImplementation = null) + { + Base = @base; + Override = @override; + MatchingInterfaceImplementation = matchingInterfaceImplementation; + } + + public bool IsOverrideOfInterfaceMember { + get { + if (MatchingInterfaceImplementation is not null) + return true; + + return Base.DeclaringType.IsInterface; + } + } + + public TypeDefinition InterfaceType { + get { + if (!IsOverrideOfInterfaceMember) + return null; + + if (MatchingInterfaceImplementation is not null) + return MatchingInterfaceImplementation.InterfaceType.Resolve (); + + return Base.DeclaringType; + } + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Pipeline.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Pipeline.cs new file mode 100644 index 000000000000..e9334be89fbb --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Pipeline.cs @@ -0,0 +1,152 @@ +// +// Pipeline.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// (C) 2006 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; + +using Mono.Linker.Steps; + +namespace Mono.Linker { + + public class Pipeline { + + readonly List _steps; + + public Pipeline () + { + _steps = new List (); + } + + public void PrependStep (IStep step) + { + _steps.Insert (0, step); + } + + public void AppendStep (IStep step) + { + _steps.Add (step); + } + + public void AddStepBefore (Type target, IStep step) + { + for (int i = 0; i < _steps.Count; i++) { + if (target.IsInstanceOfType (_steps [i])) { + _steps.Insert (i, step); + return; + } + } + string msg = String.Format ("Step {0} could not be inserted before (not found) {1}", step, target); + throw new InvalidOperationException (msg); + } + + public void AddStepBefore (IStep target, IStep step) + { + for (int i = 0; i < _steps.Count; i++) { + if (_steps [i] == target) { + _steps.Insert (i, step); + return; + } + } + } + + public void ReplaceStep (Type target, IStep step) + { + AddStepBefore (target, step); + RemoveStep (target); + } + + public void AddStepAfter (Type target, IStep step) + { + for (int i = 0; i < _steps.Count; i++) { + if (target.IsInstanceOfType (_steps [i])) { + if (i == _steps.Count - 1) + _steps.Add (step); + else + _steps.Insert (i + 1, step); + return; + } + } + string msg = String.Format ("Step {0} could not be inserted after (not found) {1}", step, target); + throw new InvalidOperationException (msg); + } + + public void AddStepAfter (IStep target, IStep step) + { + for (int i = 0; i < _steps.Count; i++) { + if (_steps [i] == target) { + if (i == _steps.Count - 1) + _steps.Add (step); + else + _steps.Insert (i + 1, step); + return; + } + } + } + + public void RemoveStep (Type target) + { + for (int i = 0; i < _steps.Count; i++) { + if (_steps [i].GetType () != target) + continue; + + _steps.RemoveAt (i); + break; + } + } + + public void Process (LinkContext context) + { + while (_steps.Count > 0) { + IStep step = _steps [0]; + ProcessStep (context, step); + _steps.Remove (step); + } + } + + protected virtual void ProcessStep (LinkContext context, IStep step) + { + context.Tracer.Push (step); + step.Process (context); + context.Tracer.Pop (); + } + + public IStep [] GetSteps () + { + return _steps.ToArray (); + } + + public bool ContainsStep (Type type) + { + foreach (IStep step in _steps) + if (step.GetType () == type) + return true; + + return false; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Tracer.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Tracer.cs new file mode 100644 index 000000000000..cadbc27aaeae --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/Tracer.cs @@ -0,0 +1,113 @@ +// +// Tracer.cs +// +// Author: +// Radek Doulik +// +// Copyright (C) 2017 Microsoft Corporation (http://www.microsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; + +namespace Mono.Linker { + public class Tracer { + protected readonly LinkContext context; + + Stack dependency_stack; + List recorders; + + public Tracer (LinkContext context) + { + this.context = context; + dependency_stack = new Stack (); + } + + public void Finish () + { + dependency_stack = null; + if (recorders is not null) { + foreach (var recorder in recorders) { + if (recorder is IDisposable disposableRecorder) + disposableRecorder.Dispose (); + } + } + + recorders = null; + } + + public void AddRecorder (IDependencyRecorder recorder) + { + if (recorders is null) { + recorders = new List (); + } + + recorders.Add (recorder); + } + + public void Push (object o, bool addDependency = true) + { + if (!IsRecordingEnabled ()) + return; + + if (addDependency && dependency_stack.Count > 0) + AddDependency (o); + + dependency_stack.Push (o); + } + + public void Pop () + { + if (!IsRecordingEnabled ()) + return; + + dependency_stack.Pop (); + } + + bool IsRecordingEnabled () + { + return recorders is not null; + } + + public void AddDirectDependency (object b, object e) + { + ReportDependency (b, e, false); + } + + public void AddDependency (object o, bool marked = false) + { + if (!IsRecordingEnabled ()) + return; + + ReportDependency (dependency_stack.Count > 0 ? dependency_stack.Peek () : null, o, marked); + } + + private void ReportDependency (object source, object target, bool marked) + { + if (IsRecordingEnabled ()) { + foreach (IDependencyRecorder recorder in recorders) { + recorder.RecordDependency (source, target, marked); + } + } + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeDefinitionExtensions.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeDefinitionExtensions.cs new file mode 100644 index 000000000000..40c94f88a7de --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeDefinitionExtensions.cs @@ -0,0 +1,44 @@ + +using System; +using Mono.Cecil; + +namespace Mono.Linker { + public static class TypeDefinitionExtensions { + public static bool HasInterface (this TypeDefinition type, TypeDefinition interfaceType, out InterfaceImplementation implementation) + { + implementation = null; + if (!type.HasInterfaces) + return false; + + foreach (var iface in type.Interfaces) { + if (iface.InterfaceType.Resolve () == interfaceType) { + implementation = iface; + return true; + } + } + + return false; + } + + public static TypeReference GetEnumUnderlyingType (this TypeDefinition enumType) + { + foreach (var field in enumType.Fields) { + if (!field.IsStatic && field.Name == "value__") { + return field.FieldType; + } + } + + throw new MissingFieldException ($"Enum type '{enumType.FullName}' is missing 'value__' field"); + } + + public static bool IsMulticastDelegate (this TypeDefinition td) + { + return td.BaseType?.Name == "MulticastDelegate" && td.BaseType.Namespace == "System"; + } + + public static bool IsSerializable (this TypeDefinition td) + { + return (td.Attributes & TypeAttributes.Serializable) != 0; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeNameParser.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeNameParser.cs new file mode 100644 index 000000000000..1a86b9b4144e --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeNameParser.cs @@ -0,0 +1,49 @@ +using System; + +namespace Mono.Linker { + public static class TypeNameParser { + public static bool TryParseTypeAssemblyQualifiedName (string value, out string typeName, out string assemblyName) + { + if (string.IsNullOrEmpty (value)) { + typeName = null; + assemblyName = null; + return false; + } + + //Filter the assembly qualified name down to the basic type by removing pointer, reference, and array markers on the type + //We must also convert nested types from + to / to match cecil's formatting + value = value + .Replace ('+', '/') + .Replace ("*", string.Empty) + .Replace ("&", string.Empty); + + while (value.IndexOf ('[') > 0) { + var openidx = value.IndexOf ('['); + var closeidx = value.IndexOf (']'); + + // No matching close ] or out of order + if (closeidx < 0 || closeidx < openidx) { + typeName = null; + assemblyName = null; + return false; + } + + value = value.Remove (openidx, closeidx + 1 - openidx); + } + + var tokens = value.Split (','); + typeName = tokens [0].Trim (); + assemblyName = null; + if (tokens.Length > 1) + assemblyName = tokens [1].Trim (); + + if (string.IsNullOrWhiteSpace (typeName)) { + typeName = null; + assemblyName = null; + return false; + } + + return true; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypePreserve.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypePreserve.cs new file mode 100644 index 000000000000..83c0635fc6e7 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypePreserve.cs @@ -0,0 +1,37 @@ +// +// TypePreserve.cs +// +// Author: +// Jb Evain (jb@nurv.fr) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +namespace Mono.Linker { + + public enum TypePreserve { + Nothing, // This is actually Declaration + All, + Fields, + Methods + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeReferenceExtensions.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeReferenceExtensions.cs new file mode 100644 index 000000000000..262faa106421 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/TypeReferenceExtensions.cs @@ -0,0 +1,239 @@ +using System; +using Mono.Cecil; +using System.Collections.Generic; +using System.Linq; + +namespace Mono.Linker { + public static class TypeReferenceExtensions { + public static TypeReference GetInflatedBaseType (this TypeReference type) + { + if (type is null) + return null; + + if (type.IsGenericParameter || type.IsByReference || type.IsPointer) + return null; + + var sentinelType = type as SentinelType; + if (sentinelType is not null) + return sentinelType.ElementType.GetInflatedBaseType (); + + var pinnedType = type as PinnedType; + if (pinnedType is not null) + return pinnedType.ElementType.GetInflatedBaseType (); + + var requiredModifierType = type as RequiredModifierType; + if (requiredModifierType is not null) + return requiredModifierType.ElementType.GetInflatedBaseType (); + + var genericInstance = type as GenericInstanceType; + if (genericInstance is not null) { + var baseType = type.Resolve ()?.BaseType; + var baseTypeGenericInstance = baseType as GenericInstanceType; + + if (baseTypeGenericInstance is not null) + return InflateGenericType (genericInstance, baseType); + + return baseType; + } + + return type.Resolve ()?.BaseType; + } + + public static IEnumerable GetInflatedInterfaces (this TypeReference typeRef) + { + var typeDef = typeRef.Resolve (); + + if (typeDef?.HasInterfaces != true) + yield break; + + var genericInstance = typeRef as GenericInstanceType; + if (genericInstance is not null) { + foreach (var interfaceImpl in typeDef.Interfaces) + yield return InflateGenericType (genericInstance, interfaceImpl.InterfaceType); + } else { + foreach (var interfaceImpl in typeDef.Interfaces) + yield return interfaceImpl.InterfaceType; + } + } + + public static TypeReference InflateGenericType (GenericInstanceType genericInstanceProvider, TypeReference typeToInflate) + { + var arrayType = typeToInflate as ArrayType; + if (arrayType is not null) { + var inflatedElementType = InflateGenericType (genericInstanceProvider, arrayType.ElementType); + + if (inflatedElementType != arrayType.ElementType) + return new ArrayType (inflatedElementType, arrayType.Rank); + + return arrayType; + } + + var genericInst = typeToInflate as GenericInstanceType; + if (genericInst is not null) + return MakeGenericType (genericInstanceProvider, genericInst); + + var genericParameter = typeToInflate as GenericParameter; + if (genericParameter is not null) { + if (genericParameter.Owner is MethodReference) + return genericParameter; + + var elementType = genericInstanceProvider.ElementType.Resolve (); + var parameter = elementType.GenericParameters.Single (p => p == genericParameter); + return genericInstanceProvider.GenericArguments [parameter.Position]; + } + + var functionPointerType = typeToInflate as FunctionPointerType; + if (functionPointerType is not null) { + var result = new FunctionPointerType (); + result.ReturnType = InflateGenericType (genericInstanceProvider, functionPointerType.ReturnType); + + for (int i = 0; i < functionPointerType.Parameters.Count; i++) { + var inflatedParameterType = InflateGenericType (genericInstanceProvider, functionPointerType.Parameters [i].ParameterType); + result.Parameters.Add (new ParameterDefinition (inflatedParameterType)); + } + + return result; + } + + var modifierType = typeToInflate as IModifierType; + if (modifierType is not null) { + var modifier = InflateGenericType (genericInstanceProvider, modifierType.ModifierType); + var elementType = InflateGenericType (genericInstanceProvider, modifierType.ElementType); + + if (modifierType is OptionalModifierType) { + return new OptionalModifierType (modifier, elementType); + } + + return new RequiredModifierType (modifier, elementType); + } + + var pinnedType = typeToInflate as PinnedType; + if (pinnedType is not null) { + var elementType = InflateGenericType (genericInstanceProvider, pinnedType.ElementType); + + if (elementType != pinnedType.ElementType) + return new PinnedType (elementType); + + return pinnedType; + } + + var pointerType = typeToInflate as PointerType; + if (pointerType is not null) { + var elementType = InflateGenericType (genericInstanceProvider, pointerType.ElementType); + + if (elementType != pointerType.ElementType) + return new PointerType (elementType); + + return pointerType; + } + + var byReferenceType = typeToInflate as ByReferenceType; + if (byReferenceType is not null) { + var elementType = InflateGenericType (genericInstanceProvider, byReferenceType.ElementType); + + if (elementType != byReferenceType.ElementType) + return new ByReferenceType (elementType); + + return byReferenceType; + } + + var sentinelType = typeToInflate as SentinelType; + if (sentinelType is not null) { + var elementType = InflateGenericType (genericInstanceProvider, sentinelType.ElementType); + + if (elementType != sentinelType.ElementType) + return new SentinelType (elementType); + + return sentinelType; + } + + return typeToInflate; + } + + private static GenericInstanceType MakeGenericType (GenericInstanceType genericInstanceProvider, GenericInstanceType type) + { + var result = new GenericInstanceType (type.ElementType); + + for (var i = 0; i < type.GenericArguments.Count; ++i) { + result.GenericArguments.Add (InflateGenericType (genericInstanceProvider, type.GenericArguments [i])); + } + + return result; + } + + public static IEnumerable GetMethods (this TypeReference type) + { + var typeDef = type.Resolve (); + + if (typeDef?.HasMethods != true) + yield break; + + var genericInstanceType = type as GenericInstanceType; + if (genericInstanceType is not null) { + foreach (var methodDef in typeDef.Methods) + yield return MakeMethodReferenceForGenericInstanceType (genericInstanceType, methodDef); + } else { + foreach (var method in typeDef.Methods) + yield return method; + } + } + + private static MethodReference MakeMethodReferenceForGenericInstanceType (GenericInstanceType genericInstanceType, MethodDefinition methodDef) + { + var method = new MethodReference (methodDef.Name, methodDef.ReturnType, genericInstanceType) { + HasThis = methodDef.HasThis, + ExplicitThis = methodDef.ExplicitThis, + CallingConvention = methodDef.CallingConvention + }; + + foreach (var parameter in methodDef.Parameters) + method.Parameters.Add (new ParameterDefinition (parameter.Name, parameter.Attributes, parameter.ParameterType)); + + foreach (var gp in methodDef.GenericParameters) + method.GenericParameters.Add (new GenericParameter (gp.Name, method)); + + return method; + } + + public static string ToCecilName (this string fullTypeName) + { + return fullTypeName.Replace ('+', '/'); + } + + public static bool HasDefaultConstructor (this TypeReference type) + { + foreach (var m in type.GetMethods ()) { + if (m.HasParameters) + continue; + + var definition = m.Resolve (); + if (definition?.IsDefaultConstructor () == true) + return true; + } + + return false; + } + + public static MethodReference GetDefaultInstanceConstructor (this TypeReference type) + { + foreach (var m in type.GetMethods ()) { + if (m.HasParameters) + continue; + + var definition = m.Resolve (); + if (!definition.IsDefaultConstructor ()) + continue; + + return m; + } + + throw new NotImplementedException (); + } + + public static bool IsTypeOf (this TypeReference type, string ns, string name) + { + return type.Name == name + && type.Namespace == ns; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XApiReader.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XApiReader.cs new file mode 100644 index 000000000000..95a076389429 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XApiReader.cs @@ -0,0 +1,384 @@ +// +// XApiReader.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.XPath; + +using Mono.Cecil; +using Mono.Collections.Generic; + +namespace Mono.Linker { + + public class XApiReader { + + static readonly string _name = "name"; + static readonly string _ns = string.Empty; + + LinkContext _context; + XPathDocument _document; + IXApiVisitor _visitor; + + AssemblyDefinition _assembly; + string _namespace; + Stack _types = new Stack (); + StringBuilder _signature; + + public XApiReader (XPathDocument document, IXApiVisitor visitor) + { + _document = document; + _visitor = visitor; + } + + public void Process (LinkContext context) + { + _context = context; + ProcessAssemblies (_document.CreateNavigator ()); + } + + void OnAssembly (XPathNavigator nav) + { + _assembly = GetAssembly (nav); + + _visitor.OnAssembly (nav, _assembly); + + ProcessAttributes (nav); + ProcessNamespaces (nav); + } + + AssemblyDefinition GetAssembly (XPathNavigator nav) + { + AssemblyNameReference name = new AssemblyNameReference ( + GetName (nav), + new Version (GetAttribute (nav, "version"))); + + AssemblyDefinition assembly = _context.Resolve (name); + ProcessReferences (assembly); + return assembly; + } + + void ProcessReferences (AssemblyDefinition assembly) + { + foreach (AssemblyNameReference name in assembly.MainModule.AssemblyReferences) + _context.Resolve (name); + } + + void OnAttribute (XPathNavigator nav) + { + _visitor.OnAttribute (nav); + } + + void PushType (TypeDefinition type) + { + _types.Push (type); + } + + TypeDefinition PeekType () + { + return _types.Peek (); + } + + TypeDefinition PopType () + { + return _types.Pop (); + } + + void OnNamespace (XPathNavigator nav) + { + _namespace = GetName (nav); + + ProcessClasses (nav); + } + + void OnClass (XPathNavigator nav) + { + string name = GetClassName (nav); + + TypeDefinition type = _assembly.MainModule.GetType (name); + if (type is null) + return; + + _visitor.OnClass (nav, type); + + PushType (type); + + ProcessAttributes (nav); + ProcessInterfaces (nav); + ProcessFields (nav); + ProcessMethods (nav); + ProcessConstructors (nav); + ProcessProperties (nav); + ProcessEvents (nav); + ProcessClasses (nav); + + PopType (); + } + + string GetClassName (XPathNavigator nav) + { + if (IsNestedClass ()) + return PeekType ().FullName + "/" + GetName (nav); + + return _namespace + "." + GetName (nav); + } + + bool IsNestedClass () + { + return _types.Count > 0; + } + + void OnField (XPathNavigator nav) + { + TypeDefinition declaring = PeekType (); + + FieldDefinition field = declaring.Fields.FirstOrDefault (f => f.Name == GetName (nav)); + if (field is not null) + _visitor.OnField (nav, field); + + ProcessAttributes (nav); + } + + void OnInterface (XPathNavigator nav) + { + string name = GetName (nav); + + TypeDefinition type = _context.GetType (GetTypeName (name)); + if (type is not null) + _visitor.OnInterface (nav, type); + } + + void OnMethod (XPathNavigator nav) + { + InitMethodSignature (nav); + + ProcessParameters (nav); + + string signature = GetMethodSignature (); + + MethodDefinition method = GetMethod (signature); + if (method is not null) + _visitor.OnMethod (nav, method); + + ProcessAttributes (nav); + } + + MethodDefinition GetMethod (string signature) + { + return GetMethod (PeekType ().Methods, signature); + } + + static MethodDefinition GetMethod (Collection methods, string signature) + { + foreach (MethodDefinition method in methods) + if (signature == GetSignature (method)) + return method; + + return null; + } + + static string GetSignature (MethodDefinition method) + { + return method.ToString ().Replace ("<", "[").Replace (">", "]"); + } + + string GetMethodSignature () + { + _signature.Append (")"); + return _signature.ToString (); + } + + void InitMethodSignature (XPathNavigator nav) + { + _signature = new StringBuilder (); + + string returntype = GetAttribute (nav, "returntype"); + if (returntype is null || returntype.Length == 0) + returntype = "System.Void"; + + _signature.Append (NormalizeTypeName (returntype)); + _signature.Append (" "); + _signature.Append (PeekType ().FullName); + _signature.Append ("::"); + + string name = GetName (nav); + _signature.Append (GetMethodName (name)); + + _signature.Append ("("); + } + + static string GetMethodName (string name) + { + return GetStringBefore (name, "("); + } + + static string NormalizeTypeName (string name) + { + return name.Replace ("+", "/").Replace ("<", "[").Replace (">", "]"); + } + + static string GetTypeName (string name) + { + return GetStringBefore (NormalizeTypeName (name), "["); + } + + static string GetStringBefore (string str, string marker) + { + int pos = str.IndexOf (marker); + if (pos == -1) + return str; + + return str.Substring (0, pos); + } + + void OnParameter (XPathNavigator nav) + { + string type = GetAttribute (nav, "type"); + int pos = int.Parse (GetAttribute (nav, "position")); + + if (pos > 0) + _signature.Append (","); + _signature.Append (NormalizeTypeName (type)); + } + + void OnConstructor (XPathNavigator nav) + { + InitMethodSignature (nav); + + ProcessParameters (nav); + + string signature = GetMethodSignature (); + + MethodDefinition ctor = GetMethod (signature); + if (ctor is not null) + _visitor.OnConstructor (nav, ctor); + + ProcessAttributes (nav); + } + + void OnProperty (XPathNavigator nav) + { + string name = GetName (nav); + TypeDefinition type = PeekType (); + + var property = type.Properties.FirstOrDefault (p => p.Name == name); + if (property is not null) + _visitor.OnProperty (nav, property); + + ProcessAttributes (nav); + ProcessMethods (nav); + } + + void OnEvent (XPathNavigator nav) + { + string name = GetName (nav); + TypeDefinition type = PeekType (); + + EventDefinition evt = type.Events.FirstOrDefault (e => e.Name == name); + if (evt is not null) + _visitor.OnEvent (nav, evt); + + ProcessAttributes (nav); + } + + void ProcessAssemblies (XPathNavigator nav) + { + ProcessChildren (nav, "assemblies//assembly", new OnChildren (OnAssembly)); + } + + void ProcessAttributes (XPathNavigator nav) + { + ProcessChildren (nav, "attributes//attribute", new OnChildren (OnAttribute)); + } + + void ProcessNamespaces (XPathNavigator nav) + { + ProcessChildren (nav, "namespaces//namespace", new OnChildren (OnNamespace)); + } + + void ProcessClasses (XPathNavigator nav) + { + ProcessChildren (nav, "classes//class", new OnChildren (OnClass)); + } + + void ProcessInterfaces (XPathNavigator nav) + { + ProcessChildren (nav, "interfaces//interface", new OnChildren (OnInterface)); + } + + void ProcessFields (XPathNavigator nav) + { + ProcessChildren (nav, "fields//field", new OnChildren (OnField)); + } + + void ProcessMethods (XPathNavigator nav) + { + ProcessChildren (nav, "methods//method", new OnChildren (OnMethod)); + } + + void ProcessConstructors (XPathNavigator nav) + { + ProcessChildren (nav, "constructors//constructor", new OnChildren (OnConstructor)); + } + + void ProcessParameters (XPathNavigator nav) + { + ProcessChildren (nav, "parameters//parameter", new OnChildren (OnParameter)); + } + + void ProcessProperties (XPathNavigator nav) + { + ProcessChildren (nav, "properties//property", new OnChildren (OnProperty)); + } + + void ProcessEvents (XPathNavigator nav) + { + ProcessChildren (nav, "events//event", new OnChildren (OnEvent)); + } + + static void ProcessChildren (XPathNavigator nav, string children, OnChildren action) + { + XPathNodeIterator iterator = nav.Select (children); + while (iterator.MoveNext ()) + action (iterator.Current); + } + + delegate void OnChildren (XPathNavigator nav); + + static string GetName (XPathNavigator nav) + { + return GetAttribute (nav, _name); + } + + static string GetAttribute (XPathNavigator nav, string attribute) + { + return nav.GetAttribute (attribute, _ns); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XmlDependencyRecorder.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XmlDependencyRecorder.cs new file mode 100644 index 000000000000..87d32b8d8bda --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/linker/Linker/XmlDependencyRecorder.cs @@ -0,0 +1,213 @@ +// +// Tracer.cs +// +// Copyright (C) 2017 Microsoft Corporation (http://www.microsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Mono.Cecil; +using Mono.Linker.Steps; +using System; +using System.IO; +using System.IO.Compression; +using System.Xml; + +namespace Mono.Linker { + /// + /// Class which implements IDependencyRecorder and writes the dependencies into an XML file. + /// + public class XmlDependencyRecorder : IDependencyRecorder, IDisposable { + public const string DefaultDependenciesFileName = "linker-dependencies.xml.gz"; + + private readonly LinkContext context; + private XmlWriter writer; + private Stream stream; + + public XmlDependencyRecorder (LinkContext context, string fileName = null) + { + this.context = context; + + XmlWriterSettings settings = new XmlWriterSettings { + Indent = true, + IndentChars = "\t" + }; + + if (fileName is null) + fileName = DefaultDependenciesFileName; + + if (string.IsNullOrEmpty (Path.GetDirectoryName (fileName)) && !string.IsNullOrEmpty (context.OutputDirectory)) { + fileName = Path.Combine (context.OutputDirectory, fileName); + Directory.CreateDirectory (context.OutputDirectory); + } + + var depsFile = File.OpenWrite (fileName); + + if (Path.GetExtension (fileName) == ".xml") + stream = depsFile; + else + stream = new GZipStream (depsFile, CompressionMode.Compress); + + writer = XmlWriter.Create (stream, settings); + writer.WriteStartDocument (); + writer.WriteStartElement ("dependencies"); + writer.WriteStartAttribute ("version"); + writer.WriteString ("1.2"); + writer.WriteEndAttribute (); + } + + public void Dispose () + { + if (writer is null) + return; + + writer.WriteEndElement (); + writer.WriteEndDocument (); + writer.Flush (); + writer.Dispose (); + stream.Dispose (); + writer = null; + stream = null; + } + + public void RecordDependency (object source, object target, bool marked) + { + if (!ShouldRecord (source) && !ShouldRecord (target)) + return; + + // This is a hack to work around a quirk of MarkStep that results in outputting ~6k edges even with the above ShouldRecord checks. + // What happens is that due to the method queueing in MarkStep, the dependency chain is broken in many cases. And in these cases + // we end up adding an edge for MarkStep -> + // This isn't particularly useful information since it's incomplete, but it's especially not useful in ReducedTracing mode when there is one of these for + // every class library method that was queued. + if (context.EnableReducedTracing && source is MarkStep && !ShouldRecord (target)) + return; + + // This is another hack to prevent useless information from being logged. With the introduction of interface sweeping there are a lot of edges such as + // `e="InterfaceImpl:Mono.Cecil.InterfaceImplementation"` which are useless information. Ideally we would format the interface implementation into a meaningful format + // however I don't think that is worth the effort at the moment. + if (target is InterfaceImplementation) + return; + + if (source != target) { + writer.WriteStartElement ("edge"); + if (marked) + writer.WriteAttributeString ("mark", "1"); + writer.WriteAttributeString ("b", TokenString (source)); + writer.WriteAttributeString ("e", TokenString (target)); + writer.WriteEndElement (); + } + } + + static bool IsAssemblyBound (TypeDefinition td) + { + do { + if (td.IsNestedPrivate || td.IsNestedAssembly || td.IsNestedFamilyAndAssembly) + return true; + + td = td.DeclaringType; + } while (td is not null); + + return false; + } + + string TokenString (object o) + { + if (o is null) + return "N:null"; + + if (o is TypeReference t) { + bool addAssembly = true; + var td = t as TypeDefinition ?? t.Resolve (); + + if (td is not null) { + addAssembly = td.IsNotPublic || IsAssemblyBound (td); + t = td; + } + + var addition = addAssembly ? $":{t.Module}" : ""; + + return $"{(o as IMetadataTokenProvider).MetadataToken.TokenType}:{o}{addition}"; + } + + if (o is IMetadataTokenProvider) + return (o as IMetadataTokenProvider).MetadataToken.TokenType + ":" + o; + + return "Other:" + o; + } + + bool WillAssemblyBeModified (AssemblyDefinition assembly) + { + switch (context.Annotations.GetAction (assembly)) { + case AssemblyAction.Link: + case AssemblyAction.AddBypassNGen: + case AssemblyAction.AddBypassNGenUsed: + return true; + default: + return false; + } + } + + bool ShouldRecord (object o) + { + if (!context.EnableReducedTracing) + return true; + + if (o is TypeDefinition t) + return WillAssemblyBeModified (t.Module.Assembly); + + if (o is IMemberDefinition m) + return WillAssemblyBeModified (m.DeclaringType.Module.Assembly); + + if (o is TypeReference typeRef) { + var resolved = typeRef.Resolve (); + + // Err on the side of caution if we can't resolve + if (resolved is null) + return true; + + return WillAssemblyBeModified (resolved.Module.Assembly); + } + + if (o is MemberReference mRef) { + var resolved = mRef.Resolve (); + + // Err on the side of caution if we can't resolve + if (resolved is null) + return true; + + return WillAssemblyBeModified (resolved.DeclaringType.Module.Assembly); + } + + if (o is ModuleDefinition module) + return WillAssemblyBeModified (module.Assembly); + + if (o is AssemblyDefinition assembly) + return WillAssemblyBeModified (assembly); + + if (o is ParameterDefinition parameter) { + if (parameter.Method is MethodDefinition parameterMethodDefinition) + return WillAssemblyBeModified (parameterMethodDefinition.DeclaringType.Module.Assembly); + } + + return true; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/ApplyPreserveAttributeBase.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/ApplyPreserveAttributeBase.cs new file mode 100644 index 000000000000..942907d00fde --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/ApplyPreserveAttributeBase.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Cecil; + +namespace Mono.Tuner { + + public abstract class ApplyPreserveAttributeBase : BaseSubStep { + + // set 'removeAttribute' to true if you want the preserved attribute to be removed from the final assembly + protected abstract bool IsPreservedAttribute (ICustomAttributeProvider provider, CustomAttribute attribute, out bool removeAttribute); + + public override SubStepTargets Targets { + get { + return SubStepTargets.Type + | SubStepTargets.Field + | SubStepTargets.Method + | SubStepTargets.Property + | SubStepTargets.Event; + } + } + + public override bool IsActiveFor (AssemblyDefinition assembly) + { + return !Profile.IsSdkAssembly (assembly) && Annotations.GetAction (assembly) == AssemblyAction.Link; + } + + public override void ProcessType (TypeDefinition type) + { + TryApplyPreserveAttribute (type); + } + + public override void ProcessField (FieldDefinition field) + { + foreach (var attribute in GetPreserveAttributes (field)) + Mark (field, attribute); + } + + public override void ProcessMethod (MethodDefinition method) + { + MarkMethodIfPreserved (method); + } + + public override void ProcessProperty (PropertyDefinition property) + { + foreach (var attribute in GetPreserveAttributes (property)) { + MarkMethod (property.GetMethod, attribute); + MarkMethod (property.SetMethod, attribute); + } + } + + public override void ProcessEvent (EventDefinition @event) + { + foreach (var attribute in GetPreserveAttributes (@event)) { + MarkMethod (@event.AddMethod, attribute); + MarkMethod (@event.InvokeMethod, attribute); + MarkMethod (@event.RemoveMethod, attribute); + } + } + + void MarkMethodIfPreserved (MethodDefinition method) + { + foreach (var attribute in GetPreserveAttributes (method)) + MarkMethod (method, attribute); + } + + void MarkMethod (MethodDefinition method, CustomAttribute preserve_attribute) + { + if (method is null) + return; + + Mark (method, preserve_attribute); + Annotations.SetAction (method, MethodAction.Parse); + } + + void Mark (IMetadataTokenProvider provider, CustomAttribute preserve_attribute) + { + if (IsConditionalAttribute (preserve_attribute)) { + PreserveConditional (provider); + return; + } + + PreserveUnconditional (provider); + } + + void PreserveConditional (IMetadataTokenProvider provider) + { + var method = provider as MethodDefinition; + if (method is null) { + // workaround to support (uncommon but valid) conditional fields form [Preserve] + PreserveUnconditional (provider); + return; + } + + Annotations.AddPreservedMethod (method.DeclaringType, method); + } + + static bool IsConditionalAttribute (CustomAttribute attribute) + { + if (attribute is null) + return false; + + foreach (var named_argument in attribute.Fields) + if (named_argument.Name == "Conditional") + return (bool) named_argument.Argument.Value; + + return false; + } + + void PreserveUnconditional (IMetadataTokenProvider provider) + { + Annotations.Mark (provider); + + var member = provider as IMemberDefinition; + if (member is null || member.DeclaringType is null) + return; + + Mark (member.DeclaringType, null); + } + + void TryApplyPreserveAttribute (TypeDefinition type) + { + foreach (var attribute in GetPreserveAttributes (type)) { + Annotations.Mark (type); + + if (!attribute.HasFields) + continue; + + foreach (var named_argument in attribute.Fields) + if (named_argument.Name == "AllMembers" && (bool) named_argument.Argument.Value) + Annotations.SetPreserve (type, TypePreserve.All); + } + } + + List GetPreserveAttributes (ICustomAttributeProvider provider) + { + List attrs = new List (); + + if (!provider.HasCustomAttributes) + return attrs; + + var attributes = provider.CustomAttributes; + + for (int i = attributes.Count - 1; i >= 0; i--) { + var attribute = attributes [i]; + + bool remote_attribute; + if (!IsPreservedAttribute (provider, attribute, out remote_attribute)) + continue; + + attrs.Add (attribute); + if (remote_attribute) + attributes.RemoveAt (i); + } + + return attrs; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CecilRocks.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CecilRocks.cs new file mode 100644 index 000000000000..6d2abeef6e04 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CecilRocks.cs @@ -0,0 +1,519 @@ +// +// MethodBodyRocks.cs +// +// Author: +// Jb Evain (jbevain@gmail.com) +// +// Copyright (c) 2008 - 2011 Jb Evain +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Mono.Tuner { + + public static class MethodBodyRocks { + + public static IEnumerable GetAllTypes (this ModuleDefinition self) + { + return self.Types.SelectMany (t => t.GetAllTypes ()); + } + + static IEnumerable GetAllTypes (this TypeDefinition self) + { + yield return self; + + if (!self.HasNestedTypes) + yield break; + + foreach (var type in self.NestedTypes.SelectMany (t => t.GetAllTypes ())) + yield return type; + } + + public static IEnumerable GetMethods (this TypeDefinition self) + { + return self.Methods.Where (m => !m.IsConstructor); + } + + public static IEnumerable GetConstructors (this TypeDefinition self) + { + return self.Methods.Where (m => m.IsConstructor); + } + + public static MethodDefinition GetTypeConstructor (this TypeDefinition self) + { + return self.GetConstructors ().FirstOrDefault (c => c.IsStatic); + } + + public static void SimplifyMacros (this MethodBody self) + { + if (self is null) + throw new ArgumentNullException ("self"); + + foreach (var instruction in self.Instructions) { + if (instruction.OpCode.OpCodeType != OpCodeType.Macro) + continue; + + switch (instruction.OpCode.Code) { + case Code.Ldarg_0: + ExpandMacro (instruction, OpCodes.Ldarg, self.GetParameter (0)); + break; + case Code.Ldarg_1: + ExpandMacro (instruction, OpCodes.Ldarg, self.GetParameter (1)); + break; + case Code.Ldarg_2: + ExpandMacro (instruction, OpCodes.Ldarg, self.GetParameter (2)); + break; + case Code.Ldarg_3: + ExpandMacro (instruction, OpCodes.Ldarg, self.GetParameter (3)); + break; + case Code.Ldloc_0: + ExpandMacro (instruction, OpCodes.Ldloc, self.Variables [0]); + break; + case Code.Ldloc_1: + ExpandMacro (instruction, OpCodes.Ldloc, self.Variables [1]); + break; + case Code.Ldloc_2: + ExpandMacro (instruction, OpCodes.Ldloc, self.Variables [2]); + break; + case Code.Ldloc_3: + ExpandMacro (instruction, OpCodes.Ldloc, self.Variables [3]); + break; + case Code.Stloc_0: + ExpandMacro (instruction, OpCodes.Stloc, self.Variables [0]); + break; + case Code.Stloc_1: + ExpandMacro (instruction, OpCodes.Stloc, self.Variables [1]); + break; + case Code.Stloc_2: + ExpandMacro (instruction, OpCodes.Stloc, self.Variables [2]); + break; + case Code.Stloc_3: + ExpandMacro (instruction, OpCodes.Stloc, self.Variables [3]); + break; + case Code.Ldarg_S: + instruction.OpCode = OpCodes.Ldarg; + break; + case Code.Ldarga_S: + instruction.OpCode = OpCodes.Ldarga; + break; + case Code.Starg_S: + instruction.OpCode = OpCodes.Starg; + break; + case Code.Ldloc_S: + instruction.OpCode = OpCodes.Ldloc; + break; + case Code.Ldloca_S: + instruction.OpCode = OpCodes.Ldloca; + break; + case Code.Stloc_S: + instruction.OpCode = OpCodes.Stloc; + break; + case Code.Ldc_I4_M1: + ExpandMacro (instruction, OpCodes.Ldc_I4, -1); + break; + case Code.Ldc_I4_0: + ExpandMacro (instruction, OpCodes.Ldc_I4, 0); + break; + case Code.Ldc_I4_1: + ExpandMacro (instruction, OpCodes.Ldc_I4, 1); + break; + case Code.Ldc_I4_2: + ExpandMacro (instruction, OpCodes.Ldc_I4, 2); + break; + case Code.Ldc_I4_3: + ExpandMacro (instruction, OpCodes.Ldc_I4, 3); + break; + case Code.Ldc_I4_4: + ExpandMacro (instruction, OpCodes.Ldc_I4, 4); + break; + case Code.Ldc_I4_5: + ExpandMacro (instruction, OpCodes.Ldc_I4, 5); + break; + case Code.Ldc_I4_6: + ExpandMacro (instruction, OpCodes.Ldc_I4, 6); + break; + case Code.Ldc_I4_7: + ExpandMacro (instruction, OpCodes.Ldc_I4, 7); + break; + case Code.Ldc_I4_8: + ExpandMacro (instruction, OpCodes.Ldc_I4, 8); + break; + case Code.Ldc_I4_S: + ExpandMacro (instruction, OpCodes.Ldc_I4, (int) (sbyte) instruction.Operand); + break; + case Code.Br_S: + instruction.OpCode = OpCodes.Br; + break; + case Code.Brfalse_S: + instruction.OpCode = OpCodes.Brfalse; + break; + case Code.Brtrue_S: + instruction.OpCode = OpCodes.Brtrue; + break; + case Code.Beq_S: + instruction.OpCode = OpCodes.Beq; + break; + case Code.Bge_S: + instruction.OpCode = OpCodes.Bge; + break; + case Code.Bgt_S: + instruction.OpCode = OpCodes.Bgt; + break; + case Code.Ble_S: + instruction.OpCode = OpCodes.Ble; + break; + case Code.Blt_S: + instruction.OpCode = OpCodes.Blt; + break; + case Code.Bne_Un_S: + instruction.OpCode = OpCodes.Bne_Un; + break; + case Code.Bge_Un_S: + instruction.OpCode = OpCodes.Bge_Un; + break; + case Code.Bgt_Un_S: + instruction.OpCode = OpCodes.Bgt_Un; + break; + case Code.Ble_Un_S: + instruction.OpCode = OpCodes.Ble_Un; + break; + case Code.Blt_Un_S: + instruction.OpCode = OpCodes.Blt_Un; + break; + case Code.Leave_S: + instruction.OpCode = OpCodes.Leave; + break; + } + } + } + + static void ExpandMacro (Instruction instruction, OpCode opcode, object operand) + { + instruction.OpCode = opcode; + instruction.Operand = operand; + } + + static void MakeMacro (Instruction instruction, OpCode opcode) + { + instruction.OpCode = opcode; + instruction.Operand = null; + } + + public static void OptimizeMacros (this MethodBody self) + { + if (self is null) + throw new ArgumentNullException ("self"); + + var method = self.Method; + + foreach (var instruction in self.Instructions) { + int index; + switch (instruction.OpCode.Code) { + case Code.Ldarg: + index = ((ParameterDefinition) instruction.Operand).Index; + if (index == -1 && instruction.Operand == self.ThisParameter) + index = 0; + else if (method.HasThis) + index++; + + switch (index) { + case 0: + MakeMacro (instruction, OpCodes.Ldarg_0); + break; + case 1: + MakeMacro (instruction, OpCodes.Ldarg_1); + break; + case 2: + MakeMacro (instruction, OpCodes.Ldarg_2); + break; + case 3: + MakeMacro (instruction, OpCodes.Ldarg_3); + break; + default: + if (index < 256) + ExpandMacro (instruction, OpCodes.Ldarg_S, instruction.Operand); + break; + } + break; + case Code.Ldloc: + index = ((VariableDefinition) instruction.Operand).Index; + switch (index) { + case 0: + MakeMacro (instruction, OpCodes.Ldloc_0); + break; + case 1: + MakeMacro (instruction, OpCodes.Ldloc_1); + break; + case 2: + MakeMacro (instruction, OpCodes.Ldloc_2); + break; + case 3: + MakeMacro (instruction, OpCodes.Ldloc_3); + break; + default: + if (index < 256) + ExpandMacro (instruction, OpCodes.Ldloc_S, instruction.Operand); + break; + } + break; + case Code.Stloc: + index = ((VariableDefinition) instruction.Operand).Index; + switch (index) { + case 0: + MakeMacro (instruction, OpCodes.Stloc_0); + break; + case 1: + MakeMacro (instruction, OpCodes.Stloc_1); + break; + case 2: + MakeMacro (instruction, OpCodes.Stloc_2); + break; + case 3: + MakeMacro (instruction, OpCodes.Stloc_3); + break; + default: + if (index < 256) + ExpandMacro (instruction, OpCodes.Stloc_S, instruction.Operand); + break; + } + break; + case Code.Ldarga: + index = ((ParameterDefinition) instruction.Operand).Index; + if (index == -1 && instruction.Operand == self.ThisParameter) + index = 0; + else if (method.HasThis) + index++; + if (index < 256) + ExpandMacro (instruction, OpCodes.Ldarga_S, instruction.Operand); + break; + case Code.Ldloca: + if (((VariableDefinition) instruction.Operand).Index < 256) + ExpandMacro (instruction, OpCodes.Ldloca_S, instruction.Operand); + break; + case Code.Ldc_I4: + int i = (int) instruction.Operand; + switch (i) { + case -1: + MakeMacro (instruction, OpCodes.Ldc_I4_M1); + break; + case 0: + MakeMacro (instruction, OpCodes.Ldc_I4_0); + break; + case 1: + MakeMacro (instruction, OpCodes.Ldc_I4_1); + break; + case 2: + MakeMacro (instruction, OpCodes.Ldc_I4_2); + break; + case 3: + MakeMacro (instruction, OpCodes.Ldc_I4_3); + break; + case 4: + MakeMacro (instruction, OpCodes.Ldc_I4_4); + break; + case 5: + MakeMacro (instruction, OpCodes.Ldc_I4_5); + break; + case 6: + MakeMacro (instruction, OpCodes.Ldc_I4_6); + break; + case 7: + MakeMacro (instruction, OpCodes.Ldc_I4_7); + break; + case 8: + MakeMacro (instruction, OpCodes.Ldc_I4_8); + break; + default: + if (i >= -128 && i < 128) + ExpandMacro (instruction, OpCodes.Ldc_I4_S, (sbyte) i); + break; + } + break; + } + } + + OptimizeBranches (self); + } + + static void OptimizeBranches (MethodBody body) + { + ComputeOffsets (body); + + foreach (var instruction in body.Instructions) { + if (instruction.OpCode.OperandType != OperandType.InlineBrTarget) + continue; + + if (OptimizeBranch (instruction)) + ComputeOffsets (body); + } + } + + static bool OptimizeBranch (Instruction instruction) + { + var offset = ((Instruction) instruction.Operand).Offset - (instruction.Offset + instruction.OpCode.Size + 4); + if (!(offset >= -128 && offset <= 127)) + return false; + + switch (instruction.OpCode.Code) { + case Code.Br: + instruction.OpCode = OpCodes.Br_S; + break; + case Code.Brfalse: + instruction.OpCode = OpCodes.Brfalse_S; + break; + case Code.Brtrue: + instruction.OpCode = OpCodes.Brtrue_S; + break; + case Code.Beq: + instruction.OpCode = OpCodes.Beq_S; + break; + case Code.Bge: + instruction.OpCode = OpCodes.Bge_S; + break; + case Code.Bgt: + instruction.OpCode = OpCodes.Bgt_S; + break; + case Code.Ble: + instruction.OpCode = OpCodes.Ble_S; + break; + case Code.Blt: + instruction.OpCode = OpCodes.Blt_S; + break; + case Code.Bne_Un: + instruction.OpCode = OpCodes.Bne_Un_S; + break; + case Code.Bge_Un: + instruction.OpCode = OpCodes.Bge_Un_S; + break; + case Code.Bgt_Un: + instruction.OpCode = OpCodes.Bgt_Un_S; + break; + case Code.Ble_Un: + instruction.OpCode = OpCodes.Ble_Un_S; + break; + case Code.Blt_Un: + instruction.OpCode = OpCodes.Blt_Un_S; + break; + case Code.Leave: + instruction.OpCode = OpCodes.Leave_S; + break; + } + + return true; + } + + static void ComputeOffsets (MethodBody body) + { + var offset = 0; + foreach (var instruction in body.Instructions) { + instruction.Offset = offset; + offset += instruction.GetSize (); + } + } + + public static ParameterDefinition GetParameter (this MethodBody self, int index) + { + var method = self.Method; + + if (method.HasThis) { + if (index == 0) + return self.ThisParameter; + + index--; + } + + var parameters = method.Parameters; + + if (index < 0 || index >= parameters.Count) + return null; + + return parameters [index]; + } + + public static bool Implements (this TypeReference self, string interfaceName) + { + if (interfaceName is null) + throw new ArgumentNullException ("interfaceName"); + if (self is null) + return false; + + TypeDefinition type = self.Resolve (); + if (type is null) + return false; // not enough information available + + // special case, check if we implement ourselves + if (type.IsInterface && (type.FullName == interfaceName)) + return true; + + return Implements (type, interfaceName, (interfaceName.IndexOf ('`') >= 0)); + } + + public static bool Implements (TypeDefinition type, string interfaceName, bool generic) + { + while (type is not null) { + // does the type implements it itself + if (type.HasInterfaces) { + foreach (var iface in type.Interfaces) { + string fullname = (generic) ? iface.InterfaceType.GetElementType ().FullName : iface.InterfaceType.FullName; + if (fullname == interfaceName) + return true; + //if not, then maybe one of its parent interfaces does + if (Implements (iface.InterfaceType.Resolve (), interfaceName, generic)) + return true; + } + } + + type = type.BaseType is not null ? type.BaseType.Resolve () : null; + } + return false; + } + + public static bool Inherits (this TypeReference self, string @namespace, string name) + { + if (@namespace is null) + throw new ArgumentNullException ("namespace"); + if (name is null) + throw new ArgumentNullException ("name"); + if (self is null) + return false; + + TypeReference current = self.Resolve (); + while (current is not null) { + if (current.Is (@namespace, name)) + return true; + if (current.Is ("System", "Object")) + return false; + + TypeDefinition td = current.Resolve (); + if (td is null) + return false; // could not resolve type + current = td.BaseType; + } + return false; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CustomizeActions.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CustomizeActions.cs new file mode 100644 index 000000000000..38e2ad97fbf4 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/CustomizeActions.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Mono.Tuner { + + public class CustomizeActions : BaseStep { + + readonly bool link_sdk_only; + readonly HashSet skipped_assemblies; + + public CustomizeActions (bool link_sdk_only, IEnumerable skipped_assemblies) + { + this.link_sdk_only = link_sdk_only; + this.skipped_assemblies = new HashSet (skipped_assemblies); + } + + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + if (!IsSkipped (assembly) && IsLinked (assembly)) { + if (!Annotations.HasAction (assembly)) // stray assembly not picked up when resolving references + Annotations.SetAction (assembly, AssemblyAction.Link); + return; + } + ProcessUserAssembly (assembly); + } + + protected virtual bool IsPreservedAttribute (CustomAttribute attribute) + { + // [assembly: Preserve (type)] does not preserve all the code in the assembly, in fact it might + // not preserve anything in _this_ assembly, but something in a separate assembly (reference) + if (attribute.HasConstructorArguments) + return false; + return (attribute.AttributeType.Name == "PreserveAttribute"); + } + + protected virtual bool IsLinkerSafeAttribute (CustomAttribute attribute) + { + return (attribute.AttributeType.Name == "LinkerSafeAttribute"); + } + + const ModuleAttributes Supported = ModuleAttributes.ILOnly | ModuleAttributes.Required32Bit | + ModuleAttributes.Preferred32Bit | ModuleAttributes.StrongNameSigned; + + protected virtual bool IsSkipped (AssemblyDefinition assembly) + { + // Cecil can't save back mixed-mode assemblies - so we can't link them + if ((assembly.MainModule.Attributes & ~Supported) != 0) + return true; + + if (assembly.HasCustomAttributes) { + foreach (var ca in assembly.CustomAttributes) { + if (IsPreservedAttribute (ca)) + return true; + } + } + return skipped_assemblies.Contains (assembly.Name.Name); + } + + protected virtual bool IsLinked (AssemblyDefinition assembly) + { + // LinkAll + if (!link_sdk_only) + return true; + // Link SDK : applies to BCL/SDK and product assembly (e.g. monotouch.dll) + if (Profile.IsSdkAssembly (assembly)) + return true; + if (Profile.IsProductAssembly (assembly)) + return true; + // the assembly can be marked with [LinkAssembly] + if (assembly.HasCustomAttributes) { + foreach (var ca in assembly.CustomAttributes) { + if (IsLinkerSafeAttribute (ca)) + return true; + } + } + return false; + } + + protected void ProcessUserAssembly (AssemblyDefinition assembly) + { + ResolveFromAssemblyStep.ProcessLibrary (Context, assembly); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Dispatcher.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Dispatcher.cs new file mode 100644 index 000000000000..e10c7b6c6f91 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Dispatcher.cs @@ -0,0 +1,310 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Cecil; + +namespace Mono.Tuner { + + [Flags] + public enum SubStepTargets { + None = 0, + + Assembly = 1, + Type = 2, + Field = 4, + Method = 8, + Property = 16, + Event = 32, + } + + public interface ISubStep { + + SubStepTargets Targets { get; } + + void Initialize (LinkContext context); + bool IsActiveFor (AssemblyDefinition assembly); + + void ProcessAssembly (AssemblyDefinition assembly); + void ProcessType (TypeDefinition type); + void ProcessField (FieldDefinition field); + void ProcessMethod (MethodDefinition method); + void ProcessProperty (PropertyDefinition property); + void ProcessEvent (EventDefinition @event); + } + + public abstract class BaseSubStep : ISubStep { + + protected LinkContext context; + + public AnnotationStore Annotations { + get { return context.Annotations; } + } + + public abstract SubStepTargets Targets { get; } + + public virtual void Initialize (LinkContext context) + { + this.context = context; + } + + public virtual bool IsActiveFor (AssemblyDefinition assembly) + { + return true; + } + + public virtual void ProcessAssembly (AssemblyDefinition assembly) + { + } + + public virtual void ProcessType (TypeDefinition type) + { + } + + public virtual void ProcessField (FieldDefinition field) + { + } + + public virtual void ProcessMethod (MethodDefinition method) + { + } + + public virtual void ProcessProperty (PropertyDefinition property) + { + } + + public virtual void ProcessEvent (EventDefinition @event) + { + } + } + + public class SubStepDispatcher : IStep, IEnumerable { + + List substeps = new List (); + + List on_assemblies; + List on_types; + List on_fields; + List on_methods; + List on_properties; + List on_events; + + Tracer tracer; + + public void Add (ISubStep substep) + { + substeps.Add (substep); + } + + public void Process (LinkContext context) + { + tracer = context.Tracer; + + InitializeSubSteps (context); + + BrowseAssemblies (context.GetAssemblies ()); + } + + void Push (ISubStep subStep) + { + if (tracer is not null) + tracer.Push (subStep); + } + + void Pop () + { + if (tracer is not null) + tracer.Pop (); + } + + static bool HasSubSteps (List substeps) + { + return substeps is not null && substeps.Count > 0; + } + + void BrowseAssemblies (IEnumerable assemblies) + { + foreach (var assembly in assemblies) { + CategorizeSubSteps (assembly); + + if (HasSubSteps (on_assemblies)) + DispatchAssembly (assembly); + + if (!ShouldDispatchTypes ()) + continue; + + BrowseTypes (assembly.MainModule.Types); + } + } + + bool ShouldDispatchTypes () + { + return HasSubSteps (on_types) + || HasSubSteps (on_fields) + || HasSubSteps (on_methods) + || HasSubSteps (on_properties) + || HasSubSteps (on_events); + } + + void BrowseTypes (ICollection types) + { + foreach (TypeDefinition type in types) { + DispatchType (type); + + if (type.HasFields && HasSubSteps (on_fields)) + BrowseFields (type.Fields); + + if (type.HasMethods && HasSubSteps (on_methods)) + BrowseMethods (type.Methods); + + if (type.HasProperties && HasSubSteps (on_properties)) + BrowseProperties (type.Properties); + + if (type.HasEvents && HasSubSteps (on_events)) + BrowseEvents (type.Events); + + if (type.HasNestedTypes) + BrowseTypes (type.NestedTypes); + } + } + + void BrowseFields (ICollection fields) + { + foreach (FieldDefinition field in fields) + DispatchField (field); + } + + void BrowseMethods (ICollection methods) + { + foreach (MethodDefinition method in methods) + DispatchMethod (method); + } + + void BrowseProperties (ICollection properties) + { + foreach (PropertyDefinition property in properties) + DispatchProperty (property); + } + + void BrowseEvents (ICollection events) + { + foreach (EventDefinition @event in events) + DispatchEvent (@event); + } + + void DispatchAssembly (AssemblyDefinition assembly) + { + foreach (var substep in on_assemblies) { + Push (substep); + substep.ProcessAssembly (assembly); + Pop (); + } + } + + void DispatchType (TypeDefinition type) + { + foreach (var substep in on_types) { + Push (substep); + substep.ProcessType (type); + Pop (); + } + } + + void DispatchField (FieldDefinition field) + { + foreach (var substep in on_fields) { + Push (substep); + substep.ProcessField (field); + Pop (); + } + } + + void DispatchMethod (MethodDefinition method) + { + foreach (var substep in on_methods) { + Push (substep); + substep.ProcessMethod (method); + Pop (); + } + } + + void DispatchProperty (PropertyDefinition property) + { + foreach (var substep in on_properties) { + Push (substep); + substep.ProcessProperty (property); + Pop (); + } + } + + void DispatchEvent (EventDefinition @event) + { + foreach (var substep in on_events) { + Push (substep); + substep.ProcessEvent (@event); + Pop (); + } + } + + void InitializeSubSteps (LinkContext context) + { + foreach (var substep in substeps) + substep.Initialize (context); + } + + void CategorizeSubSteps (AssemblyDefinition assembly) + { + on_assemblies = null; + on_types = null; + on_fields = null; + on_methods = null; + on_properties = null; + on_events = null; + + foreach (var substep in substeps) + CategorizeSubStep (substep, assembly); + } + + void CategorizeSubStep (ISubStep substep, AssemblyDefinition assembly) + { + if (!substep.IsActiveFor (assembly)) + return; + + CategorizeTarget (substep, SubStepTargets.Assembly, ref on_assemblies); + CategorizeTarget (substep, SubStepTargets.Type, ref on_types); + CategorizeTarget (substep, SubStepTargets.Field, ref on_fields); + CategorizeTarget (substep, SubStepTargets.Method, ref on_methods); + CategorizeTarget (substep, SubStepTargets.Property, ref on_properties); + CategorizeTarget (substep, SubStepTargets.Event, ref on_events); + } + + static void CategorizeTarget (ISubStep substep, SubStepTargets target, ref List list) + { + if (!Targets (substep, target)) + return; + + if (list is null) + list = new List (); + + list.Add (substep); + } + + static bool Targets (ISubStep substep, SubStepTargets target) + { + return (substep.Targets & target) == target; + } + + IEnumerator IEnumerable.GetEnumerator () + { + return GetEnumerator (); + } + + public IEnumerator GetEnumerator () + { + return substeps.GetEnumerator (); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Extensions.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Extensions.cs new file mode 100644 index 000000000000..23ba6dc0ac87 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Extensions.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; + +using Mono.Cecil; + +using Mono.Linker; + +namespace Mono.Tuner { + + public static partial class Extensions { + + public static bool TryGetLinkedAssembly (this LinkContext context, string name, out AssemblyDefinition assembly) + { + assembly = GetAssembly (context, name); + if (assembly is null) + return false; + + return context.Annotations.GetAction (assembly) == AssemblyAction.Link; + } + + public static AssemblyDefinition GetAssembly (this LinkContext context, string assembly_name) + { + foreach (var assembly in context.GetAssemblies ()) + if (assembly.Name.Name == assembly_name) + return assembly; + + return null; + } + + // note: direct check, no inheritance + public static bool Is (this TypeReference type, string @namespace, string name) + { + return ((type is not null) && (type.Name == name) && (type.Namespace == @namespace)); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/FixModuleFlags.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/FixModuleFlags.cs new file mode 100644 index 000000000000..2bb01ab9bc50 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/FixModuleFlags.cs @@ -0,0 +1,20 @@ +using System; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Cecil; + +namespace Mono.Tuner { + + public class FixModuleFlags : BaseStep { + + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + if (Annotations.GetAction (assembly) != AssemblyAction.Link) + return; + + assembly.MainModule.Attributes = ModuleAttributes.ILOnly; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveCrypto.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveCrypto.cs new file mode 100644 index 000000000000..5e9d3ee0726b --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveCrypto.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Mono.Tuner { + + public class PreserveCrypto : IStep { + + AnnotationStore annotations; + + public void Process (LinkContext context) + { + annotations = context.Annotations; + + ProcessCorlib (context); + ProcessSystemCore (context); + } + + void ProcessCorlib (LinkContext context) + { + AssemblyDefinition corlib; + if (!context.TryGetLinkedAssembly ("mscorlib", out corlib)) + return; + + AddPreserveInfo (corlib, "DES", "DESCryptoServiceProvider"); + AddPreserveInfo (corlib, "DSA", "DSACryptoServiceProvider"); + AddPreserveInfo (corlib, "RandomNumberGenerator", "RNGCryptoServiceProvider"); + AddPreserveInfo (corlib, "SHA1", "SHA1CryptoServiceProvider"); + AddPreserveInfo (corlib, "SHA1", "SHA1Managed"); + AddPreserveInfo (corlib, "MD5", "MD5CryptoServiceProvider"); + AddPreserveInfo (corlib, "RC2", "RC2CryptoServiceProvider"); + AddPreserveInfo (corlib, "TripleDES", "TripleDESCryptoServiceProvider"); + + AddPreserveInfo (corlib, "Rijndael", "RijndaelManaged"); + AddPreserveInfo (corlib, "RIPEMD160", "RIPEMD160Managed"); + AddPreserveInfo (corlib, "SHA256", "SHA256Managed"); + AddPreserveInfo (corlib, "SHA384", "SHA384Managed"); + AddPreserveInfo (corlib, "SHA512", "SHA512Managed"); + + AddPreserveInfo (corlib, "HMAC", "HMACMD5"); + AddPreserveInfo (corlib, "HMAC", "HMACRIPEMD160"); + AddPreserveInfo (corlib, "HMAC", "HMACSHA1"); + AddPreserveInfo (corlib, "HMAC", "HMACSHA256"); + AddPreserveInfo (corlib, "HMAC", "HMACSHA384"); + AddPreserveInfo (corlib, "HMAC", "HMACSHA512"); + + AddPreserveInfo (corlib, "HMACMD5", "MD5CryptoServiceProvider"); + AddPreserveInfo (corlib, "HMACRIPEMD160", "RIPEMD160Managed"); + AddPreserveInfo (corlib, "HMACSHA1", "SHA1CryptoServiceProvider"); + AddPreserveInfo (corlib, "HMACSHA1", "SHA1Managed"); + AddPreserveInfo (corlib, "HMACSHA256", "SHA256Managed"); + AddPreserveInfo (corlib, "HMACSHA384", "SHA384Managed"); + AddPreserveInfo (corlib, "HMACSHA512", "SHA512Managed"); + + TryAddPreserveInfo (corlib, "Aes", "AesManaged"); + + var corlibAes = GetCryptoType (corlib, "Aes"); + Preserve (corlibAes, GetCryptoType (corlib, "AesManaged")); + + AssemblyDefinition syscore; + if (context.TryGetLinkedAssembly ("System.Core", out syscore)) + Preserve (corlibAes, GetCryptoType (syscore, "AesCryptoServiceProvider")); + } + + void ProcessSystemCore (LinkContext context) + { + AssemblyDefinition syscore; + if (!context.TryGetLinkedAssembly ("System.Core", out syscore)) + return; + + // AddPreserveInfo (syscore, "Aes", "AesCryptoServiceProvider"); + TryAddPreserveInfo (syscore, "Aes", "AesManaged"); + } + + bool TryAddPreserveInfo (AssemblyDefinition assembly, string name, string type) + { + var marker = GetCryptoType (assembly, name); + if (marker is null) + return false; + + var implementation = GetCryptoType (assembly, type); + if (implementation is null) + return false; + + Preserve (marker, implementation); + return true; + } + + void AddPreserveInfo (AssemblyDefinition assembly, string name, string type) + { + var marker = GetCryptoType (assembly, name); + if (marker is null) + throw new ArgumentException (name); + + var implementation = GetCryptoType (assembly, type); + if (implementation is null) + throw new ArgumentException (type); + + Preserve (marker, implementation); + } + + void Preserve (TypeDefinition marker, TypeDefinition implementation) + { + if (marker is null || implementation is null) + return; + foreach (var constructor in implementation.GetConstructors ()) + annotations.AddPreservedMethod (marker, constructor); + } + + TypeDefinition GetCryptoType (AssemblyDefinition assembly, string name) + { + return assembly.MainModule.GetType ("System.Security.Cryptography." + name); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveSoapHttpClients.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveSoapHttpClients.cs new file mode 100644 index 000000000000..ee486cae93d8 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/PreserveSoapHttpClients.cs @@ -0,0 +1,90 @@ +using System; + +using Mono.Linker; + +using Mono.Cecil; + +namespace Mono.Tuner { + + public class PreserveSoapHttpClients : BaseSubStep { + + public override SubStepTargets Targets { + get { return SubStepTargets.Type; } + } + + public override bool IsActiveFor (AssemblyDefinition assembly) + { + return Annotations.GetAction (assembly) == AssemblyAction.Link && !Profile.IsSdkAssembly (assembly); + } + + public override void ProcessType (TypeDefinition type) + { + if (IsWebServiceClient (type)) + PreserveClient (type); + } + + void PreserveClient (TypeDefinition type) + { + if (!type.HasMethods) + return; + + foreach (MethodDefinition method in type.Methods) { + string sync_method; + if (!TryExtractSyncMethod (method, out sync_method)) + continue; + + AddPreservedMethod (method, sync_method); + } + } + + void AddPreservedMethod (MethodDefinition target, string methodName) + { + foreach (MethodDefinition method in target.DeclaringType.Methods) + if (method.Name == methodName) + Annotations.AddPreservedMethod (target, method); + } + + static bool TryExtractSyncMethod (MethodDefinition method, out string sync_method) + { + if (TryExtractPrefixedMethodName ("Begin", method.Name, out sync_method)) + return true; + + if (TryExtractPrefixedMethodName ("End", method.Name, out sync_method)) + return true; + + if (TryExtractSuffixedMethodName ("Async", method.Name, out sync_method)) + return true; + + return false; + } + + static bool TryExtractPrefixedMethodName (string prefix, string fullName, out string methodName) + { + methodName = null; + + int pos = fullName.IndexOf (prefix, StringComparison.Ordinal); + if (pos == -1) + return false; + + methodName = fullName.Substring (prefix.Length); + return true; + } + + static bool TryExtractSuffixedMethodName (string suffix, string fullName, out string methodName) + { + methodName = null; + + int pos = fullName.LastIndexOf (suffix, StringComparison.Ordinal); + if (pos == -1) + return false; + + methodName = fullName.Substring (0, pos); + return true; + } + + static bool IsWebServiceClient (TypeDefinition type) + { + return type.Inherits ("System.Web.Services.Protocols", "SoapHttpClientProtocol"); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Profile.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Profile.cs new file mode 100644 index 000000000000..9cfbf9f0942c --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/Profile.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +using Mono.Cecil; + +namespace Mono.Tuner { + + public abstract class Profile { + + static Profile current; + + public static Profile Current { + get { + if (current is not null) + return current; + + current = CreateProfile ("MonoTouch"); + if (current is not null) + return current; + + current = CreateProfile ("MonoDroid"); + if (current is not null) + return current; + + current = CreateProfile ("MonoMac"); + if (current is not null) + return current; + + throw new NotSupportedException ("No active profile"); + } + set { + current = value; + } + } + + static Profile CreateProfile (string name) + { + var type = Type.GetType (string.Format ("{0}.Tuner.{0}Profile", name)); + if (type is null) + return null; + + return (Profile) Activator.CreateInstance (type); + } + + public static bool IsSdkAssembly (AssemblyDefinition assembly) + { + return Current.IsSdk (assembly); + } + + public static bool IsSdkAssembly (string assemblyName) + { + return Current.IsSdk (assemblyName); + } + + public static bool IsProductAssembly (AssemblyDefinition assembly) + { + return Current.IsProduct (assembly); + } + + public static bool IsProductAssembly (string assemblyName) + { + return Current.IsProduct (assemblyName); + } + + protected virtual bool IsSdk (AssemblyDefinition assembly) + { + return IsSdk (assembly.Name.Name); + } + + protected virtual bool IsProduct (AssemblyDefinition assembly) + { + return IsProduct (assembly.Name.Name); + } + + protected abstract bool IsSdk (string assemblyName); + protected abstract bool IsProduct (string assemblyName); + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveAttributesBase.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveAttributesBase.cs new file mode 100644 index 000000000000..61101809fd47 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveAttributesBase.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Tuner; + +using Mono.Cecil; + +namespace Mono.Tuner { + + public abstract class RemoveAttributesBase : BaseSubStep { + + public override SubStepTargets Targets { + get { + return SubStepTargets.Assembly + | SubStepTargets.Type + | SubStepTargets.Field + | SubStepTargets.Method + | SubStepTargets.Property + | SubStepTargets.Event; + } + } + + public override bool IsActiveFor (AssemblyDefinition assembly) + { + return Annotations.GetAction (assembly) == AssemblyAction.Link; + } + + public override void ProcessAssembly (AssemblyDefinition assembly) + { + ProcessAttributeProvider (assembly); + ProcessAttributeProvider (assembly.MainModule); + } + + public override void ProcessType (TypeDefinition type) + { + ProcessAttributeProvider (type); + + if (type.HasGenericParameters) + ProcessAttributeProviderCollection (type.GenericParameters); + } + + void ProcessAttributeProviderCollection (IList list) + { + for (int i = 0; i < list.Count; i++) + ProcessAttributeProvider ((ICustomAttributeProvider) list [i]); + } + + public override void ProcessField (FieldDefinition field) + { + ProcessAttributeProvider (field); + } + + public override void ProcessMethod (MethodDefinition method) + { + ProcessMethodAttributeProvider (method); + } + + void ProcessMethodAttributeProvider (MethodDefinition method) + { + ProcessAttributeProvider (method); + ProcessAttributeProvider (method.MethodReturnType); + + if (method.HasParameters) + ProcessAttributeProviderCollection (method.Parameters); + + if (method.HasGenericParameters) + ProcessAttributeProviderCollection (method.GenericParameters); + } + + public override void ProcessProperty (PropertyDefinition property) + { + ProcessAttributeProvider (property); + } + + public override void ProcessEvent (EventDefinition @event) + { + ProcessAttributeProvider (@event); + } + + void ProcessAttributeProvider (ICustomAttributeProvider provider) + { + if (!provider.HasCustomAttributes) + return; + + for (int i = 0; i < provider.CustomAttributes.Count; i++) { + var attrib = provider.CustomAttributes [i]; + if (!IsRemovedAttribute (attrib)) + continue; + + WillRemoveAttribute (provider, attrib); + provider.CustomAttributes.RemoveAt (i--); + } + } + + protected abstract bool IsRemovedAttribute (CustomAttribute attribute); + protected virtual void WillRemoveAttribute (ICustomAttributeProvider provider, CustomAttribute attribute) { } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveResources.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveResources.cs new file mode 100644 index 000000000000..803b1e76bf1a --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveResources.cs @@ -0,0 +1,63 @@ +using System; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Cecil; + +namespace Mono.Tuner { + + public class RemoveResources : IStep { + + readonly I18nAssemblies assemblies; + + public RemoveResources (I18nAssemblies assemblies) + { + this.assemblies = assemblies; + } + + public virtual void Process (LinkContext context) + { + AssemblyDefinition assembly; + if (!context.TryGetLinkedAssembly ("mscorlib", out assembly)) + return; + + // skip this if we're not linking mscorlib, e.g. --linkskip=mscorlib + if (context.Annotations.GetAction (assembly) != AssemblyAction.Link) + return; + + var resources = assembly.MainModule.Resources; + + for (int i = 0; i < resources.Count; i++) { + var resource = resources [i] as EmbeddedResource; + if (resource is null) + continue; + + if (RemoveResource (resource.Name)) + resources.RemoveAt (i--); + } + } + + bool RemoveResource (string name) + { + switch (name) { + case "mscorlib.xml": + return true; + case "collation.core.bin": + case "collation.tailoring.bin": + return false; + default: + if (!name.Contains ("cjk")) + return false; + if (IncludeCJK ()) + return false; + return true; + } + } + + bool IncludeCJK () + { + return (assemblies & I18nAssemblies.CJK) != 0; + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveSecurity.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveSecurity.cs new file mode 100644 index 000000000000..2704564a65e1 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/RemoveSecurity.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using Mono.Linker; +using Mono.Linker.Steps; + +using Mono.Cecil; + +namespace Mono.Tuner { + + public class RemoveSecurity : BaseSubStep { + + public override SubStepTargets Targets { + get { + return SubStepTargets.Assembly + | SubStepTargets.Type + | SubStepTargets.Method; + } + } + + public override bool IsActiveFor (AssemblyDefinition assembly) + { + return Annotations.GetAction (assembly) == AssemblyAction.Link; + } + + public override void ProcessAssembly (AssemblyDefinition assembly) + { + ProcessSecurityProvider (assembly); + } + + public override void ProcessType (TypeDefinition type) + { + ProcessSecurityProvider (type); + } + + public override void ProcessMethod (MethodDefinition method) + { + ProcessSecurityProvider (method); + } + + static void ProcessSecurityProvider (ISecurityDeclarationProvider provider) + { + if (!provider.HasSecurityDeclarations) + return; + + provider.SecurityDeclarations.Clear (); + } + } +} diff --git a/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/TunerAnnotations.cs b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/TunerAnnotations.cs new file mode 100644 index 000000000000..2107ac4a0f59 --- /dev/null +++ b/builds/mono-ios-sdk-destdir/ios-sources/external/linker/src/tuner/Mono.Tuner/TunerAnnotations.cs @@ -0,0 +1,55 @@ +// +// TunerAnnotations.cs +// +// Author: +// Jb Evain (jbevain@novell.com) +// +// (C) 2007 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Mono.Cecil; +using Mono.Linker; + +namespace Mono.Tuner { + + public class TunerAnnotations { + + static readonly object _internalizedKey = new object (); + + public static void Internalized (LinkContext context, IMetadataTokenProvider provider) + { + var annotations = context.Annotations.GetCustomAnnotations (_internalizedKey); + annotations [provider] = _internalizedKey; + } + + public static bool IsInternalized (LinkContext context, IMetadataTokenProvider provider) + { + var annotations = context.Annotations.GetCustomAnnotations (_internalizedKey); + + return annotations.ContainsKey (provider); + } + + private TunerAnnotations () + { + } + } +} diff --git a/builds/mono-wrapper.in b/builds/mono-wrapper.in deleted file mode 100644 index d57106b82ccf..000000000000 --- a/builds/mono-wrapper.in +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -export PATH="@FRAMEWORK_ROOT@/bin:$PATH" -export MONO_CFG_DIR="@FRAMEWORK_ROOT@/etc" -export MONO_PATH="@FRAMEWORK_ROOT@/lib/@ARCH@:@FRAMEWORK_ROOT@/lib/mono/Xamarin.Mac" - -"@MONO@" "$@" diff --git a/tests/Makefile b/tests/Makefile index 43868d18a19b..324448670a26 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -62,7 +62,6 @@ test.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Version.De @echo "JENKINS_RESULTS_DIRECTORY=$(abspath $(JENKINS_RESULTS_DIRECTORY))" >> $@ @echo "INCLUDE_DEVICE=$(INCLUDE_DEVICE)" >> $@ @echo "XCODE_DEVELOPER_ROOT=$(XCODE_DEVELOPER_ROOT)" >> $@ - @echo "MONO_IOS_SDK_DESTDIR=$(MONO_IOS_SDK_DESTDIR)" >> $@ @echo "DOTNET=$(DOTNET)" >> $@ @echo "IOS_SDK_VERSION=$(IOS_SDK_VERSION)" >> $@ @echo "TVOS_SDK_VERSION=$(TVOS_SDK_VERSION)" >> $@ @@ -96,7 +95,6 @@ test-system.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Ver @echo "MAC_DESTDIR=/" >> $@ @echo "JENKINS_RESULTS_DIRECTORY=$(abspath $(JENKINS_RESULTS_DIRECTORY))" >> $@ @echo "INCLUDE_DEVICE=$(INCLUDE_DEVICE)" >> $@ - @echo "MONO_IOS_SDK_DESTDIR=$(MONO_IOS_SDK_DESTDIR)" >> $@ @echo "DOTNET=$(DOTNET)" >> $@ @echo "IOS_SDK_VERSION=$(IOS_SDK_VERSION)" >> $@ @echo "TVOS_SDK_VERSION=$(TVOS_SDK_VERSION)" >> $@ @@ -343,7 +341,7 @@ runner: $(XHARNESS_EXECUTABLE) # This makefile target will run the device tests using the Xamarin.iOS version # installed on the system. vsts-device-tests: $(XHARNESS_EXECUTABLE) - $(MAKE) -C $(TOP)/builds .stamp-mono-ios-sdk-destdir download -j + $(MAKE) -C $(TOP)/builds download -j $(Q) ulimit -n 4096 && $(DOTNET) $< $(XHARNESS_VERBOSITY) --jenkins --autoconf --rootdir $(CURDIR) --sdkroot $(XCODE_DEVELOPER_ROOT) --use-system:true --label=skip-all-tests,run-device-tests --markdown-summary=$(CURDIR)/TestSummary.md $(TESTS_EXTRA_ARGUMENTS) $(TESTS_PERIODIC_COMMAND) verify-system-vsmac-xcode-match: diff --git a/tests/xharness/Harness.cs b/tests/xharness/Harness.cs index 7fb3f9118dc8..ffcba7d2e4c3 100644 --- a/tests/xharness/Harness.cs +++ b/tests/xharness/Harness.cs @@ -229,7 +229,6 @@ string GetVariable (string variable, string @default = null) public string JENKINS_RESULTS_DIRECTORY { get; } // Use same name as in Makefiles, so that a grep finds it. public string MAC_DESTDIR { get; } public string IOS_DESTDIR { get; } - public string MONO_IOS_SDK_DESTDIR { get; } public bool ENABLE_DOTNET { get; } public bool INCLUDE_XAMARIN_LEGACY { get; } public string SYSTEM_MONO { get; set; } @@ -305,7 +304,6 @@ public Harness (IResultParser resultParser, HarnessAction action, HarnessConfigu INCLUDE_MACCATALYST = IsVariableSet (nameof (INCLUDE_MACCATALYST)); MAC_DESTDIR = GetVariable (nameof (MAC_DESTDIR)); IOS_DESTDIR = GetVariable (nameof (IOS_DESTDIR)); - MONO_IOS_SDK_DESTDIR = GetVariable (nameof (MONO_IOS_SDK_DESTDIR)); ENABLE_DOTNET = IsVariableSet (nameof (ENABLE_DOTNET)); SYSTEM_MONO = GetVariable (nameof (SYSTEM_MONO)); DOTNET_DIR = GetVariable (nameof (DOTNET_DIR)); diff --git a/tests/xharness/IHarness.cs b/tests/xharness/IHarness.cs index 4c2ba87a8faf..b20f6a2f006e 100644 --- a/tests/xharness/IHarness.cs +++ b/tests/xharness/IHarness.cs @@ -40,7 +40,6 @@ public interface IHarness { string JENKINS_RESULTS_DIRECTORY { get; } string MAC_DESTDIR { get; } string IOS_DESTDIR { get; } - string MONO_IOS_SDK_DESTDIR { get; } bool ENABLE_DOTNET { get; } bool INCLUDE_XAMARIN_LEGACY { get; } string SYSTEM_MONO { get; set; } diff --git a/tools/devops/automation/scripts/bash/export-mono-filenames.sh b/tools/devops/automation/scripts/bash/export-mono-filenames.sh deleted file mode 100755 index ac0fe56c31f1..000000000000 --- a/tools/devops/automation/scripts/bash/export-mono-filenames.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -eu - -env | sort - -set -o pipefail -IFS=$'\n\t ' - -FILE=$(pwd)/tmp.txt - -make -C "$BUILD_SOURCESDIRECTORY/xamarin-macios/tools/devops" print-variable-value-to-file FILE="$FILE" VARIABLE=MONO_IOS_FILENAME -MONO_IOS_FILENAME=$(cat "$FILE") -MONO_IOS_FILENAME=$(basename "$MONO_IOS_FILENAME" ".7z") - -make -C "$BUILD_SOURCESDIRECTORY/xamarin-macios/tools/devops" print-variable-value-to-file FILE="$FILE" VARIABLE=MONO_MAC_FILENAME -MONO_MAC_FILENAME=$(cat "$FILE") -MONO_MAC_FILENAME=$(basename "$MONO_MAC_FILENAME" ".7z") - -make -C "$BUILD_SOURCESDIRECTORY/xamarin-macios/tools/devops" print-variable-value-to-file FILE="$FILE" VARIABLE=MONO_MACCATALYST_FILENAME -MONO_MACCATALYST_FILENAME=$(cat "$FILE") -MONO_MACCATALYST_FILENAME=$(basename "$MONO_MACCATALYST_FILENAME" ".7z") - -# allow the rest of the build use the values -echo "##vso[task.setvariable variable=MONO_IOS_FILENAME;]$MONO_IOS_FILENAME" -echo "##vso[task.setvariable variable=MONO_MAC_FILENAME;]$MONO_MAC_FILENAME" -echo "##vso[task.setvariable variable=MONO_MACCATALYST_FILENAME;]$MONO_MACCATALYST_FILENAME" - -rm -f "$FILE" diff --git a/tools/devops/automation/templates/build/build.yml b/tools/devops/automation/templates/build/build.yml index a2648822460e..5bac994abb82 100644 --- a/tools/devops/automation/templates/build/build.yml +++ b/tools/devops/automation/templates/build/build.yml @@ -157,20 +157,6 @@ steps: rm -rf ~/Library/Caches/com.apple.dt.Xcode displayName: 'Clear Xcode cache' - # downloding mono takes time and has been shown to be problematic when we have network issues. This is why we - # are using the cache. Mono does not get bump a lot of times if any (after dotnet) - - - bash: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/export-mono-filenames.sh - displayName: "Export mono download filenames" - workingDirectory: "$(Build.SourcesDirectory)/xamarin-macios" - timeoutInMinutes: 5 - - - task: Cache@2 - displayName: 'Cache iOS Mono download' - inputs: - key: "$(MONO_IOS_FILENAME)" - path: "$(Build.SourcesDirectory)/xamarin-macios/builds/downloads/$(MONO_IOS_FILENAME)" - # Actual build of the project - bash: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/build-macios.sh name: build diff --git a/tools/devops/automation/templates/tests/run-tests.yml b/tools/devops/automation/templates/tests/run-tests.yml index 9f5943d59514..f64da7afe89b 100644 --- a/tools/devops/automation/templates/tests/run-tests.yml +++ b/tools/devops/automation/templates/tests/run-tests.yml @@ -138,8 +138,6 @@ steps: # show environment env -0 | sort -z | tr '\0' '\n' || true - make -C builds download -j - make -C builds .stamp-mono-ios-sdk-destdir -j make -C tests ${{ parameters.makeTarget }} # We reached the end! This means we succeeded! From d2937441250b40b0b3848cdbee8d9abd05105851 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 14:26:41 +0200 Subject: [PATCH 047/155] [devops/github] Update a few things for .NET 10. (#21392) --- .github/ISSUE_TEMPLATE/01-building-an-application.yml | 1 + .github/ISSUE_TEMPLATE/02-running-an-application.yml | 1 + .github/ISSUE_TEMPLATE/03-api.yml | 1 + .github/ISSUE_TEMPLATE/04-bindings.yml | 1 + .github/ISSUE_TEMPLATE/05-other.yml | 1 + tools/devops/automation/templates/main-stage.yml | 1 + 6 files changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/01-building-an-application.yml b/.github/ISSUE_TEMPLATE/01-building-an-application.yml index c73aeb0cf6de..34eef7a52047 100644 --- a/.github/ISSUE_TEMPLATE/01-building-an-application.yml +++ b/.github/ISSUE_TEMPLATE/01-building-an-application.yml @@ -25,6 +25,7 @@ body: options: - net8.0-* - net9.0-* + - net10.0-* - Other validations: required: true diff --git a/.github/ISSUE_TEMPLATE/02-running-an-application.yml b/.github/ISSUE_TEMPLATE/02-running-an-application.yml index 097f33073bdd..fdb690de07d0 100644 --- a/.github/ISSUE_TEMPLATE/02-running-an-application.yml +++ b/.github/ISSUE_TEMPLATE/02-running-an-application.yml @@ -25,6 +25,7 @@ body: options: - net8.0-* - net9.0-* + - net10.0-* - Other validations: required: true diff --git a/.github/ISSUE_TEMPLATE/03-api.yml b/.github/ISSUE_TEMPLATE/03-api.yml index 747de33ac01c..37232368a583 100644 --- a/.github/ISSUE_TEMPLATE/03-api.yml +++ b/.github/ISSUE_TEMPLATE/03-api.yml @@ -35,6 +35,7 @@ body: options: - net8.0-* - net9.0-* + - net10.0-* - Other validations: required: true diff --git a/.github/ISSUE_TEMPLATE/04-bindings.yml b/.github/ISSUE_TEMPLATE/04-bindings.yml index 6eb890ed27f0..68190269d041 100644 --- a/.github/ISSUE_TEMPLATE/04-bindings.yml +++ b/.github/ISSUE_TEMPLATE/04-bindings.yml @@ -26,6 +26,7 @@ body: options: - net8.0-* - net9.0-* + - net10.0-* - Other validations: required: true diff --git a/.github/ISSUE_TEMPLATE/05-other.yml b/.github/ISSUE_TEMPLATE/05-other.yml index 6b9b1e44be72..3d560f63299f 100644 --- a/.github/ISSUE_TEMPLATE/05-other.yml +++ b/.github/ISSUE_TEMPLATE/05-other.yml @@ -25,6 +25,7 @@ body: options: - net8.0-* - net9.0-* + - net10.0-* - Other validations: required: true diff --git a/tools/devops/automation/templates/main-stage.yml b/tools/devops/automation/templates/main-stage.yml index 2a9f3bf0cf53..f8b10cb71838 100644 --- a/tools/devops/automation/templates/main-stage.yml +++ b/tools/devops/automation/templates/main-stage.yml @@ -287,6 +287,7 @@ stages: eq(variables['Build.SourceBranch'], 'refs/heads/net7.0'), eq(variables['Build.SourceBranch'], 'refs/heads/net8.0'), eq(variables['Build.SourceBranch'], 'refs/heads/net9.0'), + eq(variables['Build.SourceBranch'], 'refs/heads/net10.0'), eq(variables['Build.SourceBranch'], 'refs/heads/xcode16'), eq(parameters.forceInsertion, true) ) From 1b75eb73e4bec0cd319f7454dadf465ff25a1f96 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 18:57:20 +0200 Subject: [PATCH 048/155] [CryptoTokenKit] Fix detecting .NET 10. (#21400) --- src/cryptotokenkit.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptotokenkit.cs b/src/cryptotokenkit.cs index 3f09ea6932c4..301d9358c5ab 100644 --- a/src/cryptotokenkit.cs +++ b/src/cryptotokenkit.cs @@ -2,7 +2,7 @@ // Let's hope that by .NET 10 we've ironed out all the bugs in the API. // This can of course be adjusted as needed (until we've released as stable). -#if NET100_0_OR_GREATER +#if NET10_0_OR_GREATER #define STABLE_CRYPTOTOKENKIT #endif From 43cd02dc2383f665e06172ea9e0519f2542aa5bc Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 10 Oct 2024 20:10:04 +0200 Subject: [PATCH 049/155] [msbuild] Improve the error message when the SupportedOSPlatformVersion is lower than the minimum. Fixes #21368. (#21369) This isn't very user friendly: ILLink : unknown error IL7000: An error occurred while executing the custom linker steps. Please review the build log for more information. ILLINK : error MT0073: Microsoft.iOS 18.0.8337 does not support a deployment target of 10.0 for iOS (the minimum is 11.0). Please select a newer deployment target in your project's Info.plist or change the SupportedOSPlatformVersion property in your project file. ILLINK : error MT2301: The linker step 'Setup' failed during processing: Microsoft.iOS 18.0.8337 does not support a deployment target of 10.0 for iOS (the minimum is 11.0). Please select a newer deployment target in your project's Info.plist or change the SupportedOSPlatformVersion property in your project file. [...]/packages/microsoft.net.illink.tasks/8.0.8/build/Microsoft.NET.ILLink.targets(87,5): error NETSDK1144: Optimizing assemblies for size failed. Optimization can be disabled by setting the PublishTrimmed property to false. So improve this to only show a single error message: The SupportedOSPlatformVersion value '10.0' in the project file is lower than the minimum value '11.0'. Fixes https://github.com/xamarin/xamarin-macios/issues/21368. --- dotnet/generate-target-platforms.csharp | 1 + .../MSBStrings.resx | 13 +++++++++ .../Tasks/CompileAppManifest.cs | 15 ++++++++++ msbuild/Xamarin.Shared/Xamarin.Shared.targets | 1 + tests/Makefile | 2 ++ tests/dotnet/UnitTests/ProjectTest.cs | 28 ++++++++++++++++++- .../TaskTests/CompileAppManifestTaskTests.cs | 16 +++-------- .../GeneratePlistTaskTests_Core.cs | 4 ++- 8 files changed, 66 insertions(+), 14 deletions(-) diff --git a/dotnet/generate-target-platforms.csharp b/dotnet/generate-target-platforms.csharp index b7a2ed4ad18e..bff196cab8f9 100755 --- a/dotnet/generate-target-platforms.csharp +++ b/dotnet/generate-target-platforms.csharp @@ -50,6 +50,7 @@ using (TextWriter writer = new StreamWriter (outputPath)) { writer.WriteLine ("\t"); writer.WriteLine ("\t"); writer.WriteLine ($"\t\t<{platform}MinSupportedOSPlatformVersion>{minSdkVersionString}"); + writer.WriteLine ($"\t\t$({platform}MinSupportedOSPlatformVersion)"); writer.WriteLine ("\t"); writer.WriteLine (""); } diff --git a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx index c25833c4c865..b68ef191e2a9 100644 --- a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx +++ b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx @@ -1563,6 +1563,19 @@ RuntimeIdentifier: don't translate (it's the name of a MSBuild property) + + Unable to parse the value '{0}' for the property '{1}. + + {0}: user-provided value + {1}: name of an MSBuild property + + + + + The SupportedOSPlatformVersion value '{0}' in the project file is lower than the minimum value '{1}'. + SupportedOSPlatformVersion: don't translate (it's the name of an MSBuild property) + + Adding reference to Xcode project output: '{0}'. The '%(CreateNativeReference)' metadata can be set to 'false' to opt out of this behavior. diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs index 3500599ef23a..7901c1f9f72d 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs @@ -62,6 +62,9 @@ public class CompileAppManifest : XamarinTask, ITaskCallback, ICancelableTask { public bool IsWatchExtension { get; set; } + [Required] + public string MinSupportedOSPlatformVersion { get; set; } = string.Empty; + public ITaskItem [] PartialAppManifests { get; set; } = Array.Empty (); [Required] @@ -302,6 +305,18 @@ bool SetMinimumOSVersion (PDictionary plist) minimumOSVersion = minimumOSVersionInManifest!; } + // Verify that the value is not lower than the minimum + if (!Version.TryParse (MinSupportedOSPlatformVersion, out var minSupportedVersion)) { + Log.LogError (MSBStrings.E7125 /* Unable to parse the value '{0}' for the property '{1}. */, MinSupportedOSPlatformVersion, "MinSupportedOSPlatformVersion"); + return false; + } else if (!Version.TryParse (SupportedOSPlatformVersion, out var supportedVersion)) { + Log.LogError (MSBStrings.E7125 /* Unable to parse the value '{0}' for the property '{1}. */, SupportedOSPlatformVersion, "SupportedOSPlatformVersion"); + return false; + } else if (minSupportedVersion > supportedVersion) { + Log.LogError (MSBStrings.E7126 /* The SupportedOSPlatformVersion value '{0}' in the project file is lower than the minimum value '{1}'." */, SupportedOSPlatformVersion, MinSupportedOSPlatformVersion); + return false; + } + // Write out our value plist [minimumVersionKey] = minimumOSVersion; diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index 34adc65727dd..bc155c936ad5 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -570,6 +570,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. IsWatchApp="$(IsWatchApp)" IsWatchExtension="$(IsWatchExtension)" IsXPCService="$(IsXPCService)" + MinSupportedOSPlatformVersion="$(MinSupportedOSPlatformVersion)" PartialAppManifests="@(PartialAppManifest)" ProjectDir="$(MSBuildProjectDirectory)" ResourcePrefix="$(_ResourcePrefix)" diff --git a/tests/Makefile b/tests/Makefile index 324448670a26..f13e4860ebe9 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -87,6 +87,7 @@ test.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Version.De @printf "ENABLE_XAMARIN=$(ENABLE_XAMARIN)\n" >> $@ @printf "XCODE_IS_STABLE=$(XCODE_IS_STABLE)\n" >> $@ @printf "XCODE_VERSION=$(XCODE_VERSION)\n" >> $@ + @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),DOTNET_MIN_$(platform)_SDK_VERSION=$(DOTNET_MIN_$(platform)_SDK_VERSION)\\n)" | sed 's/^ //' >> $@ test-system.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Version.Details.xml @rm -f $@ @@ -120,6 +121,7 @@ test-system.config: Makefile $(TOP)/Make.config $(TOP)/mk/mono.mk $(TOP)/eng/Ver @printf "ENABLE_XAMARIN=$(ENABLE_XAMARIN)\n" >> $@ @printf "XCODE_IS_STABLE=$(XCODE_IS_STABLE)\n" >> $@ @printf "XCODE_VERSION=$(XCODE_VERSION)\n" >> $@ + @printf "$(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),DOTNET_MIN_$(platform)_SDK_VERSION=$(DOTNET_MIN_$(platform)_SDK_VERSION)\\n)" | sed 's/^ //' >> $@ clean-local:: $(Q) $(SYSTEM_XBUILD) /t:Clean /p:Platform=iPhoneSimulator /p:Configuration=$(CONFIG) $(XBUILD_VERBOSITY) tests.sln diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index cc8541998b91..36e4a0dd8bd4 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -1861,7 +1861,7 @@ public void UnsupportedTargetPlatformVersion (ApplePlatform platform) // Pick a target platform version that we don't really support, // but don't show an error in .NET 8 because of backwards compat. // The earliest target OS version should do. - var minSupportedOSVersion = GetSupportedTargetPlatformVersions (platform).First (); + var minSupportedOSVersion = GetMinSupportedOSPlatformVersion (platform); var targetFrameworks = Configuration.DotNetTfm + "-" + platform.AsString ().ToLowerInvariant () + minSupportedOSVersion; var supportedApiVersions = GetSupportedApiVersions (platform, isCompat: false); @@ -1914,6 +1914,11 @@ string [] GetSupportedTargetPlatformVersions (ApplePlatform platform) .ToArray (); } + string GetMinSupportedOSPlatformVersion (ApplePlatform platform) + { + return Configuration.GetVariable ($"DOTNET_MIN_{platform.AsString ().ToUpperInvariant ()}_SDK_VERSION", "unknown MinSupportedOSPlatformVersion"); + } + [Test] [TestCase (ApplePlatform.MacCatalyst, "MtouchArch", "x86_64")] [TestCase (ApplePlatform.iOS, "MtouchArch", "ARMv7s")] @@ -2837,5 +2842,26 @@ static HashSet GetLinkedWithFrameworks (string path) } return rv; } + + [Test] + [TestCase (ApplePlatform.MacCatalyst, "maccatalyst-x64", "13.1")] + [TestCase (ApplePlatform.iOS, "ios-arm64", "10.0")] + [TestCase (ApplePlatform.TVOS, "tvossimulator-x64", "10.0")] + [TestCase (ApplePlatform.MacOSX, "osx-arm64", "10.0")] + public void InvalidSupportedOSPlatformVersion (ApplePlatform platform, string runtimeIdentifiers, string version) + { + var project = "MySimpleApp"; + Configuration.IgnoreIfIgnoredPlatform (platform); + Configuration.AssertRuntimeIdentifiersAvailable (platform, runtimeIdentifiers); + + var minVersion = GetMinSupportedOSPlatformVersion (platform); + var project_path = GetProjectPath (project, runtimeIdentifiers: runtimeIdentifiers, platform: platform, out var appPath); + Clean (project_path); + var properties = GetDefaultProperties (runtimeIdentifiers); + properties ["SupportedOSPlatformVersion"] = version; + var rv = DotNet.AssertBuildFailure (project_path, properties); + var errors = BinLog.GetBuildLogErrors (rv.BinLogPath).ToArray (); + AssertErrorMessages (errors, $"The SupportedOSPlatformVersion value '{version}' in the project file is lower than the minimum value '{minVersion}'."); + } } } diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs index 00c3fa08f935..93cc0b5e6d41 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs @@ -22,24 +22,14 @@ CompileAppManifest CreateTask (string? tmpdir = null, ApplePlatform platform = A task.AppBundleName = "AppBundleName"; task.CompiledAppManifest = new TaskItem (Path.Combine (tmpdir, "TemporaryAppManifest.plist")); task.DefaultSdkVersion = Sdks.GetAppleSdk (platform).GetInstalledSdkVersions (false).First ().ToString ()!; + task.MinSupportedOSPlatformVersion = "10.0"; + task.SupportedOSPlatformVersion = "15.0"; task.SdkVersion = task.DefaultSdkVersion ?? string.Empty; task.TargetFrameworkMoniker = TargetFramework.GetTargetFramework (platform, true).ToString (); return task; } - [Test] - public void DefaultMinimumOSVersion () - { - var dir = Cache.CreateTemporaryDirectory (); - var task = CreateTask (dir); - - ExecuteTask (task); - - var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!; - Assert.AreEqual (task.SdkVersion, plist.GetMinimumOSVersion (), "MinimumOSVersion"); - } - [Test] public void MainMinimumOSVersions () { @@ -52,6 +42,7 @@ public void MainMinimumOSVersions () main.Save (mainPath); task.AppManifest = new TaskItem (mainPath); + task.SupportedOSPlatformVersion = "14.0"; ExecuteTask (task); @@ -78,6 +69,7 @@ public void MultipleMinimumOSVersions () task.AppManifest = new TaskItem (mainPath); task.PartialAppManifests = new [] { new TaskItem (partialPath) }; + task.SupportedOSPlatformVersion = "14.0"; ExecuteTask (task); diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_Core.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_Core.cs index b82d27061176..85487ed1fb8c 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_Core.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_Core.cs @@ -50,6 +50,8 @@ protected virtual void ConfigureTask (bool isDotNet) Task.CompiledAppManifest = new TaskItem (Path.Combine (Cache.CreateTemporaryDirectory (), "AppBundlePath", "Info.plist")); Task.AssemblyName = assemblyName; Task.AppManifest = new TaskItem (CreateTempFile ("foo.plist")); + Task.MinSupportedOSPlatformVersion = "10.0"; + Task.SupportedOSPlatformVersion = "15.0"; Task.SdkVersion = "10.0"; Plist = new PDictionary (); @@ -70,7 +72,7 @@ public override void Setup () ConfigureTask (IsDotNet); - Task.Execute (); + ExecuteTask (Task); CompiledPlist = PDictionary.FromFile (Task.CompiledAppManifest.ItemSpec); } From 46ed02ba8c47cf43169f42776ab4d2f64e28b70d Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 11 Oct 2024 08:36:29 +0200 Subject: [PATCH 050/155] [tests] Ignore a few tests that fail on iOS Simulator/arm64. (#21403) Ref: https://github.com/xamarin/xamarin-macios/issues/19781 --- tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs b/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs index 2a500d50b312..b2787b3199ae 100644 --- a/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs +++ b/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs @@ -9,7 +9,7 @@ public partial class RegistrarTestGenerated { void AssertIfIgnored ([CallerMemberName] string testCase = null) { switch (testCase) { -#if __MACCATALYST__ +#if __MACCATALYST__ || __IOS__ case "NSNumberBindAs_Boolean_Array_Overrides": case "NSNumberBindAs_Byte_Array_Overrides": case "NSNumberBindAs_Double_Array_Overrides": @@ -25,7 +25,11 @@ void AssertIfIgnored ([CallerMemberName] string testCase = null) case "NSNumberBindAs_UInt32_Array_Overrides": case "NSNumberBindAs_UInt64_Array_Overrides": // https://github.com/xamarin/xamarin-macios/issues/19781 +#if __MACCATALYST__ if (Runtime.IsARM64CallingConvention) +#elif __IOS__ + if (Runtime.IsARM64CallingConvention && Runtime.Arch == Arch.SIMULATOR) +#endif Assert.Ignore ("https://github.com/xamarin/xamarin-macios/issues/19781"); break; #endif From 22cb6e8cb24d0c1b524a19da7ff4fee324f4e5ca Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 11 Oct 2024 08:37:41 +0200 Subject: [PATCH 051/155] [devops] Remove the wget dependency. (#21405) It doesn't look like it's used anywhere (and I don't have it on my system either). --- tools/devops/provision-shared.in.csx | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/devops/provision-shared.in.csx b/tools/devops/provision-shared.in.csx index bd0989fc68d8..5ad2d0b38c50 100644 --- a/tools/devops/provision-shared.in.csx +++ b/tools/devops/provision-shared.in.csx @@ -72,7 +72,6 @@ void ProvisionBrewPackages () "yamllint", "p7zip", "msitools", - "wget", "azure-cli" ); } From 657f0169c53ad9362bfede90e4a1537771069b0f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 11 Oct 2024 09:32:15 +0200 Subject: [PATCH 052/155] [tools] Ignore any interpreter settings when the current runtime isn't MonoVM. Fixes #20398. (#21406) Tests that exercise this code path will be included in a different PR. Fixes https://github.com/xamarin/xamarin-macios/issues/20398. --- tools/common/Application.cs | 6 ++++++ tools/dotnet-linker/LinkerConfiguration.cs | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/tools/common/Application.cs b/tools/common/Application.cs index 6e571717d6cf..b82a3e85cca8 100644 --- a/tools/common/Application.cs +++ b/tools/common/Application.cs @@ -546,6 +546,12 @@ public void ParseInterpreter (string value) InterpretedAssemblies.AddRange (value.Split (new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries)); } + public void UnsetInterpreter () + { + UseInterpreter = false; + InterpretedAssemblies.Clear (); + } + #if !NET public void ParseI18nAssemblies (string i18n) { diff --git a/tools/dotnet-linker/LinkerConfiguration.cs b/tools/dotnet-linker/LinkerConfiguration.cs index 78e29d716f07..e450d03902ea 100644 --- a/tools/dotnet-linker/LinkerConfiguration.cs +++ b/tools/dotnet-linker/LinkerConfiguration.cs @@ -425,6 +425,11 @@ public static LinkerConfiguration GetInstance (LinkContext context) if (Driver.TargetFramework.Platform != Platform) throw ErrorHelper.CreateError (99, "Inconsistent platforms. TargetFramework={0}, Platform={1}", Driver.TargetFramework.Platform, Platform); + if (Application.XamarinRuntime != XamarinRuntime.MonoVM && Application.UseInterpreter) { + Driver.Log (4, "The interpreter is enabled, but the current runtime isn't MonoVM. The interpreter settings will be ignored."); + Application.UnsetInterpreter (); + } + Driver.ValidateXcode (Application, false, false); Application.InitializeCommon (); From 2f7c126ac9d6516135100d69063faa86717cfbbb Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 11 Oct 2024 12:13:29 +0200 Subject: [PATCH 053/155] [dotnet] Fix building universal apps using NativeAOT when the default RuntimeIdentifiers value is set. Fixes #19391. (#21412) We need to set "UseCurrentRuntimeIdentifier=false", we must only set it for the outer build for universal builds - when `RuntimeIdentifiers` is set - but that means we can only do it *after* we set any default value for `RuntimeIdentifiers`. Fixes https://github.com/xamarin/xamarin-macios/issues/19391#issuecomment-2405499973. --- dotnet/targets/Xamarin.Shared.Sdk.props | 7 +++---- tests/dotnet/UnitTests/ProjectTest.cs | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.props b/dotnet/targets/Xamarin.Shared.Sdk.props index b628bc55eec1..cdea9479e7fd 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.props +++ b/dotnet/targets/Xamarin.Shared.Sdk.props @@ -94,10 +94,6 @@ true true - - - false - @@ -142,6 +138,9 @@ + + false + $(CustomAfterDirectoryBuildTargets);$(MSBuildThisFileDirectory)Xamarin.Shared.Sdk.Trimming.props diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index 36e4a0dd8bd4..5e881d167ffc 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -1744,6 +1744,7 @@ public void BuildMyNativeAotAppWithTrimAnalysisWarning (ApplePlatform platform, [TestCase (ApplePlatform.MacOSX, "osx-x64", "Release")] [TestCase (ApplePlatform.MacOSX, "osx-arm64;osx-x64", "Debug")] [TestCase (ApplePlatform.MacOSX, "osx-arm64;osx-x64", "Release")] + [TestCase (ApplePlatform.MacOSX, "", "Release")] [TestCase (ApplePlatform.MacCatalyst, "maccatalyst-arm64", "Debug")] [TestCase (ApplePlatform.MacCatalyst, "maccatalyst-arm64", "Release")] [TestCase (ApplePlatform.MacCatalyst, "maccatalyst-arm64;maccatalyst-x64", "Debug")] From 48f559182931d4633895cd3b9dc7f0eccc253d89 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 11 Oct 2024 13:26:45 +0200 Subject: [PATCH 054/155] [devops] Improved diagnostics and implement deadlocked process termination. (#21317) * Unify the code to collect diagnostic information about a bot. * Unify some of the cleanup code to prepare a bot as well. * Implement code to terminate processes on a bot that's used more than a day of CPU (presumably these processes are stuck for some reason). --- .../automation/scripts/bash/clean-bot.sh | 20 ++++++++++++- .../scripts/bash/clean-results-dir.sh | 4 --- .../scripts/bash/clean-simulator-runtime.sh | 5 ++++ .../scripts/bash/delete-library-dirs.sh | 6 ---- .../scripts/bash/kill-deadlocked-processes.sh | 27 +++++++++++++++++ .../run-generator-tests-on-windows.ps1 | 2 +- .../{show_env.ps1 => show_bot_info.ps1} | 29 ++++++++++++++----- .../automation/scripts/show_python_env.ps1 | 6 ---- .../build/api-diff-process-results.yml | 4 +-- .../automation/templates/common/configure.yml | 4 +-- .../templates/common/load_configuration.yml | 4 +-- .../automation/templates/common/setup.yml | 22 ++------------ .../devops/automation/templates/mac/build.yml | 21 +++++--------- .../automation/templates/tests/build.yml | 2 +- .../templates/tests/publish-html.yml | 4 +-- .../automation/templates/windows/build.yml | 7 ++--- .../templates/windows/reenable-mac.yml | 4 +-- .../templates/windows/reserve-mac.yml | 8 +++++ 18 files changed, 105 insertions(+), 74 deletions(-) delete mode 100755 tools/devops/automation/scripts/bash/clean-results-dir.sh delete mode 100755 tools/devops/automation/scripts/bash/delete-library-dirs.sh create mode 100755 tools/devops/automation/scripts/bash/kill-deadlocked-processes.sh rename tools/devops/automation/scripts/{show_env.ps1 => show_bot_info.ps1} (51%) delete mode 100644 tools/devops/automation/scripts/show_python_env.ps1 diff --git a/tools/devops/automation/scripts/bash/clean-bot.sh b/tools/devops/automation/scripts/bash/clean-bot.sh index 923d353c1a8d..c48e4d5895f7 100755 --- a/tools/devops/automation/scripts/bash/clean-bot.sh +++ b/tools/devops/automation/scripts/bash/clean-bot.sh @@ -12,6 +12,15 @@ df -h # We don't care about errors in this section, we just want to clean as much as possible set +e +# Clean workspace +( + REPO_PATH="SYSTEM_DEFAULTWORKINGDIRECTORY/$(basename "$BUILD_REPOSITORY_NAME")" + if test -d "$REPO_PATH"; then + cd "$REPO_PATH" + git clean -xfd + fi +) + # Delete all the simulator devices. These can take up a lot of space over time (I've seen 100+GB on the bots) /Applications/Xcode.app/Contents/Developer/usr/bin/simctl delete all @@ -118,7 +127,9 @@ XCODE_SELECT=$(xcode-select -p) for oldXcode in "${oldXcodes[@]}"; do if [ "$XCODE_SELECT" != "$oldXcode/Contents/Developer" ]; then - sudo rm -Rf "$oldXcode" + if test -d "$oldXcode"; then + sudo rm -Rf "$oldXcode" + fi else echo "Not removing $oldXcode because is the currently selected one." fi @@ -126,6 +137,13 @@ done DIR="$(dirname "${BASH_SOURCE[0]}")" "$DIR"/clean-simulator-runtime.sh +"$DIR"/kill-deadlocked-processes.sh + +# Remove legacy Xamarin/MonoTouch stuff +sudo rm -Rf /Developer/MonoTouch +sudo rm -Rf /Library/Frameworks/Xamarin.iOS.framework +sudo rm -Rf /Library/Frameworks/Xamarin.Mac.framework +ls -R /Library/Frameworks # Print disk status after cleaning df -h diff --git a/tools/devops/automation/scripts/bash/clean-results-dir.sh b/tools/devops/automation/scripts/bash/clean-results-dir.sh deleted file mode 100755 index 3e1aa2dfb4e1..000000000000 --- a/tools/devops/automation/scripts/bash/clean-results-dir.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -ex - -rm -Rvf package -time make -C xamarin-macios/ git-clean-all diff --git a/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh b/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh index ed23cf1193c2..dfddf64f38d9 100755 --- a/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh +++ b/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh @@ -5,6 +5,11 @@ set -o pipefail IFS=$'\n\t' +# delete all watchOS simulators, we don't need them anymore +for i in $(xcrun simctl runtime list | grep "watchOS.*Ready" | sed -e 's/.* - //' -e 's/ .*//'); do + xcrun simctl runtime delete "$i" +done + xcrun simctl runtime list -j > simruntime.json cat simruntime.json diff --git a/tools/devops/automation/scripts/bash/delete-library-dirs.sh b/tools/devops/automation/scripts/bash/delete-library-dirs.sh deleted file mode 100755 index 3c647824f72b..000000000000 --- a/tools/devops/automation/scripts/bash/delete-library-dirs.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -ex - -sudo rm -Rf /Developer/MonoTouch -sudo rm -Rf /Library/Frameworks/Xamarin.iOS.framework -sudo rm -Rf /Library/Frameworks/Xamarin.Mac.framework -ls -R /Library/Frameworks diff --git a/tools/devops/automation/scripts/bash/kill-deadlocked-processes.sh b/tools/devops/automation/scripts/bash/kill-deadlocked-processes.sh new file mode 100755 index 000000000000..7610d51a7200 --- /dev/null +++ b/tools/devops/automation/scripts/bash/kill-deadlocked-processes.sh @@ -0,0 +1,27 @@ +#!/bin/bash -e + +echo "Looking for processes that have been stuck for more than a day, and will try to kill them." + +# Collect the list of processes for the current user, including the CPU time. +# We then split the CPU time into separate fields, so that it's easier to figure out the total number of minutes later on. +IFS=$'\n' +PROCESSES=() +while IFS='' read -r line; do PROCESSES+=("$line"); done < <(ps -o cputime=,pid=,user=,lstart=,args= -U "$USER" -w -w -w | sed -e 's/\([0-9]*\):\([0-9][0-9]\)\.\([0-9][0-9]\)/\1 m \2 s \3 ms/' | sort -nr) + +IFS=' ' +for process in "${PROCESSES[@]}"; do + IFS=" " read -r -a FIELDS <<< "$process" + minutes=${FIELDS[0]} + pid=${FIELDS[6]} + + echo "$process" + + # looking for processes that have spent more than a day using the CPU (24h * 60min = 1440min) + if (( minutes > 1440 )); then + echo " This process has been stuck for more than $minutes minutes, so assuming it's deadlocked and we'll try to kill it:" + echo " kill -9 $pid" + kill -9 "$pid" | sed 's/^/ /' || true + fi +done + +echo "No (more) processes stuck for more than a day." diff --git a/tools/devops/automation/scripts/run-generator-tests-on-windows.ps1 b/tools/devops/automation/scripts/run-generator-tests-on-windows.ps1 index 493b3026c0c2..a59e58043535 100644 --- a/tools/devops/automation/scripts/run-generator-tests-on-windows.ps1 +++ b/tools/devops/automation/scripts/run-generator-tests-on-windows.ps1 @@ -1,5 +1,5 @@ # Dump the environment to see what we're working with. -& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY\xamarin-macios\tools\devops\automation\scripts\show_env.ps1" +& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY\$($Env:BUILD_REPOSITORY_NAME.Split('/')[1])\tools\devops\automation\scripts\show_bot_info.ps1" # Set a few variables $Env:DOTNET = "$Env:BUILD_SOURCESDIRECTORY\xamarin-macios\tests\dotnet\Windows\bin\dotnet\dotnet.exe" diff --git a/tools/devops/automation/scripts/show_env.ps1 b/tools/devops/automation/scripts/show_bot_info.ps1 similarity index 51% rename from tools/devops/automation/scripts/show_env.ps1 rename to tools/devops/automation/scripts/show_bot_info.ps1 index 7852d1ad7c7a..0369422be80e 100644 --- a/tools/devops/automation/scripts/show_env.ps1 +++ b/tools/devops/automation/scripts/show_bot_info.ps1 @@ -8,13 +8,14 @@ if ($IsMacOS -or $IsLinux) { Write-Host "COMPUTERNAME: ${env:COMPUTERNAME}" } -gci env: | format-table -autosize - -gci env: | format-table -autosize | Out-String -Width 8192 - -gci env: | format-table -autosize -wrap +Get-ChildItem env: | Sort-Object -Property Name | Format-Table -AutoSize | Out-String -Width 81920 if ($IsMacOS) { + Write-Host "" + Write-Host "## Uptime" + Write-Host "" + uptime + Write-Host "" Write-Host "## System profile" Write-Host "" @@ -25,10 +26,24 @@ if ($IsMacOS) { Write-Host "" ifconfig | grep 'inet ' + Write-Host "" + Write-Host "## Top processes (ps)" + Write-Host "" + ps aux + + Write-Host "" + Write-Host "## Python3 location:" + Write-Host "" + which python3 + + Write-Host "" + Write-Host "## Pip3 version:" + Write-Host "" + pip3 -V Write-Host "" - Write-Host "## Top processes" + Write-Host "## Hardware info" Write-Host "" - top -l 1 -o TIME + ioreg -l | grep -e Manufacturer -e 'Vendor Name' } diff --git a/tools/devops/automation/scripts/show_python_env.ps1 b/tools/devops/automation/scripts/show_python_env.ps1 deleted file mode 100644 index 79873375cf32..000000000000 --- a/tools/devops/automation/scripts/show_python_env.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -Write-Host "Python3 location" -which python3 - -Write-Host "Pip3 version" -pip3 -V - diff --git a/tools/devops/automation/templates/build/api-diff-process-results.yml b/tools/devops/automation/templates/build/api-diff-process-results.yml index c8b3bf3cc8bb..4d3f74c10c27 100644 --- a/tools/devops/automation/templates/build/api-diff-process-results.yml +++ b/tools/devops/automation/templates/build/api-diff-process-results.yml @@ -27,8 +27,8 @@ steps: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} - - pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' + - pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' - pwsh: | if (Test-Path "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/Artifacts" -PathType Container) { diff --git a/tools/devops/automation/templates/common/configure.yml b/tools/devops/automation/templates/common/configure.yml index e909e535fe88..c30328ef600c 100644 --- a/tools/devops/automation/templates/common/configure.yml +++ b/tools/devops/automation/templates/common/configure.yml @@ -65,8 +65,8 @@ steps: name: decisions displayName: 'Make decisions' -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' +- pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' - pwsh: | Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY/xamarin-macios/tools/devops/automation/scripts/MaciosCI.psd1 diff --git a/tools/devops/automation/templates/common/load_configuration.yml b/tools/devops/automation/templates/common/load_configuration.yml index 5ecac652b11f..536cad18268f 100644 --- a/tools/devops/automation/templates/common/load_configuration.yml +++ b/tools/devops/automation/templates/common/load_configuration.yml @@ -75,8 +75,8 @@ steps: name: decisions displayName: 'Make decisions' - - pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' + - pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' - pwsh: | Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY/xamarin-macios/tools/devops/automation/scripts/MaciosCI.psd1 diff --git a/tools/devops/automation/templates/common/setup.yml b/tools/devops/automation/templates/common/setup.yml index 91df3be177c1..8811f43cb03b 100644 --- a/tools/devops/automation/templates/common/setup.yml +++ b/tools/devops/automation/templates/common/setup.yml @@ -17,30 +17,14 @@ steps: - bash: $(Build.SourcesDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/fix-github-ssh-key.sh displayName: 'Fix GitHub SSH host key' -- bash: cd $(System.DefaultWorkingDirectory)/xamarin-macios/ && git clean -xdf - displayName: 'Clean workspace' +- pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' -- bash: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/clean-bot.sh +- bash: '$SYSTEM_DEFAULTWORKINGDIRECTORY/${BUILD_REPOSITORY_NAME/#*\//}/tools/devops/automation/scripts/bash/clean-bot.sh' displayName: 'Clean bot' continueOnError: true timeoutInMinutes: 60 -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' - -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_python_env.ps1 - displayName: 'Show Python information' - -- bash: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/delete-library-dirs.sh - displayName: 'Delete library folders' - timeoutInMinutes: 5 - -- bash: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/clean-results-dir.sh - workingDirectory: $(System.DefaultWorkingDirectory) - displayName: 'Clear results directory' - timeoutInMinutes: 5 - continueOnError: true - - bash: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/remove-ui-prompt.sh env: OSX_KEYCHAIN_PASS: ${{ parameters.keyringPass }} diff --git a/tools/devops/automation/templates/mac/build.yml b/tools/devops/automation/templates/mac/build.yml index 504c68d79372..fca31bfd84fd 100644 --- a/tools/devops/automation/templates/mac/build.yml +++ b/tools/devops/automation/templates/mac/build.yml @@ -64,18 +64,16 @@ steps: condition: succeededOrFailed() # we do not care about the previous process cleanup continueOnError: true -- bash: cd $(System.DefaultWorkingDirectory)/xamarin-macios/ && git clean -xdf - displayName: 'Clean workspace' - # download the packages that have been created, install them, later download the zip files that contain the already built # tests and execute them. -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' +- pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' -- bash: | - ioreg -l | grep -e Manufacturer -e 'Vendor Name' - displayName: 'Dump Hardware' +- bash: '$SYSTEM_DEFAULTWORKINGDIRECTORY/${BUILD_REPOSITORY_NAME/#*\//}/tools/devops/automation/scripts/bash/clean-bot.sh' + displayName: 'Clean bot' + continueOnError: true + timeoutInMinutes: 60 - bash: | if [[ $(ioreg -l | grep -e 'VMware' | wc -l) -ne 0 ]]; then @@ -95,11 +93,6 @@ steps: displayName: 'Set VM Vendor' -- bash: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/bash/clean-bot.sh - displayName: 'Clean bot' - continueOnError: true - timeoutInMinutes: 60 - # Use a cmdlet to check if the space available in the devices root system is larger than 50 gb. If there is not # enough space available it: # 1. Set the status of the build to error. It is not a failure since no tests have been ran. @@ -109,7 +102,7 @@ steps: Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY\xamarin-macios\tools\devops\automation\scripts\MaciosCI.psd1 if ( -not (Test-HDFreeSpace -Size 5)) { - Set-Content -Path "$GITHUB_FAILURE_COMMENT_FILE" -Value "Not enough free space in the host." + Set-Content -Path "$GITHUB_FAILURE_COMMENT_FILE" -Value "Not enough free space in the host $Env:AGENT_MACHINENAME." exit 1 } env: diff --git a/tools/devops/automation/templates/tests/build.yml b/tools/devops/automation/templates/tests/build.yml index 58396ef89bd5..98c2482478b9 100644 --- a/tools/devops/automation/templates/tests/build.yml +++ b/tools/devops/automation/templates/tests/build.yml @@ -99,7 +99,7 @@ steps: Import-Module ./MaciosCI.psd1 if ( -not (Test-HDFreeSpace -Size 20)) { - New-GitHubComment -Header "Tests failed catastrophically on $Env:CONTEXT" -Emoji ":fire:" -Description "Not enough free space in the host." + New-GitHubComment -Header "Tests failed catastrophically on $Env:CONTEXT" -Emoji ":fire:" -Description "Not enough free space in the host $Env:AGENT_MACHINENAME." Stop-Pipeline } env: diff --git a/tools/devops/automation/templates/tests/publish-html.yml b/tools/devops/automation/templates/tests/publish-html.yml index 79d44e48d23f..e163ac2ba609 100644 --- a/tools/devops/automation/templates/tests/publish-html.yml +++ b/tools/devops/automation/templates/tests/publish-html.yml @@ -49,8 +49,8 @@ steps: - template: download-artifacts.yml -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' +- pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' # build a message with all the content of all tests, to do so, we get the labels and to pass them to pwsh we do a join with ; # as the separator diff --git a/tools/devops/automation/templates/windows/build.yml b/tools/devops/automation/templates/windows/build.yml index c8c39389992f..8f5545baee49 100644 --- a/tools/devops/automation/templates/windows/build.yml +++ b/tools/devops/automation/templates/windows/build.yml @@ -37,8 +37,8 @@ steps: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Dump Environment' +- pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' - ${{ if or(contains(variables['Build.Reason'], 'ResourceTrigger'), contains(variables['Build.Reason'], 'BuildCompletion'), contains(variables['Build.DefinitionName'], 'xamarin-macios-ci-tests'), contains(variables['Build.DefinitionName'], 'xamarin-macios-pr-tests')) }}: - download: macios @@ -127,9 +127,6 @@ steps: displayName: "Write and verify id_rsa" continueOnError: true -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Show Environment' - - pwsh: | Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY\\xamarin-macios\\tools\\devops\\automation\\scripts\\MaciosCI.psd1 ssh -v -i "$(ID_RSA_PATH)" -o IdentitiesOnly=yes -o StrictHostKeyChecking=no builder@$Env:MAC_AGENT_IP pwd diff --git a/tools/devops/automation/templates/windows/reenable-mac.yml b/tools/devops/automation/templates/windows/reenable-mac.yml index 269802117011..833788b3092b 100644 --- a/tools/devops/automation/templates/windows/reenable-mac.yml +++ b/tools/devops/automation/templates/windows/reenable-mac.yml @@ -19,8 +19,8 @@ steps: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} -- pwsh: $(System.DefaultWorkingDirectory)/xamarin-macios/tools/devops/automation/scripts/show_env.ps1 - displayName: 'Dump Environment' +- pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' - task: AzureKeyVault@2 inputs: diff --git a/tools/devops/automation/templates/windows/reserve-mac.yml b/tools/devops/automation/templates/windows/reserve-mac.yml index 9c8710d9b619..8298a73c0da2 100644 --- a/tools/devops/automation/templates/windows/reserve-mac.yml +++ b/tools/devops/automation/templates/windows/reserve-mac.yml @@ -33,6 +33,14 @@ steps: - checkout: maccore persistCredentials: true # hugely important, else there are some scripts that check a single file from maccore that will fail +- pwsh: '"$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' + displayName: 'Show Bot Info' + +- bash: '$SYSTEM_DEFAULTWORKINGDIRECTORY/${BUILD_REPOSITORY_NAME/#*\//}/tools/devops/automation/scripts/bash/clean-bot.sh' + displayName: 'Clean bot' + continueOnError: true + timeoutInMinutes: 60 + - bash: $(Build.SourcesDirectory)/xamarin-macios/tools/devops/automation/scripts/disable-codeql-arm64.sh displayName: 'Disable CodeQL on arm64' name: disableCodeQLOnArm64 From 0482be8bd331d63c9844031c975334e59ab0ef35 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 11 Oct 2024 16:34:16 +0200 Subject: [PATCH 055/155] [devops] Remove the msitools dependency. (#21415) According to @pjcollins the msi files we were generated aren't used anywhere, so this should be safe. --- dotnet/Makefile | 27 +-------------------------- tools/devops/provision-shared.in.csx | 1 - 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/dotnet/Makefile b/dotnet/Makefile index 7e1eb766c266..a67f5289fe37 100644 --- a/dotnet/Makefile +++ b/dotnet/Makefile @@ -436,17 +436,6 @@ WINDOWS_PACKAGE_TARGETS += $(DOTNET_PKG_DIR)/Microsoft.$1.Windows.Bundle.$2.zip endef $(foreach platform,$(DOTNET_WINDOWS_PLATFORMS),$(eval $(call CreateWindowsBundle,$(platform),$($(platform)_NUGET_VERSION_NO_METADATA),$(shell echo $(platform) | tr A-Z a-z),$(shell echo $(platform) | tr a-z A-Z)))) -define CreateMsi -$(TMP_PKG_DIR)/Microsoft.NET.Workload.$1.$2.wsx: ./generate-wix.csharp Makefile $(TMP_PKG_DIR)/Microsoft.$1.Windows.Bundle.$2.zip - $$(Q_GEN) ./generate-wix.csharp "$1" "$$@" "$(TMP_PKG_DIR)/Microsoft.$1.Windows.Bundle.$2.zip.tmpdir/dotnet" "$2" - -$(TMP_PKG_DIR)/Microsoft.NET.Workload.$1.$2.msi: $(TMP_PKG_DIR)/Microsoft.NET.Workload.$1.$2.wsx .stamp-check-wixl - $$(Q_GEN) wixl -o "$$@" "$$<" -a x64 - -MSI_TARGETS += $(DOTNET_PKG_DIR)/Microsoft.NET.Workload.$1.$2.msi -endef -$(foreach platform,$(DOTNET_WINDOWS_PLATFORMS),$(eval $(call CreateMsi,$(platform),$($(platform)_NUGET_VERSION_NO_METADATA)))) - NUGET_SOURCES:=$(shell grep https://pkgs.dev.azure.com $(TOP)/NuGet.config | sed -e 's/.*value="//' -e 's/".*//') .stamp-install-workloads: Makefile $(WORKLOAD_TARGETS) $(RUNTIME_PACKS) $(REF_PACKS) $(SDK_PACKS) $(TEMPLATE_PACKS) $(WORKLOAD_PACKS) $(Q) $(DOTNET) workload install --skip-manifest-update \ @@ -457,23 +446,9 @@ NUGET_SOURCES:=$(shell grep https://pkgs.dev.azure.com $(TOP)/NuGet.config | sed TARGETS += .stamp-install-workloads -.stamp-check-wixl: - $(Q) if ! type wixl; then \ - echo "Installing msitools to get wixl..."; \ - if ! brew install msitools; then \ - if ! type wixl; then \ - echo "Failed to install wixl"; \ - exit 1; \ - fi; \ - fi; \ - echo "Installed msitools"; \ - fi - $(Q) touch $@ - TARGETS += $(WORKLOAD_TARGETS) $(WINDOWS_PACKAGE_TARGETS) -msi: $(MSI_TARGETS) -package: $(PACKAGE_TARGETS) $(MSI_TARGETS) $(WINDOWS_PACKAGE_TARGETS) +package: $(PACKAGE_TARGETS) $(WINDOWS_PACKAGE_TARGETS) # Helper targets for templates # diff --git a/tools/devops/provision-shared.in.csx b/tools/devops/provision-shared.in.csx index 5ad2d0b38c50..23947808f1aa 100644 --- a/tools/devops/provision-shared.in.csx +++ b/tools/devops/provision-shared.in.csx @@ -71,7 +71,6 @@ void ProvisionBrewPackages () "shellcheck", "yamllint", "p7zip", - "msitools", "azure-cli" ); } From 503f10c073e7b5a9f6c0ec4b945ee6bcb7b64577 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Fri, 11 Oct 2024 15:33:09 -0400 Subject: [PATCH 056/155] [xcode16.1] Update sharpie version to v3.5.116 --- Make.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Make.config b/Make.config index 3b4f62a2bc08..9cda89d2fa36 100644 --- a/Make.config +++ b/Make.config @@ -262,9 +262,9 @@ MIN_MONO_URL=https://download.mono-project.com/archive/6.12.0/macos-10-universal MIN_XM_MONO_VERSION=6.4.0.94 # ObjectiveSharpie min/max versions -MIN_SHARPIE_VERSION=3.5.115 +MIN_SHARPIE_VERSION=3.5.116 MAX_SHARPIE_VERSION=3.5.999 -MIN_SHARPIE_URL=https://download.visualstudio.microsoft.com/download/pr/8445c488-35b2-44d5-a80f-15954ca1fcf8/bb2946f34caefe1ba3bc5cedfda31879/objectivesharpie-3.5.115.pkg +MIN_SHARPIE_URL=https://download.visualstudio.microsoft.com/download/pr/3a748cc2-780d-403c-88ba-700aa9a2d299/88cbfd86e85f56b4c61e092d0f0b9ad9/objectivesharpie-3.5.116.pkg # Minimum OSX versions for building XI/XM MIN_OSX_BUILD_VERSION=13.0 From 57380a58b8c123d5e3dfeb23dbe0eacb72b49bc7 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Sun, 13 Oct 2024 17:17:29 -0400 Subject: [PATCH 057/155] [CI] Fix the download step (#21398) Allow to download the artifacts from the build that triggered the pipeline. --- .../automation/run-post-ci-build-api-scan.yml | 1 - .../templates/governance/apiscan.yml | 33 +++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/tools/devops/automation/run-post-ci-build-api-scan.yml b/tools/devops/automation/run-post-ci-build-api-scan.yml index bddf49deed90..c95684af0b41 100644 --- a/tools/devops/automation/run-post-ci-build-api-scan.yml +++ b/tools/devops/automation/run-post-ci-build-api-scan.yml @@ -15,4 +15,3 @@ extends: template: templates/pipelines/run-api-scan.yml parameters: isPR: false - diff --git a/tools/devops/automation/templates/governance/apiscan.yml b/tools/devops/automation/templates/governance/apiscan.yml index c68489fc2152..b154cd6aed62 100644 --- a/tools/devops/automation/templates/governance/apiscan.yml +++ b/tools/devops/automation/templates/governance/apiscan.yml @@ -27,12 +27,32 @@ steps: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} -- task: DownloadPipelineArtifact@2 - displayName: Download artifacts - inputs: - artifactName: not-signed-package - allowFailedBuilds: true - path: $(Build.SourcesDirectory)/not-signed-package +- ${{ if or(contains(variables['Build.Reason'], 'ResourceTrigger'), contains(variables['Build.Reason'], 'BuildCompletion')) }}: + - download: macios + displayName: Download artifacts + artifact: not-signed-package + + # When we download an artifact from a resource pipeline, the download task places the artifact under $(Pipeline.Workspace)/$(pipeline-ref)/artifact + # in our case, it will be "$(Pipeline.Workspace)/macios/not-signed-package". Becuase this stage was originally part of the build, all the scripts + # assume that the location of the nugets is "$(Build.SourcesDirectory)/not-signed-package" already unzipped in a flat dir. This pwsh script does + # the move and flattering of the files. + - pwsh: | + $source = "$(Pipeline.Workspace)/macios/not-signed-package" + $destination = "$(Build.SourcesDirectory)/not-signed-package" + New-Item -ItemType Directory -Force -Path $destination + Write-Host "Moving content from $source to $destination" + # move all the files from the source to the destination + Get-ChildItem -Path $source -Recurse -File | Move-Item -Destination $destination + displayName: Move artifacts to the expected location + +- ${{ else }}: + + - task: DownloadPipelineArtifact@2 + displayName: Download artifacts + inputs: + artifactName: not-signed-package + allowFailedBuilds: true + path: $(Build.SourcesDirectory)/not-signed-package - pwsh: >- ./prepare_workload_apiscan.ps1 @@ -55,6 +75,7 @@ steps: preserveLogsFolder: true env: AzureServicesAuthConnectionString: RunAs=App;AppId=$(CLIENT_ID) + SYSTEM_ACCESSTOKEN: $(System.AccessToken) - task: PublishSecurityAnalysisLogs@3 displayName: Publish Security Analysis Logs From 02ad20920b211321ce352c019fa11306b1467bf2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 09:46:34 +0200 Subject: [PATCH 058/155] [main] Update dependencies from dotnet/xharness (#21381) This pull request updates the following dependencies ## From https://github.com/dotnet/xharness - **Subscription**: 601bc5e1-1cae-44b5-cf5f-08db9342aa2f - **Build**: 20241009.1 - **Date Produced**: October 9, 2024 2:00:06 PM UTC - **Commit**: 973ef6c89b67f2f746f62c413e3aeeb01a9034a3 - **Branch**: refs/heads/main - **Updates**: - **Microsoft.DotNet.XHarness.iOS.Shared**: [from 10.0.0-prerelease.24501.1 to 10.0.0-prerelease.24509.1][2] [2]: https://github.com/dotnet/xharness/compare/2b6293f14c...973ef6c89b --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c944a42768eb..e203849b3e95 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -78,9 +78,9 @@ https://github.com/dotnet/templating - + https://github.com/dotnet/xharness - 7d5c32dbda0c6c8b9dc20cde4e1261b191896138 + 973ef6c89b67f2f746f62c413e3aeeb01a9034a3 diff --git a/eng/Versions.props b/eng/Versions.props index f79e90fe3d43..497a62251339 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -12,7 +12,7 @@ 9.0.0-rc.2.24462.10 7.0.100-alpha.1.21601.1 0.11.5-alpha.24467.1 - 10.0.0-prerelease.24476.1 + 10.0.0-prerelease.24509.1 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) From 887e67c8b2d3d803fd733a9c647ab928ad244ab5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 09:47:00 +0200 Subject: [PATCH 059/155] [main] Update dependencies from dotnet/arcade (#21374) This pull request updates the following dependencies ## From https://github.com/dotnet/arcade - **Subscription**: 6ddbc71e-6118-4fea-a928-58d1b2579c38 - **Build**: 20241009.3 - **Date Produced**: October 9, 2024 10:05:57 PM UTC - **Commit**: 05c72bb3c9b38138276a8029017f2ef905dcc7fa - **Branch**: refs/heads/release/9.0 - **Updates**: - **Microsoft.DotNet.Build.Tasks.Feed**: [from 9.0.0-beta.24508.3 to 9.0.0-beta.24509.3][4] [4]: https://github.com/dotnet/arcade/compare/f8071c4233...05c72bb3c9 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e203849b3e95..9c0d8f07d2c4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -70,9 +70,9 @@ - + https://github.com/dotnet/arcade - 60ae233c3d77f11c5fdb53e570b64d503b13ba59 + 05c72bb3c9b38138276a8029017f2ef905dcc7fa https://github.com/dotnet/templating diff --git a/eng/Versions.props b/eng/Versions.props index 497a62251339..e186c008dee2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -5,7 +5,7 @@ 9.0.100-rc.2.24475.4 9.0.0-rtm.24475.3 9.0.0-alpha.1.23556.4 - 9.0.0-beta.24408.2 + 9.0.0-beta.24509.3 8.0.0-beta.24413.2 9.0.0-rtm.24475.3 8.0.0-rtm.23511.3 From e9e4072f945002c7e4e2eb0b8f5a34f0477e777e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 09:16:32 +0200 Subject: [PATCH 060/155] [main] Update dependencies from dotnet/xharness (#21431) This pull request updates the following dependencies ## From https://github.com/dotnet/xharness - **Subscription**: 601bc5e1-1cae-44b5-cf5f-08db9342aa2f - **Build**: 20241011.1 - **Date Produced**: October 11, 2024 7:48:41 AM UTC - **Commit**: 8c6d5afd99c713777165f4378462085a5679c223 - **Branch**: refs/heads/main - **Updates**: - **Microsoft.DotNet.XHarness.iOS.Shared**: [from 10.0.0-prerelease.24509.1 to 10.0.0-prerelease.24511.1][1] [1]: https://github.com/dotnet/xharness/compare/973ef6c89b...8c6d5afd99 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9c0d8f07d2c4..a345502ac12f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -78,9 +78,9 @@ https://github.com/dotnet/templating - + https://github.com/dotnet/xharness - 973ef6c89b67f2f746f62c413e3aeeb01a9034a3 + 8c6d5afd99c713777165f4378462085a5679c223 diff --git a/eng/Versions.props b/eng/Versions.props index e186c008dee2..e56d65115684 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -12,7 +12,7 @@ 9.0.0-rc.2.24462.10 7.0.100-alpha.1.21601.1 0.11.5-alpha.24467.1 - 10.0.0-prerelease.24509.1 + 10.0.0-prerelease.24511.1 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) From 395aca6e74b75c295417bdc36e6839d89aa6aef7 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 15 Oct 2024 09:24:29 +0200 Subject: [PATCH 061/155] [compare-commits] Simplify comment about unclean working directory. (#21433) --- tools/compare-commits.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/compare-commits.sh b/tools/compare-commits.sh index ab9b7c6c337d..71b34510ba0c 100755 --- a/tools/compare-commits.sh +++ b/tools/compare-commits.sh @@ -221,10 +221,10 @@ mkdir -p "$(dirname "$GH_COMMENTS_FILE")" if test -z "$SKIP_DIRTY_CHECK"; then if [ -n "$(git status --porcelain --ignore-submodule)" ]; then - report_error_line "${RED}** Error: Working directory isn't clean:${CLEAR}" + report_error_line "${RED}** Error: Working directory isn't clean - check build log for more information.${CLEAR}" # The funny GIT_COLOR_P syntax is explained here: https://stackoverflow.com/a/61551944/183422 - git ${GIT_COLOR_P[@]+"${GIT_COLOR_P[@]}"} status --ignore-submodules | sed 's/^/ /' | while read -r line; do report_error_line "$line"; done || true - git ${GIT_COLOR_P[@]+"${GIT_COLOR_P[@]}"} diff --ignore-submodules | sed 's/^/ /' | while read -r line; do report_error_line "$line"; done || true + git ${GIT_COLOR_P[@]+"${GIT_COLOR_P[@]}"} status --ignore-submodules | sed 's/^/ /' || true + git ${GIT_COLOR_P[@]+"${GIT_COLOR_P[@]}"} diff --ignore-submodules | sed 's/^/ /' || true exit 1 fi fi From e63de079a67866121ad9464349d91a839573d357 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 15 Oct 2024 09:24:47 +0200 Subject: [PATCH 062/155] [tests] Remove dead code. (#21422) This logic was intented to zip up the .NET unit tests to run them on Windows, but in the end we went with a different approach that doesn't require zipping. --- tests/Makefile | 8 ------- tests/package-dotnet-tests.sh | 45 ----------------------------------- 2 files changed, 53 deletions(-) delete mode 100755 tests/package-dotnet-tests.sh diff --git a/tests/Makefile b/tests/Makefile index f13e4860ebe9..9f9a6d770f63 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -240,14 +240,6 @@ else @echo Not enabled endif -ifdef INCLUDE_DOTNET -dotnet-test-package.7z: - ./package-dotnet-tests.sh -else -dotnet-test-package.7z: - @echo Not enabled -endif - #XI ifdef INCLUDE_IOS wrench-mtouch: diff --git a/tests/package-dotnet-tests.sh b/tests/package-dotnet-tests.sh deleted file mode 100755 index b22146d9a783..000000000000 --- a/tests/package-dotnet-tests.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -ex - -cd "$(dirname "${BASH_SOURCE[0]}")" - -# Clone files instead of copying them on APFS file systems. Much faster. -CP="cp" -if df -t apfs / >/dev/null 2>&1; then - CP="cp -c" -fi - -#git clean -xfdq - -rm -Rf "$(pwd)/dotnet-test-package" -DIR=$(pwd)/dotnet-test-package/xamarin-macios -ZIP=$DIR.7z -mkdir -p $DIR -mkdir -p $DIR/tests/dotnet/UnitTests/bin/Debug/net5.0/ -mkdir -p $DIR/.git - -make -j8 -make -C dotnet/UnitTests publish - -$CP -r dotnet $DIR/tests/ -rm -Rf $DIR/tests/dotnet/packages - -# Various files to make 'make' work -$CP -p ../Make.config $DIR -$CP -p ../Make.versions $DIR -$CP -p ../Make.config $DIR -mkdir -p $DIR/mk -$CP -p ../Make.config $DIR -$CP -p ../mk/subdirs.mk $DIR/mk -$CP -p ../mk/rules.mk $DIR/mk -$CP -p ../mk/quiet.mk $DIR/mk -$CP -p ../mk/mono.mk "$DIR/mk" - -# Files to make the unit tests run -$CP -p ../global.json $DIR -$CP -p ../NuGet.config $DIR -$CP -p test.config $DIR/tests - -# Zip it all up -rm -f dotnet-test-package.7z -cd dotnet-test-package -7z a ../dotnet-test-package.7z * From a10899ef62a112e3b270078ea1b98dc3a1eb21be Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 15 Oct 2024 09:25:03 +0200 Subject: [PATCH 063/155] [tests] Improve failure message when a process times out. (#21429) --- tests/common/DotNet.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/common/DotNet.cs b/tests/common/DotNet.cs index 15be67b95b77..0f1f37d81b55 100644 --- a/tests/common/DotNet.cs +++ b/tests/common/DotNet.cs @@ -270,7 +270,11 @@ public static ExecutionResult Execute (string verb, string project, Dictionary Date: Tue, 15 Oct 2024 09:25:21 +0200 Subject: [PATCH 064/155] [tests] Ignore output that looks like errors when installing .NET on Windows. (#21430) Just trust the exit code instead. This way the installation doesn't fail due to random output. --- tests/dotnet/Windows/InstallDotNet.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/dotnet/Windows/InstallDotNet.csproj b/tests/dotnet/Windows/InstallDotNet.csproj index 2f208f0f270d..3fdd23ec26eb 100644 --- a/tests/dotnet/Windows/InstallDotNet.csproj +++ b/tests/dotnet/Windows/InstallDotNet.csproj @@ -171,6 +171,7 @@ Command=""$(DotNetToolPath)" workload install %(_WorkloadIds.Identity) --skip-manifest-update --verbosity diag --temp-dir "$(DotNetTempDirectory)" --configfile "$(MacIosRootDirectory)NuGet.config" --skip-sign-check" WorkingDirectory="$(MSBuildThisFileDirectory)" EnvironmentVariables="DOTNET_MULTILEVEL_LOOKUP=0" + IgnoreStandardErrorWarningFormat="true" /> From 209de6f29755c66a80ac3c01961b8f7390886e69 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 15 Oct 2024 09:25:44 +0200 Subject: [PATCH 065/155] [devops] Fix calling the show_bot_info.ps1 script. (#21428) --- tools/devops/automation/templates/windows/reserve-mac.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/devops/automation/templates/windows/reserve-mac.yml b/tools/devops/automation/templates/windows/reserve-mac.yml index 8298a73c0da2..83ab5a98fb4a 100644 --- a/tools/devops/automation/templates/windows/reserve-mac.yml +++ b/tools/devops/automation/templates/windows/reserve-mac.yml @@ -33,7 +33,7 @@ steps: - checkout: maccore persistCredentials: true # hugely important, else there are some scripts that check a single file from maccore that will fail -- pwsh: '"$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' +- pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' displayName: 'Show Bot Info' - bash: '$SYSTEM_DEFAULTWORKINGDIRECTORY/${BUILD_REPOSITORY_NAME/#*\//}/tools/devops/automation/scripts/bash/clean-bot.sh' From 6abfff689043beb50256e02ab832f7f42cb66f6b Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Tue, 15 Oct 2024 10:00:20 -0400 Subject: [PATCH 066/155] [CI] Remove the APIScan stage since we have a pipeline to run it. (#21432) In the process of ensuring that we can run tests a single time, we are removing all extra stages from the CI. We have move the APIScan to the following pipelines. - CI Pipeline: https://devdiv.visualstudio.com/DevDiv/_build?definitionId=24050 - PR Pipeline: https://devdiv.visualstudio.com/DevDiv/_build?definitionId=24049 --- tools/devops/automation/templates/main-stage.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tools/devops/automation/templates/main-stage.yml b/tools/devops/automation/templates/main-stage.yml index f8b10cb71838..9a53e3f0e5de 100644 --- a/tools/devops/automation/templates/main-stage.yml +++ b/tools/devops/automation/templates/main-stage.yml @@ -186,14 +186,6 @@ parameters: stages: - - ${{ if eq(parameters.runGovernanceTests, true) }}: - - template: ./governance/stage.yml - parameters: - isPR: ${{ parameters.isPR }} - repositoryAlias: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} - stageDisplayNamePrefix: ${{ parameters.stageDisplayNamePrefix }} - - stage: configure_build displayName: '${{ parameters.stageDisplayNamePrefix }}Configure' dependsOn: ${{ parameters.dependsOn }} From 0f35909d56ea0055457a89ba3879649d6d0d632c Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Tue, 15 Oct 2024 14:56:09 -0400 Subject: [PATCH 067/155] [RGen] First inclusion of a roslyn generator for the bindings. (#21389) We are doing the following: 1. Adding the rgen directory with the following solutions: * Analyzer: Analyzer that will catch errors in the bindings. At the moment it provides a single error when the BindingTypeAttribute is used in a nont partial type. * Analyzer Tests: Allows tests for the analyzer. * Analyzer Sample: Sample project to test the analyzer. * Code Generator: A code generator that adds the BindingTypeAttribute to the compilcation. * Code Generator Tests: Allows tests for the generator. * Code Sample: Sample project for the code generator. 2. Make rule to build the roslyn code generator. 3. Makefile changes to add the code generator as part as the second compilation of the bindings. This changes add the starting gounds to move to roslyn. --------- Co-authored-by: GitHub Actions Autoformatter Co-authored-by: Rolf Bjarne Kvinge Co-authored-by: Alex Soto --- docs/preview-apis.md | 7 + src/Makefile | 6 +- src/Makefile.rgenerator | 8 + src/ObjCBindings/BindingTypeAttribute.cs | 25 +++ src/frameworks.sources | 1 + .../Examples.cs | 12 ++ ...oft.Macios.Bindings.Analyzer.Sample.csproj | 19 ++ .../AnalyzerReleases.Shipped.md | 7 + .../AnalyzerReleases.Unshipped.md | 4 + .../BindingTypeCodeFixProvider.cs | 59 ++++++ .../BindingTypeSemanticAnalyzer.cs | 72 ++++++++ .../Microsoft.Macios.Bindings.Analyzer.csproj | 46 +++++ .../Properties/launchSettings.json | 9 + .../Readme.md | 26 +++ .../Resources.Designer.cs | 96 ++++++++++ .../Resources.resx | 37 ++++ .../Microsoft.Macios.Generator.Sample.csproj | 19 ++ .../SampleBinding.cs | 9 + .../BindingSourceGeneratorGenerator.cs | 24 +++ .../ExtraSources.cs | 5 + .../Microsoft.Macios.Generator.csproj | 26 +++ .../Properties/launchSettings.json | 9 + src/rgen/Microsoft.Macios.Generator/Readme.md | 21 +++ src/rgen/rgen.sln | 46 +++++ tests/bgen/bgen-tests.csproj | 3 + .../Documentation.KnownFailures.txt | 1 + tests/cecil-tests/cecil-tests.csproj | 3 + tests/common/Configuration.cs | 151 +-------------- tests/common/ConfigurationNUnit.cs | 172 ++++++++++++++++++ tests/common/ConfigurationXUnit.cs | 57 ++++++ tests/common/ExecutionHelper.cs | 4 - tests/common/mac/project_building.mk | 1 + tests/dotnet/UnitTests/DotNetUnitTests.csproj | 3 + tests/generator/generator-tests.csproj | 3 + tests/introspection/ApiFrameworkTest.cs | 3 + tests/mmptest/mmptest.csproj | 3 + .../dotnet/macOS/monotouch-test.csproj | 3 + .../Xamarin.MacDev.Tasks.Tests.csproj | 3 + .../Xamarin.MacDev.Tests.csproj | 3 + tests/mtouch/mtouchtests.csproj | 3 + .../BaseGeneratorWithAnalyzerTestClass.cs | 35 ++++ .../BindingTypeSemanticAnalyzerTests.cs | 36 ++++ ...soft.Macios.Bindings.Analyzer.Tests.csproj | 27 +++ .../BaseGeneratorTestClass.cs | 70 +++++++ .../BaseTestDataGenerator.cs | 13 ++ .../BindingSourceGeneratorGeneratorTests.cs | 44 +++++ .../Microsoft.Macios.Generator.Tests.csproj | 59 ++++++ tests/xammac_tests/xammac_tests.csproj | 3 + tests/xharness/Jenkins/Jenkins.cs | 36 ++++ 49 files changed, 1176 insertions(+), 156 deletions(-) create mode 100644 src/Makefile.rgenerator create mode 100644 src/ObjCBindings/BindingTypeAttribute.cs create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeCodeFixProvider.cs create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeSemanticAnalyzer.cs create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/Properties/launchSettings.json create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/Readme.md create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.Designer.cs create mode 100644 src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.resx create mode 100644 src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj create mode 100644 src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/ExtraSources.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj create mode 100644 src/rgen/Microsoft.Macios.Generator/Properties/launchSettings.json create mode 100644 src/rgen/Microsoft.Macios.Generator/Readme.md create mode 100644 src/rgen/rgen.sln create mode 100644 tests/common/ConfigurationNUnit.cs create mode 100644 tests/common/ConfigurationXUnit.cs create mode 100644 tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BaseGeneratorWithAnalyzerTestClass.cs create mode 100644 tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs create mode 100644 tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj create mode 100644 tests/rgen/Microsoft.Macios.Generator.Tests/BaseGeneratorTestClass.cs create mode 100644 tests/rgen/Microsoft.Macios.Generator.Tests/BaseTestDataGenerator.cs create mode 100644 tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs create mode 100644 tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj diff --git a/docs/preview-apis.md b/docs/preview-apis.md index e056d55a8bac..99f5b1d61049 100644 --- a/docs/preview-apis.md +++ b/docs/preview-apis.md @@ -97,3 +97,10 @@ We've tentatively set .NET 11 as the release when we'll stop marking FSKit as pr The diagnostic id for FSKit is APL0002. [1]: https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.experimentalattribute?view=net-8.0 + +## Rgen (APL0003) + +Rgen is the new Roslyn codegenerator based binding tool. The tool is underdevelopment and its API is open to change until +a stable release is announced. + +The diagnostic id for Rgen is APL0003. diff --git a/src/Makefile b/src/Makefile index ea2a4162dcb4..bb088101958c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -103,6 +103,7 @@ DOTNET_WARNINGS_TO_FIX = -nowarn:$(CSC_WARNINGS_TO_FIX) DOTNET_CORE_WARNINGS_TO_FIX = -nowarn:$(CSC_WARNINGS_TO_FIX),$(BGEN_WARNINGS_TO_FIX) include ./Makefile.generator +include ./Makefile.rgenerator include ./generator-diff.mk SHARED_RESX = $(TOP)/tools/mtouch/Errors.resx @@ -355,7 +356,7 @@ $($(2)_DOTNET_BUILD_DIR)/core-$(3).dll: $($(2)_DOTNET_CORE_SOURCES) frameworks.s $($(2)_DOTNET_BUILD_DIR)/$(3)-generated-sources: $(DOTNET_GENERATOR) $($(2)_DOTNET_APIS) $($(2)_DOTNET_BUILD_DIR)/core-$(3).dll $(DOTNET_BINDING_ATTRIBUTES) $($(2)_DOTNET_BUILD_DIR)/$(3).rsp | $($(2)_DOTNET_BUILD_DIR)/generated-sources $$(Q_DOTNET_GEN) $$< @$($(2)_DOTNET_BUILD_DIR)/$(3).rsp -$($(2)_DOTNET_BUILD_DIR)/$(3).rsp: Makefile Makefile.generator frameworks.sources $(DOTNET_COMPILER) | $($(2)_DOTNET_BUILD_DIR) +$($(2)_DOTNET_BUILD_DIR)/$(3).rsp: Makefile Makefile.generator Makefile.rgenerator frameworks.sources $(ROSLYN_GENERATOR) $(DOTNET_COMPILER) | $($(2)_DOTNET_BUILD_DIR) $(Q) echo \ $($(2)_GENERATOR_FLAGS) \ $(DOTNET_GENERATOR_FLAGS) \ @@ -450,10 +451,11 @@ $(2)_DOTNET_PLATFORM_ASSEMBLY_DIR_DEPENDENCIES = \ $($(2)_DOTNET_BUILD_DIR)/$(4) \ $($(2)_DOTNET_BUILD_DIR)/ref \ -$($(2)_DOTNET_BUILD_DIR)/$(4)/Microsoft.$(1)%dll $($(2)_DOTNET_BUILD_DIR)/$(4)/Microsoft.$(1)%pdb $$($(2)_$(4)_REF_TARGET) $$($(2)_$(4)_DOC_TARGET): $$($(2)_DOTNET_PLATFORM_ASSEMBLY_DEPENDENCIES) | $$($(2)_DOTNET_PLATFORM_ASSEMBLY_DIR_DEPENDENCIES) +$($(2)_DOTNET_BUILD_DIR)/$(4)/Microsoft.$(1)%dll $($(2)_DOTNET_BUILD_DIR)/$(4)/Microsoft.$(1)%pdb $$($(2)_$(4)_REF_TARGET) $$($(2)_$(4)_DOC_TARGET): $$($(2)_DOTNET_PLATFORM_ASSEMBLY_DEPENDENCIES) $$(ROSLYN_GENERATOR) | $$($(2)_DOTNET_PLATFORM_ASSEMBLY_DIR_DEPENDENCIES) $$(call Q_PROF_CSC,dotnet/$(4)-bit) \ $(DOTNET_CSC) \ $(DOTNET_FLAGS) \ + /analyzer:$(ROSLYN_GENERATOR) \ -unsafe \ -optimize \ $$(ARGS_$(1)) \ diff --git a/src/Makefile.rgenerator b/src/Makefile.rgenerator new file mode 100644 index 000000000000..e3bd9f2b997a --- /dev/null +++ b/src/Makefile.rgenerator @@ -0,0 +1,8 @@ +# Roslyn code generator +ROSLYN_GENERATOR=$(DOTNET_BUILD_DIR)/common/rgen/Microsoft.Macios.Generator.dll +ROSLYN_GENERATOR_FILES := $(wildcard rgen/Microsoft.Macios.Generator/*.cs) + +$(ROSLYN_GENERATOR): Makefile.rgenerator $(ROSLYN_GENERATOR_FILES) + $(Q_DOTNET_BUILD) $(DOTNET) publish rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj $(DOTNET_BUILD_VERBOSITY) /p:Configuration=Debug /p:IntermediateOutputPath=$(abspath $(DOTNET_BUILD_DIR)/IDE/obj/common/rgen)/ /p:OutputPath=$(abspath $(DOTNET_BUILD_DIR)/IDE/bin/common/rgen/)/ + @mkdir -p $(dir $@) + $(Q) $(CP) -r $(DOTNET_BUILD_DIR)/IDE/bin/common/rgen/publish/* $(dir $@) diff --git a/src/ObjCBindings/BindingTypeAttribute.cs b/src/ObjCBindings/BindingTypeAttribute.cs new file mode 100644 index 000000000000..6f936d77c69a --- /dev/null +++ b/src/ObjCBindings/BindingTypeAttribute.cs @@ -0,0 +1,25 @@ +using System; +using System.Reflection; +using System.Diagnostics.CodeAnalysis; + +namespace ObjCBindings { + + /// + /// Attribute that indicates that a class or enum is a binding type. This attribute is used by the binding generator + /// to generate all the necessary code for the binding. The attribute can be used in a class or enum and it is required. + /// + /// If the attribute is used in a class, the class must be partial otherwise the generator will fail. + /// + [Experimental ("APL0003")] + [AttributeUsage (AttributeTargets.Class | System.AttributeTargets.Enum, AllowMultiple = false)] + public class BindingTypeAttribute : Attribute { + + /// + /// Indicates the name of the binding type. This is the name that will be used by the registrar to make the + /// class available in the ObjC runtime. The default value is string.Empty, in that case the generator + /// will use the name of the C# class. + /// + public string Name { get; set; } = string.Empty; + } + +} diff --git a/src/frameworks.sources b/src/frameworks.sources index e129ca7cd91b..57094027d6fa 100644 --- a/src/frameworks.sources +++ b/src/frameworks.sources @@ -2012,6 +2012,7 @@ SHARED_CORE_SOURCES = \ DotNetGlobals.cs \ MinimumVersions.cs \ MonoPInvokeCallbackAttribute.cs \ + ObjCBindings/BindingTypeAttribute.cs \ ObjCRuntime/ArgumentSemantic.cs \ ObjCRuntime/BindAsAttribute.cs \ ObjCRuntime/Blocks.cs \ diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs new file mode 100644 index 000000000000..fe4905a77980 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs @@ -0,0 +1,12 @@ +namespace Microsoft.Macios.Bindings.Analyzer.Sample; + +// If you don't see warnings, build the Analyzers Project. + +[BindingType] +public class Examples { +} + +[BindingType] +public class Foo { + +} diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj new file mode 100644 index 000000000000..bc9520bfbacf --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj @@ -0,0 +1,19 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion) + enable + + + + + + + + + + external\Attributes.cs + + + + diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md new file mode 100644 index 000000000000..5a165075fbca --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md @@ -0,0 +1,7 @@ +## Release 1.0 + +### New Rules + +| Rule ID | Category | Severity | Notes | +|---------|----------|----------|------------------------------------------------------| +| RBI0001 | Usage | Error | Binding types should be declared as partial classes. | \ No newline at end of file diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md new file mode 100644 index 000000000000..44f7c8f4ef7c --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md @@ -0,0 +1,4 @@ +### New Rules + +| Rule ID | Category | Severity | Notes | +|---------|----------|----------|-------| \ No newline at end of file diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeCodeFixProvider.cs b/src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeCodeFixProvider.cs new file mode 100644 index 000000000000..17b8a2983607 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeCodeFixProvider.cs @@ -0,0 +1,59 @@ +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +using SyntaxFactory = Microsoft.CodeAnalysis.CSharp.SyntaxFactory; +using SyntaxKind = Microsoft.CodeAnalysis.CSharp.SyntaxKind; + +namespace Microsoft.Macios.Bindings.Analyzer; + +/// +/// Code fix provider that adds the 'partial' modifier to the class decorated with BindingTypeAttribute. +/// +[ExportCodeFixProvider (LanguageNames.CSharp, Name = nameof (BindingTypeCodeFixProvider)), Shared] +public class BindingTypeCodeFixProvider : CodeFixProvider { + // Specify the diagnostic IDs of analyzers that are expected to be linked. + public sealed override ImmutableArray FixableDiagnosticIds { get; } = + ImmutableArray.Create (BindingTypeSemanticAnalyzer.DiagnosticId); + + // If you don't need the 'fix all' behaviour, return null. + public override FixAllProvider? GetFixAllProvider () => null; + + public sealed override async Task RegisterCodeFixesAsync (CodeFixContext context) + { + var diagnostic = context.Diagnostics.Single (); + var diagnosticSpan = diagnostic.Location.SourceSpan; + var root = await context.Document.GetSyntaxRootAsync (context.CancellationToken).ConfigureAwait (false); + var diagnosticNode = root?.FindNode (diagnosticSpan); + + // To get the required metadata, we should match the Node to the specific type: 'ClassDeclarationSyntax'. + if (diagnosticNode is not ClassDeclarationSyntax declaration) + return; + + // Register a code action that will invoke the fix. + context.RegisterCodeFix ( + CodeAction.Create ( + title: Resources.RBI0001CodeFixTitle, + createChangedDocument: c => MakePartialClassAsync (context.Document, declaration, c), + equivalenceKey: nameof (Resources.RBI0001CodeFixTitle)), + diagnostic); + } + + async Task MakePartialClassAsync (Document document, + ClassDeclarationSyntax classDeclarationSyntax, CancellationToken cancellationToken) + { + var partialClass = classDeclarationSyntax.AddModifiers (SyntaxFactory.Token (SyntaxKind.PartialKeyword)); + var oldRoot = await document.GetSyntaxRootAsync (cancellationToken).ConfigureAwait (false); + if (oldRoot is null) + return document; + + var newRoot = oldRoot.ReplaceNode (classDeclarationSyntax, partialClass); + return document.WithSyntaxRoot (newRoot); + } +} diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeSemanticAnalyzer.cs b/src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeSemanticAnalyzer.cs new file mode 100644 index 000000000000..fd5df71a0e8b --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/BindingTypeSemanticAnalyzer.cs @@ -0,0 +1,72 @@ +using System.Collections.Immutable; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.Macios.Bindings.Analyzer; + +/// +/// Analyzer that ensures that the types that have been declared as binding types are partial and follow the correct +/// pattern. +/// +[DiagnosticAnalyzer (LanguageNames.CSharp)] +public class BindingTypeSemanticAnalyzer : DiagnosticAnalyzer { + internal const string DiagnosticId = "RBI0001"; + static readonly LocalizableString Title = new LocalizableResourceString (nameof (Resources.RBI0001Title), + Resources.ResourceManager, typeof (Resources)); + static readonly LocalizableString MessageFormat = + new LocalizableResourceString (nameof (Resources.RBI0001MessageFormat), Resources.ResourceManager, + typeof (Resources)); + static readonly LocalizableString Description = + new LocalizableResourceString (nameof (Resources.RBI0001Description), Resources.ResourceManager, + typeof (Resources)); + const string Category = "Usage"; + + static readonly DiagnosticDescriptor RBI0001 = new (DiagnosticId, Title, MessageFormat, Category, + DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description); + + public override ImmutableArray SupportedDiagnostics { get; } = + ImmutableArray.Create (RBI0001); + + public override void Initialize (AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis (GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution (); + context.RegisterSyntaxNodeAction (AnalysisContext, SyntaxKind.ClassDeclaration); + } + + void AnalysisContext (SyntaxNodeAnalysisContext context) + { + // only care about classes + if (context.Node is not ClassDeclarationSyntax classDeclarationNode) + return; + + var classSymbol = context.SemanticModel.GetDeclaredSymbol (classDeclarationNode); + if (classSymbol is null) + return; + + var boundAttributes = classSymbol.GetAttributes (); + if (boundAttributes.Length == 0) { + return; + } + + // the c# syntax is a a list of lists of attributes. That is why we need to iterate through the list of lists + foreach (var attributeData in boundAttributes) { + // based on the type use the correct parser to retrieve the data + var attributeType = attributeData.AttributeClass?.ToDisplayString (); + switch (attributeType) { + case "ObjCBindings.BindingTypeAttribute": + // validate that the class is partial, else we need to report an error + if (!classDeclarationNode.Modifiers.Any (x => x.IsKind (SyntaxKind.PartialKeyword))) { + var diagnostic = Diagnostic.Create (RBI0001, + classDeclarationNode.Identifier.GetLocation (), // point to where the 'class' keyword is used + classSymbol.ToDisplayString ()); + context.ReportDiagnostic (diagnostic); + } + break; + } + } + } +} diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj new file mode 100644 index 000000000000..6f9e0902e438 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj @@ -0,0 +1,46 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion) + false + enable + latest + + true + true + + Microsoft.Macios.Bindings.Analyzer + Microsoft.Macios.Bindings.Analyzer + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + <_Parameter1>Microsoft.Macios.Bindings.Analyzer.Tests + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + True + True + Resources.resx + + + + diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/Properties/launchSettings.json b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Properties/launchSettings.json new file mode 100644 index 000000000000..874ffd77b7e5 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "DebugRoslynAnalyzers": { + "commandName": "DebugRoslynComponent", + "targetProject": "../Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj" + } + } +} \ No newline at end of file diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/Readme.md b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Readme.md new file mode 100644 index 000000000000..d3a566c3c1cd --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Readme.md @@ -0,0 +1,26 @@ +# Roslyn Analyzers Sample + +Roslyn analyzer to be installed along side the Roslyn Conde generator that will help developers work on Microsoft.Macios bindings. + +## Content +### Microsoft.Macios.Bindings.Analyzer + +A .NET Standard project with implementations of sample analyzers and code fix providers. +**You must build this project to see the results (warnings) in the IDE.** + +### Microsoft.Macios.Bindings.Analyzer.Sample +A project that references the sample analyzers. Note the parameters of `ProjectReference` in [Microsoft.Macios.Bindings.Analyzer.Sample.csproj](../Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj), they make sure that the project is referenced as a set of analyzers. + +### Microsoft.Macios.Bindings.Analyzer.Tests +Unit tests for the sample analyzers and code fix provider. The easiest way to develop language-related features is to start with unit tests. + +## How To? +### How to debug? +- Use the [launchSettings.json](Properties/launchSettings.json) profile. +- Debug tests (in VSCode). + +### How can I determine which syntax nodes I should expect? +Consider installing the Roslyn syntax tree viewer plugin [Rossynt](https://plugins.jetbrains.com/plugin/16902-rossynt/). + +### Learn more about wiring analyzers +The complete set of information is available at [roslyn github repo wiki](https://github.com/dotnet/roslyn/blob/main/docs/wiki/README.md). \ No newline at end of file diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.Designer.cs b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.Designer.cs new file mode 100644 index 000000000000..bfe0d3152b0f --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.Designer.cs @@ -0,0 +1,96 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Macios.Bindings.Analyzer { + using System; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { + get { + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Microsoft.Macios.Bindings.Analyzer.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static string AB0001Description { + get { + return ResourceManager.GetString("AB0001Description", resourceCulture); + } + } + + internal static string AB0001MessageFormat { + get { + return ResourceManager.GetString("AB0001MessageFormat", resourceCulture); + } + } + + internal static string AB0001Title { + get { + return ResourceManager.GetString("AB0001Title", resourceCulture); + } + } + + internal static string RBI0001CodeFixTitle { + get { + return ResourceManager.GetString("RBI0001CodeFixTitle", resourceCulture); + } + } + + internal static string RBI0001Description { + get { + return ResourceManager.GetString("RBI0001Description", resourceCulture); + } + } + + internal static string RBI0001MessageFormat { + get { + return ResourceManager.GetString("RBI0001MessageFormat", resourceCulture); + } + } + + internal static string RBI0001Title { + get { + return ResourceManager.GetString("RBI0001Title", resourceCulture); + } + } + + internal static string AB0002Description { + get { + return ResourceManager.GetString("AB0002Description", resourceCulture); + } + } + } +} diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.resx b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.resx new file mode 100644 index 000000000000..2f228a310c3f --- /dev/null +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Resources.resx @@ -0,0 +1,37 @@ + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Make Binding Type class partial + The title of the code fix. + + + In order for the code to be generated all binding types have to be declared as partial classes. + An optional longer localizable description of the diagnostic. + + + The binding type '{0}' must declared as a partial class + The format-able message the diagnostic displays. + + + Binding type declaration must be partial + The title of the diagnostic. + + diff --git a/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj b/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj new file mode 100644 index 000000000000..f21144e77c4c --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj @@ -0,0 +1,19 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion) + enable + Microsoft.Macios.Generator.Sample + + + + + + + + + external\Attributes.cs + + + + diff --git a/src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs b/src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs new file mode 100644 index 000000000000..28d28329ae21 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs @@ -0,0 +1,9 @@ +namespace Microsoft.Macios.Generator.Sample; + +// This code will not compile until you build the project with the Source Generators + +[BindingType] +public partial class SampleBinding { + public int Id { get; } = 42; + public string? Name { get; } = "Sample"; +} diff --git a/src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs b/src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs new file mode 100644 index 000000000000..fcc630f160ce --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs @@ -0,0 +1,24 @@ +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.Macios.Generator; + +/// +/// A sample source generator that creates a custom report based on class properties. The target class should be annotated with the 'Generators.ReportAttribute' attribute. +/// When using the source code as a baseline, an incremental source generator is preferable because it reduces the performance overhead. +/// +[Generator] +public class BindingSourceGeneratorGenerator : IIncrementalGenerator { + + public void Initialize (IncrementalGeneratorInitializationContext context) + { + // Add the binding generator attributes to the compilation. This are only available when the + // generator is used, similar to how bgen works. + foreach ((string fileName, string content) in ExtraSources.Sources) { + context.RegisterPostInitializationOutput (ctx => ctx.AddSource ( + fileName, SourceText.From (content, Encoding.UTF8))); + } + } + +} diff --git a/src/rgen/Microsoft.Macios.Generator/ExtraSources.cs b/src/rgen/Microsoft.Macios.Generator/ExtraSources.cs new file mode 100644 index 000000000000..916949db8768 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/ExtraSources.cs @@ -0,0 +1,5 @@ +namespace Microsoft.Macios.Generator; + +public static class ExtraSources { + public static readonly (string FileName, string Content) [] Sources = new (string, string) [0]; +} diff --git a/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj b/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj new file mode 100644 index 000000000000..f9c73ed0396a --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj @@ -0,0 +1,26 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion) + false + enable + latest + + true + true + + Microsoft.Macios.Generator + Microsoft.Macios.Generator + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + diff --git a/src/rgen/Microsoft.Macios.Generator/Properties/launchSettings.json b/src/rgen/Microsoft.Macios.Generator/Properties/launchSettings.json new file mode 100644 index 000000000000..5687e6130138 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "DebugRoslynSourceGenerator": { + "commandName": "DebugRoslynComponent", + "targetProject": "../Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj" + } + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Readme.md b/src/rgen/Microsoft.Macios.Generator/Readme.md new file mode 100644 index 000000000000..8151de594361 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Readme.md @@ -0,0 +1,21 @@ +# Roslyn binding code generator + +This directory contains the code generator for binding code. The generator is the implementation of [RFC: Migrate bgen to use roslyn instead of the reflection API](https://github.com/xamarin/xamarin-macios/issues/21308) + +## Content + +### Microsoft.Macios.Generator +A .NET Standard project with implementations of sample source generators. + +**You must build this project to see the result (generated code) in the IDE.** + +### Microsoft.Macios.Generator.Sample +A project that references source generators. Note the parameters of `ProjectReference` in [Microsoft.Macios.Generator.Sample.csproj](../Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj), they make sure that the project is referenced as a set of source generators. + +### Microsoft.Macios.Generator.Tests +Unit tests for source generators. The easiest way to develop language-related features is to start with unit tests. + +## How To? +### How to debug? +- Use the [launchSettings.json](Properties/launchSettings.json) profile. +- Debug tests. \ No newline at end of file diff --git a/src/rgen/rgen.sln b/src/rgen/rgen.sln new file mode 100644 index 000000000000..684992039540 --- /dev/null +++ b/src/rgen/rgen.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Macios.Generator", "Microsoft.Macios.Generator\Microsoft.Macios.Generator.csproj", "{8E9CF45D-E836-447E-9290-03A9CACE2704}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Macios.Generator.Sample", "Microsoft.Macios.Generator.Sample\Microsoft.Macios.Generator.Sample.csproj", "{AD0A1FDC-350F-47E2-AA9D-A6F32793C130}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Macios.Bindings.Analyzer", "Microsoft.Macios.Bindings.Analyzer\Microsoft.Macios.Bindings.Analyzer.csproj", "{27A7CBB0-A30D-4A08-A475-6D2DFD94C634}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Macios.Bindings.Analyzer.Sample", "Microsoft.Macios.Bindings.Analyzer.Sample\Microsoft.Macios.Bindings.Analyzer.Sample.csproj", "{65649B5A-9C23-4AA8-A687-82319EF4FA7E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Macios.Generator.Tests", "..\..\tests\rgen\Microsoft.Macios.Generator.Tests\Microsoft.Macios.Generator.Tests.csproj", "{CD222ACD-A54F-49D9-81CA-6D795CC31195}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Macios.Bindings.Analyzer.Tests", "..\..\tests\rgen\Microsoft.Macios.Bindings.Analyzer.Tests\Microsoft.Macios.Bindings.Analyzer.Tests.csproj", "{1AC4A248-CC98-4392-8690-4E2CAF6E194B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8E9CF45D-E836-447E-9290-03A9CACE2704}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E9CF45D-E836-447E-9290-03A9CACE2704}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E9CF45D-E836-447E-9290-03A9CACE2704}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E9CF45D-E836-447E-9290-03A9CACE2704}.Release|Any CPU.Build.0 = Release|Any CPU + {AD0A1FDC-350F-47E2-AA9D-A6F32793C130}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD0A1FDC-350F-47E2-AA9D-A6F32793C130}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD0A1FDC-350F-47E2-AA9D-A6F32793C130}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD0A1FDC-350F-47E2-AA9D-A6F32793C130}.Release|Any CPU.Build.0 = Release|Any CPU + {27A7CBB0-A30D-4A08-A475-6D2DFD94C634}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27A7CBB0-A30D-4A08-A475-6D2DFD94C634}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27A7CBB0-A30D-4A08-A475-6D2DFD94C634}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27A7CBB0-A30D-4A08-A475-6D2DFD94C634}.Release|Any CPU.Build.0 = Release|Any CPU + {65649B5A-9C23-4AA8-A687-82319EF4FA7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65649B5A-9C23-4AA8-A687-82319EF4FA7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65649B5A-9C23-4AA8-A687-82319EF4FA7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65649B5A-9C23-4AA8-A687-82319EF4FA7E}.Release|Any CPU.Build.0 = Release|Any CPU + {CD222ACD-A54F-49D9-81CA-6D795CC31195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD222ACD-A54F-49D9-81CA-6D795CC31195}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD222ACD-A54F-49D9-81CA-6D795CC31195}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD222ACD-A54F-49D9-81CA-6D795CC31195}.Release|Any CPU.Build.0 = Release|Any CPU + {1AC4A248-CC98-4392-8690-4E2CAF6E194B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AC4A248-CC98-4392-8690-4E2CAF6E194B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AC4A248-CC98-4392-8690-4E2CAF6E194B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1AC4A248-CC98-4392-8690-4E2CAF6E194B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/tests/bgen/bgen-tests.csproj b/tests/bgen/bgen-tests.csproj index 6ee37f30a0a8..cef7c5856f16 100644 --- a/tests/bgen/bgen-tests.csproj +++ b/tests/bgen/bgen-tests.csproj @@ -48,6 +48,9 @@ Configuration.cs + + ConfigurationNUnit.cs + ExecutionHelper.cs diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 3e025923b416..4389dfbe71ce 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -44896,6 +44896,7 @@ M:NotificationCenter.NSExtensionContext_NCWidgetAdditions.GetWidgetMaximumSize(F M:NotificationCenter.NSExtensionContext_NCWidgetAdditions.SetWidgetLargestAvailableDisplayMode(Foundation.NSExtensionContext,NotificationCenter.NCWidgetDisplayMode) M:NotificationCenter.NSWidgetSearchForTermEventArgs.#ctor(System.String,System.UIntPtr) M:NotificationCenter.NSWidgetSearchResultSelectedEventArgs.#ctor(Foundation.NSObject) +M:ObjCBindings.BindingTypeAttribute.#ctor M:ObjCRuntime.AdoptsAttribute.#ctor(System.String) M:ObjCRuntime.AssemblyRegistrationEventArgs.#ctor M:ObjCRuntime.BaseWrapper.#ctor(ObjCRuntime.NativeHandle,System.Boolean) diff --git a/tests/cecil-tests/cecil-tests.csproj b/tests/cecil-tests/cecil-tests.csproj index 50d9f62c8f53..eac1c64fe7d1 100644 --- a/tests/cecil-tests/cecil-tests.csproj +++ b/tests/cecil-tests/cecil-tests.csproj @@ -19,6 +19,9 @@ Configuration.cs + + ConfigurationNUnit.cs + Profile.cs diff --git a/tests/common/Configuration.cs b/tests/common/Configuration.cs index 5fdbd955485d..2d2935ef367d 100644 --- a/tests/common/Configuration.cs +++ b/tests/common/Configuration.cs @@ -7,8 +7,6 @@ using System.Text; using System.Threading; -using NUnit.Framework; - using Xamarin.Utils; #nullable disable // until we get around to fixing this file @@ -384,12 +382,6 @@ public static bool TryGetRootPath (out string rootPath) } } - static string TestAssemblyDirectory { - get { - return TestContext.CurrentContext.WorkDirectory; - } - } - public static string SourceRoot { get { if (mt_src_root is null) @@ -682,25 +674,6 @@ public static string MlaunchPath { } #if !XAMMAC_TESTS - public static void AssertRuntimeIdentifierAvailable (ApplePlatform platform, string runtimeIdentifier) - { - if (string.IsNullOrEmpty (runtimeIdentifier)) - return; - - if (GetRuntimeIdentifiers (platform).Contains (runtimeIdentifier)) - return; - - Assert.Ignore ($"The runtime identifier {runtimeIdentifier} is not available on {platform}"); - } - - public static void AssertRuntimeIdentifiersAvailable (ApplePlatform platform, string runtimeIdentifiers) - { - if (string.IsNullOrEmpty (runtimeIdentifiers)) - return; - - foreach (var rid in runtimeIdentifiers.Split (new char [] { ';' }, StringSplitOptions.RemoveEmptyEntries)) - AssertRuntimeIdentifierAvailable (platform, rid); - } public static string GetBaseLibrary (Profile profile) { @@ -913,12 +886,6 @@ public static string GetCompiler (Profile profile, IList args) return "/Library/Frameworks/Mono.framework/Commands/csc"; } - public static void AssertiOS32BitAvailable () - { - if (iOSSupports32BitArchitectures) - return; - Assert.Ignore ($"32-bit iOS support is not available in the current build."); - } #endif // !XAMMAC_TESTS public static IEnumerable GetIncludedPlatforms (bool dotnet) @@ -959,27 +926,6 @@ public static string XIBuildPath { get { return Path.GetFullPath (Path.Combine (RootPath, "tools", "xibuild", "xibuild")); } } - public static void AssertDeviceAvailable () - { - if (include_device) - return; - Assert.Ignore ("This build does not include device support."); - } - - public static void AssertDotNetAvailable () - { - if (include_dotnet) - return; - Assert.Ignore (".NET tests not enabled"); - } - - public static void AssertLegacyXamarinAvailable () - { - if (include_legacy_xamarin) - return; - Assert.Ignore ("Legacy xamarin build not enabled"); - } - public static string CloneTestDirectory (string directory) { // Copy the test projects to a temporary directory so that we can run the tests from there without affecting the working directory. @@ -1072,102 +1018,6 @@ public static void SetBuildVariables (ApplePlatform platform, ref Dictionary notIncluded) - { - var allPlatforms = GetAllPlatforms (dotnet); - var includedPlatforms = GetIncludedPlatforms (dotnet); - notIncluded = allPlatforms.Where (v => !includedPlatforms.Contains (v)).ToArray (); - return notIncluded.Any (); - } - - public static void IgnoreIfAnyIgnoredPlatforms (bool dotnet = true) - { - if (AnyIgnoredPlatforms (dotnet, out var notIncluded)) - Assert.Ignore ($"This test requires all platforms to be included, but the following platforms aren't included: {string.Join (", ", notIncluded.Select (v => v.AsString ()))}"); - } - - public static void IgnoreIfNotOnMacOS () - { - IgnoreIfNotOn (System.Runtime.InteropServices.OSPlatform.OSX); - } - - public static void IgnoreIfNotOnWindows () - { - IgnoreIfNotOn (System.Runtime.InteropServices.OSPlatform.Windows); - } - - public static void IgnoreIfNotOn (System.Runtime.InteropServices.OSPlatform platform) - { - if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform (platform)) - return; - Assert.Ignore ($"This test is only applicable on {platform}"); - } - - public static void IgnoreIfNotXamarinEnabled () - { - if (EnableXamarin) - return; - Assert.Ignore ($"This test is only applicable if Xamarin-specific bits are enabled."); - } - public static string GetTestLibraryDirectory (ApplePlatform platform, bool? simulator = null) { string dir; @@ -1278,3 +1128,4 @@ public static IEnumerable GetUndefinedNativeSymbols (string file, string } } } + diff --git a/tests/common/ConfigurationNUnit.cs b/tests/common/ConfigurationNUnit.cs new file mode 100644 index 000000000000..9e1531be0c84 --- /dev/null +++ b/tests/common/ConfigurationNUnit.cs @@ -0,0 +1,172 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +using NUnit.Framework; + +using Xamarin.Utils; + +#nullable disable // until we get around to fixing this file + +namespace Xamarin.Tests { + static partial class Configuration { + + static string TestAssemblyDirectory { + get { + return TestContext.CurrentContext.WorkDirectory; + } + } + +#if !XAMMAC_TESTS + public static void AssertRuntimeIdentifierAvailable (ApplePlatform platform, string runtimeIdentifier) + { + if (string.IsNullOrEmpty (runtimeIdentifier)) + return; + + if (GetRuntimeIdentifiers (platform).Contains (runtimeIdentifier)) + return; + + Assert.Ignore ($"The runtime identifier {runtimeIdentifier} is not available on {platform}"); + } + + public static void AssertRuntimeIdentifiersAvailable (ApplePlatform platform, string runtimeIdentifiers) + { + if (string.IsNullOrEmpty (runtimeIdentifiers)) + return; + + foreach (var rid in runtimeIdentifiers.Split (new char [] { ';' }, StringSplitOptions.RemoveEmptyEntries)) + AssertRuntimeIdentifierAvailable (platform, rid); + } + + public static void AssertiOS32BitAvailable () + { + if (iOSSupports32BitArchitectures) + return; + Assert.Ignore ($"32-bit iOS support is not available in the current build."); + } +#endif // !XAMMAC_TESTS + + public static void AssertDeviceAvailable () + { + if (include_device) + return; + Assert.Ignore ("This build does not include device support."); + } + + public static void AssertDotNetAvailable () + { + if (include_dotnet) + return; + Assert.Ignore (".NET tests not enabled"); + } + + public static void AssertLegacyXamarinAvailable () + { + if (include_legacy_xamarin) + return; + Assert.Ignore ("Legacy xamarin build not enabled"); + } + + // Calls Assert.Ignore if the given platform isn't included in the current build. + public static void IgnoreIfIgnoredPlatform (ApplePlatform platform) + { + switch (platform) { + case ApplePlatform.iOS: + if (!include_ios) + Assert.Ignore ("iOS is not included in this build"); + break; + case ApplePlatform.TVOS: + if (!include_tvos) + Assert.Ignore ("tvOS is not included in this build"); + break; + case ApplePlatform.WatchOS: + if (!include_watchos) + Assert.Ignore ("watchOS is not included in this build"); +#if NET + if (!include_dotnet_watchos) + Assert.Ignore ("watchOS is not included in this build"); +#endif + + break; + case ApplePlatform.MacOSX: + if (!include_mac) + Assert.Ignore ("macOS is not included in this build"); + break; + case ApplePlatform.MacCatalyst: + if (!include_maccatalyst) + Assert.Ignore ("Mac Catalyst is not included in this build"); + break; + default: + throw new ArgumentOutOfRangeException ($"Unknown platform: {platform}"); + } + } + + // Calls Assert.Ignore if the given platform isn't included in the current build. + public static void IgnoreIfIgnoredPlatform (string platform) + { + switch (platform.ToLower ()) { + case "ios": + case "tvos": + case "watchos": + case "macosx": + case "maccatalyst": + IgnoreIfIgnoredPlatform ((ApplePlatform) Enum.Parse (typeof (ApplePlatform), platform, true)); + break; + case "macos": + IgnoreIfIgnoredPlatform (ApplePlatform.MacOSX); + break; + default: + throw new ArgumentOutOfRangeException ($"Unknown platform: {platform}"); + } + } + + public static bool AnyIgnoredPlatforms (bool dotnet = true) + { + return AnyIgnoredPlatforms (dotnet, out var _); + } + + public static bool AnyIgnoredPlatforms (bool dotnet, out IEnumerable notIncluded) + { + var allPlatforms = GetAllPlatforms (dotnet); + var includedPlatforms = GetIncludedPlatforms (dotnet); + notIncluded = allPlatforms.Where (v => !includedPlatforms.Contains (v)).ToArray (); + return notIncluded.Any (); + } + + public static void IgnoreIfAnyIgnoredPlatforms (bool dotnet = true) + { + if (AnyIgnoredPlatforms (dotnet, out var notIncluded)) + Assert.Ignore ($"This test requires all platforms to be included, but the following platforms aren't included: {string.Join (", ", notIncluded.Select (v => v.AsString ()))}"); + } + + public static void IgnoreIfNotOnMacOS () + { + IgnoreIfNotOn (System.Runtime.InteropServices.OSPlatform.OSX); + } + + public static void IgnoreIfNotOnWindows () + { + IgnoreIfNotOn (System.Runtime.InteropServices.OSPlatform.Windows); + } + + public static void IgnoreIfNotOn (System.Runtime.InteropServices.OSPlatform platform) + { + if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform (platform)) + return; + Assert.Ignore ($"This test is only applicable on {platform}"); + } + + public static void IgnoreIfNotXamarinEnabled () + { + if (EnableXamarin) + return; + Assert.Ignore ($"This test is only applicable if Xamarin-specific bits are enabled."); + } + + } +} diff --git a/tests/common/ConfigurationXUnit.cs b/tests/common/ConfigurationXUnit.cs new file mode 100644 index 000000000000..d1555af04e69 --- /dev/null +++ b/tests/common/ConfigurationXUnit.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Xamarin.Utils; +using Xunit.Sdk; + +namespace Xamarin.Tests { + + [AttributeUsage (AttributeTargets.Method, AllowMultiple = true, Inherited = true)] + public sealed class PlatformInlineDataAttribute : DataAttribute { + readonly object [] dataValues; + public PlatformInlineDataAttribute (ApplePlatform platform, params object [] parameters) + { + // data values are the join of the platform and all other values passed to the attr + dataValues = parameters.Prepend (platform).ToArray (); + // based on the passed platform and the configuration, decide if we skip the test + switch (platform) { + case ApplePlatform.iOS: + if (!Configuration.include_ios) + Skip = "iOS is not included in this build"; + break; + case ApplePlatform.TVOS: + if (!Configuration.include_tvos) + Skip = "tvOS is not included in this build"; + break; + case ApplePlatform.MacOSX: + if (!Configuration.include_mac) + Skip = "macOS is not included in this build"; + break; + case ApplePlatform.MacCatalyst: + if (!Configuration.include_maccatalyst) + Skip = "Mac Catalyst is not included in this build"; + break; + default: + throw new ArgumentOutOfRangeException ($"Unknown platform: {platform}"); + } + } + + public object [] DataValues { + get { return dataValues; } + } + + public override IEnumerable GetData (MethodInfo testMethod) + { + yield return dataValues; + } + } + + public partial class Configuration { + static string TestAssemblyDirectory { + get { + return Assembly.GetExecutingAssembly ().Location; + } + } + } +} diff --git a/tests/common/ExecutionHelper.cs b/tests/common/ExecutionHelper.cs index 00ee9a318b8f..d0315a82d777 100644 --- a/tests/common/ExecutionHelper.cs +++ b/tests/common/ExecutionHelper.cs @@ -1,11 +1,7 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text; -using System.Text.RegularExpressions; - -using NUnit.Framework; using Xamarin.Utils; #nullable disable // until we get around to fixing this file diff --git a/tests/common/mac/project_building.mk b/tests/common/mac/project_building.mk index 628abba9e3d8..da612f0741d3 100644 --- a/tests/common/mac/project_building.mk +++ b/tests/common/mac/project_building.mk @@ -1,5 +1,6 @@ SOURCES = $(TEST_SRC) \ $(TOP)/tests/common/Configuration.cs \ + $(TOP)/tests/common/ConfigurationNUnit.cs \ $(TOP)/tests/common/mac/ProjectTestHelpers.cs \ $(TOP)/tools/common/Driver.cs \ $(TOP)/tools/common/TargetFramework.cs \ diff --git a/tests/dotnet/UnitTests/DotNetUnitTests.csproj b/tests/dotnet/UnitTests/DotNetUnitTests.csproj index 6115afb46443..e56cc641adaa 100644 --- a/tests/dotnet/UnitTests/DotNetUnitTests.csproj +++ b/tests/dotnet/UnitTests/DotNetUnitTests.csproj @@ -20,6 +20,9 @@ external\Configuration.cs + + external\ConfigurationNUnit.cs + external\DotNet.cs diff --git a/tests/generator/generator-tests.csproj b/tests/generator/generator-tests.csproj index 4b177794bf2b..0a39b4fab9c5 100644 --- a/tests/generator/generator-tests.csproj +++ b/tests/generator/generator-tests.csproj @@ -55,6 +55,9 @@ Configuration.cs + + ConfigurationNUnit.cs + Cache.cs diff --git a/tests/introspection/ApiFrameworkTest.cs b/tests/introspection/ApiFrameworkTest.cs index f95e01192736..96e0ef866bf7 100644 --- a/tests/introspection/ApiFrameworkTest.cs +++ b/tests/introspection/ApiFrameworkTest.cs @@ -43,6 +43,9 @@ public bool Skip (string @namespace) // not a framework, largely p/invokes to /usr/lib/libobjc.dylib case "ObjCRuntime": return true; + // no a framework, namespace for the binding attrs for rgen + case "ObjCBindings": + return true; // pinvokes into OpenGL[ES] case "OpenTK": return true; diff --git a/tests/mmptest/mmptest.csproj b/tests/mmptest/mmptest.csproj index a8ae33a8f6ae..addb3187d5b4 100644 --- a/tests/mmptest/mmptest.csproj +++ b/tests/mmptest/mmptest.csproj @@ -57,6 +57,9 @@ Configuration.cs + + ConfigurationNUnit.cs + ErrorHelper.cs diff --git a/tests/monotouch-test/dotnet/macOS/monotouch-test.csproj b/tests/monotouch-test/dotnet/macOS/monotouch-test.csproj index 2636ce5187f9..71ad519b8fb2 100644 --- a/tests/monotouch-test/dotnet/macOS/monotouch-test.csproj +++ b/tests/monotouch-test/dotnet/macOS/monotouch-test.csproj @@ -12,6 +12,9 @@ Configuration.cs + + ConfigurationNUnit.cs + ExecutionHelper.cs diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj index 23074d2e2d40..33fb783ef82f 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj @@ -52,6 +52,9 @@ external\Configuration.cs + + external\ConfigurationNUnit.cs + external\DotNet.cs diff --git a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj index 771e95f8bcb2..2e130dd64d2a 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj @@ -26,6 +26,9 @@ external\Configuration.cs + + external\ConfigurationNUnit.cs + external\ApplePlatform.cs diff --git a/tests/mtouch/mtouchtests.csproj b/tests/mtouch/mtouchtests.csproj index c207827fbe0b..be319512d85d 100644 --- a/tests/mtouch/mtouchtests.csproj +++ b/tests/mtouch/mtouchtests.csproj @@ -44,6 +44,9 @@ Configuration.cs + + ConfigurationNUnit.cs + diff --git a/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BaseGeneratorWithAnalyzerTestClass.cs b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BaseGeneratorWithAnalyzerTestClass.cs new file mode 100644 index 000000000000..e3df3d973dda --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BaseGeneratorWithAnalyzerTestClass.cs @@ -0,0 +1,35 @@ +using System.Collections.Immutable; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.Macios.Generator.Tests; +using Xunit; + +namespace Microsoft.Macios.Bindings.Analyzer.Tests; + +public class BaseGeneratorWithAnalyzerTestClass : BaseGeneratorTestClass { + + protected Task> RunAnalyzer (T analyzer, Compilation compilation) + where T : DiagnosticAnalyzer + { + var compilationWithAnalyzers = + // run generators on the compilation + RunGeneratorsAndUpdateCompilation (compilation, out _) + // attach analyzers + .WithAnalyzers (ImmutableArray.Create (analyzer)); + return compilationWithAnalyzers.GetAllDiagnosticsAsync (); + } + + protected static void VerifyDiagnosticMessage (Diagnostic diagnostic, string diagnosticId, + DiagnosticSeverity severity, string message) + { + Assert.Equal (diagnosticId, diagnostic.Id); + Assert.Equal (severity, diagnostic.Severity); + Assert.Equal (message, diagnostic.GetMessage ()); + } + protected static void VerifyDiagnosticMessage (Diagnostic diagnostic, string diagnosticId, string message) + { + Assert.Equal (diagnosticId, diagnostic.Id); + Assert.Equal (message, diagnostic.GetMessage ()); + } +} diff --git a/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs new file mode 100644 index 000000000000..48cba5be3fbd --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Xamarin.Tests; +using Xamarin.Utils; +using Xunit; + +namespace Microsoft.Macios.Bindings.Analyzer.Tests; + +public class BindingTypeSemanticAnalyzerTests : BaseGeneratorWithAnalyzerTestClass { + + [Theory] + [PlatformInlineData (ApplePlatform.iOS)] + [PlatformInlineData (ApplePlatform.TVOS)] + [PlatformInlineData (ApplePlatform.MacOSX)] + [PlatformInlineData (ApplePlatform.MacCatalyst)] + public async Task BindingTypeMustBePartial (ApplePlatform platform) + { + const string inputText = @" +using ObjCBindings; + +namespace Test { + [BindingType] + public class Examples { + } +} +"; + + var compilation = CreateCompilation (nameof (CompareGeneratedCode), platform, inputText); + var diagnostics = await RunAnalyzer (new BindingTypeSemanticAnalyzer (), compilation); + Assert.Single (diagnostics); + // verify the diagnostic message + var location = diagnostics [0].Location; + VerifyDiagnosticMessage (diagnostics [0], BindingTypeSemanticAnalyzer.DiagnosticId, + DiagnosticSeverity.Error, "The binding type 'Test.Examples' must declared as a partial class"); + } +} diff --git a/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj new file mode 100644 index 000000000000..f508fcca942a --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj @@ -0,0 +1,27 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion) + enable + + false + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/BaseGeneratorTestClass.cs b/tests/rgen/Microsoft.Macios.Generator.Tests/BaseGeneratorTestClass.cs new file mode 100644 index 000000000000..1ed459e25ccc --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/BaseGeneratorTestClass.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Xamarin.Tests; +using Xamarin.Utils; +using Xunit; + +namespace Microsoft.Macios.Generator.Tests; + +/// +/// Base class that allows to test the generator. +/// +public class BaseGeneratorTestClass { + protected BindingSourceGeneratorGenerator GeneratorGenerator; + protected CSharpGeneratorDriver _driver; + + public BaseGeneratorTestClass () + { + GeneratorGenerator = new BindingSourceGeneratorGenerator (); + _driver = CSharpGeneratorDriver.Create (GeneratorGenerator); + } + + protected Compilation RunGeneratorsAndUpdateCompilation (Compilation compilation, out ImmutableArray diagnostics) + { + _driver.RunGeneratorsAndUpdateCompilation (compilation, out var updatedCompilation, out diagnostics); + return updatedCompilation; + } + + protected GeneratorDriverRunResult RunGenerators (Compilation compilation) + => _driver.RunGenerators (compilation).GetRunResult (); + + protected Compilation CreateCompilation (string name, ApplePlatform platform, params string [] sources) + { + // get the dotnet bcl and fully load it for the test. + var references = Directory.GetFiles (Configuration.DotNetBclDir, "*.dll") + .Select (assembly => MetadataReference.CreateFromFile (assembly)).ToList (); + // get the dll for the current platform + var targetFramework = TargetFramework.GetTargetFramework (platform, isDotNet: true); + var platformDll = Configuration.GetBaseLibrary (targetFramework); + if (!string.IsNullOrEmpty (platformDll)) { + references.Add (MetadataReference.CreateFromFile (platformDll)); + } else { + throw new InvalidOperationException ($"Could not find platform dll for {platform}"); + } + var trees = sources.Select (s => CSharpSyntaxTree.ParseText (s)); + var options = new CSharpCompilationOptions (OutputKind.NetModule); + return CSharpCompilation.Create (name, trees, references, options); + } + + protected void CompareGeneratedCode (ApplePlatform platform, string className, string inputFileName, string inputText, string outputFileName, string expectedOutputText) + { + // We need to create a compilation with the required source code. + var compilation = CreateCompilation (nameof (CompareGeneratedCode), platform, inputText); + + // Run generators and retrieve all results. + var runResult = RunGenerators (compilation); + + // All generated files can be found in 'RunResults.GeneratedTrees'. + var generatedFileSyntax = runResult.GeneratedTrees.Single (t => t.FilePath.EndsWith ($"{className}.g.cs")); + + // Complex generators should be tested using text comparison. + Assert.Equal (expectedOutputText, generatedFileSyntax.GetText ().ToString (), + ignoreLineEndingDifferences: true); + + } +} diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/BaseTestDataGenerator.cs b/tests/rgen/Microsoft.Macios.Generator.Tests/BaseTestDataGenerator.cs new file mode 100644 index 000000000000..b587edeceac1 --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/BaseTestDataGenerator.cs @@ -0,0 +1,13 @@ +using System.IO; +using System.Runtime.CompilerServices; + +namespace Microsoft.Macios.Generator.Tests; + +public class BaseTestDataGenerator { + public static string ReadFileAsString (string file, [CallerFilePath] string filePath = "") + { + var directoryPath = Path.GetDirectoryName (filePath); + var fullPath = Path.Join (directoryPath, "Data", file); + return File.ReadAllText (fullPath); + } +} diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs b/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs new file mode 100644 index 000000000000..a101ccbbd214 --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs @@ -0,0 +1,44 @@ +using System.Linq; +using Microsoft.CodeAnalysis.CSharp; +using Xamarin.Tests; +using Xamarin.Utils; +using Xunit; + +namespace Microsoft.Macios.Generator.Tests; + +// Unit test that ensures that all the generator attributes are correctly added in the compilation initialization +public class BindingSourceGeneratorGeneratorTests : BaseGeneratorTestClass { + + const string SampleBindingType = @" +namespace TestNamespace; + +[BindingType (Name = ""AVAudioPCMBuffer"")] +interface AVAudioPcmBuffer : AVAudioBuffer { +} +"; + + [Theory] + [PlatformInlineData (ApplePlatform.iOS)] + [PlatformInlineData (ApplePlatform.TVOS)] + [PlatformInlineData (ApplePlatform.MacOSX)] + [PlatformInlineData (ApplePlatform.MacCatalyst)] + public void AttributesAreNotPresent (ApplePlatform platform) + { + // We need to create a compilation with the required source code. + var compilation = CreateCompilation (nameof (AttributesAreNotPresent), + platform, SampleBindingType); + + // Run generators and retrieve all results. + var runResult = _driver.RunGenerators (compilation).GetRunResult (); + + // ensure that we do have all the needed attributes present + var expectedGeneratedAttributes = new [] { + "BindingTypeAttribute.g.cs", + }; + + foreach (string generatedAttribute in expectedGeneratedAttributes) { + var generatedFile = runResult.GeneratedTrees.SingleOrDefault (t => t.FilePath.EndsWith (generatedAttribute)); + Assert.Null (generatedFile); + } + } +} diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj b/tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj new file mode 100644 index 000000000000..417b2c63d198 --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj @@ -0,0 +1,59 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion) + enable + + false + + Microsoft.Macios.Generator.Tests + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + external\Configuration.cs + + + external\ConfigurationXUnit.cs + + + external\Profile.cs + + + external\ExecutionHelper.cs + + + external\ApplePlatform.cs + + + external\TargetFramework.cs + + + external\StringUtils.cs + + + external\Execution.cs + + + external\SdkVersions.cs + + + external\Cache.cs + + + + diff --git a/tests/xammac_tests/xammac_tests.csproj b/tests/xammac_tests/xammac_tests.csproj index 76d9f3409811..73d0756eef6c 100644 --- a/tests/xammac_tests/xammac_tests.csproj +++ b/tests/xammac_tests/xammac_tests.csproj @@ -75,6 +75,9 @@ Configuration.cs + + ConfigurationNUnit.cs + PlatformInfo.cs diff --git a/tests/xharness/Jenkins/Jenkins.cs b/tests/xharness/Jenkins/Jenkins.cs index 1cbb0b369728..ae7da1490ad9 100644 --- a/tests/xharness/Jenkins/Jenkins.cs +++ b/tests/xharness/Jenkins/Jenkins.cs @@ -193,6 +193,42 @@ Task PopulateTasksAsync () }; Tasks.Add (runDotNetGenerator); + var buildDotNetRoslynGeneratorProject = new TestProject (TestLabel.Generator, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "rgen", "Microsoft.Macios.Generator.Tests", "Microsoft.Macios.Generator.Tests.csproj"))) { + IsDotNetProject = true, + }; + var buildDotNetRoslynGenerator = new MSBuildTask (jenkins: this, testProject: buildDotNetRoslynGeneratorProject, processManager: processManager) { + TestProject = buildDotNetRoslynGeneratorProject, + SpecifyPlatform = false, + SpecifyConfiguration = false, + Platform = TestPlatform.iOS, + }; + var runDotNetRoslynGenerator = new DotNetTestTask (this, buildDotNetRoslynGenerator, processManager) { + TestProject = buildDotNetRoslynGeneratorProject, + Platform = TestPlatform.iOS, + TestName = "Roslyn Generator tests", + Mode = ".NET", + Ignored = !TestSelection.IsEnabled (TestLabel.Generator) || !TestSelection.IsEnabled (PlatformLabel.Dotnet), + }; + Tasks.Add (runDotNetRoslynGenerator); + + var buildDotNetRoslynAnalyzerProject = new TestProject (TestLabel.Generator, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "rgen", "Microsoft.Macios.Bindings.Analyzer.Tests", "Microsoft.Macios.Bindings.Analyzer.Tests.csproj"))) { + IsDotNetProject = true, + }; + var buildDotNetRoslynAnalyzer = new MSBuildTask (jenkins: this, testProject: buildDotNetRoslynAnalyzerProject, processManager: processManager) { + TestProject = buildDotNetRoslynAnalyzerProject, + SpecifyPlatform = false, + SpecifyConfiguration = false, + Platform = TestPlatform.iOS, + }; + var runDotNetRoslynAnalyzer = new DotNetTestTask (this, buildDotNetRoslynAnalyzer, processManager) { + TestProject = buildDotNetRoslynAnalyzerProject, + Platform = TestPlatform.iOS, + TestName = "Roslyn Analyzer tests", + Mode = ".NET", + Ignored = !TestSelection.IsEnabled (TestLabel.Generator) || !TestSelection.IsEnabled (PlatformLabel.Dotnet), + }; + Tasks.Add (runDotNetRoslynAnalyzer); + var buildDotNetTestsProject = new TestProject (TestLabel.DotnetTest, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "dotnet", "UnitTests", "DotNetUnitTests.csproj"))) { IsDotNetProject = true, }; From 15348e0ff3bf45234894a770b68936b8940b4144 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 11:01:22 +0200 Subject: [PATCH 068/155] [msbuild] Make sure the build doesn't keep going if the ILLink task fails. (#21393) Here's an example failure that didn't stop the build: Target Name=_RunILLink Project=sampleproj.csproj Building target "_RunILLink" completely. Output file "obj\Release\net8.0-ios\ios-arm64\linked\Link.semaphore" does not exist. [...] Xamarin.MacDev.Tasks.ILLink [...] C:\Program Files\dotnet\packs\Microsoft.iOS.Windows.Sdk.net8.0_17.5\17.5.8030\tools\msbuild\iOS\Xamarin.iOS.Common.After.targets(364,3): [xma][err]: An exception occurred in the task 'ILLink' C:\Program Files\dotnet\packs\Microsoft.iOS.Windows.Sdk.net8.0_17.5\17.5.8030\tools\msbuild\iOS\Xamarin.iOS.Common.After.targets(364,3): The post for client build1460814608Ilian on topic xvs/build/1.14.0.6/execute-task/ecacau/de6ed16002fILLink has been cancelled at Xamarin.Messaging.Client.MessagingClient.PostAsync[TRequest,TResponse](TRequest message, String topic, MessagePriority priority, CancellationToken cancellationToken, Boolean retain, Int32 timeoutSecs) in D:\a\_work\1\s\src\Xamarin.Messaging.Client\MessagingClient.cs:line 231 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ExecuteWithRetryAsync[TResult](Func`1 executeDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 57 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ThrowIfConnected(ExceptionDispatchInfo exceptionInfo, IMessagingAnalyticsAction analytics) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 149 at Xamarin.Messaging.Ssh.MessagingRunnerPro.HandleExceptionAsync[TResult](ExceptionDispatchInfo exceptionInfo, Func`1 reentrancyDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 97 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ExecuteWithRetryAsync[TResult](Func`1 executeDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 64 at Xamarin.Messaging.Ssh.MessagingRunnerPro.HandleExceptionAsync[TResult](ExceptionDispatchInfo exceptionInfo, Func`1 reentrancyDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 103 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ExecuteWithRetryAsync[TResult](Func`1 executeDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 64 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ExecuteWithRetryAsync[TResult](Func`1 executeDelegate, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 39 at Xamarin.Messaging.Ssh.MessagingClientPro.PostAsync[TMessage,TResult](TMessage request, CancellationToken cancellationToken, Boolean retain, Int32 timeoutSecs) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingClientPro.cs:line 144 at Xamarin.Messaging.Build.Client.BuildClient.RunMessagingAsync[TMessage,TResult](TMessage message, Int32 timeoutSecs) in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\BuildClient.cs:line 293 at Xamarin.Messaging.Build.Client.BuildClient.ExecuteTaskAsync(String task, String inputs) in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\BuildClient.cs:line 65 at Xamarin.Messaging.Build.Client.TaskRunner.RunAsync(Task task) in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\TaskRunner.cs:line 56 Errors C:\Program Files\dotnet\packs\Microsoft.iOS.Windows.Sdk.net8.0_17.5\17.5.8030\tools\msbuild\iOS\Xamarin.iOS.Common.After.targets(364,3): MessagingException: The post for client build1460814608Ilian on topic xvs/build/1.14.0.6/execute-task/ecacau/de6ed16002fILLink has been cancelled OperationCanceledException: The operation was canceled. [sampleproj.csproj] C:\Program Files\dotnet\packs\Microsoft.iOS.Windows.Sdk.net8.0_17.5\17.5.8030\tools\msbuild\iOS\Xamarin.iOS.Common.After.targets(364,3): error MSB4018: The "Xamarin.MacDev.Tasks.ILLink" task failed unexpectedly. System.AggregateException: One or more errors occurred. (One or more errors occurred. (An error occurred while executing the operation and the connection could not be reestablished)) ---> System.AggregateException: One or more errors occurred. (An error occurred while executing the operation and the connection could not be reestablished) ---> Xamarin.Messaging.Exceptions.MessagingException: An error occurred while executing the operation and the connection could not be reestablished ---> Xamarin.Messaging.Exceptions.ClientDisconnectedException: The client build1460814608Ilian has been disconnected while waiting a post response to topic xma/agents at Xamarin.Messaging.Client.MessagingClient.PostAsync[TRequest,TResponse](TRequest message, String topic, MessagePriority priority, CancellationToken cancellationToken, Boolean retain, Int32 timeoutSecs) in D:\a\_work\1\s\src\Xamarin.Messaging.Client\MessagingClient.cs:line 197 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ExecuteWithRetryAsync[TResult](Func`1 executeDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 57 --- End of inner exception stack trace --- at Xamarin.Messaging.Ssh.MessagingRunnerPro.ReconnectAsync(ExceptionDispatchInfo exceptionInfo, IMessagingAnalyticsAction analytics) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 182 at Xamarin.Messaging.Ssh.MessagingRunnerPro.HandleExceptionAsync[TResult](ExceptionDispatchInfo exceptionInfo, Func`1 reentrancyDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 99 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ExecuteWithRetryAsync[TResult](Func`1 executeDelegate, IMessagingAnalyticsAction analytics, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 64 at Xamarin.Messaging.Ssh.MessagingRunnerPro.ExecuteWithRetryAsync[TResult](Func`1 executeDelegate, Int32 attempts) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingRunnerPro.cs:line 39 at Xamarin.Messaging.Ssh.MessagingClientPro.PostAsync[TMessage,TResult](TMessage request, Boolean retain, Int32 timeoutSecs) in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingClientPro.cs:line 135 at Xamarin.Messaging.Ssh.MessagingService.RefreshAgentsStatusAsync() in D:\a\_work\1\s\src\Xamarin.Messaging.Ssh\MessagingService.cs:line 298 at Xamarin.Messaging.Build.Client.BuildConnection.GetBuildAgentStatusAsync() in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\BuildConnection.Normal.cs:line 435 at Xamarin.Messaging.Build.Client.BuildConnection.IsBuildAgentRunningAsync() in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\BuildConnection.Normal.cs:line 92 --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at Xamarin.Messaging.Build.Client.BuildConnection.get_IsConnected() in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\BuildConnection.Normal.cs:line 45 at Xamarin.Messaging.Build.Client.BuildConnection.GetAsync(IBuildEngine4 engine) in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\BuildConnection.Static.cs:line 50 at Xamarin.Messaging.Build.Client.TaskRunner.DisconnectAsync(Task task) in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\TaskRunner.cs:line 541 at Xamarin.Messaging.Build.Client.TaskRunner.RunAsync(Task task) in D:\a\_work\1\s\src\MSBuild\Xamarin.Messaging.Build.Client\TaskRunner.cs:line 99 --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at Xamarin.MacDev.Tasks.ILLink.Execute() in /Users/builder/azdo/_work/1/s/xamarin-macios/msbuild/Xamarin.MacDev.Tasks/Tasks/ILLink.cs:line 30 at Microsoft.Build.BackEnd.TaskExecutionHost.Execute() at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(TaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask) Messages [...] Task "Touch" skipped, due to false condition; ( '$(_ILLinkExitCode)' == '0' ) was evaluated as ( '' == '0' ). (and build kept going, eventually failing later on because ILLink didn't run correctly) Ref: https://developercommunity.visualstudio.com/t/Maui-Blazor-Hybrid-App-wont-publish-to-/10750311#T-ND10763338 --- .../Xamarin.iOS.Common.After.targets | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets b/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets index 3e7f4b9de394..4ed1bd93a17b 100644 --- a/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets +++ b/msbuild/Xamarin.iOS.Tasks.Windows/Xamarin.iOS.Common.After.targets @@ -403,6 +403,10 @@ Copyright (C) 2011-2013 Xamarin. All rights reserved. + + + <_ILLinkExitCode Condition="'$(_ILLinkExitCode)' == '' And '$(MSBuildLastTaskResult)' != 'true'">-1 + From 34d1fca7f6aa1e92d9954b5740806806527b3edf Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 11:06:47 +0200 Subject: [PATCH 069/155] [StoreKit] Bind AppStore.requestReview. Fixes #21410. (#21441) The existing Objective-C class to request an App Store review (SKStoreReviewController) is deprecated in Xcode 16+, and it doesn't even work on the corresponding OS versions. The replacement API is Swift-only, but luckily it's a very simple API (just a static method), so it's possible to bind it manually. This required a few other changes/improvements: * Add support for Swift code in our runtime. * Just to keep the changes to a minimum, bump the min OS version for legacy code to match the .NET min OS versions. This is because our build logic uses the legacy min versions when compiling native code (a more involved fix would be to update all the build logic to build native code to use the .NET min OS versions, but that's not the point of this PR, so I took the easy route). Fixes #10659. I've tested the method locally, and it seems to work fine, but I've still marked it as experimental for now. There are no unit tests because calling the method will put up a dialog, which won't work correctly in unit tests. Fixes https://github.com/xamarin/xamarin-macios/issues/21410. Fixes https://github.com/xamarin/xamarin-macios/issues/10659. --- Make.config | 51 ++++++++++++++----- docs/preview-apis.md | 6 +++ mk/rules.mk | 39 ++++++++++++++ runtime/Makefile | 4 +- runtime/swift-functions.swift | 29 +++++++++++ src/StoreKit/SwiftAPI.cs | 37 ++++++++++++++ src/frameworks.sources | 1 + src/storekit.cs | 21 ++++++++ tests/cecil-tests/AttributeTest.cs | 11 ++-- tests/introspection/ApiProtocolTest.cs | 3 ++ tests/introspection/ApiSelectorTest.cs | 3 ++ .../common-StoreKit.ignore | 2 + tools/common/SdkVersions.cs | 8 +-- 13 files changed, 192 insertions(+), 23 deletions(-) create mode 100644 runtime/swift-functions.swift create mode 100644 src/StoreKit/SwiftAPI.cs create mode 100644 tests/xtro-sharpie/api-annotations-dotnet/common-StoreKit.ignore diff --git a/Make.config b/Make.config index c01ca83b4a83..41cdcff7784b 100644 --- a/Make.config +++ b/Make.config @@ -289,12 +289,12 @@ MAX_TVOS_SIMULATOR_VERSION=$(TVOS_SDK_VERSION) MAX_WATCH_SIMULATOR_VERSION=$(WATCH_SDK_VERSION) # Minimum OS versions for running XI/XM apps. -MIN_IOS_SDK_VERSION=11.0 +MIN_IOS_SDK_VERSION=12.2 MIN_MACOS_SDK_VERSION=12.0 MIN_WATCHOS_SDK_VERSION=4.0 MIN_WATCHOS64_32_SDK_VERSION=5.1 MIN_WATCH_OS_VERSION=4.0 -MIN_TVOS_SDK_VERSION=11.0 +MIN_TVOS_SDK_VERSION=12.2 MIN_MACCATALYST_SDK_VERSION=15.0 # Minimum OS versions for .NET 9 support @@ -408,7 +408,10 @@ SIMULATOR_SDK=$(XCODE_DEVELOPER_ROOT)/Platforms/iPhoneSimulator.platform/Develop # Ref: https://github.com/xamarin/xamarin-macios/issues/16223 OBJC_CFLAGS=-ObjC++ -std=c++14 -fno-exceptions -fno-objc-msgsend-selector-stubs -COMMON_SIMULATOR_CFLAGS=-mios-simulator-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(SIMULATOR_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES) +COMMON_SIMULATOR_CFLAGS=-mios-simulator-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(SIMULATOR_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES) \ + -L$(SIMULATOR_SDK)/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator \ + -Wno-unused-command-line-argument SIMULATOR86_CFLAGS=$(COMMON_SIMULATOR_CFLAGS) -arch i386 SIMULATOR64_CFLAGS=$(COMMON_SIMULATOR_CFLAGS) -arch x86_64 SIMULATOR_ARM64_CFLAGS=$(COMMON_SIMULATOR_CFLAGS) -arch arm64 @@ -420,14 +423,20 @@ SIMULATOR_ARM64_OBJC_CFLAGS=$(COMMON_SIMULATOR_OBJC_CFLAGS) $(SIMULATOR_ARM64_CF MACCATALYST_COMMON_CFLAGS=-target x86_64-apple-ios$(MIN_MACCATALYST_SDK_VERSION)-macabi -arch x86_64 -g $(IOS_COMMON_DEFINES) \ -isysroot $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk \ -isystem $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/System/iOSSupport/usr/include \ - -iframework $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/System/iOSSupport/System/Library/Frameworks + -iframework $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/System/iOSSupport/System/Library/Frameworks \ + -L$(SIMULATOR_SDK)/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator \ + -Wno-unused-command-line-argument MACCATALYST_OBJC_CFLAGS=$(MACCATALYST_COMMON_CFLAGS) -fobjc-abi-version=2 -fobjc-legacy-dispatch $(OBJC_CFLAGS) MACCATALYST_CFLAGS=$(MACCATALYST_COMMON_CFLAGS) MACCATALYST_COMMON_CFLAGS=$(CFLAGS) -g $(IOS_COMMON_DEFINES) \ -isysroot $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk \ -isystem $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/System/iOSSupport/usr/include \ - -iframework $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/System/iOSSupport/System/Library/Frameworks + -iframework $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/System/iOSSupport/System/Library/Frameworks \ + -L$(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx \ + -Wno-unused-command-line-argument MACCATALYST_COMMON_OBJC_CFLAGS=$(MACCATALYST_COMMON_CFLAGS) -fobjc-abi-version=2 -fobjc-legacy-dispatch $(OBJC_CFLAGS) MACCATALYST_X86_64_OBJC_CFLAGS=$(MACCATALYST_COMMON_OBJC_CFLAGS) -target x86_64-apple-ios$(MIN_MACCATALYST_SDK_VERSION)-macabi -arch x86_64 MACCATALYST_X86_64_CFLAGS=$(MACCATALYST_COMMON_CFLAGS) -target x86_64-apple-ios$(MIN_MACCATALYST_SDK_VERSION)-macabi -arch x86_64 @@ -448,9 +457,13 @@ MACCATALYST_CSC=$(SYSTEM_CSC) -features:strict -nostdlib -noconfig -r:$(MONOTOUC DEVICE_OBJC_CFLAGS=$(OBJC_CFLAGS) DEVICE_SDK=$(XCODE_DEVELOPER_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(IOS_SDK_VERSION).sdk -DEVICE7_CFLAGS= -arch armv7 -mno-thumb -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES) -DEVICE7S_CFLAGS=-arch armv7s -mno-thumb -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES) -DEVICE64_CFLAGS=-arch arm64 -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES) +DEVICE_SWIFT_CFLAGS=\ + -L$(DEVICE_SDK)/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos \ + -Wno-unused-command-line-argument +DEVICE7_CFLAGS= -arch armv7 -mno-thumb -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES) $(DEVICE_SWIFT_CFLAGS) +DEVICE7S_CFLAGS=-arch armv7s -mno-thumb -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES) $(DEVICE_SWIFT_CFLAGS) +DEVICE64_CFLAGS=-arch arm64 -miphoneos-version-min=$(MIN_IOS_SDK_VERSION) -isysroot $(DEVICE_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES) $(DEVICE_SWIFT_CFLAGS) DEVICE7_OBJC_CFLAGS =$(DEVICE7_CFLAGS) $(DEVICE_OBJC_CFLAGS) DEVICE7S_OBJC_CFLAGS=$(DEVICE7S_CFLAGS) $(DEVICE_OBJC_CFLAGS) DEVICE64_OBJC_CFLAGS=$(DEVICE64_CFLAGS) $(DEVICE_OBJC_CFLAGS) @@ -488,13 +501,22 @@ XAMARIN_TVSIMULATOR_SDK = $(MONOTOUCH_PREFIX)/SDKs/Xamarin.AppleTVSimulator.s XAMARIN_TVOS_SDK = $(MONOTOUCH_PREFIX)/SDKs/Xamarin.AppleTVOS.sdk SIMULATORTV_SDK = $(XCODE_DEVELOPER_ROOT)/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator$(TVOS_SDK_VERSION).sdk -SIMULATORTV_CFLAGS = -arch x86_64 -mtvos-simulator-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(SIMULATORTV_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES) -SIMULATORTV_ARM64_CFLAGS = -arch arm64 -mtvos-simulator-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(SIMULATORTV_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES) +SIMULATORTV_CFLAGS = -arch x86_64 -mtvos-simulator-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(SIMULATORTV_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES) \ + -L$(SIMULATORTV_SDK)/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/appletvsimulator \ + -Wno-unused-command-line-argument +SIMULATORTV_ARM64_CFLAGS = -arch arm64 -mtvos-simulator-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(SIMULATORTV_SDK) $(CFLAGS) -g $(IOS_COMMON_DEFINES) \ + -L$(SIMULATORTV_SDK)/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/appletvsimulator \ + -Wno-unused-command-line-argument SIMULATORTV_OBJC_CFLAGS = $(SIMULATORTV_CFLAGS) $(COMMON_SIMULATOR_OBJC_CFLAGS) SIMULATORTV_ARM64_OBJC_CFLAGS = $(SIMULATORTV_ARM64_CFLAGS) $(COMMON_SIMULATOR_OBJC_CFLAGS) DEVICETV_SDK = $(XCODE_DEVELOPER_ROOT)/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS$(TVOS_SDK_VERSION).sdk -DEVICETV_CFLAGS = -arch arm64 -mtvos-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(DEVICETV_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES) +DEVICETV_CFLAGS = -arch arm64 -mtvos-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(DEVICETV_SDK) $(CFLAGS) $(IOS_COMMON_DEFINES)\ + -L$(DEVICETV_SDK)/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/appletvos \ + -Wno-unused-command-line-argument DEVICETV_OBJC_CFLAGS = $(DEVICETV_CFLAGS) $(DEVICE_OBJC_CFLAGS) # macOS @@ -502,7 +524,10 @@ DEVICETV_OBJC_CFLAGS = $(DEVICETV_CFLAGS) $(DEVICE_OBJC_CFLAGS) XAMARIN_MACOS_SDK = $(MAC_FRAMEWORK_CURRENT_DIR)/SDKs/Xamarin.macOS.sdk MAC_OBJC_CFLAGS= -mmacosx-version-min=$(MIN_MACOS_SDK_VERSION) -DMONOMAC -DMIN_XM_MONO_VERSION=\"$(MIN_XM_MONO_VERSION)\" $(CFLAGS) $(OBJC_CFLAGS) -MAC_CFLAGS = -mmacosx-version-min=$(MIN_MACOS_SDK_VERSION) -DMONOMAC -g -DMIN_XM_MONO_VERSION=\"$(MIN_XM_MONO_VERSION)\" $(CFLAGS) +MAC_CFLAGS = -mmacosx-version-min=$(MIN_MACOS_SDK_VERSION) -DMONOMAC -g -DMIN_XM_MONO_VERSION=\"$(MIN_XM_MONO_VERSION)\" $(CFLAGS) \ + -L$(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk/usr/lib/swift \ + -L$(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx \ + -Wno-unused-command-line-argument MAC_LDFLAGS = -mmacosx-version-min=$(MIN_MACOS_SDK_VERSION) -framework AppKit # Swift compiler flags @@ -529,7 +554,7 @@ WATCHOS_DEVICE_COMMON_SWIFTFLAGS=$(COMMON_SWIFTFLAGS) -sdk $(DEVICEWATCH_SDK) WATCHOS_DEVICE_ARM64_32_SWIFTFLAGS=$(WATCHOS_DEVICE_COMMON_SWIFTFLAGS) -target arm64_32-apple-watchos$(MIN_WATCHOS_SDK_VERSION) WATCHOS_DEVICE_ARMV7K_SWIFTFLAGS=$(WATCHOS_DEVICE_COMMON_SWIFTFLAGS) -target armv7k-apple-watchos$(MIN_WATCHOS_SDK_VERSION) -MACCATALYST_COMMON_SWIFTFLAGS=$(COMMON_SWIFTFLAGS) -sdk $(XCODE_MAC_SDKROOT) +MACCATALYST_COMMON_SWIFTFLAGS=$(COMMON_SWIFTFLAGS) -sdk $(XCODE_MAC_SDKROOT) -Fsystem $(XCODE_MAC_SDKROOT)/System/iOSSupport/System/Library/Frameworks MACCATALYST_ARM64_SWIFTFLAGS=$(MACCATALYST_COMMON_SWIFTFLAGS) -target arm64-apple-ios$(MIN_MACCATALYST_SDK_VERSION)-macabi MACCATALYST_X64_SWIFTFLAGS=$(MACCATALYST_COMMON_SWIFTFLAGS) -target x86_64-apple-ios$(MIN_MACCATALYST_SDK_VERSION)-macabi diff --git a/docs/preview-apis.md b/docs/preview-apis.md index 99f5b1d61049..7e6ad5448848 100644 --- a/docs/preview-apis.md +++ b/docs/preview-apis.md @@ -96,6 +96,12 @@ We've tentatively set .NET 11 as the release when we'll stop marking FSKit as pr The diagnostic id for FSKit is APL0002. +## StoreKit.AppStore.RequestReview (APL0004) + +The +[AppStore.RequestReview](https://developer.apple.com/documentation/storekit/appstore/3954432-requestreview/) +method is Swift API we've bound manually, and as such it's marked as experimental until .NET 10. + [1]: https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.experimentalattribute?view=net-8.0 ## Rgen (APL0003) diff --git a/mk/rules.mk b/mk/rules.mk index 2d8fd7c512d3..32f808353331 100644 --- a/mk/rules.mk +++ b/mk/rules.mk @@ -52,6 +52,9 @@ define NativeCompilationTemplate .libs/iphonesimulator/%$(1).x86_64.dylib: %.swift | .libs/iphonesimulator $$(call Q_2,SWIFT, [iphonesimulator]) $(SWIFTC) $(IOS_SIMULATOR_X64_SWIFTFLAGS) $$< -o $$@ +.libs/iphonesimulator/%$(1).x86_64.o: %.swift | .libs/iphonesimulator + $$(call Q_2,SWIFT, [iphonesimulator]) $(SWIFTC) $(IOS_SIMULATOR_X64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/iphonesimulator/%$(1).x86_64.dylib: | .libs/iphonesimulator $$(call Q_2,LD, [iphonesimulator]) $(SIMULATOR_CC) $(SIMULATOR64_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_IOSSIMULATOR_SDK)/lib -fapplication-extension @@ -72,6 +75,9 @@ define NativeCompilationTemplate .libs/iphonesimulator/%$(1).arm64.dylib: %.swift | .libs/iphonesimulator $$(call Q_2,SWIFT, [iphonesimulator]) $(SWIFTC) $(IOS_SIMULATOR_ARM64_SWIFTFLAGS) $$< -o $$@ +.libs/iphonesimulator/%$(1).arm64.o: %.swift | .libs/iphonesimulator + $$(call Q_2,SWIFT, [iphonesimulator]) $(SWIFTC) $(IOS_SIMULATOR_ARM64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/iphonesimulator/%$(1).arm64.dylib: | .libs/iphonesimulator $$(call Q_2,LD, [iphonesimulator]) $(SIMULATOR_CC) $(SIMULATOR_ARM64_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_IOSSIMULATOR_SDK)/lib -fapplication-extension @@ -117,6 +123,9 @@ define NativeCompilationTemplate .libs/iphoneos/%$(1).arm64.dylib: %.swift | .libs/iphoneos $$(call Q_2,SWIFT, [iphoneos]) $(SWIFTC) $(IOS_DEVICE_ARM64_SWIFTFLAGS) $$< -o $$@ +.libs/iphoneos/%$(1).arm64.o: %.swift | .libs/iphoneos + $$(call Q_2,SWIFT, [iphoneos]) $(SWIFTC) $(IOS_DEVICE_ARM64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/iphoneos/%$(1).arm64.dylib: | .libs/iphoneos $$(call Q_2,LD, [iphoneos]) $(DEVICE_CC) $(DEVICE64_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_IPHONEOS_SDK)/lib -fapplication-extension @@ -137,6 +146,9 @@ define NativeCompilationTemplate .libs/maccatalyst/%$(1).x86_64.dylib: %.swift | .libs/maccatalyst $$(call Q_2,SWIFT, [maccatalyst]) $(SWIFTC) $(MACCATALYST_X64_SWIFTFLAGS) $$< -o $$@ +.libs/maccatalyst/%$(1).x86_64.o: %.swift | .libs/maccatalyst + $$(call Q_2,SWIFT, [maccatalyst]) $(SWIFTC) $(MACCATALYST_X64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/maccatalyst/%$(1).x86_64.dylib: | .libs/maccatalyst $$(call Q_2,LD, [maccatalyst]) $(XCODE_CC) $(MACCATALYST_X86_64_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_MACCATALYST_SDK)/lib -fapplication-extension @@ -155,6 +167,9 @@ define NativeCompilationTemplate .libs/maccatalyst/%$(1).arm64.dylib: %.swift | .libs/maccatalyst $$(call Q_2,SWIFT, [maccatalyst]) $(SWIFTC) $(MACCATALYST_ARM64_SWIFTFLAGS) $$< -o $$@ +.libs/maccatalyst/%$(1).arm64.o: %.swift | .libs/maccatalyst + $$(call Q_2,SWIFT, [maccatalyst]) $(SWIFTC) $(MACCATALYST_ARM64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/maccatalyst/%$(1).arm64.dylib: | .libs/maccatalyst $$(call Q_2,LD, [maccatalyst]) $(XCODE_CC) $(MACCATALYST_ARM64_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_MACCATALYST_SDK)/lib -fapplication-extension @@ -247,6 +262,9 @@ define NativeCompilationTemplate .libs/tvsimulator/%$(1).x86_64.dylib: %.swift | .libs/tvsimulator $$(call Q_2,SWIFT, [tvsimulator]) $(SWIFTC) $(TVOS_SIMULATOR_X64_SWIFTFLAGS) $$< -o $$@ +.libs/tvsimulator/%$(1).x86_64.o: %.swift | .libs/tvsimulator + $$(call Q_2,SWIFT, [tvsimulator]) $(SWIFTC) $(TVOS_SIMULATOR_X64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/tvsimulator/%$(1).x86_64.dylib: | .libs/tvsimulator $$(call Q_2,LD, [tvsimulator]) $(SIMULATOR_CC) $(SIMULATORTV_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_TVSIMULATOR_SDK)/lib -fapplication-extension @@ -267,6 +285,9 @@ define NativeCompilationTemplate .libs/tvsimulator/%$(1).arm64.dylib: %.swift | .libs/tvsimulator $$(call Q_2,SWIFT, [tvsimulator]) $(SWIFTC) $(TVOS_SIMULATOR_ARM64_SWIFTFLAGS) $$< -o $$@ +.libs/tvsimulator/%$(1).arm64.o: %.swift | .libs/tvsimulator + $$(call Q_2,SWIFT, [tvsimulator]) $(SWIFTC) $(TVOS_SIMULATOR_ARM64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/tvsimulator/%$(1).arm64.dylib: | .libs/tvsimulator $$(call Q_2,LD, [tvsimulator]) $(SIMULATOR_CC) $(SIMULATORTV_ARM64_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_TVSIMULATOR_SDK)/lib -fapplication-extension @@ -287,6 +308,9 @@ define NativeCompilationTemplate .libs/tvos/%$(1).arm64.dylib: %.swift | .libs/tvos $$(call Q_2,SWIFT, [tvos]) $(SWIFTC) $(TVOS_DEVICE_ARM64_SWIFTFLAGS) $$< -o $$@ +.libs/tvos/%$(1).arm64.o: %.swift | .libs/tvos + $$(call Q_2,SWIFT, [tvos]) $(SWIFTC) $(TVOS_DEVICE_ARM64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/tvos/%$(1).arm64.dylib: | .libs/tvos $$(call Q_2,LD, [tvos]) $(DEVICE_CC) $(DEVICETV_CFLAGS) $$(EXTRA_FLAGS) -dynamiclib -o $$@ $$^ -L$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/lib -fapplication-extension @@ -307,6 +331,15 @@ define NativeCompilationTemplate .libs/mac/%$(1).x86_64.dylib: %.swift | .libs/mac $$(call Q_2,SWIFT, [mac]) $(SWIFTC) $(MACOS_X64_SWIFTFLAGS) $$< -o $$@ +.libs/mac/%$(1).x86_64.o: %.swift | .libs/mac + $$(call Q_2,SWIFT, [mac]) $(SWIFTC) $(MACOS_X64_SWIFTFLAGS) $$< -o $$@ -emit-object + +.libs/macos/%$(1).x86_64.dylib: %.swift | .libs/mac + $$(call Q_2,SWIFT, [macos]) $(SWIFTC) $(MACOS_X64_SWIFTFLAGS) $$< -o $$@ + +.libs/macos/%$(1).x86_64.o: %.swift | .libs/mac + $$(call Q_2,SWIFT, [mac]) $(SWIFTC) $(MACOS_X64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/macos/%$(1).x86_64.dylib: %.swift | .libs/mac $$(call Q_2,SWIFT, [macos]) $(SWIFTC) $(MACOS_X64_SWIFTFLAGS) $$< -o $$@ @@ -328,9 +361,15 @@ define NativeCompilationTemplate .libs/mac/%$(1).arm64.dylib: %.swift | .libs/mac $$(call Q_2,SWIFT, [mac]) $(SWIFTC) $(MACOS_ARM64_SWIFTFLAGS) $$< -o $$@ +.libs/mac/%$(1).arm64.o: %.swift | .libs/mac + $$(call Q_2,SWIFT, [mac]) $(SWIFTC) $(MACOS_ARM64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/macos/%$(1).arm64.dylib: %.swift | .libs/mac $$(call Q_2,SWIFT, [macos]) $(SWIFTC) $(MACOS_ARM64_SWIFTFLAGS) $$< -o $$@ +.libs/macos/%$(1).arm64.o: %.swift | .libs/mac + $$(call Q_2,SWIFT, [macos]) $(SWIFTC) $(MACOS_ARM64_SWIFTFLAGS) $$< -o $$@ -emit-object + .libs/mac/%$(1).arm64.dylib: | .libs/mac $$(call Q_2,LD, [mac]) $(MAC_CC) $(MAC_CFLAGS) $$(EXTRA_FLAGS) -arch arm64 -dynamiclib -o $$@ $$^ -L$(MAC_DESTDIR)$(XAMARIN_MACOS_SDK)/lib -fapplication-extension diff --git a/runtime/Makefile b/runtime/Makefile index 2d95fa5973a5..58092f2e841f 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -22,7 +22,7 @@ SHIPPED_HEADERS += \ xamarin/monovm-bridge.h \ xamarin/coreclr-bridge.h \ -SHARED_SOURCES += mono-runtime.m bindings.m bindings-generated.m shared.m runtime.m trampolines.m trampolines-invoke.m xamarin-support.m nsstring-localization.m trampolines-varargs.m monovm-bridge.m coreclr-bridge.m nativeaot-bridge.m +SHARED_SOURCES += mono-runtime.m bindings.m bindings-generated.m shared.m runtime.m trampolines.m trampolines-invoke.m xamarin-support.m nsstring-localization.m trampolines-varargs.m monovm-bridge.m coreclr-bridge.m nativeaot-bridge.m swift-functions.swift SHARED_I386_SOURCES += trampolines-i386.m trampolines-i386-asm.s trampolines-i386-objc_msgSend.s trampolines-i386-objc_msgSendSuper.s trampolines-i386-objc_msgSend_stret.s trampolines-i386-objc_msgSendSuper_stret.s SHARED_X86_64_SOURCES += trampolines-x86_64.m trampolines-x86_64-asm.s trampolines-x86_64-objc_msgSend.s trampolines-x86_64-objc_msgSendSuper.s trampolines-x86_64-objc_msgSend_stret.s trampolines-x86_64-objc_msgSendSuper_stret.s SHARED_ARM64_SOURCES += trampolines-arm64.m trampolines-arm64-asm.s trampolines-arm64-objc_msgSend.s trampolines-arm64-objc_msgSendSuper.s @@ -99,7 +99,7 @@ MONOTOUCH_FRAMEWORKS = \ Xamarin \ Xamarin-debug \ -MONOTOUCH_SOURCE_STEMS = $(patsubst %.s,%,$(patsubst %.m,%,$(SHARED_SOURCES) $(MONOTOUCH_SOURCES))) +MONOTOUCH_SOURCE_STEMS = $(patsubst %.swift,%,$(patsubst %.s,%,$(patsubst %.m,%,$(SHARED_SOURCES) $(MONOTOUCH_SOURCES)))) MONOTOUCH_I386_SOURCE_STEMS = $(patsubst %.s,%,$(patsubst %.m,%,$(SHARED_I386_SOURCES))) MONOTOUCH_X86_64_SOURCE_STEMS = $(patsubst %.s,%,$(patsubst %.m,%,$(SHARED_X86_64_SOURCES))) MONOTOUCH_ARM64_SOURCE_STEMS = $(patsubst %.s,%,$(patsubst %.m,%,$(SHARED_ARM64_SOURCES))) diff --git a/runtime/swift-functions.swift b/runtime/swift-functions.swift new file mode 100644 index 000000000000..1f826a771560 --- /dev/null +++ b/runtime/swift-functions.swift @@ -0,0 +1,29 @@ +#if os(macOS) +import AppKit +#endif +import Foundation +import StoreKit +#if !os(macOS) +import UIKit +#endif + +@objc(XamarinSwiftFunctions) +public class XamarinSwiftFunctions : NSObject { +#if os(macOS) + @MainActor + @objc(requestReview:) + @available(macOS 13, *) + public static func StoreKit_RequestReview(scene: NSViewController) + { + AppStore.requestReview(in: scene) + } +#elseif !os(tvOS) + @MainActor + @objc(requestReview:) + @available(iOS 16, macCatalyst 16, *) + public static func StoreKit_RequestReview(scene: UIWindowScene) + { + AppStore.requestReview(in: scene) + } +#endif +} diff --git a/src/StoreKit/SwiftAPI.cs b/src/StoreKit/SwiftAPI.cs new file mode 100644 index 000000000000..3ea8d380acfb --- /dev/null +++ b/src/StoreKit/SwiftAPI.cs @@ -0,0 +1,37 @@ +#if __IOS__ || __MACCATALYST__ || __MACOS__ + +using System.Diagnostics.CodeAnalysis; + +#if HAS_APPKIT +using AppKit; +#endif + +#if HAS_UIKIT +using UIKit; +#endif + +namespace StoreKit { + + /// A class to interact with the App Store. +#if !NET10_0_OR_GREATER + [Experimental ("APL0004")] +#endif + public static class AppStore { + /// Ask StoreKit to request an App Store review or rating from the user. + /// The scene or view controller to display the interface in. + [SupportedOSPlatform ("ios16.0")] + [SupportedOSPlatform ("maccatalyst16.0")] + [SupportedOSPlatform ("macos13.0")] + [UnsupportedOSPlatform ("tvos")] +#if __MACOS__ + public static void RequestReview (NSViewController @in) +#else + public static void RequestReview (UIWindowScene @in) +#endif + { + XamarinSwiftFunctions.RequestReview (@in); + } + } +} + +#endif // __IOS__ || __MACCATALYST__ || __MACOS__ diff --git a/src/frameworks.sources b/src/frameworks.sources index 57094027d6fa..3cbd037b273e 100644 --- a/src/frameworks.sources +++ b/src/frameworks.sources @@ -1760,6 +1760,7 @@ STOREKIT_SOURCES = \ StoreKit/SKCloudServiceSetupOptions.cs \ StoreKit/SKPayment.cs \ StoreKit/SKPaymentTransactionObserver.cs \ + StoreKit/SwiftAPI.cs \ # SystemConfiguration diff --git a/src/storekit.cs b/src/storekit.cs index cb1bfa1cb909..bd0308d34a44 100644 --- a/src/storekit.cs +++ b/src/storekit.cs @@ -9,6 +9,9 @@ // Copyright 2012 Xamarin Inc. // Copyright 2020 Microsoft Corp. // + +using System.ComponentModel; + using ObjCRuntime; using Foundation; using CoreFoundation; @@ -34,6 +37,21 @@ namespace StoreKit { + [EditorBrowsable (EditorBrowsableState.Never)] + [Internal] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface XamarinSwiftFunctions { + [Export ("requestReview:")] + [Static] + [iOS (16, 0), MacCatalyst (16, 0), Mac (13, 0), NoTV] +#if MONOMAC + void RequestReview (NSViewController viewController); +#else + void RequestReview (UIWindowScene windowScene); +#endif + } + [ErrorDomain ("SKANErrorDomain")] [NoWatch, NoTV, NoMac, iOS (15, 4), MacCatalyst (17, 0)] [Native] @@ -1112,6 +1130,9 @@ interface SKStoreReviewController { [Export ("requestReview")] void RequestReview (); + [Deprecated (PlatformName.iOS, 18, 0, message: "Use the 'AppStore.RequestReview (UIWindowScene)' API instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 0, message: "Use the 'AppStore.RequestReview (UIWindowScene)' API instead.")] + [Deprecated (PlatformName.MacOSX, 15, 0, message: "Use the 'AppStore.RequestReview (NSViewController)' API instead.")] [Introduced (PlatformName.MacCatalyst, 14, 0)] [NoWatch, NoTV, iOS (14, 0), NoMac] [Static] diff --git a/tests/cecil-tests/AttributeTest.cs b/tests/cecil-tests/AttributeTest.cs index 38c197e05cd6..220bdf8a6768 100644 --- a/tests/cecil-tests/AttributeTest.cs +++ b/tests/cecil-tests/AttributeTest.cs @@ -181,6 +181,9 @@ public void FindSupportedOnElementsThatDoNotExistInThatAssembly () // Walk every class/struct/enum/property/method/enum value/pinvoke/event foreach (var module in assembly.Modules) { foreach (var type in module.Types) { + if (!type.IsPubliclyVisible ()) + continue; + switch (type.Namespace) { case "AppKit": case "UIKit": @@ -289,10 +292,6 @@ static HashSet IgnoreElementsThatDoNotExistInThatAssembly { // These methods have different optional/required semantics between platforms. "PassKit.PKPaymentAuthorizationControllerDelegate_Extensions.GetPresentationWindow (PassKit.IPKPaymentAuthorizationControllerDelegate, PassKit.PKPaymentAuthorizationController)", - "Metal.MTLTextureWrapper.FirstMipmapInTail", - "Metal.MTLTextureWrapper.IsSparse", - "Metal.MTLTextureWrapper.TailSizeInBytes", - // HKSeriesBuilder doesn't implement the ISNCopying protocol on all platforms (and shouldn't on any according to the headers, so removed for XAMCORE_5_0). "HealthKit.HKSeriesBuilder.EncodeTo (Foundation.NSCoder)", @@ -325,6 +324,10 @@ static HashSet IgnoreElementsThatDoNotExistInThatAssembly { "Foundation.NSAttributedString.ReadableTypeIdentifiers", "Foundation.NSAttributedString.WritableTypeIdentifiers", "Foundation.NSAttributedString.WritableTypeIdentifiersForItemProvider", + + // Same method, but different arguments due to platform differences. We should treat this as the same method, so ignore this failure. + "StoreKit.AppStore.RequestReview (XKit.XWindowScene)", // iOS, MacCatalyst + "StoreKit.AppStore.RequestReview (XKit.XViewController)", // macOS }; } } diff --git a/tests/introspection/ApiProtocolTest.cs b/tests/introspection/ApiProtocolTest.cs index 80613da909a2..7fa9cc29b317 100644 --- a/tests/introspection/ApiProtocolTest.cs +++ b/tests/introspection/ApiProtocolTest.cs @@ -34,6 +34,9 @@ static bool ConformTo (IntPtr klass, IntPtr protocol) protected virtual bool Skip (Type type) { + if (MemberHasEditorBrowsableNever (type)) + return true; + switch (type.Namespace) { // Xcode 15: case "MetalFX": diff --git a/tests/introspection/ApiSelectorTest.cs b/tests/introspection/ApiSelectorTest.cs index 4704c66635b1..567ff8e224e6 100644 --- a/tests/introspection/ApiSelectorTest.cs +++ b/tests/introspection/ApiSelectorTest.cs @@ -38,6 +38,9 @@ public abstract class ApiSelectorTest : ApiBaseTest { protected virtual bool Skip (Type type) { + if (MemberHasEditorBrowsableNever (type)) + return true; + if (type.ContainsGenericParameters) return true; diff --git a/tests/xtro-sharpie/api-annotations-dotnet/common-StoreKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/common-StoreKit.ignore new file mode 100644 index 000000000000..1295a3d58015 --- /dev/null +++ b/tests/xtro-sharpie/api-annotations-dotnet/common-StoreKit.ignore @@ -0,0 +1,2 @@ +# This is one of our own types. +!unknown-type! XamarinSwiftFunctions bound diff --git a/tools/common/SdkVersions.cs b/tools/common/SdkVersions.cs index eb863c6ceec6..1413ffbded8b 100644 --- a/tools/common/SdkVersions.cs +++ b/tools/common/SdkVersions.cs @@ -28,9 +28,9 @@ static class SdkVersions { public const string MinMacCatalyst = "15.0"; #else public const string MinOSX = "12.0"; - public const string MiniOS = "11.0"; + public const string MiniOS = "12.2"; public const string MinWatchOS = "4.0"; - public const string MinTVOS = "11.0"; + public const string MinTVOS = "12.2"; public const string MinMacCatalyst = "15.0"; #endif @@ -39,9 +39,9 @@ static class SdkVersions { public const string DotNetMinTVOS = "12.2"; public const string DotNetMinMacCatalyst = "15.0"; public const string LegacyMinOSX = "12.0"; - public const string LegacyMiniOS = "11.0"; + public const string LegacyMiniOS = "12.2"; public const string LegacyMinWatchOS = "4.0"; - public const string LegacyMinTVOS = "11.0"; + public const string LegacyMinTVOS = "12.2"; public const string MiniOSSimulator = "15.0"; public const string MinWatchOSSimulator = "8.0"; From 1fddf207e480e7dcdf532ac7428b5d85bbcefef4 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 11:36:52 +0200 Subject: [PATCH 070/155] [msbuild] Port Metal and MetalLib to subclass XamarinTask. Fixes #21437. (#21439) This has a few advantages: * We simplify and unify more of our code. * We have more control over the error reporting / logging behavior. Additionally: * Use 'xcrun' to invoke 'metal' and 'metallib' (partial fix for #3931). * Allow for overriding the path to the command-line tool in question. * Add support for cancellation. * Fix nullability. Fixes https://github.com/xamarin/xamarin-macios/issues/21437. --- docs/build-apps/build-properties.md | 12 ++ msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs | 112 +++++++----------- .../Xamarin.MacDev.Tasks/Tasks/MetalLib.cs | 103 ++++++---------- .../Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs | 5 +- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 2 + .../TaskTests/ToolTasksBinPathTest.cs | 68 ----------- 6 files changed, 96 insertions(+), 206 deletions(-) delete mode 100644 tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ToolTasksBinPathTest.cs diff --git a/docs/build-apps/build-properties.md b/docs/build-apps/build-properties.md index 5a478bbcbe6d..52101278797d 100644 --- a/docs/build-apps/build-properties.md +++ b/docs/build-apps/build-properties.md @@ -30,3 +30,15 @@ Example: ``` This property was introduced in .NET 9. + +## MetalLibPath + +The full path to the `metallib` tool (the Metal Linker). + +The default behavior is to use `xcrun metallib`. + +## MetalPath + +The full path to the Metal compiler. + +The default behavior is to use `xcrun metal`. diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs index dffb0dd4724a..bf3f7b927e8d 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; @@ -11,77 +12,53 @@ using Xamarin.Localization.MSBuild; using Xamarin.Messaging.Build.Client; -// Disable until we get around to enable + fix any issues. -#nullable disable - namespace Xamarin.MacDev.Tasks { - public class Metal : XamarinToolTask { + public class Metal : XamarinTask { + CancellationTokenSource? cancellationTokenSource; + #region Inputs [Required] - public string IntermediateOutputPath { get; set; } + public string IntermediateOutputPath { get; set; } = string.Empty; + + public string MetalPath { get; set; } = string.Empty; [Required] - public string MinimumOSVersion { get; set; } + public string MinimumOSVersion { get; set; } = string.Empty; [Required] - public string ProjectDir { get; set; } + public string ProjectDir { get; set; } = string.Empty; [Required] - public string ResourcePrefix { get; set; } + public string ResourcePrefix { get; set; } = string.Empty; [Required] - public string SdkDevPath { get; set; } + public string SdkDevPath { get; set; } = string.Empty; [Required] - public string SdkVersion { get; set; } + public string SdkVersion { get; set; } = string.Empty; [Required] public bool SdkIsSimulator { get; set; } [Required] - public string SdkRoot { get; set; } + public string SdkRoot { get; set; } = string.Empty; [Required] - public ITaskItem SourceFile { get; set; } + public ITaskItem? SourceFile { get; set; } #endregion [Output] - public ITaskItem OutputFile { get; set; } - - string DevicePlatformBinDir { - get { - switch (Platform) { - case ApplePlatform.iOS: - case ApplePlatform.TVOS: - case ApplePlatform.WatchOS: - return AppleSdkSettings.XcodeVersion.Major >= 11 - ? Path.Combine (SdkDevPath, "Toolchains", "XcodeDefault.xctoolchain", "usr", "bin") - : Path.Combine (SdkDevPath, "Platforms", "iPhoneOS.platform", "usr", "bin"); - case ApplePlatform.MacOSX: - case ApplePlatform.MacCatalyst: - return AppleSdkSettings.XcodeVersion.Major >= 10 - ? Path.Combine (SdkDevPath, "Toolchains", "XcodeDefault.xctoolchain", "usr", "bin") - : Path.Combine (SdkDevPath, "Platforms", "MacOSX.platform", "usr", "bin"); - default: - throw new InvalidOperationException (string.Format (MSBStrings.InvalidPlatform, Platform)); - } - } - } + public ITaskItem? OutputFile { get; set; } - protected override string ToolName { - get { return "metal"; } - } - - protected override string GenerateFullPathToTool () + static string GetExecutable (List arguments, string toolName, string toolPathOverride) { - if (!string.IsNullOrEmpty (ToolPath)) - return Path.Combine (ToolPath, ToolExe); - - var path = Path.Combine (DevicePlatformBinDir, ToolExe); - - return File.Exists (path) ? path : ToolExe; + if (string.IsNullOrEmpty (toolPathOverride)) { + arguments.Insert (0, toolName); + return "xcrun"; + } + return toolPathOverride; } public override bool Execute () @@ -89,37 +66,36 @@ public override bool Execute () if (ShouldExecuteRemotely ()) return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result; - if (AppleSdkSettings.XcodeVersion.Major >= 11) - EnvironmentVariables = EnvironmentVariables.CopyAndAdd ($"SDKROOT={SdkRoot}"); - return base.Execute (); - } + var env = new Dictionary { + { "SDKROOT", SdkRoot }, + }; - protected override string GenerateCommandLineCommands () - { var prefixes = BundleResource.SplitResourcePrefixes (ResourcePrefix); - var intermediate = Path.Combine (IntermediateOutputPath, ToolName); - var logicalName = BundleResource.GetLogicalName (ProjectDir, prefixes, SourceFile, !string.IsNullOrEmpty (SessionId)); + var intermediate = Path.Combine (IntermediateOutputPath, MetalPath); + var logicalName = BundleResource.GetLogicalName (ProjectDir, prefixes, SourceFile!, !string.IsNullOrEmpty (SessionId)); var path = Path.Combine (intermediate, logicalName); - var args = new CommandLineArgumentBuilder (); + var args = new List (); var dir = Path.GetDirectoryName (path); - if (!Directory.Exists (dir)) - Directory.CreateDirectory (dir); + Directory.CreateDirectory (dir); OutputFile = new TaskItem (Path.ChangeExtension (path, ".air")); OutputFile.SetMetadata ("LogicalName", Path.ChangeExtension (logicalName, ".air")); - args.Add ("-arch", "air64"); + var executable = GetExecutable (args, "metal", MetalPath); + + args.Add ("-arch"); + args.Add ("air64"); args.Add ("-emit-llvm"); args.Add ("-c"); args.Add ("-gline-tables-only"); args.Add ("-ffast-math"); args.Add ("-serialize-diagnostics"); - args.AddQuoted (Path.ChangeExtension (path, ".dia")); + args.Add (Path.ChangeExtension (path, ".dia")); args.Add ("-o"); - args.AddQuoted (Path.ChangeExtension (path, ".air")); + args.Add (Path.ChangeExtension (path, ".air")); if (Platform == ApplePlatform.MacCatalyst) { args.Add ($"-target"); @@ -127,23 +103,21 @@ protected override string GenerateCommandLineCommands () } else { args.Add (PlatformFrameworkHelper.GetMinimumVersionArgument (TargetFrameworkMoniker, SdkIsSimulator, MinimumOSVersion)); } - args.AddQuoted (SourceFile.ItemSpec); + args.Add (SourceFile!.ItemSpec); - return args.ToString (); - } + cancellationTokenSource = new CancellationTokenSource (); + ExecuteAsync (Log, executable, args, environment: env, cancellationToken: cancellationTokenSource.Token).Wait (); - protected override void LogEventsFromTextOutput (string singleLine, MessageImportance messageImportance) - { - // TODO: do proper parsing of error messages and such - Log.LogMessage (messageImportance, "{0}", singleLine); + return !Log.HasLoggedErrors; } - public override void Cancel () + public void Cancel () { - if (ShouldExecuteRemotely ()) + if (ShouldExecuteRemotely ()) { BuildConnection.CancelAsync (BuildEngine4).Wait (); - - base.Cancel (); + } else { + cancellationTokenSource?.Cancel (); + } } } } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs index a98654fb4dd4..2c689669a2f1 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; @@ -10,78 +11,35 @@ using Xamarin.Messaging.Build.Client; using Xamarin.Utils; -// Disable until we get around to enable + fix any issues. -#nullable disable - namespace Xamarin.MacDev.Tasks { - public class MetalLib : XamarinToolTask, ITaskCallback { + public class MetalLib : XamarinTask, ITaskCallback { + CancellationTokenSource? cancellationTokenSource; + #region Inputs [Required] - public ITaskItem [] Items { get; set; } + public ITaskItem [] Items { get; set; } = Array.Empty (); + + public string MetalLibPath { get; set; } = string.Empty; [Required] - public string OutputLibrary { get; set; } + public string OutputLibrary { get; set; } = string.Empty; [Required] - public string SdkDevPath { get; set; } + public string SdkDevPath { get; set; } = string.Empty; [Required] - public string SdkRoot { get; set; } + public string SdkRoot { get; set; } = string.Empty; #endregion - string DevicePlatformBinDir { - get { - switch (Platform) { - case ApplePlatform.iOS: - case ApplePlatform.TVOS: - case ApplePlatform.WatchOS: - return AppleSdkSettings.XcodeVersion.Major >= 11 - ? Path.Combine (SdkDevPath, "Toolchains", "XcodeDefault.xctoolchain", "usr", "bin") - : Path.Combine (SdkDevPath, "Platforms", "iPhoneOS.platform", "usr", "bin"); - case ApplePlatform.MacOSX: - case ApplePlatform.MacCatalyst: - return AppleSdkSettings.XcodeVersion.Major >= 10 - ? Path.Combine (SdkDevPath, "Toolchains", "XcodeDefault.xctoolchain", "usr", "bin") - : Path.Combine (SdkDevPath, "Platforms", "MacOSX.platform", "usr", "bin"); - default: - throw new InvalidOperationException (string.Format (MSBStrings.InvalidPlatform, Platform)); - } - } - } - - protected override string ToolName { - get { return "metallib"; } - } - - protected override string GenerateFullPathToTool () + static string GetExecutable (List arguments, string toolName, string toolPathOverride) { - if (!string.IsNullOrEmpty (ToolPath)) - return Path.Combine (ToolPath, ToolExe); - - var path = Path.Combine (DevicePlatformBinDir, ToolExe); - - return File.Exists (path) ? path : ToolExe; - } - - protected override string GenerateCommandLineCommands () - { - var args = new CommandLineArgumentBuilder (); - - args.Add ("-o"); - args.AddQuoted (OutputLibrary); - - foreach (var item in Items) - args.AddQuoted (item.ItemSpec); - - return args.ToString (); - } - - protected override void LogEventsFromTextOutput (string singleLine, MessageImportance messageImportance) - { - // TODO: do proper parsing of error messages and such - Log.LogMessage (messageImportance, "{0}", singleLine); + if (string.IsNullOrEmpty (toolPathOverride)) { + arguments.Insert (0, toolName); + return "xcrun"; + } + return toolPathOverride; } public override bool Execute () @@ -90,14 +48,24 @@ public override bool Execute () return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result; var dir = Path.GetDirectoryName (OutputLibrary); + Directory.CreateDirectory (dir); - if (!Directory.Exists (dir)) - Directory.CreateDirectory (dir); + var env = new Dictionary { + { "SDKROOT", SdkRoot }, + }; - if (AppleSdkSettings.XcodeVersion.Major >= 11) - EnvironmentVariables = EnvironmentVariables.CopyAndAdd ($"SDKROOT={SdkRoot}"); + var args = new List (); + args.Add ("-o"); + args.Add (OutputLibrary); + foreach (var item in Items) + args.Add (item.ItemSpec); + + var executable = GetExecutable (args, "metallib", MetalLibPath); + + cancellationTokenSource = new CancellationTokenSource (); + ExecuteAsync (Log, executable, args, environment: env, cancellationToken: cancellationTokenSource.Token).Wait (); - return base.Execute (); + return !Log.HasLoggedErrors; } public bool ShouldCopyToBuildServer (ITaskItem item) => false; @@ -106,12 +74,13 @@ public override bool Execute () public IEnumerable GetAdditionalItemsToBeCopied () => Enumerable.Empty (); - public override void Cancel () + public void Cancel () { - base.Cancel (); - - if (ShouldExecuteRemotely ()) + if (ShouldExecuteRemotely ()) { BuildConnection.CancelAsync (BuildEngine4).Wait (); + } else { + cancellationTokenSource?.Cancel (); + } } } } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs index e17775c17c75..ab5fc5e04ed0 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Tasks; @@ -120,7 +121,7 @@ protected System.Threading.Tasks.Task ExecuteAsync (string fileName, return ExecuteAsync (Log, fileName, arguments, sdkDevPath, environment, mergeOutput, showErrorIfFailure, workingDirectory); } - internal protected static async System.Threading.Tasks.Task ExecuteAsync (TaskLoggingHelper log, string fileName, IList arguments, string? sdkDevPath = null, Dictionary? environment = null, bool mergeOutput = true, bool showErrorIfFailure = true, string? workingDirectory = null) + internal protected static async System.Threading.Tasks.Task ExecuteAsync (TaskLoggingHelper log, string fileName, IList arguments, string? sdkDevPath = null, Dictionary? environment = null, bool mergeOutput = true, bool showErrorIfFailure = true, string? workingDirectory = null, CancellationToken? cancellationToken = null) { // Create a new dictionary if we're given one, to make sure we don't change the caller's dictionary. var launchEnvironment = environment is null ? new Dictionary () : new Dictionary (environment); @@ -128,7 +129,7 @@ internal protected static async System.Threading.Tasks.Task ExecuteAs launchEnvironment ["DEVELOPER_DIR"] = sdkDevPath; log.LogMessage (MessageImportance.Normal, MSBStrings.M0001, fileName, StringUtils.FormatArguments (arguments)); - var rv = await Execution.RunAsync (fileName, arguments, environment: launchEnvironment, mergeOutput: mergeOutput, workingDirectory: workingDirectory); + var rv = await Execution.RunAsync (fileName, arguments, environment: launchEnvironment, mergeOutput: mergeOutput, workingDirectory: workingDirectory, cancellationToken: cancellationToken); log.LogMessage (rv.ExitCode == 0 ? MessageImportance.Low : MessageImportance.High, MSBStrings.M0002, fileName, rv.ExitCode); // Show the output diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index bc155c936ad5..e92e02dae188 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -1398,6 +1398,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. SessionId="$(BuildSessionId)" Condition="'$(IsMacEnabled)' == 'true' and '%(Metal.Identity)' != ''" IntermediateOutputPath="$(DeviceSpecificIntermediateOutputPath)" + MetalPath="$(MetalPath)" MinimumOSVersion="$(_MinimumOSVersion)" ProjectDir="$(MSBuildProjectDirectory)" TargetFrameworkMoniker="$(_ComputedTargetFrameworkMoniker)" @@ -1417,6 +1418,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. SessionId="$(BuildSessionId)" Condition="'$(IsMacEnabled)' == 'true'" Items="@(_SmeltedMetal)" + MetalLibPath="$(MetalLibPath)" SdkDevPath="$(_SdkDevPath)" SdkRoot="$(_SdkRoot)" OutputLibrary="$(_AppResourcesPath)default.metallib"> diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ToolTasksBinPathTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ToolTasksBinPathTest.cs deleted file mode 100644 index 1417c28fbd51..000000000000 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ToolTasksBinPathTest.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xamarin.Tests; - -namespace AppleSdkSettings { - - public static class XcodeVersion { - public static int Major { get { return Configuration.XcodeVersion.Major; } } - } -} - -namespace Xamarin.MacDev.Tasks { - - public class MetalPoker : Metal { - public new string GenerateFullPathToTool () - { - return base.GenerateFullPathToTool (); - } - } - - public class MetalLibPoker : MetalLib { - - public new string GenerateFullPathToTool () - { - return base.GenerateFullPathToTool (); - } - } - - [TestFixture] - public class ToolTasksBinPathTest { - - [Test] - public void MetalBinPathTest () - { - var metalTask = new MetalPoker (); - metalTask.SdkDevPath = string.Empty; - CheckToolBinDir ("metal", metalTask.GenerateFullPathToTool ()); - } - - [Test] - public void MetalLibBinPathTest () - { - var metalLibTask = new MetalLibPoker (); - metalLibTask.SdkDevPath = string.Empty; - CheckToolBinDir ("metallib", metalLibTask.GenerateFullPathToTool ()); - } - - public void CheckToolBinDir (string taskName, string binDirToCheck) - { - var psi = new ProcessStartInfo ("xcrun") { - Arguments = $"-f {taskName}", - UseShellExecute = false, - CreateNoWindow = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - }; - psi.EnvironmentVariables ["DEVELOPER_DIR"] = Configuration.xcode_root; - psi.EnvironmentVariables.Remove ("XCODE_DEVELOPER_DIR_PATH"); // VSfM sets XCODE_DEVELOPER_DIR_PATH, which confuses the command-line tools if it doesn't match xcode-select, so just unset it. - var proc = Process.Start (psi); - - string output = proc.StandardOutput.ReadToEnd (); - string err = proc.StandardError.ReadToEnd (); - - Assert.True (output.Contains (binDirToCheck), err); - } - } -} From a123e460f5fe951151823e937a2f967e84b71a06 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 12:30:13 +0200 Subject: [PATCH 071/155] [watchOS] Remove the build logic for watchOS. (#21440) --- Make.config | 14 --- configure | 11 --- msbuild/Makefile | 67 +------------ runtime/Makefile | 33 +------ tests/cecil-tests/Helper.cs | 5 - tests/common/Configuration.cs | 7 -- tests/common/ConfigurationNUnit.cs | 9 -- tests/dotnet/UnitTests/ProjectTest.cs | 22 ----- .../FrameworkListTest.cs | 5 - ...eratePlistTaskTests_watchOS_WatchKitApp.cs | 22 ----- ...listTaskTests_watchOS_WatchKitExtension.cs | 29 ------ .../ProjectsTests/CodesignAppBundle.cs | 94 ------------------- .../ProjectsTests/Extensions/WatchKit.cs | 25 ----- .../ProjectsTests/Extensions/WatchKit2.cs | 33 ------- tests/mtouch/MTouch.cs | 31 ------ tests/test-libraries/Makefile | 31 +----- .../SwiftTest-Info-watchos.plist | 56 ----------- .../SwiftTest-Info-watchsimulator.plist | 56 ----------- tests/test-libraries/XTest-Info-watchos.plist | 56 ----------- .../XTest-Info-watchsimulator.plist | 56 ----------- .../frameworks/Info-watchos.plist | 56 ----------- .../frameworks/Info-watchsimulator.plist | 56 ----------- tests/test-libraries/libSwiftTest.swift | 2 +- tests/test-libraries/libtest.h | 5 - tests/test-libraries/libtest.m | 3 +- tests/test-libraries/testgenerator.cs | 2 +- tests/xharness/Harness.cs | 4 +- tests/xharness/IHarness.cs | 1 - tests/xharness/Jenkins/TestSelector.cs | 5 - tools/Makefile | 3 - tools/compare-commits.sh | 1 - .../scripts/TestConfiguration.Tests.ps1 | 41 -------- .../scripts/bash/configure-platforms.sh | 6 -- tools/mtouch/Makefile | 10 -- 34 files changed, 10 insertions(+), 847 deletions(-) delete mode 100644 tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitApp.cs delete mode 100644 tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitExtension.cs delete mode 100644 tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit.cs delete mode 100644 tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit2.cs delete mode 100644 tests/test-libraries/SwiftTest-Info-watchos.plist delete mode 100644 tests/test-libraries/SwiftTest-Info-watchsimulator.plist delete mode 100644 tests/test-libraries/XTest-Info-watchos.plist delete mode 100644 tests/test-libraries/XTest-Info-watchsimulator.plist delete mode 100644 tests/test-libraries/frameworks/Info-watchos.plist delete mode 100644 tests/test-libraries/frameworks/Info-watchsimulator.plist diff --git a/Make.config b/Make.config index 41cdcff7784b..7e84730ea8de 100644 --- a/Make.config +++ b/Make.config @@ -314,11 +314,9 @@ EXTRA_SIMULATORS=com.apple.pkg.iPhoneSimulatorSDK15_0 com.apple.pkg.AppleTVSimul INCLUDE_IOS=1 INCLUDE_MAC=1 -INCLUDE_WATCH=1 INCLUDE_TVOS=1 INCLUDE_MACCATALYST=1 INCLUDE_DEVICE=1 -INCLUDE_DOTNET_WATCHOS= INCLUDE_XAMARIN_LEGACY= INCLUDE_HOTRESTART=1 @@ -810,18 +808,6 @@ DOTNET_TVOS_RUNTIME_IDENTIFIERS_64+=$(DOTNET_TVOS_RUNTIME_IDENTIFIERS) endif # ENABLE_DOTNET endif -ifdef INCLUDE_DOTNET_WATCHOS -DOTNET_PLATFORMS+=watchOS -ifdef INCLUDE_DEVICE -DOTNET_WATCHOS_RUNTIME_IDENTIFIERS=watchos-arm watchos-x86 -DOTNET_WATCHOS_RUNTIME_IDENTIFIERS_32=watchos-arm watchos-x86 -else -DOTNET_WATCHOS_RUNTIME_IDENTIFIERS=watchos-x86 watchos-x64 -DOTNET_WATCHOS_RUNTIME_IDENTIFIERS_32=watchos-x86 -DOTNET_WATCHOS_RUNTIME_IDENTIFIERS_64=watchos-x64 -endif -endif - ifdef INCLUDE_MACCATALYST ifdef ENABLE_DOTNET DOTNET_PLATFORMS+=MacCatalyst diff --git a/configure b/configure index 4fa03300a985..83f2ec39fb81 100755 --- a/configure +++ b/configure @@ -66,7 +66,6 @@ while test "x$1" != x; do echo "INCLUDE_MAC=" >> $CONFIGURED_FILE echo "INCLUDE_IOS=" >> $CONFIGURED_FILE echo "INCLUDE_TVOS=" >> $CONFIGURED_FILE - echo "INCLUDE_WATCH=" >> $CONFIGURED_FILE echo "INCLUDE_MACCATALYST=" >> $CONFIGURED_FILE echo "Disabled all platforms" shift @@ -105,16 +104,6 @@ while test "x$1" != x; do echo "tvOS Build enabled" shift ;; - --disable-watchos) - echo "INCLUDE_WATCH=" >> $CONFIGURED_FILE - echo "watchOS Build disabled" - shift - ;; - --enable-watchos) - echo "INCLUDE_WATCH=1" >> $CONFIGURED_FILE - echo "watchOS Build enabled" - shift - ;; --disable-maccatalyst) echo "INCLUDE_MACCATALYST=" >> $CONFIGURED_FILE echo "Mac Catalyst Build disabled" diff --git a/msbuild/Makefile b/msbuild/Makefile index f614321fc427..9cc8d6cc1731 100644 --- a/msbuild/Makefile +++ b/msbuild/Makefile @@ -9,19 +9,16 @@ endif ifdef INCLUDE_TVOS BUILD_IOS=1 endif -ifdef INCLUDE_WATCH -BUILD_IOS=1 -endif ifdef INCLUDE_MACCATALYST BUILD_IOS=1 endif # -# To add a new MSBuild assembly, add the base name to the corresponding [IOS|MAC|WATCH]_[BINDING]_TASK_ASSEMBLIES variable. +# To add a new MSBuild assembly, add the base name to the corresponding [IOS|MAC]_[BINDING]_TASK_ASSEMBLIES variable. # # New .targets and .props files are picked up automatically if they're in a directory with already # existing .targets or .props files. If .targets or .props are added in a new directory, add that -# directory using a wildcard function to the corresponding [IOS|MAC|WATCH]_TARGETS variable. +# directory using a wildcard function to the corresponding [IOS|MAC]_TARGETS variable. # ## @@ -144,44 +141,6 @@ MSBUILD_DIRECTORIES += $(MACCATALYST_DIRECTORIES) MSBUILD_SYMLINKS += symlinks-maccatalyst endif -## -## XW definitions -## - -WATCH_TARGETS = \ - $(wildcard Xamarin.Shared/Xamarin.WatchOS.*.props) \ - $(wildcard Xamarin.Shared/Xamarin.WatchOS.*.targets) \ - Xamarin.MacDev.Tasks/NoCode.cs \ - $(wildcard Xamarin.Shared/Xamarin.ImplicitFacade.targets) \ - -WATCH_DIRECTORIES = \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/RedistList \ - $(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild-frameworks/Xamarin.WatchOS/v1.0/RedistList \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS \ - -# XW symlinks the entire $(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS directory to -# /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/WatchOS instead of -# each separate file (like XI does). - -WATCH_SYMLINKS = \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/RedistList/FrameworkList.xml \ - $(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild-frameworks/Xamarin.WatchOS/v1.0/RedistList/FrameworkList.xml \ - $(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/WatchOS \ - -WATCH_PRODUCTS = \ - $(WATCH_SYMLINKS) \ - $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS/FrameworkList.xml \ - $(foreach target,$(WATCH_TARGETS) ,$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS/$(notdir $(target))) \ - -all-watch: $(WATCH_PRODUCTS) -symlinks-watch: $(WATCH_SYMLINKS) - -ifdef INCLUDE_WATCH -MSBUILD_PRODUCTS += all-watch -MSBUILD_DIRECTORIES += $(WATCH_DIRECTORIES) -MSBUILD_SYMLINKS += symlinks-watch -endif - ## ## Xamarin.TVOS definitions ## @@ -333,25 +292,6 @@ $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.MacCatalyst/RedistList/Framew $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/MacCatalyst/%: Xamarin.Shared/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/MacCatalyst $(Q) install -m 644 $< $@ -## -## XW -## - -$(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild-frameworks/Xamarin.WatchOS/v1.0/RedistList/FrameworkList.xml: | $(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild-frameworks/Xamarin.WatchOS/v1.0/RedistList - $(Q) ln -fs $(IOS_TARGETDIR)/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/msbuild/WatchOS/$(notdir $@) $@ - -$(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/WatchOS: | $(IOS_DESTDIR)/Library/Frameworks/Mono.framework/External/xbuild/Xamarin - $(Q) ln -Fhs $(IOS_TARGETDIR)/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/msbuild/WatchOS $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS/FrameworkList.xml: Xamarin.Shared/Xamarin.WatchOS-FrameworkList.xml.in Makefile | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS - $(Q) sed 's@%TargetFrameworkDirectory%@$(IOS_TARGETDIR)/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/mono/Xamarin.WatchOS@' $< > $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/RedistList/FrameworkList.xml: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS/FrameworkList.xml | $(WATCH_DIRECTORIES) - $(Q) ln -fs $(IOS_TARGETDIR)/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/msbuild/WatchOS/$(notdir $@) $@ - -$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS/%: Xamarin.Shared/% | $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/msbuild/WatchOS - $(Q) install -m 644 $< $@ - ## ## Xamarin.TVOS ## @@ -415,11 +355,10 @@ $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/msbuild/%: Xamarin.Localization.M ## net5 targets ## ## -# tvOS and watchOS ships most of the iOS targets as well (for now, we don't need all of these, so this is optimizable) +# tvOS ships most of the iOS targets as well (for now, we don't need all of these, so this is optimizable) DOTNET_SHARED_FILES = $(IOS_TARGETS) $(IOS_BINDING_TARGETS) $(foreach dll,$(IOS_TASK_ASSEMBLIES),$(dll).dll $(dll).pdb) DOTNET_IOS_FILES = $(DOTNET_SHARED_FILES) FrameworkList.xml DOTNET_TVOS_FILES = $(TVOS_TARGETS) FrameworkList.xml -DOTNET_WATCHOS_FILES = $(WATCH_TARGETS) FrameworkList.xml DOTNET_MACOS_FILES = $(MAC_TARGETS) $(MAC_BINDING_TARGETS) $(foreach dll,$(MAC_TASK_ASSEMBLIES),$(dll).dll $(dll).pdb) FrameworkList.xml DOTNET_MACCATALYST_FILES = $(MACCATALYST_TARGETS) FrameworkList.xml diff --git a/runtime/Makefile b/runtime/Makefile index 58092f2e841f..72ca9932f4d9 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -69,14 +69,14 @@ bindings-generated.m: $(BINDINGS_GENERATOR) # our makefiles don't support building the same source file multiple times with different defines, # so just symlink extension-main.m to another file and compile that instead. -app-main.m watchextension-main.m tvextension-main.m: extension-main.m +app-main.m tvextension-main.m: extension-main.m $(Q_LN) ln -fs $< $@ product.h: product.in.h Makefile $(GIT_DIRECTORY)/index $(Q) sed -e 's/@PRODUCT_HASH@/$(CURRENT_HASH_LONG)/' $< > $@.tmp $(Q) mv $@.tmp $@ # -# MonoTouch defines (used for all MonoTouch platforms: iOS, WatchOS and TVOS) +# MonoTouch defines (used for all MonoTouch platforms: iOS and TVOS) # MONOTOUCH_SOURCES = \ @@ -166,17 +166,6 @@ endif $(eval $(call FrameworkTemplate,iphonesimulator,IOSSIMULATOR,$(IOS_SIMULATOR_ARCHITECTURES))) endif -ifdef INCLUDE_WATCH -ifdef INCLUDE_DEVICE -ifdef WATCHOS_SUPPORTS_32BIT_DEVICE_ARCHITECTURES -$(eval $(call FrameworkTemplate,watchos,WATCHOS,armv7k arm64_32)) -else -$(eval $(call FrameworkTemplate,watchos,WATCHOS,arm64_32)) -endif -endif -$(eval $(call FrameworkTemplate,watchsimulator,WATCHSIMULATOR,x86)) -endif - ifdef INCLUDE_TVOS ifdef INCLUDE_DEVICE $(eval $(call FrameworkTemplate,tvos,TVOS,arm64)) @@ -241,17 +230,6 @@ ifdef INCLUDE_MACCATALYST $(eval $(call PlatformTemplate,maccatalyst,MACCATALYST,x86_64)) endif -ifdef INCLUDE_WATCH -ifdef INCLUDE_DEVICE -ifdef WATCHOS_SUPPORTS_32BIT_DEVICE_ARCHITECTURES -$(eval $(call PlatformTemplate,watchos,WATCHOS,armv7k arm64_32)) -else -$(eval $(call PlatformTemplate,watchos,WATCHOS,arm64_32)) -endif -endif -$(eval $(call PlatformTemplate,watchsimulator,WATCHSIMULATOR,x86 x86_64)) -endif - ifdef INCLUDE_TVOS ifdef INCLUDE_DEVICE $(eval $(call PlatformTemplate,tvos,TVOS,arm64)) @@ -269,7 +247,6 @@ endif define LibTemplate $$(foreach arch,$$($(2)_ARCHITECTURES),.libs/$(1)/extension-main.$$(arch).o): EXTRA_DEFINES=-DEXTENSION -$$(foreach arch,$$($(2)_ARCHITECTURES),.libs/$(1)/watchextension-main.$$(arch).o): EXTRA_DEFINES=-DWATCH_EXTENSION $$(foreach arch,$$($(2)_ARCHITECTURES),.libs/$(1)/tvextension-main.$$(arch).o): EXTRA_DEFINES=-DTV_EXTENSION .libs/$(1)/libextension.%.a: .libs/$(1)/extension-main.%.o @@ -322,8 +299,6 @@ endef $(eval $(call LibTemplate,iphoneos,IPHONEOS)) $(eval $(call LibTemplate,iphonesimulator,IOSSIMULATOR)) $(eval $(call LibTemplate,maccatalyst,MACCATALYST)) -$(eval $(call LibTemplate,watchos,WATCHOS)) -$(eval $(call LibTemplate,watchsimulator,WATCHSIMULATOR)) $(eval $(call LibTemplate,tvos,TVOS)) $(eval $(call LibTemplate,tvsimulator,TVSIMULATOR)) @@ -406,10 +381,6 @@ $(eval $(call LibXamarinTemplate,iphonesimulator,IOSSIMULATOR)) $(eval $(call LibXamarinTemplate,iphonesimulator,IOSSIMULATOR,_DEBUG,-debug)) $(eval $(call LibXamarinTemplate,maccatalyst,MACCATALYST)) $(eval $(call LibXamarinTemplate,maccatalyst,MACCATALYST,_DEBUG,-debug)) -$(eval $(call LibXamarinTemplate,watchos,WATCHOS)) -$(eval $(call LibXamarinTemplate,watchos,WATCHOS,_DEBUG,-debug)) -$(eval $(call LibXamarinTemplate,watchsimulator,WATCHSIMULATOR)) -$(eval $(call LibXamarinTemplate,watchsimulator,WATCHSIMULATOR,_DEBUG,-debug)) $(eval $(call LibXamarinTemplate,tvos,TVOS)) $(eval $(call LibXamarinTemplate,tvos,TVOS,_DEBUG,-debug)) $(eval $(call LibXamarinTemplate,tvsimulator,TVSIMULATOR)) diff --git a/tests/cecil-tests/Helper.cs b/tests/cecil-tests/Helper.cs index e5d32d0ed35a..67b01aaaecf4 100644 --- a/tests/cecil-tests/Helper.cs +++ b/tests/cecil-tests/Helper.cs @@ -449,11 +449,6 @@ static IEnumerable PlatformAssemblies { yield return Path.Combine (Configuration.MonoTouchRootDirectory, "lib", "64bits", "iOS", "Xamarin.iOS.dll"); } - if (Configuration.include_watchos) { - // XamarinWatchOSDll is stripped of its IL - yield return Path.Combine (Configuration.MonoTouchRootDirectory, "lib", "32bits", "watchOS", "Xamarin.WatchOS.dll"); - } - if (Configuration.include_tvos) { // XamarinTVOSDll is stripped of it's IL yield return Path.Combine (Configuration.MonoTouchRootDirectory, "lib", "64bits", "tvOS", "Xamarin.TVOS.dll"); diff --git a/tests/common/Configuration.cs b/tests/common/Configuration.cs index 2d2935ef367d..741c1c2fd21d 100644 --- a/tests/common/Configuration.cs +++ b/tests/common/Configuration.cs @@ -40,8 +40,6 @@ static partial class Configuration { public static bool include_ios; public static bool include_mac; public static bool include_tvos; - public static bool include_watchos; - public static bool include_dotnet_watchos; public static bool include_maccatalyst; public static bool include_device; public static bool include_dotnet; @@ -297,8 +295,6 @@ static Configuration () include_ios = !string.IsNullOrEmpty (GetVariable ("INCLUDE_IOS", "")); include_mac = !string.IsNullOrEmpty (GetVariable ("INCLUDE_MAC", "")); include_tvos = !string.IsNullOrEmpty (GetVariable ("INCLUDE_TVOS", "")); - include_watchos = !string.IsNullOrEmpty (GetVariable ("INCLUDE_WATCH", "")); - include_dotnet_watchos = !string.IsNullOrEmpty (GetVariable ("INCLUDE_DOTNET_WATCH", "")); include_maccatalyst = !string.IsNullOrEmpty (GetVariable ("INCLUDE_MACCATALYST", "")); include_device = !string.IsNullOrEmpty (GetVariable ("INCLUDE_DEVICE", "")); include_dotnet = !string.IsNullOrEmpty (GetVariable ("ENABLE_DOTNET", "")); @@ -331,7 +327,6 @@ static Configuration () Console.WriteLine (" INCLUDE_IOS={0}", include_ios); Console.WriteLine (" INCLUDE_MAC={0}", include_mac); Console.WriteLine (" INCLUDE_TVOS={0}", include_tvos); - Console.WriteLine (" INCLUDE_WATCHOS={0}", include_watchos); Console.WriteLine (" INCLUDE_MACCATALYST={0}", include_maccatalyst); Console.WriteLine (" ENABLE_DOTNET={0}", include_dotnet); } @@ -901,8 +896,6 @@ public static IEnumerable GetIncludedPlatforms (bool dotnet) yield return ApplePlatform.MacOSX; if (include_maccatalyst) yield return ApplePlatform.MacCatalyst; - if (include_watchos && !dotnet) - yield return ApplePlatform.WatchOS; } public static IEnumerable GetAllPlatforms (bool dotnet) diff --git a/tests/common/ConfigurationNUnit.cs b/tests/common/ConfigurationNUnit.cs index 9e1531be0c84..885d91cf844b 100644 --- a/tests/common/ConfigurationNUnit.cs +++ b/tests/common/ConfigurationNUnit.cs @@ -84,15 +84,6 @@ public static void IgnoreIfIgnoredPlatform (ApplePlatform platform) if (!include_tvos) Assert.Ignore ("tvOS is not included in this build"); break; - case ApplePlatform.WatchOS: - if (!include_watchos) - Assert.Ignore ("watchOS is not included in this build"); -#if NET - if (!include_dotnet_watchos) - Assert.Ignore ("watchOS is not included in this build"); -#endif - - break; case ApplePlatform.MacOSX: if (!include_mac) Assert.Ignore ("macOS is not included in this build"); diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index 5e881d167ffc..d84277be6802 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -859,16 +859,6 @@ public void LibraryReferencingBindingLibrary (ApplePlatform platform) if (rx == "bindings-framework-test") { foreach (var lib in new string [] { "XStaticArTest", "XStaticObjectTest" }) { - addHere = Configuration.include_watchos ? mustHaveContents : mayHaveContents; - addHere.AddRange (new string [] { - $"{lib}.xcframework/watchos-arm64_32_armv7k", - $"{lib}.xcframework/watchos-arm64_32_armv7k/{lib}.framework", - $"{lib}.xcframework/watchos-arm64_32_armv7k/{lib}.framework/{lib}", - $"{lib}.xcframework/watchos-x86_64-simulator", - $"{lib}.xcframework/watchos-x86_64-simulator/{lib}.framework", - $"{lib}.xcframework/watchos-x86_64-simulator/{lib}.framework/{lib}", - }); - addHere = Configuration.include_tvos ? mustHaveContents : mayHaveContents; addHere.AddRange (new string [] { $"{lib}.xcframework/tvos-arm64", @@ -967,18 +957,6 @@ public void LibraryReferencingBindingLibrary (ApplePlatform platform) "XTest.xcframework/tvos-arm64_x86_64-simulator/XTest.framework/XTest", }); - addHere = Configuration.include_watchos ? mustHaveContents : mayHaveContents; - addHere.AddRange (new string [] { - "XTest.xcframework/watchos-arm64_32_armv7k", - "XTest.xcframework/watchos-arm64_32_armv7k/XTest.framework", - "XTest.xcframework/watchos-arm64_32_armv7k/XTest.framework/Info.plist", - "XTest.xcframework/watchos-arm64_32_armv7k/XTest.framework/XTest", - "XTest.xcframework/watchos-x86_64-simulator", - "XTest.xcframework/watchos-x86_64-simulator/XTest.framework", - "XTest.xcframework/watchos-x86_64-simulator/XTest.framework/Info.plist", - "XTest.xcframework/watchos-x86_64-simulator/XTest.framework/XTest", - }); - var missing = mustHaveContents.ToHashSet ().Except (zipContents); Assert.That (missing, Is.Empty, "No missing files"); diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/FrameworkListTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/FrameworkListTest.cs index cd6218df2379..45d50c328686 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/FrameworkListTest.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/FrameworkListTest.cs @@ -13,7 +13,6 @@ namespace Xamarin.MacDev.Tasks { public class FrameworkListTests { [TestCase ("Xamarin.iOS-FrameworkList.xml.in")] [TestCase ("Xamarin.TVOS-FrameworkList.xml.in")] - [TestCase ("Xamarin.WatchOS-FrameworkList.xml.in")] [TestCase ("Xamarin.Mac-Full-FrameworkList.xml.in")] [TestCase ("Xamarin.Mac-Mobile-FrameworkList.xml.in")] public void CheckFrameworkListFile (string frameworkListFile) @@ -31,10 +30,6 @@ public void CheckFrameworkListFile (string frameworkListFile) if (!Configuration.include_tvos) Assert.Inconclusive ("include_tvos is disabled"); break; - case "Xamarin.WatchOS": - if (!Configuration.include_watchos) - Assert.Inconclusive ("include_watchos is disabled"); - break; case "Xamarin.Mac": if (!Configuration.include_mac) Assert.Inconclusive ("include_mac is disabled"); diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitApp.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitApp.cs deleted file mode 100644 index 0092621f708f..000000000000 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitApp.cs +++ /dev/null @@ -1,22 +0,0 @@ -using NUnit.Framework; - -namespace Xamarin.MacDev.Tasks { - [TestFixture (false)] - public class GeneratePlistTaskTests_watchOS_WatchKitApp : GeneratePlistTaskTests_watchOS { - public GeneratePlistTaskTests_watchOS_WatchKitApp (bool isDotNet) - : base (isDotNet) - { - } - - protected override void ConfigureTask (bool isDotNet) - { - base.ConfigureTask (isDotNet); - Task.IsWatchApp = true; - } - - public override void XamarinVersion () - { - // WatchKit App doesn't require the com.xamarin.ios key. - } - } -} diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitExtension.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitExtension.cs deleted file mode 100644 index ab63451577c3..000000000000 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GeneratePlistTaskTests/GeneratePlistTaskTests_watchOS_WatchKitExtension.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Linq; -using NUnit.Framework; -using Xamarin.MacDev; - -namespace Xamarin.MacDev.Tasks { - [TestFixture (false)] - public class GeneratePlistTaskTests_watchOS_WatchKitExtension : GeneratePlistTaskTests_watchOS { - public GeneratePlistTaskTests_watchOS_WatchKitExtension (bool isDotNet) - : base (isDotNet) - { - } - - protected override void ConfigureTask (bool isDotNet) - { - base.ConfigureTask (isDotNet); - Task.IsWatchExtension = true; - } - - /// - /// watchOS 2 WatchKitExtension projects shouldn't have the UIRequiredDeviceCapabilities watch-companion value defined. - /// As this is the only value added to UIRequiredDeviceCapabilities for a watchOS project, the test passes if undefined. - /// - [Test] - public void NoWatchCompanion () - { - Assert.That (CompiledPlist.ContainsKey (ManifestKeys.UIRequiredDeviceCapabilities) == false, "#1"); - } - } -} diff --git a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/CodesignAppBundle.cs b/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/CodesignAppBundle.cs index 0699ebb458d4..a57513b1b989 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/CodesignAppBundle.cs +++ b/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/CodesignAppBundle.cs @@ -46,12 +46,6 @@ void AssertProperlyCodesigned (bool expected) foreach (var appex in Directory.EnumerateDirectories (AppBundlePath, "*.appex", SearchOption.AllDirectories)) Assert.AreEqual (expected, IsCodesigned (appex), "{0} is not properly codesigned.", appex); - - var watchDir = Path.Combine (AppBundlePath, "Watch"); - if (Directory.Exists (watchDir)) { - foreach (var watchApp in Directory.EnumerateDirectories (watchDir, "*.app", SearchOption.TopDirectoryOnly)) - Assert.AreEqual (expected, IsCodesigned (watchApp), "{0} is not properly codesigned.", watchApp); - } } [Test] @@ -154,93 +148,5 @@ public void CodesignAfterModifyingAppExtensionTest () File.WriteAllText (viewController, text); } } - - [Test] - public void RebuildWatchAppNoChanges () - { - Configuration.IgnoreIfIgnoredPlatform (ApplePlatform.iOS); - Configuration.IgnoreIfIgnoredPlatform (ApplePlatform.WatchOS); - Configuration.AssertLegacyXamarinAvailable (); // Investigate whether this test should be ported to .NET - - bool expectedCodesignResults = Platform != "iPhoneSimulator"; - - BuildProject ("MyWatch2Container"); - - AssertProperlyCodesigned (expectedCodesignResults); - - EnsureFilestampChange (); - - // Rebuild w/ no changes - BuildProject ("MyWatch2Container", clean: false); - - // make sure everything is still codesigned properly - AssertProperlyCodesigned (expectedCodesignResults); - - if (Platform == "iPhone") { - // make sure the dSYMs exist - - var mainDsymDir = Path.GetFullPath (Path.Combine (AppBundlePath, "..", "MyWatch2Container.app.dSYM")); - Assert.That (mainDsymDir, Does.Exist, "MyWatch2Container dSYMs not found"); - - var appexDsymDir = Path.GetFullPath (Path.Combine (AppBundlePath, "..", "MyWatchKit2Extension.appex.dSYM")); - Assert.That (appexDsymDir, Does.Exist, "MyWatchKit2Extension dSYMs not found"); - - var appex2DsymDir = Path.GetFullPath (Path.Combine (AppBundlePath, "..", "MyWatchKit2IntentsExtension.appex.dSYM")); - Assert.That (appex2DsymDir, Does.Exist, "MyWatchKit2IntentsExtension/ dSYMs not found"); - } - } - - [Test] - public void CodesignAfterModifyingWatchApp2Test () - { - Configuration.IgnoreIfIgnoredPlatform (ApplePlatform.iOS); - Configuration.IgnoreIfIgnoredPlatform (ApplePlatform.WatchOS); - Configuration.AssertLegacyXamarinAvailable (); // Investigate whether this test should be ported to .NET - - var csproj = BuildProject ("MyWatch2Container", clean: true).ProjectCSProjPath; - var testsDir = Path.GetDirectoryName (Path.GetDirectoryName (csproj)); - var appexProjectDir = Path.Combine (testsDir, "MyWatchKit2Extension"); - var viewController = Path.Combine (appexProjectDir, "InterfaceController.cs"); - var mainExecutable = Path.Combine (AppBundlePath, "MyWatch2Container"); - bool expectedCodesignResults = Platform != "iPhoneSimulator"; - var timestamp = File.GetLastWriteTimeUtc (mainExecutable); - var text = File.ReadAllText (viewController); - - AssertProperlyCodesigned (expectedCodesignResults); - - EnsureFilestampChange (); - - // replace "bool imageFound = false;" with "bool imageFound = true;" so that we force the appex to get rebuilt - text = text.Replace ("{0} awake with context", "{0} The Awakening..."); - File.WriteAllText (viewController, text); - - try { - BuildProject ("MyWatch2Container", clean: false); - - AssertProperlyCodesigned (expectedCodesignResults); - - var newTimestamp = File.GetLastWriteTimeUtc (mainExecutable); - - // make sure that the main app bundle was codesigned due to the changes in the appex - Assert.IsTrue (newTimestamp > timestamp, "The main app bundle does not seem to have been re-codesigned"); - } finally { - // restore the original ActionViewController.cs code... - text = text.Replace ("{0} The Awakening...", "{0} awake with context"); - File.WriteAllText (viewController, text); - } - - if (Platform == "iPhone") { - // make sure the dSYMs exist - - var mainDsymDir = Path.GetFullPath (Path.Combine (AppBundlePath, "..", "MyWatch2Container.app.dSYM")); - Assert.That (mainDsymDir, Does.Exist, "MyWatch2Container dSYMs not found"); - - var appexDsymDir = Path.GetFullPath (Path.Combine (AppBundlePath, "..", "MyWatchKit2Extension.appex.dSYM")); - Assert.That (appexDsymDir, Does.Exist, "MyWatchKit2Extension dSYMs not found"); - - var appex2DsymDir = Path.GetFullPath (Path.Combine (AppBundlePath, "..", "MyWatchKit2IntentsExtension.appex.dSYM")); - Assert.That (appex2DsymDir, Does.Exist, "MyWatchKit2IntentsExtension/ dSYMs not found"); - } - } } } diff --git a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit.cs b/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit.cs deleted file mode 100644 index 26a5f8e1882b..000000000000 --- a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit.cs +++ /dev/null @@ -1,25 +0,0 @@ -using NUnit.Framework; - -using Xamarin.Tests; -using Xamarin.Utils; - -namespace Xamarin.MacDev.Tasks { - [TestFixture ("iPhone")] - [TestFixture ("iPhoneSimulator")] - public class WatchKit : ExtensionTestBase { - - public WatchKit (string platform) : base (platform) - { - } - - [Test] - public void BasicTest () - { - Configuration.IgnoreIfIgnoredPlatform (ApplePlatform.WatchOS); - Configuration.AssertLegacyXamarinAvailable (); - - BuildExtension ("MyWatchApp", "MyWatchKitExtension", expectedErrorCount: 1); - Assert.AreEqual ("Xamarin.iOS 14+ does not support watchOS 1 apps. Please migrate your project to watchOS 2+.", Engine.Logger.ErrorEvents [0].Message, "WK 1 error message"); - } - } -} diff --git a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit2.cs b/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit2.cs deleted file mode 100644 index 4e0af66c6dd3..000000000000 --- a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/Extensions/WatchKit2.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.IO; - -using NUnit.Framework; - -using Xamarin.Tests; -using Xamarin.Utils; - -namespace Xamarin.MacDev.Tasks { - [TestFixture ("iPhone")] - [TestFixture ("iPhoneSimulator")] - public class WatchKit2 : ExtensionTestBase { - - public WatchKit2 (string platform) : base (platform) - { - } - - [Test] - public void BasicTest () - { - Configuration.IgnoreIfIgnoredPlatform (ApplePlatform.WatchOS); - Configuration.AssertLegacyXamarinAvailable (); // Investigate whether this test should be ported to .NET - - BuildExtension ("MyWatchApp2", "MyWatchKit2Extension"); - } - - public override string TargetFrameworkIdentifier { - get { - return "Xamarin.WatchOS"; - } - } - } -} diff --git a/tests/mtouch/MTouch.cs b/tests/mtouch/MTouch.cs index e8afc9e148d2..4577b916752f 100644 --- a/tests/mtouch/MTouch.cs +++ b/tests/mtouch/MTouch.cs @@ -1028,37 +1028,6 @@ public void MT0075 () } } - [Test] - [TestCase (Profile.watchOS)] - [TestCase (Profile.tvOS)] - public void MT0076 (Profile profile) - { - if (!Configuration.include_watchos || !Configuration.include_tvos) - Assert.Ignore ("This test requires WatchOS and TVOS to be enabled."); - - using (var mtouch = new MTouchTool ()) { - mtouch.Profile = profile; - mtouch.Abi = MTouchTool.None; - mtouch.CreateTemporaryApp (); - mtouch.AssertExecuteFailure (MTouchAction.BuildDev, "build"); - mtouch.AssertError (76, $"No architecture specified (using the --abi argument). An architecture is required for {GetPlatformName (profile)} projects."); - } - } - - [Test] - public void MT0077 () - { - if (!Configuration.include_watchos) - Assert.Ignore ("This test requires WatchOS and TVOS to be enabled."); - - using (var mtouch = new MTouchTool ()) { - mtouch.Profile = Profile.watchOS; - mtouch.CreateTemporaryApp (); - mtouch.AssertExecuteFailure (MTouchAction.BuildSim, "build"); - mtouch.AssertError (77, "WatchOS projects must be extensions."); - } - } - [Test] [TestCase (Profile.tvOS)] [TestCase (Profile.watchOS)] diff --git a/tests/test-libraries/Makefile b/tests/test-libraries/Makefile index 61725d4db362..c50be1a4ad85 100644 --- a/tests/test-libraries/Makefile +++ b/tests/test-libraries/Makefile @@ -235,18 +235,6 @@ ifdef INCLUDE_TVOS $(eval $(call Template,tvsimulator,TVSIMULATOR,x86_64 arm64,AppleTVSimulator,-mtvos-simulator-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(SIMULATORTV_SDK))) $(eval $(call Template,tvos,TVOS,arm64,AppleTVOS,-mtvos-version-min=$(MIN_TVOS_SDK_VERSION) -isysroot $(DEVICETV_SDK))) endif -ifdef INCLUDE_WATCH -ifdef WATCHOS_SUPPORTS_32BIT_SIMULATOR_ARCHITECTURES -$(eval $(call Template,watchsimulator,WATCHSIMULATOR,x86 x86_64,WatchSimulator,-mwatchos-simulator-version-min=$(MIN_WATCH_OS_VERSION) -isysroot $(SIMULATORWATCH_SDK))) -else -$(eval $(call Template,watchsimulator,WATCHSIMULATOR,x86_64,WatchSimulator,-mwatchos-simulator-version-min=$(MIN_WATCH_OS_VERSION) -isysroot $(SIMULATORWATCH_SDK))) -endif -ifdef WATCHOS_SUPPORTS_32BIT_DEVICE_ARCHITECTURES -$(eval $(call Template,watchos,WATCHOS,armv7k arm64_32,WatchOS,-mwatchos-version-min=$(MIN_WATCHOS_SDK_VERSION) -isysroot $(DEVICEWATCH_SDK))) -else -$(eval $(call Template,watchos,WATCHOS,arm64_32,WatchOS,-mwatchos-version-min=$(MIN_WATCHOS_SDK_VERSION) -isysroot $(DEVICEWATCH_SDK))) -endif -endif ifdef INCLUDE_MAC $(eval $(call Template,macos,MACOS,x86_64 arm64,MacOSX,-mmacosx-version-min=$(MIN_OSX_VERSION_FOR_MAC) -isysroot $(XCODE_DEVELOPER_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_SDK_VERSION).sdk)) endif @@ -254,7 +242,7 @@ ifdef INCLUDE_MACCATALYST $(eval $(call Template,maccatalyst,MACCATALYST,x86_64 arm64,MacCatalyst,$(MACCATALYST_COMMON_CFLAGS))) endif -.libs/ios-fat .libs/tvos-fat .libs/watchos-fat .libs/maccatalyst-fat .libs/macos-fat: +.libs/ios-fat .libs/tvos-fat .libs/maccatalyst-fat .libs/macos-fat: $(Q) mkdir -p $@ define LibTemplate @@ -276,14 +264,6 @@ ifdef INCLUDE_TVOS $(eval $(call LibTemplate,arm64+x86_64,.libs/tvos/libtest.arm64.o,.libs/tvsimulator/libtest.x86_64.o,tvos-fat,TVOS)) endif -ifdef INCLUDE_WATCH -ifdef WATCHOS_SUPPORTS_32BIT_DEVICE_ARCHITECTURES -ifdef WATCHOS_SUPPORTS_32BIT_SIMULATOR_ARCHITECTURES -$(eval $(call LibTemplate,armv7k+x86,.libs/watchos/libtest.armv7k.o,.libs/watchsimulator/libtest.x86.o,watchos-fat,WATCHOS)) -endif -endif -endif - ifdef INCLUDE_MACCATALYST $(eval $(call LibTemplate,x86_64+arm64,.libs/maccatalyst/libtest.x86_64.o,.libs/maccatalyst/libtest.arm64.o,maccatalyst-fat,MACCATALYST)) endif @@ -339,9 +319,6 @@ $(eval $(call FatFrameworkTemplate,ios-fat,iphoneos,iphonesimulator,IPHONESIMULA ifdef INCLUDE_TVOS $(eval $(call FatFrameworkTemplate,tvos-fat,tvos,tvsimulator,TVSIMULATOR)) endif -ifdef INCLUDE_WATCH -$(eval $(call FatFrameworkTemplate,watchos-fat,watchos,watchsimulator,WATCHSIMULATOR)) -endif ifdef INCLUDE_MACCATALYST $(eval $(call FatFrameworkTemplate,maccatalyst-fat,maccatalyst,maccatalyst,MACCATALYST)) endif @@ -383,9 +360,6 @@ endif ifdef INCLUDE_TVOS XCPLATFORMS+= tvos tvsimulator endif -ifdef INCLUDE_WATCH -XCPLATFORMS+= watchos watchsimulator -endif ifdef INCLUDE_MAC XCPLATFORMS+= macos endif @@ -406,9 +380,6 @@ endif ifdef INCLUDE_TVOS $(eval $(call ZippedFrameworkTemplate,tvos-fat,TVSIMULATOR)) endif -ifdef INCLUDE_WATCH -$(eval $(call ZippedFrameworkTemplate,watchos-fat,WATCHSIMULATOR)) -endif ifdef INCLUDE_MACCATALYST $(eval $(call ZippedFrameworkTemplate,maccatalyst-fat,MACCATALYST)) endif diff --git a/tests/test-libraries/SwiftTest-Info-watchos.plist b/tests/test-libraries/SwiftTest-Info-watchos.plist deleted file mode 100644 index 98092178ebd2..000000000000 --- a/tests/test-libraries/SwiftTest-Info-watchos.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.ios.swifttest - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - SwiftTest - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - SwiftTest - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - WatchOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - watchos - DTPlatformVersion - 2.0 - DTSDKBuild - 12D508 - DTSDKName - watchos2.0 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 4.0 - UIDeviceFamily - - 4 - - - diff --git a/tests/test-libraries/SwiftTest-Info-watchsimulator.plist b/tests/test-libraries/SwiftTest-Info-watchsimulator.plist deleted file mode 100644 index 98092178ebd2..000000000000 --- a/tests/test-libraries/SwiftTest-Info-watchsimulator.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.ios.swifttest - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - SwiftTest - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - SwiftTest - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - WatchOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - watchos - DTPlatformVersion - 2.0 - DTSDKBuild - 12D508 - DTSDKName - watchos2.0 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 4.0 - UIDeviceFamily - - 4 - - - diff --git a/tests/test-libraries/XTest-Info-watchos.plist b/tests/test-libraries/XTest-Info-watchos.plist deleted file mode 100644 index 46684862038b..000000000000 --- a/tests/test-libraries/XTest-Info-watchos.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.ios.xtest - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - XTest - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - XTest - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - WatchOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - watchos - DTPlatformVersion - 2.0 - DTSDKBuild - 12D508 - DTSDKName - watchos2.0 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 4.0 - UIDeviceFamily - - 4 - - - diff --git a/tests/test-libraries/XTest-Info-watchsimulator.plist b/tests/test-libraries/XTest-Info-watchsimulator.plist deleted file mode 100644 index 46684862038b..000000000000 --- a/tests/test-libraries/XTest-Info-watchsimulator.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.ios.xtest - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - XTest - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - XTest - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - WatchOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - watchos - DTPlatformVersion - 2.0 - DTSDKBuild - 12D508 - DTSDKName - watchos2.0 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 4.0 - UIDeviceFamily - - 4 - - - diff --git a/tests/test-libraries/frameworks/Info-watchos.plist b/tests/test-libraries/frameworks/Info-watchos.plist deleted file mode 100644 index 9962985101ed..000000000000 --- a/tests/test-libraries/frameworks/Info-watchos.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.ios.%NAME% - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - %NAME% - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - %NAME% - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - WatchOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - watchos - DTPlatformVersion - 2.0 - DTSDKBuild - 12D508 - DTSDKName - watchos2.0 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 4.0 - UIDeviceFamily - - 4 - - - diff --git a/tests/test-libraries/frameworks/Info-watchsimulator.plist b/tests/test-libraries/frameworks/Info-watchsimulator.plist deleted file mode 100644 index 9962985101ed..000000000000 --- a/tests/test-libraries/frameworks/Info-watchsimulator.plist +++ /dev/null @@ -1,56 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - xamarin.ios.%NAME% - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - %NAME% - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 3.12 - NSPrincipalClass - - CFBundleExecutable - %NAME% - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleSupportedPlatforms - - WatchOS - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12D508 - DTPlatformName - watchos - DTPlatformVersion - 2.0 - DTSDKBuild - 12D508 - DTSDKName - watchos2.0 - DTXcode - 0620 - DTXcodeBuild - 6C131e - MinimumOSVersion - 4.0 - UIDeviceFamily - - 4 - - - diff --git a/tests/test-libraries/libSwiftTest.swift b/tests/test-libraries/libSwiftTest.swift index a49e6a88a429..a674cc709c61 100644 --- a/tests/test-libraries/libSwiftTest.swift +++ b/tests/test-libraries/libSwiftTest.swift @@ -1,7 +1,7 @@ import Foundation @objc(SwiftTestClass) -@available(iOS 15, tvOS 15, macOS 12, macCatalyst 12, watchOS 8, *) +@available(iOS 15, tvOS 15, macOS 12, macCatalyst 12, *) public class SwiftTestClass : NSObject { @objc public func SayHello() -> String { diff --git a/tests/test-libraries/libtest.h b/tests/test-libraries/libtest.h index fa765586d097..2f21a56d2bc9 100644 --- a/tests/test-libraries/libtest.h +++ b/tests/test-libraries/libtest.h @@ -4,10 +4,7 @@ #include "rename.h" -#if !TARGET_OS_WATCH #import -#endif - #import #ifdef __cplusplus @@ -32,11 +29,9 @@ void x_get_matrix_float3x3 (id self, const char *sel, float* r0c0, float* r0c1, void x_get_matrix_float4x4 (id self, const char *sel, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); void x_get_matrix_float4x3 (id self, const char *sel, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3); -#if !TARGET_OS_WATCH void x_mdltransformcomponent_get_local_transform (id self, NSTimeInterval time, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); void x_mdltransform_create_global_transform (MDLObject *object, NSTimeInterval time, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); void x_mdltransform_get_rotation_matrix (MDLTransform *self, NSTimeInterval time, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); -#endif #if TARGET_OS_OSX #define pfloat CGFloat diff --git a/tests/test-libraries/libtest.m b/tests/test-libraries/libtest.m index 527778581999..6964c16f5e1b 100644 --- a/tests/test-libraries/libtest.m +++ b/tests/test-libraries/libtest.m @@ -166,7 +166,7 @@ void x_call_block (x_block_callback block) *r2c2 = rv.columns[2][2]; *r2c3 = rv.columns[3][2]; } -#if !TARGET_OS_WATCH + void x_mdltransformcomponent_get_local_transform (id self, NSTimeInterval time, float* r0c0, float* r0c1, float* r0c2, float* r0c3, @@ -256,7 +256,6 @@ void x_call_block (x_block_callback block) *r3c2 = rv.columns[2][3]; *r3c3 = rv.columns[3][3]; } -#endif // !TARGET_OS_WATCH SCNMatrix4 x_SCNMatrix4MakeTranslation (pfloat tx, pfloat ty, pfloat tz) diff --git a/tests/test-libraries/testgenerator.cs b/tests/test-libraries/testgenerator.cs index 6aa578232032..fe80a5d85112 100644 --- a/tests/test-libraries/testgenerator.cs +++ b/tests/test-libraries/testgenerator.cs @@ -334,7 +334,7 @@ static void WriteFrameworkDefines (StringBuilder w) #define HAVE_COREMEDIA #endif -#if __IOS__ || __WATCHOS__ || __TVOS__ +#if __IOS__ || __TVOS__ #define HAVE_UIKIT #endif diff --git a/tests/xharness/Harness.cs b/tests/xharness/Harness.cs index ffcba7d2e4c3..ebf19afe642e 100644 --- a/tests/xharness/Harness.cs +++ b/tests/xharness/Harness.cs @@ -185,7 +185,7 @@ string MlaunchPath { if (TryGetMlaunchDotnetPath (out var mlaunch)) return mlaunch; - if (INCLUDE_XAMARIN_LEGACY && (INCLUDE_IOS || INCLUDE_TVOS || INCLUDE_WATCH)) + if (INCLUDE_XAMARIN_LEGACY && (INCLUDE_IOS || INCLUDE_TVOS)) return Path.Combine (IOS_DESTDIR, "Library", "Frameworks", "Xamarin.iOS.framework", "Versions", "Current", "bin", "mlaunch"); return $"Not building any mobile platform, so can't provide a location to mlaunch."; @@ -223,7 +223,6 @@ string GetVariable (string variable, string @default = null) public string TVOS_MONO_PATH { get; } // Use same name as in Makefiles, so that a grep finds it. public bool INCLUDE_IOS { get; } public bool INCLUDE_TVOS { get; } - public bool INCLUDE_WATCH { get; } public bool INCLUDE_MAC { get; } public bool INCLUDE_MACCATALYST { get; } public string JENKINS_RESULTS_DIRECTORY { get; } // Use same name as in Makefiles, so that a grep finds it. @@ -299,7 +298,6 @@ public Harness (IResultParser resultParser, HarnessAction action, HarnessConfigu INCLUDE_IOS = IsVariableSet (nameof (INCLUDE_IOS)); INCLUDE_TVOS = IsVariableSet (nameof (INCLUDE_TVOS)); JENKINS_RESULTS_DIRECTORY = GetVariable (nameof (JENKINS_RESULTS_DIRECTORY)); - INCLUDE_WATCH = IsVariableSet (nameof (INCLUDE_WATCH)); INCLUDE_MAC = IsVariableSet (nameof (INCLUDE_MAC)); INCLUDE_MACCATALYST = IsVariableSet (nameof (INCLUDE_MACCATALYST)); MAC_DESTDIR = GetVariable (nameof (MAC_DESTDIR)); diff --git a/tests/xharness/IHarness.cs b/tests/xharness/IHarness.cs index b20f6a2f006e..56d3d575a728 100644 --- a/tests/xharness/IHarness.cs +++ b/tests/xharness/IHarness.cs @@ -34,7 +34,6 @@ public interface IHarness { string TVOS_MONO_PATH { get; } bool INCLUDE_IOS { get; } bool INCLUDE_TVOS { get; } - bool INCLUDE_WATCH { get; } bool INCLUDE_MAC { get; } bool INCLUDE_MACCATALYST { get; } string JENKINS_RESULTS_DIRECTORY { get; } diff --git a/tests/xharness/Jenkins/TestSelector.cs b/tests/xharness/Jenkins/TestSelector.cs index 632734ef94cf..7cb75de37de8 100644 --- a/tests/xharness/Jenkins/TestSelector.cs +++ b/tests/xharness/Jenkins/TestSelector.cs @@ -248,11 +248,6 @@ public void SelectTests (TestSelection selection) selection.SetEnabled (PlatformLabel.iOS, false); } - if (!Harness.INCLUDE_WATCH) { - MainLog?.WriteLine ("The watchOS build is disabled, so any watchOS tests will be disabled as well."); - selection.SetEnabled (PlatformLabel.watchOS, false); - } - if (!Harness.INCLUDE_TVOS) { MainLog?.WriteLine ("The tvOS build is disabled, so any tvOS tests will be disabled as well."); selection.SetEnabled (PlatformLabel.tvOS, false); diff --git a/tools/Makefile b/tools/Makefile index 5a840a4d286d..8a3c97c0bd7e 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -19,9 +19,6 @@ endif ifdef INCLUDE_TVOS INCLUDE_MTOUCH=1 endif -ifdef INCLUDE_WATCH -INCLUDE_MTOUCH=1 -endif ifdef INCLUDE_MACCATALYST INCLUDE_MTOUCH=1 endif diff --git a/tools/compare-commits.sh b/tools/compare-commits.sh index 71b34510ba0c..9d0906f85ea4 100755 --- a/tools/compare-commits.sh +++ b/tools/compare-commits.sh @@ -445,7 +445,6 @@ fi if [ -z ${INCLUDE_IOS+x} ]; then INCLUDE_IOS=$(make -C "$ROOT_DIR"/tools/devops print-variable VARIABLE=INCLUDE_IOS | sed 's/.*=//'); fi if [ -z ${INCLUDE_TVOS+x} ]; then INCLUDE_TVOS=$(make -C "$ROOT_DIR"/tools/devops print-variable VARIABLE=INCLUDE_TVOS | sed 's/.*=//'); fi if [ -z ${INCLUDE_MAC+x} ]; then INCLUDE_MAC=$(make -C "$ROOT_DIR"/tools/devops print-variable VARIABLE=INCLUDE_MAC | sed 's/.*=//'); fi -if [ -z ${INCLUDE_WATCH+x} ]; then INCLUDE_WATCH=$(make -C "$ROOT_DIR"/tools/devops print-variable VARIABLE=INCLUDE_WATCH | sed 's/.*=//'); fi if [ -z ${DOTNET_PLATFORMS+x} ]; then DOTNET_PLATFORMS=$(make -C "$ROOT_DIR"/tools/devops print-variable VARIABLE=DOTNET_PLATFORMS | sed 's/.*=//'); fi if [ -z ${DOTNET_TFM+x} ]; then DOTNET_TFM=$(make -C "$ROOT_DIR"/tools/devops print-variable VARIABLE=DOTNET_TFM | sed 's/.*=//'); fi diff --git a/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 b/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 index 8e4cbd27a126..92078785fa09 100644 --- a/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 +++ b/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 @@ -5,7 +5,6 @@ TestConfiguration unit tests. $ScriptDir = Split-Path -parent $MyInvocation.MyCommand.Path Import-Module $ScriptDir/TestConfiguration.psm1 -Force -$Env:CONFIGURE_PLATFORMS_INCLUDE_WATCH = "1" $Env:CONFIGURE_PLATFORMS_INCLUDE_XAMARIN_LEGACY = "1" Describe 'Get-TestConfiguration' { @@ -154,16 +153,6 @@ Describe 'Get-TestConfiguration' { "TEST_PREFIX": "test-prefix_monotouchtest_tvos", "TEST_PLATFORM": "tvOS", "TEST_FILTER": "Category != MultiPlatform" - }, - "monotouchtest_watchos": { - "LABEL": "monotouchtest", - "TESTS_LABELS": "extra-test-labels,run-monotouchtest-tests", - "LABEL_WITH_PLATFORM": "monotouchtest_watchOS", - "STATUS_CONTEXT": "status-context - monotouchtest - watchOS", - "TEST_PREFIX": "test-prefix_monotouchtest_watchos", - "TEST_PLATFORM": "watchOS", - "TEST_FILTER": "Category != MultiPlatform" - } } "@ @@ -206,16 +195,6 @@ Describe 'Get-TestConfiguration' { "TEST_PREFIX": "test-prefix_monotouchtest_ios", "TEST_PLATFORM": "iOS", "TEST_FILTER": "Category != MultiPlatform" - }, - "monotouchtest_watchos": { - "LABEL": "monotouchtest", - "TESTS_LABELS": "extra-test-labels,run-monotouchtest-tests", - "LABEL_WITH_PLATFORM": "monotouchtest_watchOS", - "STATUS_CONTEXT": "status-context - monotouchtest - watchOS", - "TEST_PREFIX": "test-prefix_monotouchtest_watchos", - "TEST_PLATFORM": "watchOS", - "TEST_FILTER": "Category != MultiPlatform" - } } "@ @@ -240,16 +219,6 @@ Describe 'Get-TestConfiguration' { "STATUS_CONTEXT": "status-context - cecil", "TEST_PREFIX": "test-prefix_cecil", "TEST_PLATFORM": "" - }, - "monotouchtest_watchos": { - "LABEL": "monotouchtest", - "TESTS_LABELS": "extra-test-labels,run-monotouchtest-tests", - "LABEL_WITH_PLATFORM": "monotouchtest_watchOS", - "STATUS_CONTEXT": "status-context - monotouchtest - watchOS", - "TEST_PREFIX": "test-prefix_monotouchtest_watchos", - "TEST_PLATFORM": "watchOS", - "TEST_FILTER": "Category != MultiPlatform" - } } "@ } @@ -337,16 +306,6 @@ Describe 'Get-TestConfiguration' { "TEST_PREFIX": "test-prefix_monotouchtest_maccatalyst", "TEST_PLATFORM": "MacCatalyst", "TEST_FILTER": "Category != MultiPlatform" - }, - "monotouchtest_watchos": { - "LABEL": "monotouchtest", - "TESTS_LABELS": "extra-test-labels,run-monotouchtest-tests", - "LABEL_WITH_PLATFORM": "monotouchtest_watchOS", - "STATUS_CONTEXT": "status-context - monotouchtest - watchOS", - "TEST_PREFIX": "test-prefix_monotouchtest_watchos", - "TEST_PLATFORM": "watchOS", - "TEST_FILTER": "Category != MultiPlatform" - } } "@ } diff --git a/tools/devops/automation/scripts/bash/configure-platforms.sh b/tools/devops/automation/scripts/bash/configure-platforms.sh index 2613227e3e80..e8d525389f72 100755 --- a/tools/devops/automation/scripts/bash/configure-platforms.sh +++ b/tools/devops/automation/scripts/bash/configure-platforms.sh @@ -26,9 +26,6 @@ INCLUDE_IOS=$(cat "$FILE") make -C "$BUILD_SOURCESDIRECTORY/xamarin-macios/tools/devops" print-variable-value-to-file FILE="$FILE" VARIABLE=INCLUDE_TVOS INCLUDE_TVOS=$(cat "$FILE") -make -C "$BUILD_SOURCESDIRECTORY/xamarin-macios/tools/devops" print-variable-value-to-file FILE="$FILE" VARIABLE=INCLUDE_WATCH -INCLUDE_WATCH=$(cat "$FILE") - make -C "$BUILD_SOURCESDIRECTORY/xamarin-macios/tools/devops" print-variable-value-to-file FILE="$FILE" VARIABLE=INCLUDE_MAC INCLUDE_MAC=$(cat "$FILE") @@ -95,18 +92,15 @@ echo "##vso[task.setvariable variable=INCLUDE_XAMARIN_LEGACY;isOutput=true]$INCL if test -n "$INCLUDE_XAMARIN_LEGACY"; then echo "##vso[task.setvariable variable=INCLUDE_LEGACY_IOS;isOutput=true]$INCLUDE_IOS" echo "##vso[task.setvariable variable=INCLUDE_LEGACY_TVOS;isOutput=true]$INCLUDE_TVOS" - echo "##vso[task.setvariable variable=INCLUDE_LEGACY_WATCH;isOutput=true]$INCLUDE_WATCH" echo "##vso[task.setvariable variable=INCLUDE_LEGACY_MAC;isOutput=true]$INCLUDE_MAC" else echo "##vso[task.setvariable variable=INCLUDE_LEGACY_IOS;isOutput=true]" echo "##vso[task.setvariable variable=INCLUDE_LEGACY_TVOS;isOutput=true]" - echo "##vso[task.setvariable variable=INCLUDE_LEGACY_WATCH;isOutput=true]" echo "##vso[task.setvariable variable=INCLUDE_LEGACY_MAC;isOutput=true]" fi echo "##vso[task.setvariable variable=INCLUDE_IOS;isOutput=true]$INCLUDE_IOS" echo "##vso[task.setvariable variable=INCLUDE_TVOS;isOutput=true]$INCLUDE_TVOS" -echo "##vso[task.setvariable variable=INCLUDE_WATCH;isOutput=true]$INCLUDE_WATCH" echo "##vso[task.setvariable variable=INCLUDE_MAC;isOutput=true]$INCLUDE_MAC" echo "##vso[task.setvariable variable=INCLUDE_MACCATALYST;isOutput=true]$INCLUDE_MACCATALYST" diff --git a/tools/mtouch/Makefile b/tools/mtouch/Makefile index 6e63837bae44..80d83328ddab 100644 --- a/tools/mtouch/Makefile +++ b/tools/mtouch/Makefile @@ -337,16 +337,6 @@ ifdef INCLUDE_DEVICE TARGETS += $(IOS_DESTDIR)$(MONOTOUCH_DEVICE_SDK)/lib/Xamarin.iOS.registrar.a endif -ifdef INCLUDE_WATCH -TARGETS += \ - $(IOS_DESTDIR)$(XAMARIN_WATCHSIMULATOR_SDK)/lib/Xamarin.WatchOS.registrar.a \ - -ifdef INCLUDE_DEVICE -TARGETS += $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/lib/Xamarin.WatchOS.registrar.a -endif -endif - - ifdef INCLUDE_TVOS TARGETS += \ $(IOS_DESTDIR)$(XAMARIN_TVSIMULATOR_SDK)/lib/Xamarin.TVOS.registrar.a \ From 9013ae4f83a9236ac91a8fe857a2403371993534 Mon Sep 17 00:00:00 2001 From: VS MobileTools Engineering Service 2 Date: Wed, 16 Oct 2024 05:47:47 -0700 Subject: [PATCH 072/155] [nuget-msi-convert] Support improved VS component IDs (#21438) Context: https://github.com/dotnet/arcade/commit/b2d3a3a35526b529490e8f7e410b3777b3f20bd6 Context: https://github.com/xamarin/yaml-templates/pull/339 The VS insertion manifest generation has been updated to use new VS component IDs required for .NET 9+. Backport of #21423 --------- Co-authored-by: Peter Collins --- dotnet/generate-vs-workload.csharp | 1 + 1 file changed, 1 insertion(+) diff --git a/dotnet/generate-vs-workload.csharp b/dotnet/generate-vs-workload.csharp index f5e53c5274bf..810254d11c29 100755 --- a/dotnet/generate-vs-workload.csharp +++ b/dotnet/generate-vs-workload.csharp @@ -57,6 +57,7 @@ using (TextWriter writer = new StreamWriter (outputPath)) { var manifestBuildVersion = iOSPlatform.Any () ? iOSPlatform.First ().Item2 : platforms.First ().Item2; writer.WriteLine ($" {manifestBuildVersion}"); writer.WriteLine ($" true"); + writer.WriteLine ($" true"); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); From 23dffef8c47520fb3c194f122a350f940de8ce5a Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 19:07:09 +0200 Subject: [PATCH 073/155] [xharness] Remove a lot of legacy code. (#21419) --- tests/Makefile | 14 +- tests/package-mac-tests.sh | 1 - tests/xharness/AppRunner.cs | 45 +-- tests/xharness/Harness.cs | 294 +----------------- .../IAppBundleInformationParserExtensions.cs | 6 +- tests/xharness/IHarness.cs | 13 - tests/xharness/Jenkins/Jenkins.cs | 8 +- tests/xharness/Jenkins/JenkinsDeviceLoader.cs | 8 +- .../Jenkins/MacTestTasksEnumerable.cs | 4 - .../Jenkins/MakeTestTaskEnumerable.cs | 52 ---- .../Jenkins/NUnitTestTasksEnumerable.cs | 42 +-- .../Jenkins/Reports/HtmlReportWriter.cs | 8 +- .../xharness/Jenkins/RunDeviceTasksFactory.cs | 51 +-- .../Jenkins/RunSimulatorTasksFactory.cs | 22 +- tests/xharness/Jenkins/TestData.cs | 2 - tests/xharness/Jenkins/TestSelector.cs | 16 - tests/xharness/Jenkins/TestServer.cs | 20 -- .../Jenkins/TestTasks/AppleTestTask.cs | 20 -- .../xharness/Jenkins/TestTasks/IRunXITask.cs | 1 - .../Jenkins/TestTasks/MacExecuteTask.cs | 19 -- tests/xharness/Jenkins/TestTasks/MacTask.cs | 8 +- tests/xharness/Jenkins/TestTasks/RunDevice.cs | 54 +--- .../Jenkins/TestTasks/RunDeviceTask.cs | 10 +- .../Jenkins/TestTasks/RunSimulator.cs | 19 +- tests/xharness/Jenkins/TestTasks/RunXITask.cs | 15 +- tests/xharness/Jenkins/TestTasks/TestTask.cs | 13 +- .../xharness/Jenkins/TestVariationsFactory.cs | 43 +-- tests/xharness/MacFlavorsExtensions.cs | 5 - tests/xharness/MacTestProject.cs | 24 +- tests/xharness/Program.cs | 21 +- tests/xharness/SimulatorLoaderFactory.cs | 16 - tests/xharness/SolutionGenerator.cs | 166 ---------- tests/xharness/Targets/MacTarget.cs | 186 ----------- tests/xharness/Targets/TVOSTarget.cs | 112 ------- tests/xharness/Targets/Target.cs | 279 ----------------- .../xharness/Targets/TodayExtensionTarget.cs | 142 --------- tests/xharness/Targets/UnifiedTarget.cs | 105 ------- tests/xharness/Targets/WatchOSTarget.cs | 249 --------------- tests/xharness/Targets/iOSTarget.cs | 34 -- tests/xharness/TestLabel.cs | 18 +- tests/xharness/TestPlatform.cs | 11 - tests/xharness/TestPlatformExtensions.cs | 26 -- tests/xharness/TestProject.cs | 11 - tests/xharness/TestProjectExtensions.cs | 26 -- tests/xharness/TestTargetExtensions.cs | 12 +- .../Jenkins/JenkinsDeviceLoadterTests.cs | 7 +- .../Jenkins/MakeTestTaskEnumerableTests.cs | 57 ---- .../Jenkins/TestSelectionTests.cs | 3 - .../Xamarin/Tests/AssemblyLocatorTest.cs | 13 +- .../Xamarin/Tests/XamariniOSTemplateTest.cs | 23 -- .../Tests/MacFlavorsExtensionsTests.cs | 16 - .../Tests/TestPlatformExtensionsTests.cs | 39 +-- .../Tests/TestTargetExtensionsTests.cs | 6 - .../Xharness.Tests/Xharness.Tests.csproj | 2 - tests/xharness/iOSTestProject.cs | 12 +- tests/xharness/xharness.csproj | 14 +- .../scripts/TestConfiguration.Tests.ps1 | 4 + .../automation/scripts/TestResults.Tests.ps1 | 12 +- tools/devops/automation/scripts/VSTS.psm1 | 2 +- .../automation/templates/api-diff-stage.yml | 2 +- .../automation/templates/main-stage.yml | 2 +- .../templates/pipelines/run-api-scan.yml | 2 +- .../pipelines/run-macos-tests-pipeline.yml | 2 +- .../automation/templates/tests-stage.yml | 2 +- 64 files changed, 92 insertions(+), 2379 deletions(-) delete mode 100644 tests/xharness/Jenkins/MakeTestTaskEnumerable.cs delete mode 100644 tests/xharness/SolutionGenerator.cs delete mode 100644 tests/xharness/Targets/MacTarget.cs delete mode 100644 tests/xharness/Targets/TVOSTarget.cs delete mode 100644 tests/xharness/Targets/TodayExtensionTarget.cs delete mode 100644 tests/xharness/Targets/UnifiedTarget.cs delete mode 100644 tests/xharness/Targets/WatchOSTarget.cs delete mode 100644 tests/xharness/Targets/iOSTarget.cs delete mode 100644 tests/xharness/Xharness.Tests/Jenkins/MakeTestTaskEnumerableTests.cs delete mode 100644 tests/xharness/Xharness.Tests/Tests/MacFlavorsExtensionsTests.cs diff --git a/tests/Makefile b/tests/Makefile index 9f9a6d770f63..6b57f8b34d4f 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -189,11 +189,9 @@ logdev: build-test-libraries: @$(MAKE) -C $(TOP)/tests/test-libraries -.stamp-xharness-configure: $(XHARNESS_EXECUTABLE) - $(Q_GEN) $(DOTNET) $< $(XHARNESS_VERBOSITY) --configure --autoconf --rootdir $(CURDIR) - $(Q) touch $@ +xharness: $(XHARNESS_EXECUTABLE) -all-local:: .stamp-xharness-configure +all-local:: xharness $(TOP)/tools/common/SdkVersions.cs: $(TOP)/tools/common/SdkVersions.in.cs @$(MAKE) -C $(TOP)/tools/mtouch ../common/SdkVersions.cs @@ -348,13 +346,5 @@ package-test-libraries.zip: $(Q) $(MAKE) all -C test-libraries/custom-type-assembly build-assembly $(Q_GEN) rm -f "$@" "$@.tmp" $(Q_GEN) cd $(TOP) && zip -9r --symlinks $(abspath $@).tmp ./tests/test-libraries - $(Q_GEN) cd $(TOP) && find tests -regex '.*/generated-projects/.*[c|f]sproj' -exec zip -9r --symlinks $(abspath $@).tmp {} + - $(Q_GEN) cd $(TOP) && find tests -regex '.*/generated-projects/.*sln' -exec zip -9r --symlinks $(abspath $@).tmp {} + $(Q_GEN) cd $(TOP) && find tests -regex 'tests/test-libraries/custom-type-assembly/.libs/.*dll' -exec zip -9r --symlinks $(abspath $@).tmp {} + - $(Q_GEN) cd $(TOP) && git ls-files -o -- 'tests/*/Info-*plist' | zip -9r --symlinks $(abspath $@).tmp -@ -ifdef INCLUDE_XAMARIN_LEGACY -ifdef INCLUDE_IOS - $(Q_GEN) cd $(TOP) && zip -9r --symlinks $(abspath $@).tmp ./tools/mtouch/simlauncher*-sgen* -endif -endif $(Q) mv "$@".tmp "$@" diff --git a/tests/package-mac-tests.sh b/tests/package-mac-tests.sh index c096193d9224..f4d3ba4c335a 100755 --- a/tests/package-mac-tests.sh +++ b/tests/package-mac-tests.sh @@ -23,7 +23,6 @@ export MD_APPLE_SDK_ROOT="$(dirname "$(dirname "$XCODE_DEVELOPER_ROOT")")" export RootTestsDirectory="$(pwd)" make -make .stamp-xharness-configure TEST_SUITE_DEPENDENCIES+=(bindings-test) TEST_SUITE_DEPENDENCIES+=(EmbeddedResources) diff --git a/tests/xharness/AppRunner.cs b/tests/xharness/AppRunner.cs index 0efd5c0c68a1..bcc9d631abe6 100644 --- a/tests/xharness/AppRunner.cs +++ b/tests/xharness/AppRunner.cs @@ -42,9 +42,7 @@ public class AppRunner { readonly string buildConfiguration; string deviceName; - string companionDeviceName; ISimulatorDevice simulator; - ISimulatorDevice companionSimulator; bool ensureCleanSimulatorState = true; bool EnsureCleanSimulatorState { @@ -80,9 +78,7 @@ public AppRunner (IMlaunchProcessManager processManager, string projectFilePath, string buildConfiguration, ISimulatorDevice simulator = null, - ISimulatorDevice companionSimulator = null, string deviceName = null, - string companionDeviceName = null, bool ensureCleanSimulatorState = false, double timeoutMultiplier = 1, string variation = null, @@ -102,10 +98,8 @@ public AppRunner (IMlaunchProcessManager processManager, this.Logs = logs ?? throw new ArgumentNullException (nameof (logs)); this.timeoutMultiplier = timeoutMultiplier; this.deviceName = deviceName; - this.companionDeviceName = companionDeviceName; this.ensureCleanSimulatorState = ensureCleanSimulatorState; this.simulator = simulator; - this.companionSimulator = companionSimulator; this.buildTask = buildTask; this.target = target; this.variation = variation; @@ -129,7 +123,7 @@ async Task FindSimulatorAsync () var sims = simulatorsLoaderFactory.CreateLoader (); await sims.LoadDevices (Logs.Create ($"simulator-list-{Harness.Helpers.Timestamp}.log", "Simulator list"), false, false); - (simulator, companionSimulator) = await sims.FindSimulators (target.GetTargetOs (false), MainLog); + (simulator, _) = await sims.FindSimulators (target.GetTargetOs (false), MainLog); return simulator is not null; } @@ -149,9 +143,6 @@ async Task FindDevice () var device = await devs.FindDevice (runMode, MainLog, false, false); deviceName = device?.Name; - - if (runMode == RunMode.WatchOS) - companionDeviceName = (await devs.FindCompanionDevice (MainLog, device)).Name; } public async Task InstallAsync (CancellationToken cancellation_token) @@ -172,14 +163,10 @@ public async Task InstallAsync (CancellationToken cancel args.Add (new VerbosityArgument ()); args.Add (new InstallAppOnDeviceArgument (AppInformation.AppPath)); - args.Add (new DeviceNameArgument (companionDeviceName ?? deviceName)); - - if (runMode == RunMode.WatchOS) { - args.Add (new DeviceArgument ("ios,watchos")); - } + args.Add (new DeviceNameArgument (deviceName)); var totalSize = Directory.GetFiles (AppInformation.AppPath, "*", SearchOption.AllDirectories).Select ((v) => new FileInfo (v).Length).Sum (); - MainLog.WriteLine ($"Installing '{AppInformation.AppPath}' to '{companionDeviceName ?? deviceName}'. Size: {totalSize} bytes = {totalSize / 1024.0 / 1024.0:N2} MB"); + MainLog.WriteLine ($"Installing '{AppInformation.AppPath}' to '{deviceName}'. Size: {totalSize} bytes = {totalSize / 1024.0 / 1024.0:N2} MB"); return await processManager.ExecuteCommandAsync (args, MainLog, TimeSpan.FromHours (1), cancellationToken: cancellation_token); } @@ -197,7 +184,7 @@ public async Task UninstallAsync () args.Add (new VerbosityArgument ()); args.Add (new UninstallAppFromDeviceArgument (AppInformation.BundleIdentifier)); - args.Add (new DeviceNameArgument (companionDeviceName ?? deviceName)); + args.Add (new DeviceNameArgument (deviceName)); return await processManager.ExecuteCommandAsync (args, MainLog, TimeSpan.FromMinutes (1)); } @@ -302,16 +289,7 @@ public async Task RunAsync () args.AddRange (harness.EnvironmentVariables.Select (kvp => new SetEnvVariableArgument (kvp.Key, kvp.Value))); if (IsExtension) { - switch (AppInformation.Extension) { - case Extension.TodayExtension: - args.Add (isSimulator - ? (MlaunchArgument) new LaunchSimulatorExtensionArgument (AppInformation.LaunchAppPath, AppInformation.BundleIdentifier) - : new LaunchDeviceExtensionArgument (AppInformation.LaunchAppPath, AppInformation.BundleIdentifier)); - break; - case Extension.WatchKit2: - default: - throw new NotImplementedException (); - } + throw new NotImplementedException ("Extensions aren't supported in xharness at the moment (no .NET extension tests yet)"); } else { args.Add (isSimulator ? (MlaunchArgument) new LaunchSimulatorAppArgument (AppInformation.LaunchAppPath) @@ -329,14 +307,12 @@ public async Task RunAsync () args.Add (new SetStdoutArgument (stdout_log)); args.Add (new SetStderrArgument (stderr_log)); - var simulators = new [] { simulator, companionSimulator }.Where (s => s is not null); + var simulators = new [] { simulator }; var systemLogs = new List (); foreach (var sim in simulators) { // Upload the system log MainLog.WriteLine ("System log for the '{1}' simulator is: {0}", sim.SystemLog, sim.Name); - bool isCompanion = sim != simulator; - - var logDescription = isCompanion ? LogType.CompanionSystemLog.ToString () : LogType.SystemLog.ToString (); + var logDescription = LogType.SystemLog.ToString (); var log = captureLogFactory.Create ( Path.Combine (Logs.Directory, sim.Name + ".log"), sim.SystemLog, @@ -393,12 +369,7 @@ public async Task RunAsync () } else { MainLog.WriteLine ("*** Executing {0}/{1} on device '{2}' ***", AppInformation.AppName, runMode, deviceName); - if (runMode == RunMode.WatchOS) { - args.Add (new AttachNativeDebuggerArgument ()); // this prevents the watch from backgrounding the app. - } else { - args.Add (new WaitForExitArgument ()); - } - + args.Add (new WaitForExitArgument ()); args.Add (new DeviceNameArgument (deviceName)); var deviceSystemLog = Logs.Create ($"device-{deviceName}-{Harness.Helpers.Timestamp}.log", "Device log"); diff --git a/tests/xharness/Harness.cs b/tests/xharness/Harness.cs index ebf19afe642e..4706bf66aa50 100644 --- a/tests/xharness/Harness.cs +++ b/tests/xharness/Harness.cs @@ -15,14 +15,12 @@ using Microsoft.DotNet.XHarness.iOS.Shared.Listeners; using Microsoft.DotNet.XHarness.iOS.Shared.Logging; using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; -using Xharness.Targets; using Xamarin.Utils; namespace Xharness { public enum HarnessAction { None, - Configure, Run, Install, Uninstall, @@ -48,8 +46,6 @@ public class HarnessConfiguration { public double TimeoutInMinutes { get; set; } = 15; public bool UseSystemXamarinIOSMac { get; set; } public int Verbosity { get; set; } - public string WatchOSAppTemplate { get; set; } - public string WatchOSContainerTemplate { get; set; } public XmlResultJargon XmlJargon { get; set; } = XmlResultJargon.NUnitV3; // This is the maccore/tests directory. @@ -157,9 +153,6 @@ bool TryGetMlaunchDotnetPath (out string value) { value = null; - if (!ENABLE_DOTNET) - return false; - ApplePlatform platform; if (INCLUDE_IOS) { platform = ApplePlatform.iOS; @@ -185,9 +178,6 @@ string MlaunchPath { if (TryGetMlaunchDotnetPath (out var mlaunch)) return mlaunch; - if (INCLUDE_XAMARIN_LEGACY && (INCLUDE_IOS || INCLUDE_TVOS)) - return Path.Combine (IOS_DESTDIR, "Library", "Frameworks", "Xamarin.iOS.framework", "Versions", "Current", "bin", "mlaunch"); - return $"Not building any mobile platform, so can't provide a location to mlaunch."; } } @@ -210,27 +200,14 @@ string GetVariable (string variable, string @default = null) public List IOSTestProjects { get; } public List MacTestProjects { get; } = new List (); - // Configure readonly bool useSystemXamarinIOSMac; // if the system XI/XM should be used, or the locally build XI/XM. readonly bool autoConf; - public string WatchOSContainerTemplate { get; private set; } - public string WatchOSAppTemplate { get; private set; } - public string WatchOSExtensionTemplate { get; private set; } - public string TodayContainerTemplate { get; private set; } - public string TodayExtensionTemplate { get; private set; } - public string MONO_PATH { get; } // Use same name as in Makefiles, so that a grep finds it. - public string TVOS_MONO_PATH { get; } // Use same name as in Makefiles, so that a grep finds it. public bool INCLUDE_IOS { get; } public bool INCLUDE_TVOS { get; } public bool INCLUDE_MAC { get; } public bool INCLUDE_MACCATALYST { get; } public string JENKINS_RESULTS_DIRECTORY { get; } // Use same name as in Makefiles, so that a grep finds it. - public string MAC_DESTDIR { get; } - public string IOS_DESTDIR { get; } - public bool ENABLE_DOTNET { get; } - public bool INCLUDE_XAMARIN_LEGACY { get; } - public string SYSTEM_MONO { get; set; } public string DOTNET_DIR { get; set; } public string DOTNET_TFM { get; set; } @@ -278,8 +255,6 @@ public Harness (IResultParser resultParser, HarnessAction action, HarnessConfigu if (!string.IsNullOrEmpty (Environment.GetEnvironmentVariable ("TESTS_USE_SYSTEM"))) useSystemXamarinIOSMac = true; Verbosity = configuration.Verbosity; - WatchOSAppTemplate = configuration.WatchOSAppTemplate; - WatchOSContainerTemplate = configuration.WatchOSContainerTemplate; XmlJargon = configuration.XmlJargon; if (configuration.Labels is not null) @@ -293,19 +268,12 @@ public Harness (IResultParser resultParser, HarnessAction action, HarnessConfigu config = ParseConfigFiles (); var src_root = Path.GetDirectoryName (Path.GetFullPath (RootDirectory)); - MONO_PATH = Path.GetFullPath (Path.Combine (src_root, "external", "mono")); - TVOS_MONO_PATH = MONO_PATH; INCLUDE_IOS = IsVariableSet (nameof (INCLUDE_IOS)); INCLUDE_TVOS = IsVariableSet (nameof (INCLUDE_TVOS)); JENKINS_RESULTS_DIRECTORY = GetVariable (nameof (JENKINS_RESULTS_DIRECTORY)); INCLUDE_MAC = IsVariableSet (nameof (INCLUDE_MAC)); INCLUDE_MACCATALYST = IsVariableSet (nameof (INCLUDE_MACCATALYST)); - MAC_DESTDIR = GetVariable (nameof (MAC_DESTDIR)); - IOS_DESTDIR = GetVariable (nameof (IOS_DESTDIR)); - ENABLE_DOTNET = IsVariableSet (nameof (ENABLE_DOTNET)); - SYSTEM_MONO = GetVariable (nameof (SYSTEM_MONO)); DOTNET_DIR = GetVariable (nameof (DOTNET_DIR)); - INCLUDE_XAMARIN_LEGACY = IsVariableSet (nameof (INCLUDE_XAMARIN_LEGACY)); DOTNET_TFM = GetVariable (nameof (DOTNET_TFM)); if (string.IsNullOrEmpty (SdkRoot)) @@ -326,9 +294,6 @@ public bool GetIncludeSystemPermissionTests (TestPlatform platform, bool device) switch (platform) { case TestPlatform.iOS: case TestPlatform.Mac: - case TestPlatform.Mac_Full: - case TestPlatform.Mac_Modern: - case TestPlatform.Mac_System: // On macOS we can't edit the TCC database easily // (it requires adding the mac has to be using MDM: https://carlashley.com/2018/09/28/tcc-round-up/) // So by default ignore any tests that would pop up permission dialogs in CI. @@ -391,7 +356,6 @@ void AutoConfigureDotNet () }; // If .NET is not enabled, then ignore, otherwise leave undecided for other code to determine. - bool? dotnetIgnored = ENABLE_DOTNET ? null : (bool?) true; foreach (var projectInfo in projects) { var projectPath = projectInfo.ProjectPath; var projectName = Path.GetFileName (projectPath); @@ -403,11 +367,8 @@ void AutoConfigureDotNet () IsDotNetProject = true, SkipiOSVariation = false, SkiptvOSVariation = true, - SkipwatchOSVariation = true, - SkipTodayExtensionVariation = true, SkipDeviceVariations = false, - TestPlatform = TestPlatform.iOS_Unified, - Ignore = dotnetIgnored, + TestPlatform = TestPlatform.iOS, Configurations = projectInfo.Configurations, }); } @@ -418,12 +379,9 @@ void AutoConfigureDotNet () IsDotNetProject = true, SkipiOSVariation = true, SkiptvOSVariation = true, - SkipwatchOSVariation = true, - SkipTodayExtensionVariation = true, SkipDeviceVariations = false, GenerateVariations = false, TestPlatform = TestPlatform.tvOS, - Ignore = dotnetIgnored, Configurations = projectInfo.Configurations, }); } @@ -433,8 +391,6 @@ void AutoConfigureDotNet () Name = projectName, IsDotNetProject = true, TargetFrameworkFlavors = MacFlavors.DotNet, - Platform = "AnyCPU", - Ignore = dotnetIgnored, TestPlatform = TestPlatform.Mac, Configurations = projectInfo.Configurations, }); @@ -445,8 +401,6 @@ void AutoConfigureDotNet () Name = projectName, IsDotNetProject = true, TargetFrameworkFlavors = MacFlavors.MacCatalyst, - Platform = "AnyCPU", - Ignore = dotnetIgnored, TestPlatform = TestPlatform.MacCatalyst, Configurations = projectInfo.Configurations, }); @@ -454,152 +408,6 @@ void AutoConfigureDotNet () } } - int AutoConfigureMac (bool generate_projects) - { - int rv = 0; - - var test_suites = new [] { - new { Label = TestLabel.Linker, Directory = "linker/mac/dont link", ProjectFile = "dont link-mac", Name = "dont link", Flavors = MacFlavors.Modern | MacFlavors.Full | MacFlavors.System }, - }; - foreach (var p in test_suites) { - MacTestProjects.Add (new MacTestProject (p.Label, Path.GetFullPath (Path.Combine (RootDirectory, p.Directory, p.ProjectFile + ".csproj"))) { - Name = p.Name, - TargetFrameworkFlavors = p.Flavors, - }); - } - - MacTestProjects.Add (new MacTestProject (TestLabel.Introspection, Path.GetFullPath (Path.Combine (RootDirectory, "introspection", "Mac", "introspection-mac.csproj")), targetFrameworkFlavor: MacFlavors.Modern) { Name = "introspection" }); - MacTestProjects.Add (new MacTestProject (TestLabel.Framework, Path.GetFullPath (Path.Combine (RootDirectory, "framework-test", "macOS", "framework-test-mac.csproj")), targetFrameworkFlavor: MacFlavors.Modern) { Name = "framework-test" }); - MacTestProjects.Add (new MacTestProject (TestLabel.Xcframework, Path.GetFullPath (Path.Combine (RootDirectory, "xcframework-test", "macOS", "xcframework-test-mac.csproj")), targetFrameworkFlavor: MacFlavors.Modern) { Name = "xcframework-test" }); - - var hard_coded_test_suites = new [] { - new { Label = TestLabel.Mmp, Directory = "mmptest", ProjectFile = "mmptest", Name = "mmptest", IsNUnit = true, Configurations = (string[]) null, Platform = "x86", Flavors = MacFlavors.Console, }, - new { Label = TestLabel.Xammac, Directory = "xammac_tests", ProjectFile = "xammac_tests", Name = "xammac tests", IsNUnit = false, Configurations = new string [] { "Debug", "Release" }, Platform = "AnyCPU", Flavors = MacFlavors.Modern, }, - new { Label = TestLabel.Linker, Directory = "linker/mac/link all", ProjectFile = "link all-mac", Name = "link all", IsNUnit = false, Configurations = new string [] { "Debug", "Release" }, Platform = "x86", Flavors = MacFlavors.Modern, }, - new { Label = TestLabel.Linker, Directory = "linker/mac/link sdk", ProjectFile = "link sdk-mac", Name = "link sdk", IsNUnit = false, Configurations = new string [] { "Debug", "Release" }, Platform = "x86", Flavors = MacFlavors.Modern, }, - }; - foreach (var p in hard_coded_test_suites) { - MacTestProjects.Add (new MacTestProject (p.Label, Path.GetFullPath (Path.Combine (RootDirectory, p.Directory, p.ProjectFile + ".csproj")), targetFrameworkFlavor: p.Flavors) { - Name = p.Name, - IsNUnitProject = p.IsNUnit, - SolutionPath = Path.GetFullPath (Path.Combine (RootDirectory, "tests-mac.sln")), - Configurations = p.Configurations, - Platform = p.Platform, - Ignore = !INCLUDE_XAMARIN_LEGACY, - }); - } - - - // All test projects should be either Modern projects or NUnit/console executables at this point. - // If we need to generate Full/System variations, we do that here. - var unified_targets = new List (); - - Action configureTarget = (MacTarget target, string file, bool isNUnitProject, bool skip_generation) => { - target.TemplateProjectPath = file; - target.Harness = this; - target.IsNUnitProject = isNUnitProject; - if (!generate_projects || skip_generation) - target.ShouldSkipProjectGeneration = true; - target.Execute (); - }; - - foreach (var proj in MacTestProjects) { - var target = new MacTarget (MacFlavors.Modern); - configureTarget (target, proj.Path, proj.IsNUnitProject, true); - unified_targets.Add (target); - } - - foreach (var proj in MacTestProjects.Where ((v) => v.GenerateVariations).ToArray ()) { - var file = proj.Path; - if (!File.Exists (file)) { - Console.WriteLine ($"Can't find the project file {file}."); - rv = 1; - continue; - } - - // Generate variations if requested - if (proj.GenerateFull) { - var target = new MacTarget (MacFlavors.Full); - configureTarget (target, file, proj.IsNUnitProject, false); - unified_targets.Add (target); - - var cloned_project = (MacTestProject) proj.Clone (); - cloned_project.TargetFrameworkFlavors = MacFlavors.Full; - cloned_project.Path = target.ProjectPath; - MacTestProjects.Add (cloned_project); - } - - if (proj.GenerateSystem) { - var target = new MacTarget (MacFlavors.System); - configureTarget (target, file, proj.IsNUnitProject, false); - unified_targets.Add (target); - - var cloned_project = (MacTestProject) proj.Clone (); - cloned_project.TargetFrameworkFlavors = MacFlavors.System; - cloned_project.Path = target.ProjectPath; - MacTestProjects.Add (cloned_project); - } - - // We're done generating now - // Re-use the existing TestProject instance instead of creating a new one. - proj.TargetFrameworkFlavors = MacFlavors.Modern; // the default/template flavor is 'Modern' - } - - return rv; - } - - void AutoConfigureIOS () - { - var library_projects = new string [] { "BundledResources", "EmbeddedResources", "bindings-test2" }; - var fsharp_test_suites = new string [] { "fsharp" }; - var fsharp_library_projects = new string [] { "fsharplibrary" }; - - IOSTestProjects.Add (new iOSTestProject (TestLabel.Monotouch, Path.GetFullPath (Path.Combine (RootDirectory, "monotouch-test", "monotouch-test.csproj"))) { - Name = "monotouch-test", - }); - - foreach (var p in fsharp_test_suites) - IOSTestProjects.Add (new iOSTestProject (TestLabel.Fsharp, Path.GetFullPath (Path.Combine (RootDirectory, p + "/" + p + ".fsproj"))) { Name = p }); - foreach (var p in library_projects) - IOSTestProjects.Add (new iOSTestProject (TestLabel.LibraryProjects, Path.GetFullPath (Path.Combine (RootDirectory, p + "/" + p + ".csproj")), false) { Name = p }); - foreach (var p in fsharp_library_projects) - IOSTestProjects.Add (new iOSTestProject (TestLabel.Fsharp, Path.GetFullPath (Path.Combine (RootDirectory, p + "/" + p + ".fsproj")), false) { Name = p }); - - IOSTestProjects.Add (new iOSTestProject (TestLabel.BindingFramework, Path.GetFullPath (Path.Combine (RootDirectory, "bindings-framework-test", "iOS", "bindings-framework-test.csproj")), false) { - Name = "bindings-framework-test", - }); - IOSTestProjects.Add (new iOSTestProject (TestLabel.BindingsXcframework, Path.GetFullPath (Path.Combine (RootDirectory, "bindings-xcframework-test", "iOS", "bindings-xcframework-test.csproj")), false) { - Name = "bindings-xcframework-test", - }); - IOSTestProjects.Add (new iOSTestProject (TestLabel.Framework, Path.GetFullPath (Path.Combine (RootDirectory, "framework-test", "iOS", "framework-test-ios.csproj"))) { - Name = "framework-test", - }); - IOSTestProjects.Add (new iOSTestProject (TestLabel.Xcframework, Path.GetFullPath (Path.Combine (RootDirectory, "xcframework-test", "iOS", "xcframework-test-ios.csproj"))) { - Name = "xcframework-test", - }); - - IOSTestProjects.Add (new iOSTestProject (TestLabel.Binding, Path.GetFullPath (Path.Combine (RootDirectory, "bindings-test", "iOS", "bindings-test.csproj")), false) { Name = "bindings-test" }); - - IOSTestProjects.Add (new iOSTestProject (TestLabel.InterdependentBindingProjects, Path.GetFullPath (Path.Combine (RootDirectory, "interdependent-binding-projects", "interdependent-binding-projects.csproj"))) { Name = "interdependent-binding-projects" }); - IOSTestProjects.Add (new iOSTestProject (TestLabel.Linker, Path.GetFullPath (Path.Combine (RootDirectory, "linker", "ios", "dont link", "dont link.csproj"))) { - Configurations = new string [] { "Debug", "Release" }, - }); - IOSTestProjects.Add (new iOSTestProject (TestLabel.Linker, Path.GetFullPath (Path.Combine (RootDirectory, "linker", "ios", "link all", "link all.csproj"))) { - Configurations = new string [] { "Debug", "Release" }, - }); - IOSTestProjects.Add (new iOSTestProject (TestLabel.Linker, Path.GetFullPath (Path.Combine (RootDirectory, "linker", "ios", "link sdk", "link sdk.csproj"))) { - Configurations = new string [] { "Debug", "Release" }, - }); - - // add all the tests that are using the precompiled mono assemblies - WatchOSContainerTemplate = Path.GetFullPath (Path.Combine (RootDirectory, "templates/WatchContainer")); - WatchOSAppTemplate = Path.GetFullPath (Path.Combine (RootDirectory, "templates/WatchApp")); - WatchOSExtensionTemplate = Path.GetFullPath (Path.Combine (RootDirectory, "templates/WatchExtension")); - - TodayContainerTemplate = Path.GetFullPath (Path.Combine (RootDirectory, "templates", "TodayContainer")); - TodayExtensionTemplate = Path.GetFullPath (Path.Combine (RootDirectory, "templates", "TodayExtension")); - } - // Dictionary make_config = new Dictionary (); IEnumerable FindConfigFiles (string name) { @@ -646,92 +454,6 @@ void ParseConfigFile (string file, Dictionary configuration) } } - int Configure () - { - var rv = AutoConfigureMac (true); - if (rv != 0) - return rv; - return ConfigureIOS (); - } - - // At startup we: - // * Load a list of well-known test projects IOSTestProjects/MacTestProjects. This happens in AutoConfigureIOS/AutoConfigureMac. - // Example projects: - // * introspection - // * dont link, link all, link sdk - // * Each of these test projects can used to generate other platform variations (tvOS, watchOS, macOS full, etc), - // if the the TestProject.GenerateVariations property is true. - - int ConfigureIOS () - { - var rv = 0; - var unified_targets = new List (); - var tvos_targets = new List (); - var watchos_targets = new List (); - var today_targets = new List (); - - if (autoConf) - AutoConfigureIOS (); - - foreach (var proj in IOSTestProjects.Where ((v) => v.GenerateVariations)) { - var file = proj.Path; - - if (!File.Exists (file)) { - Console.WriteLine ($"Can't find the project file {file}."); - rv = 1; - continue; - } - - if (!proj.SkipwatchOSVariation) { - var watchos = new WatchOSTarget () { - TemplateProjectPath = file, - Harness = this, - TestProject = proj, - }; - watchos.Execute (); - watchos_targets.Add (watchos); - } - - if (!proj.SkiptvOSVariation) { - var tvos = new TVOSTarget () { - TemplateProjectPath = file, - Harness = this, - TestProject = proj, - }; - tvos.Execute (); - tvos_targets.Add (tvos); - } - - if (!proj.SkipiOSVariation) { - var unified = new UnifiedTarget () { - TemplateProjectPath = file, - Harness = this, - TestProject = proj, - ShouldSkipProjectGeneration = proj.IsDotNetProject, - }; - unified.Execute (); - unified_targets.Add (unified); - - if (!proj.SkipTodayExtensionVariation) { - var today = new TodayExtensionTarget { - TemplateProjectPath = file, - Harness = this, - TestProject = proj, - ShouldSkipProjectGeneration = proj.IsDotNetProject, - }; - today.Execute (); - today_targets.Add (today); - } - } - } - - SolutionGenerator.CreateSolution (this, watchos_targets, "watchos", DevicePlatform.watchOS); - SolutionGenerator.CreateSolution (this, tvos_targets, "tvos", DevicePlatform.tvOS); - SolutionGenerator.CreateSolution (this, today_targets, "today", DevicePlatform.iOS); - - return rv; - } - int Install () { HarnessLog ??= GetAdHocLog (); @@ -823,8 +545,6 @@ public string VSDropsUri { public int Execute () { switch (Action) { - case HarnessAction.Configure: - return Configure (); case HarnessAction.Run: return Run (); case HarnessAction.Install: @@ -842,8 +562,6 @@ int Jenkins () { if (autoConf) { AutoConfigureDotNet (); - AutoConfigureIOS (); - AutoConfigureMac (false); } var jenkins = new Jenkins.Jenkins (this, processManager, ResultParser, TunnelBore); @@ -869,16 +587,6 @@ public void Save (StringWriter doc, string path) } } - bool? disable_watchos_on_wrench; - - public bool DisableWatchOSOnWrench { - get { - if (!disable_watchos_on_wrench.HasValue) - disable_watchos_on_wrench = !string.IsNullOrEmpty (Environment.GetEnvironmentVariable ("DISABLE_WATCH_ON_WRENCH")); - return disable_watchos_on_wrench.Value; - } - } - AppRunner CreateAppRunner (TestProject project) { var rv = new AppRunner (processManager, diff --git a/tests/xharness/IAppBundleInformationParserExtensions.cs b/tests/xharness/IAppBundleInformationParserExtensions.cs index c462cf405dbe..ac25d71c2157 100644 --- a/tests/xharness/IAppBundleInformationParserExtensions.cs +++ b/tests/xharness/IAppBundleInformationParserExtensions.cs @@ -5,8 +5,6 @@ using System.IO; using System.Xml; -using Xharness.Targets; - #nullable enable namespace Xharness { @@ -56,9 +54,7 @@ public async static Task ParseFromProject2 (this IAppBundl if (!Directory.Exists (appPath)) throw new DirectoryNotFoundException ($"The app bundle directory `{appPath}` does not exist"); - var launchAppPath = target.ToRunMode () == RunMode.WatchOS - ? Directory.GetDirectories (Path.Combine (appPath, "Watch"), "*.app") [0] - : appPath; + var launchAppPath = appPath; return new AppBundleInformation ( appName, diff --git a/tests/xharness/IHarness.cs b/tests/xharness/IHarness.cs index 56d3d575a728..caca1a62d07a 100644 --- a/tests/xharness/IHarness.cs +++ b/tests/xharness/IHarness.cs @@ -25,23 +25,11 @@ public interface IHarness { string XIBuildPath { get; } List IOSTestProjects { get; } List MacTestProjects { get; } - string WatchOSContainerTemplate { get; } - string WatchOSAppTemplate { get; } - string WatchOSExtensionTemplate { get; } - string TodayContainerTemplate { get; } - string TodayExtensionTemplate { get; } - string MONO_PATH { get; } - string TVOS_MONO_PATH { get; } bool INCLUDE_IOS { get; } bool INCLUDE_TVOS { get; } bool INCLUDE_MAC { get; } bool INCLUDE_MACCATALYST { get; } string JENKINS_RESULTS_DIRECTORY { get; } - string MAC_DESTDIR { get; } - string IOS_DESTDIR { get; } - bool ENABLE_DOTNET { get; } - bool INCLUDE_XAMARIN_LEGACY { get; } - string SYSTEM_MONO { get; set; } string DOTNET_DIR { get; set; } string DOTNET_TFM { get; } string XcodeRoot { get; } @@ -59,7 +47,6 @@ public interface IHarness { bool InCI { get; } bool UseTcpTunnel { get; } string VSDropsUri { get; } - bool DisableWatchOSOnWrench { get; } #endregion diff --git a/tests/xharness/Jenkins/Jenkins.cs b/tests/xharness/Jenkins/Jenkins.cs index ae7da1490ad9..5661bc2b907a 100644 --- a/tests/xharness/Jenkins/Jenkins.cs +++ b/tests/xharness/Jenkins/Jenkins.cs @@ -106,11 +106,6 @@ public bool IsIncluded (TestProject project) return false; } - if (!project.IsDotNetProject && !TestSelection.IsEnabled (PlatformLabel.LegacyXamarin)) { - MainLog.WriteLine ($"Ignoring {project.Name} with label {project.Label} because it's a legacy Xamarin project and legacy Xamarin projects are not included."); - return false; - } - var rv = TestSelection.IsEnabled (project.Label); MainLog.WriteLine ($"Including {project.Name} with label {project.Label.ToString ()}: {rv}"); return rv; @@ -145,8 +140,7 @@ Task PopulateTasksAsync () // all factories are enumerators \o/ var testFactories = new IEnumerable [] { new MacTestTasksEnumerable (this, processManager, crashReportSnapshotFactory, testVariationsFactory), - new NUnitTestTasksEnumerable (this, processManager), - new MakeTestTaskEnumerable (this, processManager) + new NUnitTestTasksEnumerable (this, processManager) }; // add all tests defined by the factory diff --git a/tests/xharness/Jenkins/JenkinsDeviceLoader.cs b/tests/xharness/Jenkins/JenkinsDeviceLoader.cs index 4472356efe71..107b8d67c65e 100644 --- a/tests/xharness/Jenkins/JenkinsDeviceLoader.cs +++ b/tests/xharness/Jenkins/JenkinsDeviceLoader.cs @@ -31,18 +31,12 @@ public JenkinsDeviceLoader (ISimulatorLoader simulators, IHardwareDeviceLoader d static string BuildDevicesDescription (IHardwareDeviceLoader deviceLoader, string name) { var devicesTypes = new StringBuilder (); - if (deviceLoader.Connected32BitIOS.Any ()) { - devicesTypes.Append ("iOS 32 bit"); - } if (deviceLoader.Connected64BitIOS.Any ()) { - devicesTypes.Append (devicesTypes.Length == 0 ? "iOS 64 bit" : ", iOS 64 bit"); + devicesTypes.Append (devicesTypes.Length == 0 ? "iOS" : ", iOS"); } if (deviceLoader.ConnectedTV.Any ()) { devicesTypes.Append (devicesTypes.Length == 0 ? "tvOS" : ", tvOS"); } - if (deviceLoader.ConnectedWatch.Any ()) { - devicesTypes.Append (devicesTypes.Length == 0 ? "watchOS" : ", watchOS"); - } return (devicesTypes.Length == 0) ? $"{name} Listing (ok - no devices found)." : $"{name} Listing (ok). Devices types are: {devicesTypes}"; } diff --git a/tests/xharness/Jenkins/MacTestTasksEnumerable.cs b/tests/xharness/Jenkins/MacTestTasksEnumerable.cs index ce7898c4dc6c..f8df3ce234a4 100644 --- a/tests/xharness/Jenkins/MacTestTasksEnumerable.cs +++ b/tests/xharness/Jenkins/MacTestTasksEnumerable.cs @@ -75,9 +75,6 @@ public IEnumerator GetEnumerator () if (project.Ignore == true) ignored = true; - if (!jenkins.TestSelection.IsEnabled (TestLabel.Mmp) && project.Path.Contains ("mmptest")) - ignored = true; - if (!jenkins.IsIncluded (project)) ignored = true; @@ -91,7 +88,6 @@ public IEnumerator GetEnumerator () build.Platform = platform; build.CloneTestProject (jenkins.MainLog, processManager, project, HarnessConfiguration.RootDirectory); build.ProjectConfiguration = config; - build.ProjectPlatform = project.Platform; build.SpecifyPlatform = false; build.SpecifyConfiguration = build.ProjectConfiguration != "Debug"; build.Dependency = project.Dependency; diff --git a/tests/xharness/Jenkins/MakeTestTaskEnumerable.cs b/tests/xharness/Jenkins/MakeTestTaskEnumerable.cs deleted file mode 100644 index 4cc64229f87e..000000000000 --- a/tests/xharness/Jenkins/MakeTestTaskEnumerable.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using Microsoft.DotNet.XHarness.Common.Execution; -using Xharness.Jenkins.TestTasks; - -namespace Xharness.Jenkins { - class MakeTestTaskEnumerable : IEnumerable { - - readonly Jenkins jenkins; - readonly IProcessManager processManager; - - public MakeTestTaskEnumerable (Jenkins jenkins, IProcessManager processManager) - { - this.jenkins = jenkins ?? throw new ArgumentNullException (nameof (jenkins)); - this.processManager = processManager ?? throw new ArgumentNullException (nameof (processManager)); - } - - public IEnumerator GetEnumerator () - { - var run_mmp = new MakeTask (jenkins: jenkins, processManager: processManager) { - Platform = TestPlatform.Mac, - TestName = "MMP Regression Tests", - Target = "all", // -j" + Environment.ProcessorCount, - WorkingDirectory = Path.Combine (HarnessConfiguration.RootDirectory, "mmp-regression"), - Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Mmp) || !jenkins.TestSelection.IsEnabled (PlatformLabel.Mac), - Timeout = TimeSpan.FromMinutes (30), - SupportsParallelExecution = false, // Already doing parallel execution by running "make -jX" - }; - run_mmp.CompletedTask = new Task (() => { - foreach (var log in Directory.GetFiles (Path.GetFullPath (run_mmp.WorkingDirectory), "*.log", SearchOption.AllDirectories)) - run_mmp.Logs.AddFile (log, log.Substring (run_mmp.WorkingDirectory.Length + 1)); - }); - run_mmp.Environment.Add ("BUILD_REVISION", "jenkins"); // This will print "@MonkeyWrench: AddFile: " lines, which we can use to get the log filenames. - yield return run_mmp; - - var runMacBindingProject = new MakeTask (jenkins: jenkins, processManager: processManager) { - Platform = TestPlatform.Mac, - TestName = "Mac Binding Projects", - Target = "all", - WorkingDirectory = Path.Combine (HarnessConfiguration.RootDirectory, "mac-binding-project"), - Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.MacBindingProject) || !jenkins.TestSelection.IsEnabled (PlatformLabel.Mac) || !jenkins.TestSelection.IsEnabled (PlatformLabel.LegacyXamarin), - Timeout = TimeSpan.FromMinutes (15), - }; - yield return runMacBindingProject; - } - - IEnumerator IEnumerable.GetEnumerator () => GetEnumerator (); - } -} diff --git a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs index bc991bce25c2..7fdc30573980 100644 --- a/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs +++ b/tests/xharness/Jenkins/NUnitTestTasksEnumerable.cs @@ -22,9 +22,7 @@ public IEnumerator GetEnumerator () var msbuildTasksTestsProject = new TestProject (TestLabel.Msbuild, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "msbuild", "Xamarin.MacDev.Tasks.Tests", "Xamarin.MacDev.Tasks.Tests.csproj"))) { IsDotNetProject = true, }; - var env = new Dictionary - { - { "SYSTEM_MONO", this.jenkins.Harness.SYSTEM_MONO }, + var env = new Dictionary { }; var buildiOSMSBuild = new MSBuildTask (jenkins: jenkins, testProject: msbuildTasksTestsProject, processManager: processManager) { SpecifyPlatform = false, @@ -67,44 +65,6 @@ public IEnumerator GetEnumerator () }; yield return nunitExecutioniOSMSBuildIntegration; - var buildMTouch = new MakeTask (jenkins: jenkins, processManager: processManager) { - TestProject = new TestProject (TestLabel.Mtouch, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "mtouch", "mtouchtests.sln"))), - SpecifyPlatform = false, - SpecifyConfiguration = false, - Platform = TestPlatform.iOS, - Target = "dependencies", - WorkingDirectory = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "mtouch")), - }; - var nunitExecutionMTouch = new NUnitExecuteTask (jenkins, buildMTouch, processManager) { - TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "mtouch", "bin", "Debug", "mtouchtests.dll"), - TestProject = new TestProject (TestLabel.Mtouch, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "mtouch", "mtouchtests.csproj"))), - Platform = TestPlatform.iOS, - TestName = "MTouch tests", - Timeout = TimeSpan.FromMinutes (180), - Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Mtouch) || !jenkins.TestSelection.IsEnabled (PlatformLabel.iOS), - InProcess = true, - }; - yield return nunitExecutionMTouch; - - var buildGenerator = new MakeTask (jenkins: jenkins, processManager: processManager) { - TestProject = new TestProject (TestLabel.Generator, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "..", "src", "generator.sln"))), - SpecifyPlatform = false, - SpecifyConfiguration = false, - Platform = TestPlatform.iOS, - Target = "build-unit-tests", - WorkingDirectory = Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "generator")), - }; - var runGenerator = new NUnitExecuteTask (jenkins, buildGenerator, processManager) { - TestLibrary = Path.Combine (HarnessConfiguration.RootDirectory, "generator", "bin", "Debug", "generator-tests.dll"), - TestProject = new TestProject (TestLabel.Generator, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "generator", "generator-tests.csproj"))), - Platform = TestPlatform.iOS, - TestName = "Generator tests", - Mode = "NUnit", - Timeout = TimeSpan.FromMinutes (10), - Ignored = !jenkins.TestSelection.IsEnabled (TestLabel.Generator) || !jenkins.Harness.INCLUDE_XAMARIN_LEGACY, - }; - yield return runGenerator; - var buildCecilTestsProject = new TestProject (TestLabel.Cecil, Path.GetFullPath (Path.Combine (HarnessConfiguration.RootDirectory, "cecil-tests", "cecil-tests.csproj"))) { IsDotNetProject = true, }; diff --git a/tests/xharness/Jenkins/Reports/HtmlReportWriter.cs b/tests/xharness/Jenkins/Reports/HtmlReportWriter.cs index b044b13583d6..ace5e7b056a3 100644 --- a/tests/xharness/Jenkins/Reports/HtmlReportWriter.cs +++ b/tests/xharness/Jenkins/Reports/HtmlReportWriter.cs @@ -172,7 +172,6 @@ public void Write (IList allTasks, StreamWriter writer)
  • All simulator tests
  • All iOS tests
  • All tvOS tests
  • -
  • All watchOS tests
  • All Mac tests
  • @@ -183,7 +182,6 @@ public void Write (IList allTasks, StreamWriter writer)
  • All simulator tests
  • All iOS tests
  • All tvOS tests
  • -
  • All watchOS tests
  • All Mac tests
  • @@ -418,11 +416,7 @@ public void Write (IList allTasks, StreamWriter writer) writer.WriteLine ($"Time Elapsed: {test.TestName} - (waiting time : {test.WaitingDuration} , running time : {test.Duration})
    "); var runDeviceTest = runTest as RunDeviceTask; if (runDeviceTest?.Device is not null) { - if (runDeviceTest.CompanionDevice is not null) { - writer.WriteLine ($"Device: {runDeviceTest.Device.Name} ({runDeviceTest.CompanionDevice.Name})
    "); - } else { - writer.WriteLine ($"Device: {runDeviceTest.Device.Name}
    "); - } + writer.WriteLine ($"Device: {runDeviceTest.Device.Name}
    "); } } else { if (test.Duration.Ticks > 0) diff --git a/tests/xharness/Jenkins/RunDeviceTasksFactory.cs b/tests/xharness/Jenkins/RunDeviceTasksFactory.cs index 1c6611949938..32833f6e34c3 100644 --- a/tests/xharness/Jenkins/RunDeviceTasksFactory.cs +++ b/tests/xharness/Jenkins/RunDeviceTasksFactory.cs @@ -29,27 +29,21 @@ public Task> CreateAsync (Jenkins jenkins, IMlaunchProces projectTasks.Clear (); bool createiOS; - bool createTodayExtension; bool createtvOS; - bool createwatchOS; if (project.GenerateVariations) { createiOS = !project.SkipiOSVariation; - createTodayExtension = !project.SkipTodayExtensionVariation; createtvOS = !project.SkiptvOSVariation; - createwatchOS = !project.SkipwatchOSVariation; } else { - createiOS = project.TestPlatform == TestPlatform.iOS_Unified; - createTodayExtension = project.TestPlatform == TestPlatform.iOS_TodayExtension64; + createiOS = project.TestPlatform == TestPlatform.iOS; createtvOS = project.TestPlatform == TestPlatform.tvOS; - createwatchOS = project.TestPlatform == TestPlatform.watchOS; } if (createiOS) { var build64 = new MSBuildTask (jenkins: jenkins, testProject: project, processManager: processManager) { ProjectConfiguration = "Debug", ProjectPlatform = "iPhone", - Platform = TestPlatform.iOS_Unified64, + Platform = TestPlatform.iOS, TestName = project.Name, }; build64.CloneTestProject (jenkins.MainLog, processManager, project, HarnessConfiguration.RootDirectory); @@ -62,26 +56,6 @@ public Task> CreateAsync (Jenkins jenkins, IMlaunchProces errorKnowledgeBase: jenkins.ErrorKnowledgeBase, useTcpTunnel: jenkins.Harness.UseTcpTunnel, candidates: jenkins.Devices.Connected64BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.TestSelection.IsEnabled (PlatformLabel.iOS) }); - - if (createTodayExtension) { - var todayProject = project.GenerateVariations ? project.AsTodayExtensionProject () : project; - var buildToday = new MSBuildTask (jenkins: jenkins, testProject: todayProject, processManager: processManager) { - ProjectConfiguration = "Debug", - ProjectPlatform = "iPhone", - Platform = TestPlatform.iOS_TodayExtension64, - TestName = project.Name, - }; - buildToday.CloneTestProject (jenkins.MainLog, processManager, todayProject, HarnessConfiguration.RootDirectory); - projectTasks.Add (new RunDeviceTask ( - jenkins: jenkins, - devices: jenkins.Devices, - buildTask: buildToday, - processManager: processManager, - tunnelBore: jenkins.TunnelBore, - errorKnowledgeBase: jenkins.ErrorKnowledgeBase, - useTcpTunnel: jenkins.Harness.UseTcpTunnel, - candidates: jenkins.Devices.Connected64BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.TestSelection.IsEnabled (PlatformLabel.iOSExtension), BuildOnly = jenkins.ForceExtensionBuildOnly }); - } } if (createtvOS) { @@ -104,27 +78,6 @@ public Task> CreateAsync (Jenkins jenkins, IMlaunchProces candidates: jenkins.Devices.ConnectedTV.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.TestSelection.IsEnabled (PlatformLabel.tvOS) }); } - if (createwatchOS) { - var watchOSProject = project.GenerateVariations ? project.AsWatchOSProject () : project; - if (!project.SkipwatchOSARM64_32Variation) { - var buildWatch64_32 = new MSBuildTask (jenkins: jenkins, testProject: watchOSProject, processManager: processManager) { - ProjectConfiguration = "Release", // We don't support Debug for ARM64_32 yet. - ProjectPlatform = "iPhone", - Platform = TestPlatform.watchOS_64_32, - TestName = project.Name, - }; - buildWatch64_32.CloneTestProject (jenkins.MainLog, processManager, watchOSProject, HarnessConfiguration.RootDirectory); - projectTasks.Add (new RunDeviceTask ( - jenkins: jenkins, - devices: jenkins.Devices, - buildTask: buildWatch64_32, - processManager: processManager, - tunnelBore: jenkins.TunnelBore, - errorKnowledgeBase: jenkins.ErrorKnowledgeBase, - useTcpTunnel: jenkins.Harness.UseTcpTunnel, - candidates: jenkins.Devices.ConnectedWatch32_64.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.TestSelection.IsEnabled (PlatformLabel.watchOS) }); - } - } foreach (var task in projectTasks) { task.TimeoutMultiplier = project.TimeoutMultiplier; task.BuildOnly |= project.BuildOnly; diff --git a/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs b/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs index b0821bfb9aa2..6555f78cf291 100644 --- a/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs +++ b/tests/xharness/Jenkins/RunSimulatorTasksFactory.cs @@ -29,11 +29,9 @@ public async Task> CreateAsync (Jenkins jenkins, IMlaunch ps.Add (new Tuple (project, project.TestPlatform, ignored)); } else { if (!project.SkipiOSVariation) - ps.Add (new Tuple (project, TestPlatform.iOS_Unified, ignored)); + ps.Add (new Tuple (project, TestPlatform.iOS, ignored)); if (!project.SkiptvOSVariation) ps.Add (new Tuple (project.AsTvOSProject (), TestPlatform.tvOS, ignored)); - if (!project.SkipwatchOSVariation) - ps.Add (new Tuple (project.AsWatchOSProject (), TestPlatform.watchOS, ignored)); } var configurations = project.Configurations; @@ -44,16 +42,12 @@ public async Task> CreateAsync (Jenkins jenkins, IMlaunch var configIgnored = pair.Item3; var testPlatform = pair.Item2; switch (testPlatform) { - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_TodayExtension64: + case TestPlatform.iOS: configIgnored |= !jenkins.TestSelection.IsEnabled (PlatformLabel.iOS); break; case TestPlatform.tvOS: configIgnored |= !jenkins.TestSelection.IsEnabled (PlatformLabel.tvOS); break; - case TestPlatform.watchOS: - configIgnored |= !jenkins.TestSelection.IsEnabled (PlatformLabel.watchOS); - break; default: Console.WriteLine ("Unknown test platform for ignore check: {0}", testPlatform); break; @@ -116,16 +110,8 @@ IEnumerable CreateAsync (Jenkins jenkins, IMlaunchProcessManag platforms = new TestPlatform [] { TestPlatform.tvOS }; ignored = new [] { false }; break; - case TestPlatform.watchOS: - platforms = new TestPlatform [] { TestPlatform.watchOS_32 }; - ignored = new [] { false }; - break; - case TestPlatform.iOS_Unified: - platforms = new TestPlatform [] { TestPlatform.iOS_Unified64 }; - ignored = new [] { false }; - break; - case TestPlatform.iOS_TodayExtension64: - platforms = new TestPlatform [] { TestPlatform.iOS_TodayExtension64 }; + case TestPlatform.iOS: + platforms = new TestPlatform [] { TestPlatform.iOS }; ignored = new [] { false }; break; default: diff --git a/tests/xharness/Jenkins/TestData.cs b/tests/xharness/Jenkins/TestData.cs index 423702dc0150..62606cf308eb 100644 --- a/tests/xharness/Jenkins/TestData.cs +++ b/tests/xharness/Jenkins/TestData.cs @@ -15,11 +15,9 @@ class TestData { public string Undefines; public bool? Ignored; public bool EnableSGenConc; - public bool UseThumb; public bool UseLlvm; public bool? UseMonoRuntime; public IEnumerable Candidates; - public string XamMacArch; public string RuntimeIdentifier; public string Registrar; public bool PublishAot; // NativeAOT diff --git a/tests/xharness/Jenkins/TestSelector.cs b/tests/xharness/Jenkins/TestSelector.cs index 7cb75de37de8..2df4c53e1cf5 100644 --- a/tests/xharness/Jenkins/TestSelector.cs +++ b/tests/xharness/Jenkins/TestSelector.cs @@ -20,11 +20,9 @@ class TestSelection { PlatformLabel platform = PlatformLabel.None | PlatformLabel.tvOS | - PlatformLabel.watchOS | PlatformLabel.iOS | PlatformLabel.iOSSimulator | PlatformLabel.MacCatalyst | - PlatformLabel.LegacyXamarin | PlatformLabel.Dotnet; public bool ForceExtensionBuildOnly { get; set; } @@ -263,20 +261,6 @@ public void SelectTests (TestSelection selection) selection.SetEnabled (PlatformLabel.MacCatalyst, false); } - if (!Harness.ENABLE_DOTNET) { - MainLog?.WriteLine ("The .NET build is disabled, so any .NET tests will be disabled as well."); - selection.SetEnabled (PlatformLabel.Dotnet, false); - } - - if (!Harness.INCLUDE_XAMARIN_LEGACY) { - MainLog?.WriteLine ("The legacy Xamarin build is disabled, so any legacy Xamarin tests will be disabled as well."); - selection.SetEnabled (PlatformLabel.LegacyXamarin, false); - selection.SetEnabled (PlatformLabel.watchOS, false); - selection.SetEnabled (TestLabel.Mmp, false); - selection.SetEnabled (TestLabel.Mtouch, false); - selection.SetEnabled (TestLabel.Xammac, false); - } - MainLog?.WriteLine ($"Final test selection: tests: {selection.SelectedTests} platforms: {selection.SelectedPlatforms}"); } } diff --git a/tests/xharness/Jenkins/TestServer.cs b/tests/xharness/Jenkins/TestServer.cs index 3b372eff3bae..3ae207a9a13f 100644 --- a/tests/xharness/Jenkins/TestServer.cs +++ b/tests/xharness/Jenkins/TestServer.cs @@ -153,10 +153,6 @@ IEnumerable find_tasks (StreamWriter writer, string ids) case "?all-ios": switch (task.Platform) { case TestPlatform.iOS: - case TestPlatform.iOS_TodayExtension64: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_Unified32: - case TestPlatform.iOS_Unified64: is_match = true; break; default: @@ -176,25 +172,9 @@ IEnumerable find_tasks (StreamWriter writer, string ids) break; } break; - case "?all-watchos": - switch (task.Platform) { - case TestPlatform.watchOS: - case TestPlatform.watchOS_32: - case TestPlatform.watchOS_64_32: - is_match = true; - break; - default: - if (task.Platform.ToString ().StartsWith ("watchOS", StringComparison.Ordinal)) - throw new NotImplementedException (); - break; - } - break; case "?all-mac": switch (task.Platform) { case TestPlatform.Mac: - case TestPlatform.Mac_Modern: - case TestPlatform.Mac_Full: - case TestPlatform.Mac_System: is_match = true; break; default: diff --git a/tests/xharness/Jenkins/TestTasks/AppleTestTask.cs b/tests/xharness/Jenkins/TestTasks/AppleTestTask.cs index 31c1cea5b172..135558692cd1 100644 --- a/tests/xharness/Jenkins/TestTasks/AppleTestTask.cs +++ b/tests/xharness/Jenkins/TestTasks/AppleTestTask.cs @@ -38,29 +38,12 @@ public override void SetEnvironmentVariables (Process process) switch (Platform) { case TestPlatform.iOS: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_Unified32: - case TestPlatform.iOS_Unified64: - case TestPlatform.iOS_TodayExtension64: case TestPlatform.tvOS: - case TestPlatform.watchOS: - case TestPlatform.watchOS_32: - case TestPlatform.watchOS_64_32: case TestPlatform.MacCatalyst: process.StartInfo.EnvironmentVariables ["MD_APPLE_SDK_ROOT"] = xcodeRoot; - process.StartInfo.EnvironmentVariables ["MD_MTOUCH_SDK_ROOT"] = Path.Combine (Jenkins.Harness.IOS_DESTDIR, "Library", "Frameworks", "Xamarin.iOS.framework", "Versions", "Current"); - process.StartInfo.EnvironmentVariables ["TargetFrameworkFallbackSearchPaths"] = Path.Combine (Jenkins.Harness.IOS_DESTDIR, "Library", "Frameworks", "Mono.framework", "External", "xbuild-frameworks"); - process.StartInfo.EnvironmentVariables ["MSBuildExtensionsPathFallbackPathsOverride"] = Path.Combine (Jenkins.Harness.IOS_DESTDIR, "Library", "Frameworks", "Mono.framework", "External", "xbuild"); break; case TestPlatform.Mac: - case TestPlatform.Mac_Modern: - case TestPlatform.Mac_Full: - case TestPlatform.Mac_System: process.StartInfo.EnvironmentVariables ["MD_APPLE_SDK_ROOT"] = xcodeRoot; - process.StartInfo.EnvironmentVariables ["TargetFrameworkFallbackSearchPaths"] = Path.Combine (Jenkins.Harness.MAC_DESTDIR, "Library", "Frameworks", "Mono.framework", "External", "xbuild-frameworks"); - process.StartInfo.EnvironmentVariables ["MSBuildExtensionsPathFallbackPathsOverride"] = Path.Combine (Jenkins.Harness.MAC_DESTDIR, "Library", "Frameworks", "Mono.framework", "External", "xbuild"); - process.StartInfo.EnvironmentVariables ["XamarinMacFrameworkRoot"] = Path.Combine (Jenkins.Harness.MAC_DESTDIR, "Library", "Frameworks", "Xamarin.Mac.framework", "Versions", "Current"); - process.StartInfo.EnvironmentVariables ["XAMMAC_FRAMEWORK_PATH"] = Path.Combine (Jenkins.Harness.MAC_DESTDIR, "Library", "Frameworks", "Xamarin.Mac.framework", "Versions", "Current"); break; case TestPlatform.All: // Don't set: @@ -69,9 +52,6 @@ public override void SetEnvironmentVariables (Process process) // because these values used by both XM and XI and we can't set it to two different values at the same time. // Any test that depends on these values should not be using 'TestPlatform.All' process.StartInfo.EnvironmentVariables ["MD_APPLE_SDK_ROOT"] = xcodeRoot; - process.StartInfo.EnvironmentVariables ["MD_MTOUCH_SDK_ROOT"] = Path.Combine (Jenkins.Harness.IOS_DESTDIR, "Library", "Frameworks", "Xamarin.iOS.framework", "Versions", "Current"); - process.StartInfo.EnvironmentVariables ["XamarinMacFrameworkRoot"] = Path.Combine (Jenkins.Harness.MAC_DESTDIR, "Library", "Frameworks", "Xamarin.Mac.framework", "Versions", "Current"); - process.StartInfo.EnvironmentVariables ["XAMMAC_FRAMEWORK_PATH"] = Path.Combine (Jenkins.Harness.MAC_DESTDIR, "Library", "Frameworks", "Xamarin.Mac.framework", "Versions", "Current"); break; default: throw new NotImplementedException ($"Unknown test platform: {Platform}"); diff --git a/tests/xharness/Jenkins/TestTasks/IRunXITask.cs b/tests/xharness/Jenkins/TestTasks/IRunXITask.cs index 2a4a512129e6..f2aab4b305d9 100644 --- a/tests/xharness/Jenkins/TestTasks/IRunXITask.cs +++ b/tests/xharness/Jenkins/TestTasks/IRunXITask.cs @@ -10,6 +10,5 @@ public interface IRunXITask : IRunTestTask where TDevice : class, IDevi TestTarget AppRunnerTarget { get; set; } IEnumerable Candidates { get; } TDevice Device { get; set; } - TDevice CompanionDevice { get; set; } } } diff --git a/tests/xharness/Jenkins/TestTasks/MacExecuteTask.cs b/tests/xharness/Jenkins/TestTasks/MacExecuteTask.cs index 785ce2e0e68d..16e1bd6ea469 100644 --- a/tests/xharness/Jenkins/TestTasks/MacExecuteTask.cs +++ b/tests/xharness/Jenkins/TestTasks/MacExecuteTask.cs @@ -27,14 +27,6 @@ public MacExecuteTask (Jenkins jenkins, BuildToolTask build_task, IMlaunchProces public override bool SupportsParallelExecution { get { - if (TestName.Contains ("xammac")) { - // We run the xammac tests in both Debug and Release configurations. - // These tests are not written to support parallel execution - // (there are hard coded paths used for instance), so disable - // parallel execution for these tests. - return false; - } - return base.SupportsParallelExecution; } } @@ -52,17 +44,6 @@ public override async Task RunTestAsync () if (string.Equals ("mac", name, StringComparison.OrdinalIgnoreCase)) name = System.IO.Path.GetFileName (System.IO.Path.GetDirectoryName (projectDir)); var suffix = string.Empty; - switch (Platform) { - case TestPlatform.Mac_Modern: - suffix = "-modern"; - break; - case TestPlatform.Mac_Full: - suffix = "-full"; - break; - case TestPlatform.Mac_System: - suffix = "-system"; - break; - } if (ProjectFile.EndsWith (".sln", StringComparison.Ordinal)) { Path = System.IO.Path.Combine (System.IO.Path.GetDirectoryName (ProjectFile), "bin", BuildTask.ProjectPlatform, BuildTask.ProjectConfiguration + suffix, name + ".app", "Contents", "MacOS", name); } else { diff --git a/tests/xharness/Jenkins/TestTasks/MacTask.cs b/tests/xharness/Jenkins/TestTasks/MacTask.cs index a7037c9d5652..3a51f44b5850 100644 --- a/tests/xharness/Jenkins/TestTasks/MacTask.cs +++ b/tests/xharness/Jenkins/TestTasks/MacTask.cs @@ -12,13 +12,7 @@ public override string Mode { get { switch (Platform) { case TestPlatform.Mac: - return TestProject?.IsDotNetProject == true ? "Mac [dotnet]" : "Mac"; - case TestPlatform.Mac_Modern: - return "Mac Modern"; - case TestPlatform.Mac_Full: - return "Mac Full"; - case TestPlatform.Mac_System: - return "Mac System"; + return "Mac [dotnet]"; case TestPlatform.MacCatalyst: return "Mac Catalyst [dotnet]"; default: diff --git a/tests/xharness/Jenkins/TestTasks/RunDevice.cs b/tests/xharness/Jenkins/TestTasks/RunDevice.cs index 751eeb928ee0..dcf107c59dfb 100644 --- a/tests/xharness/Jenkins/TestTasks/RunDevice.cs +++ b/tests/xharness/Jenkins/TestTasks/RunDevice.cs @@ -58,22 +58,11 @@ public RunDevice (IRunDeviceTask testTask, switch (testTask.BuildTask.Platform) { case TestPlatform.iOS: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_Unified32: - case TestPlatform.iOS_Unified64: - testTask.AppRunnerTarget = TestTarget.Device_iOS; - break; - case TestPlatform.iOS_TodayExtension64: testTask.AppRunnerTarget = TestTarget.Device_iOS; break; case TestPlatform.tvOS: testTask.AppRunnerTarget = TestTarget.Device_tvOS; break; - case TestPlatform.watchOS: - case TestPlatform.watchOS_32: - case TestPlatform.watchOS_64_32: - testTask.AppRunnerTarget = TestTarget.Device_watchOS; - break; } } @@ -86,8 +75,6 @@ public async Task RunTestAsync () try { // Set the device we acquired. testTask.Device = testTask.Candidates.First ((d) => d.UDID == device_resource.Resource.Name); - if (testTask.Device.DevicePlatform == DevicePlatform.watchOS) - testTask.CompanionDevice = await devices.FindCompanionDevice (deviceLoadLog, testTask.Device); mainLog.WriteLine ("Acquired device '{0}' for '{1}'", testTask.Device.Name, testTask.ProjectFile); ITunnelBore tunnelBore = null; @@ -115,7 +102,6 @@ public async Task RunTestAsync () logs: new Logs (testTask.LogDirectory ?? defaultLogDirectory), buildConfiguration: testTask.ProjectConfiguration, deviceName: testTask.Device.Name, - companionDeviceName: testTask.CompanionDevice?.Name, timeoutMultiplier: testTask.TimeoutMultiplier, variation: testTask.Variation, buildTask: testTask.BuildTask); @@ -172,45 +158,7 @@ public async Task RunTestAsync () mainLog.WriteLine ($"Test run has a known failure: '{testTask.KnownFailure}'"); } - if (testTask.Runner.Result == TestExecutingResult.Succeeded && testTask.Platform == TestPlatform.iOS_TodayExtension64) { - // For the today extension, the main app is just a single test. - // This is because running the today extension will not wake up the device, - // nor will it close & reopen the today app (but launching the main app - // will do both of these things, preparing the device for launching the today extension). - - AppRunner todayRunner = new AppRunner (testTask.ProcessManager, - new AppBundleInformationParser (testTask.ProcessManager, testTask.Harness.AppBundleLocator), - new SimulatorLoaderFactory (testTask.ProcessManager), - new SimpleListenerFactory (tunnelBore), - new DeviceLoaderFactory (testTask.ProcessManager), - new CrashSnapshotReporterFactory (testTask.ProcessManager), - new CaptureLogFactory (), - new DeviceLogCapturerFactory (testTask.ProcessManager), - new TestReporterFactory (testTask.ProcessManager), - testTask.AppRunnerTarget, - testTask.Harness, - projectFilePath: testTask.ProjectFile, - mainLog: testTask.Logs.Create ($"extension-run-{testTask.Device.UDID}-{Harness.Helpers.Timestamp}.log", "Extension run log"), - logs: new Logs (testTask.LogDirectory ?? defaultLogDirectory), - buildConfiguration: testTask.ProjectConfiguration, - deviceName: testTask.Device.Name, - companionDeviceName: testTask.CompanionDevice?.Name, - timeoutMultiplier: testTask.TimeoutMultiplier, - variation: testTask.Variation, - buildTask: testTask.BuildTask); - await todayRunner.InitializeAsync (); - - testTask.AdditionalRunner = todayRunner; - await todayRunner.RunAsync (); - foreach (var log in todayRunner.Logs.Where ((v) => !v.Description.StartsWith ("Extension ", StringComparison.Ordinal))) - log.Description = "Extension " + log.Description [0].ToString ().ToLower () + log.Description.Substring (1); - testTask.ExecutionResult = todayRunner.Result; - - if (!string.IsNullOrEmpty (todayRunner.FailureMessage)) - testTask.FailureMessage = todayRunner.FailureMessage; - } else { - testTask.ExecutionResult = testTask.Runner.Result; - } + testTask.ExecutionResult = testTask.Runner.Result; } } finally { // Uninstall again, so that we don't leave junk behind and fill up the device. diff --git a/tests/xharness/Jenkins/TestTasks/RunDeviceTask.cs b/tests/xharness/Jenkins/TestTasks/RunDeviceTask.cs index 2ede0e1b8598..19788fbefd1c 100644 --- a/tests/xharness/Jenkins/TestTasks/RunDeviceTask.cs +++ b/tests/xharness/Jenkins/TestTasks/RunDeviceTask.cs @@ -18,14 +18,14 @@ public override string ProgressMessage { if (log is null) return base.ProgressMessage; - var percent_complete = log.CopyingApp ? log.AppPercentComplete : log.WatchAppPercentComplete; - var bytes = log.CopyingApp ? log.AppBytes : log.WatchAppBytes; - var total_bytes = log.CopyingApp ? log.AppTotalBytes : log.WatchAppTotalBytes; - var elapsed = log.CopyingApp ? log.AppCopyDuration : log.WatchAppCopyDuration; + var percent_complete = log.AppPercentComplete; + var bytes = log.AppBytes; + var total_bytes = log.AppTotalBytes; + var elapsed = log.AppCopyDuration; var speed_bps = elapsed.Ticks == 0 ? -1 : bytes / elapsed.TotalSeconds; var estimated_left = TimeSpan.FromSeconds ((total_bytes - bytes) / speed_bps); var transfer_percent = 100 * (double) bytes / total_bytes; - var str = log.CopyingApp ? "App" : "Watch App"; + var str = "App"; var rv = $"{str} installation: {percent_complete}% done.\n" + $"\tApp size: {total_bytes:N0} bytes ({total_bytes / 1024.0 / 1024.0:N2} MB)\n" + $"\tTransferred: {bytes:N0} bytes ({bytes / 1024.0 / 1024.0:N2} MB)\n" + diff --git a/tests/xharness/Jenkins/TestTasks/RunSimulator.cs b/tests/xharness/Jenkins/TestTasks/RunSimulator.cs index 802149ef7863..3ca44c032ae6 100644 --- a/tests/xharness/Jenkins/TestTasks/RunSimulator.cs +++ b/tests/xharness/Jenkins/TestTasks/RunSimulator.cs @@ -21,11 +21,10 @@ public class RunSimulator { public IEnumerable Simulators { get { - if (testTask.Device is null) return Array.Empty (); - else if (testTask.CompanionDevice is null) { - return new ISimulatorDevice [] { testTask.Device }; + if (testTask.Device is null) { + return Array.Empty (); } else { - return new ISimulatorDevice [] { testTask.Device, testTask.CompanionDevice }; + return new ISimulatorDevice [] { testTask.Device }; } } } @@ -43,9 +42,8 @@ public RunSimulator (IRunSimulatorTask testTask, this.simulatorLoadLog = simulatorLoadLog ?? throw new ArgumentNullException (nameof (simulatorLoadLog)); var project = Path.GetFileNameWithoutExtension (testTask.ProjectFile); - if (project.EndsWith ("-tvos", StringComparison.Ordinal)) testTask.AppRunnerTarget = TestTarget.Simulator_tvOS; - else if (project.EndsWith ("-watchos", StringComparison.Ordinal)) { - testTask.AppRunnerTarget = TestTarget.Simulator_watchOS; + if (project.EndsWith ("-tvos", StringComparison.Ordinal)) { + testTask.AppRunnerTarget = TestTarget.Simulator_tvOS; } else { testTask.AppRunnerTarget = TestTarget.Simulator_iOS64; } @@ -66,8 +64,6 @@ public async Task FindSimulatorAsync () testTask.FailureMessage = "No applicable devices found."; } else { testTask.Device = testTask.Candidates.First (); - if (testTask.Platform == TestPlatform.watchOS) - testTask.CompanionDevice = await simulators.FindCompanionDevice (simulatorLoadLog, testTask.Device); } } catch (Exception e) { testTask.ExecutionResult = TestExecutingResult.DeviceNotFound; @@ -87,7 +83,7 @@ public async Task SelectSimulatorAsync () await FindSimulatorAsync (); - var clean_state = false;//Platform == TestPlatform.watchOS; + var clean_state = false; testTask.Runner = new AppRunner (testTask.ProcessManager, new AppBundleInformationParser (testTask.ProcessManager, testTask.Harness.AppBundleLocator), new SimulatorLoaderFactory (testTask.ProcessManager), @@ -107,8 +103,7 @@ public async Task SelectSimulatorAsync () timeoutMultiplier: testTask.TimeoutMultiplier, variation: testTask.Variation, buildTask: testTask.BuildTask, - simulator: testTask.Device, - companionSimulator: testTask.CompanionDevice); + simulator: testTask.Device); await testTask.Runner.InitializeAsync (); } diff --git a/tests/xharness/Jenkins/TestTasks/RunXITask.cs b/tests/xharness/Jenkins/TestTasks/RunXITask.cs index a58db1ae76f5..24e1f513d10f 100644 --- a/tests/xharness/Jenkins/TestTasks/RunXITask.cs +++ b/tests/xharness/Jenkins/TestTasks/RunXITask.cs @@ -45,20 +45,9 @@ public override string Mode { switch (Platform) { case TestPlatform.tvOS: - case TestPlatform.watchOS: return Platform.ToString () + " - " + XIMode; - case TestPlatform.watchOS_32: - return "watchOS 32-bits - " + XIMode; - case TestPlatform.watchOS_64_32: - return "watchOS 64-bits (ARM64_32) - " + XIMode; - case TestPlatform.iOS_Unified32: - return "iOS Unified 32-bits - " + XIMode; - case TestPlatform.iOS_Unified64: - return "iOS Unified 64-bits - " + XIMode; - case TestPlatform.iOS_TodayExtension64: - return "iOS Unified Today Extension 64-bits - " + XIMode; - case TestPlatform.iOS_Unified: - return "iOS Unified - " + XIMode; + case TestPlatform.iOS: + return "iOS - " + XIMode; default: throw new NotImplementedException (); } diff --git a/tests/xharness/Jenkins/TestTasks/TestTask.cs b/tests/xharness/Jenkins/TestTasks/TestTask.cs index 0aac8a450fc9..758dbb66ae08 100644 --- a/tests/xharness/Jenkins/TestTasks/TestTask.cs +++ b/tests/xharness/Jenkins/TestTasks/TestTask.cs @@ -142,20 +142,9 @@ public virtual string TestName { switch (Platform) { case TestPlatform.Mac: return rv; - case TestPlatform.Mac_Modern: - return rv;//.Substring (0, rv.Length - "-unified".Length); - case TestPlatform.Mac_Full: - return rv.Substring (0, rv.Length - "-full".Length); - case TestPlatform.Mac_System: - return rv.Substring (0, rv.Length - "-system".Length); default: - if (rv.EndsWith ("-watchos", StringComparison.Ordinal)) return rv.Substring (0, rv.Length - 8); - else if (rv.EndsWith ("-tvos", StringComparison.Ordinal)) { + if (rv.EndsWith ("-tvos", StringComparison.Ordinal)) { return rv.Substring (0, rv.Length - 5); - } else if (rv.EndsWith ("-unified", StringComparison.Ordinal)) { - return rv.Substring (0, rv.Length - 8); - } else if (rv.EndsWith ("-today", StringComparison.Ordinal)) { - return rv.Substring (0, rv.Length - 6); } else { return rv; } diff --git a/tests/xharness/Jenkins/TestVariationsFactory.cs b/tests/xharness/Jenkins/TestVariationsFactory.cs index 946116e9759e..3b8c2d1165a6 100644 --- a/tests/xharness/Jenkins/TestVariationsFactory.cs +++ b/tests/xharness/Jenkins/TestVariationsFactory.cs @@ -30,8 +30,8 @@ IEnumerable GetTestData (RunTestTask test) // This function returns additional test configurations (in addition to the default one) for the specific test // 32-bit interpreter doesn't work yet: https://github.com/mono/mono/issues/9871 - var supports_interpreter = test.Platform != TestPlatform.iOS_Unified32; - var supports_dynamic_registrar_on_device = test.Platform == TestPlatform.iOS_Unified64 || test.Platform == TestPlatform.tvOS; + var supports_interpreter = true; + var supports_dynamic_registrar_on_device = true; var ignore = test.TestProject.Ignore; var mac_supports_arm64 = Harness.CanRunArm64; var arm64_runtime_identifier = string.Empty; @@ -49,8 +49,6 @@ IEnumerable GetTestData (RunTestTask test) x64_runtime_identifier = "maccatalyst-x64"; break; case TestPlatform.iOS: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_Unified64: arm64_sim_runtime_identifier = "iossimulator-arm64"; x64_sim_runtime_identifier = "iossimulator-x64"; break; @@ -62,22 +60,9 @@ IEnumerable GetTestData (RunTestTask test) switch (test.ProjectPlatform) { case "iPhone": - // arm64_32 is only supported for Release builds for now. - // arm32 bits too big for debug builds - https://github.com/xamarin/maccore/issues/2080 - var supports_debug = test.Platform != TestPlatform.watchOS_64_32 && !(test.TestName == "dont link" && test.Platform == TestPlatform.iOS_Unified32); - - /* we don't add --assembly-build-target=@all=staticobject because that's the default in all our test projects */ - if (supports_debug && !test.TestProject.IsDotNetProject) { - yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = false, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = false, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@all=dynamiclibrary", Debug = true, Profiling = true, Ignored = ignore }; - yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug, profiling)", AppBundleExtraOptions = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject", Debug = true, Profiling = true, Ignored = ignore }; - } - + var supports_debug = true; if (test.ProjectConfiguration.Contains ("Debug")) yield return new TestData { Variation = "Release", Debug = false, Profiling = false }; - if (test.Platform == TestPlatform.iOS_Unified32 && !test.TestProject.IsDotNetProject) - yield return new TestData { Variation = "Release: UseThumb", Debug = false, Profiling = false, UseThumb = true }; // Disable this by default for tvOS/Release because the app ends up being too big (https://github.com/xamarin/maccore/issues/2282) var sdk_release_skip = test.Platform == TestPlatform.tvOS && test.TestName == "dont link"; @@ -125,9 +110,6 @@ IEnumerable GetTestData (RunTestTask test) } break; case "iPhoneSimulator": - if (test.Platform == TestPlatform.iOS_Unified32) - ignore = true; - switch (test.TestName) { case "monotouch-test": // The default is to run monotouch-test with the dynamic registrar (in the simulator), so that's already covered @@ -162,6 +144,8 @@ IEnumerable GetTestData (RunTestTask test) break; case "AnyCPU": case "x86": + case "": + case null: switch (test.TestName) { case "monotouch-test": if (test.TestProject.IsDotNetProject) { @@ -192,18 +176,6 @@ IEnumerable GetTestData (RunTestTask test) } } break; - case "xammac tests": - switch (test.ProjectConfiguration) { - case "Release": - yield return new TestData { Variation = "Release (all optimizations)", AppBundleExtraOptions = "--optimize:all", Registrar = "static", Debug = false, LinkMode = "Full", Defines = "OPTIMIZEALL" }; - yield return new TestData { Variation = "Release (ARM64)", XamMacArch = "ARM64", Debug = false, Ignored = !mac_supports_arm64 || !jenkins.TestSelection.IsEnabled (TestLabel.Xammac) || !jenkins.TestSelection.IsEnabled (PlatformLabel.Mac) }; - break; - case "Debug": - yield return new TestData { Variation = "Debug (all optimizations)", AppBundleExtraOptions = "--optimize:all,-remove-uithread-checks", Registrar = "static", Debug = true, LinkMode = "Full", Defines = "OPTIMIZEALL", Ignored = !(jenkins.TestSelection.IsEnabled (TestLabel.All) && jenkins.TestSelection.IsEnabled (PlatformLabel.Mac)) }; - yield return new TestData { Variation = "Debug (ARM64)", XamMacArch = "ARM64", Debug = true, Ignored = !mac_supports_arm64 || !jenkins.TestSelection.IsEnabled (TestLabel.Xammac) || !jenkins.TestSelection.IsEnabled (PlatformLabel.Mac) }; - break; - } - break; } break; default: @@ -236,7 +208,6 @@ public IEnumerable CreateTestVariations (IEnumerable tests, Func CreateTestVariations (IEnumerable tests, Func CreateTestVariations (IEnumerable tests, Func TestPlatform.Mac, - MacFlavors.Full => TestPlatform.Mac_Full, - MacFlavors.Modern => TestPlatform.Mac_Modern, - MacFlavors.System => TestPlatform.Mac_System, MacFlavors.DotNet => TestPlatform.Mac, MacFlavors.MacCatalyst => TestPlatform.MacCatalyst, - (MacFlavors.Full | MacFlavors.Modern) => (TestPlatform.Mac | TestPlatform.Mac_Modern), _ => throw new NotImplementedException (flavor.ToString ()), }; } diff --git a/tests/xharness/MacTestProject.cs b/tests/xharness/MacTestProject.cs index 6857d3d03076..5e9d78798d87 100644 --- a/tests/xharness/MacTestProject.cs +++ b/tests/xharness/MacTestProject.cs @@ -3,10 +3,7 @@ namespace Xharness { [Flags] public enum MacFlavors { - Modern = 1, // Xamarin.Mac/Modern app - Full = 2, // Xamarin.Mac/Full app - System = 4, // Xamarin.Mac/System app - Console = 8, // Console executable + None = 0, DotNet = 16, MacCatalyst = 32, } @@ -14,38 +11,29 @@ public enum MacFlavors { public class MacTestProject : TestProject { public MacFlavors TargetFrameworkFlavors; - public bool GenerateFull => GenerateVariations && (TargetFrameworkFlavors & MacFlavors.Full) == MacFlavors.Full; - public bool GenerateSystem => GenerateVariations && (TargetFrameworkFlavors & MacFlavors.System) == MacFlavors.System; - public override bool GenerateVariations { get { - if (IsDotNetProject) - return false; - - // If a bitwise combination of flavors, then we're generating variations - return TargetFrameworkFlavors != MacFlavors.Modern && TargetFrameworkFlavors != MacFlavors.Full && TargetFrameworkFlavors != MacFlavors.System && TargetFrameworkFlavors != MacFlavors.Console; + return false; } set { throw new Exception ("This value is read-only"); } } - public string Platform = "x86"; - - public MacTestProject (TestLabel label, string path, bool isExecutableProject = true, MacFlavors targetFrameworkFlavor = MacFlavors.Full | MacFlavors.Modern) : base (label, path, isExecutableProject) + public MacTestProject (TestLabel label, string path) + : base (label, path, true) { - TargetFrameworkFlavors = targetFrameworkFlavor; } public override TestProject Clone () { - return CompleteClone (new MacTestProject (Label, Path, IsExecutableProject, TargetFrameworkFlavors)); + return CompleteClone (new MacTestProject (Label, Path)); } protected override TestProject CompleteClone (TestProject project) { var rv = (MacTestProject) project; - rv.Platform = Platform; + rv.TargetFrameworkFlavors = TargetFrameworkFlavors; return base.CompleteClone (rv); } diff --git a/tests/xharness/Program.cs b/tests/xharness/Program.cs index b2b88d5471ed..1991d170b51d 100644 --- a/tests/xharness/Program.cs +++ b/tests/xharness/Program.cs @@ -12,22 +12,22 @@ public static int Main (string [] args) xcode: Xamarin.SdkVersions.Xcode, osx: Xamarin.SdkVersions.OSX, iOS: Xamarin.SdkVersions.iOS, - watchOS: Xamarin.SdkVersions.WatchOS, + watchOS: "99.99", tVOS: Xamarin.SdkVersions.TVOS, minOSX: Xamarin.SdkVersions.MinOSX, miniOS: Xamarin.SdkVersions.MiniOS, - minWatchOS: Xamarin.SdkVersions.LegacyMinWatchOS, + minWatchOS: "99.99", minTVOS: Xamarin.SdkVersions.MinTVOS, miniOSSimulator: Xamarin.SdkVersions.MiniOSSimulator, - minWatchOSSimulator: Xamarin.SdkVersions.MinWatchOSSimulator, - minWatchOSCompanionSimulator: Xamarin.SdkVersions.MinWatchOSCompanionSimulator, + minWatchOSSimulator: "99.99", + minWatchOSCompanionSimulator: "99.99", minTVOSSimulator: Xamarin.SdkVersions.MinTVOSSimulator, maxiOSSimulator: Xamarin.SdkVersions.MaxiOSSimulator, - maxWatchOSSimulator: Xamarin.SdkVersions.MaxWatchOSSimulator, - maxWatchOSCompanionSimulator: Xamarin.SdkVersions.MaxWatchOSCompanionSimulator, + maxWatchOSSimulator: "99.99", + maxWatchOSCompanionSimulator: "99.99", maxTVOSSimulator: Xamarin.SdkVersions.MaxTVOSSimulator, maxiOSDeploymentTarget: Xamarin.SdkVersions.MaxiOSDeploymentTarget, - maxWatchDeploymentTarget: Xamarin.SdkVersions.MaxWatchDeploymentTarget, + maxWatchDeploymentTarget: "99.99", maxTVOSDeploymentTarget: Xamarin.SdkVersions.MaxTVOSDeploymentTarget); Action showHelp = null; @@ -39,13 +39,9 @@ public static int Main (string [] args) { "h|?|help", "Displays the help", (v) => showHelp () }, { "v|verbose", "Show verbose output", (v) => configuration.Verbosity++ }, { "use-system:", "Use the system version of Xamarin.iOS/Xamarin.Mac or the locally build version. Default: the locally build version.", (v) => configuration.UseSystemXamarinIOSMac = v == "1" || v == "true" || string.IsNullOrEmpty (v) }, - // Configure - { "configure", "Creates project files and makefiles.", (v) => action = HarnessAction.Configure }, { "autoconf", "Automatically decide what to configure.", (v) => configuration.AutoConf = true }, { "rootdir=", "The root directory for the tests.", (v) => HarnessConfiguration.RootDirectory = v }, { "project=", "Add a project file to process. This can be specified multiple times.", (v) => configuration.IOSTestProjects.Add (new iOSTestProject (TestLabel.None, v)) }, - { "watchos-container-template=", "The directory to use as a template for a watchos container app.", (v) => configuration.WatchOSContainerTemplate = v }, - { "watchos-app-template=", "The directory to use as a template for a watchos app.", (v) => configuration.WatchOSAppTemplate = v }, // Run { "run=", "Executes a project.", (v) => { @@ -66,8 +62,7 @@ public static int Main (string [] args) } }, { "sdkroot=", "Where Xcode is", (v) => configuration.SdkRoot = v }, - { "sdkroot94=", "Where Xcode 9.4 is", (v) => Console.WriteLine ("--sdkroot94 is deprecated"), true }, - { "target=", "Where to run the project ([ios|watchos|tvos]-[device|simulator|simulator-32|simulator-64]).", (v) => configuration.Target = v.ParseAsAppRunnerTarget () }, + { "target=", "Where to run the project ([ios|tvos]-[device|simulator).", (v) => configuration.Target = v.ParseAsAppRunnerTarget () }, { "configuration=", "Which configuration to run (defaults to Debug).", (v) => configuration.BuildConfiguration = v }, { "logdirectory=", "Where to store logs.", (v) => configuration.LogDirectory = v }, { "logfile=", "Where to store the log.", (v) => Console.WriteLine("The logfile option is deprecated. Please use logdirectory."), true }, diff --git a/tests/xharness/SimulatorLoaderFactory.cs b/tests/xharness/SimulatorLoaderFactory.cs index 65f5ffebad83..e23979a7ce63 100644 --- a/tests/xharness/SimulatorLoaderFactory.cs +++ b/tests/xharness/SimulatorLoaderFactory.cs @@ -28,7 +28,6 @@ public override string GetDeviceType (TestTargetOs target, bool minVersion) return target.Platform switch { TestTarget.Simulator_iOS64 => GetiOSDeviceType (Version.Parse (target.OSVersion!)), TestTarget.Simulator_tvOS => "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p", - TestTarget.Simulator_watchOS => GetWatchOSDeviceType (Version.Parse (target.OSVersion!)), _ => throw new Exception (string.Format ("Invalid simulator target: {0}", target)) }; } @@ -47,25 +46,10 @@ string GetiOSDeviceType (Version iOSVersion) return "com.apple.CoreSimulator.SimDeviceType.iPhone-14"; } - string GetWatchOSDeviceType (Version watchOSVersion) - { - if (watchOSVersion.Major < 7) - return "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm"; - if (watchOSVersion.Major < 8) - return "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm"; - return "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-41mm"; - } - public override void GetCompanionRuntimeAndDeviceType (TestTargetOs target, bool minVersion, out string? companionRuntime, out string? companionDeviceType) { companionRuntime = null; companionDeviceType = null; - - if (target.Platform == TestTarget.Simulator_watchOS) { - var companionVersion = minVersion ? Xamarin.SdkVersions.MinWatchOSCompanionSimulator : Xamarin.SdkVersions.MaxWatchOSCompanionSimulator; - companionRuntime = "com.apple.CoreSimulator.SimRuntime.iOS-" + companionVersion.Replace ('.', '-'); - companionDeviceType = GetiOSDeviceType (Version.Parse (companionVersion)); - } } } } diff --git a/tests/xharness/SolutionGenerator.cs b/tests/xharness/SolutionGenerator.cs deleted file mode 100644 index 8b885f46056d..000000000000 --- a/tests/xharness/SolutionGenerator.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Xml; -using System.Text; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; -using Xharness.Targets; - -namespace Xharness { - public static class SolutionGenerator { - static void AddProjectToSolution (IHarness harness, string sln_path, TextWriter solution, string project_path, out string configurations) - { - var project = new XmlDocument (); - project.LoadWithoutNetworkAccess (project_path); - var guid = project.GetProjectGuid (); - solution.WriteLine ("Project(\"{3}\") = \"{0}\", \"{1}\", \"{2}\"", Path.GetFileNameWithoutExtension (project_path), FixProjectPath (sln_path, project_path), guid, project_path.EndsWith (".csproj") ? Target.CSharpGuid : Target.FSharpGuid); - solution.WriteLine ("EndProject"); - - configurations = string.Format ( - "\t\t{0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n" + - "\t\t{0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n" + - "\t\t{0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU\n" + - "\t\t{0}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU\n" + - "\t\t{0}.Debug|iPhone.ActiveCfg = Debug|Any CPU\n" + - "\t\t{0}.Debug|iPhone.Build.0 = Debug|Any CPU\n" + - "\t\t{0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n" + - "\t\t{0}.Release|Any CPU.Build.0 = Release|Any CPU\n" + - "\t\t{0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU\n" + - "\t\t{0}.Release|iPhoneSimulator.Build.0 = Release|Any CPU\n" + - "\t\t{0}.Release|iPhone.ActiveCfg = Release|Any CPU\n" + - "\t\t{0}.Release|iPhone.Build.0 = Release|Any CPU\n", guid); - } - - static string FixProjectPath (string sln_path, string project_path) - { - var sln_dir = Path.GetDirectoryName (sln_path); - if (project_path.StartsWith (sln_dir + Path.PathSeparator, StringComparison.OrdinalIgnoreCase)) - project_path = project_path.Substring (sln_dir.Length + 1); - project_path = project_path.Replace ('/', '\\'); - return project_path; - } - - public static void CreateSolution (IHarness harness, IEnumerable targets, string infix, DevicePlatform testPlatform) - { - CreateSolution (harness, targets, null, infix, testPlatform); - } - - public static void CreateSolution (IHarness harness, IEnumerable targets, Target exeTarget, string infix, DevicePlatform testPlatform) - { - var folders = new StringBuilder (); - - var srcDirectory = Path.Combine (HarnessConfiguration.RootDirectory, "..", "src"); - var sln_path = exeTarget is null ? Path.Combine (HarnessConfiguration.RootDirectory, "tests-" + infix + ".sln") : Path.Combine (Path.GetDirectoryName (exeTarget.ProjectPath), Path.GetFileNameWithoutExtension (exeTarget.ProjectPath) + ".sln"); - - using (var writer = new StringWriter ()) { - writer.WriteLine (); - writer.WriteLine ("Microsoft Visual Studio Solution File, Format Version 11.00"); - writer.WriteLine ("# Visual Studio 2010"); - foreach (var target in targets) { - var relatedProjects = target.GetRelatedProjects (); - var hasRelatedProjects = relatedProjects is not null; - var folderGuid = string.Empty; - var useFolders = hasRelatedProjects && target.IsExe && exeTarget is null; - - if (hasRelatedProjects && target.IsExe) { - if (exeTarget is null) { - CreateSolution (harness, targets, target, infix, testPlatform); // create a solution for just this test project as well - } else if (exeTarget != target) { - continue; - } - } - - if (useFolders) { - folderGuid = Guid.NewGuid ().ToString ().ToUpperInvariant (); - writer.WriteLine ("Project(\"{{2150E333-8FDC-42A3-9474-1A3956D46DE8}}\") = \"{0}\", \"{0}\", \"{{{1}}}\"", target.Name, folderGuid); - writer.WriteLine ("EndProject"); - } - - writer.WriteLine ("Project(\"{3}\") = \"{0}\", \"{1}\", \"{2}\"", Path.GetFileNameWithoutExtension (target.ProjectPath), FixProjectPath (sln_path, Path.GetFullPath (target.ProjectPath)), target.ProjectGuid, target.LanguageGuid); - writer.WriteLine ("EndProject"); - - if (hasRelatedProjects && target.IsExe) { - foreach (var rp in relatedProjects) { - writer.WriteLine ("Project(\"{3}\") = \"{0}\", \"{1}\", \"{2}\"", Path.GetFileNameWithoutExtension (rp.ProjectPath), FixProjectPath (sln_path, Path.GetFullPath (rp.ProjectPath)), rp.Guid, target.LanguageGuid); - writer.WriteLine ("EndProject"); - } - } - - if (useFolders) { - folders.AppendFormat ("\t\t{0} = {{{1}}}\n", target.ProjectGuid, folderGuid); - foreach (var rp in relatedProjects) - folders.AppendFormat ("\t\t{0} = {{{1}}}\n", rp.Guid, folderGuid); - } - } - - // Add reference to the Touch.Client project - string configuration; - var proj_path = Path.GetFullPath (Path.Combine (srcDirectory, "..", "external", "Touch.Unit", "Touch.Client", testPlatform.AsString (), "Touch.Client-" + testPlatform.AsString () + ".csproj")); - AddProjectToSolution (harness, sln_path, writer, proj_path, out configuration); - - writer.WriteLine ("Global"); - - writer.WriteLine ("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); - writer.WriteLine ("\t\tDebug|iPhoneSimulator = Debug|iPhoneSimulator"); - writer.WriteLine ("\t\tRelease|iPhoneSimulator = Release|iPhoneSimulator"); - writer.WriteLine ("\t\tDebug|iPhone = Debug|iPhone"); - writer.WriteLine ("\t\tRelease|iPhone = Release|iPhone"); - writer.WriteLine ("\t\tDebug|Any CPU = Debug|Any CPU"); - writer.WriteLine ("\t\tRelease|Any CPU = Release|Any CPU"); - writer.WriteLine ("\tEndGlobalSection"); - - writer.WriteLine ("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); - var exePlatforms = new string [] { "iPhone", "iPhoneSimulator" }; - var configurations = new string [] { "Debug", "Release" }; - foreach (var target in targets) { - if (target.IsExe && exeTarget is not null && target != exeTarget) - continue; - - foreach (var conf in configurations) { - if (target.IsExe) { - foreach (var platform in exePlatforms) { - writer.WriteLine ("\t\t{0}.{1}|{2}.ActiveCfg = {1}|{2}", target.ProjectGuid, conf, platform); - writer.WriteLine ("\t\t{0}.{1}|{2}.Build.0 = {1}|{2}", target.ProjectGuid, conf, platform); - - } - } else { - foreach (var platform in new string [] { "Any CPU", "iPhone", "iPhoneSimulator" }) { - writer.WriteLine ("\t\t{0}.{1}|{2}.ActiveCfg = {1}|Any CPU", target.ProjectGuid, conf, platform); - writer.WriteLine ("\t\t{0}.{1}|{2}.Build.0 = {1}|Any CPU", target.ProjectGuid, conf, platform); - } - } - } - - if (target.IsExe) { - var relatedProjects = target.GetRelatedProjects (); - if (relatedProjects is not null) { - foreach (var rp in relatedProjects) { - foreach (var conf in configurations) { - foreach (var platform in exePlatforms) { - writer.WriteLine ("\t\t{0}.{1}|{2}.ActiveCfg = {1}|{2}", rp.Guid, conf, platform); - writer.WriteLine ("\t\t{0}.{1}|{2}.Build.0 = {1}|{2}", rp.Guid, conf, platform); - } - } - } - } - - } - - } - writer.Write (configuration); - writer.WriteLine ("\tEndGlobalSection"); - - if (folders.Length > 0) { - writer.WriteLine ("\tGlobalSection(NestedProjects) = preSolution"); - writer.Write (folders.ToString ()); - writer.WriteLine ("\tEndGlobalSection"); - } - - writer.WriteLine ("EndGlobal"); - - harness.Save (writer, sln_path); - } - } - } -} diff --git a/tests/xharness/Targets/MacTarget.cs b/tests/xharness/Targets/MacTarget.cs deleted file mode 100644 index b6dae3e64b7e..000000000000 --- a/tests/xharness/Targets/MacTarget.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; - -namespace Xharness.Targets { - public class MacTarget : Target { - public MacFlavors Flavor { get; private set; } - public bool Modern => Flavor == MacFlavors.Modern; - public bool System => Flavor == MacFlavors.System; - public bool Full => Flavor == MacFlavors.Full; - - public MacTarget (MacFlavors flavor) - { - Flavor = flavor; - } - - public override string Suffix { - get { - switch (Flavor) { - case MacFlavors.Modern: - return string.Empty; - case MacFlavors.Full: - return "-full"; - case MacFlavors.System: - return "-system"; - default: - throw new NotImplementedException ($"Suffix for {Flavor}"); - } - } - } - - public override string MakefileWhereSuffix { - get { - switch (Flavor) { - case MacFlavors.Modern: - return "modern"; - case MacFlavors.Full: - return "full"; - case MacFlavors.System: - return "system"; - default: - throw new NotImplementedException ($"Suffix for {Flavor}"); - } - } - } - - protected override string ProjectTypeGuids { - get { - return "{A3F8F2AB-B479-4A4A-A458-A89E7DC349F1};" + LanguageGuid; - } - } - - protected override string BindingsProjectTypeGuids { - get { - return "{810C163F-4746-4721-8B8E-88A3673A62EA}"; - } - } - - protected override string TargetFrameworkIdentifier { - get { - return "Xamarin.Mac"; - } - } - - protected override string Imports { - get { - return IsFSharp ? "Mac\\Xamarin.Mac.FSharp.targets" : "Mac\\Xamarin.Mac.CSharp.targets"; - } - } - - protected override string BindingsImports { - get { - return "Mac\\Xamarin.Mac.ObjcBinding.CSharp"; - } - } - - protected override string AdditionalDefines { - get { - var rv = ""; - - if (Full) - rv += "XAMMAC_4_5"; - - return rv; - } - } - - protected override string RemoveDefines { - get { - var rv = string.Empty; - - if (!Modern) - rv += ";XAMMAC;MOBILE"; - - return rv; - } - } - - public override string Platform { - get { - return "mac"; - } - } - - public override string DotNetSdk => "Microsoft.macOS.Sdk"; - public override string RuntimeIdentifier => "osx-x64"; - public override DevicePlatform ApplePlatform => DevicePlatform.macOS; - public override string TargetFramework => DotNetTfm + "-macos"; - public override string TargetFrameworkForNuGet => "xamarinmac10"; - - protected override bool FixProjectReference (string include, string subdir, string suffix, out string fixed_include) - { - var fn = Path.GetFileName (include); - - switch (fn) { - case "Touch.Client-macOS-mobile.csproj": - switch (Flavor) { - case MacFlavors.Full: - case MacFlavors.System: - var dir = Path.GetDirectoryName (include); - var parentDir = Path.GetDirectoryName (dir); - dir = Path.Combine (parentDir, "full"); - fixed_include = Path.Combine (dir, fn.Replace ("-mobile", "-full")); - return true; - case MacFlavors.Modern: - default: - break; - } - break; - } - - return base.FixProjectReference (include, subdir, suffix, out fixed_include); - } - - public string SimplifiedName { - get { - return Name.EndsWith ("-mac", StringComparison.Ordinal) ? Name.Substring (0, Name.Length - 4) : Name; - } - } - - public override string DefaultAssemblyReference { get { return "Xamarin.Mac"; } } - - public override IEnumerable ReferenceToRemove { get { yield return "System.Drawing"; } } - - public override bool ShouldSetTargetFrameworkIdentifier { get { return Modern; } } - - public override Dictionary NewPropertiesToAdd { - get { - var props = new Dictionary (); - - - if (System) { - props.Add ("TargetFrameworkVersion", "v4.7.1"); - props.Add ("AppBundleExtraOptions", "--embed-mono=no"); - } else if (Modern) { - props.Add ("TargetFrameworkVersion", "v2.0"); - } else { - props.Add ("TargetFrameworkVersion", "v4.5"); - props.Add ("UseXamMacFullFramework", "true"); - } - - props.Add ("XamMacArch", "x86_64"); - return props; - } - } - - public override HashSet PropertiesToRemove { - get { - if (!ShouldSetTargetFrameworkIdentifier) - return new HashSet { "TargetFrameworkIdentifier" }; - return null; - } - } - - protected override void PostProcessExecutableProject () - { - base.PostProcessExecutableProject (); - - ProjectGuid = "{" + Xharness.Harness.Helpers.GenerateStableGuid ().ToString ().ToUpper () + "}"; - inputProject.SetProjectGuid (ProjectGuid); - inputProject.ResolveAllPaths (TemplateProjectPath); - } - } -} diff --git a/tests/xharness/Targets/TVOSTarget.cs b/tests/xharness/Targets/TVOSTarget.cs deleted file mode 100644 index b3bf5c5de289..000000000000 --- a/tests/xharness/Targets/TVOSTarget.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Xml; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; -using Microsoft.DotNet.XHarness.iOS.Shared; - -namespace Xharness.Targets { - public class TVOSTarget : iOSTarget { - public override string Suffix { - get { - return "-tvos"; - } - } - - public override string ExtraLinkerDefsSuffix { - get { - return "-tvos"; - } - } - - protected override string BindingsProjectTypeGuids { - get { - return "{4A1ED743-3331-459B-915A-4B17C7B6DBB6}"; - } - } - - protected override string ProjectTypeGuids { - get { - return "{06FA79CB-D6CD-4721-BB4B-1BD202089C55}"; - } - } - - protected override string TargetFrameworkIdentifier { - get { - return "Xamarin.TVOS"; - } - } - - protected override string Imports { - get { - return IsFSharp ? "TVOS\\Xamarin.TVOS.FSharp.targets" : "TVOS\\Xamarin.TVOS.CSharp.targets"; - } - } - - protected override string BindingsImports { - get { - return IsFSharp ? "TVOS\\Xamarin.TVOS.ObjCBinding.FSharp.targets" : "TVOS\\Xamarin.TVOS.ObjCBinding.CSharp.targets"; - } - } - - public override string SimulatorArchitectures { - get { - return "x86_64"; - } - } - - public override string DeviceArchitectures { - get { - return "ARM64"; - } - } - - protected override string GetMinimumOSVersion (string templateMinimumOSVersion) - { - return Xamarin.SdkVersions.MinTVOS; - } - - protected override int [] UIDeviceFamily { - get { - return new int [] { 3 }; - } - } - - protected override string AdditionalDefines { - get { - return "XAMCORE_3_0;MONOTOUCH_TV;"; - } - } - - public override string Platform { - get { - return "tvos"; - } - } - - public override string DotNetSdk => "Microsoft.tvOS.Sdk"; - public override string RuntimeIdentifier => "tvossimulator-x64"; - public override DevicePlatform ApplePlatform => DevicePlatform.tvOS; - public override string TargetFramework => DotNetTfm + "-tvos"; - public override string TargetFrameworkForNuGet => "xamarintvos10"; - - static Dictionary project_guids = new Dictionary (); - - protected override void ProcessProject () - { - base.ProcessProject (); - - var srcDirectory = Path.Combine (HarnessConfiguration.RootDirectory, "..", "src"); - - inputProject.AddExtraMtouchArgs ("--bitcode:asmonly", "iPhone", "Release"); - inputProject.SetMtouchUseLlvm (true, "iPhone", "Release"); - inputProject.ResolveAllPaths (TemplateProjectPath); - - // Remove bitcode from executables, since we don't need it for testing, and it makes test apps bigger (and the Apple TV might refuse to install them). - var configurations = new string [] { "Debug", "Release" }; - foreach (var c in configurations) { - inputProject.AddExtraMtouchArgs ($"--gcc_flags=-fembed-bitcode-marker", "iPhone", c); - } - } - } -} diff --git a/tests/xharness/Targets/Target.cs b/tests/xharness/Targets/Target.cs index 3d62d717fcc1..088f2b673de1 100644 --- a/tests/xharness/Targets/Target.cs +++ b/tests/xharness/Targets/Target.cs @@ -1,284 +1,5 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Xml; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; -using Microsoft.DotNet.XHarness.iOS.Shared; - namespace Xharness.Targets { public abstract class Target { - public IHarness Harness; - - protected XmlDocument inputProject; - protected string OriginalInfoPListInclude { get; private set; } - string outputType; - string bundleIdentifier; - string targetDirectory; - - public string Name { get; protected set; } - public string ProjectGuid { get; protected set; } - public string ProjectPath { get; protected set; } - - public string ProjectFileExtension { get { return IsFSharp ? "fsproj" : "csproj"; } } - public bool IsFSharp { get { return (ProjectPath ?? TemplateProjectPath).EndsWith (".fsproj", StringComparison.Ordinal); } } - - public string TemplateProjectPath { get; set; } - - bool? is_dotnet_project; - public bool IsDotNetProject { get { return is_dotnet_project ?? (is_dotnet_project = inputProject.IsDotNetProject ()).Value; } } - public string OutputType { get { return outputType; } } - public string TargetDirectory { get { return targetDirectory; } } - public bool IsLibrary { get { return outputType == "Library"; } } - public bool IsExe { get { return outputType == "Exe"; } } - public bool IsBindingProject { get; private set; } - public bool IsNUnitProject { get; set; } - - public string BundleIdentifier { get { return bundleIdentifier; } protected set { bundleIdentifier = value; } } - - public virtual string Suffix { get { throw new NotImplementedException (); } } - public virtual string MakefileWhereSuffix { get { return string.Empty; } } - public virtual string ProjectFileSuffix { get { return Suffix; } } - public virtual string ExtraLinkerDefsSuffix { get { return Suffix; } } - protected virtual string ProjectTypeGuids { get { throw new NotImplementedException (); } } - protected virtual string BindingsProjectTypeGuids { get { throw new NotImplementedException (); } } - protected virtual string TargetFrameworkIdentifier { get { throw new NotImplementedException (); } } - protected virtual string Imports { get { throw new NotImplementedException (); } } - protected virtual string BindingsImports { get { throw new NotImplementedException (); } } - public virtual bool IsMultiArchitecture { get { return false; } } - public virtual string SimulatorArchitectures { get { throw new NotImplementedException (); } } - public virtual string DeviceArchitectures { get { throw new NotImplementedException (); } } - protected virtual string GetMinimumOSVersion (string templateMinimumOSVersion) { throw new NotImplementedException (); } - protected virtual int [] UIDeviceFamily { get { throw new NotImplementedException (); } } - protected virtual string AdditionalDefines { get { return string.Empty; } } - protected virtual string RemoveDefines { get { return string.Empty; } } - public virtual string Platform { get { throw new NotImplementedException (); } } - - public bool ShouldSkipProjectGeneration { get; set; } - public virtual bool ShouldSetTargetFrameworkIdentifier { get { return true; } } - public virtual string DefaultAssemblyReference { get { return "Xamarin.iOS"; } } - public virtual IEnumerable ReferenceToRemove { get { return Enumerable.Empty (); } } - public virtual Dictionary NewPropertiesToAdd { get { return new Dictionary (); } } - public virtual HashSet PropertiesToRemove { get { return null; } } - - public const string FSharpGuid = "{F2A71F9B-5D33-465A-A702-920D77279786}"; - public const string CSharpGuid = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"; - public string DotNetTfm => Harness.DOTNET_TFM; - - public string LanguageGuid { get { return IsFSharp ? FSharpGuid : CSharpGuid; } } - - public abstract string DotNetSdk { get; } - public abstract string RuntimeIdentifier { get; } - public abstract DevicePlatform ApplePlatform { get; } - public abstract string TargetFramework { get; } - public abstract string TargetFrameworkForNuGet { get; } - public static string ProjectsDir { get { return "generated-projects"; } } - protected string GetTargetSpecificDir (string customSuffix = null) - { - string rv; - if (string.IsNullOrEmpty (customSuffix)) { - rv = Suffix; - } else { - rv = Suffix + "-" + customSuffix; - } - if (IsDotNetProject) - rv += "-dotnet"; - return rv.TrimStart ('-'); - } - - public virtual string PlatformString { - get { - return ApplePlatform.AsString (); - } - } - - protected virtual bool FixProjectReference (string include, string subdir, string suffix, out string fixed_include) - { - var fn = Path.GetFileName (include); - - switch (fn) { - case "Touch.Client-iOS.dotnet.csproj": - case "Touch.Client-iOS.csproj": - var dir = Path.GetDirectoryName (include); - var parentDir = Path.GetFileName (dir); - if (parentDir == "iOS") - dir = Path.Combine (Path.GetDirectoryName (dir), PlatformString); - fixed_include = Path.Combine (dir, fn.Replace ("-iOS", "-" + PlatformString)); - break; - default: - include = include.Replace (".csproj", suffix + ".csproj"); - include = include.Replace (".fsproj", suffix + ".fsproj"); - - if (!string.IsNullOrEmpty (subdir)) - include = Path.Combine (Path.GetDirectoryName (include), subdir, Path.GetFileName (include)); - - fixed_include = include; - break; - } - - return true; - } - - protected virtual void ProcessDotNetProject () - { - inputProject.SetSdk (DotNetSdk); - inputProject.SetRuntimeIdentifier (RuntimeIdentifier); - inputProject.FixProjectReferences (Path.Combine (ProjectsDir, GetTargetSpecificDir ()), Suffix, FixProjectReference); - inputProject.SetNode ("TargetFramework", TargetFramework); - var fixedAssetTargetFallback = inputProject.GetAssetTargetFallback ()?.Replace ("xamarinios10", TargetFrameworkForNuGet); - if (fixedAssetTargetFallback is not null) - inputProject.SetAssetTargetFallback (fixedAssetTargetFallback); - inputProject.ResolveAllPaths (TemplateProjectPath); - } - - protected virtual void ProcessProject () - { - inputProject.SetOutputPath ("bin\\$(Platform)\\$(Configuration)" + Suffix); - inputProject.SetIntermediateOutputPath ("obj\\$(Platform)\\$(Configuration)" + Suffix); - - if (ShouldSetTargetFrameworkIdentifier) - inputProject.SetTargetFrameworkIdentifier (TargetFrameworkIdentifier); - - inputProject.SetAssemblyReference (DefaultAssemblyReference, TargetFrameworkIdentifier); - - foreach (var r in ReferenceToRemove) - inputProject.RemoveReferences (r); - - var newProperties = NewPropertiesToAdd; - foreach (var k in newProperties.Keys) - inputProject.SetTopLevelPropertyGroupValue (k, newProperties [k]); - - var removedProperties = PropertiesToRemove; - if (removedProperties is not null) { - foreach (var p in removedProperties) - inputProject.RemoveNode (p, false); - } - - inputProject.FixProjectReferences (Path.Combine (ProjectsDir, GetTargetSpecificDir ()), Suffix, FixProjectReference); - inputProject.SetAssemblyReference ("OpenTK", "OpenTK-1.0"); - inputProject.SetProjectTypeGuids (IsBindingProject ? BindingsProjectTypeGuids : ProjectTypeGuids); - inputProject.SetImport ("$(MSBuildExtensionsPath)\\Xamarin\\" + (IsBindingProject ? BindingsImports : Imports)); - inputProject.FixTestLibrariesReferences (Platform); - if (!string.IsNullOrEmpty (AdditionalDefines)) - inputProject.AddAdditionalDefines (AdditionalDefines); - if (!string.IsNullOrEmpty (RemoveDefines)) - inputProject.RemoveDefines (RemoveDefines); - } - - protected void CreateExecutableProject () - { - ProcessProject (); - PostProcessExecutableProject (); - inputProject.Save (ProjectPath, Harness); - - UpdateInfoPList (); - } - - protected virtual void PostProcessExecutableProject () - { - } - - protected virtual void UpdateInfoPList () - { - } - - protected void CreateLibraryProject () - { - ProcessProject (); - inputProject.ResolveAllPaths (TemplateProjectPath); - inputProject.Save (ProjectPath, Harness); - - ProjectGuid = inputProject.GetProjectGuid (); - } - - protected virtual void CreateDotNetProject () - { - ProcessDotNetProject (); - inputProject.Save (ProjectPath, Harness); - UpdateInfoPList (); - } - - protected virtual void ExecuteInternal () - { - if (IsDotNetProject) { - CreateDotNetProject (); - return; - } - switch (OutputType) { - case "Exe": - CreateExecutableProject (); - break; - case "Library": - CreateLibraryProject (); - break; - default: - throw new Exception (string.Format ("Unknown OutputType: {0}", OutputType)); - } - } - - protected virtual void CalculateName () - { - Name = Path.GetFileName (targetDirectory); - if (string.Equals (Name, "ios", StringComparison.OrdinalIgnoreCase) || string.Equals (Name, "mac", StringComparison.OrdinalIgnoreCase)) - Name = Path.GetFileName (Path.GetDirectoryName (targetDirectory)); - } - - public void Execute () - { - targetDirectory = Path.GetDirectoryName (TemplateProjectPath); - CalculateName (); - - var templateName = Path.GetFileName (TemplateProjectPath); - if (templateName.EndsWith (".template", StringComparison.OrdinalIgnoreCase)) - templateName = Path.GetFileNameWithoutExtension (templateName); - templateName = Path.GetFileNameWithoutExtension (templateName); - - if (!ShouldSkipProjectGeneration) { - inputProject = new XmlDocument (); - inputProject.LoadWithoutNetworkAccess (TemplateProjectPath); - OriginalInfoPListInclude = inputProject.GetInfoPListInclude ()?.Replace ('\\', '/'); - - ProjectPath = Path.Combine (targetDirectory, ProjectsDir, GetTargetSpecificDir (), templateName + ProjectFileSuffix + "." + ProjectFileExtension); - - outputType = inputProject.GetOutputType (); - - if (inputProject.IsDotNetProject ()) { - IsBindingProject = string.Equals (inputProject.GetIsBindingProject (), "true", StringComparison.OrdinalIgnoreCase); - } else { - switch (inputProject.GetImport ()) { - case "$(MSBuildExtensionsPath)\\Xamarin\\iOS\\Xamarin.iOS.CSharp.targets": - case "$(MSBuildExtensionsPath)\\Xamarin\\iOS\\Xamarin.iOS.FSharp.targets": - case "$(MSBuildExtensionsPath)\\Xamarin\\Mac\\Xamarin.Mac.CSharp.targets": - case "$(MSBuildExtensionsPath": - case "$(MSBuildBinPath)\\Microsoft.CSharp.targets": - IsBindingProject = false; - break; - case "$(MSBuildExtensionsPath)\\Xamarin\\iOS\\Xamarin.iOS.ObjCBinding.CSharp.targets": - case "$(MSBuildExtensionsPath)\\Xamarin\\iOS\\Xamarin.iOS.ObjCBinding.FSharp.targets": - case "$(MSBuildExtensionsPath)\\Xamarin\\Mac\\Xamarin.Mac.ObjcBinding.CSharp": - IsBindingProject = true; - break; - default: - throw new Exception (string.Format ("Unknown Imports: {0} in {1}", inputProject.GetImport (), TemplateProjectPath)); - } - } - - ExecuteInternal (); - } else { - ProjectPath = TemplateProjectPath; - } - } - - public virtual IEnumerable GetRelatedProjects () - { - return null; - } - } - - public class RelatedProject { - public string ProjectPath; - public string Guid; } } diff --git a/tests/xharness/Targets/TodayExtensionTarget.cs b/tests/xharness/Targets/TodayExtensionTarget.cs deleted file mode 100644 index 262f053b466f..000000000000 --- a/tests/xharness/Targets/TodayExtensionTarget.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Xml; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; -using Microsoft.DotNet.XHarness.iOS.Shared; - -namespace Xharness.Targets { - public class TodayExtensionTarget : UnifiedTarget { - public string AppName { get; private set; } - public string ExtensionName { get; private set; } - - public string TodayContainerGuid { get; private set; } - public string TodayExtensionGuid { get; private set; } - - public string TodayContainerProjectPath { get; private set; } - public string TodayExtensionProjectPath { get; private set; } - - public override string Suffix { - get { - return "-today"; - } - } - - public override string ExtraLinkerDefsSuffix { - get { - return "-today"; - } - } - - public override string ProjectFileSuffix { - get { - return "-today"; - } - } - - void CreateTodayContainerProject () - { - var csproj = new XmlDocument (); - var suffix = Suffix; - csproj.LoadWithoutNetworkAccess (Path.Combine (Harness.TodayContainerTemplate, "TodayContainer.csproj")); - csproj.SetOutputPath ("bin\\$(Platform)\\$(Configuration)" + suffix, false); - csproj.SetIntermediateOutputPath ("obj\\$(Platform)\\$(Configuration)" + suffix); - csproj.SetProjectReferenceValue ("TodayExtension.csproj", "Name", Path.GetFileNameWithoutExtension (TodayExtensionProjectPath)); - csproj.SetProjectReferenceValue ("TodayExtension.csproj", "Project", TodayExtensionGuid); - csproj.SetProjectReferenceInclude ("TodayExtension.csproj", TodayExtensionProjectPath.Replace ('/', '\\')); - csproj.FixCompileInclude ("Main.cs", Path.Combine (Harness.TodayContainerTemplate, "Main.cs").Replace ('/', '\\')); - csproj.FixInfoPListInclude (suffix, Path.GetDirectoryName (TemplateProjectPath)); - TodayContainerGuid = "{" + Xharness.Harness.Helpers.GenerateStableGuid ().ToString ().ToUpper () + "}"; - ProjectGuid = TodayContainerGuid; - csproj.SetProjectGuid (TodayContainerGuid); - csproj.ResolveAllPaths (Harness.TodayContainerTemplate); - csproj.Save (TodayContainerProjectPath, Harness); - - XmlDocument info_plist = new XmlDocument (); - var target_info_plist = Path.Combine (TargetDirectory, $"Info{suffix}.plist"); - info_plist.LoadWithoutNetworkAccess (Path.Combine (Harness.TodayContainerTemplate, "Info.plist")); - info_plist.SetCFBundleIdentifier (BundleIdentifier); - info_plist.SetCFBundleName (Name); - info_plist.SetMinimumOSVersion (GetMinimumOSVersion (Xamarin.SdkVersions.MiniOS)); - info_plist.Save (target_info_plist, Harness); - } - - void CreateTodayExtensionProject () - { - var csproj = inputProject; - var suffix = Suffix + "-extension"; - csproj.SetProjectTypeGuids ("{EE2C853D-36AF-4FDB-B1AD-8E90477E2198};" + LanguageGuid); - csproj.SetOutputPath ("bin\\$(Platform)\\$(Configuration)" + suffix); - csproj.SetIntermediateOutputPath ("obj\\$(Platform)\\$(Configuration)" + suffix); - csproj.SetImport (IsFSharp ? "$(MSBuildExtensionsPath)\\Xamarin\\iOS\\Xamarin.iOS.AppExtension.FSharp.targets" : "$(MSBuildExtensionsPath)\\Xamarin\\iOS\\Xamarin.iOS.AppExtension.CSharp.targets"); - csproj.FixInfoPListInclude (suffix, Path.GetDirectoryName (TemplateProjectPath)); - csproj.SetOutputType ("Library"); - csproj.AddAdditionalDefines ("XAMCORE_3_0;TODAY_EXTENSION"); - var ext = IsFSharp ? "fs" : "cs"; - csproj.AddCompileInclude ("TodayExtensionMain." + ext, Path.Combine (Harness.TodayExtensionTemplate, "TodayExtensionMain." + ext), true); - csproj.AddInterfaceDefinition (Path.Combine (Harness.TodayExtensionTemplate, "TodayView.storyboard").Replace ('/', '\\')); - csproj.SetExtraLinkerDefs ("extra-linker-defs" + ExtraLinkerDefsSuffix + ".xml"); - csproj.FixProjectReferences (Path.Combine (ProjectsDir, GetTargetSpecificDir ()), "-today", FixProjectReference); - csproj.ResolveAllPaths (TemplateProjectPath); - csproj.Save (TodayExtensionProjectPath, Harness); - - TodayExtensionGuid = csproj.GetProjectGuid (); - - XmlDocument info_plist = new XmlDocument (); - var target_info_plist = Path.Combine (TargetDirectory, $"Info{suffix}.plist"); - var original_info_plist_include = HarnessConfiguration.EvaluateRootTestsDirectory (OriginalInfoPListInclude); - info_plist.LoadWithoutNetworkAccess (Path.Combine (TargetDirectory, original_info_plist_include)); - BundleIdentifier = info_plist.GetCFBundleIdentifier () + "-today"; - info_plist.SetCFBundleIdentifier (BundleIdentifier + ".todayextension"); - info_plist.SetMinimumOSVersion (GetMinimumOSVersion (Xamarin.SdkVersions.MiniOS)); - info_plist.AddPListStringValue ("CFBundlePackageType", "XPC!"); - info_plist.SetCFBundleDisplayName (Name); - info_plist.AddPListKeyValuePair ("NSExtension", "dict", -@" - NSExtensionMainStoryboard - TodayView - NSExtensionPointIdentifier - com.apple.widget-extension - "); - info_plist.Save (target_info_plist, Harness); - } - - protected override void ExecuteInternal () - { - ExtensionName = Name + " Today Extension"; - AppName = Name + " Today"; - - var templateName = Path.GetFileName (TemplateProjectPath); - if (templateName.EndsWith (".template", StringComparison.OrdinalIgnoreCase)) - templateName = Path.GetFileNameWithoutExtension (templateName); - templateName = Path.GetFileNameWithoutExtension (templateName); - - switch (OutputType) { - case "Exe": - TodayExtensionProjectPath = Path.Combine (TargetDirectory, ProjectsDir, GetTargetSpecificDir ("extension"), templateName + Suffix + "-extension." + ProjectFileExtension); - TodayContainerProjectPath = Path.Combine (TargetDirectory, ProjectsDir, GetTargetSpecificDir (), templateName + Suffix + "." + ProjectFileExtension); - CreateTodayExtensionProject (); - CreateTodayContainerProject (); - break; - case "Library": - CreateLibraryProject (); - break; - default: - throw new Exception (string.Format ("Unknown OutputType: {0}", OutputType)); - } - } - - protected override string GetMinimumOSVersion (string templateMinimumOSVersion) - { - return templateMinimumOSVersion; - } - - public override IEnumerable GetRelatedProjects () - { - return new RelatedProject [] { - new RelatedProject { Guid = TodayExtensionGuid, ProjectPath = TodayExtensionProjectPath }, - }; - } - } -} diff --git a/tests/xharness/Targets/UnifiedTarget.cs b/tests/xharness/Targets/UnifiedTarget.cs deleted file mode 100644 index e5d6c138abda..000000000000 --- a/tests/xharness/Targets/UnifiedTarget.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.IO; -using System.Xml; -using Microsoft.DotNet.XHarness.iOS.Shared; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; - -namespace Xharness.Targets { - public class UnifiedTarget : iOSTarget { - public override string Suffix { - get { - return "-ios"; - } - } - - public override string ExtraLinkerDefsSuffix { - get { - return string.Empty; - } - } - - protected override string ProjectTypeGuids { - get { - return "{FEACFBD2-3405-455C-9665-78FE426C6842};" + LanguageGuid; - } - } - - protected override string BindingsProjectTypeGuids { - get { - return "{8FFB629D-F513-41CE-95D2-7ECE97B6EEEC}"; - } - } - - protected override string TargetFrameworkIdentifier { - get { - return "Xamarin.iOS"; - } - } - - protected override string Imports { - get { - return IsFSharp ? "iOS\\Xamarin.iOS.FSharp.targets" : "iOS\\Xamarin.iOS.CSharp.targets"; - } - } - - protected override string BindingsImports { - get { - return IsFSharp ? "iOS\\Xamarin.iOS.ObjCBinding.FSharp.targets" : "iOS\\Xamarin.iOS.ObjCBinding.CSharp.targets"; - } - } - - public override string SimulatorArchitectures { - get { - return "x86_64"; - } - } - - public override string DeviceArchitectures { - get { - return "ARM64"; - } - } - - protected override string GetMinimumOSVersion (string templateMinimumOSVersion) - { - return templateMinimumOSVersion; - } - - protected override int [] UIDeviceFamily { - get { - return new int [] { 1, 2 }; - } - } - - protected override string AdditionalDefines { - get { - return ""; - } - } - - public override bool IsMultiArchitecture { - get { - return true; - } - } - - public override string Platform { - get { - return "ios"; - } - } - - public override string ProjectFileSuffix { - get { - return string.Empty; - } - } - - public override string DotNetSdk => "Microsoft.iOS.Sdk"; - public override string RuntimeIdentifier => "iossimulator-x64"; - public override DevicePlatform ApplePlatform => DevicePlatform.iOS; - public override string TargetFramework => DotNetTfm + "-ios"; - public override string TargetFrameworkForNuGet => "xamarinios10"; - } -} diff --git a/tests/xharness/Targets/WatchOSTarget.cs b/tests/xharness/Targets/WatchOSTarget.cs deleted file mode 100644 index b1490c0df9da..000000000000 --- a/tests/xharness/Targets/WatchOSTarget.cs +++ /dev/null @@ -1,249 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Xml; -using Microsoft.DotNet.XHarness.iOS.Shared; -using Microsoft.DotNet.XHarness.iOS.Shared.Hardware; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; - -namespace Xharness.Targets { - public class WatchOSTarget : iOSTarget { - public string AppName { get; private set; } - public string ExtensionName { get; private set; } - - public string WatchOSAppGuid { get; private set; } - public string WatchOSExtensionGuid { get; private set; } - public string WatchOSGuid { get { return ProjectGuid; } private set { ProjectGuid = value; } } - - public string WatchOSAppProjectPath { get; private set; } - public string WatchOSExtensionProjectPath { get; private set; } - public string WatchOSProjectPath { get { return ProjectPath; } private set { ProjectPath = value; } } - - public override string SimulatorArchitectures { - get { return "x86_64"; } - } - - public override string DeviceArchitectures { - get { return "ARM64_32"; } - } - - public override string DotNetSdk => "Microsoft.watchOS.Sdk"; - public override string RuntimeIdentifier => throw new NotImplementedException (); - public override DevicePlatform ApplePlatform => DevicePlatform.watchOS; - public override string TargetFramework => DotNetTfm + "-watchos"; - public override string TargetFrameworkForNuGet => "xamarinwatch10"; - - void CreateWatchOSAppProject () - { - var csproj = new XmlDocument (); - var suffix = Suffix + "-app"; - csproj.LoadWithoutNetworkAccess (Path.Combine (Harness.WatchOSAppTemplate, "App.csproj")); - csproj.FindAndReplace ("%WATCHAPP_PATH%", Path.GetFullPath (Harness.WatchOSAppTemplate).Replace ('/', '\\') + "\\"); - csproj.FindAndReplace ("%WATCHEXTENSION_CSPROJ%", WatchOSExtensionProjectPath); - csproj.SetProjectReferenceValue (WatchOSExtensionProjectPath, "Project", WatchOSExtensionGuid); - csproj.SetProjectReferenceValue (WatchOSExtensionProjectPath, "Name", Path.GetFileNameWithoutExtension (WatchOSExtensionProjectPath)); - WatchOSAppGuid = "{" + Xharness.Harness.Helpers.GenerateStableGuid ().ToString ().ToUpper () + "}"; - csproj.SetProjectGuid (WatchOSAppGuid); - csproj.FixInfoPListInclude (suffix, Path.GetDirectoryName (TemplateProjectPath)); - csproj.ResolveAllPaths (TemplateProjectPath); - csproj.Save (WatchOSAppProjectPath, Harness); - - XmlDocument info_plist = new XmlDocument (); - var target_info_plist = Path.Combine (TargetDirectory, $"Info{Suffix}-app.plist"); - info_plist.LoadWithoutNetworkAccess (Path.Combine (Harness.WatchOSAppTemplate, "Info.plist")); - info_plist.SetCFBundleIdentifier (BundleIdentifier + ".watchkitapp"); - info_plist.SetPListStringValue ("WKCompanionAppBundleIdentifier", BundleIdentifier); - info_plist.SetPListStringValue ("CFBundleName", Name); - info_plist.SetMinimumOSVersion (GetMinimumOSVersion (info_plist.GetMinimumOSVersion ())); - info_plist.Save (target_info_plist, Harness); - } - - void CreateWatchOSContainerProject () - { - var csproj = new XmlDocument (); - csproj.LoadWithoutNetworkAccess (Path.Combine (Harness.WatchOSContainerTemplate, "Container.csproj")); - - csproj.FindAndReplace ("%CONTAINER_PATH%", Path.GetFullPath (Harness.WatchOSContainerTemplate).Replace ('/', '\\') + "\\"); - csproj.FindAndReplace ("%WATCHAPP_CSPROJ%", WatchOSAppProjectPath); - csproj.SetProjectReferenceValue (WatchOSAppProjectPath, "Name", Path.GetFileNameWithoutExtension (WatchOSAppProjectPath)); - WatchOSGuid = "{" + Xharness.Harness.Helpers.GenerateStableGuid ().ToString ().ToUpper () + "}"; - csproj.SetProjectGuid (WatchOSGuid); - csproj.FixInfoPListInclude (Suffix, Path.GetDirectoryName (TemplateProjectPath)); - csproj.ResolveAllPaths (TemplateProjectPath); - csproj.Save (WatchOSProjectPath, Harness); - - XmlDocument info_plist = new XmlDocument (); - var target_info_plist = Path.Combine (TargetDirectory, $"Info{Suffix}.plist"); - info_plist.LoadWithoutNetworkAccess (Path.Combine (Harness.WatchOSContainerTemplate, "Info.plist")); - info_plist.SetCFBundleIdentifier (BundleIdentifier); - info_plist.SetCFBundleName (Name); - info_plist.SetMinimumOSVersion (Xamarin.SdkVersions.MiniOS); - info_plist.Save (target_info_plist, Harness); - } - - void CreateWatchOSExtensionProject () - { - var csproj = inputProject; - var suffix = Suffix + "-extension"; - - csproj.FixArchitectures (SimulatorArchitectures, DeviceArchitectures, "iPhoneSimulator", "Debug"); - csproj.FixArchitectures (SimulatorArchitectures, DeviceArchitectures, "iPhoneSimulator", "Release"); - csproj.FixArchitectures (SimulatorArchitectures, DeviceArchitectures, "iPhone", "Debug"); - csproj.FixArchitectures (SimulatorArchitectures, DeviceArchitectures, "iPhone", "Release"); - - csproj.SetProjectTypeGuids ("{1E2E965C-F6D2-49ED-B86E-418A60C69EEF};" + LanguageGuid); - csproj.SetOutputPath ("bin\\$(Platform)\\$(Configuration)" + suffix); - csproj.SetIntermediateOutputPath ("obj\\$(Platform)\\$(Configuration)" + suffix); - csproj.RemoveTargetFrameworkIdentifier (); - csproj.SetPlatformAssembly ("Xamarin.WatchOS"); - csproj.SetImport (IsFSharp ? "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.AppExtension.FSharp.targets" : "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.AppExtension.CSharp.targets"); - csproj.FixProjectReferences (Path.Combine (ProjectsDir, GetTargetSpecificDir ()), "-watchos", FixProjectReference); - - csproj.FixInfoPListInclude (suffix, Path.GetDirectoryName (TemplateProjectPath)); - csproj.SetOutputType ("Library"); - csproj.AddAdditionalDefines ("XAMCORE_3_0;FEATURE_NO_BSD_SOCKETS;MONOTOUCH_WATCH;"); - csproj.RemoveReferences ("OpenTK-1.0"); - csproj.RemovePackageReference ("MonoTouch.Dialog"); - var ext = IsFSharp ? "fs" : "cs"; - csproj.AddCompileInclude ("InterfaceController." + ext, Path.Combine (Harness.WatchOSExtensionTemplate, "InterfaceController." + ext)); - csproj.SetExtraLinkerDefs ("extra-linker-defs" + ExtraLinkerDefsSuffix + ".xml"); - csproj.SetMtouchUseBitcode (true, "iPhone", "Release"); - csproj.SetMtouchUseLlvm (true, "iPhone", "Release"); - csproj.ResolveAllPaths (TemplateProjectPath); - - // Not linking a watch extensions requires passing -Os to the native compiler. - // https://github.com/mono/mono/issues/9867 - var configurations = new string [] { "Debug", "Release" }; - foreach (var c in configurations) { - var flags = "-fembed-bitcode-marker"; - if (csproj.GetMtouchLink ("iPhone", c) == "None") - flags += " -Os"; - - csproj.AddExtraMtouchArgs ($"--gcc_flags='{flags}'", "iPhone", c); - } - - csproj.Save (WatchOSExtensionProjectPath, Harness); - - WatchOSExtensionGuid = csproj.GetProjectGuid (); - - XmlDocument info_plist = new XmlDocument (); - var target_info_plist = Path.Combine (TargetDirectory, $"Info{Suffix}-extension.plist"); - var original_info_plist_include = HarnessConfiguration.EvaluateRootTestsDirectory (OriginalInfoPListInclude); - info_plist.LoadWithoutNetworkAccess (Path.Combine (TargetDirectory, original_info_plist_include)); - BundleIdentifier = info_plist.GetCFBundleIdentifier () + "_watch"; - if (BundleIdentifier.Length >= 58) - BundleIdentifier = BundleIdentifier.Substring (0, 57); // If the main app's bundle id is 58 characters (or sometimes more), then the watch extension crashes at launch. radar #29847128. - info_plist.SetCFBundleIdentifier (BundleIdentifier + ".watchkitapp.watchkitextension"); - info_plist.SetMinimumOSVersion (GetMinimumOSVersion (Xamarin.SdkVersions.LegacyMinWatchOS)); - info_plist.SetUIDeviceFamily (4); - info_plist.AddPListStringValue ("RemoteInterfacePrincipleClass", "InterfaceController"); - info_plist.AddPListKeyValuePair ("NSExtension", "dict", string.Format ( -@" - NSExtensionAttributes - - WKAppBundleIdentifier - {0}.watchkitapp - - NSExtensionPointIdentifier - com.apple.watchkit -", BundleIdentifier)); - if (!info_plist.ContainsKey ("NSAppTransportSecurity")) { - info_plist.AddPListKeyValuePair ("NSAppTransportSecurity", "dict", - @" - NSAllowsArbitraryLoads - - "); - } - info_plist.Save (target_info_plist, Harness); - } - - protected override string Imports { - get { - return IsFSharp ? "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.FSharp.targets" : "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.CSharp.targets"; - } - } - - protected override string BindingsImports { - get { - return IsFSharp ? "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.ObjCBinding.FSharp.targets" : "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.ObjCBinding.CSharp.targets"; - } - } - - void CreateWatchOSLibraryProject () - { - var csproj = inputProject; - csproj.SetProjectTypeGuids ("{FC940695-DFE0-4552-9F25-99AF4A5619A1};" + LanguageGuid); - csproj.SetOutputPath ("bin\\$(Platform)\\$(Configuration)" + Suffix); - csproj.SetIntermediateOutputPath ("obj\\$(Platform)\\$(Configuration)" + Suffix); - csproj.RemoveTargetFrameworkIdentifier (); - csproj.SetPlatformAssembly ("Xamarin.WatchOS"); - csproj.SetImport (IsBindingProject ? BindingsImports : Imports); - csproj.AddAdditionalDefines ("XAMCORE_3_0;MONOTOUCH_WATCH;"); - csproj.FixProjectReferences (Path.Combine (ProjectsDir, GetTargetSpecificDir ()), Suffix, FixProjectReference); - csproj.RemovePackageReference ("MonoTouch.Dialog"); - csproj.SetExtraLinkerDefs ("extra-linker-defs" + ExtraLinkerDefsSuffix + ".xml"); - csproj.FixTestLibrariesReferences (Platform); - csproj.ResolveAllPaths (TemplateProjectPath); - csproj.Save (WatchOSProjectPath, Harness); - - WatchOSGuid = csproj.GetProjectGuid (); - } - - protected override void ExecuteInternal () - { - ExtensionName = Name + " Extension"; - AppName = Name + " App"; - - var templateName = Path.GetFileName (TemplateProjectPath); - if (templateName.EndsWith (".template", StringComparison.OrdinalIgnoreCase)) - templateName = Path.GetFileNameWithoutExtension (templateName); - templateName = Path.GetFileNameWithoutExtension (templateName); - - switch (OutputType) { - case "Exe": - WatchOSExtensionProjectPath = Path.Combine (TargetDirectory, ProjectsDir, GetTargetSpecificDir ("extension"), templateName + Suffix + "-extension.csproj"); - WatchOSAppProjectPath = Path.Combine (TargetDirectory, ProjectsDir, GetTargetSpecificDir ("app"), templateName + Suffix + "-app.csproj"); - CreateWatchOSExtensionProject (); - CreateWatchOSAppProject (); - CreateWatchOSContainerProject (); - break; - case "Library": - CreateWatchOSLibraryProject (); - break; - default: - throw new Exception (string.Format ("Unknown OutputType: {0}", OutputType)); - } - } - - protected override string GetMinimumOSVersion (string templateMinimumOSVersion) - { - return templateMinimumOSVersion; - } - - public override string Suffix { - get { - return "-watchos"; - } - } - - public override string ExtraLinkerDefsSuffix { - get { - return "-watchos"; - } - } - - public override string Platform { - get { - return "watchos"; - } - } - - public override IEnumerable GetRelatedProjects () - { - return new RelatedProject [] { - new RelatedProject { Guid = WatchOSExtensionGuid, ProjectPath = WatchOSExtensionProjectPath }, - new RelatedProject { Guid = WatchOSAppGuid, ProjectPath = WatchOSAppProjectPath }, - }; - } - } -} diff --git a/tests/xharness/Targets/iOSTarget.cs b/tests/xharness/Targets/iOSTarget.cs deleted file mode 100644 index 208c88a815d3..000000000000 --- a/tests/xharness/Targets/iOSTarget.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.IO; -using System.Xml; -using Microsoft.DotNet.XHarness.iOS.Shared; -using Microsoft.DotNet.XHarness.iOS.Shared.Utilities; - -namespace Xharness.Targets { - // iOS here means Xamarin.iOS, not iOS as opposed to tvOS/watchOS. - public abstract class iOSTarget : Target { - public iOSTestProject TestProject; - - protected override void PostProcessExecutableProject () - { - base.PostProcessExecutableProject (); - - inputProject.FixArchitectures (SimulatorArchitectures, DeviceArchitectures); - inputProject.FixInfoPListInclude (Suffix); - inputProject.SetExtraLinkerDefs ("extra-linker-defs" + ExtraLinkerDefsSuffix + ".xml"); - - ProjectGuid = inputProject.GetProjectGuid (); - } - - protected override void UpdateInfoPList () - { - XmlDocument info_plist = new XmlDocument (); - var target_info_plist = Path.Combine (TargetDirectory, "Info" + Suffix + ".plist"); - var original_info_plist_include = HarnessConfiguration.EvaluateRootTestsDirectory (OriginalInfoPListInclude); - info_plist.LoadWithoutNetworkAccess (Path.Combine (TargetDirectory, original_info_plist_include)); - BundleIdentifier = info_plist.GetCFBundleIdentifier (); - info_plist.SetMinimumOSVersion (GetMinimumOSVersion (info_plist.GetMinimumOSVersion ())); - info_plist.SetUIDeviceFamily (UIDeviceFamily); - info_plist.Save (target_info_plist, Harness); - } - } -} diff --git a/tests/xharness/TestLabel.cs b/tests/xharness/TestLabel.cs index de55a4774f0f..22514fa3e325 100644 --- a/tests/xharness/TestLabel.cs +++ b/tests/xharness/TestLabel.cs @@ -51,23 +51,19 @@ public enum TestLabel : Int64 { Linker = 1 << 15, [Label ("library-projects")] LibraryProjects = 1 << 16, - [Label ("mac-binding-project")] - MacBindingProject = 1 << 17, - [Label ("mmp")] - Mmp = 1 << 18, + // 1 << 17 is unused + // 1 << 18 is unused // 1 << 19 is unused [Label ("monotouch")] Monotouch = 1 << 20, [Label ("msbuild")] Msbuild = 1 << 21, - [Label ("mtouch")] - Mtouch = 1 << 22, + // 1 << 22 is unused [Label ("sampletester")] SampleTester = 1 << 23, [Label ("system-permission")] SystemPermission = 1 << 24, - [Label ("xammac")] - Xammac = 1 << 25, + // 1 << 25 is unused [Label ("xcframework")] Xcframework = 1 << 26, [Label ("xtro")] @@ -100,12 +96,10 @@ public enum PlatformLabel : uint { OldiOSSimulator = 1 << 9, [Label ("tvos")] tvOS = 1 << 10, - [Label ("watchos")] - watchOS = 1 << 11, + // 1 << 11 is unused [Label ("dotnet")] Dotnet = 1 << 12, - [Label ("legacy-xamarin")] - LegacyXamarin = 1 << 13, + // 1 << 13 is unused [Label ("all")] All = 0xFFFFFFFF, } diff --git a/tests/xharness/TestPlatform.cs b/tests/xharness/TestPlatform.cs index c205266a1514..00d45ed9d64c 100644 --- a/tests/xharness/TestPlatform.cs +++ b/tests/xharness/TestPlatform.cs @@ -4,19 +4,8 @@ public enum TestPlatform { All, iOS, - iOS_Unified, - iOS_Unified32, - iOS_Unified64, - iOS_TodayExtension64, tvOS, - watchOS, - watchOS_32, - watchOS_64_32, MacCatalyst, - Mac, - Mac_Modern, - Mac_Full, - Mac_System, } } diff --git a/tests/xharness/TestPlatformExtensions.cs b/tests/xharness/TestPlatformExtensions.cs index 8687615ab3b6..0b062a0e839c 100644 --- a/tests/xharness/TestPlatformExtensions.cs +++ b/tests/xharness/TestPlatformExtensions.cs @@ -8,17 +8,9 @@ public static string GetSimulatorMinVersion (this TestPlatform platform) { switch (platform) { case TestPlatform.iOS: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_TodayExtension64: - case TestPlatform.iOS_Unified32: - case TestPlatform.iOS_Unified64: return "iOS " + Xamarin.SdkVersions.MiniOSSimulator; case TestPlatform.tvOS: return "tvOS " + Xamarin.SdkVersions.MinTVOSSimulator; - case TestPlatform.watchOS: - case TestPlatform.watchOS_32: - case TestPlatform.watchOS_64_32: - return "watchOS " + Xamarin.SdkVersions.MinWatchOSSimulator; default: throw new NotImplementedException (platform.ToString ()); } @@ -28,9 +20,6 @@ public static bool IsMac (this TestPlatform platform) { switch (platform) { case TestPlatform.Mac: - case TestPlatform.Mac_Modern: - case TestPlatform.Mac_Full: - case TestPlatform.Mac_System: return true; default: return false; @@ -41,10 +30,6 @@ public static bool CanSymlink (this TestPlatform platform) { switch (platform) { case TestPlatform.iOS: - case TestPlatform.iOS_TodayExtension64: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_Unified32: - case TestPlatform.iOS_Unified64: return true; default: return false; @@ -56,23 +41,12 @@ public static string ToPlatformName (this TestPlatform platform) { switch (platform) { case TestPlatform.iOS: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_Unified32: - case TestPlatform.iOS_Unified64: - case TestPlatform.iOS_TodayExtension64: return "iOS"; case TestPlatform.tvOS: return "tvOS"; - case TestPlatform.watchOS: - case TestPlatform.watchOS_32: - case TestPlatform.watchOS_64_32: - return "watchOS"; case TestPlatform.MacCatalyst: return "MacCatalyst"; case TestPlatform.Mac: - case TestPlatform.Mac_Modern: - case TestPlatform.Mac_Full: - case TestPlatform.Mac_System: return "macOS"; default: return null; diff --git a/tests/xharness/TestProject.cs b/tests/xharness/TestProject.cs index a645531746c4..e749522c3df9 100644 --- a/tests/xharness/TestProject.cs +++ b/tests/xharness/TestProject.cs @@ -112,22 +112,11 @@ async Task CreateCopyAsync (ILog log, IProcessManager processManager, ITestTask if (test.ProjectPlatform == "iPhone") { switch (test.Platform) { case TestPlatform.iOS: - case TestPlatform.iOS_Unified: - case TestPlatform.iOS_Unified64: - case TestPlatform.iOS_TodayExtension64: doc.SetTopLevelPropertyGroupValue ("RuntimeIdentifier", "ios-arm64"); break; - case TestPlatform.iOS_Unified32: - doc.SetTopLevelPropertyGroupValue ("RuntimeIdentifier", "ios-arm"); - break; case TestPlatform.tvOS: doc.SetTopLevelPropertyGroupValue ("RuntimeIdentifier", "tvos-arm64"); break; - case TestPlatform.watchOS: - case TestPlatform.watchOS_32: - case TestPlatform.watchOS_64_32: - doc.SetTopLevelPropertyGroupValue ("RuntimeIdentifier", "watchos-arm"); - break; } } diff --git a/tests/xharness/TestProjectExtensions.cs b/tests/xharness/TestProjectExtensions.cs index 4190d0becb59..1ebe17f92289 100644 --- a/tests/xharness/TestProjectExtensions.cs +++ b/tests/xharness/TestProjectExtensions.cs @@ -19,31 +19,5 @@ public static TestProject AsTvOSProject (this TestProject self) clone.Path = Path.Combine (Path.GetDirectoryName (self.Path), Target.ProjectsDir, "tvos" + suffix, Path.GetFileNameWithoutExtension (self.Path) + "-tvos" + Path.GetExtension (self.Path)); return clone; } - - public static TestProject AsWatchOSProject (this TestProject self) - { - var clone = self.Clone (); - var fileName = Path.GetFileNameWithoutExtension (self.Path); - clone.Path = Path.Combine (Path.GetDirectoryName (self.Path), Target.ProjectsDir, "watchos", fileName + (fileName.Contains ("-watchos") ? "" : "-watchos") + Path.GetExtension (self.Path)); - return clone; - } - - public static TestProject AsTodayExtensionProject (this TestProject self) - { - var clone = self.Clone (); - clone.Path = Path.Combine (Path.GetDirectoryName (self.Path), Target.ProjectsDir, "today", Path.GetFileNameWithoutExtension (self.Path) + "-today" + Path.GetExtension (self.Path)); - return clone; - } - - // Get the referenced today extension project (if any) - public static TestProject GetTodayExtension (this TestProject self) - { - var extensions = self.Xml.GetExtensionProjectReferences ().ToArray (); - if (!extensions.Any ()) - return null; - if (extensions.Count () != 1) - throw new NotImplementedException (); - return new TestProject (self.Label, Path.GetFullPath (Path.Combine (Path.GetDirectoryName (self.Path), Target.ProjectsDir, "today-extension", extensions.First ().Replace ('\\', '/')))); - } } } diff --git a/tests/xharness/TestTargetExtensions.cs b/tests/xharness/TestTargetExtensions.cs index 08f86dd0fe77..1d5eadab3d21 100644 --- a/tests/xharness/TestTargetExtensions.cs +++ b/tests/xharness/TestTargetExtensions.cs @@ -10,16 +10,7 @@ public static TestTarget [] GetAppRunnerTargets (this TestPlatform platform) switch (platform) { case TestPlatform.tvOS: return new TestTarget [] { TestTarget.Simulator_tvOS }; - case TestPlatform.watchOS: - case TestPlatform.watchOS_32: - case TestPlatform.watchOS_64_32: - return new TestTarget [] { TestTarget.Simulator_watchOS }; - case TestPlatform.iOS_Unified: - return new TestTarget [] { TestTarget.Simulator_iOS64 }; - case TestPlatform.iOS_Unified32: - throw new NotSupportedException ($"32-bit simulators aren't supported anymore."); - case TestPlatform.iOS_Unified64: - case TestPlatform.iOS_TodayExtension64: + case TestPlatform.iOS: return new TestTarget [] { TestTarget.Simulator_iOS64 }; default: throw new NotImplementedException (platform.ToString ()); @@ -31,7 +22,6 @@ public static TestTargetOs GetTargetOs (this TestTarget target, bool minVersion) return target switch { TestTarget.Simulator_iOS64 => new TestTargetOs (target, minVersion ? Xamarin.SdkVersions.MiniOSSimulator : Xamarin.SdkVersions.MaxiOSSimulator), TestTarget.Simulator_tvOS => new TestTargetOs (target, minVersion ? Xamarin.SdkVersions.MinTVOSSimulator : Xamarin.SdkVersions.MaxTVOSSimulator), - TestTarget.Simulator_watchOS => new TestTargetOs (target, minVersion ? Xamarin.SdkVersions.MinWatchOSSimulator : Xamarin.SdkVersions.MaxWatchOSSimulator), _ => throw new Exception (string.Format ("Invalid simulator target: {0}", target)) }; diff --git a/tests/xharness/Xharness.Tests/Jenkins/JenkinsDeviceLoadterTests.cs b/tests/xharness/Xharness.Tests/Jenkins/JenkinsDeviceLoadterTests.cs index c631410a3ff2..f6cd6d2c5ebd 100644 --- a/tests/xharness/Xharness.Tests/Jenkins/JenkinsDeviceLoadterTests.cs +++ b/tests/xharness/Xharness.Tests/Jenkins/JenkinsDeviceLoadterTests.cs @@ -27,7 +27,6 @@ public static IEnumerable GetDeviceTestCases { devices.Setup (d => d.Connected32BitIOS).Returns (Array.Empty ()); devices.Setup (d => d.Connected64BitIOS).Returns (Array.Empty ()); devices.Setup (d => d.ConnectedTV).Returns (Array.Empty ()); - devices.Setup (d => d.ConnectedWatch).Returns (Array.Empty ()); yield return new TestCaseData (simulators.Object, devices.Object, $"Device Listing (ok - no devices found)."); @@ -36,7 +35,6 @@ public static IEnumerable GetDeviceTestCases { devices.Setup (d => d.Connected32BitIOS).Returns (new IHardwareDevice [] { aDevice.Object }); devices.Setup (d => d.Connected64BitIOS).Returns (Array.Empty ()); devices.Setup (d => d.ConnectedTV).Returns (Array.Empty ()); - devices.Setup (d => d.ConnectedWatch).Returns (Array.Empty ()); yield return new TestCaseData (simulators.Object, devices.Object, $"Device Listing (ok). Devices types are: iOS 32 bit"); @@ -44,7 +42,6 @@ public static IEnumerable GetDeviceTestCases { devices.Setup (d => d.Connected32BitIOS).Returns (new IHardwareDevice [] { aDevice.Object }); devices.Setup (d => d.Connected64BitIOS).Returns (new IHardwareDevice [] { aDevice.Object }); devices.Setup (d => d.ConnectedTV).Returns (Array.Empty ()); - devices.Setup (d => d.ConnectedWatch).Returns (Array.Empty ()); yield return new TestCaseData (simulators.Object, devices.Object, $"Device Listing (ok). Devices types are: iOS 32 bit, iOS 64 bit"); @@ -52,15 +49,13 @@ public static IEnumerable GetDeviceTestCases { devices.Setup (d => d.Connected32BitIOS).Returns (new IHardwareDevice [] { aDevice.Object }); devices.Setup (d => d.Connected64BitIOS).Returns (new IHardwareDevice [] { aDevice.Object }); devices.Setup (d => d.ConnectedTV).Returns (new IHardwareDevice [] { aDevice.Object }); - devices.Setup (d => d.ConnectedWatch).Returns (Array.Empty ()); yield return new TestCaseData (simulators.Object, devices.Object, $"Device Listing (ok). Devices types are: iOS 32 bit, iOS 64 bit, tvOS"); devices = new Mock (); devices.Setup (d => d.Connected32BitIOS).Returns (new IHardwareDevice [] { aDevice.Object }); devices.Setup (d => d.Connected64BitIOS).Returns (new IHardwareDevice [] { aDevice.Object }); devices.Setup (d => d.ConnectedTV).Returns (new IHardwareDevice [] { aDevice.Object }); - devices.Setup (d => d.ConnectedWatch).Returns (new IHardwareDevice [] { aDevice.Object }); - yield return new TestCaseData (simulators.Object, devices.Object, $"Device Listing (ok). Devices types are: iOS 32 bit, iOS 64 bit, tvOS, watchOS"); + yield return new TestCaseData (simulators.Object, devices.Object, $"Device Listing (ok). Devices types are: iOS 32 bit, iOS 64 bit, tvOS"); } } diff --git a/tests/xharness/Xharness.Tests/Jenkins/MakeTestTaskEnumerableTests.cs b/tests/xharness/Xharness.Tests/Jenkins/MakeTestTaskEnumerableTests.cs deleted file mode 100644 index ddd6a76df976..000000000000 --- a/tests/xharness/Xharness.Tests/Jenkins/MakeTestTaskEnumerableTests.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Linq; -using Microsoft.DotNet.XHarness.iOS.Shared; -using Microsoft.DotNet.XHarness.iOS.Shared.Execution; -using Microsoft.DotNet.XHarness.iOS.Shared.Listeners; -using Moq; -using NUnit.Framework; -using Xharness.Jenkins; - -namespace Xharness.Tests.Jenkins { - - [TestFixture] - public class MakeTestTaskEnumerableTests { - - Mock processManager; - Mock resultParser; - Mock tunnel; - - Harness harness; - HarnessConfiguration configuration; - Xharness.Jenkins.Jenkins jenkins; - MakeTestTaskEnumerable factory; - - [SetUp] - public void SetUp () - { - processManager = new Mock (); - resultParser = new Mock (); - tunnel = new Mock (); - configuration = new HarnessConfiguration (); - harness = new Harness (resultParser.Object, HarnessAction.Jenkins, configuration); - jenkins = new Xharness.Jenkins.Jenkins (harness, processManager.Object, resultParser.Object, tunnel.Object); - - factory = new MakeTestTaskEnumerable (jenkins, processManager.Object); - } - - [TearDown] - public void TearDown () - { - processManager = null; - resultParser = null; - configuration = null; - harness = null; - jenkins = null; - factory = null; - } - - [TestCase ("MMP Regression Tests")] - [TestCase ("Mac Binding Projects")] - [TestCase ("Documentation")] - public void ContainsTest (string testName) - => Assert.True (factory.Select (t => t.TestName == testName).Any (), testName); - - [Test] - public void CountTest () - => Assert.AreEqual (3, factory.Count (), "Added or removed tests?"); - } -} diff --git a/tests/xharness/Xharness.Tests/Jenkins/TestSelectionTests.cs b/tests/xharness/Xharness.Tests/Jenkins/TestSelectionTests.cs index a1158a88d1c7..900cda0407a4 100644 --- a/tests/xharness/Xharness.Tests/Jenkins/TestSelectionTests.cs +++ b/tests/xharness/Xharness.Tests/Jenkins/TestSelectionTests.cs @@ -34,9 +34,6 @@ public void DefaultSelectionTest () Assert.IsTrue (selection.SelectedPlatforms.HasFlag (PlatformLabel.tvOS), "tvos"); Assert.IsTrue (selection.IsEnabled (PlatformLabel.tvOS), "IsEnabled (tvOS)"); - Assert.IsTrue (selection.SelectedPlatforms.HasFlag (PlatformLabel.watchOS), "watchOS"); - Assert.IsTrue (selection.IsEnabled (PlatformLabel.watchOS), "IsEnabled (watchOS)"); - Assert.IsTrue (selection.SelectedPlatforms.HasFlag (PlatformLabel.iOS), "iOS"); Assert.IsTrue (selection.IsEnabled (PlatformLabel.iOS), "IsEnabled (iOS)"); diff --git a/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/AssemblyLocatorTest.cs b/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/AssemblyLocatorTest.cs index 9262469a9ca6..98933167fb6d 100644 --- a/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/AssemblyLocatorTest.cs +++ b/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/AssemblyLocatorTest.cs @@ -5,7 +5,7 @@ namespace Xharness.Tests.TestImporter.Xamarin.Tests { - // very simple class, but we want to make sure that iOS, tvOS, watchOS get the iosDownload and the mac + // very simple class, but we want to make sure that iOS, tvOS get the iosDownload and the mac // versions get the mac download [TestFixture] public class AssemblyLocatorTest { @@ -19,18 +19,7 @@ public class AssemblyLocatorTest { [TestCase (Platform.iOS, iOSPath)] [TestCase (Platform.TvOS, iOSPath)] - [TestCase (Platform.WatchOS, iOSPath)] - [TestCase (Platform.MacOSFull, macOSPath)] - [TestCase (Platform.MacOSModern, macOSPath)] public void GetAssembliesRootLocationTest (Platform platform, string expected) => Assert.AreEqual (expected, assemblyLocator.GetAssembliesRootLocation (platform)); - - [TestCase (Platform.iOS, iOSPath, "ios-bcl", "monotouch", "tests")] - [TestCase (Platform.TvOS, iOSPath, "ios-bcl", "monotouch_tv", "tests")] - [TestCase (Platform.WatchOS, iOSPath, "ios-bcl", "monotouch_watch", "tests")] - [TestCase (Platform.MacOSFull, macOSPath, "mac-bcl", "xammac_net_4_5", "tests")] - public void GetAssembliesLocation (Platform platform, params string [] expected) - => Assert.AreEqual (Path.Combine (expected), assemblyLocator.GetAssembliesLocation (platform)); - } } diff --git a/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/XamariniOSTemplateTest.cs b/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/XamariniOSTemplateTest.cs index 4eab2c86148e..c58af8e9e845 100644 --- a/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/XamariniOSTemplateTest.cs +++ b/tests/xharness/Xharness.Tests/TestImporter/Xamarin/Tests/XamariniOSTemplateTest.cs @@ -42,10 +42,7 @@ public void TearDown () template = null; } [TestCase ("iOSProject", Platform.iOS, "iOSProject.csproj")] - [TestCase ("WatchOSProject", Platform.WatchOS, "WatchOSProject-watchos.csproj")] [TestCase ("TvOSProject", Platform.TvOS, "TvOSProject-tvos.csproj")] - [TestCase ("macOSProject", Platform.MacOSFull, "macOSProject-mac-full.csproj")] - [TestCase ("macOSProject", Platform.MacOSModern, "macOSProject-mac-modern.csproj")] public void GetProjectPathTest (string projectName, Platform platform, string expectedName) { // ignore the fact that all params are the same, we do not care @@ -53,34 +50,14 @@ public void GetProjectPathTest (string projectName, Platform platform, string ex Assert.AreEqual (Path.Combine (template.OutputDirectoryPath, "generated", platform.ToString (), projectName, expectedName), path); } - [TestCase ("WatchApp", WatchAppType.App, "WatchApp-watchos-app.csproj")] - [TestCase ("WatchExtension", WatchAppType.Extension, "WatchExtension-watchos-extension.csproj")] - public void GetProjectPathWatchOSTest (string projectName, WatchAppType appType, string expectedName) - { - // ignore the fact that all params are the same, we do not care - var path = template.GetProjectPath (projectName, appType); - Assert.AreEqual (Path.Combine (template.OutputDirectoryPath, "generated", Platform.WatchOS.ToString (), projectName, appType.ToString ().ToLowerInvariant (), expectedName), path); - } - [TestCase ("/usr/path", Platform.iOS, "Info.plist")] [TestCase ("/usr/second/path", Platform.TvOS, "Info-tvos.plist")] - [TestCase ("/usr/other/path", Platform.WatchOS, "Info-watchos.plist")] - [TestCase ("/usr/other/path", Platform.MacOSFull, "Info-mac.plist")] - [TestCase ("/usr/other/path", Platform.MacOSModern, "Info-mac.plist")] public void GetPListPathTest (string rootDir, Platform platform, string expectedName) { var path = XamariniOSTemplate.GetPListPath (rootDir, platform); Assert.AreEqual (Path.Combine (rootDir, expectedName), path); } - [TestCase ("/usr/bin", WatchAppType.App, "Info-watchos-app.plist")] - [TestCase ("/usr/local", WatchAppType.Extension, "Info-watchos-extension.plist")] - public void GetPListPathWatchOSTest (string rootDir, WatchAppType appType, string expectedName) - { - var path = XamariniOSTemplate.GetPListPath (rootDir, appType); - Assert.AreEqual (Path.Combine (rootDir, expectedName), path); - } - [TestCase ("System.Xml.dll")] [TestCase ("MyAssembly.dll")] public void GetReferenceNodeNullHintTest (string assembly) diff --git a/tests/xharness/Xharness.Tests/Tests/MacFlavorsExtensionsTests.cs b/tests/xharness/Xharness.Tests/Tests/MacFlavorsExtensionsTests.cs deleted file mode 100644 index b9def59cd83d..000000000000 --- a/tests/xharness/Xharness.Tests/Tests/MacFlavorsExtensionsTests.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.DotNet.XHarness.iOS.Shared; -using NUnit.Framework; - -namespace Xharness.Tests.Tests { - - [TestFixture] - public class MacFlavorsExtensionsTests { - - [TestCase (MacFlavors.Console, TestPlatform.Mac)] - [TestCase (MacFlavors.Full, TestPlatform.Mac_Full)] - [TestCase (MacFlavors.Modern, TestPlatform.Mac_Modern)] - [TestCase (MacFlavors.System, TestPlatform.Mac_System)] - public void ToTestPlatformTest (MacFlavors flavor, TestPlatform expected) - => Assert.AreEqual (flavor.ToTestPlatform (), expected); - } -} diff --git a/tests/xharness/Xharness.Tests/Tests/TestPlatformExtensionsTests.cs b/tests/xharness/Xharness.Tests/Tests/TestPlatformExtensionsTests.cs index d925fd696742..f18dcf10b3d6 100644 --- a/tests/xharness/Xharness.Tests/Tests/TestPlatformExtensionsTests.cs +++ b/tests/xharness/Xharness.Tests/Tests/TestPlatformExtensionsTests.cs @@ -10,19 +10,10 @@ public class TestPlatformExtensionsTests { public class TestCasesData { public static IEnumerable GetSimulatorTestCases { get { - foreach (var platform in new [] { TestPlatform.iOS, - TestPlatform.iOS_Unified, - TestPlatform.iOS_TodayExtension64, - TestPlatform.iOS_Unified32, - TestPlatform.iOS_Unified64,}) { + foreach (var platform in new [] { TestPlatform.iOS }) { yield return new TestCaseData (platform).Returns ("iOS " + Xamarin.SdkVersions.MiniOSSimulator); } yield return new TestCaseData (TestPlatform.tvOS).Returns ("tvOS " + Xamarin.SdkVersions.MinTVOSSimulator); - foreach (var platform in new [] { TestPlatform.watchOS, - TestPlatform.watchOS_32, - TestPlatform.watchOS_64_32}) { - yield return new TestCaseData (platform).Returns ("watchOS " + Xamarin.SdkVersions.MinWatchOSSimulator); - } } } @@ -32,21 +23,11 @@ public static IEnumerable IsMacTestCases { foreach (var platform in new [] { TestPlatform.None, TestPlatform.All, TestPlatform.iOS, - TestPlatform.iOS_Unified, - TestPlatform.iOS_Unified32, - TestPlatform.iOS_Unified64, - TestPlatform.iOS_TodayExtension64, - TestPlatform.tvOS, - TestPlatform.watchOS, - TestPlatform.watchOS_32, - TestPlatform.watchOS_64_32 }) { + TestPlatform.tvOS }) { yield return new TestCaseData (platform).Returns (false); } - foreach (var platform in new [] { TestPlatform.Mac, - TestPlatform.Mac_Modern, - TestPlatform.Mac_Full, - TestPlatform.Mac_System }) { + foreach (var platform in new [] { TestPlatform.Mac }) { yield return new TestCaseData (platform).Returns (true); } } @@ -54,24 +35,14 @@ public static IEnumerable IsMacTestCases { public static IEnumerable CanSymlinkTestCases { get { - foreach (var platform in new [] { TestPlatform.iOS, - TestPlatform.iOS_TodayExtension64, - TestPlatform.iOS_Unified, - TestPlatform.iOS_Unified32, - TestPlatform.iOS_Unified64 }) { + foreach (var platform in new [] { TestPlatform.iOS }) { yield return new TestCaseData (platform).Returns (true); } foreach (var platform in new [] {TestPlatform.None, TestPlatform.tvOS, - TestPlatform.watchOS, - TestPlatform.watchOS_32, - TestPlatform.watchOS_64_32, - TestPlatform.Mac, - TestPlatform.Mac_Modern, - TestPlatform.Mac_Full, - TestPlatform.Mac_System}) { + TestPlatform.Mac }) { yield return new TestCaseData (platform).Returns (false); } } diff --git a/tests/xharness/Xharness.Tests/Tests/TestTargetExtensionsTests.cs b/tests/xharness/Xharness.Tests/Tests/TestTargetExtensionsTests.cs index 0722b6fb4c39..64efc73be642 100644 --- a/tests/xharness/Xharness.Tests/Tests/TestTargetExtensionsTests.cs +++ b/tests/xharness/Xharness.Tests/Tests/TestTargetExtensionsTests.cs @@ -9,12 +9,6 @@ namespace Xharness.Tests.Tests { public class TestTargetExtensionsTests { [TestCase (TestPlatform.tvOS, new [] { TestTarget.Simulator_tvOS })] - [TestCase (TestPlatform.watchOS, new [] { TestTarget.Simulator_watchOS })] - [TestCase (TestPlatform.watchOS_32, new [] { TestTarget.Simulator_watchOS })] - [TestCase (TestPlatform.watchOS_64_32, new [] { TestTarget.Simulator_watchOS })] - [TestCase (TestPlatform.iOS_Unified, new [] { TestTarget.Simulator_iOS64 })] - [TestCase (TestPlatform.iOS_Unified64, new [] { TestTarget.Simulator_iOS64 })] - [TestCase (TestPlatform.iOS_TodayExtension64, new [] { TestTarget.Simulator_iOS64 })] public void GetAppRunnerTargetsTest (TestPlatform platform, TestTarget [] expectedTargets) { var targets = platform.GetAppRunnerTargets (); diff --git a/tests/xharness/Xharness.Tests/Xharness.Tests.csproj b/tests/xharness/Xharness.Tests/Xharness.Tests.csproj index c443b6eff265..aa9e19d2f69c 100644 --- a/tests/xharness/Xharness.Tests/Xharness.Tests.csproj +++ b/tests/xharness/Xharness.Tests/Xharness.Tests.csproj @@ -16,8 +16,6 @@ - - diff --git a/tests/xharness/iOSTestProject.cs b/tests/xharness/iOSTestProject.cs index 6d8a9cf2c214..ec6f171726a4 100644 --- a/tests/xharness/iOSTestProject.cs +++ b/tests/xharness/iOSTestProject.cs @@ -4,15 +4,12 @@ namespace Xharness { public class iOSTestProject : TestProject { public bool SkipiOSVariation; - public bool SkipwatchOSVariation; // skip both - public bool SkipwatchOSARM64_32Variation; public bool SkiptvOSVariation; - public bool SkipTodayExtensionVariation; public bool SkipDeviceVariations; public bool BuildOnly; - public iOSTestProject (TestLabel label, string path, bool isExecutableProject = true) - : base (label, path, isExecutableProject) + public iOSTestProject (TestLabel label, string path) + : base (label, path, true) { Name = System.IO.Path.GetFileNameWithoutExtension (path); } @@ -24,17 +21,14 @@ public bool IsSupported (DevicePlatform devicePlatform, string productVersion) public override TestProject Clone () { - return CompleteClone (new iOSTestProject (Label, Path, IsExecutableProject)); + return CompleteClone (new iOSTestProject (Label, Path)); } protected override TestProject CompleteClone (TestProject project) { var rv = (iOSTestProject) project; rv.SkipiOSVariation = SkipiOSVariation; - rv.SkipwatchOSVariation = SkipwatchOSVariation; - rv.SkipwatchOSARM64_32Variation = SkipwatchOSARM64_32Variation; rv.SkiptvOSVariation = SkiptvOSVariation; - rv.SkipTodayExtensionVariation = SkipTodayExtensionVariation; rv.SkipDeviceVariations = SkipDeviceVariations; rv.BuildOnly = BuildOnly; return base.CompleteClone (rv); diff --git a/tests/xharness/xharness.csproj b/tests/xharness/xharness.csproj index 1fb000b19799..7899035397d6 100644 --- a/tests/xharness/xharness.csproj +++ b/tests/xharness/xharness.csproj @@ -26,15 +26,11 @@ Project - --verbose --jenkins --autoconf --rootdir .. --label=skip-mac-tests,skip-ios-simulator-tests,skip-ios-msbuild-tests,skip-system-permission-tests,run-ios-device-tests,run-ios-extensions-tests --markdown-summary=../TestSummary.md --label=run-watchos-tests + --verbose --jenkins --autoconf --rootdir .. --label=skip-mac-tests,skip-ios-simulator-tests,skip-ios-msbuild-tests,skip-system-permission-tests,run-ios-device-tests,run-ios-extensions-tests --markdown-summary=../TestSummary.md - - Project - --configure --autoconf --rootdir ../../../.. - @@ -56,7 +52,6 @@ - @@ -108,14 +103,7 @@ - - - - - - - diff --git a/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 b/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 index 92078785fa09..b60750abc45c 100644 --- a/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 +++ b/tools/devops/automation/scripts/TestConfiguration.Tests.ps1 @@ -153,6 +153,7 @@ Describe 'Get-TestConfiguration' { "TEST_PREFIX": "test-prefix_monotouchtest_tvos", "TEST_PLATFORM": "tvOS", "TEST_FILTER": "Category != MultiPlatform" + } } "@ @@ -195,6 +196,7 @@ Describe 'Get-TestConfiguration' { "TEST_PREFIX": "test-prefix_monotouchtest_ios", "TEST_PLATFORM": "iOS", "TEST_FILTER": "Category != MultiPlatform" + } } "@ @@ -219,6 +221,7 @@ Describe 'Get-TestConfiguration' { "STATUS_CONTEXT": "status-context - cecil", "TEST_PREFIX": "test-prefix_cecil", "TEST_PLATFORM": "" + } } "@ } @@ -306,6 +309,7 @@ Describe 'Get-TestConfiguration' { "TEST_PREFIX": "test-prefix_monotouchtest_maccatalyst", "TEST_PLATFORM": "MacCatalyst", "TEST_FILTER": "Category != MultiPlatform" + } } "@ } diff --git a/tools/devops/automation/scripts/TestResults.Tests.ps1 b/tools/devops/automation/scripts/TestResults.Tests.ps1 index f73f03020875..bf9c580358be 100644 --- a/tools/devops/automation/scripts/TestResults.Tests.ps1 +++ b/tools/devops/automation/scripts/TestResults.Tests.ps1 @@ -18,7 +18,7 @@ Describe "TestResults tests" { { "dotnettests_ios": { "LABEL": "dotnettests", - "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests,run-dotnettests-tests", + "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-dotnettests-tests", "LABEL_WITH_PLATFORM": "dotnettests_iOS", "STATUS_CONTEXT": "VSTS: simulator tests - dotnettests - iOS", "TEST_simulator_tests": "simulator_dotnettests_ios", @@ -27,7 +27,7 @@ Describe "TestResults tests" { }, "dotnettests_tvos": { "LABEL": "dotnettests", - "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests,run-dotnettests-tests", + "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-dotnettests-tests", "LABEL_WITH_PLATFORM": "dotnettests_tvOS", "STATUS_CONTEXT": "VSTS: simulator tests - dotnettests - tvOS", "TEST_simulator_tests": "simulator_dotnettests_tvos", @@ -36,7 +36,7 @@ Describe "TestResults tests" { }, "dotnettests_maccatalyst": { "LABEL": "dotnettests", - "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests,run-dotnettests-tests", + "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-dotnettests-tests", "LABEL_WITH_PLATFORM": "dotnettests_MacCatalyst", "STATUS_CONTEXT": "VSTS: simulator tests - dotnettests - MacCatalyst", "TEST_simulator_tests": "simulator_dotnettests_maccatalyst", @@ -45,7 +45,7 @@ Describe "TestResults tests" { }, "dotnettests_macos": { "LABEL": "dotnettests", - "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests,run-dotnettests-tests", + "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-dotnettests-tests", "LABEL_WITH_PLATFORM": "dotnettests_macOS", "STATUS_CONTEXT": "VSTS: simulator tests - dotnettests - macOS", "TEST_simulator_tests": "simulator_dotnettests_macos", @@ -54,7 +54,7 @@ Describe "TestResults tests" { }, "dotnettests_multiple": { "LABEL": "dotnettests", - "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests,run-dotnettests-tests", + "TESTS_LABELS": "--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-dotnettests-tests", "LABEL_WITH_PLATFORM": "dotnettests_Multiple", "STATUS_CONTEXT": "VSTS: simulator tests - dotnettests - Multiple", "TEST_simulator_tests": "simulator_dotnettests_multiple", @@ -64,7 +64,7 @@ Describe "TestResults tests" { "cecil": { "LABEL": "cecil", - "TESTS_LABELS": "--label=skip-all-tests,run-ios-64-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests,run-cecil-tests", + "TESTS_LABELS": "--label=skip-all-tests,run-ios-64-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-cecil-tests", "LABEL_WITH_PLATFORM": "cecil", "STATUS_CONTEXT": "VSTS: simulator tests - cecil", "TEST_simulator_tests": "simulator_cecil", diff --git a/tools/devops/automation/scripts/VSTS.psm1 b/tools/devops/automation/scripts/VSTS.psm1 index 716e2f070986..440929afe300 100644 --- a/tools/devops/automation/scripts/VSTS.psm1 +++ b/tools/devops/automation/scripts/VSTS.psm1 @@ -488,7 +488,7 @@ class BuildConfiguration { # if xamarin legacy has been included, check if we need to include the xamarin sdk for each of the platforms, otherewise it will be # false for all - $xamarinPlatforms = @("ios", "macos", "tvos", "watchos", "maccatalyst") + $xamarinPlatforms = @("ios", "macos", "tvos", "maccatalyst") if ($configuration.INCLUDE_XAMARIN_LEGACY -eq "true") { foreach ($platform in $xamarinPlatforms) { $variableName = "INCLUDE_LEGACY_$($platform.ToUpper())" diff --git a/tools/devops/automation/templates/api-diff-stage.yml b/tools/devops/automation/templates/api-diff-stage.yml index 3fb0a7a00cb9..33496b6eb59a 100644 --- a/tools/devops/automation/templates/api-diff-stage.yml +++ b/tools/devops/automation/templates/api-diff-stage.yml @@ -67,7 +67,7 @@ stages: parameters: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} - testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests' + testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests' statusContext: 'VSTS: simulator tests' uploadArtifacts: true use1ES: false diff --git a/tools/devops/automation/templates/main-stage.yml b/tools/devops/automation/templates/main-stage.yml index 9a53e3f0e5de..1481d120804c 100644 --- a/tools/devops/automation/templates/main-stage.yml +++ b/tools/devops/automation/templates/main-stage.yml @@ -228,7 +228,7 @@ stages: commit: ${{ parameters.commit }} testConfigurations: ${{ parameters.testConfigurations }} supportedPlatforms: ${{ parameters.supportedPlatforms }} - testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests' + testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests' statusContext: 'VSTS: simulator tests' uploadArtifacts: true use1ES: true diff --git a/tools/devops/automation/templates/pipelines/run-api-scan.yml b/tools/devops/automation/templates/pipelines/run-api-scan.yml index 14f6ae850785..3b493eb6a157 100644 --- a/tools/devops/automation/templates/pipelines/run-api-scan.yml +++ b/tools/devops/automation/templates/pipelines/run-api-scan.yml @@ -119,7 +119,7 @@ stages: commit: HEAD testConfigurations: ${{ parameters.testConfigurations }} supportedPlatforms: ${{ parameters.supportedPlatforms }} - testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests' + testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests' statusContext: 'VSTS: simulator tests' uploadArtifacts: true diff --git a/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml b/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml index 30aefb1eabde..c596c8ebdab9 100644 --- a/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml +++ b/tools/devops/automation/templates/pipelines/run-macos-tests-pipeline.yml @@ -238,7 +238,7 @@ stages: commit: ${{ parameters.commit }} testConfigurations: ${{ parameters.testConfigurations }} supportedPlatforms: ${{ parameters.supportedPlatforms }} - testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests' + testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests' statusContext: 'VSTS: simulator tests' uploadArtifacts: true diff --git a/tools/devops/automation/templates/tests-stage.yml b/tools/devops/automation/templates/tests-stage.yml index 8916e575cf35..f9f4eca20bb1 100644 --- a/tools/devops/automation/templates/tests-stage.yml +++ b/tools/devops/automation/templates/tests-stage.yml @@ -202,7 +202,7 @@ stages: commit: ${{ parameters.commit }} testConfigurations: ${{ parameters.testConfigurations }} supportedPlatforms: ${{ parameters.supportedPlatforms }} - testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-watchos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests,run-legacy-xamarin-tests' + testsLabels: '--label=skip-all-tests,run-ios-tests,run-ios-simulator-tests,run-tvos-tests,run-mac-tests,run-maccatalyst-tests,run-dotnet-tests,run-system-permission-tests' statusContext: 'VSTS: simulator tests' uploadArtifacts: true From 8e0cec382c13e7e2840bcefd16bde69063acc054 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Wed, 16 Oct 2024 13:11:21 -0400 Subject: [PATCH 074/155] [RGen] Teach been to ignore rgen types. (#21449) Teach our bgen to ignore those types that have been marked as a rgen BindingType. The code adds a new smart enum in the sources that should not be processed by bgen and therefore should not have the smart enum extension method. You can verify that this is try by looking at the API diff: Screenshot 2024-10-15 at 14 58 00 --- .../AVCaptureReactionType.rgen.cs | 44 +++++++++++++++++++ src/bgen/Generator.cs | 8 ++++ src/bgen/bgen.csproj | 4 ++ src/frameworks.sources | 1 + .../Documentation.KnownFailures.txt | 9 ++++ .../MacCatalyst-AVFoundation.todo | 8 ---- .../iOS-AVFoundation.todo | 8 ---- .../macOS-AVFoundation.todo | 8 ---- .../tvOS-AVFoundation.todo | 8 ---- 9 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 src/AVFoundation/AVCaptureReactionType.rgen.cs diff --git a/src/AVFoundation/AVCaptureReactionType.rgen.cs b/src/AVFoundation/AVCaptureReactionType.rgen.cs new file mode 100644 index 000000000000..de1bc4ee63f7 --- /dev/null +++ b/src/AVFoundation/AVCaptureReactionType.rgen.cs @@ -0,0 +1,44 @@ +#pragma warning disable APL0003 +using System; +using System.Runtime.Versioning; + +using Foundation; +using ObjCRuntime; +using ObjCBindings; + +#nullable enable + +namespace AVFoundation { + + [BindingTypeAttribute] + [SupportedOSPlatform ("ios17.0")] + [SupportedOSPlatform ("tvos17.0")] + [SupportedOSPlatform ("maccatalyst17.0")] + [SupportedOSPlatform ("macos14.0")] + public enum AVCaptureReactionType { + [Field ("AVCaptureReactionTypeThumbsUp")] + ThumbsUp, + + [Field ("AVCaptureReactionTypeThumbsDown")] + ThumbsDown, + + [Field ("AVCaptureReactionTypeBalloons")] + Balloons, + + [Field ("AVCaptureReactionTypeHeart")] + Heart, + + [Field ("AVCaptureReactionTypeFireworks")] + Fireworks, + + [Field ("AVCaptureReactionTypeRain")] + Rain, + + [Field ("AVCaptureReactionTypeConfetti")] + Confetti, + + [Field ("AVCaptureReactionTypeLasers")] + Lasers, + } +} +#pragma warning restore APL0003 diff --git a/src/bgen/Generator.cs b/src/bgen/Generator.cs index 47cbefb4c0a6..0692efe5c98e 100644 --- a/src/bgen/Generator.cs +++ b/src/bgen/Generator.cs @@ -50,6 +50,7 @@ using System.Text; using System.ComponentModel; using System.Reflection; +using ObjCBindings; using ObjCRuntime; using Foundation; using Xamarin.Utils; @@ -5630,6 +5631,13 @@ string GetAssemblyName () public void Generate (Type type) { + + // check if the type has been marked as a type that will be generated by the new code generator, if that + // is the case, bgen will ignore it allowing the rgen code generator add the type to the final assembly + bool is_rgen_type = AttributeManager.HasAttribute (type); + if (is_rgen_type) + return; + if (ZeroCopyStrings) { ErrorHelper.Warning (1027); ZeroCopyStrings = false; diff --git a/src/bgen/bgen.csproj b/src/bgen/bgen.csproj index 1444c86b365a..693c569025ba 100644 --- a/src/bgen/bgen.csproj +++ b/src/bgen/bgen.csproj @@ -9,6 +9,7 @@ $(DefineConstants);XAMMACIOS_DEBUGGER Nullable enable + APL0003 @@ -26,6 +27,9 @@ + + BindingTypeAttribute.cs + generator-errors.md diff --git a/src/frameworks.sources b/src/frameworks.sources index 3cbd037b273e..ec3f51ec8d61 100644 --- a/src/frameworks.sources +++ b/src/frameworks.sources @@ -296,6 +296,7 @@ AVFOUNDATION_SOURCES = \ AVFoundation/Events.cs \ AVFoundation/AVPlayerLooper.cs \ AVFoundation/AudioRendererWasFlushedAutomaticallyEventArgs.cs \ + AVFoundation/AVCaptureReactionType.rgen.cs \ # AVKit diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 4389dfbe71ce..881b3dd58432 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -5311,6 +5311,14 @@ F:AVFoundation.AVCapturePrimaryConstituentDeviceSwitchingBehavior.Auto F:AVFoundation.AVCapturePrimaryConstituentDeviceSwitchingBehavior.Locked F:AVFoundation.AVCapturePrimaryConstituentDeviceSwitchingBehavior.Restricted F:AVFoundation.AVCapturePrimaryConstituentDeviceSwitchingBehavior.Unsupported +F:AVFoundation.AVCaptureReactionType.Balloons +F:AVFoundation.AVCaptureReactionType.Confetti +F:AVFoundation.AVCaptureReactionType.Fireworks +F:AVFoundation.AVCaptureReactionType.Heart +F:AVFoundation.AVCaptureReactionType.Lasers +F:AVFoundation.AVCaptureReactionType.Rain +F:AVFoundation.AVCaptureReactionType.ThumbsDown +F:AVFoundation.AVCaptureReactionType.ThumbsUp F:AVFoundation.AVCaptureSessionInterruptionReason.AudioDeviceInUseByAnotherClient F:AVFoundation.AVCaptureSessionInterruptionReason.VideoDeviceInUseByAnotherClient F:AVFoundation.AVCaptureSessionInterruptionReason.VideoDeviceNotAvailableDueToSystemPressure @@ -81581,6 +81589,7 @@ T:AVFoundation.AVCapturePhotoQualityPrioritization T:AVFoundation.AVCapturePhotoSettingsThumbnailFormat T:AVFoundation.AVCapturePrimaryConstituentDeviceRestrictedSwitchingBehaviorConditions T:AVFoundation.AVCapturePrimaryConstituentDeviceSwitchingBehavior +T:AVFoundation.AVCaptureReactionType T:AVFoundation.AVCaptureSessionInterruptionReason T:AVFoundation.AVCaptureSessionRuntimeErrorEventArgs T:AVFoundation.AVCaptureSystemPressureFactors diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-AVFoundation.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-AVFoundation.todo index 4e37b3aa228b..747df9b01d3e 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-AVFoundation.todo +++ b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-AVFoundation.todo @@ -315,14 +315,6 @@ !missing-field! AVAudioSessionRenderingModeNewRenderingModeKey not bound !missing-field! AVCaptureDeviceTypeContinuityCamera not bound !missing-field! AVCaptureDeviceTypeMicrophone not bound -!missing-field! AVCaptureReactionTypeBalloons not bound -!missing-field! AVCaptureReactionTypeConfetti not bound -!missing-field! AVCaptureReactionTypeFireworks not bound -!missing-field! AVCaptureReactionTypeHeart not bound -!missing-field! AVCaptureReactionTypeLasers not bound -!missing-field! AVCaptureReactionTypeRain not bound -!missing-field! AVCaptureReactionTypeThumbsDown not bound -!missing-field! AVCaptureReactionTypeThumbsUp not bound !missing-field! AVFileTypeAHAP not bound !missing-field! AVMediaCharacteristicCarriesVideoStereoMetadata not bound !missing-field! AVMediaCharacteristicContainsStereoMultiviewVideo not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-AVFoundation.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-AVFoundation.todo index 344b5208ca20..eb05e8cd30f0 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-AVFoundation.todo +++ b/tests/xtro-sharpie/api-annotations-dotnet/iOS-AVFoundation.todo @@ -319,14 +319,6 @@ !missing-field! AVAudioApplicationMuteStateKey not bound !missing-field! AVAudioSessionPortContinuityMicrophone not bound !missing-field! AVCaptureDeviceTypeMicrophone not bound -!missing-field! AVCaptureReactionTypeBalloons not bound -!missing-field! AVCaptureReactionTypeConfetti not bound -!missing-field! AVCaptureReactionTypeFireworks not bound -!missing-field! AVCaptureReactionTypeHeart not bound -!missing-field! AVCaptureReactionTypeLasers not bound -!missing-field! AVCaptureReactionTypeRain not bound -!missing-field! AVCaptureReactionTypeThumbsDown not bound -!missing-field! AVCaptureReactionTypeThumbsUp not bound !missing-field! AVFileTypeAHAP not bound !missing-field! AVMediaCharacteristicCarriesVideoStereoMetadata not bound !missing-field! AVMediaCharacteristicContainsStereoMultiviewVideo not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-AVFoundation.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-AVFoundation.todo index dd9cbbc39fdc..bddf52e047b9 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/macOS-AVFoundation.todo +++ b/tests/xtro-sharpie/api-annotations-dotnet/macOS-AVFoundation.todo @@ -315,14 +315,6 @@ !missing-field! AVAudioApplicationInputMuteStateChangeNotification not bound !missing-field! AVAudioApplicationMuteStateKey not bound !missing-field! AVCaptureDeviceTypeMicrophone not bound -!missing-field! AVCaptureReactionTypeBalloons not bound -!missing-field! AVCaptureReactionTypeConfetti not bound -!missing-field! AVCaptureReactionTypeFireworks not bound -!missing-field! AVCaptureReactionTypeHeart not bound -!missing-field! AVCaptureReactionTypeLasers not bound -!missing-field! AVCaptureReactionTypeRain not bound -!missing-field! AVCaptureReactionTypeThumbsDown not bound -!missing-field! AVCaptureReactionTypeThumbsUp not bound !missing-field! AVFileTypeAHAP not bound !missing-field! AVMediaCharacteristicCarriesVideoStereoMetadata not bound !missing-field! AVMediaCharacteristicContainsStereoMultiviewVideo not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-AVFoundation.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-AVFoundation.todo index e04df5211b2c..19a70995a792 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-AVFoundation.todo +++ b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-AVFoundation.todo @@ -323,14 +323,6 @@ !missing-field! AVCaptureISOCurrent not bound !missing-field! AVCaptureLensPositionCurrent not bound !missing-field! AVCaptureMaxAvailableTorchLevel not bound -!missing-field! AVCaptureReactionTypeBalloons not bound -!missing-field! AVCaptureReactionTypeConfetti not bound -!missing-field! AVCaptureReactionTypeFireworks not bound -!missing-field! AVCaptureReactionTypeHeart not bound -!missing-field! AVCaptureReactionTypeLasers not bound -!missing-field! AVCaptureReactionTypeRain not bound -!missing-field! AVCaptureReactionTypeThumbsDown not bound -!missing-field! AVCaptureReactionTypeThumbsUp not bound !missing-field! AVCaptureSessionDidStartRunningNotification not bound !missing-field! AVCaptureSessionDidStopRunningNotification not bound !missing-field! AVCaptureSessionErrorKey not bound From 617acd8e251b9b5348e9de203bf449d05d4d9be0 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 21:59:32 +0200 Subject: [PATCH 075/155] [xcode16.1] Add a dependency on the .NET 9/Xcode 16.0 packages. (#21459) --- Make.versions | 5 +++++ eng/Version.Details.xml | 17 +++++++++++++++++ eng/Versions.props | 5 +++++ 3 files changed, 27 insertions(+) diff --git a/Make.versions b/Make.versions index dd791ec982f9..98d3434b4ea6 100644 --- a/Make.versions +++ b/Make.versions @@ -151,3 +151,8 @@ SUPPORTED_API_VERSIONS_IOS+=net8.0-18.0 SUPPORTED_API_VERSIONS_TVOS+=net8.0-18.0 SUPPORTED_API_VERSIONS_MACOS+=net8.0-15.0 SUPPORTED_API_VERSIONS_MACCATALYST+=net8.0-18.0 + +SUPPORTED_API_VERSIONS_IOS+=net9.0-18.0 +SUPPORTED_API_VERSIONS_TVOS+=net9.0-18.0 +SUPPORTED_API_VERSIONS_MACOS+=net9.0-15.0 +SUPPORTED_API_VERSIONS_MACCATALYST+=net9.0-18.0 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9c0d8f07d2c4..d4a2a1a92b6d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,6 +68,23 @@ https://github.com/dotnet/runtime 9bff9c5017d8444fdf76959c112dd9fed2da9317 + + + https://github.com/xamarin/xamarin-macios + 2f3ae2492519571ccf3f7280dfca232e42b5ada2 + + + https://github.com/xamarin/xamarin-macios + 2f3ae2492519571ccf3f7280dfca232e42b5ada2 + + + https://github.com/xamarin/xamarin-macios + 2f3ae2492519571ccf3f7280dfca232e42b5ada2 + + + https://github.com/xamarin/xamarin-macios + 2f3ae2492519571ccf3f7280dfca232e42b5ada2 + diff --git a/eng/Versions.props b/eng/Versions.props index e186c008dee2..760ddee27d26 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -27,5 +27,10 @@ 14.0.8523 17.0.8523 17.0.8523 + + 18.0.9606-net9-rtm + 15.0.9606-net9-rtm + 18.0.9606-net9-rtm + 18.0.9606-net9-rtm From 12e1e3308a0aa8674274df9ed0bb7fb13a0a1663 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 21:59:52 +0200 Subject: [PATCH 076/155] [devops] Make the prepare-for-remote-tests.sh script callable locally. (#21455) A dual-purpose script is always better than a single-purpose script! This also removes a dependency on 'xamarin-macios' being the repository name. --- tools/devops/automation/scripts/prepare-for-remote-tests.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/devops/automation/scripts/prepare-for-remote-tests.sh b/tools/devops/automation/scripts/prepare-for-remote-tests.sh index bf60da1366dc..f7a3aa1495aa 100755 --- a/tools/devops/automation/scripts/prepare-for-remote-tests.sh +++ b/tools/devops/automation/scripts/prepare-for-remote-tests.sh @@ -1,10 +1,12 @@ #!/bin/bash -eux +cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." + # Install the local .NET we're using into XMA's directory # (we can't point XMA to our local directory) mkdir -p ~/Library/Caches/Xamarin/XMA/SDKs -cp -cRH "$BUILD_SOURCESDIRECTORY"/xamarin-macios/builds/downloads/dotnet ~/Library/Caches/Xamarin/XMA/SDKs -sed '/local-tests-feed/d' "$BUILD_SOURCESDIRECTORY"/xamarin-macios/NuGet.config > ~/Library/Caches/Xamarin/XMA/SDKs/dotnet/NuGet.config +cp -cRH ./builds/downloads/dotnet ~/Library/Caches/Xamarin/XMA/SDKs +sed '/local-tests-feed/d' ./NuGet.config > ~/Library/Caches/Xamarin/XMA/SDKs/dotnet/NuGet.config mkdir -p ~/Library/Caches/Xamarin/XMA/SDKs/.home/.nuget/NuGet/ cp ~/Library/Caches/Xamarin/XMA/SDKs/dotnet/NuGet.config ~/Library/Caches/Xamarin/XMA/SDKs/.home/.nuget/NuGet/NuGet.Config From 0674debc746f45d87caa9e52caed7bb631a6a34f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 21:59:59 +0200 Subject: [PATCH 077/155] [devops] Clean up before and after running the Windows tests remotely. (#21454) Also collect any crash reports from the remote machine. --- tests/dotnet/Windows/collect-binlogs.sh | 12 ++++++++++++ .../automation/scripts/clean-for-remote-tests.sh | 6 ++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/dotnet/Windows/collect-binlogs.sh b/tests/dotnet/Windows/collect-binlogs.sh index 903097dbba82..7baca9a9c0d1 100755 --- a/tests/dotnet/Windows/collect-binlogs.sh +++ b/tests/dotnet/Windows/collect-binlogs.sh @@ -7,6 +7,15 @@ cd "$(dirname "${BASH_SOURCE[0]}")" TOPLEVEL="$(git rev-parse --show-toplevel)" +# Abort any agents that are still alive. +# Aborting creates a crash report, and we can investigate why they got stuck. +ps auxww || true +pkill -6 -f Broker.exe || true +pkill -6 -f Build.exe || true +pkill -6 -f Broker.dll || true +pkill -6 -f Build.dll || true +ps auxww || true + # Collect and zip up all the binlogs mkdir -p ~/remote_build_testing/binlogs rsync -avv --prune-empty-dirs --exclude 'artifacts/' --include '*/' --include '*.binlog' --exclude '*' "$TOPLEVEL/.." ~/remote_build_testing/binlogs @@ -35,6 +44,9 @@ fi ps auxww > ~/remote_build_testing/processes.txt || true +# Collect any crash reports. +zip -9r ~/remote_build_testing/windows-remote-logs.zip ~/Library/Logs/DiagnosticReports || true + ls -la ~/Library/Caches/Xamarin/XMA/SDKs/dotnet/ >> ~/remote_build_testing/dotnet-debug.txt 2>&1 || true cat ~/Library/Caches/Xamarin/XMA/SDKs/dotnet/NuGet.config >> ~/remote_build_testing/dotnet-debug.txt 2>&1 || true cat ~/Library/Caches/Xamarin/XMA/SDKs/.home/.nuget/NuGet/NuGet.Config >> ~/remote_build_testing/dotnet-debug.txt 2>&1 || true diff --git a/tools/devops/automation/scripts/clean-for-remote-tests.sh b/tools/devops/automation/scripts/clean-for-remote-tests.sh index d05b9e0ec1a2..f796367149c4 100755 --- a/tools/devops/automation/scripts/clean-for-remote-tests.sh +++ b/tools/devops/automation/scripts/clean-for-remote-tests.sh @@ -18,6 +18,8 @@ rm -rf ~/remote_build_testing # Kill any existing brokers and builders ps auxww || true -pkill -f Broker.exe || true -pkill -f Build.exe || true +pkill -6 -f Broker.exe || true +pkill -6 -f Build.exe || true +pkill -6 -f Broker.dll || true +pkill -6 -f Build.dll || true ps auxww || true From d3782b49af6be7fe1e92d78a585dccc04db61667 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 16 Oct 2024 22:00:16 +0200 Subject: [PATCH 078/155] [tests] Ignore a few tests that fail on tvOS Simulator/arm64. (#21451) Ref: https://github.com/xamarin/xamarin-macios/issues/19781 --- tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs b/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs index b2787b3199ae..6028436dfef1 100644 --- a/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs +++ b/tests/monotouch-test/ObjCRuntime/RegistrarTestGenerated.cs @@ -9,7 +9,7 @@ public partial class RegistrarTestGenerated { void AssertIfIgnored ([CallerMemberName] string testCase = null) { switch (testCase) { -#if __MACCATALYST__ || __IOS__ +#if __MACCATALYST__ || __IOS__ || __TVOS__ case "NSNumberBindAs_Boolean_Array_Overrides": case "NSNumberBindAs_Byte_Array_Overrides": case "NSNumberBindAs_Double_Array_Overrides": @@ -27,7 +27,7 @@ void AssertIfIgnored ([CallerMemberName] string testCase = null) // https://github.com/xamarin/xamarin-macios/issues/19781 #if __MACCATALYST__ if (Runtime.IsARM64CallingConvention) -#elif __IOS__ +#elif __IOS__ || __TVOS__ if (Runtime.IsARM64CallingConvention && Runtime.Arch == Arch.SIMULATOR) #endif Assert.Ignore ("https://github.com/xamarin/xamarin-macios/issues/19781"); From 6dab8ac08caf3e4c97f26d80af3a4dec13d0663c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:56:12 +0200 Subject: [PATCH 079/155] [main] Update dependencies from dotnet/arcade (#21462) This pull request updates the following dependencies ## From https://github.com/dotnet/arcade - **Subscription**: 6ddbc71e-6118-4fea-a928-58d1b2579c38 - **Build**: 20241016.2 - **Date Produced**: October 16, 2024 4:50:11 PM UTC - **Commit**: 3c393bbd85ae16ddddba20d0b75035b0c6f1a52d - **Branch**: refs/heads/release/9.0 - **Updates**: - **Microsoft.DotNet.Build.Tasks.Feed**: [from 9.0.0-beta.24509.3 to 9.0.0-beta.24516.2][1] [1]: https://github.com/dotnet/arcade/compare/05c72bb3c9...3c393bbd85 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a345502ac12f..a32796ceca9d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -70,9 +70,9 @@ - + https://github.com/dotnet/arcade - 05c72bb3c9b38138276a8029017f2ef905dcc7fa + 3c393bbd85ae16ddddba20d0b75035b0c6f1a52d https://github.com/dotnet/templating diff --git a/eng/Versions.props b/eng/Versions.props index e56d65115684..e62b82563c13 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -5,7 +5,7 @@ 9.0.100-rc.2.24475.4 9.0.0-rtm.24475.3 9.0.0-alpha.1.23556.4 - 9.0.0-beta.24509.3 + 9.0.0-beta.24516.2 8.0.0-beta.24413.2 9.0.0-rtm.24475.3 8.0.0-rtm.23511.3 From d3a9de4c3b08beb1e99f7c3ed45e07e8af6b0a95 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 17 Oct 2024 18:56:59 +0200 Subject: [PATCH 080/155] [dotnet-linker] Improve error reporting by not forgetting about original exceptions. (#21464) This way we report the stack trace of the original exception in build logs. --- tools/dotnet-linker/Steps/ConfigurationAwareStep.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/dotnet-linker/Steps/ConfigurationAwareStep.cs b/tools/dotnet-linker/Steps/ConfigurationAwareStep.cs index 1fb21c07eccf..fd8c498dcdd6 100644 --- a/tools/dotnet-linker/Steps/ConfigurationAwareStep.cs +++ b/tools/dotnet-linker/Steps/ConfigurationAwareStep.cs @@ -106,17 +106,17 @@ bool CollectProductExceptions (Exception e, [NotNullWhen (true)] out List ErrorHelper.CreateError (ErrorCode, Errors.MX_ConfigurationAwareStepWithAssembly, Name, assembly?.FullName, e.Message)); + return CollectExceptions (e, () => ErrorHelper.CreateError (ErrorCode, e, Errors.MX_ConfigurationAwareStepWithAssembly, Name, assembly?.FullName, e.Message)); } protected virtual Exception [] Fail (Exception e) { - return CollectExceptions (e, () => ErrorHelper.CreateError (ErrorCode | 1, Errors.MX_ConfigurationAwareStep, Name, e.Message)); + return CollectExceptions (e, () => ErrorHelper.CreateError (ErrorCode | 1, e, Errors.MX_ConfigurationAwareStep, Name, e.Message)); } protected virtual Exception [] FailEnd (Exception e) { - return CollectExceptions (e, () => ErrorHelper.CreateError (ErrorCode | 2, Errors.MX_ConfigurationAwareStep, Name, e.Message)); + return CollectExceptions (e, () => ErrorHelper.CreateError (ErrorCode | 2, e, Errors.MX_ConfigurationAwareStep, Name, e.Message)); } Exception [] CollectExceptions (Exception e, Func createException) From 92c9d2fe3a9ff85138685377936ca17b620b4570 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 17 Oct 2024 18:57:55 +0200 Subject: [PATCH 081/155] [dotnet] Improve documentation about the PublishFolderType metadata a bit. (#21434) Ref: https://github.com/xamarin/xamarin-macios/issues/20947 --- dotnet/BundleContents.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/dotnet/BundleContents.md b/dotnet/BundleContents.md index e9ebbc552a2e..935a7ef12247 100644 --- a/dotnet/BundleContents.md +++ b/dotnet/BundleContents.md @@ -29,6 +29,9 @@ For this purpose, we support the `PublishFolderType` metadata on items in the Below is a list of known/valid `PublishFolderType` values and the corresponding action taken for each. +> [!IMPORTANT] +See [`PublishFolderType` doesn't work from a referenced library project](#transitiveProject) for using `PublishFolderType` in library projects. + In all cases the relative directory is preserved (i.e. we don't follow the behavior in [dotnet/sdk#9643](https://github.com/dotnet/sdk/issues/9643). @@ -276,6 +279,29 @@ The easiest way is to set `PublishFolderType` to `None`: ``` + + +### `PublishFolderType` doesn't work from a referenced library project. + +The `PublishFolderType` metadata does not work in transitive / referenced +projects that aren't platform-specific. For example: if an executable project +references a `net9.0` library project, adding the `PublishFolderType` metadata +on items in the `net9.0` library project doesn't have any effect, and you'll get a warning like this: + +> Xamarin.Shared.Sdk.targets(1836,3): Warning : The file '/myresource/file.psd' does not specify a 'PublishFolderType' metadata, and a default value could not be calculated. The file will not be copied to the app bundle. + +The workaround is to set +`MSBuildDisableGetCopyToPublishDirectoryItemsOptimization=true` in the +library project: + +```xml + + true + +``` + +See https://github.com/xamarin/xamarin-macios/issues/20947 for more information. + ## References * [.NET: What to do about files in ResolvedFileToPublish](https://github.com/xamarin/xamarin-macios/issues/12572) From d283463fc6a22ab1d7848cc648f6553352cc4113 Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Mon, 21 Oct 2024 04:17:42 -0400 Subject: [PATCH 082/155] [nuget-msi-convert] Do not use new VS component IDs (#21476) Context: https://github.com/xamarin/xamarin-macios/commit/9013ae4f83a9236ac91a8fe857a2403371993534 We've decided hold off on this change until .NET 10. --------- Co-authored-by: Peter Collins --- dotnet/generate-vs-workload.csharp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/generate-vs-workload.csharp b/dotnet/generate-vs-workload.csharp index 810254d11c29..2e5044df482b 100755 --- a/dotnet/generate-vs-workload.csharp +++ b/dotnet/generate-vs-workload.csharp @@ -57,7 +57,7 @@ using (TextWriter writer = new StreamWriter (outputPath)) { var manifestBuildVersion = iOSPlatform.Any () ? iOSPlatform.First ().Item2 : platforms.First ().Item2; writer.WriteLine ($" {manifestBuildVersion}"); writer.WriteLine ($" true"); - writer.WriteLine ($" true"); + writer.WriteLine ($" false"); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); From d1845ee8fece8e48181985249f3fcc848c99e691 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 21 Oct 2024 10:30:50 +0200 Subject: [PATCH 083/155] [dotnet] Use the default .NET scheme for the default TargetPlatformVersion for library projects. (#21343) We must define the default platform version if it's not specified in the TFM, and according to the spec the default should not change for a given .NET version: * We release support for iOS 18.0 with .NET 9 * Apple releases iOS 18.1, we're still using .NET 9. This default continues to be iOS 18.0 * .NET 10 is shipped, and at this point we bump the default to iOS 19.0 Basically: this should be the last OS version of the platform in question when the current major .NET version is first released to stable. Ref: https://github.com/dotnet/designs/blob/8e6394406d44f75f30ea2259a425cb9e38d75b69/accepted/2020/net5/net5.md#os-versions However, this doesn't work well for Apple platforms: Whenever Apple releases new Xcode versions, our existing workloads might not be compatible with the new Xcode. We'll of course ship updateds workload with support for the new Xcode, but defaulting to an older target platform version would mean that developers wouldn't get the new workload, they'd get the old one. This is exacerbated by the fact that Apple aggressively auto-updates Xcode on developers' machines: they might wake up one day to a broken build - the obvious fix ("dotnet workload update") doesn't fix anything - even if we've shipped updated workloads - because the default is to use the old one. They'd have to manually specify the target platform version in the target platform to get the updated workload ("net8.0-ios17.2" to use the iOS 17.2 workload instead of "net8.0-ios", which would use the default (old/initial/17.0) .NET 8 workload) - and then update _again_ when the next Xcode comes around. At this point the point of having a sane default value is totally out the window, because everybody would have to specify (and continuously update) a platform version in their project files to keep their projects building. So we've made the decision that the default target platform version is always the latest supported target platform version. Given the previous example: once we've implemented and released support for iOS 18.1, the updated iOS workload will use 18.1 as the default TPV for iOS. On the other hand, this turns out to be somewhat of a complication for library developers, because they typically don't need Xcode to build their projects, and if we auto-update their TargetPlatformVersion to the latest, then all their customers have to also update their workloads, which for some people end up being a rather nasty surprise (because with the above algorithm it happens without developer action). Thus we follow .NET's default platform version scheme for library projects: it won't change in minor .NET releases. Related design/docs PRs: * https://github.com/dotnet/docs/pull/43089 * https://github.com/dotnet/designs/pull/324 --- Make.versions | 13 +++++ dotnet/Makefile | 3 +- .../Microsoft.Sdk.Versions.template.props | 3 +- ....Shared.Sdk.TargetFrameworkInference.props | 3 +- .../UnitTests/ApplePlatformExtensions.cs | 51 ++++++++++++++++--- tests/dotnet/UnitTests/MlaunchTest.cs | 2 +- tests/dotnet/UnitTests/PackTest.cs | 22 ++++---- tests/dotnet/UnitTests/XcodeProjectTests.cs | 5 +- tools/common/Make.common | 13 +++-- tools/common/SdkVersions.cs | 13 +++-- tools/common/SdkVersions.in.cs | 13 +++-- 11 files changed, 106 insertions(+), 35 deletions(-) diff --git a/Make.versions b/Make.versions index 7182fdd9abc8..701e10189530 100644 --- a/Make.versions +++ b/Make.versions @@ -71,6 +71,12 @@ WATCHOS_NUGET_OS_VERSION=11.0 MACOS_NUGET_OS_VERSION=15.0 MACCATALYST_NUGET_OS_VERSION=18.0 +# The following are the OS versions we first supported with the current .NET version. +# These versions must *not* change with minor .NET updates, only major .NET releases. +IOS_TARGET_PLATFORM_VERSION_LIBRARY=18.0 +TVOS_TARGET_PLATFORM_VERSION_LIBRARY=18.0 +MACOS_TARGET_PLATFORM_VERSION_LIBRARY=15.0 +MACCATALYST_TARGET_PLATFORM_VERSION_LIBRARY=18.0 # In theory we should define the default platform version if it's not specified in the TFM. The default should not change for a given .NET version: # * We release support for iOS 14.5 with .NET 6 @@ -100,6 +106,13 @@ MACCATALYST_NUGET_OS_VERSION=18.0 # So we've made the decision that the default target platform version is # always the latest target platform version. +# However, this turns out to be somewhat of a complication for library developers, +# because they typically don't need Xcode to build their projects, and if we auto- +# update their TargetPlatformVersion to the latest, then all their customers +# have to also update their workloads, which for some people end up being a rather +# nasty surprise (because with the above algorithm it happens without developer +# action). Thus we follow .NET's default platform version scheme for library projects: +# it won't change in minor .NET releases. # # Here we list all the releases we support for each platform. diff --git a/dotnet/Makefile b/dotnet/Makefile index a67f5289fe37..25fb75ee8e1a 100644 --- a/dotnet/Makefile +++ b/dotnet/Makefile @@ -119,7 +119,8 @@ targets/Microsoft.$(1).Sdk.Versions.props: targets/Microsoft.Sdk.Versions.templa -e "s/@PLATFORM@/$(1)/g" \ -e "s/@NUGET_VERSION_NO_METADATA@/$$($(2)_NUGET_VERSION_NO_METADATA)/g" \ -e "s/@NUGET_VERSION_FULL@/$$($(2)_NUGET_VERSION_FULL)/g" \ - -e "s/@TARGET_PLATFORM_VERSION@/$$($(2)_NUGET_OS_VERSION)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_EXE@/$$($(2)_NUGET_OS_VERSION)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_LIBRARY@/$$($(2)_TARGET_PLATFORM_VERSION_LIBRARY)/g" \ -e "s/@CURRENT_BRANCH@/$$(CURRENT_BRANCH_SED_ESCAPED)/g" \ -e "s/@CURRENT_HASH_LONG@/$$(CURRENT_HASH_LONG)/g" \ -e 's*@VALID_RUNTIME_IDENTIFIERS@*$(foreach rid,$(3),\n\t\t<_XamarinValidRuntimeIdentifier Include="$(rid)" Platform="$(1)" />)*' \ diff --git a/dotnet/targets/Microsoft.Sdk.Versions.template.props b/dotnet/targets/Microsoft.Sdk.Versions.template.props index d77b1f8d68c0..500353a521ae 100644 --- a/dotnet/targets/Microsoft.Sdk.Versions.template.props +++ b/dotnet/targets/Microsoft.Sdk.Versions.template.props @@ -6,7 +6,8 @@ <_ShortPackageVersion>@NUGET_VERSION_NO_METADATA@ <_PackageVersion>@NUGET_VERSION_FULL@ - <_XamarinTargetPlatformVersion>@TARGET_PLATFORM_VERSION@ + <_XamarinTargetPlatformVersionExecutable>@TARGET_PLATFORM_VERSION_EXE@ + <_XamarinTargetPlatformVersionLibrary>@TARGET_PLATFORM_VERSION_LIBRARY@ <_XamarinIsPreviewRelease>@XCODE_IS_PREVIEW@ <_XamarinDotNetVersion>@DOTNET_TFM@ <_XamarinPackSuffix>@DOTNET_TFM@_@NUGET_OS_VERSION@ diff --git a/dotnet/targets/Xamarin.Shared.Sdk.TargetFrameworkInference.props b/dotnet/targets/Xamarin.Shared.Sdk.TargetFrameworkInference.props index 0f585a4db207..3e082daf79fc 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.TargetFrameworkInference.props +++ b/dotnet/targets/Xamarin.Shared.Sdk.TargetFrameworkInference.props @@ -12,6 +12,7 @@ - $(_XamarinTargetPlatformVersion) + $(_XamarinTargetPlatformVersionExecutable) + $(_XamarinTargetPlatformVersionLibrary) diff --git a/tests/dotnet/UnitTests/ApplePlatformExtensions.cs b/tests/dotnet/UnitTests/ApplePlatformExtensions.cs index b24e66995275..48b6a6ad9707 100644 --- a/tests/dotnet/UnitTests/ApplePlatformExtensions.cs +++ b/tests/dotnet/UnitTests/ApplePlatformExtensions.cs @@ -2,10 +2,10 @@ namespace Xamarin.Utils { public static class ApplePlatformExtensionsWithVersions { - public static string ToFrameworkWithPlatformVersion (this ApplePlatform @this) + public static string ToFrameworkWithPlatformVersion (this ApplePlatform @this, bool isExecutable /* and not library */) { var netVersion = Configuration.DotNetTfm; - var targetPlatformVersion = GetTargetPlatformVersion (@this); + var targetPlatformVersion = isExecutable ? GetDefaultTargetPlatformVersionExecutable (@this) : GetDefaultTargetPlatformVersionLibrary (@this); switch (@this) { case ApplePlatform.iOS: return netVersion + "-ios" + targetPlatformVersion; @@ -20,16 +20,53 @@ public static string ToFrameworkWithPlatformVersion (this ApplePlatform @this) } } - public static string GetTargetPlatformVersion (this ApplePlatform @this) + public static string GetDefaultTargetPlatformVersionExecutable (this ApplePlatform @this) { switch (@this) { - case ApplePlatform.iOS: return SdkVersions.TargetPlatformVersioniOS; - case ApplePlatform.TVOS: return SdkVersions.TargetPlatformVersiontvOS; - case ApplePlatform.MacOSX: return SdkVersions.TargetPlatformVersionmacOS; - case ApplePlatform.MacCatalyst: return SdkVersions.TargetPlatformVersionMacCatalyst; + case ApplePlatform.iOS: return SdkVersions.TargetPlatformVersionExecutableiOS; + case ApplePlatform.TVOS: return SdkVersions.TargetPlatformVersionExecutabletvOS; + case ApplePlatform.MacOSX: return SdkVersions.TargetPlatformVersionExecutablemacOS; + case ApplePlatform.MacCatalyst: return SdkVersions.TargetPlatformVersionExecutableMacCatalyst; default: return "Unknown"; } } + + public static string GetDefaultTargetPlatformVersionLibrary (this ApplePlatform @this) + { + switch (@this) { + case ApplePlatform.iOS: return SdkVersions.TargetPlatformVersionLibraryiOS; + case ApplePlatform.TVOS: return SdkVersions.TargetPlatformVersionLibrarytvOS; + case ApplePlatform.MacOSX: return SdkVersions.TargetPlatformVersionLibrarymacOS; + case ApplePlatform.MacCatalyst: return SdkVersions.TargetPlatformVersionLibraryMacCatalyst; + default: + return "Unknown"; + } + } + } + + [TestFixture] + public class TargetFrameworkTest { + [TestCase (ApplePlatform.iOS)] + [TestCase (ApplePlatform.MacCatalyst)] + [TestCase (ApplePlatform.TVOS)] + [TestCase (ApplePlatform.MacOSX)] + public void DefaultLibraryTargetPlatformVersion (ApplePlatform platform) + { + // We might have to change the assert if the first minor OS version we release for a given .NET version is >0 (this happened for both .NET 7 and .NET 8). + Assert.That (platform.GetDefaultTargetPlatformVersionLibrary (), Does.EndWith (".0"), "Default TPV for a library must end with .0"); + } + + [TestCase (ApplePlatform.iOS)] + [TestCase (ApplePlatform.MacCatalyst)] + [TestCase (ApplePlatform.TVOS)] + [TestCase (ApplePlatform.MacOSX)] + public void MajorTargetPlatformVersion (ApplePlatform platform) + { + var vLibrary = Version.Parse (platform.GetDefaultTargetPlatformVersionLibrary ()); + var vExecutable = Version.Parse (platform.GetDefaultTargetPlatformVersionExecutable ()); + // We might have to change the assert if we release support for a new major OS version within a .NET releases (this happened for .NET 8) + Assert.AreEqual (vExecutable.Major, vLibrary.Major, "The major version must be the same between the default TPV for library and executable projects."); + } } } diff --git a/tests/dotnet/UnitTests/MlaunchTest.cs b/tests/dotnet/UnitTests/MlaunchTest.cs index 76823f08da19..e4a369159473 100644 --- a/tests/dotnet/UnitTests/MlaunchTest.cs +++ b/tests/dotnet/UnitTests/MlaunchTest.cs @@ -90,7 +90,7 @@ public void GetMlaunchRunArguments (ApplePlatform platform, string runtimeIdenti expectedArguments.Append (appPath.Substring (Path.GetDirectoryName (project_path)!.Length + 1)).Append ('/'); if (isSim) { expectedArguments.Append (" --device \""); - expectedArguments.Append (device.Replace ("%TPV%", platform.GetTargetPlatformVersion ().Replace ('.', '-'))); + expectedArguments.Append (device); expectedArguments.Append ('"'); } expectedArguments.Append ($" --wait-for-exit:true"); diff --git a/tests/dotnet/UnitTests/PackTest.cs b/tests/dotnet/UnitTests/PackTest.cs index d6d02b4e69a7..59da47dc18f4 100644 --- a/tests/dotnet/UnitTests/PackTest.cs +++ b/tests/dotnet/UnitTests/PackTest.cs @@ -62,6 +62,7 @@ public void BindingFrameworksProject (ApplePlatform platform, bool noBindingEmbe var archive = ZipFile.OpenRead (nupkg); var files = archive.Entries.Select (v => v.FullName).ToHashSet (); + var tfm = platform.ToFrameworkWithPlatformVersion (isExecutable: false); var hasSymlinks = noBindingEmbedding && (platform == ApplePlatform.MacCatalyst || platform == ApplePlatform.MacOSX); if (noBindingEmbedding) { Assert.That (archive.Entries.Count, Is.EqualTo (hasSymlinks ? 6 : 10), $"nupkg file count - {nupkg}"); @@ -71,17 +72,17 @@ public void BindingFrameworksProject (ApplePlatform platform, bool noBindingEmbe Assert.That (files, Does.Contain (project + ".nuspec"), "nuspec"); Assert.That (files, Does.Contain ("_rels/.rels"), ".rels"); Assert.That (files, Does.Contain ("[Content_Types].xml"), "[Content_Types].xml"); - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.dll"), $"{project}.dll"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.dll"), $"{project}.dll"); Assert.That (files, Has.Some.Matches (v => v.StartsWith ("package/services/metadata/core-properties/", StringComparison.Ordinal) && v.EndsWith (".psmdcp", StringComparison.Ordinal)), "psmdcp"); if (noBindingEmbedding) { if (hasSymlinks) { - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources.zip"), $"{project}.resources.zip"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources.zip"), $"{project}.resources.zip"); } else { - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XStaticArTest.framework/XStaticArTest"), $"XStaticArTest.framework/XStaticArTest"); - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XStaticObjectTest.framework/XStaticObjectTest"), $"XStaticObjectTest.framework/XStaticObjectTest"); - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XTest.framework/XTest"), $"XTest.framework/XTest"); - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XTest.framework/Info.plist"), $"XTest.framework/Info.plist"); - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/manifest"), $"manifest"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XStaticArTest.framework/XStaticArTest"), $"XStaticArTest.framework/XStaticArTest"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XStaticObjectTest.framework/XStaticObjectTest"), $"XStaticObjectTest.framework/XStaticObjectTest"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XTest.framework/XTest"), $"XTest.framework/XTest"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XTest.framework/Info.plist"), $"XTest.framework/Info.plist"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/manifest"), $"manifest"); } } } @@ -127,14 +128,15 @@ public void BindingXcFrameworksProject (ApplePlatform platform, bool noBindingEm var archive = ZipFile.OpenRead (nupkg); var files = archive.Entries.Select (v => v.FullName).ToHashSet (); + var tfm = platform.ToFrameworkWithPlatformVersion (isExecutable: false); Assert.That (archive.Entries.Count, Is.EqualTo (noBindingEmbedding ? 6 : 5), $"nupkg file count - {nupkg}"); Assert.That (files, Does.Contain (assemblyName + ".nuspec"), "nuspec"); Assert.That (files, Does.Contain ("_rels/.rels"), ".rels"); Assert.That (files, Does.Contain ("[Content_Types].xml"), "[Content_Types].xml"); - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{assemblyName}.dll"), $"{assemblyName}.dll"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.dll"), $"{assemblyName}.dll"); Assert.That (files, Has.Some.Matches (v => v.StartsWith ("package/services/metadata/core-properties/", StringComparison.Ordinal) && v.EndsWith (".psmdcp", StringComparison.Ordinal)), "psmdcp"); if (noBindingEmbedding) { - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{assemblyName}.resources.zip"), $"{assemblyName}.resources.zip"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.resources.zip"), $"{assemblyName}.resources.zip"); } } @@ -164,7 +166,7 @@ public void LibraryProject (ApplePlatform platform) Assert.That (files, Does.Contain (project + ".nuspec"), "nuspec"); Assert.That (files, Does.Contain ("_rels/.rels"), ".rels"); Assert.That (files, Does.Contain ("[Content_Types].xml"), "[Content_Types].xml"); - Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.dll"), $"{project}.dll"); + Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion (isExecutable: false)}/{project}.dll"), $"{project}.dll"); Assert.That (files, Has.Some.Matches (v => v.StartsWith ("package/services/metadata/core-properties/", StringComparison.Ordinal) && v.EndsWith (".psmdcp", StringComparison.Ordinal)), "psmdcp"); } diff --git a/tests/dotnet/UnitTests/XcodeProjectTests.cs b/tests/dotnet/UnitTests/XcodeProjectTests.cs index 30a7485df8d8..a3a7362f34e5 100644 --- a/tests/dotnet/UnitTests/XcodeProjectTests.cs +++ b/tests/dotnet/UnitTests/XcodeProjectTests.cs @@ -179,9 +179,10 @@ public void PackBinding (ApplePlatform platform) Assert.That (expectedNupkgOutput, Does.Exist, $"Expected pack output '{expectedNupkgOutput}' did not exist."); List zipContent = ZipHelpers.List (expectedNupkgOutput); - var expectedFxPath = $"lib/{platform.ToFrameworkWithPlatformVersion ()}/{TestName}.resources/{xcodeProjName}{platform.AsString ()}.xcframework/Info.plist"; + var tfm = platform.ToFrameworkWithPlatformVersion (isExecutable: false); + var expectedFxPath = $"lib/{tfm}/{TestName}.resources/{xcodeProjName}{platform.AsString ()}.xcframework/Info.plist"; if (platform == ApplePlatform.MacOSX || platform == ApplePlatform.MacCatalyst) { - zipContent = ZipHelpers.ListInnerZip (expectedNupkgOutput, $"lib/{platform.ToFrameworkWithPlatformVersion ()}/{TestName}.resources.zip"); + zipContent = ZipHelpers.ListInnerZip (expectedNupkgOutput, $"lib/{tfm}/{TestName}.resources.zip"); expectedFxPath = $"{xcodeProjName}{platform.AsString ()}.xcframework/Info.plist"; } Assert.Contains (expectedFxPath, zipContent, $"Expected xcframework output was not found in '{expectedNupkgOutput}'."); diff --git a/tools/common/Make.common b/tools/common/Make.common index 530d21d7e4cd..0a68d8fc8221 100644 --- a/tools/common/Make.common +++ b/tools/common/Make.common @@ -50,10 +50,15 @@ $(abspath ../common/SdkVersions.cs): ../common/SdkVersions.in.cs Makefile $(TOP) -e "s/@MACOS_NUGET_VERSION@/$(MACOS_NUGET_VERSION)/g" \ -e "s/@MACOS_NUGET_REVISION@/$(NUGET_PRERELEASE_IDENTIFIER)$(MACOS_NUGET_COMMIT_DISTANCE)$(NUGET_BUILD_METADATA)/g" \ \ - -e "s/@TARGET_PLATFORM_VERSION_IOS@/$(IOS_NUGET_OS_VERSION)/g" \ - -e "s/@TARGET_PLATFORM_VERSION_TVOS@/$(TVOS_NUGET_OS_VERSION)/g" \ - -e "s/@TARGET_PLATFORM_VERSION_MACOS@/$(MACOS_NUGET_OS_VERSION)/g" \ - -e "s/@TARGET_PLATFORM_VERSION_MACCATALYST@/$(MACCATALYST_NUGET_OS_VERSION)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_IOS@/$(IOS_NUGET_OS_VERSION)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_TVOS@/$(TVOS_NUGET_OS_VERSION)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_MACOS@/$(MACOS_NUGET_OS_VERSION)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_MACCATALYST@/$(MACCATALYST_NUGET_OS_VERSION)/g" \ + \ + -e "s/@TARGET_PLATFORM_VERSION_LIBRARY_IOS@/$(IOS_TARGET_PLATFORM_VERSION_LIBRARY)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_LIBRARY_TVOS@/$(TVOS_TARGET_PLATFORM_VERSION_LIBRARY)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_LIBRARY_MACOS@/$(MACOS_TARGET_PLATFORM_VERSION_LIBRARY)/g" \ + -e "s/@TARGET_PLATFORM_VERSION_LIBRARY_MACCATALYST@/$(MACCATALYST_TARGET_PLATFORM_VERSION_LIBRARY)/g" \ \ -e "s/@PRODUCT_HASH@/$(CURRENT_HASH_LONG)/g" \ \ diff --git a/tools/common/SdkVersions.cs b/tools/common/SdkVersions.cs index 1413ffbded8b..fdddeec68821 100644 --- a/tools/common/SdkVersions.cs +++ b/tools/common/SdkVersions.cs @@ -57,10 +57,15 @@ static class SdkVersions { public const string MaxWatchDeploymentTarget = "11.0"; public const string MaxTVOSDeploymentTarget = "18.0"; - public const string TargetPlatformVersioniOS = "18.0"; - public const string TargetPlatformVersiontvOS = "18.0"; - public const string TargetPlatformVersionmacOS = "15.0"; - public const string TargetPlatformVersionMacCatalyst = "18.0"; + public const string TargetPlatformVersionExecutableiOS = "18.0"; + public const string TargetPlatformVersionExecutabletvOS = "18.0"; + public const string TargetPlatformVersionExecutablemacOS = "15.0"; + public const string TargetPlatformVersionExecutableMacCatalyst = "18.0"; + + public const string TargetPlatformVersionLibraryiOS = "18.0"; + public const string TargetPlatformVersionLibrarytvOS = "18.0"; + public const string TargetPlatformVersionLibrarymacOS = "15.0"; + public const string TargetPlatformVersionLibraryMacCatalyst = "18.0"; public static Version OSXVersion { get { return new Version (OSX); } } public static Version iOSVersion { get { return new Version (iOS); } } diff --git a/tools/common/SdkVersions.in.cs b/tools/common/SdkVersions.in.cs index 78d07d826860..77761f44bc53 100644 --- a/tools/common/SdkVersions.in.cs +++ b/tools/common/SdkVersions.in.cs @@ -57,10 +57,15 @@ static class SdkVersions { public const string MaxWatchDeploymentTarget = "@MAX_WATCH_DEPLOYMENT_TARGET@"; public const string MaxTVOSDeploymentTarget = "@MAX_TVOS_DEPLOYMENT_TARGET@"; - public const string TargetPlatformVersioniOS = "@TARGET_PLATFORM_VERSION_IOS@"; - public const string TargetPlatformVersiontvOS = "@TARGET_PLATFORM_VERSION_TVOS@"; - public const string TargetPlatformVersionmacOS = "@TARGET_PLATFORM_VERSION_MACOS@"; - public const string TargetPlatformVersionMacCatalyst = "@TARGET_PLATFORM_VERSION_MACCATALYST@"; + public const string TargetPlatformVersionExecutableiOS = "@TARGET_PLATFORM_VERSION_EXECUTABLE_IOS@"; + public const string TargetPlatformVersionExecutabletvOS = "@TARGET_PLATFORM_VERSION_EXECUTABLE_TVOS@"; + public const string TargetPlatformVersionExecutablemacOS = "@TARGET_PLATFORM_VERSION_EXECUTABLE_MACOS@"; + public const string TargetPlatformVersionExecutableMacCatalyst = "@TARGET_PLATFORM_VERSION_EXECUTABLE_MACCATALYST@"; + + public const string TargetPlatformVersionLibraryiOS = "@TARGET_PLATFORM_VERSION_LIBRARY_IOS@"; + public const string TargetPlatformVersionLibrarytvOS = "@TARGET_PLATFORM_VERSION_LIBRARY_TVOS@"; + public const string TargetPlatformVersionLibrarymacOS = "@TARGET_PLATFORM_VERSION_LIBRARY_MACOS@"; + public const string TargetPlatformVersionLibraryMacCatalyst = "@TARGET_PLATFORM_VERSION_LIBRARY_MACCATALYST@"; public static Version OSXVersion { get { return new Version (OSX); } } public static Version iOSVersion { get { return new Version (iOS); } } From c8300a15021bad46e0a48fd6fa9d169cb2c6dc31 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 21 Oct 2024 10:36:51 +0200 Subject: [PATCH 084/155] [tests] Simplify/unify code to build test NuGets. (#21472) Also avoid the 'nuget' binary, which requires Mono. --- .../Makefile | 28 +---------------- .../Makefile | 28 +---------------- .../Makefile | 31 +------------------ tests/test-libraries/nugets/shared.mk | 29 +++++++++++++++++ 4 files changed, 32 insertions(+), 84 deletions(-) create mode 100644 tests/test-libraries/nugets/shared.mk diff --git a/tests/test-libraries/nugets/DynamicLibrariesInRuntimesNativeDirectory/Makefile b/tests/test-libraries/nugets/DynamicLibrariesInRuntimesNativeDirectory/Makefile index 67d7001b137b..1b91461712d3 100644 --- a/tests/test-libraries/nugets/DynamicLibrariesInRuntimesNativeDirectory/Makefile +++ b/tests/test-libraries/nugets/DynamicLibrariesInRuntimesNativeDirectory/Makefile @@ -1,29 +1,3 @@ -TOP=../../../.. -include $(TOP)/Make.config - -unexport MSBUILD_EXE_PATH - -.libs: - $(Q) mkdir -p $@ - -PACKAGE_ID=$(shell grep PackageId DynamicLibrariesInRuntimesNativeDirectory.csproj | sed 's_.*\(.*\).*_\1_') -PACKAGE_VERSION=$(shell grep '' DynamicLibrariesInRuntimesNativeDirectory.csproj | sed 's_.*\(.*\).*_\1_') - # Test case for dynamic libraries -.libs/DynamicLibrariesInRuntimesNativeDirectory.nupkg: export DOTNET_PLATFORMS:=$(shell echo $(DOTNET_PLATFORMS) | tr ' ' ';') -.libs/DynamicLibrariesInRuntimesNativeDirectory.nupkg: DynamicLibrariesInRuntimesNativeDirectory.csproj $(wildcard *.cs) | .libs - $(Q) mkdir -p $(abspath $(NUGET_TEST_FEED)) - $(Q_GEN) $(DOTNET) pack /bl $(DOTNET_PACK_VERBOSITY) $< - $(Q) $(CP) bin/Release/Xamarin.Tests.DynamicLibrariesInRuntimesNativeDirectory.$(PACKAGE_VERSION).nupkg $@ - -INSTALLED_PACKAGE=$(NUGET_TEST_FEED)/xamarin.tests.DynamicLibrariesInRuntimesNativeDirectory/$(PACKAGE_VERSION)/xamarin.tests.DynamicLibrariesInRuntimesNativeDirectory.$(PACKAGE_VERSION).nupkg - -$(INSTALLED_PACKAGE): .libs/DynamicLibrariesInRuntimesNativeDirectory.nupkg - if test -d $(NUGET_TEST_FEED)/$(PACKAGE_ID)/$(PACKAGE_VERSION); then nuget delete $(PACKAGE_ID) $(PACKAGE_VERSION) -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive || true; fi - rm -Rf $(TOP)/tests/dotnet/packages/xamarin.tests.DynamicLibrariesInRuntimesNativeDirectory - mkdir -p $(abspath $(NUGET_TEST_FEED)) - nuget add "$<" -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive -ifdef ENABLE_DOTNET -all-local:: $(INSTALLED_PACKAGE) -endif +include ../shared.mk diff --git a/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Makefile b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Makefile index f39b801533bf..88f00a8889ff 100644 --- a/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Makefile +++ b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Makefile @@ -1,29 +1,3 @@ -TOP=../../../.. -include $(TOP)/Make.config - -unexport MSBUILD_EXE_PATH - -.libs: - $(Q) mkdir -p $@ - -PACKAGE_ID=$(shell grep PackageId FrameworksInRuntimesNativeDirectory.csproj | sed 's_.*\(.*\).*_\1_') -PACKAGE_VERSION=$(shell grep '' FrameworksInRuntimesNativeDirectory.csproj | sed 's_.*\(.*\).*_\1_') - # Test case for https://github.com/xamarin/xamarin-macios/issues/12440 -.libs/FrameworksInRuntimesNativeDirectory.nupkg: export DOTNET_PLATFORMS:=$(shell echo $(DOTNET_PLATFORMS) | tr ' ' ';') -.libs/FrameworksInRuntimesNativeDirectory.nupkg: FrameworksInRuntimesNativeDirectory.csproj $(wildcard *.cs) | .libs - $(Q) mkdir -p $(abspath $(NUGET_TEST_FEED)) - $(Q_GEN) $(DOTNET) pack /bl $(DOTNET_PACK_VERBOSITY) $< - $(Q) $(CP) bin/Release/Xamarin.Tests.FrameworksInRuntimesNativeDirectory.$(PACKAGE_VERSION).nupkg $@ - -INSTALLED_PACKAGE=$(NUGET_TEST_FEED)/xamarin.tests.frameworksinruntimesnativedirectory/$(PACKAGE_VERSION)/xamarin.tests.frameworksinruntimesnativedirectory.$(PACKAGE_VERSION).nupkg - -$(INSTALLED_PACKAGE): .libs/FrameworksInRuntimesNativeDirectory.nupkg - if test -d $(NUGET_TEST_FEED)/$(PACKAGE_ID)/$(PACKAGE_VERSION); then nuget delete $(PACKAGE_ID) $(PACKAGE_VERSION) -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive || true; fi - rm -Rf $(TOP)/tests/dotnet/packages/xamarin.tests.frameworksinruntimesnativedirectory - mkdir -p $(abspath $(NUGET_TEST_FEED)) - nuget add "$<" -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive -ifdef ENABLE_DOTNET -all-local:: $(INSTALLED_PACKAGE) -endif +include ../shared.mk diff --git a/tests/test-libraries/nugets/XCFrameworkWithStaticLibraryInRuntimesNativeDirectory/Makefile b/tests/test-libraries/nugets/XCFrameworkWithStaticLibraryInRuntimesNativeDirectory/Makefile index 351978a16fed..88f00a8889ff 100644 --- a/tests/test-libraries/nugets/XCFrameworkWithStaticLibraryInRuntimesNativeDirectory/Makefile +++ b/tests/test-libraries/nugets/XCFrameworkWithStaticLibraryInRuntimesNativeDirectory/Makefile @@ -1,32 +1,3 @@ -TOP=../../../.. -include $(TOP)/Make.config - -unexport MSBUILD_EXE_PATH - -NAME=XCFrameworkWithStaticLibraryInRuntimesNativeDirectory -LOWERCASED_NAME:=$(shell echo $(NAME) | tr 'A-Z' 'a-z') - -.libs: - $(Q) mkdir -p $@ - -PACKAGE_ID=$(shell grep PackageId $(NAME).csproj | sed 's_.*\(.*\).*_\1_') -PACKAGE_VERSION=$(shell grep '' $(NAME).csproj | sed 's_.*\(.*\).*_\1_') - # Test case for https://github.com/xamarin/xamarin-macios/issues/12440 -.libs/$(NAME).nupkg: export DOTNET_PLATFORMS:=$(shell echo $(DOTNET_PLATFORMS) | tr ' ' ';') -.libs/$(NAME).nupkg: $(NAME).csproj $(wildcard *.cs) | .libs - $(Q) mkdir -p $(abspath $(NUGET_TEST_FEED)) - $(Q_GEN) $(DOTNET) pack /bl $(DOTNET_PACK_VERBOSITY) $< - $(Q) $(CP) bin/Release/Xamarin.Tests.$(NAME).$(PACKAGE_VERSION).nupkg $@ - -INSTALLED_PACKAGE=$(NUGET_TEST_FEED)/xamarin.tests.$(LOWERCASED_NAME)/$(PACKAGE_VERSION)/xamarin.tests.$(LOWERCASED_NAME).$(PACKAGE_VERSION).nupkg - -$(INSTALLED_PACKAGE): .libs/$(NAME).nupkg - if test -d $(NUGET_TEST_FEED)/$(PACKAGE_ID)/$(PACKAGE_VERSION); then nuget delete $(PACKAGE_ID) $(PACKAGE_VERSION) -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive || true; fi - rm -Rf $(TOP)/tests/dotnet/packages/xamarin.tests.$(LOWERCASED_NAME) - mkdir -p $(abspath $(NUGET_TEST_FEED)) - nuget add "$<" -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive -ifdef ENABLE_DOTNET -all-local:: $(INSTALLED_PACKAGE) -endif +include ../shared.mk diff --git a/tests/test-libraries/nugets/shared.mk b/tests/test-libraries/nugets/shared.mk new file mode 100644 index 000000000000..f94d95731a80 --- /dev/null +++ b/tests/test-libraries/nugets/shared.mk @@ -0,0 +1,29 @@ +TOP=../../../.. +include $(TOP)/Make.config + +unexport MSBUILD_EXE_PATH + +NAME=$(shell basename "$(CURDIR)") +LOWERCASED_NAME:=$(shell echo $(NAME) | tr 'A-Z' 'a-z') + +.libs: + $(Q) mkdir -p $@ + +PACKAGE_ID=$(shell grep PackageId $(NAME).csproj | sed 's_.*\(.*\).*_\1_') +PACKAGE_VERSION=$(shell grep '' $(NAME).csproj | sed 's_.*\(.*\).*_\1_') +NUPKG_PATH=bin/Release/$(PACKAGE_ID).$(PACKAGE_VERSION).nupkg + +# Test case for dynamic libraries +$(NUPKG_PATH): export DOTNET_PLATFORMS:=$(shell echo $(DOTNET_PLATFORMS) | tr ' ' ';') +$(NUPKG_PATH): $(NAME).csproj $(wildcard *.cs) | .libs + $(Q) rm -f $(NUPKG_PATH) + $(Q) mkdir -p $(abspath $(NUGET_TEST_FEED)) + $(Q_GEN) $(DOTNET) pack /bl $(DOTNET_PACK_VERBOSITY) $< + +INSTALLED_PACKAGE=$(NUGET_TEST_FEED)/$(PACKAGE_ID).$(PACKAGE_VERSION).nupkg + +$(INSTALLED_PACKAGE): $(NUPKG_PATH) + rm -rf $(NUGET_TEST_FEED)/$(PACKAGE_ID).*.nupkg + $(CP) $< $@ + +all-local:: $(INSTALLED_PACKAGE) From a53cb25dcf198050203e22b8dd6db5c00f6ecde0 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 21 Oct 2024 19:26:59 +0200 Subject: [PATCH 085/155] [tests] Don't build in parallel when packaging macOS tests, it pretty much fails all the time. (#21473) --- tests/package-mac-tests.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/package-mac-tests.sh b/tests/package-mac-tests.sh index f4d3ba4c335a..cd18deddd677 100755 --- a/tests/package-mac-tests.sh +++ b/tests/package-mac-tests.sh @@ -44,11 +44,6 @@ TEST_SUITES+=(build-linkall) TEST_SUITES+=(build-introspection) TEST_SUITES+=(build-monotouch-test) -# Don't build in parallel in CI, it fails randomly due to trying to write to the same files. -if test -z "$BUILD_REVISION"; then - MAKE_FLAGS=-j -fi - make -f packaged-macos-tests.mk "${TEST_SUITES[@]}" $MAKE_FLAGS for app in linker/*/*/dotnet/*/bin/*/*/*/*.app */dotnet/*/bin/*/*/*/*.app; do From 825e0d3cf5ca003b5ca888240809852c29f84e7b Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 07:59:06 +0200 Subject: [PATCH 086/155] [runtime] Make the Swift code a bit nicer. (#21452) --- runtime/swift-functions.swift | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/runtime/swift-functions.swift b/runtime/swift-functions.swift index 1f826a771560..5b3ba250f508 100644 --- a/runtime/swift-functions.swift +++ b/runtime/swift-functions.swift @@ -1,27 +1,27 @@ -#if os(macOS) +#if canImport(AppKit) import AppKit #endif import Foundation import StoreKit -#if !os(macOS) +#if canImport(UIKit) import UIKit #endif -@objc(XamarinSwiftFunctions) -public class XamarinSwiftFunctions : NSObject { #if os(macOS) - @MainActor - @objc(requestReview:) - @available(macOS 13, *) - public static func StoreKit_RequestReview(scene: NSViewController) - { - AppStore.requestReview(in: scene) - } +public typealias PlatformScene = NSViewController #elseif !os(tvOS) +@available(iOS 13, macCatalyst 13.1, *) +public typealias PlatformScene = UIWindowScene +#endif + + +@objc(XamarinSwiftFunctions) +public class XamarinSwiftFunctions : NSObject { +#if !os(tvOS) @MainActor @objc(requestReview:) - @available(iOS 16, macCatalyst 16, *) - public static func StoreKit_RequestReview(scene: UIWindowScene) + @available(iOS 16, macCatalyst 16, macOS 13, *) + public static func StoreKit_RequestReview(scene: PlatformScene) { AppStore.requestReview(in: scene) } From 59f9e26650e4675e55c1a57f172876e8a6a98e22 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 07:59:28 +0200 Subject: [PATCH 087/155] [msbuild] Use ilrepack to sign instead of sn. (#21470) This avoids a Mono dependency (the `sn` tool is installed with Mono). --- msbuild/ILMerge.targets | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/msbuild/ILMerge.targets b/msbuild/ILMerge.targets index 6f8f1548033d..47b66b86d1f6 100644 --- a/msbuild/ILMerge.targets +++ b/msbuild/ILMerge.targets @@ -78,7 +78,7 @@ $([System.IO.Path]::GetFullPath($([System.IO.Path]::Combine('$(MSBuildProjectDirectory)','$(AssemblyOriginatorKeyFile)')))) - /keyfile:"$(AbsoluteAssemblyOriginatorKeyFile)" /delaysign + /keyfile:"$(AbsoluteAssemblyOriginatorKeyFile)" $(ILRepackArgs) /union $(ILRepackArgs) @(LibDir -> '/lib:"%(Identity)."', ' ') $(ILRepackArgs) /out:"@(IntermediateAssembly -> '%(FullPath)')" @@ -93,8 +93,6 @@ - - From 591c9b763bc0705d601f9326427c9a90f9341458 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 07:59:52 +0200 Subject: [PATCH 088/155] [msbuild] Make MessagingVersion overridable from the environment. (#21457) This makes it easier to consume a locally built version of Xamarin.Messaging when build and testing locally. --- msbuild/Directory.Build.props | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/msbuild/Directory.Build.props b/msbuild/Directory.Build.props index 11a037ed2134..65659347ff2a 100644 --- a/msbuild/Directory.Build.props +++ b/msbuild/Directory.Build.props @@ -10,8 +10,12 @@ interesting ways. So in order to get the exact version, they're enclosed in brackets. + Lists of versions can be found here: + + https://dev.azure.com/azure-public/vside/_artifacts/feed/xamarin-impl/NuGet/Xamarin.Messaging.Client/ + --> - [2.1.15] + [2.1.15] [1.1.7] From a8a7ed059934492d541b9b9312e24d4fb859553f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 08:00:05 +0200 Subject: [PATCH 089/155] [msbuild] Make the Unzip task cancellable. (#21456) --- msbuild/Xamarin.MacDev.Tasks/Decompress.cs | 23 +++++--- .../Tasks/ResolveNativeReferences.cs | 52 +++++++++++-------- msbuild/Xamarin.MacDev.Tasks/Tasks/Unzip.cs | 11 +++- .../ResolveNativeReferencesTaskTest.cs | 7 +-- 4 files changed, 58 insertions(+), 35 deletions(-) diff --git a/msbuild/Xamarin.MacDev.Tasks/Decompress.cs b/msbuild/Xamarin.MacDev.Tasks/Decompress.cs index ed47c46bf98d..4f2f8d5c0636 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Decompress.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Decompress.cs @@ -4,6 +4,7 @@ using System.IO; using System.IO.Compression; using System.Reflection; +using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; @@ -81,9 +82,10 @@ public static bool IsCompressed (string path) /// The zip to search in /// The relative path inside the zip to extract (may be a file or a directory). /// The location on disk to store the extracted results + /// The cancellation token (if any= /// The location on disk to the extracted resource /// - public static bool TryDecompress (TaskLoggingHelper log, string zip, string resource, string decompressionDir, List createdFiles, [NotNullWhen (true)] out string? decompressedResource) + public static bool TryDecompress (TaskLoggingHelper log, string zip, string resource, string decompressionDir, List createdFiles, CancellationToken? cancellationToken, [NotNullWhen (true)] out string? decompressedResource) { decompressedResource = Path.Combine (decompressionDir, resource); @@ -101,11 +103,11 @@ public static bool TryDecompress (TaskLoggingHelper log, string zip, string reso bool rv; if (Environment.OSVersion.Platform == PlatformID.Win32NT) { - rv = TryDecompressUsingSystemIOCompression (log, zip, resource, decompressionDir); + rv = TryDecompressUsingSystemIOCompression (log, zip, resource, decompressionDir, cancellationToken); } else if (!string.IsNullOrEmpty (Environment.GetEnvironmentVariable ("XAMARIN_USE_SYSTEM_IO_COMPRESSION"))) { - rv = TryDecompressUsingSystemIOCompression (log, zip, resource, decompressionDir); + rv = TryDecompressUsingSystemIOCompression (log, zip, resource, decompressionDir, cancellationToken); } else { - rv = TryDecompressUsingUnzip (log, zip, resource, decompressionDir); + rv = TryDecompressUsingUnzip (log, zip, resource, decompressionDir, cancellationToken); } if (rv) { @@ -128,7 +130,7 @@ public static bool TryDecompress (TaskLoggingHelper log, string zip, string reso // The dir separator character in zip files is always "/", even on Windows const char zipDirectorySeparator = '/'; - static bool TryDecompressUsingUnzip (TaskLoggingHelper log, string zip, string resource, string decompressionDir) + static bool TryDecompressUsingUnzip (TaskLoggingHelper log, string zip, string resource, string decompressionDir, CancellationToken? cancellationToken) { Directory.CreateDirectory (decompressionDir); var args = new List { @@ -157,11 +159,11 @@ static bool TryDecompressUsingUnzip (TaskLoggingHelper log, string zip, string r args.Add (zipPattern); } - var rv = XamarinTask.ExecuteAsync (log, "unzip", args).Result; + var rv = XamarinTask.ExecuteAsync (log, "unzip", args, cancellationToken: cancellationToken).Result; return rv.ExitCode == 0; } - static bool TryDecompressUsingSystemIOCompression (TaskLoggingHelper log, string zip, string resource, string decompressionDir) + static bool TryDecompressUsingSystemIOCompression (TaskLoggingHelper log, string zip, string resource, string decompressionDir, CancellationToken? cancellationToken) { var rv = true; @@ -172,6 +174,7 @@ static bool TryDecompressUsingSystemIOCompression (TaskLoggingHelper log, string using var archive = ZipFile.OpenRead (zip); foreach (var entry in archive.Entries) { + cancellationToken?.ThrowIfCancellationRequested (); var entryPath = entry.FullName; if (entryPath.Length == 0) continue; @@ -207,7 +210,11 @@ static bool TryDecompressUsingSystemIOCompression (TaskLoggingHelper log, string Directory.CreateDirectory (Path.GetDirectoryName (targetPath)); using var streamWrite = File.OpenWrite (targetPath); using var streamRead = entry.Open (); - streamRead.CopyTo (streamWrite); +#if NET + streamRead.CopyToAsync (streamWrite, cancellationToken ?? CancellationToken.None).Wait (); +#else + streamRead.CopyToAsync (streamWrite, 81920 /* default buffer size according to docs */, cancellationToken ?? CancellationToken.None).Wait (); +#endif log.LogMessage (MessageImportance.Low, "Extracted {0} into {1}", entryPath, targetPath); } } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs index 60cdf434d23b..a975efb5abc1 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs @@ -5,6 +5,7 @@ using System.IO.Compression; using System.Linq; using System.Reflection; +using System.Threading; using System.Xml; using Microsoft.Build.Framework; @@ -40,6 +41,8 @@ namespace Xamarin.MacDev.Tasks { // with a framework for macOS will likely have symlinks, but that shouldn't prevent the xcframework from being // consumed in a build for iOS. public class ResolveNativeReferences : XamarinTask, ITaskCallback { + CancellationTokenSource? cancellationTokenSource; + #region Inputs [Required] @@ -112,9 +115,11 @@ bool ExecuteLocally () var native_frameworks = new List (); var createdFiles = new List (); + cancellationTokenSource = new CancellationTokenSource (); + // there can be direct native references inside a project foreach (var nr in NativeReferences) { - ProcessNativeReference (nr, native_frameworks, createdFiles); + ProcessNativeReference (nr, native_frameworks, createdFiles, cancellationTokenSource.Token); } // or (managed) reference to an assembly that bind a framework @@ -122,11 +127,11 @@ bool ExecuteLocally () // look for sidecar's manifest var resources = Path.ChangeExtension (r.ItemSpec, ".resources"); if (Directory.Exists (resources)) { - ProcessNativeReference (r, resources, native_frameworks, createdFiles); + ProcessNativeReference (r, resources, native_frameworks, createdFiles, cancellationTokenSource.Token); } else { resources = resources + ".zip"; if (File.Exists (resources)) - ProcessNativeReference (r, resources, native_frameworks, createdFiles); + ProcessNativeReference (r, resources, native_frameworks, createdFiles, cancellationTokenSource.Token); } } @@ -136,12 +141,12 @@ bool ExecuteLocally () return !Log.HasLoggedErrors; } - void ProcessNativeReference (ITaskItem item, List native_frameworks, List createdFiles) + void ProcessNativeReference (ITaskItem item, List native_frameworks, List createdFiles, CancellationToken? cancellationTokenSource) { - ProcessNativeReference (item, item.ItemSpec, native_frameworks, createdFiles); + ProcessNativeReference (item, item.ItemSpec, native_frameworks, createdFiles, cancellationTokenSource); } - void ProcessNativeReference (ITaskItem item, string name, List native_frameworks, List createdFiles) + void ProcessNativeReference (ITaskItem item, string name, List native_frameworks, List createdFiles, CancellationToken? cancellationToken) { // '.' can be used to represent a file (instead of the directory) if (Path.GetFileName (name) == ".") @@ -190,7 +195,7 @@ void ProcessNativeReference (ITaskItem item, string name, List native // (compressed) xcframework if (name.EndsWith (".xcframework", StringComparison.OrdinalIgnoreCase) || name.EndsWith (".xcframework.zip", StringComparison.OrdinalIgnoreCase)) { - if (!TryResolveXCFramework (Log, TargetFrameworkMoniker, SdkIsSimulator, Architectures, name, GetIntermediateDecompressionDir (item), createdFiles, out var nativeLibraryPath)) + if (!TryResolveXCFramework (Log, TargetFrameworkMoniker, SdkIsSimulator, Architectures, name, GetIntermediateDecompressionDir (item), createdFiles, cancellationToken, out var nativeLibraryPath)) return; var nr = new TaskItem (item); SetMetadataNativeLibrary (nr, nativeLibraryPath); @@ -200,7 +205,7 @@ void ProcessNativeReference (ITaskItem item, string name, List native // compressed framework if (name.EndsWith (".framework.zip", StringComparison.OrdinalIgnoreCase)) { - if (!CompressionHelper.TryDecompress (Log, name, Path.GetFileNameWithoutExtension (name), GetIntermediateDecompressionDir (item), createdFiles, out var frameworkPath)) + if (!CompressionHelper.TryDecompress (Log, name, Path.GetFileNameWithoutExtension (name), GetIntermediateDecompressionDir (item), createdFiles, cancellationToken, out var frameworkPath)) return; var nr = new TaskItem (item); nr.ItemSpec = GetActualLibrary (frameworkPath); @@ -213,13 +218,13 @@ void ProcessNativeReference (ITaskItem item, string name, List native // sidecar / binding resource package if (name.EndsWith (".resources", StringComparison.OrdinalIgnoreCase)) { - ProcessSidecar (item, name, native_frameworks, createdFiles); + ProcessSidecar (item, name, native_frameworks, createdFiles, cancellationToken); return; } // compressed sidecar / binding resource package if (name.EndsWith (".resources.zip", StringComparison.OrdinalIgnoreCase)) { - ProcessSidecar (item, name, native_frameworks, createdFiles); + ProcessSidecar (item, name, native_frameworks, createdFiles, cancellationToken); return; } @@ -289,7 +294,7 @@ void SetMetadataNativeLibrary (ITaskItem item, string nativeLibraryPath) item.SetMetadata ("RelativePath", Path.Combine (FrameworksDirectory, Path.GetFileName (Path.GetDirectoryName (item.ItemSpec)))); } - void ProcessSidecar (ITaskItem r, string resources, List native_frameworks, List createdFiles) + void ProcessSidecar (ITaskItem r, string resources, List native_frameworks, List createdFiles, CancellationToken? cancellationToken) { if (!TryGetSidecarManifest (Log, resources, out var manifestContents)) return; @@ -302,7 +307,7 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame var name = referenceNode.Attributes ["Name"].Value.Trim ('\\', '/'); switch (Path.GetExtension (name)) { case ".xcframework": { - if (!TryResolveXCFramework (Log, TargetFrameworkMoniker, SdkIsSimulator, Architectures, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, out var nativeLibraryPath)) + if (!TryResolveXCFramework (Log, TargetFrameworkMoniker, SdkIsSimulator, Architectures, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, cancellationToken, out var nativeLibraryPath)) continue; SetMetadataNativeLibrary (t, nativeLibraryPath); break; @@ -311,7 +316,7 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame string? frameworkPath; if (!isCompressed) { frameworkPath = Path.Combine (resources, name); - } else if (!CompressionHelper.TryDecompress (Log, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, out frameworkPath)) { + } else if (!CompressionHelper.TryDecompress (Log, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, cancellationToken, out frameworkPath)) { continue; } t.ItemSpec = GetActualLibrary (frameworkPath); @@ -324,7 +329,7 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame string? dylibPath; if (!isCompressed) { dylibPath = Path.Combine (resources, name); - } else if (!CompressionHelper.TryDecompress (Log, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, out dylibPath)) { + } else if (!CompressionHelper.TryDecompress (Log, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, cancellationToken, out dylibPath)) { continue; } t.ItemSpec = dylibPath; @@ -335,7 +340,7 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame string? aPath; if (!isCompressed) { aPath = Path.Combine (resources, name); - } else if (!CompressionHelper.TryDecompress (Log, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, out aPath)) { + } else if (!CompressionHelper.TryDecompress (Log, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, cancellationToken, out aPath)) { continue; } t.ItemSpec = aPath; @@ -374,7 +379,7 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame /// A full path to the resolved native library within the xcframework. If 'resourcePath' is compressed, this will point to where the native library is decompressed on disk. /// /// True if a native library was successfully found. Otherwise false, and an error will have been printed to the log. - public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFrameworkMoniker, bool isSimulator, string? architectures, string path, string intermediateDecompressionDir, List createdFiles, [NotNullWhen (true)] out string? nativeLibraryPath) + public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFrameworkMoniker, bool isSimulator, string? architectures, string path, string intermediateDecompressionDir, List createdFiles, CancellationToken? cancellationToken, [NotNullWhen (true)] out string? nativeLibraryPath) { string resourcePath; string xcframework; @@ -386,7 +391,7 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFr resourcePath = Path.GetDirectoryName (path); xcframework = Path.GetFileName (path); } - return TryResolveXCFramework (log, targetFrameworkMoniker, isSimulator, architectures, resourcePath, xcframework, intermediateDecompressionDir, createdFiles, out nativeLibraryPath); + return TryResolveXCFramework (log, targetFrameworkMoniker, isSimulator, architectures, resourcePath, xcframework, intermediateDecompressionDir, createdFiles, cancellationToken, out nativeLibraryPath); } /// @@ -401,7 +406,7 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFr /// A full path to the resolved native library within the xcframework. If 'resourcePath' is compressed, this will point to where the native library is decompressed on disk. /// /// True if a native library was successfully found. Otherwise false, and an error will have been printed to the log. - public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFrameworkMoniker, bool isSimulator, string? architectures, string resourcePath, string xcframework, string intermediateDecompressionDir, List createdFiles, [NotNullWhen (true)] out string? nativeLibraryPath) + public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFrameworkMoniker, bool isSimulator, string? architectures, string resourcePath, string xcframework, string intermediateDecompressionDir, List createdFiles, CancellationToken? cancellationToken, [NotNullWhen (true)] out string? nativeLibraryPath) { nativeLibraryPath = null; @@ -411,7 +416,7 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFr var isCompressed = CompressionHelper.IsCompressed (resourcePath); var xcframeworkPath = isCompressed ? resourcePath : Path.Combine (resourcePath, xcframework); - if (!TryResolveXCFramework (log, plist, xcframeworkPath, targetFrameworkMoniker, isSimulator, architectures!, out var nativeLibraryRelativePath)) + if (!TryResolveXCFramework (log, plist, xcframeworkPath, targetFrameworkMoniker, isSimulator, architectures!, cancellationToken, out var nativeLibraryRelativePath)) return false; if (!isCompressed) { @@ -420,7 +425,7 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFr } var zipResource = Path.Combine (xcframework, Path.GetDirectoryName (nativeLibraryRelativePath)); - if (!CompressionHelper.TryDecompress (log, resourcePath, zipResource, intermediateDecompressionDir, createdFiles, out var decompressedPath)) + if (!CompressionHelper.TryDecompress (log, resourcePath, zipResource, intermediateDecompressionDir, createdFiles, cancellationToken, out var decompressedPath)) return false; nativeLibraryPath = Path.Combine (intermediateDecompressionDir, xcframework, nativeLibraryRelativePath); @@ -444,7 +449,7 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFr /// The target architectures /// A relative path to the resolved native library within the xcframework. /// True if a native library was successfully found. Otherwise false, and an error will have been printed to the log. - public static bool TryResolveXCFramework (TaskLoggingHelper log, PDictionary plist, string xcframeworkPath, string targetFrameworkMoniker, bool isSimulator, string architectures, [NotNullWhen (true)] out string? nativeLibraryPath) + public static bool TryResolveXCFramework (TaskLoggingHelper log, PDictionary plist, string xcframeworkPath, string targetFrameworkMoniker, bool isSimulator, string architectures, CancellationToken? cancellationToken, [NotNullWhen (true)] out string? nativeLibraryPath) { nativeLibraryPath = null; var platform = PlatformFrameworkHelper.GetFramework (targetFrameworkMoniker); @@ -519,8 +524,11 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, PDictionary pli public void Cancel () { - if (ShouldExecuteRemotely ()) + if (ShouldExecuteRemotely ()) { BuildConnection.CancelAsync (BuildEngine4).Wait (); + } else { + cancellationTokenSource?.Cancel (); + } } public bool ShouldCopyToBuildServer (ITaskItem item) => true; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/Unzip.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/Unzip.cs index 6dc4ced90781..7d68b37df7e4 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/Unzip.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/Unzip.cs @@ -5,6 +5,7 @@ using System.IO.Compression; using System.Linq; using System.Reflection; +using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; @@ -22,6 +23,8 @@ namespace Xamarin.MacDev.Tasks { /// This task works on Windows too, but if the task encounters a symlink while extracting, an error will be shown. /// public class Unzip : XamarinTask, ITaskCallback { + CancellationTokenSource? cancellationTokenSource; + // If we should copy the extracted files to Windows (as opposed to just creating an empty output file). public bool CopyToWindows { get; set; } @@ -55,8 +58,11 @@ public override bool Execute () public void Cancel () { - if (ShouldExecuteRemotely ()) + if (ShouldExecuteRemotely ()) { BuildConnection.CancelAsync (BuildEngine4).Wait (); + } else { + cancellationTokenSource?.Cancel (); + } } public bool ShouldCopyToBuildServer (ITaskItem item) => true; @@ -73,7 +79,8 @@ public bool ShouldCreateOutputFile (ITaskItem item) bool ExecuteLocally () { var createdFiles = new List (); - if (!CompressionHelper.TryDecompress (Log, ZipFilePath!.ItemSpec, Resource, ExtractionPath, createdFiles, out var _)) + cancellationTokenSource = new CancellationTokenSource (); + if (!CompressionHelper.TryDecompress (Log, ZipFilePath!.ItemSpec, Resource, ExtractionPath, createdFiles, cancellationTokenSource.Token, out var _)) return false; TouchedFiles = createdFiles.Select (v => new TaskItem (v)).ToArray (); diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs index 148849779358..431fc489d2cd 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/ResolveNativeReferencesTaskTest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading; using Microsoft.Build.Utilities; using NUnit.Framework; @@ -40,7 +41,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a // on Xcode 12.2+ you get arm64 for all (iOS, tvOS and watchOS) simulators var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-xcode12.2.plist"); var plist = PDictionary.FromFile (path)!; - var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); + var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, null, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); Assert.That (frameworkPath, Is.EqualTo (expected), "frameworkPath"); } @@ -53,7 +54,7 @@ public void PreXcode12 (string targetFrameworkMoniker, bool isSimulator, string { var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location)!, "Resources", "xcf-prexcode12.plist"); var plist = PDictionary.FromFile (path)!; - var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath); + var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, null, out var frameworkPath); Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result"); Assert.That (frameworkPath, Is.EqualTo (expected), "frameworkPath"); } @@ -62,7 +63,7 @@ public void PreXcode12 (string targetFrameworkMoniker, bool isSimulator, string public void BadInfoPlist () { var plist = new PDictionary (); - var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", TargetFramework.DotNet_iOS_String, false, "x86_64", out var frameworkPath); + var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", TargetFramework.DotNet_iOS_String, false, "x86_64", null, out var frameworkPath); Assert.IsFalse (result, "Invalid Info.plist"); } } From a66dc3b09f1f53e4020f227f11d0c2a87e44d5d0 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 08:00:31 +0200 Subject: [PATCH 090/155] [msbuild] Port Ditto to subclass XamarinTask. (#21453) This has a few advantages: * We simplify and unify more of our code. * We have more control over the error reporting / logging behavior. Additionally: * Allow for overriding the path to the command-line tool in question. * Add support for cancellation. Fixes https://github.com/xamarin/xamarin-macios/issues/21437. --- docs/build-apps/build-properties.md | 6 ++ dotnet/targets/Xamarin.Shared.Sdk.targets | 3 +- .../MSBStrings.resx | 13 ++++ msbuild/Xamarin.MacDev.Tasks/Tasks/Ditto.cs | 75 +++++++++---------- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 3 +- .../Xamarin.WatchOS.App.Common.targets | 6 +- .../Xamarin.Shared/Xamarin.iOS.Common.targets | 9 +-- 7 files changed, 63 insertions(+), 52 deletions(-) diff --git a/docs/build-apps/build-properties.md b/docs/build-apps/build-properties.md index 52101278797d..9c3ae3030c6d 100644 --- a/docs/build-apps/build-properties.md +++ b/docs/build-apps/build-properties.md @@ -11,6 +11,12 @@ MSBuild properties control the behavior of the They're specified within the project file, for example **MyApp.csproj**, within an MSBuild PropertyGroup. +## DittoPath + +The full path to the `ditto` executable. + +The default behavior is to use `/usr/bin/ditto`. + ## MaciOSPrepareForBuildDependsOn A semi-colon delimited property that can be used to extend the build process. diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index dc7dff2aa87d..37a4fe423f1b 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -869,8 +869,7 @@ Condition="'$(IsMacEnabled)' == 'true'" AdditionalArguments="$(_DittoArchitectures)" CopyFromWindows="true" - ToolExe="$(DittoExe)" - ToolPath="$(DittoPath)" + DittoPath="$(DittoPath)" Source="%(_DirectoriesToPublish.SourceDirectory)" Destination="%(_DirectoriesToPublish.TargetDirectory)" TouchDestinationFiles="true" diff --git a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx index b68ef191e2a9..ab219c061e30 100644 --- a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx +++ b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx @@ -1576,6 +1576,19 @@ SupportedOSPlatformVersion: don't translate (it's the name of an MSBuild property) + + The source '{0}' does not exist. + {0}: path to a file or a directory + + + + Unable to parse the 'AdditionalArguments' value: {0} + + AdditionalArguments: don't translate (it's the name of an MSBuild property) + {0}: additional arguments passed to the task + + + Adding reference to Xcode project output: '{0}'. The '%(CreateNativeReference)' metadata can be set to 'false' to opt out of this behavior. diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/Ditto.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/Ditto.cs index a4a849dfd7df..1eece8514f84 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/Ditto.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/Ditto.cs @@ -4,14 +4,19 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; +using Xamarin.Localization.MSBuild; using Xamarin.Messaging.Build.Client; +using Xamarin.Utils; namespace Xamarin.MacDev.Tasks { - public class Ditto : XamarinToolTask, ITaskCallback { + public class Ditto : XamarinTask, ITaskCallback, ICancelableTask { + CancellationTokenSource? cancellationTokenSource; + #region Inputs public string? AdditionalArguments { get; set; } @@ -26,6 +31,8 @@ public class Ditto : XamarinToolTask, ITaskCallback { // the mode. public bool CopyFromWindows { get; set; } + public string? DittoPath { get; set; } + [Required] public ITaskItem? Source { get; set; } @@ -40,32 +47,6 @@ public class Ditto : XamarinToolTask, ITaskCallback { #endregion - protected override string ToolName { - get { return "ditto"; } - } - - protected override string GenerateFullPathToTool () - { - if (!string.IsNullOrEmpty (ToolPath)) - return Path.Combine (ToolPath, ToolExe); - - var path = Path.Combine ("/usr/bin", ToolExe); - - return File.Exists (path) ? path : ToolExe; - } - - protected override string GenerateCommandLineCommands () - { - var args = new CommandLineArgumentBuilder (); - - args.AddQuoted (Path.GetFullPath (Source!.ItemSpec)); - args.AddQuoted (Path.GetFullPath (Destination!.ItemSpec)); - if (!string.IsNullOrEmpty (AdditionalArguments)) - args.Add (AdditionalArguments); - - return args.ToString (); - } - public override bool Execute () { if (ShouldExecuteRemotely ()) { @@ -76,8 +57,31 @@ public override bool Execute () return taskRunner.RunAsync (this).Result; } - if (!base.Execute ()) + var src = Source!.ItemSpec; + if (!File.Exists (src) && !Directory.Exists (src)) { + Log.LogError (MSBStrings.E7131 /* The source '{0}' does not exist. */, src); return false; + } + + var executable = string.IsNullOrEmpty (DittoPath) ? "/usr/bin/ditto" : DittoPath!; + var args = new List (); + args.Add (Path.GetFullPath (Source!.ItemSpec)); + args.Add (Path.GetFullPath (Destination!.ItemSpec)); +#if NET + if (!string.IsNullOrEmpty (AdditionalArguments)) { +#else + if (AdditionalArguments is not null && !string.IsNullOrEmpty (AdditionalArguments)) { +#endif + if (StringUtils.TryParseArguments (AdditionalArguments, out var additionalArgs, out var ex)) { + args.AddRange (additionalArgs); + } else { + Log.LogError (MSBStrings.E7132 /* Unable to parse the 'AdditionalArguments' value: {0} */, AdditionalArguments); + return false; + } + } + + cancellationTokenSource = new CancellationTokenSource (); + ExecuteAsync (Log, executable, args, cancellationToken: cancellationTokenSource.Token).Wait (); // Create a list of all the files we've copied var copiedFiles = new List (); @@ -96,18 +100,13 @@ public override bool Execute () return !Log.HasLoggedErrors; } - protected override void LogEventsFromTextOutput (string singleLine, MessageImportance messageImportance) + public void Cancel () { - // TODO: do proper parsing of error messages and such - Log.LogMessage (messageImportance, "{0}", singleLine); - } - - public override void Cancel () - { - base.Cancel (); - - if (ShouldExecuteRemotely ()) + if (ShouldExecuteRemotely ()) { BuildConnection.CancelAsync (BuildEngine4).Wait (); + } else { + cancellationTokenSource?.Cancel (); + } } public IEnumerable GetAdditionalItemsToBeCopied () diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index e92e02dae188..7e64fe293823 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -2505,8 +2505,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. @@ -93,8 +92,7 @@ Copyright (C) 2015-2016 Xamarin. All rights reserved. SessionId="$(BuildSessionId)" Condition="'$(IsMacEnabled)'" AdditionalArguments="$(WKDittoArchitectures)" - ToolExe="$(DittoExe)" - ToolPath="$(DittoPath)" + DittoPath="$(DittoPath)" Source="$(_NativeWatchApp)" Destination="$(_AppBundlePath)_WatchKitStub\WK" /> diff --git a/msbuild/Xamarin.Shared/Xamarin.iOS.Common.targets b/msbuild/Xamarin.Shared/Xamarin.iOS.Common.targets index ffefb06341a4..fbc38f7352f6 100644 --- a/msbuild/Xamarin.Shared/Xamarin.iOS.Common.targets +++ b/msbuild/Xamarin.Shared/Xamarin.iOS.Common.targets @@ -371,8 +371,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved. @@ -391,8 +390,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved. @@ -481,8 +479,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved. From 2197b7386a10495374daf74c8ea1c65bd464a6d2 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 09:05:10 +0200 Subject: [PATCH 091/155] [msbuild] Embed any Entitlements.plist + compiled entitlements into binlogs. (#21402) This is to ease diagnosing problems, because the entitlements can be crucial in some cases (features don't work if developers get the entitlements wrong). --- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index 7e64fe293823..534665a2d6b8 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -651,6 +651,13 @@ Copyright (C) 2018 Microsoft. All rights reserved. + + + + + + + @@ -696,6 +703,13 @@ Copyright (C) 2018 Microsoft. All rights reserved. + + + + + + + From 99250b64a81f7db4322ea6213ba38cec947513d2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:25:15 +0200 Subject: [PATCH 092/155] [main] Update dependencies from dotnet/sdk (#21373) This pull request updates the following dependencies ## Coherency Updates The following updates ensure that dependencies with a *CoherentParentDependency* attribute were produced in a build used as input to the parent dependency's build. See [Dependency Description Format](https://github.com/dotnet/arcade/blob/master/Documentation/DependencyDescriptionFormat.md#dependency-description-overview) - **Coherency Updates**: - **Microsoft.NET.ILLink.Tasks**: from 9.0.0-rtm.24515.9 to 9.0.0 (parent: Microsoft.NET.Sdk) - **Microsoft.AspNetCore.App.Ref**: from 9.0.0-rtm.24514.7 to 9.0.0 (parent: Microsoft.NET.Sdk) - **Microsoft.NETCore.App.Ref**: from 9.0.0-rtm.24515.9 to 9.0.0 (parent: Microsoft.NET.Sdk) - **Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport**: from 9.0.0-rtm.24513.1 to 9.0.0-rtm.24515.1 (parent: Microsoft.NETCore.App.Ref) - **Microsoft.NETCore.App.Ref**: from 9.0.0-rtm.24515.9 to 9.0.0 (parent: Microsoft.NET.Sdk) ## From https://github.com/dotnet/sdk - **Subscription**: afa459aa-bd64-46cb-8138-9f6f795963d4 - **Build**: 20241020.4 - **Date Produced**: October 21, 2024 5:47:08 AM UTC - **Commit**: 95bea787c14e3402b47311007dba6b3f503b34e7 - **Branch**: refs/heads/release/9.0.1xx - **Updates**: - **Microsoft.NET.Sdk**: [from 9.0.100-rtm.24518.42 to 9.0.100-rtm.24520.4][28] [28]: https://github.com/dotnet/sdk/compare/f5127b18a8...95bea787c1 --- Make.config | 6 + NuGet.config | 5 + builds/Makefile | 2 +- .../package-download/download-packages.csproj | 3 +- eng/Version.Details.xml | 24 +- eng/Versions.props | 8 +- global.json | 2 +- mk/xamarin.mk | 2 +- runtime/Makefile | 15 +- .../Documentation.KnownFailures.txt | 10397 ---------------- tests/dotnet/UnitTests/ProjectTest.cs | 20 +- 11 files changed, 59 insertions(+), 10425 deletions(-) diff --git a/Make.config b/Make.config index 7e84730ea8de..d06bfee12b41 100644 --- a/Make.config +++ b/Make.config @@ -771,6 +771,7 @@ DOTNET_PLATFORMS= ifdef INCLUDE_IOS ifdef ENABLE_DOTNET DOTNET_PLATFORMS+=iOS +DOTNET_MONOVM_PLATFORMS+=iOS DOTNET_IOS_BITNESSES+=64 DOTNET_NATIVEAOT_PLATFORMS+=iOS @@ -797,6 +798,7 @@ endif # INCLUDE_IOS ifdef INCLUDE_TVOS ifdef ENABLE_DOTNET DOTNET_PLATFORMS+=tvOS +DOTNET_MONOVM_PLATFORMS+=tvOS DOTNET_TVOS_BITNESSES+=64 DOTNET_NATIVEAOT_PLATFORMS+=tvOS ifdef INCLUDE_DEVICE @@ -811,6 +813,7 @@ endif ifdef INCLUDE_MACCATALYST ifdef ENABLE_DOTNET DOTNET_PLATFORMS+=MacCatalyst +DOTNET_MONOVM_PLATFORMS+=MacCatalyst DOTNET_MACCATALYST_BITNESSES+=64 DOTNET_NATIVEAOT_PLATFORMS+=MacCatalyst DOTNET_MACCATALYST_RUNTIME_IDENTIFIERS=maccatalyst-x64 maccatalyst-arm64 @@ -840,6 +843,9 @@ $(foreach platform,$(DOTNET_PLATFORMS),$(eval $(platform)_NUGET_OS_VERSION:=$($( # Create a variable with all the runtime identifiers DOTNET_RUNTIME_IDENTIFIERS=$(foreach platform,$(DOTNET_PLATFORMS),$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS)) +# Create a variable with all the MonoVM runtime identifiers +DOTNET_MONOVM_RUNTIME_IDENTIFIERS=$(foreach platform,$(DOTNET_MONOVM_PLATFORMS),$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS)) + # Create a variable with all the CoreCLR runtime identifiers DOTNET_CORECLR_RUNTIME_IDENTIFIERS=$(foreach platform,$(DOTNET_CORECLR_PLATFORMS),$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS)) diff --git a/NuGet.config b/NuGet.config index 9af2f79e7e6a..8023cacf4c21 100644 --- a/NuGet.config +++ b/NuGet.config @@ -15,8 +15,10 @@ + + @@ -63,6 +65,9 @@ + + + diff --git a/builds/Makefile b/builds/Makefile index bfe48c600615..371f6bbf7e66 100644 --- a/builds/Makefile +++ b/builds/Makefile @@ -91,7 +91,7 @@ package-download/all-package-references.csproj: $(GIT_DIRECTORY)/HEAD $(GIT_DIRE download-packages.csproj \ /t:WriteBundledNETCorePlatformsPackageVersion \ /p:WriteFilePath=$(CURDIR)/BundledNETCorePlatformsPackageVersion.txt \ - /p:PackageRuntimeIdentifiers="$(DOTNET_RUNTIME_IDENTIFIERS)" \ + /p:PackageRuntimeIdentifiersMonoVM="$(DOTNET_MONOVM_RUNTIME_IDENTIFIERS)" \ /p:PackageRuntimeIdentifiersCoreCLR="$(DOTNET_CORECLR_RUNTIME_IDENTIFIERS)" \ /p:CustomDotNetVersion="$(DOWNLOAD_DOTNET_VERSION)" \ /p:MonoToolChainManifestVersionBand="$(MONO_TOOLCHAIN_MANIFEST_VERSION_BAND)" \ diff --git a/builds/package-download/download-packages.csproj b/builds/package-download/download-packages.csproj index 95b1db9dedec..324bca4ef38e 100644 --- a/builds/package-download/download-packages.csproj +++ b/builds/package-download/download-packages.csproj @@ -11,10 +11,11 @@ + - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a32796ceca9d..5a04d99d2d32 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,34 +1,34 @@ - + https://github.com/dotnet/sdk - f59e9ca09cb4d5b903b276c0d3d7825b6ddbc3a0 + 95bea787c14e3402b47311007dba6b3f503b34e7 https://github.com/dotnet/runtime cf47d9ff6827a3e1d6f2acbf925cd618418f20dd - + https://github.com/dotnet/runtime - 2c4266c134aa02718179818098a11e825c9d1362 + d3981726bc8b0e179db50301daf9f22d42393096 - + https://github.com/dotnet/runtime - 2c4266c134aa02718179818098a11e825c9d1362 + d3981726bc8b0e179db50301daf9f22d42393096 - + https://github.com/dotnet/aspnetcore - afe2857bffef08213d6f3c7688647c60d5d5e7bd + 1e7a7af6d2417242b244d2a0f4f23fcce8e88d2f - + https://github.com/dotnet/emsdk - 8e660ff41e91879977e3a9d837e068bd72234c26 + 8be5676af1ccf568b258133788a24aedd1a80994 - + https://github.com/dotnet/cecil - 526b22d829bc9b420dff6ef70877a67053b66e0f + 9c9443396f8deacceb8edb169890e52aac25f311 diff --git a/eng/Versions.props b/eng/Versions.props index e62b82563c13..25cc1a13db90 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -2,16 +2,16 @@ - 9.0.100-rc.2.24475.4 - 9.0.0-rtm.24475.3 + 9.0.100-rtm.24520.4 + 9.0.0 9.0.0-alpha.1.23556.4 9.0.0-beta.24516.2 8.0.0-beta.24413.2 - 9.0.0-rtm.24475.3 + 9.0.0 8.0.0-rtm.23511.3 9.0.0-rc.2.24462.10 7.0.100-alpha.1.21601.1 - 0.11.5-alpha.24467.1 + 0.11.5-alpha.24480.1 10.0.0-prerelease.24511.1 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) diff --git a/global.json b/global.json index 39529c36264e..1f9fab064bcf 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100-rc.2.24475.4" + "version": "9.0.100-rtm.24520.4" } } diff --git a/mk/xamarin.mk b/mk/xamarin.mk index 45698e3896d6..2329b42c3abf 100644 --- a/mk/xamarin.mk +++ b/mk/xamarin.mk @@ -7,7 +7,7 @@ MONO_BRANCH := $(shell cd $(MONO_PATH) 2> /dev/null && git symbolic-ref --sho endif ifdef ENABLE_XAMARIN -NEEDED_MACCORE_VERSION := d3ed4b343e2f39f7afc5d54b30aab74895a13dca +NEEDED_MACCORE_VERSION := 4ebacfa6fcb3737c9fcdd516501fc95582928fbe NEEDED_MACCORE_BRANCH := main MACCORE_DIRECTORY := maccore diff --git a/runtime/Makefile b/runtime/Makefile index 72ca9932f4d9..35e62bf6d8de 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -571,10 +571,6 @@ DOTNET_MacCatalyst_LIBRARIES = define DotNetLibTemplate DOTNET_TARGETS += \ - $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet.dylib \ - $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet-debug.dylib \ - $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet.a \ - $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet-debug.a \ $$(foreach lib,$$(DOTNET_$(1)_LIBRARIES),$(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/$$(lib)) \ $$(foreach header,$$(SHIPPED_HEADERS),$(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/$$(header)) \ @@ -588,6 +584,17 @@ endef $(foreach platform,$(DOTNET_PLATFORMS),$(foreach rid,$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS),$(eval $(call DotNetLibTemplate,$(platform),$(rid))))) +define DotNetMonoLibTemplate +DOTNET_TARGETS += \ + $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet.dylib \ + $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet-debug.dylib \ + $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet.a \ + $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet-debug.a \ + +endef + +$(foreach platform,$(DOTNET_MONOVM_PLATFORMS),$(foreach rid,$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS),$(eval $(call DotNetMonoLibTemplate,$(platform),$(rid))))) + define DotNetCoreClrLibTemplate DOTNET_TARGETS += \ $(DOTNET_DESTDIR)/$($(2)_NUGET_RUNTIME_NAME)/runtimes/$(2)/native/libxamarin-dotnet-coreclr.a \ diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 881b3dd58432..a820fc4a5453 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -21862,87 +21862,43 @@ M:Accelerate.vImage.TentConvolveARGB8888(Accelerate.vImageBuffer@,Accelerate.vIm M:Accelerate.vImage.TentConvolvePlanar8(Accelerate.vImageBuffer@,Accelerate.vImageBuffer@,System.IntPtr,System.IntPtr,System.IntPtr,System.UInt32,System.UInt32,System.Byte,Accelerate.vImageFlags) M:Accessibility.AXBrailleMap.Copy(Foundation.NSZone) M:Accessibility.AXBrailleMap.EncodeTo(Foundation.NSCoder) -M:Accessibility.AXBrailleMap.GetHeight(CoreGraphics.CGPoint) -M:Accessibility.AXBrailleMap.Present(CoreGraphics.CGImage) -M:Accessibility.AXBrailleMap.SetHeight(System.Single,CoreGraphics.CGPoint) M:Accessibility.AXBrailleMapRenderer_Extensions.GetAccessibilityBrailleMapRenderer(Accessibility.IAXBrailleMapRenderer) M:Accessibility.AXBrailleMapRenderer_Extensions.GetAccessibilityBrailleMapRenderRegion(Accessibility.IAXBrailleMapRenderer) M:Accessibility.AXBrailleMapRenderer_Extensions.SetAccessibilityBrailleMapRenderer(Accessibility.IAXBrailleMapRenderer,System.Action{Accessibility.AXBrailleMap}) M:Accessibility.AXBrailleMapRenderer_Extensions.SetAccessibilityBrailleMapRenderRegion(Accessibility.IAXBrailleMapRenderer,CoreGraphics.CGRect) -M:Accessibility.AXCategoricalDataAxisDescriptor.#ctor(Foundation.NSAttributedString,System.String[]) -M:Accessibility.AXCategoricalDataAxisDescriptor.#ctor(System.String,System.String[]) M:Accessibility.AXCategoricalDataAxisDescriptor.Copy(Foundation.NSZone) -M:Accessibility.AXChartDescriptor.#ctor(Foundation.NSAttributedString,System.String,Accessibility.IAXDataAxisDescriptor,Accessibility.AXNumericDataAxisDescriptor,Accessibility.AXDataSeriesDescriptor[]) -M:Accessibility.AXChartDescriptor.#ctor(Foundation.NSAttributedString,System.String,Accessibility.IAXDataAxisDescriptor,Accessibility.AXNumericDataAxisDescriptor,Accessibility.IAXDataAxisDescriptor[],Accessibility.AXDataSeriesDescriptor[]) -M:Accessibility.AXChartDescriptor.#ctor(System.String,System.String,Accessibility.IAXDataAxisDescriptor,Accessibility.AXNumericDataAxisDescriptor,Accessibility.AXDataSeriesDescriptor[]) -M:Accessibility.AXChartDescriptor.#ctor(System.String,System.String,Accessibility.IAXDataAxisDescriptor,Accessibility.AXNumericDataAxisDescriptor,Accessibility.IAXDataAxisDescriptor[],Accessibility.AXDataSeriesDescriptor[]) M:Accessibility.AXChartDescriptor.Copy(Foundation.NSZone) M:Accessibility.AXCustomContent.Copy(Foundation.NSZone) -M:Accessibility.AXCustomContent.Create(Foundation.NSAttributedString,Foundation.NSAttributedString) -M:Accessibility.AXCustomContent.Create(System.String,System.String) M:Accessibility.AXCustomContent.EncodeTo(Foundation.NSCoder) M:Accessibility.AXCustomContentProvider_Extensions.GetAccessibilityCustomContentHandler(Accessibility.IAXCustomContentProvider) M:Accessibility.AXCustomContentProvider_Extensions.SetAccessibilityCustomContentHandler(Accessibility.IAXCustomContentProvider,System.Func{Accessibility.AXCustomContent[]}) -M:Accessibility.AXDataPoint.#ctor(Accessibility.AXDataPointValue,Accessibility.AXDataPointValue,Accessibility.AXDataPointValue[],System.String) -M:Accessibility.AXDataPoint.#ctor(Accessibility.AXDataPointValue,Accessibility.AXDataPointValue,Accessibility.AXDataPointValue[]) -M:Accessibility.AXDataPoint.#ctor(Accessibility.AXDataPointValue,Accessibility.AXDataPointValue) M:Accessibility.AXDataPoint.Copy(Foundation.NSZone) M:Accessibility.AXDataPointValue.Copy(Foundation.NSZone) -M:Accessibility.AXDataPointValue.CreateValueWithCategory(System.String) -M:Accessibility.AXDataPointValue.CreateValueWithNumber(System.Double) -M:Accessibility.AXDataSeriesDescriptor.#ctor(Foundation.NSAttributedString,System.Boolean,Accessibility.AXDataPoint[]) -M:Accessibility.AXDataSeriesDescriptor.#ctor(System.String,System.Boolean,Accessibility.AXDataPoint[]) M:Accessibility.AXDataSeriesDescriptor.Copy(Foundation.NSZone) M:Accessibility.AXHearingUtilities.AXSupportsBidirectionalAXMFiHearingDeviceStreaming M:Accessibility.AXHearingUtilities.GetMFiHearingDevicePairedUuids M:Accessibility.AXHearingUtilities.GetMFiHearingDeviceStreamingEar M:Accessibility.AXHearingUtilities.SupportsBidirectionalStreaming -M:Accessibility.AXLiveAudioGraph.Start -M:Accessibility.AXLiveAudioGraph.Stop -M:Accessibility.AXLiveAudioGraph.Update(System.Double) -M:Accessibility.AXNumericDataAxisDescriptor.#ctor(Foundation.NSAttributedString,System.Double,System.Double,Foundation.NSNumber[],System.Func{System.Double,Foundation.NSString}) -M:Accessibility.AXNumericDataAxisDescriptor.#ctor(System.String,System.Double,System.Double,Foundation.NSNumber[],System.Func{System.Double,Foundation.NSString}) M:Accessibility.AXNumericDataAxisDescriptor.Copy(Foundation.NSZone) M:Accessibility.AXPrefers.HorizontalTextEnabled M:Accessibility.AXPrefers.NonBlinkingTextInsertionIndicator M:Accessibility.AXRequest.Copy(Foundation.NSZone) M:Accessibility.AXRequest.EncodeTo(Foundation.NSCoder) -M:AccessorySetupKit.ASAccessorySession.Activate(CoreFoundation.DispatchQueue,System.Action{AccessorySetupKit.ASAccessoryEvent}) -M:AccessorySetupKit.ASAccessorySession.FailAuthorization(AccessorySetupKit.ASAccessory,AccessorySetupKit.ASAccessorySessionCompletionHandler) M:AccessorySetupKit.ASAccessorySession.FailAuthorizationAsync(AccessorySetupKit.ASAccessory) -M:AccessorySetupKit.ASAccessorySession.FinishAuthorization(AccessorySetupKit.ASAccessory,AccessorySetupKit.ASAccessorySettings,AccessorySetupKit.ASAccessorySessionCompletionHandler) M:AccessorySetupKit.ASAccessorySession.FinishAuthorizationAsync(AccessorySetupKit.ASAccessory,AccessorySetupKit.ASAccessorySettings) -M:AccessorySetupKit.ASAccessorySession.Invalidate -M:AccessorySetupKit.ASAccessorySession.RemoveAccessory(AccessorySetupKit.ASAccessory,AccessorySetupKit.ASAccessorySessionCompletionHandler) M:AccessorySetupKit.ASAccessorySession.RemoveAccessoryAsync(AccessorySetupKit.ASAccessory) -M:AccessorySetupKit.ASAccessorySession.RenameAccessory(AccessorySetupKit.ASAccessory,AccessorySetupKit.ASAccessoryRenameOptions,AccessorySetupKit.ASAccessorySessionCompletionHandler) M:AccessorySetupKit.ASAccessorySession.RenameAccessoryAsync(AccessorySetupKit.ASAccessory,AccessorySetupKit.ASAccessoryRenameOptions) -M:AccessorySetupKit.ASAccessorySession.ShowPicker(AccessorySetupKit.ASAccessorySessionCompletionHandler) -M:AccessorySetupKit.ASAccessorySession.ShowPicker(AccessorySetupKit.ASPickerDisplayItem[],AccessorySetupKit.ASAccessorySessionCompletionHandler) M:AccessorySetupKit.ASAccessorySession.ShowPickerAsync M:AccessorySetupKit.ASAccessorySession.ShowPickerAsync(AccessorySetupKit.ASPickerDisplayItem[]) -M:AccessorySetupKit.ASMigrationDisplayItem.#ctor(System.String,UIKit.UIImage,AccessorySetupKit.ASDiscoveryDescriptor) -M:AccessorySetupKit.ASPickerDisplayItem.#ctor(System.String,UIKit.UIImage,AccessorySetupKit.ASDiscoveryDescriptor) -M:Accounts.ACAccount.#ctor(Accounts.ACAccountType) M:Accounts.ACAccount.EncodeTo(Foundation.NSCoder) -M:Accounts.ACAccountCredential.#ctor(System.String,System.String,Foundation.NSDate) -M:Accounts.ACAccountCredential.#ctor(System.String,System.String) M:Accounts.ACAccountCredential.EncodeTo(Foundation.NSCoder) M:Accounts.ACAccountStore.Dispose(System.Boolean) -M:Accounts.ACAccountStore.FindAccount(System.String) -M:Accounts.ACAccountStore.FindAccounts(Accounts.ACAccountType) -M:Accounts.ACAccountStore.FindAccountType(System.String) -M:Accounts.ACAccountStore.RemoveAccount(Accounts.ACAccount,Accounts.ACAccountStoreRemoveCompletionHandler) M:Accounts.ACAccountStore.RemoveAccountAsync(Accounts.ACAccount) -M:Accounts.ACAccountStore.RenewCredentials(Accounts.ACAccount,System.Action{Accounts.ACAccountCredentialRenewResult,Foundation.NSError}) M:Accounts.ACAccountStore.RenewCredentialsAsync(Accounts.ACAccount) M:Accounts.ACAccountStore.RequestAccess(Accounts.ACAccountType,Accounts.AccountStoreOptions,Accounts.ACRequestCompletionHandler) -M:Accounts.ACAccountStore.RequestAccess(Accounts.ACAccountType,Accounts.ACRequestCompletionHandler) -M:Accounts.ACAccountStore.RequestAccess(Accounts.ACAccountType,Foundation.NSDictionary,Accounts.ACRequestCompletionHandler) M:Accounts.ACAccountStore.RequestAccessAsync(Accounts.ACAccountType,Accounts.AccountStoreOptions) M:Accounts.ACAccountStore.RequestAccessAsync(Accounts.ACAccountType,Foundation.NSDictionary) M:Accounts.ACAccountStore.RequestAccessAsync(Accounts.ACAccountType) -M:Accounts.ACAccountStore.SaveAccount(Accounts.ACAccount,Accounts.ACAccountStoreSaveCompletionHandler) M:Accounts.ACAccountStore.SaveAccountAsync(Accounts.ACAccount) M:Accounts.ACAccountType.EncodeTo(Foundation.NSCoder) M:Accounts.AccountStoreOptions.#ctor @@ -22112,7 +22068,6 @@ M:AddressBookUI.IABPeoplePickerNavigationControllerDelegate.ShouldContinue(Addre M:AddressBookUI.IABPersonViewControllerDelegate.ShouldPerformDefaultActionForPerson(AddressBookUI.ABPersonViewController,AddressBook.ABPerson,System.Int32,System.Int32) M:AddressBookUI.IABUnknownPersonViewControllerDelegate.DidResolveToPerson(AddressBookUI.ABUnknownPersonViewController,AddressBook.ABPerson) M:AddressBookUI.IABUnknownPersonViewControllerDelegate.ShouldPerformDefaultActionForPerson(AddressBookUI.ABUnknownPersonViewController,AddressBook.ABPerson,System.Int32,System.Int32) -M:AdServices.AAAttribution.GetAttributionToken(Foundation.NSError@) M:AppClip.APActivationPayload.ConfirmAcquired(CoreLocation.CLRegion,System.Action{System.Boolean,Foundation.NSError}) M:AppClip.APActivationPayload.ConfirmAcquiredAsync(CoreLocation.CLRegion) M:AppClip.APActivationPayload.Copy(Foundation.NSZone) @@ -22948,34 +22903,7 @@ M:AppKit.NSAccessibility.SetMayContainProtectedContent(System.Boolean) M:AppKit.NSAccessibilityCustomAction.Dispose(System.Boolean) M:AppKit.NSAccessibilityCustomRotor.Dispose(System.Boolean) M:AppKit.NSAccessibilityCustomRotorItemResult.Dispose(System.Boolean) -M:AppKit.NSAccessibilityCustomRotorItemSearchDelegate.GetResult(AppKit.NSAccessibilityCustomRotor,AppKit.NSAccessibilityCustomRotorSearchParameters) -M:AppKit.NSAccessibilityElement.AccessibilityPerformCancel -M:AppKit.NSAccessibilityElement.AccessibilityPerformConfirm -M:AppKit.NSAccessibilityElement.AccessibilityPerformDecrement -M:AppKit.NSAccessibilityElement.AccessibilityPerformDelete -M:AppKit.NSAccessibilityElement.AccessibilityPerformIncrement -M:AppKit.NSAccessibilityElement.AccessibilityPerformPick -M:AppKit.NSAccessibilityElement.AccessibilityPerformPress -M:AppKit.NSAccessibilityElement.AccessibilityPerformRaise -M:AppKit.NSAccessibilityElement.AccessibilityPerformShowAlternateUI -M:AppKit.NSAccessibilityElement.AccessibilityPerformShowDefaultUI -M:AppKit.NSAccessibilityElement.AccessibilityPerformShowMenu M:AppKit.NSAccessibilityElement.Dispose(System.Boolean) -M:AppKit.NSAccessibilityElement.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSAccessibilityElement.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSAccessibilityElement.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSAccessibilityElement.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSAccessibilityElement.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSAccessibilityElement.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSAccessibilityElement.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSAccessibilityElement.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSAccessibilityElement.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSAccessibilityElement.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSAccessibilityElement.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSAccessibilityElement.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSAccessibilityElement.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSAccessibilityElement.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSAccessibilityElement.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSAccessibilityElementLoading_Extensions.GetAccessibilityRangeInTargetElement(AppKit.INSAccessibilityElementLoading,Foundation.INSSecureCoding) M:AppKit.NSAccessibilityElementProtocol_Extensions.GetAccessibilityFocused(AppKit.INSAccessibilityElementProtocol) M:AppKit.NSAccessibilityElementProtocol_Extensions.GetAccessibilityIdentifier(AppKit.INSAccessibilityElementProtocol) @@ -22997,8 +22925,6 @@ M:AppKit.NSAccessibilityTable_Extensions.GetAccessibilityVisibleCells(AppKit.INS M:AppKit.NSAccessibilityTable_Extensions.GetAccessibilityVisibleColumns(AppKit.INSAccessibilityTable) M:AppKit.NSAccessibilityTable_Extensions.GetAccessibilityVisibleRows(AppKit.INSAccessibilityTable) M:AppKit.NSAccessibilityTable_Extensions.SetAccessibilitySelectedRows(AppKit.INSAccessibilityTable,AppKit.INSAccessibilityRow[]) -M:AppKit.NSActionCell.#ctor(AppKit.NSImage) -M:AppKit.NSActionCell.#ctor(System.String) M:AppKit.NSActionCell.add_Activated(System.EventHandler) M:AppKit.NSActionCell.Dispose(System.Boolean) M:AppKit.NSActionCell.remove_Activated(System.EventHandler) @@ -23014,7 +22940,6 @@ M:AppKit.NSAlert.Dispose(System.Boolean) M:AppKit.NSAlert.RunSheetModal(AppKit.NSWindow,AppKit.NSApplication) M:AppKit.NSAlert.RunSheetModal(AppKit.NSWindow) M:AppKit.NSAlertDelegate_Extensions.ShowHelp(AppKit.INSAlertDelegate,AppKit.NSAlert) -M:AppKit.NSAlertDelegate.ShowHelp(AppKit.NSAlert) M:AppKit.NSAnimation.add_AnimationDidEnd(System.EventHandler) M:AppKit.NSAnimation.add_AnimationDidReachProgressMark(System.EventHandler{AppKit.NSAnimationEventArgs}) M:AppKit.NSAnimation.add_AnimationDidStop(System.EventHandler) @@ -23030,11 +22955,6 @@ M:AppKit.NSAnimationDelegate_Extensions.AnimationDidReachProgressMark(AppKit.INS M:AppKit.NSAnimationDelegate_Extensions.AnimationDidStop(AppKit.INSAnimationDelegate,AppKit.NSAnimation) M:AppKit.NSAnimationDelegate_Extensions.AnimationShouldStart(AppKit.INSAnimationDelegate,AppKit.NSAnimation) M:AppKit.NSAnimationDelegate_Extensions.ComputeAnimationCurve(AppKit.INSAnimationDelegate,AppKit.NSAnimation,System.Single) -M:AppKit.NSAnimationDelegate.AnimationDidEnd(AppKit.NSAnimation) -M:AppKit.NSAnimationDelegate.AnimationDidReachProgressMark(AppKit.NSAnimation,System.Single) -M:AppKit.NSAnimationDelegate.AnimationDidStop(AppKit.NSAnimation) -M:AppKit.NSAnimationDelegate.AnimationShouldStart(AppKit.NSAnimation) -M:AppKit.NSAnimationDelegate.ComputeAnimationCurve(AppKit.NSAnimation,System.Single) M:AppKit.NSAnimationEventArgs.#ctor(System.Single) M:AppKit.NSAnimationProgressMarkEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSAppearance.EncodeTo(Foundation.NSCoder) @@ -23044,17 +22964,6 @@ M:AppKit.NSApplication_NSStandardAboutPanel.OrderFrontStandardAboutPanelWithOpti M:AppKit.NSApplication_NSTouchBarCustomization.GetAutomaticCustomizeTouchBarMenuItemEnabled(AppKit.NSApplication) M:AppKit.NSApplication_NSTouchBarCustomization.SetAutomaticCustomizeTouchBarMenuItemEnabled(AppKit.NSApplication,System.Boolean) M:AppKit.NSApplication_NSTouchBarCustomization.ToggleTouchBarCustomizationPalette(AppKit.NSApplication,Foundation.NSObject) -M:AppKit.NSApplication.AccessibilityPerformCancel -M:AppKit.NSApplication.AccessibilityPerformConfirm -M:AppKit.NSApplication.AccessibilityPerformDecrement -M:AppKit.NSApplication.AccessibilityPerformDelete -M:AppKit.NSApplication.AccessibilityPerformIncrement -M:AppKit.NSApplication.AccessibilityPerformPick -M:AppKit.NSApplication.AccessibilityPerformPress -M:AppKit.NSApplication.AccessibilityPerformRaise -M:AppKit.NSApplication.AccessibilityPerformShowAlternateUI -M:AppKit.NSApplication.AccessibilityPerformShowDefaultUI -M:AppKit.NSApplication.AccessibilityPerformShowMenu M:AppKit.NSApplication.add_DecodedRestorableState(System.EventHandler{AppKit.NSCoderEventArgs}) M:AppKit.NSApplication.add_DidBecomeActive(System.EventHandler) M:AppKit.NSApplication.add_DidFinishLaunching(System.EventHandler) @@ -23088,23 +22997,8 @@ M:AppKit.NSApplication.Dispose(System.Boolean) M:AppKit.NSApplication.EnsureDelegateAssignIsNotOverwritingInternalDelegate(System.Object,System.Object,System.Type) M:AppKit.NSApplication.EnsureEventAndDelegateAreNotMismatched(System.Object,System.Type) M:AppKit.NSApplication.EnsureUIThread -M:AppKit.NSApplication.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSApplication.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSApplication.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSApplication.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSApplication.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSApplication.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSApplication.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSApplication.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSApplication.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSApplication.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSApplication.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSApplication.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSApplication.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSApplication.GetAccessibilityStyleRange(System.IntPtr) M:AppKit.NSApplication.Init M:AppKit.NSApplication.InitDrawingBridge -M:AppKit.NSApplication.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSApplication.Main(System.String[]) M:AppKit.NSApplication.NextEvent(AppKit.NSEventMask,Foundation.NSDate,Foundation.NSRunLoopMode,System.Boolean) M:AppKit.NSApplication.remove_DecodedRestorableState(System.EventHandler{AppKit.NSCoderEventArgs}) @@ -23133,8 +23027,6 @@ M:AppKit.NSApplication.remove_WillResignActive(System.EventHandler) M:AppKit.NSApplication.remove_WillTerminate(System.EventHandler) M:AppKit.NSApplication.remove_WillUnhide(System.EventHandler) M:AppKit.NSApplication.remove_WillUpdate(System.EventHandler) -M:AppKit.NSApplication.ValidateMenuItem(AppKit.NSMenuItem) -M:AppKit.NSApplication.ValidateUserInterfaceItem(AppKit.INSValidatedUserInterfaceItem) M:AppKit.NSApplicationDelegate_Extensions.ApplicationDockMenu(AppKit.INSApplicationDelegate,AppKit.NSApplication) M:AppKit.NSApplicationDelegate_Extensions.ApplicationOpenUntitledFile(AppKit.INSApplicationDelegate,AppKit.NSApplication) M:AppKit.NSApplicationDelegate_Extensions.ApplicationShouldHandleReopen(AppKit.INSApplicationDelegate,AppKit.NSApplication,System.Boolean) @@ -23179,50 +23071,6 @@ M:AppKit.NSApplicationDelegate_Extensions.WillResignActive(AppKit.INSApplication M:AppKit.NSApplicationDelegate_Extensions.WillTerminate(AppKit.INSApplicationDelegate,Foundation.NSNotification) M:AppKit.NSApplicationDelegate_Extensions.WillUnhide(AppKit.INSApplicationDelegate,Foundation.NSNotification) M:AppKit.NSApplicationDelegate_Extensions.WillUpdate(AppKit.INSApplicationDelegate,Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.ApplicationDockMenu(AppKit.NSApplication) -M:AppKit.NSApplicationDelegate.ApplicationOpenUntitledFile(AppKit.NSApplication) -M:AppKit.NSApplicationDelegate.ApplicationShouldHandleReopen(AppKit.NSApplication,System.Boolean) -M:AppKit.NSApplicationDelegate.ApplicationShouldOpenUntitledFile(AppKit.NSApplication) -M:AppKit.NSApplicationDelegate.ApplicationShouldTerminate(AppKit.NSApplication) -M:AppKit.NSApplicationDelegate.ApplicationShouldTerminateAfterLastWindowClosed(AppKit.NSApplication) -M:AppKit.NSApplicationDelegate.ContinueUserActivity(AppKit.NSApplication,Foundation.NSUserActivity,AppKit.ContinueUserActivityRestorationHandler) -M:AppKit.NSApplicationDelegate.DecodedRestorableState(AppKit.NSApplication,Foundation.NSCoder) -M:AppKit.NSApplicationDelegate.DidBecomeActive(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.DidFinishLaunching(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.DidHide(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.DidResignActive(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.DidUnhide(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.DidUpdate(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.FailedToContinueUserActivity(AppKit.NSApplication,System.String,Foundation.NSError) -M:AppKit.NSApplicationDelegate.FailedToRegisterForRemoteNotifications(AppKit.NSApplication,Foundation.NSError) -M:AppKit.NSApplicationDelegate.GetHandler(AppKit.NSApplication,Intents.INIntent) -M:AppKit.NSApplicationDelegate.HandlesKey(AppKit.NSApplication,System.String) -M:AppKit.NSApplicationDelegate.OpenFile(AppKit.NSApplication,System.String) -M:AppKit.NSApplicationDelegate.OpenFiles(AppKit.NSApplication,System.String[]) -M:AppKit.NSApplicationDelegate.OpenFileWithoutUI(Foundation.NSObject,System.String) -M:AppKit.NSApplicationDelegate.OpenTempFile(AppKit.NSApplication,System.String) -M:AppKit.NSApplicationDelegate.OpenUrls(AppKit.NSApplication,Foundation.NSUrl[]) -M:AppKit.NSApplicationDelegate.PrintFile(AppKit.NSApplication,System.String) -M:AppKit.NSApplicationDelegate.PrintFiles(AppKit.NSApplication,System.String[],Foundation.NSDictionary,System.Boolean) -M:AppKit.NSApplicationDelegate.ProtectedDataDidBecomeAvailable(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.ProtectedDataWillBecomeUnavailable(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.ReceivedRemoteNotification(AppKit.NSApplication,Foundation.NSDictionary) -M:AppKit.NSApplicationDelegate.RegisteredForRemoteNotifications(AppKit.NSApplication,Foundation.NSData) -M:AppKit.NSApplicationDelegate.ScreenParametersChanged(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.ShouldAutomaticallyLocalizeKeyEquivalents(AppKit.NSApplication) -M:AppKit.NSApplicationDelegate.SupportsSecureRestorableState(AppKit.NSApplication) -M:AppKit.NSApplicationDelegate.UpdatedUserActivity(AppKit.NSApplication,Foundation.NSUserActivity) -M:AppKit.NSApplicationDelegate.UserDidAcceptCloudKitShare(AppKit.NSApplication,CloudKit.CKShareMetadata) -M:AppKit.NSApplicationDelegate.WillBecomeActive(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.WillContinueUserActivity(AppKit.NSApplication,System.String) -M:AppKit.NSApplicationDelegate.WillEncodeRestorableState(AppKit.NSApplication,Foundation.NSCoder) -M:AppKit.NSApplicationDelegate.WillFinishLaunching(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.WillHide(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.WillPresentError(AppKit.NSApplication,Foundation.NSError) -M:AppKit.NSApplicationDelegate.WillResignActive(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.WillTerminate(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.WillUnhide(Foundation.NSNotification) -M:AppKit.NSApplicationDelegate.WillUpdate(Foundation.NSNotification) M:AppKit.NSApplicationDidFinishLaunchingEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSApplicationFailedEventArgs.#ctor(System.String,Foundation.NSError) M:AppKit.NSApplicationFilesEventArgs.#ctor(System.String[]) @@ -23245,8 +23093,6 @@ M:AppKit.NSBezierPath.SetLineDash(System.Runtime.InteropServices.NFloat[],System M:AppKit.NSBitmapImageRep.EncodeTo(Foundation.NSCoder) M:AppKit.NSBitmapImageRep.IncrementalLoader M:AppKit.NSBitmapImageRep.RepresentationUsingTypeProperties(AppKit.NSBitmapImageFileType) -M:AppKit.NSBox.#ctor(CoreGraphics.CGRect) -M:AppKit.NSBrowser.#ctor(CoreGraphics.CGRect) M:AppKit.NSBrowser.add_DoubleClick(System.EventHandler) M:AppKit.NSBrowser.Dispose(System.Boolean) M:AppKit.NSBrowser.remove_DoubleClick(System.EventHandler) @@ -23283,119 +23129,33 @@ M:AppKit.NSBrowserDelegate_Extensions.ValidateDrop(AppKit.INSBrowserDelegate,App M:AppKit.NSBrowserDelegate_Extensions.WillDisplayCell(AppKit.INSBrowserDelegate,AppKit.NSBrowser,Foundation.NSObject,System.IntPtr,System.IntPtr) M:AppKit.NSBrowserDelegate_Extensions.WillScroll(AppKit.INSBrowserDelegate,AppKit.NSBrowser) M:AppKit.NSBrowserDelegate_Extensions.WriteRowsWithIndexesToPasteboard(AppKit.INSBrowserDelegate,AppKit.NSBrowser,Foundation.NSIndexSet,System.IntPtr,AppKit.NSPasteboard) -M:AppKit.NSBrowserDelegate.AcceptDrop(AppKit.NSBrowser,AppKit.INSDraggingInfo,System.IntPtr,System.IntPtr,AppKit.NSBrowserDropOperation) -M:AppKit.NSBrowserDelegate.CanDragRowsWithIndexes(AppKit.NSBrowser,Foundation.NSIndexSet,System.IntPtr,AppKit.NSEvent) -M:AppKit.NSBrowserDelegate.ColumnConfigurationDidChange(Foundation.NSNotification) -M:AppKit.NSBrowserDelegate.ColumnTitle(AppKit.NSBrowser,System.IntPtr) -M:AppKit.NSBrowserDelegate.CountChildren(AppKit.NSBrowser,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.CreateRowsForColumn(AppKit.NSBrowser,System.IntPtr,AppKit.NSMatrix) -M:AppKit.NSBrowserDelegate.DidChangeLastColumn(AppKit.NSBrowser,System.IntPtr,System.IntPtr) -M:AppKit.NSBrowserDelegate.DidScroll(AppKit.NSBrowser) -M:AppKit.NSBrowserDelegate.GetChild(AppKit.NSBrowser,System.IntPtr,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.HeaderViewControllerForItem(AppKit.NSBrowser,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.IsColumnValid(AppKit.NSBrowser,System.IntPtr) -M:AppKit.NSBrowserDelegate.IsLeafItem(AppKit.NSBrowser,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.NextTypeSelectMatch(AppKit.NSBrowser,System.IntPtr,System.IntPtr,System.IntPtr,System.String) -M:AppKit.NSBrowserDelegate.ObjectValueForItem(AppKit.NSBrowser,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.PreviewViewControllerForLeafItem(AppKit.NSBrowser,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.PromisedFilesDroppedAtDestination(AppKit.NSBrowser,Foundation.NSUrl,Foundation.NSIndexSet,System.IntPtr) -M:AppKit.NSBrowserDelegate.RootItemForBrowser(AppKit.NSBrowser) -M:AppKit.NSBrowserDelegate.RowHeight(AppKit.NSBrowser,System.IntPtr,System.IntPtr) -M:AppKit.NSBrowserDelegate.RowsInColumn(AppKit.NSBrowser,System.IntPtr) -M:AppKit.NSBrowserDelegate.SelectCellWithString(AppKit.NSBrowser,System.String,System.IntPtr) -M:AppKit.NSBrowserDelegate.SelectionIndexesForProposedSelection(AppKit.NSBrowser,Foundation.NSIndexSet,System.IntPtr) -M:AppKit.NSBrowserDelegate.SelectRowInColumn(AppKit.NSBrowser,System.IntPtr,System.IntPtr) -M:AppKit.NSBrowserDelegate.SetObjectValue(AppKit.NSBrowser,Foundation.NSObject,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.ShouldEditItem(AppKit.NSBrowser,Foundation.NSObject) -M:AppKit.NSBrowserDelegate.ShouldShowCellExpansion(AppKit.NSBrowser,System.IntPtr,System.IntPtr) -M:AppKit.NSBrowserDelegate.ShouldSizeColumn(AppKit.NSBrowser,System.IntPtr,System.Boolean,System.Runtime.InteropServices.NFloat) -M:AppKit.NSBrowserDelegate.ShouldTypeSelectForEvent(AppKit.NSBrowser,AppKit.NSEvent,System.String) -M:AppKit.NSBrowserDelegate.SizeToFitWidth(AppKit.NSBrowser,System.IntPtr) -M:AppKit.NSBrowserDelegate.TypeSelectString(AppKit.NSBrowser,System.IntPtr,System.IntPtr) -M:AppKit.NSBrowserDelegate.ValidateDrop(AppKit.NSBrowser,AppKit.INSDraggingInfo,System.IntPtr@,System.IntPtr@,AppKit.NSBrowserDropOperation@) -M:AppKit.NSBrowserDelegate.WillDisplayCell(AppKit.NSBrowser,Foundation.NSObject,System.IntPtr,System.IntPtr) -M:AppKit.NSBrowserDelegate.WillScroll(AppKit.NSBrowser) -M:AppKit.NSBrowserDelegate.WriteRowsWithIndexesToPasteboard(AppKit.NSBrowser,Foundation.NSIndexSet,System.IntPtr,AppKit.NSPasteboard) -M:AppKit.NSButton.#ctor(CoreGraphics.CGRect) -M:AppKit.NSButton.AccessibilityPerformPress M:AppKit.NSButton.CreateButton(AppKit.NSImage,System.Action) M:AppKit.NSButton.CreateButton(System.String,AppKit.NSImage,System.Action) M:AppKit.NSButton.CreateButton(System.String,System.Action) M:AppKit.NSButton.CreateCheckbox(System.String,System.Action) M:AppKit.NSButton.CreateRadioButton(System.String,System.Action) M:AppKit.NSButton.Dispose(System.Boolean) -M:AppKit.NSButton.ValidateUserInterfaceItem(AppKit.INSValidatedUserInterfaceItem) M:AppKit.NSButtonCell.SetFont(AppKit.NSFont) M:AppKit.NSButtonCell.SetGradientType(AppKit.NSGradientType) -M:AppKit.NSButtonTouchBarItem.#ctor(System.String) M:AppKit.NSButtonTouchBarItem.Dispose(System.Boolean) -M:AppKit.NSCandidateListTouchBarItem.#ctor(System.String) M:AppKit.NSCandidateListTouchBarItem.Dispose(System.Boolean) M:AppKit.NSCandidateListTouchBarItemDelegate_Extensions.BeginSelectingCandidate(AppKit.INSCandidateListTouchBarItemDelegate,AppKit.NSCandidateListTouchBarItem,System.IntPtr) M:AppKit.NSCandidateListTouchBarItemDelegate_Extensions.ChangedCandidateListVisibility(AppKit.INSCandidateListTouchBarItemDelegate,AppKit.NSCandidateListTouchBarItem,System.Boolean) M:AppKit.NSCandidateListTouchBarItemDelegate_Extensions.ChangeSelectionFromCandidate(AppKit.INSCandidateListTouchBarItemDelegate,AppKit.NSCandidateListTouchBarItem,System.IntPtr,System.IntPtr) M:AppKit.NSCandidateListTouchBarItemDelegate_Extensions.EndSelectingCandidate(AppKit.INSCandidateListTouchBarItemDelegate,AppKit.NSCandidateListTouchBarItem,System.IntPtr) -M:AppKit.NSCandidateListTouchBarItemDelegate.BeginSelectingCandidate(AppKit.NSCandidateListTouchBarItem,System.IntPtr) -M:AppKit.NSCandidateListTouchBarItemDelegate.ChangedCandidateListVisibility(AppKit.NSCandidateListTouchBarItem,System.Boolean) -M:AppKit.NSCandidateListTouchBarItemDelegate.ChangeSelectionFromCandidate(AppKit.NSCandidateListTouchBarItem,System.IntPtr,System.IntPtr) -M:AppKit.NSCandidateListTouchBarItemDelegate.EndSelectingCandidate(AppKit.NSCandidateListTouchBarItem,System.IntPtr) -M:AppKit.NSCell.AccessibilityPerformAction(Foundation.NSString) -M:AppKit.NSCell.AccessibilityPerformCancel -M:AppKit.NSCell.AccessibilityPerformConfirm -M:AppKit.NSCell.AccessibilityPerformDecrement -M:AppKit.NSCell.AccessibilityPerformDelete -M:AppKit.NSCell.AccessibilityPerformIncrement -M:AppKit.NSCell.AccessibilityPerformPick -M:AppKit.NSCell.AccessibilityPerformPress -M:AppKit.NSCell.AccessibilityPerformRaise -M:AppKit.NSCell.AccessibilityPerformShowAlternateUI -M:AppKit.NSCell.AccessibilityPerformShowDefaultUI -M:AppKit.NSCell.AccessibilityPerformShowMenu M:AppKit.NSCell.Copy(Foundation.NSZone) M:AppKit.NSCell.Dispose(System.Boolean) M:AppKit.NSCell.DrawNinePartImage(CoreGraphics.CGRect,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,AppKit.NSCompositingOperation,System.Runtime.InteropServices.NFloat,System.Boolean) M:AppKit.NSCell.DrawThreePartImage(CoreGraphics.CGRect,AppKit.NSImage,AppKit.NSImage,AppKit.NSImage,System.Boolean,AppKit.NSCompositingOperation,System.Runtime.InteropServices.NFloat,System.Boolean) M:AppKit.NSCell.EncodeTo(Foundation.NSCoder) -M:AppKit.NSCell.GetAccessibilityActionDescription(Foundation.NSString) -M:AppKit.NSCell.GetAccessibilityArrayAttributeCount(Foundation.NSString) -M:AppKit.NSCell.GetAccessibilityArrayAttributeValues(Foundation.NSString,System.UIntPtr,System.UIntPtr) -M:AppKit.NSCell.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSCell.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSCell.GetAccessibilityFocusedUIElement -M:AppKit.NSCell.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSCell.GetAccessibilityHitTest(CoreGraphics.CGPoint) -M:AppKit.NSCell.GetAccessibilityIndexOfChild(Foundation.NSObject) -M:AppKit.NSCell.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSCell.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSCell.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSCell.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSCell.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSCell.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSCell.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSCell.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSCell.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSCell.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSCell.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSCell.GetAccessibilityValue(Foundation.NSString,Foundation.NSObject) -M:AppKit.NSCell.GetAccessibilityValue(Foundation.NSString) -M:AppKit.NSCell.IsAccessibilityAttributeSettable(Foundation.NSString) -M:AppKit.NSCell.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) -M:AppKit.NSCell.SetAccessibilityValue(Foundation.NSString,Foundation.NSObject) M:AppKit.NSCell.SetSendsActionOnEndEditing(System.Boolean) -M:AppKit.NSClickGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:AppKit.NSClickGestureRecognizer.#ctor(System.Action) M:AppKit.NSClickGestureRecognizer.#ctor(System.Action{AppKit.NSClickGestureRecognizer}) M:AppKit.NSClickGestureRecognizer.EncodeTo(Foundation.NSCoder) -M:AppKit.NSClipView.#ctor(CoreGraphics.CGRect) -M:AppKit.NSClipView.ScrollClipView(AppKit.NSClipView,CoreGraphics.CGPoint) M:AppKit.NSCloudSharingServiceDelegate_Extensions.Completed(AppKit.INSCloudSharingServiceDelegate,AppKit.NSSharingService,Foundation.NSObject[],Foundation.NSError) M:AppKit.NSCloudSharingServiceDelegate_Extensions.Options(AppKit.INSCloudSharingServiceDelegate,AppKit.NSSharingService,Foundation.NSItemProvider) M:AppKit.NSCloudSharingServiceDelegate_Extensions.Saved(AppKit.INSCloudSharingServiceDelegate,AppKit.NSSharingService,CloudKit.CKShare) M:AppKit.NSCloudSharingServiceDelegate_Extensions.Stopped(AppKit.INSCloudSharingServiceDelegate,AppKit.NSSharingService,CloudKit.CKShare) -M:AppKit.NSCloudSharingServiceDelegate.Completed(AppKit.NSSharingService,Foundation.NSObject[],Foundation.NSError) -M:AppKit.NSCloudSharingServiceDelegate.Options(AppKit.NSSharingService,Foundation.NSItemProvider) -M:AppKit.NSCloudSharingServiceDelegate.Saved(AppKit.NSSharingService,CloudKit.CKShare) -M:AppKit.NSCloudSharingServiceDelegate.Stopped(AppKit.NSSharingService,CloudKit.CKShare) M:AppKit.NSCoderAppKitAddons.DecodeNXColor(Foundation.NSCoder) M:AppKit.NSCoderEventArgs.#ctor(Foundation.NSCoder) M:AppKit.NSCollectionLayoutAnchor.Copy(Foundation.NSZone) @@ -23439,30 +23199,12 @@ M:AppKit.NSCollectionLayoutSpacing.CreateFlexible(System.Runtime.InteropServices M:AppKit.NSCollectionLayoutSupplementaryItem.Copy(Foundation.NSZone) M:AppKit.NSCollectionLayoutSupplementaryItem.Create(AppKit.NSCollectionLayoutSize,System.String,AppKit.NSCollectionLayoutAnchor,AppKit.NSCollectionLayoutAnchor) M:AppKit.NSCollectionLayoutSupplementaryItem.Create(AppKit.NSCollectionLayoutSize,System.String,AppKit.NSCollectionLayoutAnchor) -M:AppKit.NSCollectionView.#ctor(CoreGraphics.CGRect) -M:AppKit.NSCollectionView.ConcludeDragOperation(AppKit.INSDraggingInfo) M:AppKit.NSCollectionView.Dispose(System.Boolean) -M:AppKit.NSCollectionView.DraggedImageBeganAt(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSCollectionView.DraggedImageEndedAtDeposited(AppKit.NSImage,CoreGraphics.CGPoint,System.Boolean) -M:AppKit.NSCollectionView.DraggedImageEndedAtOperation(AppKit.NSImage,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSCollectionView.DraggedImageMovedTo(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSCollectionView.DraggingEnded(AppKit.INSDraggingInfo) -M:AppKit.NSCollectionView.DraggingEntered(AppKit.INSDraggingInfo) -M:AppKit.NSCollectionView.DraggingExited(AppKit.INSDraggingInfo) -M:AppKit.NSCollectionView.DraggingSourceOperationMaskForLocal(System.Boolean) -M:AppKit.NSCollectionView.DraggingUpdated(AppKit.INSDraggingInfo) -M:AppKit.NSCollectionView.NamesOfPromisedFilesDroppedAtDestination(Foundation.NSUrl) -M:AppKit.NSCollectionView.PerformDragOperation(AppKit.INSDraggingInfo) -M:AppKit.NSCollectionView.PrepareForDragOperation(AppKit.INSDraggingInfo) M:AppKit.NSCollectionView.RegisterClassForItem(System.Type,System.String) M:AppKit.NSCollectionView.RegisterClassForSupplementaryView(System.Type,Foundation.NSString,System.String) M:AppKit.NSCollectionViewCompositionalLayoutConfiguration.Copy(Foundation.NSZone) M:AppKit.NSCollectionViewDataSource_Extensions.GetNumberOfSections(AppKit.INSCollectionViewDataSource,AppKit.NSCollectionView) M:AppKit.NSCollectionViewDataSource_Extensions.GetView(AppKit.INSCollectionViewDataSource,AppKit.NSCollectionView,Foundation.NSString,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDataSource.GetItem(AppKit.NSCollectionView,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDataSource.GetNumberofItems(AppKit.NSCollectionView,System.IntPtr) -M:AppKit.NSCollectionViewDataSource.GetNumberOfSections(AppKit.NSCollectionView) -M:AppKit.NSCollectionViewDataSource.GetView(AppKit.NSCollectionView,Foundation.NSString,Foundation.NSIndexPath) M:AppKit.NSCollectionViewDelegate_Extensions.AcceptDrop(AppKit.INSCollectionViewDelegate,AppKit.NSCollectionView,AppKit.INSDraggingInfo,Foundation.NSIndexPath,AppKit.NSCollectionViewDropOperation) M:AppKit.NSCollectionViewDelegate_Extensions.AcceptDrop(AppKit.INSCollectionViewDelegate,AppKit.NSCollectionView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSCollectionViewDropOperation) M:AppKit.NSCollectionViewDelegate_Extensions.CanDragItems(AppKit.INSCollectionViewDelegate,AppKit.NSCollectionView,Foundation.NSIndexSet,AppKit.NSEvent) @@ -23491,89 +23233,17 @@ M:AppKit.NSCollectionViewDelegate_Extensions.WillDisplayItem(AppKit.INSCollectio M:AppKit.NSCollectionViewDelegate_Extensions.WillDisplaySupplementaryView(AppKit.INSCollectionViewDelegate,AppKit.NSCollectionView,AppKit.NSView,Foundation.NSString,Foundation.NSIndexPath) M:AppKit.NSCollectionViewDelegate_Extensions.WriteItems(AppKit.INSCollectionViewDelegate,AppKit.NSCollectionView,Foundation.NSIndexSet,AppKit.NSPasteboard) M:AppKit.NSCollectionViewDelegate_Extensions.WriteItems(AppKit.INSCollectionViewDelegate,AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSPasteboard) -M:AppKit.NSCollectionViewDelegate.AcceptDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,Foundation.NSIndexPath,AppKit.NSCollectionViewDropOperation) -M:AppKit.NSCollectionViewDelegate.AcceptDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSCollectionViewDropOperation) -M:AppKit.NSCollectionViewDelegate.CanDragItems(AppKit.NSCollectionView,Foundation.NSIndexSet,AppKit.NSEvent) -M:AppKit.NSCollectionViewDelegate.CanDragItems(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSEvent) -M:AppKit.NSCollectionViewDelegate.DisplayingItemEnded(AppKit.NSCollectionView,AppKit.NSCollectionViewItem,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegate.DisplayingSupplementaryViewEnded(AppKit.NSCollectionView,AppKit.NSView,System.String,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegate.DraggingSessionEnded(AppKit.NSCollectionView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSCollectionViewDelegate.DraggingSessionWillBegin(AppKit.NSCollectionView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSIndexSet) -M:AppKit.NSCollectionViewDelegate.DraggingSessionWillBegin(AppKit.NSCollectionView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegate.GetDraggingImage(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSEvent,CoreGraphics.CGPoint@) -M:AppKit.NSCollectionViewDelegate.GetNamesOfPromisedFiles(AppKit.NSCollectionView,Foundation.NSUrl,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegate.GetPasteboardWriter(AppKit.NSCollectionView,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegate.ItemsChanged(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSCollectionViewItemHighlightState) -M:AppKit.NSCollectionViewDelegate.ItemsDeselected(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegate.ItemsSelected(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegate.NamesOfPromisedFilesDroppedAtDestination(AppKit.NSCollectionView,Foundation.NSUrl,Foundation.NSIndexSet) -M:AppKit.NSCollectionViewDelegate.PasteboardWriterForItem(AppKit.NSCollectionView,System.UIntPtr) -M:AppKit.NSCollectionViewDelegate.ShouldChangeItems(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSCollectionViewItemHighlightState) -M:AppKit.NSCollectionViewDelegate.ShouldDeselectItems(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegate.ShouldSelectItems(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegate.TransitionLayout(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,AppKit.NSCollectionViewLayout) -M:AppKit.NSCollectionViewDelegate.UpdateDraggingItemsForDrag(AppKit.NSCollectionView,AppKit.INSDraggingInfo) -M:AppKit.NSCollectionViewDelegate.ValidateDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,Foundation.NSIndexPath@,AppKit.NSCollectionViewDropOperation@) -M:AppKit.NSCollectionViewDelegate.ValidateDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,System.IntPtr@,AppKit.NSCollectionViewDropOperation@) -M:AppKit.NSCollectionViewDelegate.WillDisplayItem(AppKit.NSCollectionView,AppKit.NSCollectionViewItem,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegate.WillDisplaySupplementaryView(AppKit.NSCollectionView,AppKit.NSView,Foundation.NSString,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegate.WriteItems(AppKit.NSCollectionView,Foundation.NSIndexSet,AppKit.NSPasteboard) -M:AppKit.NSCollectionViewDelegate.WriteItems(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSPasteboard) M:AppKit.NSCollectionViewDelegateFlowLayout_Extensions.InsetForSection(AppKit.INSCollectionViewDelegateFlowLayout,AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) M:AppKit.NSCollectionViewDelegateFlowLayout_Extensions.MinimumInteritemSpacingForSection(AppKit.INSCollectionViewDelegateFlowLayout,AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) M:AppKit.NSCollectionViewDelegateFlowLayout_Extensions.MinimumLineSpacing(AppKit.INSCollectionViewDelegateFlowLayout,AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) M:AppKit.NSCollectionViewDelegateFlowLayout_Extensions.ReferenceSizeForFooter(AppKit.INSCollectionViewDelegateFlowLayout,AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) M:AppKit.NSCollectionViewDelegateFlowLayout_Extensions.ReferenceSizeForHeader(AppKit.INSCollectionViewDelegateFlowLayout,AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) M:AppKit.NSCollectionViewDelegateFlowLayout_Extensions.SizeForItem(AppKit.INSCollectionViewDelegateFlowLayout,AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegateFlowLayout.AcceptDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,Foundation.NSIndexPath,AppKit.NSCollectionViewDropOperation) -M:AppKit.NSCollectionViewDelegateFlowLayout.AcceptDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSCollectionViewDropOperation) -M:AppKit.NSCollectionViewDelegateFlowLayout.CanDragItems(AppKit.NSCollectionView,Foundation.NSIndexSet,AppKit.NSEvent) -M:AppKit.NSCollectionViewDelegateFlowLayout.CanDragItems(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSEvent) -M:AppKit.NSCollectionViewDelegateFlowLayout.DisplayingItemEnded(AppKit.NSCollectionView,AppKit.NSCollectionViewItem,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegateFlowLayout.DisplayingSupplementaryViewEnded(AppKit.NSCollectionView,AppKit.NSView,System.String,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegateFlowLayout.DraggingSessionEnded(AppKit.NSCollectionView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSCollectionViewDelegateFlowLayout.DraggingSessionWillBegin(AppKit.NSCollectionView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSIndexSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.DraggingSessionWillBegin(AppKit.NSCollectionView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.GetDraggingImage(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSEvent,CoreGraphics.CGPoint@) -M:AppKit.NSCollectionViewDelegateFlowLayout.GetNamesOfPromisedFiles(AppKit.NSCollectionView,Foundation.NSUrl,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.GetPasteboardWriter(AppKit.NSCollectionView,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegateFlowLayout.InsetForSection(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) -M:AppKit.NSCollectionViewDelegateFlowLayout.ItemsChanged(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSCollectionViewItemHighlightState) -M:AppKit.NSCollectionViewDelegateFlowLayout.ItemsDeselected(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.ItemsSelected(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.MinimumInteritemSpacingForSection(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) -M:AppKit.NSCollectionViewDelegateFlowLayout.MinimumLineSpacing(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) -M:AppKit.NSCollectionViewDelegateFlowLayout.NamesOfPromisedFilesDroppedAtDestination(AppKit.NSCollectionView,Foundation.NSUrl,Foundation.NSIndexSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.PasteboardWriterForItem(AppKit.NSCollectionView,System.UIntPtr) -M:AppKit.NSCollectionViewDelegateFlowLayout.ReferenceSizeForFooter(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) -M:AppKit.NSCollectionViewDelegateFlowLayout.ReferenceSizeForHeader(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,System.IntPtr) -M:AppKit.NSCollectionViewDelegateFlowLayout.ShouldChangeItems(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSCollectionViewItemHighlightState) -M:AppKit.NSCollectionViewDelegateFlowLayout.ShouldDeselectItems(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.ShouldSelectItems(AppKit.NSCollectionView,Foundation.NSSet) -M:AppKit.NSCollectionViewDelegateFlowLayout.SizeForItem(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegateFlowLayout.TransitionLayout(AppKit.NSCollectionView,AppKit.NSCollectionViewLayout,AppKit.NSCollectionViewLayout) -M:AppKit.NSCollectionViewDelegateFlowLayout.UpdateDraggingItemsForDrag(AppKit.NSCollectionView,AppKit.INSDraggingInfo) -M:AppKit.NSCollectionViewDelegateFlowLayout.ValidateDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,Foundation.NSIndexPath@,AppKit.NSCollectionViewDropOperation@) -M:AppKit.NSCollectionViewDelegateFlowLayout.ValidateDrop(AppKit.NSCollectionView,AppKit.INSDraggingInfo,System.IntPtr@,AppKit.NSCollectionViewDropOperation@) -M:AppKit.NSCollectionViewDelegateFlowLayout.WillDisplayItem(AppKit.NSCollectionView,AppKit.NSCollectionViewItem,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegateFlowLayout.WillDisplaySupplementaryView(AppKit.NSCollectionView,AppKit.NSView,Foundation.NSString,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDelegateFlowLayout.WriteItems(AppKit.NSCollectionView,Foundation.NSIndexSet,AppKit.NSPasteboard) -M:AppKit.NSCollectionViewDelegateFlowLayout.WriteItems(AppKit.NSCollectionView,Foundation.NSSet,AppKit.NSPasteboard) -M:AppKit.NSCollectionViewDiffableDataSource`2.GetItem(AppKit.NSCollectionView,Foundation.NSIndexPath) -M:AppKit.NSCollectionViewDiffableDataSource`2.GetNumberofItems(AppKit.NSCollectionView,System.IntPtr) -M:AppKit.NSCollectionViewDiffableDataSource`2.GetNumberOfSections(AppKit.NSCollectionView) -M:AppKit.NSCollectionViewDiffableDataSource`2.GetView(AppKit.NSCollectionView,Foundation.NSString,Foundation.NSIndexPath) M:AppKit.NSCollectionViewElement_Extensions.ApplyLayoutAttributes(AppKit.INSCollectionViewElement,AppKit.NSCollectionViewLayoutAttributes) M:AppKit.NSCollectionViewElement_Extensions.DidTransition(AppKit.INSCollectionViewElement,AppKit.NSCollectionViewLayout,AppKit.NSCollectionViewLayout) M:AppKit.NSCollectionViewElement_Extensions.GetPreferredLayoutAttributes(AppKit.INSCollectionViewElement,AppKit.NSCollectionViewLayoutAttributes) M:AppKit.NSCollectionViewElement_Extensions.PrepareForReuse(AppKit.INSCollectionViewElement) M:AppKit.NSCollectionViewElement_Extensions.WillTransition(AppKit.INSCollectionViewElement,AppKit.NSCollectionViewLayout,AppKit.NSCollectionViewLayout) -M:AppKit.NSCollectionViewElement.ApplyLayoutAttributes(AppKit.NSCollectionViewLayoutAttributes) -M:AppKit.NSCollectionViewElement.DidTransition(AppKit.NSCollectionViewLayout,AppKit.NSCollectionViewLayout) -M:AppKit.NSCollectionViewElement.GetPreferredLayoutAttributes(AppKit.NSCollectionViewLayoutAttributes) -M:AppKit.NSCollectionViewElement.PrepareForReuse -M:AppKit.NSCollectionViewElement.WillTransition(AppKit.NSCollectionViewLayout,AppKit.NSCollectionViewLayout) -M:AppKit.NSCollectionViewItem.#ctor(System.String,Foundation.NSBundle) M:AppKit.NSCollectionViewItem.Copy(Foundation.NSZone) M:AppKit.NSCollectionViewItem.Dispose(System.Boolean) M:AppKit.NSCollectionViewLayout.Dispose(System.Boolean) @@ -23622,21 +23292,13 @@ M:AppKit.NSColor.FromRgb(System.Runtime.InteropServices.NFloat,System.Runtime.In M:AppKit.NSColor.FromRgba(System.Byte,System.Byte,System.Byte,System.Byte) M:AppKit.NSColor.FromRgba(System.Int32,System.Int32,System.Int32,System.Int32) M:AppKit.NSColor.GetComponents(System.Runtime.InteropServices.NFloat[]@) -M:AppKit.NSColor.GetPasteboardPropertyListForType(System.String) -M:AppKit.NSColor.GetReadableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSColor.GetReadingOptionsForType(System.String,AppKit.NSPasteboard) -M:AppKit.NSColor.GetWritableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSColor.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) M:AppKit.NSColor.ToString M:AppKit.NSColorList.EncodeTo(Foundation.NSCoder) -M:AppKit.NSColorPickerTouchBarItem.#ctor(System.String) M:AppKit.NSColorPickerTouchBarItem.add_Activated(System.EventHandler) M:AppKit.NSColorPickerTouchBarItem.Dispose(System.Boolean) M:AppKit.NSColorPickerTouchBarItem.remove_Activated(System.EventHandler) M:AppKit.NSColorSpace.EncodeTo(Foundation.NSCoder) -M:AppKit.NSColorWell.#ctor(CoreGraphics.CGRect) M:AppKit.NSColorWell.Dispose(System.Boolean) -M:AppKit.NSComboBox.#ctor(CoreGraphics.CGRect) M:AppKit.NSComboBox.add_SelectionChanged(System.EventHandler) M:AppKit.NSComboBox.add_SelectionIsChanging(System.EventHandler) M:AppKit.NSComboBox.add_WillDismiss(System.EventHandler) @@ -23646,37 +23308,22 @@ M:AppKit.NSComboBox.remove_SelectionChanged(System.EventHandler) M:AppKit.NSComboBox.remove_SelectionIsChanging(System.EventHandler) M:AppKit.NSComboBox.remove_WillDismiss(System.EventHandler) M:AppKit.NSComboBox.remove_WillPopUp(System.EventHandler) -M:AppKit.NSComboBoxCell.#ctor(System.String) M:AppKit.NSComboBoxCell.Dispose(System.Boolean) M:AppKit.NSComboBoxCellDataSource_Extensions.CompletedString(AppKit.INSComboBoxCellDataSource,AppKit.NSComboBoxCell,System.String) M:AppKit.NSComboBoxCellDataSource_Extensions.IndexOfItem(AppKit.INSComboBoxCellDataSource,AppKit.NSComboBoxCell,System.String) M:AppKit.NSComboBoxCellDataSource_Extensions.ItemCount(AppKit.INSComboBoxCellDataSource,AppKit.NSComboBoxCell) M:AppKit.NSComboBoxCellDataSource_Extensions.ObjectValueForItem(AppKit.INSComboBoxCellDataSource,AppKit.NSComboBoxCell,System.IntPtr) -M:AppKit.NSComboBoxCellDataSource.CompletedString(AppKit.NSComboBoxCell,System.String) -M:AppKit.NSComboBoxCellDataSource.IndexOfItem(AppKit.NSComboBoxCell,System.String) -M:AppKit.NSComboBoxCellDataSource.ItemCount(AppKit.NSComboBoxCell) -M:AppKit.NSComboBoxCellDataSource.ObjectValueForItem(AppKit.NSComboBoxCell,System.IntPtr) M:AppKit.NSComboBoxDataSource_Extensions.CompletedString(AppKit.INSComboBoxDataSource,AppKit.NSComboBox,System.String) M:AppKit.NSComboBoxDataSource_Extensions.IndexOfItem(AppKit.INSComboBoxDataSource,AppKit.NSComboBox,System.String) M:AppKit.NSComboBoxDataSource_Extensions.ItemCount(AppKit.INSComboBoxDataSource,AppKit.NSComboBox) M:AppKit.NSComboBoxDataSource_Extensions.ObjectValueForItem(AppKit.INSComboBoxDataSource,AppKit.NSComboBox,System.IntPtr) -M:AppKit.NSComboBoxDataSource.CompletedString(AppKit.NSComboBox,System.String) -M:AppKit.NSComboBoxDataSource.IndexOfItem(AppKit.NSComboBox,System.String) -M:AppKit.NSComboBoxDataSource.ItemCount(AppKit.NSComboBox) -M:AppKit.NSComboBoxDataSource.ObjectValueForItem(AppKit.NSComboBox,System.IntPtr) M:AppKit.NSComboBoxDelegate_Extensions.SelectionChanged(AppKit.INSComboBoxDelegate,Foundation.NSNotification) M:AppKit.NSComboBoxDelegate_Extensions.SelectionIsChanging(AppKit.INSComboBoxDelegate,Foundation.NSNotification) M:AppKit.NSComboBoxDelegate_Extensions.WillDismiss(AppKit.INSComboBoxDelegate,Foundation.NSNotification) M:AppKit.NSComboBoxDelegate_Extensions.WillPopUp(AppKit.INSComboBoxDelegate,Foundation.NSNotification) -M:AppKit.NSComboBoxDelegate.SelectionChanged(Foundation.NSNotification) -M:AppKit.NSComboBoxDelegate.SelectionIsChanging(Foundation.NSNotification) -M:AppKit.NSComboBoxDelegate.WillDismiss(Foundation.NSNotification) -M:AppKit.NSComboBoxDelegate.WillPopUp(Foundation.NSNotification) -M:AppKit.NSComboButton.#ctor(CoreGraphics.CGRect) M:AppKit.NSControl.add_Activated(System.EventHandler) M:AppKit.NSControl.Dispose(System.Boolean) M:AppKit.NSControl.remove_Activated(System.EventHandler) -M:AppKit.NSController.CommitEditing(Foundation.NSError@) M:AppKit.NSController.EncodeTo(Foundation.NSCoder) M:AppKit.NSControlTextEditingDelegate_Extensions.ControlTextDidBeginEditing(AppKit.INSControlTextEditingDelegate,Foundation.NSNotification) M:AppKit.NSControlTextEditingDelegate_Extensions.ControlTextDidChange(AppKit.INSControlTextEditingDelegate,Foundation.NSNotification) @@ -23688,37 +23335,22 @@ M:AppKit.NSControlTextEditingDelegate_Extensions.GetCompletions(AppKit.INSContro M:AppKit.NSControlTextEditingDelegate_Extensions.IsValidObject(AppKit.INSControlTextEditingDelegate,AppKit.NSControl,Foundation.NSObject) M:AppKit.NSControlTextEditingDelegate_Extensions.TextShouldBeginEditing(AppKit.INSControlTextEditingDelegate,AppKit.NSControl,AppKit.NSText) M:AppKit.NSControlTextEditingDelegate_Extensions.TextShouldEndEditing(AppKit.INSControlTextEditingDelegate,AppKit.NSControl,AppKit.NSText) -M:AppKit.NSControlTextEditingDelegate.ControlTextDidBeginEditing(Foundation.NSNotification) -M:AppKit.NSControlTextEditingDelegate.ControlTextDidChange(Foundation.NSNotification) -M:AppKit.NSControlTextEditingDelegate.ControlTextDidEndEditing(Foundation.NSNotification) -M:AppKit.NSControlTextEditingDelegate.DidFailToFormatString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSControlTextEditingDelegate.DidFailToValidatePartialString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSControlTextEditingDelegate.DoCommandBySelector(AppKit.NSControl,AppKit.NSTextView,ObjCRuntime.Selector) -M:AppKit.NSControlTextEditingDelegate.GetCompletions(AppKit.NSControl,AppKit.NSTextView,System.String[],Foundation.NSRange,System.IntPtr@) -M:AppKit.NSControlTextEditingDelegate.IsValidObject(AppKit.NSControl,Foundation.NSObject) -M:AppKit.NSControlTextEditingDelegate.TextShouldBeginEditing(AppKit.NSControl,AppKit.NSText) -M:AppKit.NSControlTextEditingDelegate.TextShouldEndEditing(AppKit.NSControl,AppKit.NSText) M:AppKit.NSControlTextEditingEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSControlTextErrorEventArgs.#ctor(System.String,System.String) M:AppKit.NSCursor.EncodeTo(Foundation.NSCoder) M:AppKit.NSCursor.IsSetOnMouseEntered M:AppKit.NSCursor.IsSetOnMouseExited M:AppKit.NSCustomImageRep.Dispose(System.Boolean) -M:AppKit.NSCustomTouchBarItem.#ctor(System.String) M:AppKit.NSDataAsset.#ctor(System.String,Foundation.NSBundle) -M:AppKit.NSDataAsset.#ctor(System.String) M:AppKit.NSDataAsset.Copy(Foundation.NSZone) M:AppKit.NSDataEventArgs.#ctor(Foundation.NSData) -M:AppKit.NSDatePicker.#ctor(CoreGraphics.CGRect) M:AppKit.NSDatePicker.add_ValidateProposedDateValue(System.EventHandler{AppKit.NSDatePickerValidatorEventArgs}) M:AppKit.NSDatePicker.Dispose(System.Boolean) M:AppKit.NSDatePicker.remove_ValidateProposedDateValue(System.EventHandler{AppKit.NSDatePickerValidatorEventArgs}) -M:AppKit.NSDatePickerCell.#ctor(AppKit.NSImage) M:AppKit.NSDatePickerCell.add_ValidateProposedDateValue(System.EventHandler{AppKit.NSDatePickerValidatorEventArgs}) M:AppKit.NSDatePickerCell.Dispose(System.Boolean) M:AppKit.NSDatePickerCell.remove_ValidateProposedDateValue(System.EventHandler{AppKit.NSDatePickerValidatorEventArgs}) M:AppKit.NSDatePickerCellDelegate_Extensions.ValidateProposedDateValue(AppKit.INSDatePickerCellDelegate,AppKit.NSDatePickerCell,Foundation.NSDate@,System.Double) -M:AppKit.NSDatePickerCellDelegate.ValidateProposedDateValue(AppKit.NSDatePickerCell,Foundation.NSDate@,System.Double) M:AppKit.NSDatePickerValidatorEventArgs.#ctor(Foundation.NSDate,System.Double) M:AppKit.NSDictionaryEventArgs.#ctor(Foundation.NSDictionary) M:AppKit.NSDiffableDataSourceSnapshot`2.AppendItems(`1[],`0) @@ -23731,7 +23363,6 @@ M:AppKit.NSDiffableDataSourceSnapshot`2.DeleteSections(`0[]) M:AppKit.NSDiffableDataSourceSnapshot`2.GetIndex(`0) M:AppKit.NSDiffableDataSourceSnapshot`2.GetIndex(`1) M:AppKit.NSDiffableDataSourceSnapshot`2.GetItemIdentifiersInSection(`0) -M:AppKit.NSDiffableDataSourceSnapshot`2.GetNumberOfItems(`0) M:AppKit.NSDiffableDataSourceSnapshot`2.GetSectionIdentifierForSection(`1) M:AppKit.NSDiffableDataSourceSnapshot`2.InsertItemsAfter(`1[],`1) M:AppKit.NSDiffableDataSourceSnapshot`2.InsertItemsBefore(`1[],`1) @@ -23751,26 +23382,18 @@ M:AppKit.NSDirectionalEdgeInsets.GetHashCode M:AppKit.NSDirectionalEdgeInsets.op_Equality(AppKit.NSDirectionalEdgeInsets,AppKit.NSDirectionalEdgeInsets) M:AppKit.NSDirectionalEdgeInsets.op_Inequality(AppKit.NSDirectionalEdgeInsets,AppKit.NSDirectionalEdgeInsets) M:AppKit.NSDockTilePlugIn_Extensions.DockMenu(AppKit.INSDockTilePlugIn) -M:AppKit.NSDockTilePlugIn.DockMenu -M:AppKit.NSDockTilePlugIn.SetDockTile(AppKit.NSDockTile) M:AppKit.NSDocument.AccommodatePresentedItemEviction(System.Action{Foundation.NSError}) M:AppKit.NSDocument.AccommodatePresentedSubitemDeletion(Foundation.NSUrl,System.Action{Foundation.NSError}) M:AppKit.NSDocument.DuplicateDocument(AppKit.NSDocument.DuplicateCallback) -M:AppKit.NSDocument.ObjectDidBeginEditing(AppKit.INSEditor) -M:AppKit.NSDocument.ObjectDidEndEditing(AppKit.INSEditor) M:AppKit.NSDocument.PresentedSubitemAppeared(Foundation.NSUrl) M:AppKit.NSDocument.PresentedSubitemChanged(Foundation.NSUrl) M:AppKit.NSDocument.PresentedSubitemGainedVersion(Foundation.NSUrl,Foundation.NSFileVersion) M:AppKit.NSDocument.PresentedSubitemLostVersion(Foundation.NSUrl,Foundation.NSFileVersion) M:AppKit.NSDocument.PresentedSubitemMoved(Foundation.NSUrl,Foundation.NSUrl) M:AppKit.NSDocument.PresentedSubitemResolvedConflictVersion(Foundation.NSUrl,Foundation.NSFileVersion) -M:AppKit.NSDocument.RestoreUserActivityState(Foundation.NSUserActivity) M:AppKit.NSDocument.ShareDocumentAsync(AppKit.NSSharingService) M:AppKit.NSDocument.StopBrowsingVersionsAsync -M:AppKit.NSDocument.ValidateMenuItem(AppKit.NSMenuItem) M:AppKit.NSDocumentController.EncodeTo(Foundation.NSCoder) -M:AppKit.NSDocumentController.RestoreWindow(System.String,Foundation.NSCoder,AppKit.NSWindowCompletionHandler) -M:AppKit.NSDocumentController.ValidateMenuItem(AppKit.NSMenuItem) M:AppKit.NSDraggingDestination_Extensions.ConcludeDragOperation(AppKit.INSDraggingDestination,AppKit.INSDraggingInfo) M:AppKit.NSDraggingDestination_Extensions.DraggingEnded(AppKit.INSDraggingDestination,AppKit.INSDraggingInfo) M:AppKit.NSDraggingDestination_Extensions.DraggingEntered(AppKit.INSDraggingDestination,AppKit.INSDraggingInfo) @@ -23779,13 +23402,6 @@ M:AppKit.NSDraggingDestination_Extensions.DraggingUpdated(AppKit.INSDraggingDest M:AppKit.NSDraggingDestination_Extensions.GetWantsPeriodicDraggingUpdates(AppKit.INSDraggingDestination) M:AppKit.NSDraggingDestination_Extensions.PerformDragOperation(AppKit.INSDraggingDestination,AppKit.INSDraggingInfo) M:AppKit.NSDraggingDestination_Extensions.PrepareForDragOperation(AppKit.INSDraggingDestination,AppKit.INSDraggingInfo) -M:AppKit.NSDraggingDestination.ConcludeDragOperation(AppKit.INSDraggingInfo) -M:AppKit.NSDraggingDestination.DraggingEnded(AppKit.INSDraggingInfo) -M:AppKit.NSDraggingDestination.DraggingEntered(AppKit.INSDraggingInfo) -M:AppKit.NSDraggingDestination.DraggingExited(AppKit.INSDraggingInfo) -M:AppKit.NSDraggingDestination.DraggingUpdated(AppKit.INSDraggingInfo) -M:AppKit.NSDraggingDestination.PerformDragOperation(AppKit.INSDraggingInfo) -M:AppKit.NSDraggingDestination.PrepareForDragOperation(AppKit.INSDraggingInfo) M:AppKit.NSDraggingItem.SetImagesContentProvider(AppKit.NSDraggingItemImagesContentProvider) M:AppKit.NSDraggingSession.EnumerateDraggingItems(AppKit.NSDraggingItemEnumerationOptions,AppKit.NSView,AppKit.INSPasteboardReading[],Foundation.NSDictionary,AppKit.NSDraggingEnumerator) M:AppKit.NSDraggingSession.EnumerateDraggingItems(AppKit.NSDraggingItemEnumerationOptions,AppKit.NSView,Foundation.NSArray,Foundation.NSDictionary,AppKit.NSDraggingEnumerator) @@ -23796,43 +23412,11 @@ M:AppKit.NSDraggingSource_Extensions.DraggedImageMovedTo(AppKit.INSDraggingSourc M:AppKit.NSDraggingSource_Extensions.DraggingSourceOperationMaskForLocal(AppKit.INSDraggingSource,System.Boolean) M:AppKit.NSDraggingSource_Extensions.GetIgnoreModifierKeysWhileDragging(AppKit.INSDraggingSource) M:AppKit.NSDraggingSource_Extensions.NamesOfPromisedFilesDroppedAtDestination(AppKit.INSDraggingSource,Foundation.NSUrl) -M:AppKit.NSDraggingSource.DraggedImageBeganAt(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSDraggingSource.DraggedImageEndedAtDeposited(AppKit.NSImage,CoreGraphics.CGPoint,System.Boolean) -M:AppKit.NSDraggingSource.DraggedImageEndedAtOperation(AppKit.NSImage,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSDraggingSource.DraggedImageMovedTo(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSDraggingSource.DraggingSourceOperationMaskForLocal(System.Boolean) -M:AppKit.NSDraggingSource.NamesOfPromisedFilesDroppedAtDestination(Foundation.NSUrl) -M:AppKit.NSDrawer.AccessibilityPerformCancel -M:AppKit.NSDrawer.AccessibilityPerformConfirm -M:AppKit.NSDrawer.AccessibilityPerformDecrement -M:AppKit.NSDrawer.AccessibilityPerformDelete -M:AppKit.NSDrawer.AccessibilityPerformIncrement -M:AppKit.NSDrawer.AccessibilityPerformPick -M:AppKit.NSDrawer.AccessibilityPerformPress -M:AppKit.NSDrawer.AccessibilityPerformRaise -M:AppKit.NSDrawer.AccessibilityPerformShowAlternateUI -M:AppKit.NSDrawer.AccessibilityPerformShowDefaultUI -M:AppKit.NSDrawer.AccessibilityPerformShowMenu M:AppKit.NSDrawer.add_DrawerDidClose(System.EventHandler) M:AppKit.NSDrawer.add_DrawerDidOpen(System.EventHandler) M:AppKit.NSDrawer.add_DrawerWillClose(System.EventHandler) M:AppKit.NSDrawer.add_DrawerWillOpen(System.EventHandler) M:AppKit.NSDrawer.Dispose(System.Boolean) -M:AppKit.NSDrawer.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSDrawer.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSDrawer.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSDrawer.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSDrawer.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSDrawer.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSDrawer.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSDrawer.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSDrawer.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSDrawer.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSDrawer.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSDrawer.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSDrawer.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSDrawer.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSDrawer.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSDrawer.remove_DrawerDidClose(System.EventHandler) M:AppKit.NSDrawer.remove_DrawerDidOpen(System.EventHandler) M:AppKit.NSDrawer.remove_DrawerWillClose(System.EventHandler) @@ -23844,13 +23428,6 @@ M:AppKit.NSDrawerDelegate_Extensions.DrawerShouldOpen(AppKit.INSDrawerDelegate,A M:AppKit.NSDrawerDelegate_Extensions.DrawerWillClose(AppKit.INSDrawerDelegate,Foundation.NSNotification) M:AppKit.NSDrawerDelegate_Extensions.DrawerWillOpen(AppKit.INSDrawerDelegate,Foundation.NSNotification) M:AppKit.NSDrawerDelegate_Extensions.DrawerWillResizeContents(AppKit.INSDrawerDelegate,AppKit.NSDrawer,CoreGraphics.CGSize) -M:AppKit.NSDrawerDelegate.DrawerDidClose(Foundation.NSNotification) -M:AppKit.NSDrawerDelegate.DrawerDidOpen(Foundation.NSNotification) -M:AppKit.NSDrawerDelegate.DrawerShouldClose(AppKit.NSDrawer) -M:AppKit.NSDrawerDelegate.DrawerShouldOpen(AppKit.NSDrawer) -M:AppKit.NSDrawerDelegate.DrawerWillClose(Foundation.NSNotification) -M:AppKit.NSDrawerDelegate.DrawerWillOpen(Foundation.NSNotification) -M:AppKit.NSDrawerDelegate.DrawerWillResizeContents(AppKit.NSDrawer,CoreGraphics.CGSize) M:AppKit.NSEdgeInsets.#ctor(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:AppKit.NSEditorRegistration_Extensions.ObjectDidBeginEditing(AppKit.INSEditorRegistration,AppKit.INSEditor) M:AppKit.NSEditorRegistration_Extensions.ObjectDidEndEditing(AppKit.INSEditorRegistration,AppKit.INSEditor) @@ -23861,15 +23438,7 @@ M:AppKit.NSExtendedStringDrawing.GetBoundingRect(Foundation.NSString,CoreGraphic M:AppKit.NSExtendedStringDrawing.WeakDrawString(Foundation.NSString,CoreGraphics.CGRect,Foundation.NSStringDrawingOptions,Foundation.NSDictionary,AppKit.NSStringDrawingContext) M:AppKit.NSExtendedStringDrawing.WeakGetBoundingRect(Foundation.NSString,CoreGraphics.CGSize,Foundation.NSStringDrawingOptions,Foundation.NSDictionary,AppKit.NSStringDrawingContext) M:AppKit.NSFilePromiseProvider.Dispose(System.Boolean) -M:AppKit.NSFilePromiseProvider.GetPasteboardPropertyListForType(System.String) -M:AppKit.NSFilePromiseProvider.GetWritableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSFilePromiseProvider.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) M:AppKit.NSFilePromiseProviderDelegate_Extensions.GetOperationQueue(AppKit.INSFilePromiseProviderDelegate,AppKit.NSFilePromiseProvider) -M:AppKit.NSFilePromiseProviderDelegate.GetFileNameForDestination(AppKit.NSFilePromiseProvider,System.String) -M:AppKit.NSFilePromiseProviderDelegate.GetOperationQueue(AppKit.NSFilePromiseProvider) -M:AppKit.NSFilePromiseProviderDelegate.WritePromiseToUrl(AppKit.NSFilePromiseProvider,Foundation.NSUrl,System.Action{Foundation.NSError}) -M:AppKit.NSFilePromiseReceiver.GetReadableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSFilePromiseReceiver.GetReadingOptionsForType(System.String,AppKit.NSPasteboard) M:AppKit.NSFont.BoldSystemFontOfSize(System.Runtime.InteropServices.NFloat) M:AppKit.NSFont.ControlContentFontOfSize(System.Runtime.InteropServices.NFloat) M:AppKit.NSFont.Copy(Foundation.NSZone) @@ -23906,11 +23475,6 @@ M:AppKit.NSFontDescriptor.Copy(Foundation.NSZone) M:AppKit.NSFontDescriptor.Create(AppKit.NSFontDescriptorSystemDesign) M:AppKit.NSFontDescriptor.EncodeTo(Foundation.NSCoder) M:AppKit.NSFontManager.Dispose(System.Boolean) -M:AppKit.NSFontManager.ValidateMenuItem(AppKit.NSMenuItem) -M:AppKit.NSForm.#ctor(CoreGraphics.CGRect,AppKit.NSMatrixMode,AppKit.NSCell,System.IntPtr,System.IntPtr) -M:AppKit.NSForm.#ctor(CoreGraphics.CGRect,AppKit.NSMatrixMode,ObjCRuntime.Class,System.IntPtr,System.IntPtr) -M:AppKit.NSForm.#ctor(CoreGraphics.CGRect) -M:AppKit.NSFormCell.#ctor(AppKit.NSImage) M:AppKit.NSGestureRecognizer_NSTouchBar.GetAllowedTouchTypes(AppKit.NSGestureRecognizer) M:AppKit.NSGestureRecognizer_NSTouchBar.SetAllowedTouchTypes(AppKit.NSGestureRecognizer,AppKit.NSTouchTypeMask) M:AppKit.NSGestureRecognizer.#ctor(ObjCRuntime.Selector,AppKit.NSGestureRecognizer.Token) @@ -23926,12 +23490,6 @@ M:AppKit.NSGestureRecognizerDelegate_Extensions.ShouldBeRequiredToFail(AppKit.IN M:AppKit.NSGestureRecognizerDelegate_Extensions.ShouldReceiveTouch(AppKit.INSGestureRecognizerDelegate,AppKit.NSGestureRecognizer,AppKit.NSTouch) M:AppKit.NSGestureRecognizerDelegate_Extensions.ShouldRecognizeSimultaneously(AppKit.INSGestureRecognizerDelegate,AppKit.NSGestureRecognizer,AppKit.NSGestureRecognizer) M:AppKit.NSGestureRecognizerDelegate_Extensions.ShouldRequireFailure(AppKit.INSGestureRecognizerDelegate,AppKit.NSGestureRecognizer,AppKit.NSGestureRecognizer) -M:AppKit.NSGestureRecognizerDelegate.ShouldAttemptToRecognize(AppKit.NSGestureRecognizer,AppKit.NSEvent) -M:AppKit.NSGestureRecognizerDelegate.ShouldBegin(AppKit.NSGestureRecognizer) -M:AppKit.NSGestureRecognizerDelegate.ShouldBeRequiredToFail(AppKit.NSGestureRecognizer,AppKit.NSGestureRecognizer) -M:AppKit.NSGestureRecognizerDelegate.ShouldReceiveTouch(AppKit.NSGestureRecognizer,AppKit.NSTouch) -M:AppKit.NSGestureRecognizerDelegate.ShouldRecognizeSimultaneously(AppKit.NSGestureRecognizer,AppKit.NSGestureRecognizer) -M:AppKit.NSGestureRecognizerDelegate.ShouldRequireFailure(AppKit.NSGestureRecognizer,AppKit.NSGestureRecognizer) M:AppKit.NSGlyphInfo.Copy(Foundation.NSZone) M:AppKit.NSGlyphInfo.EncodeTo(Foundation.NSCoder) M:AppKit.NSGradient.#ctor(AppKit.NSColor[],System.Double[],AppKit.NSColorSpace) @@ -23973,8 +23531,6 @@ M:AppKit.NSGridColumn.Dispose(System.Boolean) M:AppKit.NSGridColumn.EncodeTo(Foundation.NSCoder) M:AppKit.NSGridRow.Dispose(System.Boolean) M:AppKit.NSGridRow.EncodeTo(Foundation.NSCoder) -M:AppKit.NSGroupTouchBarItem.#ctor(System.String) -M:AppKit.NSHapticFeedbackPerformer.PerformFeedback(AppKit.NSHapticFeedbackPattern,AppKit.NSHapticFeedbackPerformanceTime) M:AppKit.NSImage.#ctor(Foundation.NSData,System.Boolean) M:AppKit.NSImage.#ctor(System.String,System.Boolean) M:AppKit.NSImage.add_DidLoadPartOfRepresentation(System.EventHandler{AppKit.NSImagePartialEventArgs}) @@ -23985,28 +23541,16 @@ M:AppKit.NSImage.Copy(Foundation.NSZone) M:AppKit.NSImage.Dispose(System.Boolean) M:AppKit.NSImage.EncodeTo(Foundation.NSCoder) M:AppKit.NSImage.FromStream(System.IO.Stream) -M:AppKit.NSImage.GetPasteboardPropertyListForType(System.String) -M:AppKit.NSImage.GetReadableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSImage.GetReadingOptionsForType(System.String,AppKit.NSPasteboard) -M:AppKit.NSImage.GetWritableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSImage.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) M:AppKit.NSImage.ImageNamed(AppKit.NSImageName) M:AppKit.NSImage.remove_DidLoadPartOfRepresentation(System.EventHandler{AppKit.NSImagePartialEventArgs}) M:AppKit.NSImage.remove_DidLoadRepresentation(System.EventHandler{AppKit.NSImageLoadRepresentationEventArgs}) M:AppKit.NSImage.remove_DidLoadRepresentationHeader(System.EventHandler{AppKit.NSImageLoadEventArgs}) M:AppKit.NSImage.remove_WillLoadRepresentation(System.EventHandler{AppKit.NSImageLoadEventArgs}) -M:AppKit.NSImageCell.#ctor(AppKit.NSImage) -M:AppKit.NSImageCell.#ctor(System.String) M:AppKit.NSImageDelegate_Extensions.DidLoadPartOfRepresentation(AppKit.INSImageDelegate,AppKit.NSImage,AppKit.NSImageRep,System.IntPtr) M:AppKit.NSImageDelegate_Extensions.DidLoadRepresentation(AppKit.INSImageDelegate,AppKit.NSImage,AppKit.NSImageRep,AppKit.NSImageLoadStatus) M:AppKit.NSImageDelegate_Extensions.DidLoadRepresentationHeader(AppKit.INSImageDelegate,AppKit.NSImage,AppKit.NSImageRep) M:AppKit.NSImageDelegate_Extensions.ImageDidNotDraw(AppKit.INSImageDelegate,Foundation.NSObject,CoreGraphics.CGRect) M:AppKit.NSImageDelegate_Extensions.WillLoadRepresentation(AppKit.INSImageDelegate,AppKit.NSImage,AppKit.NSImageRep) -M:AppKit.NSImageDelegate.DidLoadPartOfRepresentation(AppKit.NSImage,AppKit.NSImageRep,System.IntPtr) -M:AppKit.NSImageDelegate.DidLoadRepresentation(AppKit.NSImage,AppKit.NSImageRep,AppKit.NSImageLoadStatus) -M:AppKit.NSImageDelegate.DidLoadRepresentationHeader(AppKit.NSImage,AppKit.NSImageRep) -M:AppKit.NSImageDelegate.ImageDidNotDraw(Foundation.NSObject,CoreGraphics.CGRect) -M:AppKit.NSImageDelegate.WillLoadRepresentation(AppKit.NSImage,AppKit.NSImageRep) M:AppKit.NSImageLoadEventArgs.#ctor(AppKit.NSImageRep) M:AppKit.NSImageLoadRepresentationEventArgs.#ctor(AppKit.NSImageRep,AppKit.NSImageLoadStatus) M:AppKit.NSImagePartialEventArgs.#ctor(AppKit.NSImageRep,System.IntPtr) @@ -24017,8 +23561,6 @@ M:AppKit.NSImageResizingModeExtensions.ToManaged(System.IntPtr) M:AppKit.NSImageResizingModeExtensions.ToNative(AppKit.NSImageResizingMode) M:AppKit.NSImageSymbolConfiguration.Copy(Foundation.NSZone) M:AppKit.NSImageSymbolConfiguration.EncodeTo(Foundation.NSCoder) -M:AppKit.NSImageView.#ctor(CoreGraphics.CGRect) -M:AppKit.NSImageView.ValidateMenuItem(AppKit.NSMenuItem) M:AppKit.NSLayerDelegateContentsScaleUpdating_Extensions.ShouldInheritContentsScale(AppKit.INSLayerDelegateContentsScaleUpdating,CoreAnimation.CALayer,System.Runtime.InteropServices.NFloat,AppKit.NSWindow) M:AppKit.NSLayoutAnchor`1.ConstraintEqualTo(AppKit.NSLayoutAnchor{`0},System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutAnchor`1.ConstraintEqualTo(AppKit.NSLayoutAnchor{`0}) @@ -24030,13 +23572,11 @@ M:AppKit.NSLayoutAnchor`1.Copy(Foundation.NSZone) M:AppKit.NSLayoutAnchor`1.Dispose(System.Boolean) M:AppKit.NSLayoutAnchor`1.EncodeTo(Foundation.NSCoder) M:AppKit.NSLayoutConstraint.ActivateConstraints(AppKit.NSLayoutConstraint[]) -M:AppKit.NSLayoutConstraint.AnimationFor(Foundation.NSString) M:AppKit.NSLayoutConstraint.Create(Foundation.NSObject,AppKit.NSLayoutAttribute,AppKit.NSLayoutRelation,Foundation.NSObject,AppKit.NSLayoutAttribute,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutConstraint.Create(Foundation.NSObject,AppKit.NSLayoutAttribute,AppKit.NSLayoutRelation,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutConstraint.Create(Foundation.NSObject,AppKit.NSLayoutAttribute,AppKit.NSLayoutRelation) M:AppKit.NSLayoutConstraint.Create(ObjCRuntime.INativeObject,AppKit.NSLayoutAttribute,AppKit.NSLayoutRelation,ObjCRuntime.INativeObject,AppKit.NSLayoutAttribute,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutConstraint.DeactivateConstraints(AppKit.NSLayoutConstraint[]) -M:AppKit.NSLayoutConstraint.DefaultAnimationFor(Foundation.NSString) M:AppKit.NSLayoutConstraint.Dispose(System.Boolean) M:AppKit.NSLayoutConstraint.FirstAnchor``1 M:AppKit.NSLayoutConstraint.FromVisualFormat(System.String,AppKit.NSLayoutFormatOptions,Foundation.NSDictionary,Foundation.NSDictionary) @@ -24085,7 +23625,6 @@ M:AppKit.NSLayoutManager.GetCharacterIndex(CoreGraphics.CGPoint,AppKit.NSTextCon M:AppKit.NSLayoutManager.GetCharacterIndex(CoreGraphics.CGPoint,AppKit.NSTextContainer) M:AppKit.NSLayoutManager.GetCharacterIndex(System.UIntPtr) M:AppKit.NSLayoutManager.GetCharacterRange(Foundation.NSRange,Foundation.NSRange@) -M:AppKit.NSLayoutManager.GetCharacterRange(Foundation.NSRange,System.IntPtr) M:AppKit.NSLayoutManager.GetCharacterRange(Foundation.NSRange) M:AppKit.NSLayoutManager.GetFirstUnlaidCharacterIndex(System.UIntPtr@,System.UIntPtr@) M:AppKit.NSLayoutManager.GetFractionOfDistanceThroughGlyph(CoreGraphics.CGPoint,AppKit.NSTextContainer) @@ -24096,7 +23635,6 @@ M:AppKit.NSLayoutManager.GetGlyphIndex(CoreGraphics.CGPoint,AppKit.NSTextContain M:AppKit.NSLayoutManager.GetGlyphIndex(System.UIntPtr) M:AppKit.NSLayoutManager.GetGlyphRange(AppKit.NSTextContainer) M:AppKit.NSLayoutManager.GetGlyphRange(Foundation.NSRange,Foundation.NSRange@) -M:AppKit.NSLayoutManager.GetGlyphRange(Foundation.NSRange,System.IntPtr) M:AppKit.NSLayoutManager.GetGlyphRange(Foundation.NSRange) M:AppKit.NSLayoutManager.GetGlyphRangeForBoundingRect(CoreGraphics.CGRect,AppKit.NSTextContainer) M:AppKit.NSLayoutManager.GetGlyphRangeForBoundingRectWithoutAdditionalLayout(CoreGraphics.CGRect,AppKit.NSTextContainer) @@ -24153,7 +23691,6 @@ M:AppKit.NSLayoutManager.IsValidGlyph(System.UIntPtr) M:AppKit.NSLayoutManager.ProcessEditing(AppKit.NSTextStorage,AppKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr,Foundation.NSRange) M:AppKit.NSLayoutManager.RemoveTemporaryAttribute(System.String,Foundation.NSRange) M:AppKit.NSLayoutManager.RemoveTextContainer(System.IntPtr) -M:AppKit.NSLayoutManager.SetAttachmentSize(CoreGraphics.CGSize,Foundation.NSRange) M:AppKit.NSLayoutManager.SetDrawsOutsideLineFragment(System.Boolean,System.UIntPtr) M:AppKit.NSLayoutManager.SetExtraLineFragment(CoreGraphics.CGRect,CoreGraphics.CGRect,AppKit.NSTextContainer) M:AppKit.NSLayoutManager.SetGlyphs(System.IntPtr,System.IntPtr,System.IntPtr,AppKit.NSFont,Foundation.NSRange) @@ -24192,7 +23729,6 @@ M:AppKit.NSLayoutManagerDelegate.ShouldBreakLineByWordBeforeCharacter(AppKit.NSL M:AppKit.NSLayoutManagerDelegate.ShouldGenerateGlyphs(AppKit.NSLayoutManager,System.IntPtr,System.IntPtr,System.IntPtr,AppKit.NSFont,Foundation.NSRange) M:AppKit.NSLayoutManagerDelegate.ShouldSetLineFragmentRect(AppKit.NSLayoutManager,CoreGraphics.CGRect@,CoreGraphics.CGRect@,System.Runtime.InteropServices.NFloat@,AppKit.NSTextContainer,Foundation.NSRange) M:AppKit.NSLayoutManagerDelegate.ShouldUseAction(AppKit.NSLayoutManager,AppKit.NSControlCharacterAction,System.UIntPtr) -M:AppKit.NSLayoutManagerDelegate.ShouldUseTemporaryAttributes(AppKit.NSLayoutManager,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.Boolean,System.UIntPtr,Foundation.NSRange@) M:AppKit.NSLayoutXAxisAnchor.ConstraintEqualToSystemSpacingAfterAnchor(AppKit.NSLayoutXAxisAnchor,System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutXAxisAnchor.ConstraintGreaterThanOrEqualToSystemSpacingAfterAnchor(AppKit.NSLayoutXAxisAnchor,System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutXAxisAnchor.ConstraintLessThanOrEqualToSystemSpacingAfterAnchor(AppKit.NSLayoutXAxisAnchor,System.Runtime.InteropServices.NFloat) @@ -24201,60 +23737,15 @@ M:AppKit.NSLayoutYAxisAnchor.ConstraintEqualToSystemSpacingBelowAnchor(AppKit.NS M:AppKit.NSLayoutYAxisAnchor.ConstraintGreaterThanOrEqualToSystemSpacingBelowAnchor(AppKit.NSLayoutYAxisAnchor,System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutYAxisAnchor.ConstraintLessThanOrEqualToSystemSpacingBelowAnchor(AppKit.NSLayoutYAxisAnchor,System.Runtime.InteropServices.NFloat) M:AppKit.NSLayoutYAxisAnchor.CreateAnchorWithOffset(AppKit.NSLayoutYAxisAnchor) -M:AppKit.NSLevelIndicator.#ctor(CoreGraphics.CGRect) -M:AppKit.NSLevelIndicatorCell.#ctor(AppKit.NSImage) -M:AppKit.NSLevelIndicatorCell.#ctor(System.String) -M:AppKit.NSLevelIndicatorCell.SetImage(AppKit.NSImage) -M:AppKit.NSMagnificationGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:AppKit.NSMagnificationGestureRecognizer.#ctor(System.Action) M:AppKit.NSMagnificationGestureRecognizer.#ctor(System.Action{AppKit.NSMagnificationGestureRecognizer}) M:AppKit.NSMatrix.add_DoubleClick(System.EventHandler) M:AppKit.NSMatrix.Dispose(System.Boolean) -M:AppKit.NSMatrix.GetStringForToolTip(AppKit.NSView,System.IntPtr,CoreGraphics.CGPoint,System.IntPtr) M:AppKit.NSMatrix.remove_DoubleClick(System.EventHandler) -M:AppKit.NSMatrix.ValidateUserInterfaceItem(AppKit.INSValidatedUserInterfaceItem) -M:AppKit.NSMatrixDelegate.ControlTextDidBeginEditing(Foundation.NSNotification) -M:AppKit.NSMatrixDelegate.ControlTextDidChange(Foundation.NSNotification) -M:AppKit.NSMatrixDelegate.ControlTextDidEndEditing(Foundation.NSNotification) -M:AppKit.NSMatrixDelegate.DidFailToFormatString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSMatrixDelegate.DidFailToValidatePartialString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSMatrixDelegate.DoCommandBySelector(AppKit.NSControl,AppKit.NSTextView,ObjCRuntime.Selector) -M:AppKit.NSMatrixDelegate.GetCompletions(AppKit.NSControl,AppKit.NSTextView,System.String[],Foundation.NSRange,System.IntPtr@) -M:AppKit.NSMatrixDelegate.IsValidObject(AppKit.NSControl,Foundation.NSObject) -M:AppKit.NSMatrixDelegate.TextShouldBeginEditing(AppKit.NSControl,AppKit.NSText) -M:AppKit.NSMatrixDelegate.TextShouldEndEditing(AppKit.NSControl,AppKit.NSText) -M:AppKit.NSMenu.AccessibilityAddChildElement(AppKit.NSAccessibilityElement) -M:AppKit.NSMenu.AccessibilityPerformCancel -M:AppKit.NSMenu.AccessibilityPerformConfirm -M:AppKit.NSMenu.AccessibilityPerformDecrement -M:AppKit.NSMenu.AccessibilityPerformDelete -M:AppKit.NSMenu.AccessibilityPerformIncrement -M:AppKit.NSMenu.AccessibilityPerformPick -M:AppKit.NSMenu.AccessibilityPerformPress -M:AppKit.NSMenu.AccessibilityPerformRaise -M:AppKit.NSMenu.AccessibilityPerformShowAlternateUI -M:AppKit.NSMenu.AccessibilityPerformShowDefaultUI -M:AppKit.NSMenu.AccessibilityPerformShowMenu M:AppKit.NSMenu.Copy(Foundation.NSZone) -M:AppKit.NSMenu.CreateElement(Foundation.NSString,CoreGraphics.CGRect,Foundation.NSString,Foundation.NSObject) M:AppKit.NSMenu.Dispose(System.Boolean) M:AppKit.NSMenu.EncodeTo(Foundation.NSCoder) -M:AppKit.NSMenu.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSMenu.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSMenu.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSMenu.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSMenu.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSMenu.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSMenu.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSMenu.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSMenu.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSMenu.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSMenu.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSMenu.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSMenu.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSMenu.GetAccessibilityStyleRange(System.IntPtr) M:AppKit.NSMenu.InsertItem(System.String,System.String,System.IntPtr) -M:AppKit.NSMenu.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSMenuDelegate_Extensions.ConfinementRectForMenu(AppKit.INSMenuDelegate,AppKit.NSMenu,AppKit.NSScreen) M:AppKit.NSMenuDelegate_Extensions.HasKeyEquivalentForEvent(AppKit.INSMenuDelegate,AppKit.NSMenu,AppKit.NSEvent,Foundation.NSObject,ObjCRuntime.Selector) M:AppKit.NSMenuDelegate_Extensions.MenuDidClose(AppKit.INSMenuDelegate,AppKit.NSMenu) @@ -24263,57 +23754,19 @@ M:AppKit.NSMenuDelegate_Extensions.MenuWillHighlightItem(AppKit.INSMenuDelegate, M:AppKit.NSMenuDelegate_Extensions.MenuWillOpen(AppKit.INSMenuDelegate,AppKit.NSMenu) M:AppKit.NSMenuDelegate_Extensions.NeedsUpdate(AppKit.INSMenuDelegate,AppKit.NSMenu) M:AppKit.NSMenuDelegate_Extensions.UpdateItem(AppKit.INSMenuDelegate,AppKit.NSMenu,AppKit.NSMenuItem,System.IntPtr,System.Boolean) -M:AppKit.NSMenuDelegate.ConfinementRectForMenu(AppKit.NSMenu,AppKit.NSScreen) -M:AppKit.NSMenuDelegate.HasKeyEquivalentForEvent(AppKit.NSMenu,AppKit.NSEvent,Foundation.NSObject,ObjCRuntime.Selector) -M:AppKit.NSMenuDelegate.MenuDidClose(AppKit.NSMenu) -M:AppKit.NSMenuDelegate.MenuItemCount(AppKit.NSMenu) -M:AppKit.NSMenuDelegate.MenuWillHighlightItem(AppKit.NSMenu,AppKit.NSMenuItem) -M:AppKit.NSMenuDelegate.MenuWillOpen(AppKit.NSMenu) -M:AppKit.NSMenuDelegate.NeedsUpdate(AppKit.NSMenu) -M:AppKit.NSMenuDelegate.UpdateItem(AppKit.NSMenu,AppKit.NSMenuItem,System.IntPtr,System.Boolean) M:AppKit.NSMenuItem.#ctor(System.String,System.EventHandler) M:AppKit.NSMenuItem.#ctor(System.String,System.String,System.EventHandler,System.Func{AppKit.NSMenuItem,System.Boolean}) M:AppKit.NSMenuItem.#ctor(System.String,System.String,System.EventHandler) M:AppKit.NSMenuItem.#ctor(System.String,System.String) M:AppKit.NSMenuItem.#ctor(System.String) -M:AppKit.NSMenuItem.AccessibilityAddChildElement(AppKit.NSAccessibilityElement) -M:AppKit.NSMenuItem.AccessibilityPerformCancel -M:AppKit.NSMenuItem.AccessibilityPerformConfirm -M:AppKit.NSMenuItem.AccessibilityPerformDecrement -M:AppKit.NSMenuItem.AccessibilityPerformDelete -M:AppKit.NSMenuItem.AccessibilityPerformIncrement -M:AppKit.NSMenuItem.AccessibilityPerformPick -M:AppKit.NSMenuItem.AccessibilityPerformPress -M:AppKit.NSMenuItem.AccessibilityPerformRaise -M:AppKit.NSMenuItem.AccessibilityPerformShowAlternateUI -M:AppKit.NSMenuItem.AccessibilityPerformShowDefaultUI -M:AppKit.NSMenuItem.AccessibilityPerformShowMenu M:AppKit.NSMenuItem.add_Activated(System.EventHandler) M:AppKit.NSMenuItem.Copy(Foundation.NSZone) -M:AppKit.NSMenuItem.CreateElement(Foundation.NSString,CoreGraphics.CGRect,Foundation.NSString,Foundation.NSObject) M:AppKit.NSMenuItem.Dispose(System.Boolean) M:AppKit.NSMenuItem.EncodeTo(Foundation.NSCoder) -M:AppKit.NSMenuItem.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSMenuItem.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSMenuItem.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSMenuItem.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSMenuItem.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSMenuItem.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSMenuItem.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSMenuItem.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSMenuItem.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSMenuItem.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSMenuItem.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSMenuItem.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSMenuItem.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSMenuItem.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSMenuItem.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSMenuItem.remove_Activated(System.EventHandler) M:AppKit.NSMenuItemBadge.Copy(Foundation.NSZone) -M:AppKit.NSMenuItemCell.#ctor(AppKit.NSImage) M:AppKit.NSMenuItemEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSMenuItemIndexEventArgs.#ctor(Foundation.NSNotification) -M:AppKit.NSMenuToolbarItem.#ctor(System.String) M:AppKit.NSMutableAttributedStringAppKitAddons.ApplyFontTraits(Foundation.NSMutableAttributedString,AppKit.NSFontTraitMask,Foundation.NSRange) M:AppKit.NSMutableAttributedStringAppKitAddons.FixAttachmentAttributeInRange(Foundation.NSMutableAttributedString,Foundation.NSRange) M:AppKit.NSMutableAttributedStringAppKitAddons.FixFontAttributeInRange(Foundation.NSMutableAttributedString,Foundation.NSRange) @@ -24349,7 +23802,6 @@ M:AppKit.NSOpenGLPixelFormat.#ctor(AppKit.NSOpenGLPixelFormatAttribute[]) M:AppKit.NSOpenGLPixelFormat.#ctor(System.Object[]) M:AppKit.NSOpenGLPixelFormat.#ctor(System.UInt32[]) M:AppKit.NSOpenGLPixelFormat.EncodeTo(Foundation.NSCoder) -M:AppKit.NSOpenGLView.#ctor(CoreGraphics.CGRect) M:AppKit.NSOpenPanel.BeginSheet(System.String,System.String,System.String[],AppKit.NSWindow,System.Action) M:AppKit.NSOpenPanel.BeginSheet(System.String,System.String,System.String[],AppKit.NSWindow) M:AppKit.NSOpenSaveExpandingEventArgs.#ctor(System.Boolean) @@ -24366,25 +23818,9 @@ M:AppKit.NSOpenSavePanelDelegate_Extensions.ShouldShowFilename(AppKit.INSOpenSav M:AppKit.NSOpenSavePanelDelegate_Extensions.UserEnteredFilename(AppKit.INSOpenSavePanelDelegate,AppKit.NSSavePanel,System.String,System.Boolean) M:AppKit.NSOpenSavePanelDelegate_Extensions.ValidateUrl(AppKit.INSOpenSavePanelDelegate,AppKit.NSSavePanel,Foundation.NSUrl,Foundation.NSError@) M:AppKit.NSOpenSavePanelDelegate_Extensions.WillExpand(AppKit.INSOpenSavePanelDelegate,AppKit.NSSavePanel,System.Boolean) -M:AppKit.NSOpenSavePanelDelegate.CompareFilenames(AppKit.NSSavePanel,System.String,System.String,System.Boolean) -M:AppKit.NSOpenSavePanelDelegate.DidChangeToDirectory(AppKit.NSSavePanel,Foundation.NSUrl) -M:AppKit.NSOpenSavePanelDelegate.DidSelectType(AppKit.NSSavePanel,UniformTypeIdentifiers.UTType) -M:AppKit.NSOpenSavePanelDelegate.DirectoryDidChange(AppKit.NSSavePanel,System.String) -M:AppKit.NSOpenSavePanelDelegate.GetDisplayName(AppKit.NSSavePanel,UniformTypeIdentifiers.UTType) -M:AppKit.NSOpenSavePanelDelegate.IsValidFilename(AppKit.NSSavePanel,System.String) -M:AppKit.NSOpenSavePanelDelegate.SelectionDidChange(AppKit.NSSavePanel) -M:AppKit.NSOpenSavePanelDelegate.ShouldEnableUrl(AppKit.NSSavePanel,Foundation.NSUrl) -M:AppKit.NSOpenSavePanelDelegate.ShouldShowFilename(AppKit.NSSavePanel,System.String) -M:AppKit.NSOpenSavePanelDelegate.UserEnteredFilename(AppKit.NSSavePanel,System.String,System.Boolean) -M:AppKit.NSOpenSavePanelDelegate.ValidateUrl(AppKit.NSSavePanel,Foundation.NSUrl,Foundation.NSError@) -M:AppKit.NSOpenSavePanelDelegate.WillExpand(AppKit.NSSavePanel,System.Boolean) M:AppKit.NSOpenSavePanelUrlEventArgs.#ctor(Foundation.NSUrl) M:AppKit.NSopenSavePanelUTTypeEventArgs.#ctor(UniformTypeIdentifiers.UTType) -M:AppKit.NSOutlineView.#ctor(CoreGraphics.CGRect) M:AppKit.NSOutlineView.Dispose(System.Boolean) -M:AppKit.NSOutlineView.InsertRows(Foundation.NSIndexSet,AppKit.NSTableViewAnimation) -M:AppKit.NSOutlineView.MoveRow(System.IntPtr,System.IntPtr) -M:AppKit.NSOutlineView.RemoveRows(Foundation.NSIndexSet,AppKit.NSTableViewAnimation) M:AppKit.NSOutlineViewDataSource_Extensions.AcceptDrop(AppKit.INSOutlineViewDataSource,AppKit.NSOutlineView,AppKit.INSDraggingInfo,Foundation.NSObject,System.IntPtr) M:AppKit.NSOutlineViewDataSource_Extensions.DraggingSessionEnded(AppKit.INSOutlineViewDataSource,AppKit.NSOutlineView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) M:AppKit.NSOutlineViewDataSource_Extensions.DraggingSessionWillBegin(AppKit.INSOutlineViewDataSource,AppKit.NSOutlineView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSArray) @@ -24401,22 +23837,6 @@ M:AppKit.NSOutlineViewDataSource_Extensions.SetObjectValue(AppKit.INSOutlineView M:AppKit.NSOutlineViewDataSource_Extensions.SortDescriptorsChanged(AppKit.INSOutlineViewDataSource,AppKit.NSOutlineView,Foundation.NSSortDescriptor[]) M:AppKit.NSOutlineViewDataSource_Extensions.UpdateDraggingItemsForDrag(AppKit.INSOutlineViewDataSource,AppKit.NSOutlineView,AppKit.INSDraggingInfo) M:AppKit.NSOutlineViewDataSource_Extensions.ValidateDrop(AppKit.INSOutlineViewDataSource,AppKit.NSOutlineView,AppKit.INSDraggingInfo,Foundation.NSObject,System.IntPtr) -M:AppKit.NSOutlineViewDataSource.AcceptDrop(AppKit.NSOutlineView,AppKit.INSDraggingInfo,Foundation.NSObject,System.IntPtr) -M:AppKit.NSOutlineViewDataSource.DraggingSessionEnded(AppKit.NSOutlineView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSOutlineViewDataSource.DraggingSessionWillBegin(AppKit.NSOutlineView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSArray) -M:AppKit.NSOutlineViewDataSource.FilesDropped(AppKit.NSOutlineView,Foundation.NSUrl,Foundation.NSArray) -M:AppKit.NSOutlineViewDataSource.GetChild(AppKit.NSOutlineView,System.IntPtr,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.GetChildrenCount(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.GetObjectValue(AppKit.NSOutlineView,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.ItemExpandable(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.ItemForPersistentObject(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.OutlineViewwriteItemstoPasteboard(AppKit.NSOutlineView,Foundation.NSArray,AppKit.NSPasteboard) -M:AppKit.NSOutlineViewDataSource.PasteboardWriterForItem(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.PersistentObjectForItem(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.SetObjectValue(AppKit.NSOutlineView,Foundation.NSObject,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDataSource.SortDescriptorsChanged(AppKit.NSOutlineView,Foundation.NSSortDescriptor[]) -M:AppKit.NSOutlineViewDataSource.UpdateDraggingItemsForDrag(AppKit.NSOutlineView,AppKit.INSDraggingInfo) -M:AppKit.NSOutlineViewDataSource.ValidateDrop(AppKit.NSOutlineView,AppKit.INSDraggingInfo,Foundation.NSObject,System.IntPtr) M:AppKit.NSOutlineViewDelegate_Extensions.ColumnDidMove(AppKit.INSOutlineViewDelegate,Foundation.NSNotification) M:AppKit.NSOutlineViewDelegate_Extensions.ColumnDidResize(AppKit.INSOutlineViewDelegate,Foundation.NSNotification) M:AppKit.NSOutlineViewDelegate_Extensions.DidAddRowView(AppKit.INSOutlineViewDelegate,AppKit.NSOutlineView,AppKit.NSTableRowView,System.IntPtr) @@ -24456,53 +23876,11 @@ M:AppKit.NSOutlineViewDelegate_Extensions.UserCanChangeVisibility(AppKit.INSOutl M:AppKit.NSOutlineViewDelegate_Extensions.UserDidChangeVisibility(AppKit.INSOutlineViewDelegate,AppKit.NSOutlineView,AppKit.NSTableColumn[]) M:AppKit.NSOutlineViewDelegate_Extensions.WillDisplayCell(AppKit.INSOutlineViewDelegate,AppKit.NSOutlineView,Foundation.NSObject,AppKit.NSTableColumn,Foundation.NSObject) M:AppKit.NSOutlineViewDelegate_Extensions.WillDisplayOutlineCell(AppKit.INSOutlineViewDelegate,AppKit.NSOutlineView,Foundation.NSObject,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ColumnDidMove(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.ColumnDidResize(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.DidAddRowView(AppKit.NSOutlineView,AppKit.NSTableRowView,System.IntPtr) -M:AppKit.NSOutlineViewDelegate.DidClickTableColumn(AppKit.NSOutlineView,AppKit.NSTableColumn) -M:AppKit.NSOutlineViewDelegate.DidDragTableColumn(AppKit.NSOutlineView,AppKit.NSTableColumn) -M:AppKit.NSOutlineViewDelegate.DidRemoveRowView(AppKit.NSOutlineView,AppKit.NSTableRowView,System.IntPtr) -M:AppKit.NSOutlineViewDelegate.GetCell(AppKit.NSOutlineView,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.GetNextTypeSelectMatch(AppKit.NSOutlineView,Foundation.NSObject,Foundation.NSObject,System.String) -M:AppKit.NSOutlineViewDelegate.GetRowHeight(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.GetSelectionIndexes(AppKit.NSOutlineView,Foundation.NSIndexSet) -M:AppKit.NSOutlineViewDelegate.GetSelectString(AppKit.NSOutlineView,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.GetSizeToFitColumnWidth(AppKit.NSOutlineView,System.IntPtr) -M:AppKit.NSOutlineViewDelegate.GetTintConfiguration(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.GetView(AppKit.NSOutlineView,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.IsGroupItem(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ItemDidCollapse(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.ItemDidExpand(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.ItemWillCollapse(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.ItemWillExpand(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.MouseDown(AppKit.NSOutlineView,AppKit.NSTableColumn) -M:AppKit.NSOutlineViewDelegate.RowViewForItem(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.SelectionDidChange(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.SelectionIsChanging(Foundation.NSNotification) -M:AppKit.NSOutlineViewDelegate.SelectionShouldChange(AppKit.NSOutlineView) -M:AppKit.NSOutlineViewDelegate.ShouldCollapseItem(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ShouldEditTableColumn(AppKit.NSOutlineView,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ShouldExpandItem(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ShouldReorder(AppKit.NSOutlineView,System.IntPtr,System.IntPtr) -M:AppKit.NSOutlineViewDelegate.ShouldSelectItem(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ShouldSelectTableColumn(AppKit.NSOutlineView,AppKit.NSTableColumn) -M:AppKit.NSOutlineViewDelegate.ShouldShowCellExpansion(AppKit.NSOutlineView,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ShouldShowOutlineCell(AppKit.NSOutlineView,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ShouldTrackCell(AppKit.NSOutlineView,AppKit.NSCell,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.ShouldTypeSelect(AppKit.NSOutlineView,AppKit.NSEvent,System.String) -M:AppKit.NSOutlineViewDelegate.ToolTipForCell(AppKit.NSOutlineView,AppKit.NSCell,CoreGraphics.CGRect@,AppKit.NSTableColumn,Foundation.NSObject,CoreGraphics.CGPoint) -M:AppKit.NSOutlineViewDelegate.UserCanChangeVisibility(AppKit.NSOutlineView,AppKit.NSTableColumn) -M:AppKit.NSOutlineViewDelegate.UserDidChangeVisibility(AppKit.NSOutlineView,AppKit.NSTableColumn[]) -M:AppKit.NSOutlineViewDelegate.WillDisplayCell(AppKit.NSOutlineView,Foundation.NSObject,AppKit.NSTableColumn,Foundation.NSObject) -M:AppKit.NSOutlineViewDelegate.WillDisplayOutlineCell(AppKit.NSOutlineView,Foundation.NSObject,AppKit.NSTableColumn,Foundation.NSObject) M:AppKit.NSOutlineViewItemEventArgs.#ctor(Foundation.NSNotification) -M:AppKit.NSPageController.#ctor(System.String,Foundation.NSBundle) M:AppKit.NSPageController.add_DidEndLiveTransition(System.EventHandler) M:AppKit.NSPageController.add_DidTransition(System.EventHandler{AppKit.NSPageControllerTransitionEventArgs}) M:AppKit.NSPageController.add_PrepareViewController(System.EventHandler{AppKit.NSPageControllerPrepareViewControllerEventArgs}) M:AppKit.NSPageController.add_WillStartLiveTransition(System.EventHandler) -M:AppKit.NSPageController.AnimationFor(Foundation.NSString) -M:AppKit.NSPageController.DefaultAnimationFor(Foundation.NSString) M:AppKit.NSPageController.Dispose(System.Boolean) M:AppKit.NSPageController.remove_DidEndLiveTransition(System.EventHandler) M:AppKit.NSPageController.remove_DidTransition(System.EventHandler{AppKit.NSPageControllerTransitionEventArgs}) @@ -24515,20 +23893,11 @@ M:AppKit.NSPageControllerDelegate_Extensions.GetIdentifier(AppKit.INSPageControl M:AppKit.NSPageControllerDelegate_Extensions.GetViewController(AppKit.INSPageControllerDelegate,AppKit.NSPageController,System.String) M:AppKit.NSPageControllerDelegate_Extensions.PrepareViewController(AppKit.INSPageControllerDelegate,AppKit.NSPageController,AppKit.NSViewController,Foundation.NSObject) M:AppKit.NSPageControllerDelegate_Extensions.WillStartLiveTransition(AppKit.INSPageControllerDelegate,AppKit.NSPageController) -M:AppKit.NSPageControllerDelegate.DidEndLiveTransition(AppKit.NSPageController) -M:AppKit.NSPageControllerDelegate.DidTransition(AppKit.NSPageController,Foundation.NSObject) -M:AppKit.NSPageControllerDelegate.GetFrame(AppKit.NSPageController,Foundation.NSObject) -M:AppKit.NSPageControllerDelegate.GetIdentifier(AppKit.NSPageController,Foundation.NSObject) -M:AppKit.NSPageControllerDelegate.GetViewController(AppKit.NSPageController,System.String) -M:AppKit.NSPageControllerDelegate.PrepareViewController(AppKit.NSPageController,AppKit.NSViewController,Foundation.NSObject) -M:AppKit.NSPageControllerDelegate.WillStartLiveTransition(AppKit.NSPageController) M:AppKit.NSPageControllerPrepareViewControllerEventArgs.#ctor(AppKit.NSViewController,Foundation.NSObject) M:AppKit.NSPageControllerTransitionEventArgs.#ctor(Foundation.NSObject) M:AppKit.NSPageLayout.BeginSheet(AppKit.NSPrintInfo,AppKit.NSWindow,System.Action) M:AppKit.NSPageLayout.BeginSheet(AppKit.NSPrintInfo,AppKit.NSWindow) M:AppKit.NSPageLayout.BeginSheetAsync(AppKit.NSPrintInfo,AppKit.NSWindow) -M:AppKit.NSPanel.#ctor(CoreGraphics.CGRect,AppKit.NSWindowStyle,AppKit.NSBackingStore,System.Boolean) -M:AppKit.NSPanGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:AppKit.NSPanGestureRecognizer.#ctor(System.Action) M:AppKit.NSPanGestureRecognizer.#ctor(System.Action{AppKit.NSPanGestureRecognizer}) M:AppKit.NSPanGestureRecognizer.EncodeTo(Foundation.NSCoder) @@ -24537,18 +23906,9 @@ M:AppKit.NSParagraphStyle.EncodeTo(Foundation.NSCoder) M:AppKit.NSParagraphStyle.GetDefaultWritingDirection(System.String) M:AppKit.NSParagraphStyle.MutableCopy(Foundation.NSZone) M:AppKit.NSPasteboard.WriteObjects(AppKit.INSPasteboardWriting[]) -M:AppKit.NSPasteboardItem.GetPasteboardPropertyListForType(System.String) -M:AppKit.NSPasteboardItem.GetReadableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSPasteboardItem.GetReadingOptionsForType(System.String,AppKit.NSPasteboard) -M:AppKit.NSPasteboardItem.GetWritableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSPasteboardItem.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) M:AppKit.NSPasteboardItemDataProvider_Extensions.FinishedWithDataProvider(AppKit.INSPasteboardItemDataProvider,AppKit.NSPasteboard) -M:AppKit.NSPasteboardItemDataProvider.FinishedWithDataProvider(AppKit.NSPasteboard) -M:AppKit.NSPasteboardItemDataProvider.ProvideDataForType(AppKit.NSPasteboard,AppKit.NSPasteboardItem,System.String) M:AppKit.NSPasteboardTypeOwner_Extensions.PasteboardChangedOwner(AppKit.INSPasteboardTypeOwner,AppKit.NSPasteboard) M:AppKit.NSPasteboardWriting_Extensions.GetWritingOptionsForType(AppKit.INSPasteboardWriting,System.String,AppKit.NSPasteboard) -M:AppKit.NSPathCell.#ctor(AppKit.NSImage) -M:AppKit.NSPathCell.#ctor(System.String) M:AppKit.NSPathCell.add_DoubleClick(System.EventHandler) M:AppKit.NSPathCell.add_WillDisplayOpenPanel(System.EventHandler{AppKit.NSPathCellDisplayPanelEventArgs}) M:AppKit.NSPathCell.add_WillPopupMenu(System.EventHandler{AppKit.NSPathCellMenuEventArgs}) @@ -24557,15 +23917,10 @@ M:AppKit.NSPathCell.remove_DoubleClick(System.EventHandler) M:AppKit.NSPathCell.remove_WillDisplayOpenPanel(System.EventHandler{AppKit.NSPathCellDisplayPanelEventArgs}) M:AppKit.NSPathCell.remove_WillPopupMenu(System.EventHandler{AppKit.NSPathCellMenuEventArgs}) M:AppKit.NSPathCell.SetControlSize(AppKit.NSControlSize) -M:AppKit.NSPathCell.ValidateMenuItem(AppKit.NSMenuItem) M:AppKit.NSPathCellDelegate_Extensions.WillDisplayOpenPanel(AppKit.INSPathCellDelegate,AppKit.NSPathCell,AppKit.NSOpenPanel) M:AppKit.NSPathCellDelegate_Extensions.WillPopupMenu(AppKit.INSPathCellDelegate,AppKit.NSPathCell,AppKit.NSMenu) -M:AppKit.NSPathCellDelegate.WillDisplayOpenPanel(AppKit.NSPathCell,AppKit.NSOpenPanel) -M:AppKit.NSPathCellDelegate.WillPopupMenu(AppKit.NSPathCell,AppKit.NSMenu) M:AppKit.NSPathCellDisplayPanelEventArgs.#ctor(AppKit.NSOpenPanel) M:AppKit.NSPathCellMenuEventArgs.#ctor(AppKit.NSMenu) -M:AppKit.NSPathComponentCell.#ctor(System.String) -M:AppKit.NSPathControl.#ctor(CoreGraphics.CGRect) M:AppKit.NSPathControl.add_DoubleClick(System.EventHandler) M:AppKit.NSPathControl.Dispose(System.Boolean) M:AppKit.NSPathControl.remove_DoubleClick(System.EventHandler) @@ -24575,40 +23930,8 @@ M:AppKit.NSPathControlDelegate_Extensions.ShouldDragPathComponentCell(AppKit.INS M:AppKit.NSPathControlDelegate_Extensions.ValidateDrop(AppKit.INSPathControlDelegate,AppKit.NSPathControl,AppKit.INSDraggingInfo) M:AppKit.NSPathControlDelegate_Extensions.WillDisplayOpenPanel(AppKit.INSPathControlDelegate,AppKit.NSPathControl,AppKit.NSOpenPanel) M:AppKit.NSPathControlDelegate_Extensions.WillPopUpMenu(AppKit.INSPathControlDelegate,AppKit.NSPathControl,AppKit.NSMenu) -M:AppKit.NSPathControlDelegate.AcceptDrop(AppKit.NSPathControl,AppKit.INSDraggingInfo) -M:AppKit.NSPathControlDelegate.ShouldDragItem(AppKit.NSPathControl,AppKit.NSPathControlItem,AppKit.NSPasteboard) -M:AppKit.NSPathControlDelegate.ShouldDragPathComponentCell(AppKit.NSPathControl,AppKit.NSPathComponentCell,AppKit.NSPasteboard) -M:AppKit.NSPathControlDelegate.ValidateDrop(AppKit.NSPathControl,AppKit.INSDraggingInfo) -M:AppKit.NSPathControlDelegate.WillDisplayOpenPanel(AppKit.NSPathControl,AppKit.NSOpenPanel) -M:AppKit.NSPathControlDelegate.WillPopUpMenu(AppKit.NSPathControl,AppKit.NSMenu) M:AppKit.NSPickerTouchBarItem.Dispose(System.Boolean) -M:AppKit.NSPopover.AccessibilityPerformCancel -M:AppKit.NSPopover.AccessibilityPerformConfirm -M:AppKit.NSPopover.AccessibilityPerformDecrement -M:AppKit.NSPopover.AccessibilityPerformDelete -M:AppKit.NSPopover.AccessibilityPerformIncrement -M:AppKit.NSPopover.AccessibilityPerformPick -M:AppKit.NSPopover.AccessibilityPerformPress -M:AppKit.NSPopover.AccessibilityPerformRaise -M:AppKit.NSPopover.AccessibilityPerformShowAlternateUI -M:AppKit.NSPopover.AccessibilityPerformShowDefaultUI -M:AppKit.NSPopover.AccessibilityPerformShowMenu M:AppKit.NSPopover.Dispose(System.Boolean) -M:AppKit.NSPopover.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSPopover.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSPopover.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSPopover.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSPopover.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSPopover.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSPopover.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSPopover.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSPopover.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSPopover.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSPopover.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSPopover.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSPopover.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSPopover.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSPopover.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSPopoverCloseEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSPopoverDelegate_Extensions.DidClose(AppKit.INSPopoverDelegate,Foundation.NSNotification) M:AppKit.NSPopoverDelegate_Extensions.DidDetach(AppKit.INSPopoverDelegate,AppKit.NSPopover) @@ -24617,17 +23940,6 @@ M:AppKit.NSPopoverDelegate_Extensions.GetDetachableWindowForPopover(AppKit.INSPo M:AppKit.NSPopoverDelegate_Extensions.ShouldClose(AppKit.INSPopoverDelegate,AppKit.NSPopover) M:AppKit.NSPopoverDelegate_Extensions.WillClose(AppKit.INSPopoverDelegate,Foundation.NSNotification) M:AppKit.NSPopoverDelegate_Extensions.WillShow(AppKit.INSPopoverDelegate,Foundation.NSNotification) -M:AppKit.NSPopoverDelegate.DidClose(Foundation.NSNotification) -M:AppKit.NSPopoverDelegate.DidDetach(AppKit.NSPopover) -M:AppKit.NSPopoverDelegate.DidShow(Foundation.NSNotification) -M:AppKit.NSPopoverDelegate.GetDetachableWindowForPopover(AppKit.NSPopover) -M:AppKit.NSPopoverDelegate.ShouldClose(AppKit.NSPopover) -M:AppKit.NSPopoverDelegate.WillClose(Foundation.NSNotification) -M:AppKit.NSPopoverDelegate.WillShow(Foundation.NSNotification) -M:AppKit.NSPopoverTouchBarItem.#ctor(System.String) -M:AppKit.NSPopUpButtonCell.#ctor(AppKit.NSImage) -M:AppKit.NSPopUpButtonCell.#ctor(System.String) -M:AppKit.NSPopUpButtonCell.ValidateMenuItem(AppKit.NSMenuItem) M:AppKit.NSPredicateEditorRowTemplate.#ctor(Foundation.NSCompoundPredicateType[]) M:AppKit.NSPredicateEditorRowTemplate.#ctor(System.Collections.Generic.IEnumerable{Foundation.NSExpression},CoreData.NSAttributeType,System.Collections.Generic.IEnumerable{Foundation.NSPredicateOperatorType},Foundation.NSComparisonPredicateModifier,Foundation.NSComparisonPredicateOptions) M:AppKit.NSPredicateEditorRowTemplate.#ctor(System.Collections.Generic.IEnumerable{Foundation.NSExpression},System.Collections.Generic.IEnumerable{Foundation.NSExpression},System.Collections.Generic.IEnumerable{Foundation.NSPredicateOperatorType},Foundation.NSComparisonPredicateModifier,Foundation.NSComparisonPredicateOptions) @@ -24638,7 +23950,6 @@ M:AppKit.NSPredicateEditorRowTemplate.#ctor(System.String,System.Collections.Gen M:AppKit.NSPredicateEditorRowTemplate.#ctor(System.String,System.String,System.Collections.Generic.IEnumerable{Foundation.NSPredicateOperatorType},Foundation.NSComparisonPredicateModifier,Foundation.NSComparisonPredicateOptions) M:AppKit.NSPredicateEditorRowTemplate.Copy(Foundation.NSZone) M:AppKit.NSPredicateEditorRowTemplate.EncodeTo(Foundation.NSCoder) -M:AppKit.NSPressGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:AppKit.NSPressGestureRecognizer.#ctor(System.Action) M:AppKit.NSPressGestureRecognizer.#ctor(System.Action{AppKit.NSPressGestureRecognizer}) M:AppKit.NSPreviewRepresentableActivityItem_Extensions.GetIconProvider(AppKit.INSPreviewRepresentableActivityItem) @@ -24653,19 +23964,13 @@ M:AppKit.NSPrintInfo.GetPrintSession M:AppKit.NSPrintInfo.GetPrintSettings M:AppKit.NSPrintPanel.BeginSheetAsync(AppKit.NSPrintInfo,AppKit.NSWindow) M:AppKit.NSPrintPanelAccessorizing_Extensions.KeyPathsForValuesAffectingPreview(AppKit.INSPrintPanelAccessorizing) -M:AppKit.NSPrintPanelAccessorizing.KeyPathsForValuesAffectingPreview -M:AppKit.NSPrintPanelAccessorizing.LocalizedSummaryItems -M:AppKit.NSProgressIndicator.#ctor(CoreGraphics.CGRect) M:AppKit.NSResponder_NSTouchBarProvider.GetTouchBar(AppKit.NSResponder) M:AppKit.NSResponder_NSTouchBarProvider.MakeTouchBar(AppKit.NSResponder) M:AppKit.NSResponder_NSTouchBarProvider.SetTouchBar(AppKit.NSResponder,AppKit.NSTouchBar) M:AppKit.NSResponder.EncodeTo(Foundation.NSCoder) M:AppKit.NSResponder.PresentError(Foundation.NSError,AppKit.NSWindow,Foundation.NSObject,ObjCRuntime.Selector,System.IntPtr) -M:AppKit.NSResponder.RestoreUserActivityState(Foundation.NSUserActivity) -M:AppKit.NSRotationGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:AppKit.NSRotationGestureRecognizer.#ctor(System.Action) M:AppKit.NSRotationGestureRecognizer.#ctor(System.Action{AppKit.NSRotationGestureRecognizer}) -M:AppKit.NSRuleEditor.#ctor(CoreGraphics.CGRect) M:AppKit.NSRuleEditor.add_Changed(System.EventHandler) M:AppKit.NSRuleEditor.add_EditingBegan(System.EventHandler) M:AppKit.NSRuleEditor.add_EditingEnded(System.EventHandler) @@ -24680,19 +23985,10 @@ M:AppKit.NSRuleEditorDelegate_Extensions.EditingBegan(AppKit.INSRuleEditorDelega M:AppKit.NSRuleEditorDelegate_Extensions.EditingEnded(AppKit.INSRuleEditorDelegate,Foundation.NSNotification) M:AppKit.NSRuleEditorDelegate_Extensions.PredicateParts(AppKit.INSRuleEditorDelegate,AppKit.NSRuleEditor,Foundation.NSObject,Foundation.NSObject,System.IntPtr) M:AppKit.NSRuleEditorDelegate_Extensions.RowsDidChange(AppKit.INSRuleEditorDelegate,Foundation.NSNotification) -M:AppKit.NSRuleEditorDelegate.Changed(Foundation.NSNotification) -M:AppKit.NSRuleEditorDelegate.ChildForCriterion(AppKit.NSRuleEditor,System.IntPtr,Foundation.NSObject,AppKit.NSRuleEditorRowType) -M:AppKit.NSRuleEditorDelegate.DisplayValue(AppKit.NSRuleEditor,Foundation.NSObject,System.IntPtr) -M:AppKit.NSRuleEditorDelegate.EditingBegan(Foundation.NSNotification) -M:AppKit.NSRuleEditorDelegate.EditingEnded(Foundation.NSNotification) -M:AppKit.NSRuleEditorDelegate.NumberOfChildren(AppKit.NSRuleEditor,Foundation.NSObject,AppKit.NSRuleEditorRowType) -M:AppKit.NSRuleEditorDelegate.PredicateParts(AppKit.NSRuleEditor,Foundation.NSObject,Foundation.NSObject,System.IntPtr) -M:AppKit.NSRuleEditorDelegate.RowsDidChange(Foundation.NSNotification) M:AppKit.NSRulerMarker.Copy(Foundation.NSZone) M:AppKit.NSRulerMarker.EncodeTo(Foundation.NSCoder) M:AppKit.NSRulerMarkerClientViewDelegation.RulerViewLocation(AppKit.NSView,AppKit.NSRulerView,CoreGraphics.CGPoint) M:AppKit.NSRulerMarkerClientViewDelegation.RulerViewPoint(AppKit.NSView,AppKit.NSRulerView,System.Runtime.InteropServices.NFloat) -M:AppKit.NSRulerView.#ctor(CoreGraphics.CGRect) M:AppKit.NSRulerView.Dispose(System.Boolean) M:AppKit.NSSavePanel.add_DidChangeToDirectory(System.EventHandler{AppKit.NSOpenSavePanelUrlEventArgs}) M:AppKit.NSSavePanel.add_DidSelectType(System.EventHandler{AppKit.NSopenSavePanelUTTypeEventArgs}) @@ -24705,37 +24001,18 @@ M:AppKit.NSSavePanel.remove_DidSelectType(System.EventHandler{AppKit.NSopenSaveP M:AppKit.NSSavePanel.remove_DirectoryDidChange(System.EventHandler{AppKit.NSOpenSaveFilenameEventArgs}) M:AppKit.NSSavePanel.remove_SelectionDidChange(System.EventHandler) M:AppKit.NSSavePanel.remove_WillExpand(System.EventHandler{AppKit.NSOpenSaveExpandingEventArgs}) -M:AppKit.NSScroller.#ctor(CoreGraphics.CGRect) -M:AppKit.NSScrollView.FindBarViewDidChangeHeight M:AppKit.NSScrubber.Dispose(System.Boolean) -M:AppKit.NSScrubberArrangedView.#ctor(CoreGraphics.CGRect) -M:AppKit.NSScrubberDataSource.GetNumberOfItems(AppKit.NSScrubber) -M:AppKit.NSScrubberDataSource.GetViewForItem(AppKit.NSScrubber,System.IntPtr) M:AppKit.NSScrubberDelegate_Extensions.DidBeginInteracting(AppKit.INSScrubberDelegate,AppKit.NSScrubber) M:AppKit.NSScrubberDelegate_Extensions.DidCancelInteracting(AppKit.INSScrubberDelegate,AppKit.NSScrubber) M:AppKit.NSScrubberDelegate_Extensions.DidChangeVisible(AppKit.INSScrubberDelegate,AppKit.NSScrubber,Foundation.NSRange) M:AppKit.NSScrubberDelegate_Extensions.DidFinishInteracting(AppKit.INSScrubberDelegate,AppKit.NSScrubber) M:AppKit.NSScrubberDelegate_Extensions.DidHighlightItem(AppKit.INSScrubberDelegate,AppKit.NSScrubber,System.IntPtr) M:AppKit.NSScrubberDelegate_Extensions.DidSelectItem(AppKit.INSScrubberDelegate,AppKit.NSScrubber,System.IntPtr) -M:AppKit.NSScrubberDelegate.DidBeginInteracting(AppKit.NSScrubber) -M:AppKit.NSScrubberDelegate.DidCancelInteracting(AppKit.NSScrubber) -M:AppKit.NSScrubberDelegate.DidChangeVisible(AppKit.NSScrubber,Foundation.NSRange) -M:AppKit.NSScrubberDelegate.DidFinishInteracting(AppKit.NSScrubber) -M:AppKit.NSScrubberDelegate.DidHighlightItem(AppKit.NSScrubber,System.IntPtr) -M:AppKit.NSScrubberDelegate.DidSelectItem(AppKit.NSScrubber,System.IntPtr) M:AppKit.NSScrubberFlowLayoutDelegate_Extensions.Layout(AppKit.INSScrubberFlowLayoutDelegate,AppKit.NSScrubber,AppKit.NSScrubberFlowLayout,System.IntPtr) -M:AppKit.NSScrubberFlowLayoutDelegate.DidBeginInteracting(AppKit.NSScrubber) -M:AppKit.NSScrubberFlowLayoutDelegate.DidCancelInteracting(AppKit.NSScrubber) -M:AppKit.NSScrubberFlowLayoutDelegate.DidChangeVisible(AppKit.NSScrubber,Foundation.NSRange) -M:AppKit.NSScrubberFlowLayoutDelegate.DidFinishInteracting(AppKit.NSScrubber) -M:AppKit.NSScrubberFlowLayoutDelegate.DidHighlightItem(AppKit.NSScrubber,System.IntPtr) -M:AppKit.NSScrubberFlowLayoutDelegate.DidSelectItem(AppKit.NSScrubber,System.IntPtr) -M:AppKit.NSScrubberFlowLayoutDelegate.Layout(AppKit.NSScrubber,AppKit.NSScrubberFlowLayout,System.IntPtr) M:AppKit.NSScrubberLayout.Dispose(System.Boolean) M:AppKit.NSScrubberLayout.EncodeTo(Foundation.NSCoder) M:AppKit.NSScrubberLayoutAttributes.Copy(Foundation.NSZone) M:AppKit.NSScrubberSelectionStyle.EncodeTo(Foundation.NSCoder) -M:AppKit.NSSearchField.#ctor(CoreGraphics.CGRect) M:AppKit.NSSearchField.add_SearchingEnded(System.EventHandler) M:AppKit.NSSearchField.add_SearchingStarted(System.EventHandler) M:AppKit.NSSearchField.Dispose(System.Boolean) @@ -24743,36 +24020,12 @@ M:AppKit.NSSearchField.remove_SearchingEnded(System.EventHandler) M:AppKit.NSSearchField.remove_SearchingStarted(System.EventHandler) M:AppKit.NSSearchFieldDelegate_Extensions.SearchingEnded(AppKit.INSSearchFieldDelegate,AppKit.NSSearchField) M:AppKit.NSSearchFieldDelegate_Extensions.SearchingStarted(AppKit.INSSearchFieldDelegate,AppKit.NSSearchField) -M:AppKit.NSSearchFieldDelegate.Changed(Foundation.NSNotification) -M:AppKit.NSSearchFieldDelegate.DidFailToFormatString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSSearchFieldDelegate.DidFailToValidatePartialString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSSearchFieldDelegate.DoCommandBySelector(AppKit.NSControl,AppKit.NSTextView,ObjCRuntime.Selector) -M:AppKit.NSSearchFieldDelegate.EditingBegan(Foundation.NSNotification) -M:AppKit.NSSearchFieldDelegate.EditingEnded(Foundation.NSNotification) -M:AppKit.NSSearchFieldDelegate.GetCandidates(AppKit.NSTextField,AppKit.NSTextView,Foundation.NSRange) -M:AppKit.NSSearchFieldDelegate.GetCompletions(AppKit.NSControl,AppKit.NSTextView,System.String[],Foundation.NSRange,System.IntPtr@) -M:AppKit.NSSearchFieldDelegate.GetTextCheckingResults(AppKit.NSTextField,AppKit.NSTextView,Foundation.NSTextCheckingResult[],Foundation.NSRange) -M:AppKit.NSSearchFieldDelegate.IsValidObject(AppKit.NSControl,Foundation.NSObject) -M:AppKit.NSSearchFieldDelegate.SearchingEnded(AppKit.NSSearchField) -M:AppKit.NSSearchFieldDelegate.SearchingStarted(AppKit.NSSearchField) -M:AppKit.NSSearchFieldDelegate.ShouldSelectCandidate(AppKit.NSTextField,AppKit.NSTextView,System.UIntPtr) -M:AppKit.NSSearchFieldDelegate.TextShouldBeginEditing(AppKit.NSControl,AppKit.NSText) -M:AppKit.NSSearchFieldDelegate.TextShouldEndEditing(AppKit.NSControl,AppKit.NSText) -M:AppKit.NSSearchToolbarItem.#ctor(System.String) -M:AppKit.NSSecureTextField.#ctor(CoreGraphics.CGRect) -M:AppKit.NSSecureTextFieldCell.#ctor(System.String) -M:AppKit.NSSegmentedCell.#ctor(AppKit.NSImage) -M:AppKit.NSSegmentedCell.#ctor(System.String) -M:AppKit.NSSegmentedControl.#ctor(CoreGraphics.CGRect) M:AppKit.NSSegmentedControl.FromImages(AppKit.NSImage[],AppKit.NSSegmentSwitchTracking,System.Action) M:AppKit.NSSegmentedControl.FromLabels(System.String[],AppKit.NSSegmentSwitchTracking,System.Action) M:AppKit.NSSegmentedControl.UnselectAllSegments M:AppKit.NSSeguePerforming_Extensions.PerformSegue(AppKit.INSSeguePerforming,System.String,Foundation.NSObject) M:AppKit.NSSeguePerforming_Extensions.PrepareForSegue(AppKit.INSSeguePerforming,AppKit.NSStoryboardSegue,Foundation.NSObject) M:AppKit.NSSeguePerforming_Extensions.ShouldPerformSegue(AppKit.INSSeguePerforming,System.String,Foundation.NSObject) -M:AppKit.NSSeguePerforming.PerformSegue(System.String,Foundation.NSObject) -M:AppKit.NSSeguePerforming.PrepareForSegue(AppKit.NSStoryboardSegue,Foundation.NSObject) -M:AppKit.NSSeguePerforming.ShouldPerformSegue(System.String,Foundation.NSObject) M:AppKit.NSServicesMenuRequestor_Extensions.ReadSelectionFromPasteboard(AppKit.INSServicesMenuRequestor,AppKit.NSPasteboard) M:AppKit.NSServicesMenuRequestor_Extensions.WriteSelectionToPasteboard(AppKit.INSServicesMenuRequestor,AppKit.NSPasteboard,System.String[]) M:AppKit.NSShadow.Copy(Foundation.NSZone) @@ -24794,13 +24047,6 @@ M:AppKit.NSSharingServiceDelegate_Extensions.SourceFrameOnScreenForShareItem(App M:AppKit.NSSharingServiceDelegate_Extensions.SourceWindowForShareItems(AppKit.INSSharingServiceDelegate,AppKit.NSSharingService,Foundation.NSObject[],AppKit.NSSharingContentScope) M:AppKit.NSSharingServiceDelegate_Extensions.TransitionImageForShareItem(AppKit.INSSharingServiceDelegate,AppKit.NSSharingService,AppKit.INSPasteboardWriting,CoreGraphics.CGRect) M:AppKit.NSSharingServiceDelegate_Extensions.WillShareItems(AppKit.INSSharingServiceDelegate,AppKit.NSSharingService,Foundation.NSObject[]) -M:AppKit.NSSharingServiceDelegate.CreateAnchoringView(AppKit.NSSharingService,CoreGraphics.CGRect@,AppKit.NSRectEdge@) -M:AppKit.NSSharingServiceDelegate.DidFailToShareItems(AppKit.NSSharingService,Foundation.NSObject[],Foundation.NSError) -M:AppKit.NSSharingServiceDelegate.DidShareItems(AppKit.NSSharingService,Foundation.NSObject[]) -M:AppKit.NSSharingServiceDelegate.SourceFrameOnScreenForShareItem(AppKit.NSSharingService,AppKit.INSPasteboardWriting) -M:AppKit.NSSharingServiceDelegate.SourceWindowForShareItems(AppKit.NSSharingService,Foundation.NSObject[],AppKit.NSSharingContentScope) -M:AppKit.NSSharingServiceDelegate.TransitionImageForShareItem(AppKit.NSSharingService,AppKit.INSPasteboardWriting,CoreGraphics.CGRect) -M:AppKit.NSSharingServiceDelegate.WillShareItems(AppKit.NSSharingService,Foundation.NSObject[]) M:AppKit.NSSharingServiceDidFailToShareItemsEventArgs.#ctor(Foundation.NSObject[],Foundation.NSError) M:AppKit.NSSharingServiceItemsEventArgs.#ctor(Foundation.NSObject[]) M:AppKit.NSSharingServicePicker.add_DidChooseSharingService(System.EventHandler{AppKit.NSSharingServicePickerDidChooseSharingServiceEventArgs}) @@ -24810,59 +24056,15 @@ M:AppKit.NSSharingServicePickerDelegate_Extensions.DelegateForSharingService(App M:AppKit.NSSharingServicePickerDelegate_Extensions.DidChooseSharingService(AppKit.INSSharingServicePickerDelegate,AppKit.NSSharingServicePicker,AppKit.NSSharingService) M:AppKit.NSSharingServicePickerDelegate_Extensions.GetCollaborationModeRestrictions(AppKit.INSSharingServicePickerDelegate,AppKit.NSSharingServicePicker) M:AppKit.NSSharingServicePickerDelegate_Extensions.SharingServicesForItems(AppKit.INSSharingServicePickerDelegate,AppKit.NSSharingServicePicker,Foundation.NSObject[],AppKit.NSSharingService[]) -M:AppKit.NSSharingServicePickerDelegate.DelegateForSharingService(AppKit.NSSharingServicePicker,AppKit.NSSharingService) -M:AppKit.NSSharingServicePickerDelegate.DidChooseSharingService(AppKit.NSSharingServicePicker,AppKit.NSSharingService) -M:AppKit.NSSharingServicePickerDelegate.GetCollaborationModeRestrictions(AppKit.NSSharingServicePicker) -M:AppKit.NSSharingServicePickerDelegate.SharingServicesForItems(AppKit.NSSharingServicePicker,Foundation.NSObject[],AppKit.NSSharingService[]) M:AppKit.NSSharingServicePickerDidChooseSharingServiceEventArgs.#ctor(AppKit.NSSharingService) -M:AppKit.NSSharingServicePickerToolbarItem.#ctor(System.String) M:AppKit.NSSharingServicePickerToolbarItem.Dispose(System.Boolean) -M:AppKit.NSSharingServicePickerToolbarItemDelegate.GetItems(AppKit.NSSharingServicePickerToolbarItem) -M:AppKit.NSSharingServicePickerTouchBarItem.#ctor(System.String) M:AppKit.NSSharingServicePickerTouchBarItem.Dispose(System.Boolean) -M:AppKit.NSSharingServicePickerTouchBarItemDelegate.DelegateForSharingService(AppKit.NSSharingServicePicker,AppKit.NSSharingService) -M:AppKit.NSSharingServicePickerTouchBarItemDelegate.DidChooseSharingService(AppKit.NSSharingServicePicker,AppKit.NSSharingService) -M:AppKit.NSSharingServicePickerTouchBarItemDelegate.GetCollaborationModeRestrictions(AppKit.NSSharingServicePicker) -M:AppKit.NSSharingServicePickerTouchBarItemDelegate.ItemsForSharingServicePickerTouchBarItem(AppKit.NSSharingServicePickerTouchBarItem) -M:AppKit.NSSharingServicePickerTouchBarItemDelegate.SharingServicesForItems(AppKit.NSSharingServicePicker,Foundation.NSObject[],AppKit.NSSharingService[]) -M:AppKit.NSSlider.#ctor(CoreGraphics.CGRect) -M:AppKit.NSSlider.AccessibilityPerformDecrement -M:AppKit.NSSlider.AccessibilityPerformIncrement M:AppKit.NSSlider.FromTarget(System.Action) M:AppKit.NSSlider.FromValue(System.Double,System.Double,System.Double,System.Action) -M:AppKit.NSSliderAccessory.AccessibilityPerformCancel -M:AppKit.NSSliderAccessory.AccessibilityPerformConfirm -M:AppKit.NSSliderAccessory.AccessibilityPerformDecrement -M:AppKit.NSSliderAccessory.AccessibilityPerformDelete -M:AppKit.NSSliderAccessory.AccessibilityPerformIncrement -M:AppKit.NSSliderAccessory.AccessibilityPerformPick -M:AppKit.NSSliderAccessory.AccessibilityPerformPress -M:AppKit.NSSliderAccessory.AccessibilityPerformRaise -M:AppKit.NSSliderAccessory.AccessibilityPerformShowAlternateUI -M:AppKit.NSSliderAccessory.AccessibilityPerformShowDefaultUI -M:AppKit.NSSliderAccessory.AccessibilityPerformShowMenu M:AppKit.NSSliderAccessory.Dispose(System.Boolean) M:AppKit.NSSliderAccessory.EncodeTo(Foundation.NSCoder) -M:AppKit.NSSliderAccessory.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSSliderAccessory.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSSliderAccessory.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSSliderAccessory.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSSliderAccessory.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSSliderAccessory.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSSliderAccessory.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSSliderAccessory.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSSliderAccessory.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSSliderAccessory.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSSliderAccessory.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSSliderAccessory.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSSliderAccessory.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSSliderAccessory.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSSliderAccessory.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSSliderAccessoryBehavior.Copy(Foundation.NSZone) M:AppKit.NSSliderAccessoryBehavior.EncodeTo(Foundation.NSCoder) -M:AppKit.NSSliderCell.#ctor(AppKit.NSImage) -M:AppKit.NSSliderCell.#ctor(System.String) -M:AppKit.NSSliderTouchBarItem.#ctor(System.String) M:AppKit.NSSliderTouchBarItem.add_Activated(System.EventHandler) M:AppKit.NSSliderTouchBarItem.Dispose(System.Boolean) M:AppKit.NSSliderTouchBarItem.remove_Activated(System.EventHandler) @@ -24870,30 +24072,18 @@ M:AppKit.NSSound.add_DidFinishPlaying(System.EventHandler{AppKit.NSSoundFinished M:AppKit.NSSound.Copy(Foundation.NSZone) M:AppKit.NSSound.Dispose(System.Boolean) M:AppKit.NSSound.EncodeTo(Foundation.NSCoder) -M:AppKit.NSSound.GetPasteboardPropertyListForType(System.String) -M:AppKit.NSSound.GetReadableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSSound.GetReadingOptionsForType(System.String,AppKit.NSPasteboard) -M:AppKit.NSSound.GetWritableTypesForPasteboard(AppKit.NSPasteboard) -M:AppKit.NSSound.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) M:AppKit.NSSound.IsPlaying M:AppKit.NSSound.remove_DidFinishPlaying(System.EventHandler{AppKit.NSSoundFinishedEventArgs}) M:AppKit.NSSoundDelegate_Extensions.DidFinishPlaying(AppKit.INSSoundDelegate,AppKit.NSSound,System.Boolean) -M:AppKit.NSSoundDelegate.DidFinishPlaying(AppKit.NSSound,System.Boolean) M:AppKit.NSSoundFinishedEventArgs.#ctor(System.Boolean) M:AppKit.NSSpeechRecognizer.Dispose(System.Boolean) M:AppKit.NSSpeechRecognizerDelegate_Extensions.DidRecognizeCommand(AppKit.INSSpeechRecognizerDelegate,AppKit.NSSpeechRecognizer,System.String) -M:AppKit.NSSpeechRecognizerDelegate.DidRecognizeCommand(AppKit.NSSpeechRecognizer,System.String) M:AppKit.NSSpeechSynthesizer.Dispose(System.Boolean) M:AppKit.NSSpeechSynthesizerDelegate_Extensions.DidEncounterError(AppKit.INSSpeechSynthesizerDelegate,AppKit.NSSpeechSynthesizer,System.UIntPtr,System.String,System.String) M:AppKit.NSSpeechSynthesizerDelegate_Extensions.DidEncounterSyncMessage(AppKit.INSSpeechSynthesizerDelegate,AppKit.NSSpeechSynthesizer,System.String) M:AppKit.NSSpeechSynthesizerDelegate_Extensions.DidFinishSpeaking(AppKit.INSSpeechSynthesizerDelegate,AppKit.NSSpeechSynthesizer,System.Boolean) M:AppKit.NSSpeechSynthesizerDelegate_Extensions.WillSpeakPhoneme(AppKit.INSSpeechSynthesizerDelegate,AppKit.NSSpeechSynthesizer,System.Int16) M:AppKit.NSSpeechSynthesizerDelegate_Extensions.WillSpeakWord(AppKit.INSSpeechSynthesizerDelegate,AppKit.NSSpeechSynthesizer,Foundation.NSRange,System.String) -M:AppKit.NSSpeechSynthesizerDelegate.DidEncounterError(AppKit.NSSpeechSynthesizer,System.UIntPtr,System.String,System.String) -M:AppKit.NSSpeechSynthesizerDelegate.DidEncounterSyncMessage(AppKit.NSSpeechSynthesizer,System.String) -M:AppKit.NSSpeechSynthesizerDelegate.DidFinishSpeaking(AppKit.NSSpeechSynthesizer,System.Boolean) -M:AppKit.NSSpeechSynthesizerDelegate.WillSpeakPhoneme(AppKit.NSSpeechSynthesizer,System.Int16) -M:AppKit.NSSpeechSynthesizerDelegate.WillSpeakWord(AppKit.NSSpeechSynthesizer,Foundation.NSRange,System.String) M:AppKit.NSSpellChecker.CheckString(System.String,Foundation.NSRange,Foundation.NSTextCheckingTypes,AppKit.NSTextCheckingOptions,System.IntPtr,Foundation.NSOrthography@,System.IntPtr@) M:AppKit.NSSpellChecker.IsAutomaticDashSubstitutionEnabled M:AppKit.NSSpellChecker.IsAutomaticQuoteSubstitutionEnabled @@ -24902,16 +24092,7 @@ M:AppKit.NSSpellChecker.RequestCandidatesAsync(Foundation.NSRange,System.String, M:AppKit.NSSpellChecker.RequestCandidatesAsync(Foundation.NSRange,System.String,System.UInt64,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.IntPtr) M:AppKit.NSSpellChecker.RequestChecking(System.String,Foundation.NSRange,Foundation.NSTextCheckingTypes,AppKit.NSTextCheckingOptions,System.IntPtr,System.Action{System.IntPtr,Foundation.NSTextCheckingResult[],Foundation.NSOrthography,System.IntPtr}) M:AppKit.NSSpellCheckerCandidates.#ctor(System.IntPtr,Foundation.NSTextCheckingResult[]) -M:AppKit.NSSplitView.#ctor(CoreGraphics.CGRect) M:AppKit.NSSplitView.Dispose(System.Boolean) -M:AppKit.NSSplitViewController.#ctor(System.String,Foundation.NSBundle) -M:AppKit.NSSplitViewController.ConstrainSplitPosition(AppKit.NSSplitView,System.Runtime.InteropServices.NFloat,System.IntPtr) -M:AppKit.NSSplitViewController.DidResizeSubviews(Foundation.NSNotification) -M:AppKit.NSSplitViewController.Resize(AppKit.NSSplitView,CoreGraphics.CGSize) -M:AppKit.NSSplitViewController.SetMaxCoordinateOfSubview(AppKit.NSSplitView,System.Runtime.InteropServices.NFloat,System.IntPtr) -M:AppKit.NSSplitViewController.SetMinCoordinateOfSubview(AppKit.NSSplitView,System.Runtime.InteropServices.NFloat,System.IntPtr) -M:AppKit.NSSplitViewController.ShouldAdjustSize(AppKit.NSSplitView,AppKit.NSView) -M:AppKit.NSSplitViewController.SplitViewWillResizeSubviews(Foundation.NSNotification) M:AppKit.NSSplitViewDelegate_Extensions.CanCollapse(AppKit.INSSplitViewDelegate,AppKit.NSSplitView,AppKit.NSView) M:AppKit.NSSplitViewDelegate_Extensions.ConstrainSplitPosition(AppKit.INSSplitViewDelegate,AppKit.NSSplitView,System.Runtime.InteropServices.NFloat,System.IntPtr) M:AppKit.NSSplitViewDelegate_Extensions.DidResizeSubviews(AppKit.INSSplitViewDelegate,Foundation.NSNotification) @@ -24924,38 +24105,15 @@ M:AppKit.NSSplitViewDelegate_Extensions.ShouldAdjustSize(AppKit.INSSplitViewDele M:AppKit.NSSplitViewDelegate_Extensions.ShouldCollapseForDoubleClick(AppKit.INSSplitViewDelegate,AppKit.NSSplitView,AppKit.NSView,System.IntPtr) M:AppKit.NSSplitViewDelegate_Extensions.ShouldHideDivider(AppKit.INSSplitViewDelegate,AppKit.NSSplitView,System.IntPtr) M:AppKit.NSSplitViewDelegate_Extensions.SplitViewWillResizeSubviews(AppKit.INSSplitViewDelegate,Foundation.NSNotification) -M:AppKit.NSSplitViewDelegate.CanCollapse(AppKit.NSSplitView,AppKit.NSView) -M:AppKit.NSSplitViewDelegate.ConstrainSplitPosition(AppKit.NSSplitView,System.Runtime.InteropServices.NFloat,System.IntPtr) -M:AppKit.NSSplitViewDelegate.DidResizeSubviews(Foundation.NSNotification) -M:AppKit.NSSplitViewDelegate.GetAdditionalEffectiveRect(AppKit.NSSplitView,System.IntPtr) -M:AppKit.NSSplitViewDelegate.GetEffectiveRect(AppKit.NSSplitView,CoreGraphics.CGRect,CoreGraphics.CGRect,System.IntPtr) -M:AppKit.NSSplitViewDelegate.Resize(AppKit.NSSplitView,CoreGraphics.CGSize) -M:AppKit.NSSplitViewDelegate.SetMaxCoordinateOfSubview(AppKit.NSSplitView,System.Runtime.InteropServices.NFloat,System.IntPtr) -M:AppKit.NSSplitViewDelegate.SetMinCoordinateOfSubview(AppKit.NSSplitView,System.Runtime.InteropServices.NFloat,System.IntPtr) -M:AppKit.NSSplitViewDelegate.ShouldAdjustSize(AppKit.NSSplitView,AppKit.NSView) -M:AppKit.NSSplitViewDelegate.ShouldCollapseForDoubleClick(AppKit.NSSplitView,AppKit.NSView,System.IntPtr) -M:AppKit.NSSplitViewDelegate.ShouldHideDivider(AppKit.NSSplitView,System.IntPtr) -M:AppKit.NSSplitViewDelegate.SplitViewWillResizeSubviews(Foundation.NSNotification) M:AppKit.NSSplitViewDividerIndexEventArgs.#ctor(Foundation.NSNotification) -M:AppKit.NSSplitViewItem.AnimationFor(Foundation.NSString) -M:AppKit.NSSplitViewItem.DefaultAnimationFor(Foundation.NSString) M:AppKit.NSSplitViewItem.EncodeTo(Foundation.NSCoder) M:AppKit.NSSpringLoadingDestination_Extensions.DraggingEnded(AppKit.INSSpringLoadingDestination,AppKit.INSDraggingInfo) M:AppKit.NSSpringLoadingDestination_Extensions.Entered(AppKit.INSSpringLoadingDestination,AppKit.INSDraggingInfo) M:AppKit.NSSpringLoadingDestination_Extensions.Exited(AppKit.INSSpringLoadingDestination,AppKit.INSDraggingInfo) M:AppKit.NSSpringLoadingDestination_Extensions.Updated(AppKit.INSSpringLoadingDestination,AppKit.INSDraggingInfo) -M:AppKit.NSSpringLoadingDestination.Activated(System.Boolean,AppKit.INSDraggingInfo) -M:AppKit.NSSpringLoadingDestination.DraggingEnded(AppKit.INSDraggingInfo) -M:AppKit.NSSpringLoadingDestination.Entered(AppKit.INSDraggingInfo) -M:AppKit.NSSpringLoadingDestination.Exited(AppKit.INSDraggingInfo) -M:AppKit.NSSpringLoadingDestination.HighlightChanged(AppKit.INSDraggingInfo) -M:AppKit.NSSpringLoadingDestination.Updated(AppKit.INSDraggingInfo) -M:AppKit.NSStackView.#ctor(CoreGraphics.CGRect) M:AppKit.NSStackView.Dispose(System.Boolean) M:AppKit.NSStackViewDelegate_Extensions.DidReattachViews(AppKit.INSStackViewDelegate,AppKit.NSStackView,AppKit.NSView[]) M:AppKit.NSStackViewDelegate_Extensions.WillDetachViews(AppKit.INSStackViewDelegate,AppKit.NSStackView,AppKit.NSView[]) -M:AppKit.NSStackViewDelegate.DidReattachViews(AppKit.NSStackView,AppKit.NSView[]) -M:AppKit.NSStackViewDelegate.WillDetachViews(AppKit.NSStackView,AppKit.NSView[]) M:AppKit.NSStandardKeyBindingMethods.QuickLookPreviewItems(AppKit.NSResponder,Foundation.NSObject) M:AppKit.NSStandardKeyBindingResponding_Extensions.CancelOperation(AppKit.INSStandardKeyBindingResponding,Foundation.NSObject) M:AppKit.NSStandardKeyBindingResponding_Extensions.CapitalizeWord(AppKit.INSStandardKeyBindingResponding,Foundation.NSObject) @@ -25054,13 +24212,9 @@ M:AppKit.NSStandardKeyBindingResponding_Extensions.TransposeWords(AppKit.INSStan M:AppKit.NSStandardKeyBindingResponding_Extensions.UppercaseWord(AppKit.INSStandardKeyBindingResponding,Foundation.NSObject) M:AppKit.NSStandardKeyBindingResponding_Extensions.Yank(AppKit.INSStandardKeyBindingResponding,Foundation.NSObject) M:AppKit.NSStatusBar.CreateStatusItem(AppKit.NSStatusItemLength) -M:AppKit.NSStatusBarButton.#ctor(CoreGraphics.CGRect) M:AppKit.NSStatusItem.add_DoubleClick(System.EventHandler) M:AppKit.NSStatusItem.Dispose(System.Boolean) M:AppKit.NSStatusItem.remove_DoubleClick(System.EventHandler) -M:AppKit.NSStepper.#ctor(CoreGraphics.CGRect) -M:AppKit.NSStepper.AccessibilityPerformDecrement -M:AppKit.NSStepper.AccessibilityPerformIncrement M:AppKit.NSStepperTouchBarItem.Dispose(System.Boolean) M:AppKit.NSStringAttributes.#ctor M:AppKit.NSStringAttributes.#ctor(Foundation.NSDictionary) @@ -25081,17 +24235,9 @@ M:AppKit.NSStringDrawing.DrawInRect(System.String,CoreGraphics.CGRect,AppKit.NSS M:AppKit.NSStringDrawing.DrawInRect(System.String,CoreGraphics.CGRect,Foundation.NSDictionary) M:AppKit.NSStringDrawing.StringSize(System.String,AppKit.NSStringAttributes) M:AppKit.NSStringDrawing.StringSize(System.String,Foundation.NSDictionary) -M:AppKit.NSSwitch.AccessibilityPerformDecrement -M:AppKit.NSSwitch.AccessibilityPerformIncrement -M:AppKit.NSSwitch.AccessibilityPerformPress -M:AppKit.NSTableCellView.#ctor(CoreGraphics.CGRect) M:AppKit.NSTableCellView.Dispose(System.Boolean) M:AppKit.NSTableColumn.#ctor(System.String) M:AppKit.NSTableColumn.EncodeTo(Foundation.NSCoder) -M:AppKit.NSTableHeaderCell.#ctor(System.String) -M:AppKit.NSTableHeaderView.#ctor(CoreGraphics.CGRect) -M:AppKit.NSTableHeaderView.GetStringForToolTip(AppKit.NSView,System.IntPtr,CoreGraphics.CGPoint,System.IntPtr) -M:AppKit.NSTableRowView.#ctor(CoreGraphics.CGRect) M:AppKit.NSTableView.add_ColumnDidMove(System.EventHandler) M:AppKit.NSTableView.add_ColumnDidResize(System.EventHandler) M:AppKit.NSTableView.add_DidAddRowView(System.EventHandler{AppKit.NSTableViewRowEventArgs}) @@ -25105,12 +24251,6 @@ M:AppKit.NSTableView.add_SelectionIsChanging(System.EventHandler) M:AppKit.NSTableView.add_UserDidChangeVisibility(System.EventHandler{AppKit.NSTableViewUserCanChangeColumnsVisibilityEventArgs}) M:AppKit.NSTableView.add_WillDisplayCell(System.EventHandler{AppKit.NSTableViewCellEventArgs}) M:AppKit.NSTableView.Dispose(System.Boolean) -M:AppKit.NSTableView.DraggedImageBeganAt(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSTableView.DraggedImageEndedAtDeposited(AppKit.NSImage,CoreGraphics.CGPoint,System.Boolean) -M:AppKit.NSTableView.DraggedImageEndedAtOperation(AppKit.NSImage,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSTableView.DraggedImageMovedTo(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSTableView.DraggingSourceOperationMaskForLocal(System.Boolean) -M:AppKit.NSTableView.NamesOfPromisedFilesDroppedAtDestination(Foundation.NSUrl) M:AppKit.NSTableView.remove_ColumnDidMove(System.EventHandler) M:AppKit.NSTableView.remove_ColumnDidResize(System.EventHandler) M:AppKit.NSTableView.remove_DidAddRowView(System.EventHandler{AppKit.NSTableViewRowEventArgs}) @@ -25125,7 +24265,6 @@ M:AppKit.NSTableView.remove_UserDidChangeVisibility(System.EventHandler{AppKit.N M:AppKit.NSTableView.remove_WillDisplayCell(System.EventHandler{AppKit.NSTableViewCellEventArgs}) M:AppKit.NSTableView.SelectColumn(System.IntPtr,System.Boolean) M:AppKit.NSTableView.SelectRow(System.IntPtr,System.Boolean) -M:AppKit.NSTableView.ValidateUserInterfaceItem(AppKit.INSValidatedUserInterfaceItem) M:AppKit.NSTableViewCellEventArgs.#ctor(Foundation.NSObject,AppKit.NSTableColumn,System.IntPtr) M:AppKit.NSTableViewDataSource_Extensions.AcceptDrop(AppKit.INSTableViewDataSource,AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) M:AppKit.NSTableViewDataSource_Extensions.DraggingSessionEnded(AppKit.INSTableViewDataSource,AppKit.NSTableView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) @@ -25139,18 +24278,6 @@ M:AppKit.NSTableViewDataSource_Extensions.SortDescriptorsChanged(AppKit.INSTable M:AppKit.NSTableViewDataSource_Extensions.UpdateDraggingItems(AppKit.INSTableViewDataSource,AppKit.NSTableView,AppKit.INSDraggingInfo) M:AppKit.NSTableViewDataSource_Extensions.ValidateDrop(AppKit.INSTableViewDataSource,AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) M:AppKit.NSTableViewDataSource_Extensions.WriteRows(AppKit.INSTableViewDataSource,AppKit.NSTableView,Foundation.NSIndexSet,AppKit.NSPasteboard) -M:AppKit.NSTableViewDataSource.AcceptDrop(AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) -M:AppKit.NSTableViewDataSource.DraggingSessionEnded(AppKit.NSTableView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSTableViewDataSource.DraggingSessionWillBegin(AppKit.NSTableView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSIndexSet) -M:AppKit.NSTableViewDataSource.FilesDropped(AppKit.NSTableView,Foundation.NSUrl,Foundation.NSIndexSet) -M:AppKit.NSTableViewDataSource.GetObjectValue(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDataSource.GetPasteboardWriterForRow(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewDataSource.GetRowCount(AppKit.NSTableView) -M:AppKit.NSTableViewDataSource.SetObjectValue(AppKit.NSTableView,Foundation.NSObject,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDataSource.SortDescriptorsChanged(AppKit.NSTableView,Foundation.NSSortDescriptor[]) -M:AppKit.NSTableViewDataSource.UpdateDraggingItems(AppKit.NSTableView,AppKit.INSDraggingInfo) -M:AppKit.NSTableViewDataSource.ValidateDrop(AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) -M:AppKit.NSTableViewDataSource.WriteRows(AppKit.NSTableView,Foundation.NSIndexSet,AppKit.NSPasteboard) M:AppKit.NSTableViewDelegate_Extensions.ColumnDidMove(AppKit.INSTableViewDelegate,Foundation.NSNotification) M:AppKit.NSTableViewDelegate_Extensions.ColumnDidResize(AppKit.INSTableViewDelegate,Foundation.NSNotification) M:AppKit.NSTableViewDelegate_Extensions.CoreGetRowView(AppKit.INSTableViewDelegate,AppKit.NSTableView,System.IntPtr) @@ -25182,94 +24309,11 @@ M:AppKit.NSTableViewDelegate_Extensions.ShouldTypeSelect(AppKit.INSTableViewDele M:AppKit.NSTableViewDelegate_Extensions.UserCanChangeVisibility(AppKit.INSTableViewDelegate,AppKit.NSTableView,AppKit.NSTableColumn) M:AppKit.NSTableViewDelegate_Extensions.UserDidChangeVisibility(AppKit.INSTableViewDelegate,AppKit.NSTableView,AppKit.NSTableColumn[]) M:AppKit.NSTableViewDelegate_Extensions.WillDisplayCell(AppKit.INSTableViewDelegate,AppKit.NSTableView,Foundation.NSObject,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDelegate.ColumnDidMove(Foundation.NSNotification) -M:AppKit.NSTableViewDelegate.ColumnDidResize(Foundation.NSNotification) -M:AppKit.NSTableViewDelegate.CoreGetRowView(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewDelegate.DidAddRowView(AppKit.NSTableView,AppKit.NSTableRowView,System.IntPtr) -M:AppKit.NSTableViewDelegate.DidClickTableColumn(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewDelegate.DidDragTableColumn(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewDelegate.DidRemoveRowView(AppKit.NSTableView,AppKit.NSTableRowView,System.IntPtr) -M:AppKit.NSTableViewDelegate.GetDataCell(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDelegate.GetNextTypeSelectMatch(AppKit.NSTableView,System.IntPtr,System.IntPtr,System.String) -M:AppKit.NSTableViewDelegate.GetRowHeight(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewDelegate.GetSelectionIndexes(AppKit.NSTableView,Foundation.NSIndexSet) -M:AppKit.NSTableViewDelegate.GetSelectString(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDelegate.GetSizeToFitColumnWidth(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewDelegate.GetToolTip(AppKit.NSTableView,AppKit.NSCell,CoreGraphics.CGRect@,AppKit.NSTableColumn,System.IntPtr,CoreGraphics.CGPoint) -M:AppKit.NSTableViewDelegate.GetViewForItem(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDelegate.IsGroupRow(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewDelegate.MouseDownInHeaderOfTableColumn(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewDelegate.RowActions(AppKit.NSTableView,System.IntPtr,AppKit.NSTableRowActionEdge) -M:AppKit.NSTableViewDelegate.SelectionDidChange(Foundation.NSNotification) -M:AppKit.NSTableViewDelegate.SelectionIsChanging(Foundation.NSNotification) -M:AppKit.NSTableViewDelegate.SelectionShouldChange(AppKit.NSTableView) -M:AppKit.NSTableViewDelegate.ShouldEditTableColumn(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDelegate.ShouldReorder(AppKit.NSTableView,System.IntPtr,System.IntPtr) -M:AppKit.NSTableViewDelegate.ShouldSelectRow(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewDelegate.ShouldSelectTableColumn(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewDelegate.ShouldShowCellExpansion(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDelegate.ShouldTrackCell(AppKit.NSTableView,AppKit.NSCell,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDelegate.ShouldTypeSelect(AppKit.NSTableView,AppKit.NSEvent,System.String) -M:AppKit.NSTableViewDelegate.UserCanChangeVisibility(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewDelegate.UserDidChangeVisibility(AppKit.NSTableView,AppKit.NSTableColumn[]) -M:AppKit.NSTableViewDelegate.WillDisplayCell(AppKit.NSTableView,Foundation.NSObject,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDiffableDataSource`2.AcceptDrop(AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) M:AppKit.NSTableViewDiffableDataSource`2.ApplySnapshotAsync(AppKit.NSDiffableDataSourceSnapshot{`0,`1},System.Boolean) -M:AppKit.NSTableViewDiffableDataSource`2.DraggingSessionEnded(AppKit.NSTableView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSTableViewDiffableDataSource`2.DraggingSessionWillBegin(AppKit.NSTableView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSIndexSet) -M:AppKit.NSTableViewDiffableDataSource`2.FilesDropped(AppKit.NSTableView,Foundation.NSUrl,Foundation.NSIndexSet) -M:AppKit.NSTableViewDiffableDataSource`2.GetObjectValue(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDiffableDataSource`2.GetPasteboardWriterForRow(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewDiffableDataSource`2.GetRowCount(AppKit.NSTableView) -M:AppKit.NSTableViewDiffableDataSource`2.SetObjectValue(AppKit.NSTableView,Foundation.NSObject,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewDiffableDataSource`2.SortDescriptorsChanged(AppKit.NSTableView,Foundation.NSSortDescriptor[]) -M:AppKit.NSTableViewDiffableDataSource`2.UpdateDraggingItems(AppKit.NSTableView,AppKit.INSDraggingInfo) -M:AppKit.NSTableViewDiffableDataSource`2.ValidateDrop(AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) -M:AppKit.NSTableViewDiffableDataSource`2.WriteRows(AppKit.NSTableView,Foundation.NSIndexSet,AppKit.NSPasteboard) M:AppKit.NSTableViewRowAction.Copy(Foundation.NSZone) M:AppKit.NSTableViewRowEventArgs.#ctor(AppKit.NSTableRowView,System.IntPtr) -M:AppKit.NSTableViewSource.AcceptDrop(AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) -M:AppKit.NSTableViewSource.ColumnDidMove(Foundation.NSNotification) -M:AppKit.NSTableViewSource.ColumnDidResize(Foundation.NSNotification) -M:AppKit.NSTableViewSource.DidAddRowView(AppKit.NSTableView,AppKit.NSTableRowView,System.IntPtr) -M:AppKit.NSTableViewSource.DidClickTableColumn(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewSource.DidDragTableColumn(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewSource.DidRemoveRowView(AppKit.NSTableView,AppKit.NSTableRowView,System.IntPtr) -M:AppKit.NSTableViewSource.DraggingSessionEnded(AppKit.NSTableView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSTableViewSource.DraggingSessionWillBegin(AppKit.NSTableView,AppKit.NSDraggingSession,CoreGraphics.CGPoint,Foundation.NSIndexSet) -M:AppKit.NSTableViewSource.FilesDropped(AppKit.NSTableView,Foundation.NSUrl,Foundation.NSIndexSet) -M:AppKit.NSTableViewSource.GetCell(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.GetNextTypeSelectMatch(AppKit.NSTableView,System.IntPtr,System.IntPtr,System.String) -M:AppKit.NSTableViewSource.GetObjectValue(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.GetPasteboardWriterForRow(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewSource.GetRowCount(AppKit.NSTableView) -M:AppKit.NSTableViewSource.GetRowHeight(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewSource.GetRowView(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewSource.GetSelectionIndexes(AppKit.NSTableView,Foundation.NSIndexSet) -M:AppKit.NSTableViewSource.GetSelectString(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.GetSizeToFitColumnWidth(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewSource.GetViewForItem(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.IsGroupRow(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewSource.MouseDown(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewSource.SelectionDidChange(Foundation.NSNotification) -M:AppKit.NSTableViewSource.SelectionIsChanging(Foundation.NSNotification) -M:AppKit.NSTableViewSource.SelectionShouldChange(AppKit.NSTableView) -M:AppKit.NSTableViewSource.SetObjectValue(AppKit.NSTableView,Foundation.NSObject,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.ShouldEditTableColumn(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.ShouldReorder(AppKit.NSTableView,System.IntPtr,System.IntPtr) -M:AppKit.NSTableViewSource.ShouldSelectRow(AppKit.NSTableView,System.IntPtr) -M:AppKit.NSTableViewSource.ShouldSelectTableColumn(AppKit.NSTableView,AppKit.NSTableColumn) -M:AppKit.NSTableViewSource.ShouldShowCellExpansion(AppKit.NSTableView,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.ShouldTrackCell(AppKit.NSTableView,AppKit.NSCell,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.ShouldTypeSelect(AppKit.NSTableView,AppKit.NSEvent,System.String) -M:AppKit.NSTableViewSource.SortDescriptorsChanged(AppKit.NSTableView,Foundation.NSSortDescriptor[]) -M:AppKit.NSTableViewSource.UpdateDraggingItems(AppKit.NSTableView,AppKit.INSDraggingInfo) -M:AppKit.NSTableViewSource.ValidateDrop(AppKit.NSTableView,AppKit.INSDraggingInfo,System.IntPtr,AppKit.NSTableViewDropOperation) -M:AppKit.NSTableViewSource.WillDisplayCell(AppKit.NSTableView,Foundation.NSObject,AppKit.NSTableColumn,System.IntPtr) -M:AppKit.NSTableViewSource.WriteRows(AppKit.NSTableView,Foundation.NSIndexSet,AppKit.NSPasteboard) M:AppKit.NSTableViewTableEventArgs.#ctor(AppKit.NSTableColumn) M:AppKit.NSTableViewUserCanChangeColumnsVisibilityEventArgs.#ctor(AppKit.NSTableColumn[]) -M:AppKit.NSTabView.#ctor(CoreGraphics.CGRect) M:AppKit.NSTabView.add_DidSelect(System.EventHandler{AppKit.NSTabViewItemEventArgs}) M:AppKit.NSTabView.add_NumberOfItemsChanged(System.EventHandler) M:AppKit.NSTabView.add_WillSelect(System.EventHandler{AppKit.NSTabViewItemEventArgs}) @@ -25277,20 +24321,10 @@ M:AppKit.NSTabView.Dispose(System.Boolean) M:AppKit.NSTabView.remove_DidSelect(System.EventHandler{AppKit.NSTabViewItemEventArgs}) M:AppKit.NSTabView.remove_NumberOfItemsChanged(System.EventHandler) M:AppKit.NSTabView.remove_WillSelect(System.EventHandler{AppKit.NSTabViewItemEventArgs}) -M:AppKit.NSTabViewController.#ctor(System.String,Foundation.NSBundle) -M:AppKit.NSTabViewController.DidRemoveItem(Foundation.NSNotification) -M:AppKit.NSTabViewController.GetItemCanBeInsertedAt(AppKit.NSToolbar,System.String,System.IntPtr) -M:AppKit.NSTabViewController.GetToolbarImmovableItemIdentifiers(AppKit.NSToolbar) -M:AppKit.NSTabViewController.NumberOfItemsChanged(AppKit.NSTabView) -M:AppKit.NSTabViewController.WillAddItem(Foundation.NSNotification) M:AppKit.NSTabViewDelegate_Extensions.DidSelect(AppKit.INSTabViewDelegate,AppKit.NSTabView,AppKit.NSTabViewItem) M:AppKit.NSTabViewDelegate_Extensions.NumberOfItemsChanged(AppKit.INSTabViewDelegate,AppKit.NSTabView) M:AppKit.NSTabViewDelegate_Extensions.ShouldSelectTabViewItem(AppKit.INSTabViewDelegate,AppKit.NSTabView,AppKit.NSTabViewItem) M:AppKit.NSTabViewDelegate_Extensions.WillSelect(AppKit.INSTabViewDelegate,AppKit.NSTabView,AppKit.NSTabViewItem) -M:AppKit.NSTabViewDelegate.DidSelect(AppKit.NSTabView,AppKit.NSTabViewItem) -M:AppKit.NSTabViewDelegate.NumberOfItemsChanged(AppKit.NSTabView) -M:AppKit.NSTabViewDelegate.ShouldSelectTabViewItem(AppKit.NSTabView,AppKit.NSTabViewItem) -M:AppKit.NSTabViewDelegate.WillSelect(AppKit.NSTabView,AppKit.NSTabViewItem) M:AppKit.NSTabViewItem.EncodeTo(Foundation.NSCoder) M:AppKit.NSTabViewItemEventArgs.#ctor(AppKit.NSTabViewItem) M:AppKit.NSText.add_TextDidBeginEditing(System.EventHandler) @@ -25313,14 +24347,11 @@ M:AppKit.NSTextAttachment.GetImageForBounds(CoreGraphics.CGRect,Foundation.NSDic M:AppKit.NSTextAttachment.GetTextAttachmentViewProviderClass(System.String) M:AppKit.NSTextAttachment.GetViewProvider(AppKit.NSView,AppKit.INSTextLocation,AppKit.NSTextContainer) M:AppKit.NSTextAttachment.RegisterViewProviderClass(ObjCRuntime.Class,System.String) -M:AppKit.NSTextAttachmentCell.#ctor(AppKit.NSImage) -M:AppKit.NSTextAttachmentCell.#ctor(System.String) M:AppKit.NSTextAttachmentContainer.GetAttachmentBounds(AppKit.NSTextContainer,CoreGraphics.CGRect,CoreGraphics.CGPoint,System.UIntPtr) M:AppKit.NSTextAttachmentContainer.GetImageForBounds(CoreGraphics.CGRect,AppKit.NSTextContainer,System.UIntPtr) M:AppKit.NSTextAttachmentViewProvider.#ctor(AppKit.NSTextAttachment,AppKit.NSView,AppKit.NSTextLayoutManager,AppKit.INSTextLocation) M:AppKit.NSTextAttachmentViewProvider.Dispose(System.Boolean) M:AppKit.NSTextAttachmentViewProvider.GetAttachmentBounds(Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},AppKit.INSTextLocation,AppKit.NSTextContainer,CoreGraphics.CGRect,CoreGraphics.CGPoint) -M:AppKit.NSTextAttachmentViewProvider.LoadView M:AppKit.NSTextBlock.Copy(Foundation.NSZone) M:AppKit.NSTextBlock.EncodeTo(Foundation.NSCoder) M:AppKit.NSTextCheckingController.CheckText(Foundation.NSRange,Foundation.NSTextCheckingTypes,AppKit.NSTextCheckingOptions) @@ -25332,7 +24363,6 @@ M:AppKit.NSTextContainer.FromContainerSize(CoreGraphics.CGSize) M:AppKit.NSTextContainer.FromSize(CoreGraphics.CGSize) M:AppKit.NSTextContainer.GetLineFragmentRect(CoreGraphics.CGRect,System.UIntPtr,Foundation.NSWritingDirection,CoreGraphics.CGRect@) M:AppKit.NSTextContainer.ReplaceLayoutManager(AppKit.NSLayoutManager) -M:AppKit.NSTextContentManager.#ctor M:AppKit.NSTextContentManager.Add(AppKit.NSTextLayoutManager) M:AppKit.NSTextContentManager.AdjustedRange(AppKit.NSTextRange,System.Boolean) M:AppKit.NSTextContentManager.Dispose(System.Boolean) @@ -25370,11 +24400,6 @@ M:AppKit.NSTextDelegate_Extensions.TextDidChange(AppKit.INSTextDelegate,Foundati M:AppKit.NSTextDelegate_Extensions.TextDidEndEditing(AppKit.INSTextDelegate,Foundation.NSNotification) M:AppKit.NSTextDelegate_Extensions.TextShouldBeginEditing(AppKit.INSTextDelegate,AppKit.NSText) M:AppKit.NSTextDelegate_Extensions.TextShouldEndEditing(AppKit.INSTextDelegate,AppKit.NSText) -M:AppKit.NSTextDelegate.TextDidBeginEditing(Foundation.NSNotification) -M:AppKit.NSTextDelegate.TextDidChange(Foundation.NSNotification) -M:AppKit.NSTextDelegate.TextDidEndEditing(Foundation.NSNotification) -M:AppKit.NSTextDelegate.TextShouldBeginEditing(AppKit.NSText) -M:AppKit.NSTextDelegate.TextShouldEndEditing(AppKit.NSText) M:AppKit.NSTextDidEndEditingEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSTextElement.#ctor(AppKit.NSTextContentManager) M:AppKit.NSTextElement.Dispose(System.Boolean) @@ -25385,25 +24410,16 @@ M:AppKit.NSTextField_NSTouchBar.GetAllowsCharacterPickerTouchBarItem(AppKit.NSTe M:AppKit.NSTextField_NSTouchBar.GetAutomaticTextCompletionEnabled(AppKit.NSTextField) M:AppKit.NSTextField_NSTouchBar.SetAllowsCharacterPickerTouchBarItem(AppKit.NSTextField,System.Boolean) M:AppKit.NSTextField_NSTouchBar.SetAutomaticTextCompletionEnabled(AppKit.NSTextField,System.Boolean) -M:AppKit.NSTextField.#ctor(CoreGraphics.CGRect) M:AppKit.NSTextField.add_Changed(System.EventHandler) M:AppKit.NSTextField.add_DidFailToValidatePartialString(System.EventHandler{AppKit.NSControlTextErrorEventArgs}) M:AppKit.NSTextField.add_EditingBegan(System.EventHandler) M:AppKit.NSTextField.add_EditingEnded(System.EventHandler) M:AppKit.NSTextField.Dispose(System.Boolean) -M:AppKit.NSTextField.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSTextField.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSTextField.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSTextField.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSTextField.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSTextField.GetContentType M:AppKit.NSTextField.remove_Changed(System.EventHandler) M:AppKit.NSTextField.remove_DidFailToValidatePartialString(System.EventHandler{AppKit.NSControlTextErrorEventArgs}) M:AppKit.NSTextField.remove_EditingBegan(System.EventHandler) M:AppKit.NSTextField.remove_EditingEnded(System.EventHandler) M:AppKit.NSTextField.SetContentType(Foundation.NSString) -M:AppKit.NSTextField.ValidateUserInterfaceItem(AppKit.INSValidatedUserInterfaceItem) -M:AppKit.NSTextFieldCell.#ctor(AppKit.NSImage) M:AppKit.NSTextFieldDelegate_Extensions.Changed(AppKit.INSTextFieldDelegate,Foundation.NSNotification) M:AppKit.NSTextFieldDelegate_Extensions.DidFailToFormatString(AppKit.INSTextFieldDelegate,AppKit.NSControl,System.String,System.String) M:AppKit.NSTextFieldDelegate_Extensions.DidFailToValidatePartialString(AppKit.INSTextFieldDelegate,AppKit.NSControl,System.String,System.String) @@ -25417,23 +24433,9 @@ M:AppKit.NSTextFieldDelegate_Extensions.IsValidObject(AppKit.INSTextFieldDelegat M:AppKit.NSTextFieldDelegate_Extensions.ShouldSelectCandidate(AppKit.INSTextFieldDelegate,AppKit.NSTextField,AppKit.NSTextView,System.UIntPtr) M:AppKit.NSTextFieldDelegate_Extensions.TextShouldBeginEditing(AppKit.INSTextFieldDelegate,AppKit.NSControl,AppKit.NSText) M:AppKit.NSTextFieldDelegate_Extensions.TextShouldEndEditing(AppKit.INSTextFieldDelegate,AppKit.NSControl,AppKit.NSText) -M:AppKit.NSTextFieldDelegate.Changed(Foundation.NSNotification) -M:AppKit.NSTextFieldDelegate.DidFailToFormatString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSTextFieldDelegate.DidFailToValidatePartialString(AppKit.NSControl,System.String,System.String) -M:AppKit.NSTextFieldDelegate.DoCommandBySelector(AppKit.NSControl,AppKit.NSTextView,ObjCRuntime.Selector) -M:AppKit.NSTextFieldDelegate.EditingBegan(Foundation.NSNotification) -M:AppKit.NSTextFieldDelegate.EditingEnded(Foundation.NSNotification) -M:AppKit.NSTextFieldDelegate.GetCandidates(AppKit.NSTextField,AppKit.NSTextView,Foundation.NSRange) -M:AppKit.NSTextFieldDelegate.GetCompletions(AppKit.NSControl,AppKit.NSTextView,System.String[],Foundation.NSRange,System.IntPtr@) -M:AppKit.NSTextFieldDelegate.GetTextCheckingResults(AppKit.NSTextField,AppKit.NSTextView,Foundation.NSTextCheckingResult[],Foundation.NSRange) -M:AppKit.NSTextFieldDelegate.IsValidObject(AppKit.NSControl,Foundation.NSObject) -M:AppKit.NSTextFieldDelegate.ShouldSelectCandidate(AppKit.NSTextField,AppKit.NSTextView,System.UIntPtr) -M:AppKit.NSTextFieldDelegate.TextShouldBeginEditing(AppKit.NSControl,AppKit.NSText) -M:AppKit.NSTextFieldDelegate.TextShouldEndEditing(AppKit.NSControl,AppKit.NSText) M:AppKit.NSTextFinder.Dispose(System.Boolean) M:AppKit.NSTextFinder.EncodeTo(Foundation.NSCoder) M:AppKit.NSTextFinderBarContainer_Extensions.GetContentView(AppKit.INSTextFinderBarContainer) -M:AppKit.NSTextFinderBarContainer.FindBarViewDidChangeHeight M:AppKit.NSTextFinderClient_Extensions.DidReplaceCharacters(AppKit.INSTextFinderClient) M:AppKit.NSTextFinderClient_Extensions.DrawCharacters(AppKit.INSTextFinderClient,Foundation.NSRange,AppKit.NSView) M:AppKit.NSTextFinderClient_Extensions.GetAllowsMultipleSelection(AppKit.INSTextFinderClient) @@ -25462,16 +24464,6 @@ M:AppKit.NSTextInputClient_Extensions.GetSupportsAdaptiveImageGlyph(AppKit.INSTe M:AppKit.NSTextInputClient_Extensions.GetUnionRectInVisibleSelectedRange(AppKit.INSTextInputClient) M:AppKit.NSTextInputClient_Extensions.GetWindowLevel(AppKit.INSTextInputClient) M:AppKit.NSTextInputClient_Extensions.InsertAdaptiveImageGlyph(AppKit.INSTextInputClient,AppKit.NSAdaptiveImageGlyph,Foundation.NSRange) -M:AppKit.NSTextInputClient.DrawsVertically(System.UIntPtr) -M:AppKit.NSTextInputClient.GetAttributedSubstring(Foundation.NSRange,Foundation.NSRange@) -M:AppKit.NSTextInputClient.GetBaselineDelta(System.UIntPtr) -M:AppKit.NSTextInputClient.GetCharacterIndex(CoreGraphics.CGPoint) -M:AppKit.NSTextInputClient.GetFirstRect(Foundation.NSRange,Foundation.NSRange@) -M:AppKit.NSTextInputClient.GetFractionOfDistanceThroughGlyph(CoreGraphics.CGPoint) -M:AppKit.NSTextInputClient.InsertAdaptiveImageGlyph(AppKit.NSAdaptiveImageGlyph,Foundation.NSRange) -M:AppKit.NSTextInputClient.InsertText(Foundation.NSObject,Foundation.NSRange) -M:AppKit.NSTextInputClient.SetMarkedText(Foundation.NSObject,Foundation.NSRange,Foundation.NSRange) -M:AppKit.NSTextInputClient.UnmarkText M:AppKit.NSTextInputTraits_Extensions.GetAllowedWritingToolsResultOptions(AppKit.INSTextInputTraits) M:AppKit.NSTextInputTraits_Extensions.GetAutocorrectionType(AppKit.INSTextInputTraits) M:AppKit.NSTextInputTraits_Extensions.GetDataDetectionType(AppKit.INSTextInputTraits) @@ -25500,7 +24492,6 @@ M:AppKit.NSTextInputTraits_Extensions.SetSpellCheckingType(AppKit.INSTextInputTr M:AppKit.NSTextInputTraits_Extensions.SetTextCompletionType(AppKit.INSTextInputTraits,AppKit.NSTextInputTraitType) M:AppKit.NSTextInputTraits_Extensions.SetTextReplacementType(AppKit.INSTextInputTraits,AppKit.NSTextInputTraitType) M:AppKit.NSTextInputTraits_Extensions.SetWritingToolsBehavior(AppKit.INSTextInputTraits,AppKit.NSWritingToolsBehavior) -M:AppKit.NSTextInsertionIndicator.#ctor(CoreGraphics.CGRect) M:AppKit.NSTextLayoutFragment.#ctor(AppKit.NSTextElement,AppKit.NSTextRange) M:AppKit.NSTextLayoutFragment.Dispose(System.Boolean) M:AppKit.NSTextLayoutFragment.Draw(CoreGraphics.CGPoint,CoreGraphics.CGContext) @@ -25508,7 +24499,6 @@ M:AppKit.NSTextLayoutFragment.EncodeTo(Foundation.NSCoder) M:AppKit.NSTextLayoutFragment.GetFrameForTextAttachment(AppKit.INSTextLocation) M:AppKit.NSTextLayoutFragment.GetTextLineFragment(AppKit.INSTextLocation,System.Boolean) M:AppKit.NSTextLayoutFragment.GetTextLineFragment(System.Runtime.InteropServices.NFloat,System.Boolean) -M:AppKit.NSTextLayoutFragment.InvalidateLayout M:AppKit.NSTextLayoutManager.AddRenderingAttribute(System.String,Foundation.NSObject,AppKit.NSTextRange) M:AppKit.NSTextLayoutManager.Dispose(System.Boolean) M:AppKit.NSTextLayoutManager.EncodeTo(Foundation.NSCoder) @@ -25546,8 +24536,6 @@ M:AppKit.NSTextLineFragment.#ctor(Foundation.NSAttributedString,Foundation.NSRan M:AppKit.NSTextLineFragment.#ctor(System.String,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},Foundation.NSRange) M:AppKit.NSTextLineFragment.Draw(CoreGraphics.CGPoint,CoreGraphics.CGContext) M:AppKit.NSTextLineFragment.EncodeTo(Foundation.NSCoder) -M:AppKit.NSTextLineFragment.GetCharacterIndex(CoreGraphics.CGPoint) -M:AppKit.NSTextLineFragment.GetFractionOfDistanceThroughGlyph(CoreGraphics.CGPoint) M:AppKit.NSTextLineFragment.GetLocation(System.IntPtr) M:AppKit.NSTextList.#ctor(AppKit.NSTextListMarkerFormats,AppKit.NSTextListOptions) M:AppKit.NSTextList.#ctor(AppKit.NSTextListMarkerFormats) @@ -25601,7 +24589,6 @@ M:AppKit.NSTextSelectionNavigation.GetTextSelectionsInteracting(CoreGraphics.CGP M:AppKit.NSTextStorage.#ctor(Foundation.NSAttributedString) M:AppKit.NSTextStorage.#ctor(System.String,CoreText.CTStringAttributes) M:AppKit.NSTextStorage.#ctor(System.String,Foundation.NSDictionary) -M:AppKit.NSTextStorage.#ctor(System.String) M:AppKit.NSTextStorage.add_DidProcessEditing(System.EventHandler{AppKit.NSTextStorageEventArgs}) M:AppKit.NSTextStorage.add_TextStorageDidProcessEditing(System.EventHandler) M:AppKit.NSTextStorage.add_TextStorageWillProcessEditing(System.EventHandler) @@ -25623,8 +24610,6 @@ M:AppKit.NSTextStorageDelegate_Extensions.TextStorageDidProcessEditing(AppKit.IN M:AppKit.NSTextStorageDelegate_Extensions.TextStorageWillProcessEditing(AppKit.INSTextStorageDelegate,Foundation.NSNotification) M:AppKit.NSTextStorageDelegate_Extensions.WillProcessEditing(AppKit.INSTextStorageDelegate,AppKit.NSTextStorage,AppKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) M:AppKit.NSTextStorageDelegate.DidProcessEditing(AppKit.NSTextStorage,AppKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) -M:AppKit.NSTextStorageDelegate.TextStorageDidProcessEditing(Foundation.NSNotification) -M:AppKit.NSTextStorageDelegate.TextStorageWillProcessEditing(Foundation.NSNotification) M:AppKit.NSTextStorageDelegate.WillProcessEditing(AppKit.NSTextStorage,AppKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) M:AppKit.NSTextStorageEventArgs.#ctor(AppKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) M:AppKit.NSTextTab.#ctor(AppKit.NSTextAlignment,System.Runtime.InteropServices.NFloat,Foundation.NSDictionary) @@ -25639,35 +24624,8 @@ M:AppKit.NSTextView.add_DidChangeTypingAttributes(System.EventHandler) M:AppKit.NSTextView.add_DraggedCell(System.EventHandler{AppKit.NSTextViewDraggedCellEventArgs}) M:AppKit.NSTextView.add_WritingToolsDidEnd(System.EventHandler) M:AppKit.NSTextView.add_WritingToolsWillBegin(System.EventHandler) -M:AppKit.NSTextView.BeginSelectingCandidate(AppKit.NSCandidateListTouchBarItem,System.IntPtr) -M:AppKit.NSTextView.ChangedCandidateListVisibility(AppKit.NSCandidateListTouchBarItem,System.Boolean) -M:AppKit.NSTextView.ChangeSelectionFromCandidate(AppKit.NSCandidateListTouchBarItem,System.IntPtr,System.IntPtr) M:AppKit.NSTextView.Dispose(System.Boolean) -M:AppKit.NSTextView.DraggedImageBeganAt(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSTextView.DraggedImageEndedAtDeposited(AppKit.NSImage,CoreGraphics.CGPoint,System.Boolean) -M:AppKit.NSTextView.DraggedImageEndedAtOperation(AppKit.NSImage,CoreGraphics.CGPoint,AppKit.NSDragOperation) -M:AppKit.NSTextView.DraggedImageMovedTo(AppKit.NSImage,CoreGraphics.CGPoint) -M:AppKit.NSTextView.DraggingSourceOperationMaskForLocal(System.Boolean) -M:AppKit.NSTextView.DrawsVertically(System.UIntPtr) -M:AppKit.NSTextView.EndSelectingCandidate(AppKit.NSCandidateListTouchBarItem,System.IntPtr) -M:AppKit.NSTextView.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSTextView.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSTextView.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSTextView.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSTextView.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSTextView.GetAttributedSubstring(Foundation.NSRange,Foundation.NSRange@) -M:AppKit.NSTextView.GetAttributedSubstring(Foundation.NSRange) -M:AppKit.NSTextView.GetBaselineDelta(System.UIntPtr) -M:AppKit.NSTextView.GetCharacterIndex(CoreGraphics.CGPoint) -M:AppKit.NSTextView.GetContentType -M:AppKit.NSTextView.GetFirstRect(Foundation.NSRange,Foundation.NSRange@) -M:AppKit.NSTextView.GetFirstRectForCharacterRange(Foundation.NSRange) -M:AppKit.NSTextView.GetFractionOfDistanceThroughGlyph(CoreGraphics.CGPoint) -M:AppKit.NSTextView.InsertAdaptiveImageGlyph(AppKit.NSAdaptiveImageGlyph,Foundation.NSRange) -M:AppKit.NSTextView.InsertText(Foundation.NSObject,Foundation.NSRange) M:AppKit.NSTextView.IsCoalescingUndo -M:AppKit.NSTextView.MakeItem(AppKit.NSTouchBar,System.String) -M:AppKit.NSTextView.NamesOfPromisedFilesDroppedAtDestination(Foundation.NSUrl) M:AppKit.NSTextView.remove_CellClicked(System.EventHandler{AppKit.NSTextViewClickedEventArgs}) M:AppKit.NSTextView.remove_CellDoubleClicked(System.EventHandler{AppKit.NSTextViewDoubleClickEventArgs}) M:AppKit.NSTextView.remove_DidChangeSelection(System.EventHandler) @@ -25676,11 +24634,6 @@ M:AppKit.NSTextView.remove_DraggedCell(System.EventHandler{AppKit.NSTextViewDrag M:AppKit.NSTextView.remove_WritingToolsDidEnd(System.EventHandler) M:AppKit.NSTextView.remove_WritingToolsWillBegin(System.EventHandler) M:AppKit.NSTextView.SetContentType(Foundation.NSString) -M:AppKit.NSTextView.SetMarkedText(Foundation.NSObject,Foundation.NSRange,Foundation.NSRange) -M:AppKit.NSTextView.SetMarkedText(Foundation.NSObject,Foundation.NSRange) -M:AppKit.NSTextView.UnmarkText -M:AppKit.NSTextView.ValidateMenuItem(AppKit.NSMenuItem) -M:AppKit.NSTextView.ValidateUserInterfaceItem(AppKit.INSValidatedUserInterfaceItem) M:AppKit.NSTextViewClickedEventArgs.#ctor(AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) M:AppKit.NSTextViewDelegate_Extensions.CellClicked(AppKit.INSTextViewDelegate,AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) M:AppKit.NSTextViewDelegate_Extensions.CellDoubleClicked(AppKit.INSTextViewDelegate,AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) @@ -25710,34 +24663,6 @@ M:AppKit.NSTextViewDelegate_Extensions.WillDisplayToolTip(AppKit.INSTextViewDele M:AppKit.NSTextViewDelegate_Extensions.WriteCell(AppKit.INSTextViewDelegate,AppKit.NSTextView,AppKit.NSTextAttachmentCell,System.UIntPtr,AppKit.NSPasteboard,System.String) M:AppKit.NSTextViewDelegate_Extensions.WritingToolsDidEnd(AppKit.INSTextViewDelegate,AppKit.NSTextView) M:AppKit.NSTextViewDelegate_Extensions.WritingToolsWillBegin(AppKit.INSTextViewDelegate,AppKit.NSTextView) -M:AppKit.NSTextViewDelegate.CellClicked(AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) -M:AppKit.NSTextViewDelegate.CellDoubleClicked(AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) -M:AppKit.NSTextViewDelegate.DidChangeSelection(Foundation.NSNotification) -M:AppKit.NSTextViewDelegate.DidChangeTypingAttributes(Foundation.NSNotification) -M:AppKit.NSTextViewDelegate.DidCheckText(AppKit.NSTextView,Foundation.NSRange,Foundation.NSTextCheckingTypes,Foundation.NSDictionary,Foundation.NSTextCheckingResult[],Foundation.NSOrthography,System.IntPtr) -M:AppKit.NSTextViewDelegate.DoCommandBySelector(AppKit.NSTextView,ObjCRuntime.Selector) -M:AppKit.NSTextViewDelegate.DraggedCell(AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,AppKit.NSEvent,System.UIntPtr) -M:AppKit.NSTextViewDelegate.GetCandidates(AppKit.NSTextView,Foundation.NSRange) -M:AppKit.NSTextViewDelegate.GetCompletions(AppKit.NSTextView,System.String[],Foundation.NSRange,System.IntPtr@) -M:AppKit.NSTextViewDelegate.GetTextCheckingCandidates(AppKit.NSTextView,Foundation.NSTextCheckingResult[],Foundation.NSRange) -M:AppKit.NSTextViewDelegate.GetUndoManager(AppKit.NSTextView) -M:AppKit.NSTextViewDelegate.GetWritablePasteboardTypes(AppKit.NSTextView,AppKit.NSTextAttachmentCell,System.UIntPtr) -M:AppKit.NSTextViewDelegate.GetWritingToolsIgnoredRangesInEnclosingRange(AppKit.NSTextView,Foundation.NSRange) -M:AppKit.NSTextViewDelegate.LinkClicked(AppKit.NSTextView,Foundation.NSObject,System.UIntPtr) -M:AppKit.NSTextViewDelegate.MenuForEvent(AppKit.NSTextView,AppKit.NSMenu,AppKit.NSEvent,System.UIntPtr) -M:AppKit.NSTextViewDelegate.ShouldChangeTextInRange(AppKit.NSTextView,Foundation.NSRange,System.String) -M:AppKit.NSTextViewDelegate.ShouldChangeTextInRanges(AppKit.NSTextView,Foundation.NSValue[],System.String[]) -M:AppKit.NSTextViewDelegate.ShouldChangeTypingAttributes(AppKit.NSTextView,Foundation.NSDictionary,Foundation.NSDictionary) -M:AppKit.NSTextViewDelegate.ShouldSelectCandidates(AppKit.NSTextView,System.UIntPtr) -M:AppKit.NSTextViewDelegate.ShouldSetSpellingState(AppKit.NSTextView,System.IntPtr,Foundation.NSRange) -M:AppKit.NSTextViewDelegate.ShouldUpdateTouchBarItemIdentifiers(AppKit.NSTextView,System.String[]) -M:AppKit.NSTextViewDelegate.WillChangeSelection(AppKit.NSTextView,Foundation.NSRange,Foundation.NSRange) -M:AppKit.NSTextViewDelegate.WillChangeSelectionFromRanges(AppKit.NSTextView,Foundation.NSValue[],Foundation.NSValue[]) -M:AppKit.NSTextViewDelegate.WillCheckText(AppKit.NSTextView,Foundation.NSRange,Foundation.NSDictionary,Foundation.NSTextCheckingTypes) -M:AppKit.NSTextViewDelegate.WillDisplayToolTip(AppKit.NSTextView,System.String,System.UIntPtr) -M:AppKit.NSTextViewDelegate.WriteCell(AppKit.NSTextView,AppKit.NSTextAttachmentCell,System.UIntPtr,AppKit.NSPasteboard,System.String) -M:AppKit.NSTextViewDelegate.WritingToolsDidEnd(AppKit.NSTextView) -M:AppKit.NSTextViewDelegate.WritingToolsWillBegin(AppKit.NSTextView) M:AppKit.NSTextViewDidChangeSelectionEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSTextViewDoubleClickEventArgs.#ctor(AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) M:AppKit.NSTextViewDraggedCellEventArgs.#ctor(AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,AppKit.NSEvent,System.UIntPtr) @@ -25755,17 +24680,7 @@ M:AppKit.NSTextViewportLayoutControllerDelegate.WillLayout(AppKit.NSTextViewport M:AppKit.NSTextViewWillChangeNotifyingTextViewEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSTintConfiguration.Copy(Foundation.NSZone) M:AppKit.NSTintConfiguration.EncodeTo(Foundation.NSCoder) -M:AppKit.NSTitlebarAccessoryViewController.#ctor(System.String,Foundation.NSBundle) -M:AppKit.NSTitlebarAccessoryViewController.AnimationDidEnd(AppKit.NSAnimation) -M:AppKit.NSTitlebarAccessoryViewController.AnimationDidReachProgressMark(AppKit.NSAnimation,System.Single) -M:AppKit.NSTitlebarAccessoryViewController.AnimationDidStop(AppKit.NSAnimation) -M:AppKit.NSTitlebarAccessoryViewController.AnimationFor(Foundation.NSString) -M:AppKit.NSTitlebarAccessoryViewController.AnimationShouldStart(AppKit.NSAnimation) -M:AppKit.NSTitlebarAccessoryViewController.ComputeAnimationCurve(AppKit.NSAnimation,System.Single) -M:AppKit.NSTitlebarAccessoryViewController.DefaultAnimationFor(Foundation.NSString) -M:AppKit.NSTokenField.#ctor(CoreGraphics.CGRect) M:AppKit.NSTokenField.Dispose(System.Boolean) -M:AppKit.NSTokenFieldCell.#ctor(System.String) M:AppKit.NSTokenFieldCell.Dispose(System.Boolean) M:AppKit.NSTokenFieldCellDelegate_Extensions.GetCompletionStrings(AppKit.INSTokenFieldCellDelegate,AppKit.NSTokenFieldCell,System.String,System.IntPtr,System.IntPtr@) M:AppKit.NSTokenFieldCellDelegate_Extensions.GetDisplayString(AppKit.INSTokenFieldCellDelegate,AppKit.NSTokenFieldCell,Foundation.NSObject) @@ -25777,16 +24692,6 @@ M:AppKit.NSTokenFieldCellDelegate_Extensions.HasMenu(AppKit.INSTokenFieldCellDel M:AppKit.NSTokenFieldCellDelegate_Extensions.Read(AppKit.INSTokenFieldCellDelegate,AppKit.NSTokenFieldCell,AppKit.NSPasteboard) M:AppKit.NSTokenFieldCellDelegate_Extensions.ShouldAddObjects(AppKit.INSTokenFieldCellDelegate,AppKit.NSTokenFieldCell,Foundation.NSObject[],System.UIntPtr) M:AppKit.NSTokenFieldCellDelegate_Extensions.WriteRepresentedObjects(AppKit.INSTokenFieldCellDelegate,AppKit.NSTokenFieldCell,Foundation.NSObject[],AppKit.NSPasteboard) -M:AppKit.NSTokenFieldCellDelegate.GetCompletionStrings(AppKit.NSTokenFieldCell,System.String,System.IntPtr,System.IntPtr@) -M:AppKit.NSTokenFieldCellDelegate.GetDisplayString(AppKit.NSTokenFieldCell,Foundation.NSObject) -M:AppKit.NSTokenFieldCellDelegate.GetEditingString(AppKit.NSTokenFieldCell,Foundation.NSObject) -M:AppKit.NSTokenFieldCellDelegate.GetMenu(AppKit.NSTokenFieldCell,Foundation.NSObject) -M:AppKit.NSTokenFieldCellDelegate.GetRepresentedObject(AppKit.NSTokenFieldCell,System.String) -M:AppKit.NSTokenFieldCellDelegate.GetStyle(AppKit.NSTokenFieldCell,Foundation.NSObject) -M:AppKit.NSTokenFieldCellDelegate.HasMenu(AppKit.NSTokenFieldCell,Foundation.NSObject) -M:AppKit.NSTokenFieldCellDelegate.Read(AppKit.NSTokenFieldCell,AppKit.NSPasteboard) -M:AppKit.NSTokenFieldCellDelegate.ShouldAddObjects(AppKit.NSTokenFieldCell,Foundation.NSObject[],System.UIntPtr) -M:AppKit.NSTokenFieldCellDelegate.WriteRepresentedObjects(AppKit.NSTokenFieldCell,Foundation.NSObject[],AppKit.NSPasteboard) M:AppKit.NSTokenFieldDelegate_Extensions.GetCompletionStrings(AppKit.INSTokenFieldDelegate,AppKit.NSTokenField,System.String,System.IntPtr,System.IntPtr) M:AppKit.NSTokenFieldDelegate_Extensions.GetDisplayString(AppKit.INSTokenFieldDelegate,AppKit.NSTokenField,Foundation.NSObject) M:AppKit.NSTokenFieldDelegate_Extensions.GetEditingString(AppKit.INSTokenFieldDelegate,AppKit.NSTokenField,Foundation.NSObject) @@ -25797,16 +24702,6 @@ M:AppKit.NSTokenFieldDelegate_Extensions.HasMenu(AppKit.INSTokenFieldDelegate,Ap M:AppKit.NSTokenFieldDelegate_Extensions.Read(AppKit.INSTokenFieldDelegate,AppKit.NSTokenField,AppKit.NSPasteboard) M:AppKit.NSTokenFieldDelegate_Extensions.ShouldAddObjects(AppKit.INSTokenFieldDelegate,AppKit.NSTokenField,Foundation.NSArray,System.UIntPtr) M:AppKit.NSTokenFieldDelegate_Extensions.WriteRepresented(AppKit.INSTokenFieldDelegate,AppKit.NSTokenField,Foundation.NSArray,AppKit.NSPasteboard) -M:AppKit.NSTokenFieldDelegate.GetCompletionStrings(AppKit.NSTokenField,System.String,System.IntPtr,System.IntPtr) -M:AppKit.NSTokenFieldDelegate.GetDisplayString(AppKit.NSTokenField,Foundation.NSObject) -M:AppKit.NSTokenFieldDelegate.GetEditingString(AppKit.NSTokenField,Foundation.NSObject) -M:AppKit.NSTokenFieldDelegate.GetMenu(AppKit.NSTokenField,Foundation.NSObject) -M:AppKit.NSTokenFieldDelegate.GetRepresentedObject(AppKit.NSTokenField,System.String) -M:AppKit.NSTokenFieldDelegate.GetStyle(AppKit.NSTokenField,Foundation.NSObject) -M:AppKit.NSTokenFieldDelegate.HasMenu(AppKit.NSTokenField,Foundation.NSObject) -M:AppKit.NSTokenFieldDelegate.Read(AppKit.NSTokenField,AppKit.NSPasteboard) -M:AppKit.NSTokenFieldDelegate.ShouldAddObjects(AppKit.NSTokenField,Foundation.NSArray,System.UIntPtr) -M:AppKit.NSTokenFieldDelegate.WriteRepresented(AppKit.NSTokenField,Foundation.NSArray,AppKit.NSPasteboard) M:AppKit.NSToolbar.add_DidRemoveItem(System.EventHandler) M:AppKit.NSToolbar.add_WillAddItem(System.EventHandler) M:AppKit.NSToolbar.Dispose(System.Boolean) @@ -25820,23 +24715,13 @@ M:AppKit.NSToolbarDelegate_Extensions.GetToolbarImmovableItemIdentifiers(AppKit. M:AppKit.NSToolbarDelegate_Extensions.SelectableItemIdentifiers(AppKit.INSToolbarDelegate,AppKit.NSToolbar) M:AppKit.NSToolbarDelegate_Extensions.WillAddItem(AppKit.INSToolbarDelegate,Foundation.NSNotification) M:AppKit.NSToolbarDelegate_Extensions.WillInsertItem(AppKit.INSToolbarDelegate,AppKit.NSToolbar,System.String,System.Boolean) -M:AppKit.NSToolbarDelegate.AllowedItemIdentifiers(AppKit.NSToolbar) -M:AppKit.NSToolbarDelegate.DefaultItemIdentifiers(AppKit.NSToolbar) -M:AppKit.NSToolbarDelegate.DidRemoveItem(Foundation.NSNotification) -M:AppKit.NSToolbarDelegate.GetItemCanBeInsertedAt(AppKit.NSToolbar,System.String,System.IntPtr) -M:AppKit.NSToolbarDelegate.GetToolbarImmovableItemIdentifiers(AppKit.NSToolbar) -M:AppKit.NSToolbarDelegate.SelectableItemIdentifiers(AppKit.NSToolbar) -M:AppKit.NSToolbarDelegate.WillAddItem(Foundation.NSNotification) -M:AppKit.NSToolbarDelegate.WillInsertItem(AppKit.NSToolbar,System.String,System.Boolean) M:AppKit.NSToolbarItem.add_Activated(System.EventHandler) M:AppKit.NSToolbarItem.Copy(Foundation.NSZone) M:AppKit.NSToolbarItem.Create(System.String,UIKit.UIBarButtonItem) M:AppKit.NSToolbarItem.Dispose(System.Boolean) M:AppKit.NSToolbarItem.GetFrame(UIKit.UIView) M:AppKit.NSToolbarItem.remove_Activated(System.EventHandler) -M:AppKit.NSToolbarItem.ValidateMenuItem(AppKit.NSMenuItem) M:AppKit.NSToolbarItemEventArgs.#ctor(Foundation.NSNotification) -M:AppKit.NSToolbarItemGroup.#ctor(System.String) M:AppKit.NSTouch_NSTouchBar.GetLocation(AppKit.NSTouch,AppKit.NSView) M:AppKit.NSTouch_NSTouchBar.GetPreviousLocation(AppKit.NSTouch,AppKit.NSView) M:AppKit.NSTouch_NSTouchBar.GetTouchType(AppKit.NSTouch) @@ -25845,12 +24730,10 @@ M:AppKit.NSTouch.Copy(Foundation.NSZone) M:AppKit.NSTouchBar.Dispose(System.Boolean) M:AppKit.NSTouchBar.EncodeTo(Foundation.NSCoder) M:AppKit.NSTouchBarDelegate_Extensions.MakeItem(AppKit.INSTouchBarDelegate,AppKit.NSTouchBar,System.String) -M:AppKit.NSTouchBarDelegate.MakeItem(AppKit.NSTouchBar,System.String) M:AppKit.NSTouchBarItem.#ctor(AppKit.NSTouchBarItemIdentifier) M:AppKit.NSTouchBarItem.EncodeTo(Foundation.NSCoder) M:AppKit.NSTrackingArea.Copy(Foundation.NSZone) M:AppKit.NSTrackingArea.EncodeTo(Foundation.NSCoder) -M:AppKit.NSTrackingSeparatorToolbarItem.#ctor(System.String) M:AppKit.NSUserInterfaceCompressionOptions.Copy(Foundation.NSZone) M:AppKit.NSUserInterfaceCompressionOptions.EncodeTo(Foundation.NSCoder) M:AppKit.NSUserInterfaceItemSearching_Extensions.PerformAction(AppKit.INSUserInterfaceItemSearching,Foundation.NSObject) @@ -25858,146 +24741,18 @@ M:AppKit.NSUserInterfaceItemSearching_Extensions.ShowAllHelpTopics(AppKit.INSUse M:AppKit.NSView_NSCandidateListTouchBarItem.GetCandidateListTouchBarItem(AppKit.NSView) M:AppKit.NSView_NSTouchBar.GetAllowedTouchTypes(AppKit.NSView) M:AppKit.NSView_NSTouchBar.SetAllowedTouchTypes(AppKit.NSView,AppKit.NSTouchTypeMask) -M:AppKit.NSView.AccessibilityPerformAction(Foundation.NSString) -M:AppKit.NSView.AccessibilityPerformCancel -M:AppKit.NSView.AccessibilityPerformConfirm -M:AppKit.NSView.AccessibilityPerformDecrement -M:AppKit.NSView.AccessibilityPerformDelete -M:AppKit.NSView.AccessibilityPerformIncrement -M:AppKit.NSView.AccessibilityPerformPick -M:AppKit.NSView.AccessibilityPerformPress -M:AppKit.NSView.AccessibilityPerformRaise -M:AppKit.NSView.AccessibilityPerformShowAlternateUI -M:AppKit.NSView.AccessibilityPerformShowDefaultUI -M:AppKit.NSView.AccessibilityPerformShowMenu M:AppKit.NSView.AddToolTip(CoreGraphics.CGRect,AppKit.INSToolTipOwner) M:AppKit.NSView.AddToolTip(CoreGraphics.CGRect,Foundation.NSObject,System.IntPtr) M:AppKit.NSView.AddToolTip(CoreGraphics.CGRect,Foundation.NSObject) -M:AppKit.NSView.AnimationFor(Foundation.NSString) -M:AppKit.NSView.ConcludeDragOperation(AppKit.INSDraggingInfo) -M:AppKit.NSView.DefaultAnimationFor(Foundation.NSString) M:AppKit.NSView.Dispose(System.Boolean) -M:AppKit.NSView.DraggingEnded(AppKit.INSDraggingInfo) -M:AppKit.NSView.DraggingEntered(AppKit.INSDraggingInfo) -M:AppKit.NSView.DraggingExited(AppKit.INSDraggingInfo) -M:AppKit.NSView.DraggingUpdated(AppKit.INSDraggingInfo) -M:AppKit.NSView.GetAccessibilityActionDescription(Foundation.NSString) -M:AppKit.NSView.GetAccessibilityArrayAttributeCount(Foundation.NSString) -M:AppKit.NSView.GetAccessibilityArrayAttributeValues(Foundation.NSString,System.UIntPtr,System.UIntPtr) -M:AppKit.NSView.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSView.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSView.GetAccessibilityFocusedUIElement -M:AppKit.NSView.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSView.GetAccessibilityHitTest(CoreGraphics.CGPoint) -M:AppKit.NSView.GetAccessibilityIndexOfChild(Foundation.NSObject) -M:AppKit.NSView.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSView.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSView.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSView.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSView.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSView.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSView.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSView.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSView.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSView.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSView.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSView.GetAccessibilityValue(Foundation.NSString,Foundation.NSObject) -M:AppKit.NSView.GetAccessibilityValue(Foundation.NSString) -M:AppKit.NSView.IsAccessibilityAttributeSettable(Foundation.NSString) -M:AppKit.NSView.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) -M:AppKit.NSView.PerformDragOperation(AppKit.INSDraggingInfo) -M:AppKit.NSView.PrepareForDragOperation(AppKit.INSDraggingInfo) -M:AppKit.NSView.SetAccessibilityValue(Foundation.NSString,Foundation.NSObject) M:AppKit.NSView.SortSubviews(System.Func{AppKit.NSView,AppKit.NSView,Foundation.NSComparisonResult}) -M:AppKit.NSViewAnimation.#ctor(System.Double,AppKit.NSAnimationCurve) -M:AppKit.NSViewAnimation.AnimationForKey(System.String) -M:AppKit.NSViewAnimation.DefaultAnimationForKey(System.String) M:AppKit.NSViewColumnMoveEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSViewColumnResizeEventArgs.#ctor(Foundation.NSNotification) -M:AppKit.NSViewController.AcceptsFirstResponder -M:AppKit.NSViewController.BecomeFirstResponder -M:AppKit.NSViewController.BeginGestureWithEvent(AppKit.NSEvent) M:AppKit.NSViewController.BeginRequestWithExtensionContext(Foundation.NSExtensionContext) -M:AppKit.NSViewController.ChangeMode(AppKit.NSEvent) -M:AppKit.NSViewController.CommitEditing(Foundation.NSError@) -M:AppKit.NSViewController.ContextMenuKeyDown(AppKit.NSEvent) -M:AppKit.NSViewController.CursorUpdate(AppKit.NSEvent) M:AppKit.NSViewController.Dispose(System.Boolean) -M:AppKit.NSViewController.EncodeRestorableState(Foundation.NSCoder,Foundation.NSOperationQueue) -M:AppKit.NSViewController.EncodeRestorableState(Foundation.NSCoder) M:AppKit.NSViewController.EncodeTo(Foundation.NSCoder) -M:AppKit.NSViewController.EndGestureWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.FlagsChanged(AppKit.NSEvent) -M:AppKit.NSViewController.FlushBufferedKeyEvents -M:AppKit.NSViewController.GetAllowedClassesForRestorableStateKeyPath(System.String) -M:AppKit.NSViewController.GetNewWindowForTab(Foundation.NSObject) -M:AppKit.NSViewController.HelpRequested(AppKit.NSEvent) -M:AppKit.NSViewController.InterpretKeyEvents(AppKit.NSEvent[]) -M:AppKit.NSViewController.InvalidateRestorableState -M:AppKit.NSViewController.KeyDown(AppKit.NSEvent) -M:AppKit.NSViewController.KeyUp(AppKit.NSEvent) -M:AppKit.NSViewController.MagnifyWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.MouseDown(AppKit.NSEvent) -M:AppKit.NSViewController.MouseDragged(AppKit.NSEvent) -M:AppKit.NSViewController.MouseEntered(AppKit.NSEvent) -M:AppKit.NSViewController.MouseExited(AppKit.NSEvent) -M:AppKit.NSViewController.MouseMoved(AppKit.NSEvent) -M:AppKit.NSViewController.MouseUp(AppKit.NSEvent) -M:AppKit.NSViewController.NoResponderFor(ObjCRuntime.Selector) -M:AppKit.NSViewController.OtherMouseDown(AppKit.NSEvent) -M:AppKit.NSViewController.OtherMouseDragged(AppKit.NSEvent) -M:AppKit.NSViewController.OtherMouseUp(AppKit.NSEvent) -M:AppKit.NSViewController.PerformKeyEquivalent(AppKit.NSEvent) -M:AppKit.NSViewController.PerformSegue(System.String,Foundation.NSObject) -M:AppKit.NSViewController.PrepareForSegue(AppKit.NSStoryboardSegue,Foundation.NSObject) M:AppKit.NSViewController.PresentError(Foundation.NSError,AppKit.NSWindow,Foundation.NSObject,ObjCRuntime.Selector,System.IntPtr) -M:AppKit.NSViewController.PresentError(Foundation.NSError) M:AppKit.NSViewController.PresentViewControllerInWidget(AppKit.NSViewController) -M:AppKit.NSViewController.PressureChange(AppKit.NSEvent) -M:AppKit.NSViewController.QuickLook(AppKit.NSEvent) -M:AppKit.NSViewController.ResignFirstResponder -M:AppKit.NSViewController.RestorableStateKeyPaths -M:AppKit.NSViewController.RestoreState(Foundation.NSCoder) -M:AppKit.NSViewController.RestoreUserActivityState(Foundation.NSUserActivity) -M:AppKit.NSViewController.RightMouseDown(AppKit.NSEvent) -M:AppKit.NSViewController.RightMouseDragged(AppKit.NSEvent) -M:AppKit.NSViewController.RightMouseUp(AppKit.NSEvent) -M:AppKit.NSViewController.RotateWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.ScrollWheel(AppKit.NSEvent) -M:AppKit.NSViewController.ShouldBeTreatedAsInkEvent(AppKit.NSEvent) -M:AppKit.NSViewController.ShouldPerformSegue(System.String,Foundation.NSObject) -M:AppKit.NSViewController.ShowContextHelp(Foundation.NSObject) -M:AppKit.NSViewController.SmartMagnify(AppKit.NSEvent) -M:AppKit.NSViewController.SupplementalTargetForAction(ObjCRuntime.Selector,Foundation.NSObject) -M:AppKit.NSViewController.SwipeWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.TabletPoint(AppKit.NSEvent) -M:AppKit.NSViewController.TabletProximity(AppKit.NSEvent) -M:AppKit.NSViewController.TouchesBeganWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.TouchesCancelledWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.TouchesEndedWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.TouchesMovedWithEvent(AppKit.NSEvent) -M:AppKit.NSViewController.TryToPerformwith(ObjCRuntime.Selector,Foundation.NSObject) -M:AppKit.NSViewController.UpdateUserActivityState(Foundation.NSUserActivity) -M:AppKit.NSViewController.ValidateProposedFirstResponder(AppKit.NSResponder,AppKit.NSEvent) -M:AppKit.NSViewController.ValidRequestorForSendType(System.String,System.String) -M:AppKit.NSViewController.WantsForwardedScrollEventsForAxis(AppKit.NSEventGestureAxis) -M:AppKit.NSViewController.WantsScrollEventsForSwipeTrackingOnAxis(AppKit.NSEventGestureAxis) -M:AppKit.NSViewController.WillPresentError(Foundation.NSError) -M:AppKit.NSViewControllerPresentationAnimator.AnimateDismissal(AppKit.NSViewController,AppKit.NSViewController) -M:AppKit.NSViewControllerPresentationAnimator.AnimatePresentation(AppKit.NSViewController,AppKit.NSViewController) -M:AppKit.NSVisualEffectView.#ctor(CoreGraphics.CGRect) -M:AppKit.NSWindow.#ctor -M:AppKit.NSWindow.AccessibilityPerformCancel -M:AppKit.NSWindow.AccessibilityPerformConfirm -M:AppKit.NSWindow.AccessibilityPerformDecrement -M:AppKit.NSWindow.AccessibilityPerformDelete -M:AppKit.NSWindow.AccessibilityPerformIncrement -M:AppKit.NSWindow.AccessibilityPerformPick -M:AppKit.NSWindow.AccessibilityPerformPress -M:AppKit.NSWindow.AccessibilityPerformRaise -M:AppKit.NSWindow.AccessibilityPerformShowAlternateUI -M:AppKit.NSWindow.AccessibilityPerformShowDefaultUI -M:AppKit.NSWindow.AccessibilityPerformShowMenu M:AppKit.NSWindow.add_DidBecomeKey(System.EventHandler) M:AppKit.NSWindow.add_DidBecomeMain(System.EventHandler) M:AppKit.NSWindow.add_DidChangeBackingProperties(System.EventHandler) @@ -26032,27 +24787,10 @@ M:AppKit.NSWindow.add_WillExitVersionBrowser(System.EventHandler) M:AppKit.NSWindow.add_WillMiniaturize(System.EventHandler) M:AppKit.NSWindow.add_WillMove(System.EventHandler) M:AppKit.NSWindow.add_WillStartLiveResize(System.EventHandler) -M:AppKit.NSWindow.AnimationFor(Foundation.NSString) M:AppKit.NSWindow.Close -M:AppKit.NSWindow.DefaultAnimationFor(Foundation.NSString) M:AppKit.NSWindow.DiscardEventsMatchingMask(AppKit.NSEventMask,AppKit.NSEvent) M:AppKit.NSWindow.Dispose(System.Boolean) M:AppKit.NSWindow.FromWindowRef(System.IntPtr) -M:AppKit.NSWindow.GetAccessibilityAttributedString(Foundation.NSRange) -M:AppKit.NSWindow.GetAccessibilityCellForColumn(System.IntPtr,System.IntPtr) -M:AppKit.NSWindow.GetAccessibilityFrame(Foundation.NSRange) -M:AppKit.NSWindow.GetAccessibilityLayoutForScreen(CoreGraphics.CGPoint) -M:AppKit.NSWindow.GetAccessibilityLayoutForScreen(CoreGraphics.CGSize) -M:AppKit.NSWindow.GetAccessibilityLine(System.IntPtr) -M:AppKit.NSWindow.GetAccessibilityRange(CoreGraphics.CGPoint) -M:AppKit.NSWindow.GetAccessibilityRange(System.IntPtr) -M:AppKit.NSWindow.GetAccessibilityRangeForLine(System.IntPtr) -M:AppKit.NSWindow.GetAccessibilityRtf(Foundation.NSRange) -M:AppKit.NSWindow.GetAccessibilityScreenForLayout(CoreGraphics.CGPoint) -M:AppKit.NSWindow.GetAccessibilityScreenForLayout(CoreGraphics.CGSize) -M:AppKit.NSWindow.GetAccessibilityString(Foundation.NSRange) -M:AppKit.NSWindow.GetAccessibilityStyleRange(System.IntPtr) -M:AppKit.NSWindow.IsAccessibilitySelectorAllowed(ObjCRuntime.Selector) M:AppKit.NSWindow.NextEventMatchingMask(AppKit.NSEventMask,Foundation.NSDate,System.String,System.Boolean) M:AppKit.NSWindow.NextEventMatchingMask(AppKit.NSEventMask) M:AppKit.NSWindow.ReleaseWhenClosed(System.Boolean) @@ -26098,14 +24836,9 @@ M:AppKit.NSWindow.SetIsVisible(System.Boolean) M:AppKit.NSWindow.SetIsZoomed(System.Boolean) M:AppKit.NSWindow.SetOneShot(System.Boolean) M:AppKit.NSWindow.TransferWindowSharingAsync(AppKit.NSWindow) -M:AppKit.NSWindow.ValidateMenuItem(AppKit.NSMenuItem) -M:AppKit.NSWindow.ValidateUserInterfaceItem(AppKit.INSValidatedUserInterfaceItem) M:AppKit.NSWindowBackingPropertiesEventArgs.#ctor(Foundation.NSNotification) M:AppKit.NSWindowCoderEventArgs.#ctor(Foundation.NSCoder) M:AppKit.NSWindowController.EncodeTo(Foundation.NSCoder) -M:AppKit.NSWindowController.PerformSegue(System.String,Foundation.NSObject) -M:AppKit.NSWindowController.PrepareForSegue(AppKit.NSStoryboardSegue,Foundation.NSObject) -M:AppKit.NSWindowController.ShouldPerformSegue(System.String,Foundation.NSObject) M:AppKit.NSWindowDelegate_Extensions.CustomWindowsToEnterFullScreen(AppKit.INSWindowDelegate,AppKit.NSWindow) M:AppKit.NSWindowDelegate_Extensions.CustomWindowsToExitFullScreen(AppKit.INSWindowDelegate,AppKit.NSWindow) M:AppKit.NSWindowDelegate_Extensions.DidBecomeKey(AppKit.INSWindowDelegate,Foundation.NSNotification) @@ -26156,59 +24889,8 @@ M:AppKit.NSWindowDelegate_Extensions.WillUseFullScreenContentSize(AppKit.INSWind M:AppKit.NSWindowDelegate_Extensions.WillUseFullScreenPresentationOptions(AppKit.INSWindowDelegate,AppKit.NSWindow,AppKit.NSApplicationPresentationOptions) M:AppKit.NSWindowDelegate_Extensions.WillUseStandardFrame(AppKit.INSWindowDelegate,AppKit.NSWindow,CoreGraphics.CGRect) M:AppKit.NSWindowDelegate_Extensions.WindowShouldClose(AppKit.INSWindowDelegate,Foundation.NSObject) -M:AppKit.NSWindowDelegate.CustomWindowsToEnterFullScreen(AppKit.NSWindow) -M:AppKit.NSWindowDelegate.CustomWindowsToExitFullScreen(AppKit.NSWindow) -M:AppKit.NSWindowDelegate.DidBecomeKey(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidBecomeMain(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidChangeBackingProperties(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidChangeScreen(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidChangeScreenProfile(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidDecodeRestorableState(AppKit.NSWindow,Foundation.NSCoder) -M:AppKit.NSWindowDelegate.DidDeminiaturize(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidEndLiveResize(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidEndSheet(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidEnterFullScreen(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidEnterVersionBrowser(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidExitFullScreen(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidExitVersionBrowser(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidExpose(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidFailToEnterFullScreen(AppKit.NSWindow) -M:AppKit.NSWindowDelegate.DidFailToExitFullScreen(AppKit.NSWindow) -M:AppKit.NSWindowDelegate.DidMiniaturize(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidMove(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidResignKey(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidResignMain(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidResize(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.DidUpdate(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.GetPreviewRepresentableActivityItems(AppKit.NSWindow) -M:AppKit.NSWindowDelegate.GetWindowForSharingRequest(AppKit.NSWindow) -M:AppKit.NSWindowDelegate.ShouldDragDocumentWithEvent(AppKit.NSWindow,AppKit.NSEvent,CoreGraphics.CGPoint,AppKit.NSPasteboard) -M:AppKit.NSWindowDelegate.ShouldPopUpDocumentPathMenu(AppKit.NSWindow,AppKit.NSMenu) -M:AppKit.NSWindowDelegate.ShouldZoom(AppKit.NSWindow,CoreGraphics.CGRect) -M:AppKit.NSWindowDelegate.StartCustomAnimationToEnterFullScreen(AppKit.NSWindow,System.Double) -M:AppKit.NSWindowDelegate.StartCustomAnimationToExitFullScreen(AppKit.NSWindow,System.Double) -M:AppKit.NSWindowDelegate.WillBeginSheet(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillClose(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillEncodeRestorableState(AppKit.NSWindow,Foundation.NSCoder) -M:AppKit.NSWindowDelegate.WillEnterFullScreen(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillEnterVersionBrowser(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillExitFullScreen(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillExitVersionBrowser(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillMiniaturize(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillMove(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillPositionSheet(AppKit.NSWindow,AppKit.NSWindow,CoreGraphics.CGRect) -M:AppKit.NSWindowDelegate.WillResize(AppKit.NSWindow,CoreGraphics.CGSize) -M:AppKit.NSWindowDelegate.WillResizeForVersionBrowser(AppKit.NSWindow,CoreGraphics.CGSize,CoreGraphics.CGSize) -M:AppKit.NSWindowDelegate.WillReturnFieldEditor(AppKit.NSWindow,Foundation.NSObject) -M:AppKit.NSWindowDelegate.WillReturnUndoManager(AppKit.NSWindow) -M:AppKit.NSWindowDelegate.WillStartLiveResize(Foundation.NSNotification) -M:AppKit.NSWindowDelegate.WillUseFullScreenContentSize(AppKit.NSWindow,CoreGraphics.CGSize) -M:AppKit.NSWindowDelegate.WillUseFullScreenPresentationOptions(AppKit.NSWindow,AppKit.NSApplicationPresentationOptions) -M:AppKit.NSWindowDelegate.WillUseStandardFrame(AppKit.NSWindow,CoreGraphics.CGRect) -M:AppKit.NSWindowDelegate.WindowShouldClose(Foundation.NSObject) M:AppKit.NSWindowDurationEventArgs.#ctor(System.Double) M:AppKit.NSWindowExposeEventArgs.#ctor(Foundation.NSNotification) -M:AppKit.NSWindowRestoration.RestoreWindow(System.String,Foundation.NSCoder,AppKit.NSWindowCompletionHandler) M:AppKit.NSWindowTabGroup.Dispose(System.Boolean) M:AppKit.NSWorkspace.IconForFileType(AppKit.HfsTypeCode) M:AppKit.NSWorkspace.IconForFileType(System.String) @@ -26228,15 +24910,10 @@ M:AppKit.NSWorkspaceOpenConfiguration.Copy(Foundation.NSZone) M:AppKit.NSWorkspaceRenamedEventArgs.#ctor(Foundation.NSNotification) M:AppTrackingTransparency.ATTrackingManager.RequestTrackingAuthorization(System.Action{AppTrackingTransparency.ATTrackingManagerAuthorizationStatus}) M:AppTrackingTransparency.ATTrackingManager.RequestTrackingAuthorizationAsync -M:ARKit.ARAnchor.#ctor(ARKit.ARAnchor) M:ARKit.ARAnchor.Copy(Foundation.NSZone) M:ARKit.ARAnchor.EncodeTo(Foundation.NSCoder) -M:ARKit.ARAppClipCodeAnchor.#ctor(ARKit.ARAnchor) M:ARKit.ARBlendShapeLocationOptions.#ctor M:ARKit.ARBlendShapeLocationOptions.#ctor(Foundation.NSDictionary) -M:ARKit.ARBodyAnchor.#ctor(ARKit.ARAnchor) -M:ARKit.ARBodyTrackingConfiguration.GetSupportedVideoFormats -M:ARKit.ARBodyTrackingConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) M:ARKit.ARCamera.Copy(Foundation.NSZone) M:ARKit.ARCoachingOverlayView.#ctor(CoreGraphics.CGRect) M:ARKit.ARCoachingOverlayView.ARCoachingOverlayViewAppearance.#ctor(System.IntPtr) @@ -26244,44 +24921,23 @@ M:ARKit.ARCoachingOverlayView.Dispose(System.Boolean) M:ARKit.ARCoachingOverlayViewDelegate_Extensions.DidDeactivate(ARKit.IARCoachingOverlayViewDelegate,ARKit.ARCoachingOverlayView) M:ARKit.ARCoachingOverlayViewDelegate_Extensions.DidRequestSessionReset(ARKit.IARCoachingOverlayViewDelegate,ARKit.ARCoachingOverlayView) M:ARKit.ARCoachingOverlayViewDelegate_Extensions.WillActivate(ARKit.IARCoachingOverlayViewDelegate,ARKit.ARCoachingOverlayView) -M:ARKit.ARCoachingOverlayViewDelegate.DidDeactivate(ARKit.ARCoachingOverlayView) -M:ARKit.ARCoachingOverlayViewDelegate.DidRequestSessionReset(ARKit.ARCoachingOverlayView) -M:ARKit.ARCoachingOverlayViewDelegate.WillActivate(ARKit.ARCoachingOverlayView) M:ARKit.ARCollaborationData.EncodeTo(Foundation.NSCoder) M:ARKit.ARConfiguration.Copy(Foundation.NSZone) M:ARKit.ARDepthData.Dispose(System.Boolean) -M:ARKit.AREnvironmentProbeAnchor.#ctor(ARKit.ARAnchor) -M:ARKit.ARFaceAnchor.#ctor(ARKit.ARAnchor) M:ARKit.ARFaceGeometry.#ctor(ARKit.ARBlendShapeLocationOptions) M:ARKit.ARFaceGeometry.Copy(Foundation.NSZone) M:ARKit.ARFaceGeometry.EncodeTo(Foundation.NSCoder) M:ARKit.ARFaceGeometry.GetTextureCoordinates M:ARKit.ARFaceGeometry.GetTriangleIndices M:ARKit.ARFaceGeometry.GetVertices -M:ARKit.ARFaceTrackingConfiguration.GetSupportedVideoFormats -M:ARKit.ARFaceTrackingConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) M:ARKit.ARFrame.Copy(Foundation.NSZone) -M:ARKit.ARGeoAnchor.#ctor(ARKit.ARAnchor) M:ARKit.ARGeometryElement.EncodeTo(Foundation.NSCoder) M:ARKit.ARGeometrySource.EncodeTo(Foundation.NSCoder) M:ARKit.ARGeoTrackingConfiguration.CheckAvailabilityAsync M:ARKit.ARGeoTrackingConfiguration.CheckAvailabilityAsync(CoreLocation.CLLocationCoordinate2D) -M:ARKit.ARGeoTrackingConfiguration.GetSupportedVideoFormats -M:ARKit.ARGeoTrackingConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) M:ARKit.ARGeoTrackingStatus.Copy(Foundation.NSZone) M:ARKit.ARGeoTrackingStatus.EncodeTo(Foundation.NSCoder) -M:ARKit.ARImageAnchor.#ctor(ARKit.ARAnchor) -M:ARKit.ARImageTrackingConfiguration.GetSupportedVideoFormats -M:ARKit.ARImageTrackingConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) -M:ARKit.ARMeshAnchor.#ctor(ARKit.ARAnchor) M:ARKit.ARMeshGeometry.EncodeTo(Foundation.NSCoder) -M:ARKit.ARObjectAnchor.#ctor(ARKit.ARAnchor) -M:ARKit.ARObjectScanningConfiguration.GetSupportedVideoFormats -M:ARKit.ARObjectScanningConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) -M:ARKit.AROrientationTrackingConfiguration.GetSupportedVideoFormats -M:ARKit.AROrientationTrackingConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) -M:ARKit.ARParticipantAnchor.#ctor(ARKit.ARAnchor) -M:ARKit.ARPlaneAnchor.#ctor(ARKit.ARAnchor) M:ARKit.ARPlaneExtent.EncodeTo(Foundation.NSCoder) M:ARKit.ARPlaneGeometry.EncodeTo(Foundation.NSCoder) M:ARKit.ARPlaneGeometry.GetBoundaryVertices @@ -26289,8 +24945,6 @@ M:ARKit.ARPlaneGeometry.GetTextureCoordinates M:ARKit.ARPlaneGeometry.GetTriangleIndices M:ARKit.ARPlaneGeometry.GetVertices M:ARKit.ARPointCloud.EncodeTo(Foundation.NSCoder) -M:ARKit.ARPositionalTrackingConfiguration.GetSupportedVideoFormats -M:ARKit.ARPositionalTrackingConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) M:ARKit.ARReferenceImage.Copy(Foundation.NSZone) M:ARKit.ARReferenceImage.ValidateAsync M:ARKit.ARReferenceObject.EncodeTo(Foundation.NSCoder) @@ -26301,25 +24955,12 @@ M:ARKit.ARSCNViewDelegate_Extensions.DidRemoveNode(ARKit.IARSCNViewDelegate,Scen M:ARKit.ARSCNViewDelegate_Extensions.DidUpdateNode(ARKit.IARSCNViewDelegate,SceneKit.ISCNSceneRenderer,SceneKit.SCNNode,ARKit.ARAnchor) M:ARKit.ARSCNViewDelegate_Extensions.GetNode(ARKit.IARSCNViewDelegate,SceneKit.ISCNSceneRenderer,ARKit.ARAnchor) M:ARKit.ARSCNViewDelegate_Extensions.WillUpdateNode(ARKit.IARSCNViewDelegate,SceneKit.ISCNSceneRenderer,SceneKit.SCNNode,ARKit.ARAnchor) -M:ARKit.ARSCNViewDelegate.CameraDidChangeTrackingState(ARKit.ARSession,ARKit.ARCamera) -M:ARKit.ARSCNViewDelegate.DidAddNode(SceneKit.ISCNSceneRenderer,SceneKit.SCNNode,ARKit.ARAnchor) M:ARKit.ARSCNViewDelegate.DidApplyAnimations(SceneKit.ISCNSceneRenderer,System.Double) M:ARKit.ARSCNViewDelegate.DidApplyConstraints(SceneKit.ISCNSceneRenderer,System.Double) -M:ARKit.ARSCNViewDelegate.DidChangeGeoTrackingStatus(ARKit.ARSession,ARKit.ARGeoTrackingStatus) -M:ARKit.ARSCNViewDelegate.DidFail(ARKit.ARSession,Foundation.NSError) -M:ARKit.ARSCNViewDelegate.DidOutputAudioSampleBuffer(ARKit.ARSession,CoreMedia.CMSampleBuffer) -M:ARKit.ARSCNViewDelegate.DidOutputCollaborationData(ARKit.ARSession,ARKit.ARCollaborationData) -M:ARKit.ARSCNViewDelegate.DidRemoveNode(SceneKit.ISCNSceneRenderer,SceneKit.SCNNode,ARKit.ARAnchor) M:ARKit.ARSCNViewDelegate.DidRenderScene(SceneKit.ISCNSceneRenderer,SceneKit.SCNScene,System.Double) M:ARKit.ARSCNViewDelegate.DidSimulatePhysics(SceneKit.ISCNSceneRenderer,System.Double) -M:ARKit.ARSCNViewDelegate.DidUpdateNode(SceneKit.ISCNSceneRenderer,SceneKit.SCNNode,ARKit.ARAnchor) -M:ARKit.ARSCNViewDelegate.GetNode(SceneKit.ISCNSceneRenderer,ARKit.ARAnchor) -M:ARKit.ARSCNViewDelegate.InterruptionEnded(ARKit.ARSession) -M:ARKit.ARSCNViewDelegate.ShouldAttemptRelocalization(ARKit.ARSession) M:ARKit.ARSCNViewDelegate.Update(SceneKit.ISCNSceneRenderer,System.Double) -M:ARKit.ARSCNViewDelegate.WasInterrupted(ARKit.ARSession) M:ARKit.ARSCNViewDelegate.WillRenderScene(SceneKit.ISCNSceneRenderer,SceneKit.SCNScene,System.Double) -M:ARKit.ARSCNViewDelegate.WillUpdateNode(SceneKit.ISCNSceneRenderer,SceneKit.SCNNode,ARKit.ARAnchor) M:ARKit.ARSession.CaptureHighResolutionFrameAsync M:ARKit.ARSession.CreateReferenceObjectAsync(CoreGraphics.NMatrix4,CoreGraphics.NVector3,CoreGraphics.NVector3) M:ARKit.ARSession.Dispose(System.Boolean) @@ -26331,18 +24972,6 @@ M:ARKit.ARSessionDelegate_Extensions.DidAddAnchors(ARKit.IARSessionDelegate,ARKi M:ARKit.ARSessionDelegate_Extensions.DidRemoveAnchors(ARKit.IARSessionDelegate,ARKit.ARSession,ARKit.ARAnchor[]) M:ARKit.ARSessionDelegate_Extensions.DidUpdateAnchors(ARKit.IARSessionDelegate,ARKit.ARSession,ARKit.ARAnchor[]) M:ARKit.ARSessionDelegate_Extensions.DidUpdateFrame(ARKit.IARSessionDelegate,ARKit.ARSession,ARKit.ARFrame) -M:ARKit.ARSessionDelegate.CameraDidChangeTrackingState(ARKit.ARSession,ARKit.ARCamera) -M:ARKit.ARSessionDelegate.DidAddAnchors(ARKit.ARSession,ARKit.ARAnchor[]) -M:ARKit.ARSessionDelegate.DidChangeGeoTrackingStatus(ARKit.ARSession,ARKit.ARGeoTrackingStatus) -M:ARKit.ARSessionDelegate.DidFail(ARKit.ARSession,Foundation.NSError) -M:ARKit.ARSessionDelegate.DidOutputAudioSampleBuffer(ARKit.ARSession,CoreMedia.CMSampleBuffer) -M:ARKit.ARSessionDelegate.DidOutputCollaborationData(ARKit.ARSession,ARKit.ARCollaborationData) -M:ARKit.ARSessionDelegate.DidRemoveAnchors(ARKit.ARSession,ARKit.ARAnchor[]) -M:ARKit.ARSessionDelegate.DidUpdateAnchors(ARKit.ARSession,ARKit.ARAnchor[]) -M:ARKit.ARSessionDelegate.DidUpdateFrame(ARKit.ARSession,ARKit.ARFrame) -M:ARKit.ARSessionDelegate.InterruptionEnded(ARKit.ARSession) -M:ARKit.ARSessionDelegate.ShouldAttemptRelocalization(ARKit.ARSession) -M:ARKit.ARSessionDelegate.WasInterrupted(ARKit.ARSession) M:ARKit.ARSessionObserver_Extensions.CameraDidChangeTrackingState(ARKit.IARSessionObserver,ARKit.ARSession,ARKit.ARCamera) M:ARKit.ARSessionObserver_Extensions.DidChangeGeoTrackingStatus(ARKit.IARSessionObserver,ARKit.ARSession,ARKit.ARGeoTrackingStatus) M:ARKit.ARSessionObserver_Extensions.DidFail(ARKit.IARSessionObserver,ARKit.ARSession,Foundation.NSError) @@ -26363,25 +24992,10 @@ M:ARKit.ARSKViewDelegate_Extensions.DidRemoveNode(ARKit.IARSKViewDelegate,ARKit. M:ARKit.ARSKViewDelegate_Extensions.DidUpdateNode(ARKit.IARSKViewDelegate,ARKit.ARSKView,SpriteKit.SKNode,ARKit.ARAnchor) M:ARKit.ARSKViewDelegate_Extensions.GetNode(ARKit.IARSKViewDelegate,ARKit.ARSKView,ARKit.ARAnchor) M:ARKit.ARSKViewDelegate_Extensions.WillUpdateNode(ARKit.IARSKViewDelegate,ARKit.ARSKView,SpriteKit.SKNode,ARKit.ARAnchor) -M:ARKit.ARSKViewDelegate.CameraDidChangeTrackingState(ARKit.ARSession,ARKit.ARCamera) -M:ARKit.ARSKViewDelegate.DidAddNode(ARKit.ARSKView,SpriteKit.SKNode,ARKit.ARAnchor) -M:ARKit.ARSKViewDelegate.DidChangeGeoTrackingStatus(ARKit.ARSession,ARKit.ARGeoTrackingStatus) -M:ARKit.ARSKViewDelegate.DidFail(ARKit.ARSession,Foundation.NSError) -M:ARKit.ARSKViewDelegate.DidOutputAudioSampleBuffer(ARKit.ARSession,CoreMedia.CMSampleBuffer) -M:ARKit.ARSKViewDelegate.DidOutputCollaborationData(ARKit.ARSession,ARKit.ARCollaborationData) -M:ARKit.ARSKViewDelegate.DidRemoveNode(ARKit.ARSKView,SpriteKit.SKNode,ARKit.ARAnchor) -M:ARKit.ARSKViewDelegate.DidUpdateNode(ARKit.ARSKView,SpriteKit.SKNode,ARKit.ARAnchor) -M:ARKit.ARSKViewDelegate.GetNode(ARKit.ARSKView,ARKit.ARAnchor) -M:ARKit.ARSKViewDelegate.InterruptionEnded(ARKit.ARSession) -M:ARKit.ARSKViewDelegate.ShouldAttemptRelocalization(ARKit.ARSession) M:ARKit.ARSKViewDelegate.ShouldRender(SpriteKit.SKView,System.Double) -M:ARKit.ARSKViewDelegate.WasInterrupted(ARKit.ARSession) -M:ARKit.ARSKViewDelegate.WillUpdateNode(ARKit.ARSKView,SpriteKit.SKNode,ARKit.ARAnchor) M:ARKit.ARVideoFormat.Copy(Foundation.NSZone) M:ARKit.ARWorldMap.Copy(Foundation.NSZone) M:ARKit.ARWorldMap.EncodeTo(Foundation.NSCoder) -M:ARKit.ARWorldTrackingConfiguration.GetSupportedVideoFormats -M:ARKit.ARWorldTrackingConfiguration.SupportsFrameSemantics(ARKit.ARFrameSemantics) M:ARKit.GeoLocationForPoint.#ctor(CoreLocation.CLLocationCoordinate2D,System.Double) M:ARKit.IARCoachingOverlayViewDelegate.DidDeactivate(ARKit.ARCoachingOverlayView) M:ARKit.IARCoachingOverlayViewDelegate.DidRequestSessionReset(ARKit.ARCoachingOverlayView) @@ -27307,7 +25921,6 @@ M:AutomaticAssessmentConfiguration.IAEAssessmentSessionDelegate.WasInterrupted(A M:AVFoundation.AudioRendererWasFlushedAutomaticallyEventArgs.#ctor(Foundation.NSNotification) M:AVFoundation.AudioSettings.#ctor M:AVFoundation.AudioSettings.#ctor(Foundation.NSDictionary) -M:AVFoundation.AVAsset.Copy(Foundation.NSZone) M:AVFoundation.AVAsset.FindUnusedTrackIdAsync M:AVFoundation.AVAsset.GetMediaSelectionGroupForMediaCharacteristic(AVFoundation.AVMediaCharacteristics) M:AVFoundation.AVAsset.GetMetadataForFormat(AVFoundation.AVMetadataFormat) @@ -27320,10 +25933,7 @@ M:AVFoundation.AVAsset.LoadMetadataAsync(System.String) M:AVFoundation.AVAsset.LoadTrackAsync(System.Int32) M:AVFoundation.AVAsset.LoadTracksWithMediaTypeAsync(System.String) M:AVFoundation.AVAsset.LoadTrackWithMediaCharacteristicsAsync(System.String) -M:AVFoundation.AVAsset.LoadValuesAsynchronously(System.String[],System.Action) M:AVFoundation.AVAsset.LoadValuesTaskAsync(System.String[]) -M:AVFoundation.AVAsset.StatusOfValue(System.String,Foundation.NSError@) -M:AVFoundation.AVAssetDownloadContentConfiguration.Copy(Foundation.NSZone) M:AVFoundation.AVAssetDownloadDelegate_Extensions.DidCompleteForMediaSelection(AVFoundation.IAVAssetDownloadDelegate,Foundation.NSUrlSession,AVFoundation.AVAggregateAssetDownloadTask,AVFoundation.AVMediaSelection) M:AVFoundation.AVAssetDownloadDelegate_Extensions.DidFinishDownloadingToUrl(AVFoundation.IAVAssetDownloadDelegate,Foundation.NSUrlSession,AVFoundation.AVAssetDownloadTask,Foundation.NSUrl) M:AVFoundation.AVAssetDownloadDelegate_Extensions.DidLoadTimeRange(AVFoundation.IAVAssetDownloadDelegate,Foundation.NSUrlSession,AVFoundation.AVAggregateAssetDownloadTask,CoreMedia.CMTimeRange,Foundation.NSValue[],CoreMedia.CMTimeRange,AVFoundation.AVMediaSelection) @@ -27331,28 +25941,19 @@ M:AVFoundation.AVAssetDownloadDelegate_Extensions.DidLoadTimeRange(AVFoundation. M:AVFoundation.AVAssetDownloadDelegate_Extensions.DidResolveMediaSelection(AVFoundation.IAVAssetDownloadDelegate,Foundation.NSUrlSession,AVFoundation.AVAssetDownloadTask,AVFoundation.AVMediaSelection) M:AVFoundation.AVAssetDownloadDelegate_Extensions.WillDownloadToUrl(AVFoundation.IAVAssetDownloadDelegate,Foundation.NSUrlSession,AVFoundation.AVAggregateAssetDownloadTask,Foundation.NSUrl) M:AVFoundation.AVAssetDownloadDelegate_Extensions.WillDownloadVariants(AVFoundation.IAVAssetDownloadDelegate,Foundation.NSUrlSession,AVFoundation.AVAssetDownloadTask,AVFoundation.AVAssetVariant[]) -M:AVFoundation.AVAssetDownloadDelegate.DidCompleteForMediaSelection(Foundation.NSUrlSession,AVFoundation.AVAggregateAssetDownloadTask,AVFoundation.AVMediaSelection) M:AVFoundation.AVAssetDownloadDelegate.DidCompleteWithError(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSError) M:AVFoundation.AVAssetDownloadDelegate.DidCreateTask(Foundation.NSUrlSession,Foundation.NSUrlSessionTask) M:AVFoundation.AVAssetDownloadDelegate.DidFinishCollectingMetrics(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlSessionTaskMetrics) -M:AVFoundation.AVAssetDownloadDelegate.DidFinishDownloadingToUrl(Foundation.NSUrlSession,AVFoundation.AVAssetDownloadTask,Foundation.NSUrl) -M:AVFoundation.AVAssetDownloadDelegate.DidLoadTimeRange(Foundation.NSUrlSession,AVFoundation.AVAggregateAssetDownloadTask,CoreMedia.CMTimeRange,Foundation.NSValue[],CoreMedia.CMTimeRange,AVFoundation.AVMediaSelection) -M:AVFoundation.AVAssetDownloadDelegate.DidLoadTimeRange(Foundation.NSUrlSession,AVFoundation.AVAssetDownloadTask,CoreMedia.CMTimeRange,Foundation.NSValue[],CoreMedia.CMTimeRange) M:AVFoundation.AVAssetDownloadDelegate.DidReceiveChallenge(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlAuthenticationChallenge,System.Action{Foundation.NSUrlSessionAuthChallengeDisposition,Foundation.NSUrlCredential}) M:AVFoundation.AVAssetDownloadDelegate.DidReceiveInformationalResponse(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSHttpUrlResponse) -M:AVFoundation.AVAssetDownloadDelegate.DidResolveMediaSelection(Foundation.NSUrlSession,AVFoundation.AVAssetDownloadTask,AVFoundation.AVMediaSelection) M:AVFoundation.AVAssetDownloadDelegate.DidSendBodyData(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,System.Int64,System.Int64,System.Int64) M:AVFoundation.AVAssetDownloadDelegate.NeedNewBodyStream(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,System.Action{Foundation.NSInputStream}) M:AVFoundation.AVAssetDownloadDelegate.NeedNewBodyStream(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,System.Int64,System.Action{Foundation.NSInputStream}) M:AVFoundation.AVAssetDownloadDelegate.TaskIsWaitingForConnectivity(Foundation.NSUrlSession,Foundation.NSUrlSessionTask) M:AVFoundation.AVAssetDownloadDelegate.WillBeginDelayedRequest(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlRequest,System.Action{Foundation.NSUrlSessionDelayedRequestDisposition,Foundation.NSUrlRequest}) -M:AVFoundation.AVAssetDownloadDelegate.WillDownloadToUrl(Foundation.NSUrlSession,AVFoundation.AVAggregateAssetDownloadTask,Foundation.NSUrl) -M:AVFoundation.AVAssetDownloadDelegate.WillDownloadVariants(Foundation.NSUrlSession,AVFoundation.AVAssetDownloadTask,AVFoundation.AVAssetVariant[]) M:AVFoundation.AVAssetDownloadDelegate.WillPerformHttpRedirection(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSHttpUrlResponse,Foundation.NSUrlRequest,System.Action{Foundation.NSUrlRequest}) M:AVFoundation.AVAssetDownloadOptions.#ctor M:AVFoundation.AVAssetDownloadOptions.#ctor(Foundation.NSDictionary) -M:AVFoundation.AVAssetDownloadStorageManagementPolicy.Copy(Foundation.NSZone) -M:AVFoundation.AVAssetDownloadStorageManagementPolicy.MutableCopy(Foundation.NSZone) M:AVFoundation.AVAssetDownloadUrlSession.CreateDataTask(Foundation.NSUrl,Foundation.NSUrlSessionResponse) M:AVFoundation.AVAssetDownloadUrlSession.CreateDataTask(Foundation.NSUrl) M:AVFoundation.AVAssetDownloadUrlSession.CreateDataTask(Foundation.NSUrlRequest,Foundation.NSUrlSessionResponse) @@ -27398,28 +25999,18 @@ M:AVFoundation.AVAssetResourceLoaderDelegate_Extensions.DidCancelLoadingRequest( M:AVFoundation.AVAssetResourceLoaderDelegate_Extensions.ShouldWaitForLoadingOfRequestedResource(AVFoundation.IAVAssetResourceLoaderDelegate,AVFoundation.AVAssetResourceLoader,AVFoundation.AVAssetResourceLoadingRequest) M:AVFoundation.AVAssetResourceLoaderDelegate_Extensions.ShouldWaitForRenewalOfRequestedResource(AVFoundation.IAVAssetResourceLoaderDelegate,AVFoundation.AVAssetResourceLoader,AVFoundation.AVAssetResourceRenewalRequest) M:AVFoundation.AVAssetResourceLoaderDelegate_Extensions.ShouldWaitForResponseToAuthenticationChallenge(AVFoundation.IAVAssetResourceLoaderDelegate,AVFoundation.AVAssetResourceLoader,Foundation.NSUrlAuthenticationChallenge) -M:AVFoundation.AVAssetResourceLoaderDelegate.DidCancelAuthenticationChallenge(AVFoundation.AVAssetResourceLoader,Foundation.NSUrlAuthenticationChallenge) -M:AVFoundation.AVAssetResourceLoaderDelegate.DidCancelLoadingRequest(AVFoundation.AVAssetResourceLoader,AVFoundation.AVAssetResourceLoadingRequest) -M:AVFoundation.AVAssetResourceLoaderDelegate.ShouldWaitForLoadingOfRequestedResource(AVFoundation.AVAssetResourceLoader,AVFoundation.AVAssetResourceLoadingRequest) -M:AVFoundation.AVAssetResourceLoaderDelegate.ShouldWaitForRenewalOfRequestedResource(AVFoundation.AVAssetResourceLoader,AVFoundation.AVAssetResourceRenewalRequest) -M:AVFoundation.AVAssetResourceLoaderDelegate.ShouldWaitForResponseToAuthenticationChallenge(AVFoundation.AVAssetResourceLoader,Foundation.NSUrlAuthenticationChallenge) M:AVFoundation.AVAssetResourceLoadingDataRequest.ToString -M:AVFoundation.AVAssetTrack.Copy(Foundation.NSZone) M:AVFoundation.AVAssetTrack.Dispose(System.Boolean) M:AVFoundation.AVAssetTrack.LoadAssociatedTracksAsync(System.String) M:AVFoundation.AVAssetTrack.LoadMetadataAsync(System.String) M:AVFoundation.AVAssetTrack.LoadSamplePresentationTimeAsync(CoreMedia.CMTime) M:AVFoundation.AVAssetTrack.LoadSegmentAsync(CoreMedia.CMTime) -M:AVFoundation.AVAssetTrackGroup.Copy(Foundation.NSZone) -M:AVFoundation.AVAssetVariantQualifier.Copy(Foundation.NSZone) M:AVFoundation.AVAssetWriter.CanApplyOutputSettings(AVFoundation.AudioSettings,System.String) M:AVFoundation.AVAssetWriter.CanApplyOutputSettings(AVFoundation.AVVideoSettingsCompressed,System.String) M:AVFoundation.AVAssetWriter.Dispose(System.Boolean) M:AVFoundation.AVAssetWriter.FinishWritingAsync M:AVFoundation.AVAssetWriterDelegate_Extensions.DidOutputSegmentData(AVFoundation.IAVAssetWriterDelegate,AVFoundation.AVAssetWriter,Foundation.NSData,AVFoundation.AVAssetSegmentType,AVFoundation.AVAssetSegmentReport) M:AVFoundation.AVAssetWriterDelegate_Extensions.DidOutputSegmentData(AVFoundation.IAVAssetWriterDelegate,AVFoundation.AVAssetWriter,Foundation.NSData,AVFoundation.AVAssetSegmentType) -M:AVFoundation.AVAssetWriterDelegate.DidOutputSegmentData(AVFoundation.AVAssetWriter,Foundation.NSData,AVFoundation.AVAssetSegmentType,AVFoundation.AVAssetSegmentReport) -M:AVFoundation.AVAssetWriterDelegate.DidOutputSegmentData(AVFoundation.AVAssetWriter,Foundation.NSData,AVFoundation.AVAssetSegmentType) M:AVFoundation.AVAssetWriterInput.#ctor(System.String,AVFoundation.AudioSettings,CoreMedia.CMFormatDescription) M:AVFoundation.AVAssetWriterInput.#ctor(System.String,AVFoundation.AudioSettings) M:AVFoundation.AVAssetWriterInput.#ctor(System.String,AVFoundation.AVVideoSettingsCompressed,CoreMedia.CMFormatDescription) @@ -27430,10 +26021,6 @@ M:AVFoundation.AVAssetWriterInput.Create(System.String,AVFoundation.AVVideoSetti M:AVFoundation.AVAssetWriterInput.Create(System.String,AVFoundation.AVVideoSettingsCompressed) M:AVFoundation.AVAssetWriterInputPixelBufferAdaptor.#ctor(AVFoundation.AVAssetWriterInput,CoreVideo.CVPixelBufferAttributes) M:AVFoundation.AVAssetWriterInputPixelBufferAdaptor.Create(AVFoundation.AVAssetWriterInput,CoreVideo.CVPixelBufferAttributes) -M:AVFoundation.AVAsynchronousCIImageFilteringRequest.Copy(Foundation.NSZone) -M:AVFoundation.AVAsynchronousKeyValueLoading.GetStatusOfValue(System.String,Foundation.NSError@) -M:AVFoundation.AVAsynchronousKeyValueLoading.LoadValuesAsynchronously(System.String[],System.Action) -M:AVFoundation.AVAsynchronousVideoCompositionRequest.Copy(Foundation.NSZone) M:AVFoundation.AVAudio3DAngularOrientation.Equals(AVFoundation.AVAudio3DAngularOrientation) M:AVFoundation.AVAudio3DAngularOrientation.Equals(System.Object) M:AVFoundation.AVAudio3DAngularOrientation.GetHashCode @@ -27447,11 +26034,8 @@ M:AVFoundation.AVAudio3DVectorOrientation.GetHashCode M:AVFoundation.AVAudio3DVectorOrientation.op_Equality(AVFoundation.AVAudio3DVectorOrientation,AVFoundation.AVAudio3DVectorOrientation) M:AVFoundation.AVAudio3DVectorOrientation.op_Inequality(AVFoundation.AVAudio3DVectorOrientation,AVFoundation.AVAudio3DVectorOrientation) M:AVFoundation.AVAudio3DVectorOrientation.ToString -M:AVFoundation.AVAudioBuffer.Copy(Foundation.NSZone) -M:AVFoundation.AVAudioBuffer.MutableCopy(Foundation.NSZone) M:AVFoundation.AVAudioChannelLayout.#ctor(AudioToolbox.AudioChannelLayout) M:AVFoundation.AVAudioChannelLayout.#ctor(System.UInt32) -M:AVFoundation.AVAudioChannelLayout.EncodeTo(Foundation.NSCoder) M:AVFoundation.AVAudioChannelLayout.op_Equality(AVFoundation.AVAudioChannelLayout,AVFoundation.AVAudioChannelLayout) M:AVFoundation.AVAudioChannelLayout.op_Inequality(AVFoundation.AVAudioChannelLayout,AVFoundation.AVAudioChannelLayout) M:AVFoundation.AVAudioCompressedBuffer.#ctor(AVFoundation.AVAudioFormat,System.UInt32,System.IntPtr) @@ -27461,7 +26045,6 @@ M:AVFoundation.AVAudioConnectionPoint.Dispose(System.Boolean) M:AVFoundation.AVAudioConverter.#ctor(AVFoundation.AVAudioFormat,AVFoundation.AVAudioFormat) M:AVFoundation.AVAudioConverter.ConvertToBuffer(AVFoundation.AVAudioBuffer,Foundation.NSError@,AVFoundation.AVAudioConverterInputHandler) M:AVFoundation.AVAudioConverter.ConvertToBuffer(AVFoundation.AVAudioPcmBuffer,AVFoundation.AVAudioPcmBuffer,Foundation.NSError@) -M:AVFoundation.AVAudioConverter.Reset M:AVFoundation.AVAudioConverterPrimeInfo.#ctor(System.UInt32,System.UInt32) M:AVFoundation.AVAudioConverterPrimeInfo.Equals(AVFoundation.AVAudioConverterPrimeInfo) M:AVFoundation.AVAudioConverterPrimeInfo.Equals(System.Object) @@ -27488,13 +26071,10 @@ M:AVFoundation.AVAudioEngine.DisconnectNodeOutput(AVFoundation.AVAudioNode) M:AVFoundation.AVAudioEngine.EnableManualRenderingMode(AVFoundation.AVAudioEngineManualRenderingMode,AVFoundation.AVAudioFormat,System.UInt32,Foundation.NSError@) M:AVFoundation.AVAudioEngine.InputConnectionPoint(AVFoundation.AVAudioNode,System.UIntPtr) M:AVFoundation.AVAudioEngine.OutputConnectionPoints(AVFoundation.AVAudioNode,System.UIntPtr) -M:AVFoundation.AVAudioEngine.Pause M:AVFoundation.AVAudioEngine.Prepare M:AVFoundation.AVAudioEngine.RenderOffline(System.UInt32,AVFoundation.AVAudioPcmBuffer,Foundation.NSError@) -M:AVFoundation.AVAudioEngine.Reset M:AVFoundation.AVAudioEngine.StartAndReturnError(Foundation.NSError@) M:AVFoundation.AVAudioEngine.Stop -M:AVFoundation.AVAudioEnvironmentNode.#ctor M:AVFoundation.AVAudioEnvironmentNode.DestinationForMixer(AVFoundation.AVAudioNode,System.UIntPtr) M:AVFoundation.AVAudioEnvironmentReverbParameters.LoadFactoryReverbPreset(AVFoundation.AVAudioUnitReverbPreset) M:AVFoundation.AVAudioFile.#ctor(Foundation.NSUrl,AVFoundation.AudioSettings,AVFoundation.AVAudioCommonFormat,System.Boolean,Foundation.NSError@) @@ -27514,26 +26094,19 @@ M:AVFoundation.AVAudioFormat.#ctor(CoreMedia.CMAudioFormatDescription) M:AVFoundation.AVAudioFormat.#ctor(Foundation.NSDictionary) M:AVFoundation.AVAudioFormat.#ctor(System.Double,AVFoundation.AVAudioChannelLayout) M:AVFoundation.AVAudioFormat.#ctor(System.Double,System.UInt32) -M:AVFoundation.AVAudioFormat.EncodeTo(Foundation.NSCoder) M:AVFoundation.AVAudioFormat.op_Equality(AVFoundation.AVAudioFormat,AVFoundation.AVAudioFormat) M:AVFoundation.AVAudioFormat.op_Inequality(AVFoundation.AVAudioFormat,AVFoundation.AVAudioFormat) M:AVFoundation.AVAudioInputNode.DestinationForMixer(AVFoundation.AVAudioNode,System.UIntPtr) M:AVFoundation.AVAudioInputNode.SetManualRenderingInputPcmFormat(AVFoundation.AVAudioFormat,AVFoundation.AVAudioIONodeInputBlock) M:AVFoundation.AVAudioIONode.SetVoiceProcessingEnabled(System.Boolean,Foundation.NSError@) -M:AVFoundation.AVAudioMix.Copy(Foundation.NSZone) -M:AVFoundation.AVAudioMix.MutableCopy(Foundation.NSZone) -M:AVFoundation.AVAudioMixerNode.#ctor M:AVFoundation.AVAudioMixerNode.DestinationForMixer(AVFoundation.AVAudioNode,System.UIntPtr) M:AVFoundation.AVAudioMixingDestination.DestinationForMixer(AVFoundation.AVAudioNode,System.UIntPtr) -M:AVFoundation.AVAudioMixInputParameters.Copy(Foundation.NSZone) -M:AVFoundation.AVAudioMixInputParameters.MutableCopy(Foundation.NSZone) M:AVFoundation.AVAudioNode.GetBusInputFormat(System.UIntPtr) M:AVFoundation.AVAudioNode.GetBusOutputFormat(System.UIntPtr) M:AVFoundation.AVAudioNode.GetNameForInputBus(System.UIntPtr) M:AVFoundation.AVAudioNode.GetNameForOutputBus(System.UIntPtr) M:AVFoundation.AVAudioNode.InstallTapOnBus(System.UIntPtr,System.UInt32,AVFoundation.AVAudioFormat,AVFoundation.AVAudioNodeTapBlock) M:AVFoundation.AVAudioNode.RemoveTapOnBus(System.UIntPtr) -M:AVFoundation.AVAudioNode.Reset M:AVFoundation.AVAudioPcmBuffer.#ctor(AVFoundation.AVAudioFormat,AudioToolbox.AudioBuffers,System.Action{AudioToolbox.AudioBuffers}) M:AVFoundation.AVAudioPcmBuffer.#ctor(AVFoundation.AVAudioFormat,System.UInt32) M:AVFoundation.AVAudioPlayer.#ctor(Foundation.NSData,System.String,Foundation.NSError@) @@ -27548,9 +26121,7 @@ M:AVFoundation.AVAudioPlayer.FromData(Foundation.NSData,Foundation.NSError@) M:AVFoundation.AVAudioPlayer.FromData(Foundation.NSData) M:AVFoundation.AVAudioPlayer.FromUrl(Foundation.NSUrl,Foundation.NSError@) M:AVFoundation.AVAudioPlayer.FromUrl(Foundation.NSUrl) -M:AVFoundation.AVAudioPlayer.Pause M:AVFoundation.AVAudioPlayer.PeakPower(System.UIntPtr) -M:AVFoundation.AVAudioPlayer.Play M:AVFoundation.AVAudioPlayer.PlayAtTime(System.Double) M:AVFoundation.AVAudioPlayer.PrepareToPlay M:AVFoundation.AVAudioPlayer.remove_BeginInterruption(System.EventHandler) @@ -27570,12 +26141,9 @@ M:AVFoundation.AVAudioPlayerDelegate.DecoderError(AVFoundation.AVAudioPlayer,Fou M:AVFoundation.AVAudioPlayerDelegate.EndInterruption(AVFoundation.AVAudioPlayer,AVFoundation.AVAudioSessionInterruptionOptions) M:AVFoundation.AVAudioPlayerDelegate.EndInterruption(AVFoundation.AVAudioPlayer) M:AVFoundation.AVAudioPlayerDelegate.FinishedPlaying(AVFoundation.AVAudioPlayer,System.Boolean) -M:AVFoundation.AVAudioPlayerNode.#ctor M:AVFoundation.AVAudioPlayerNode.DestinationForMixer(AVFoundation.AVAudioNode,System.UIntPtr) M:AVFoundation.AVAudioPlayerNode.GetNodeTimeFromPlayerTime(AVFoundation.AVAudioTime) M:AVFoundation.AVAudioPlayerNode.GetPlayerTimeFromNodeTime(AVFoundation.AVAudioTime) -M:AVFoundation.AVAudioPlayerNode.Pause -M:AVFoundation.AVAudioPlayerNode.Play M:AVFoundation.AVAudioPlayerNode.PlayAtTime(AVFoundation.AVAudioTime) M:AVFoundation.AVAudioPlayerNode.PrepareWithFrameCount(System.UInt32) M:AVFoundation.AVAudioPlayerNode.ScheduleBuffer(AVFoundation.AVAudioPcmBuffer,AVFoundation.AVAudioPlayerNodeCompletionCallbackType,System.Action{AVFoundation.AVAudioPlayerNodeCompletionCallbackType}) @@ -27604,7 +26172,6 @@ M:AVFoundation.AVAudioRecorder.Create(Foundation.NSUrl,AVFoundation.AudioSetting M:AVFoundation.AVAudioRecorder.Create(Foundation.NSUrl,AVFoundation.AVAudioFormat,Foundation.NSError@) M:AVFoundation.AVAudioRecorder.DeleteRecording M:AVFoundation.AVAudioRecorder.Dispose(System.Boolean) -M:AVFoundation.AVAudioRecorder.Pause M:AVFoundation.AVAudioRecorder.PeakPower(System.UIntPtr) M:AVFoundation.AVAudioRecorder.PrepareToRecord M:AVFoundation.AVAudioRecorder.Record @@ -27763,27 +26330,16 @@ M:AVFoundation.AVBeatRange.GetHashCode M:AVFoundation.AVBeatRange.op_Equality(AVFoundation.AVBeatRange,AVFoundation.AVBeatRange) M:AVFoundation.AVBeatRange.op_Inequality(AVFoundation.AVBeatRange,AVFoundation.AVBeatRange) M:AVFoundation.AVBeatRange.ToString -M:AVFoundation.AVCaption.Copy(Foundation.NSZone) -M:AVFoundation.AVCaption.EncodeTo(Foundation.NSCoder) -M:AVFoundation.AVCaption.MutableCopy(Foundation.NSZone) M:AVFoundation.AVCaptionDimension.Create(System.Runtime.InteropServices.NFloat,AVFoundation.AVCaptionUnitsType) M:AVFoundation.AVCaptionFormatConformer.#ctor(AVFoundation.AVCaptionSettings) M:AVFoundation.AVCaptionFormatConformer.CreateFromSettings(AVFoundation.AVCaptionSettings) M:AVFoundation.AVCaptionPoint.Create(AVFoundation.AVCaptionDimension,AVFoundation.AVCaptionDimension) -M:AVFoundation.AVCaptionRegion.Copy(Foundation.NSZone) -M:AVFoundation.AVCaptionRendererScene.Copy(Foundation.NSZone) -M:AVFoundation.AVCaptionRuby.Copy(Foundation.NSZone) -M:AVFoundation.AVCaptionRuby.EncodeTo(Foundation.NSCoder) M:AVFoundation.AVCaptionSettings.#ctor M:AVFoundation.AVCaptionSettings.#ctor(Foundation.NSDictionary) M:AVFoundation.AVCaptionSize.Create(AVFoundation.AVCaptionDimension,AVFoundation.AVCaptionDimension) M:AVFoundation.AVCaptureAudioDataOutputSampleBufferDelegate_Extensions.DidOutputSampleBuffer(AVFoundation.IAVCaptureAudioDataOutputSampleBufferDelegate,AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureAudioDataOutputSampleBufferDelegate.DidOutputSampleBuffer(AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureDataOutputSynchronizerDelegate.DidOutputSynchronizedDataCollection(AVFoundation.AVCaptureDataOutputSynchronizer,AVFoundation.AVCaptureSynchronizedDataCollection) M:AVFoundation.AVCaptureDepthDataOutputDelegate_Extensions.DidDropDepthData(AVFoundation.IAVCaptureDepthDataOutputDelegate,AVFoundation.AVCaptureDepthDataOutput,AVFoundation.AVDepthData,CoreMedia.CMTime,AVFoundation.AVCaptureConnection,AVFoundation.AVCaptureOutputDataDroppedReason) M:AVFoundation.AVCaptureDepthDataOutputDelegate_Extensions.DidOutputDepthData(AVFoundation.IAVCaptureDepthDataOutputDelegate,AVFoundation.AVCaptureDepthDataOutput,AVFoundation.AVDepthData,CoreMedia.CMTime,AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureDepthDataOutputDelegate.DidDropDepthData(AVFoundation.AVCaptureDepthDataOutput,AVFoundation.AVDepthData,CoreMedia.CMTime,AVFoundation.AVCaptureConnection,AVFoundation.AVCaptureOutputDataDroppedReason) -M:AVFoundation.AVCaptureDepthDataOutputDelegate.DidOutputDepthData(AVFoundation.AVCaptureDepthDataOutput,AVFoundation.AVDepthData,CoreMedia.CMTime,AVFoundation.AVCaptureConnection) M:AVFoundation.AVCaptureDevice.Dispose(System.Boolean) M:AVFoundation.AVCaptureDevice.GetAuthorizationStatus(AVFoundation.AVAuthorizationMediaType) M:AVFoundation.AVCaptureDevice.GetDefaultDevice(AVFoundation.AVCaptureDeviceType,System.String,AVFoundation.AVCaptureDevicePosition) @@ -27800,19 +26356,11 @@ M:AVFoundation.AVCaptureDeviceInput.FromDevice(AVFoundation.AVCaptureDevice) M:AVFoundation.AVCaptureFileOutput.Dispose(System.Boolean) M:AVFoundation.AVCaptureFileOutput.StartRecordingToOutputFile(Foundation.NSUrl,System.Action{Foundation.NSObject[]},System.Action{Foundation.NSObject[],Foundation.NSError}) M:AVFoundation.AVCaptureFileOutputDelegate_Extensions.DidOutputSampleBuffer(AVFoundation.IAVCaptureFileOutputDelegate,AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureFileOutputDelegate.DidOutputSampleBuffer(AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureFileOutputDelegate.ShouldProvideSampleAccurateRecordingStart(AVFoundation.AVCaptureOutput) M:AVFoundation.AVCaptureFileOutputRecordingDelegate_Extensions.DidPauseRecording(AVFoundation.IAVCaptureFileOutputRecordingDelegate,AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,AVFoundation.AVCaptureConnection[]) M:AVFoundation.AVCaptureFileOutputRecordingDelegate_Extensions.DidResumeRecording(AVFoundation.IAVCaptureFileOutputRecordingDelegate,AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,AVFoundation.AVCaptureConnection[]) M:AVFoundation.AVCaptureFileOutputRecordingDelegate_Extensions.DidStartRecording(AVFoundation.IAVCaptureFileOutputRecordingDelegate,AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,Foundation.NSObject[]) M:AVFoundation.AVCaptureFileOutputRecordingDelegate_Extensions.WillFinishRecording(AVFoundation.IAVCaptureFileOutputRecordingDelegate,AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,AVFoundation.AVCaptureConnection[],Foundation.NSError) -M:AVFoundation.AVCaptureFileOutputRecordingDelegate.DidPauseRecording(AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,AVFoundation.AVCaptureConnection[]) -M:AVFoundation.AVCaptureFileOutputRecordingDelegate.DidResumeRecording(AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,AVFoundation.AVCaptureConnection[]) -M:AVFoundation.AVCaptureFileOutputRecordingDelegate.DidStartRecording(AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,Foundation.NSObject[]) -M:AVFoundation.AVCaptureFileOutputRecordingDelegate.FinishedRecording(AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,Foundation.NSObject[],Foundation.NSError) -M:AVFoundation.AVCaptureFileOutputRecordingDelegate.WillFinishRecording(AVFoundation.AVCaptureFileOutput,Foundation.NSUrl,AVFoundation.AVCaptureConnection[],Foundation.NSError) M:AVFoundation.AVCaptureMetadataOutputObjectsDelegate_Extensions.DidOutputMetadataObjects(AVFoundation.IAVCaptureMetadataOutputObjectsDelegate,AVFoundation.AVCaptureMetadataOutput,AVFoundation.AVMetadataObject[],AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureMetadataOutputObjectsDelegate.DidOutputMetadataObjects(AVFoundation.AVCaptureMetadataOutput,AVFoundation.AVMetadataObject[],AVFoundation.AVCaptureConnection) M:AVFoundation.AVCapturePhotoCaptureDelegate_Extensions.DidCapturePhoto(AVFoundation.IAVCapturePhotoCaptureDelegate,AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings) M:AVFoundation.AVCapturePhotoCaptureDelegate_Extensions.DidFinishCapture(AVFoundation.IAVCapturePhotoCaptureDelegate,AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings,Foundation.NSError) M:AVFoundation.AVCapturePhotoCaptureDelegate_Extensions.DidFinishProcessingLivePhotoMovie(AVFoundation.IAVCapturePhotoCaptureDelegate,AVFoundation.AVCapturePhotoOutput,Foundation.NSUrl,CoreMedia.CMTime,CoreMedia.CMTime,AVFoundation.AVCaptureResolvedPhotoSettings,Foundation.NSError) @@ -27822,15 +26370,6 @@ M:AVFoundation.AVCapturePhotoCaptureDelegate_Extensions.DidFinishProcessingRawPh M:AVFoundation.AVCapturePhotoCaptureDelegate_Extensions.DidFinishRecordingLivePhotoMovie(AVFoundation.IAVCapturePhotoCaptureDelegate,AVFoundation.AVCapturePhotoOutput,Foundation.NSUrl,AVFoundation.AVCaptureResolvedPhotoSettings) M:AVFoundation.AVCapturePhotoCaptureDelegate_Extensions.WillBeginCapture(AVFoundation.IAVCapturePhotoCaptureDelegate,AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings) M:AVFoundation.AVCapturePhotoCaptureDelegate_Extensions.WillCapturePhoto(AVFoundation.IAVCapturePhotoCaptureDelegate,AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings) -M:AVFoundation.AVCapturePhotoCaptureDelegate.DidCapturePhoto(AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings) -M:AVFoundation.AVCapturePhotoCaptureDelegate.DidFinishCapture(AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings,Foundation.NSError) -M:AVFoundation.AVCapturePhotoCaptureDelegate.DidFinishProcessingLivePhotoMovie(AVFoundation.AVCapturePhotoOutput,Foundation.NSUrl,CoreMedia.CMTime,CoreMedia.CMTime,AVFoundation.AVCaptureResolvedPhotoSettings,Foundation.NSError) -M:AVFoundation.AVCapturePhotoCaptureDelegate.DidFinishProcessingPhoto(AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCapturePhoto,Foundation.NSError) -M:AVFoundation.AVCapturePhotoCaptureDelegate.DidFinishProcessingPhoto(AVFoundation.AVCapturePhotoOutput,CoreMedia.CMSampleBuffer,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureResolvedPhotoSettings,AVFoundation.AVCaptureBracketedStillImageSettings,Foundation.NSError) -M:AVFoundation.AVCapturePhotoCaptureDelegate.DidFinishProcessingRawPhoto(AVFoundation.AVCapturePhotoOutput,CoreMedia.CMSampleBuffer,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureResolvedPhotoSettings,AVFoundation.AVCaptureBracketedStillImageSettings,Foundation.NSError) -M:AVFoundation.AVCapturePhotoCaptureDelegate.DidFinishRecordingLivePhotoMovie(AVFoundation.AVCapturePhotoOutput,Foundation.NSUrl,AVFoundation.AVCaptureResolvedPhotoSettings) -M:AVFoundation.AVCapturePhotoCaptureDelegate.WillBeginCapture(AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings) -M:AVFoundation.AVCapturePhotoCaptureDelegate.WillCapturePhoto(AVFoundation.AVCapturePhotoOutput,AVFoundation.AVCaptureResolvedPhotoSettings) M:AVFoundation.AVCapturePhotoFileDataRepresentationCustomizer_Extensions.GetReplacementAppleProRawCompressionSettings(AVFoundation.IAVCapturePhotoFileDataRepresentationCustomizer,AVFoundation.AVCapturePhoto,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.IntPtr) M:AVFoundation.AVCapturePhotoFileDataRepresentationCustomizer_Extensions.GetReplacementDepthData(AVFoundation.IAVCapturePhotoFileDataRepresentationCustomizer,AVFoundation.AVCapturePhoto) M:AVFoundation.AVCapturePhotoFileDataRepresentationCustomizer_Extensions.GetReplacementEmbeddedThumbnail(AVFoundation.IAVCapturePhotoFileDataRepresentationCustomizer,Foundation.NSDictionary`2@,AVFoundation.AVCapturePhoto) @@ -27840,7 +26379,6 @@ M:AVFoundation.AVCapturePhotoFileDataRepresentationCustomizer_Extensions.GetRepl M:AVFoundation.AVCapturePhotoOutput.Dispose(System.Boolean) M:AVFoundation.AVCapturePhotoOutput.GetSupportedPhotoCodecTypesForFileType(System.String) M:AVFoundation.AVCapturePhotoOutput.SetPreparedPhotoSettingsAsync(AVFoundation.AVCapturePhotoSettings[]) -M:AVFoundation.AVCapturePhotoSettings.Copy(Foundation.NSZone) M:AVFoundation.AVCapturePhotoSettings.Dispose(System.Boolean) M:AVFoundation.AVCapturePhotoSettingsThumbnailFormat.#ctor M:AVFoundation.AVCapturePhotoSettingsThumbnailFormat.#ctor(Foundation.NSDictionary) @@ -27849,8 +26387,6 @@ M:AVFoundation.AVCaptureStillImageOutput.CaptureStillImageTaskAsync(AVFoundation M:AVFoundation.AVCaptureVideoDataOutput.GetRecommendedVideoSettings(System.String,System.String) M:AVFoundation.AVCaptureVideoDataOutputSampleBufferDelegate_Extensions.DidDropSampleBuffer(AVFoundation.IAVCaptureVideoDataOutputSampleBufferDelegate,AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) M:AVFoundation.AVCaptureVideoDataOutputSampleBufferDelegate_Extensions.DidOutputSampleBuffer(AVFoundation.IAVCaptureVideoDataOutputSampleBufferDelegate,AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureVideoDataOutputSampleBufferDelegate.DidDropSampleBuffer(AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) -M:AVFoundation.AVCaptureVideoDataOutputSampleBufferDelegate.DidOutputSampleBuffer(AVFoundation.AVCaptureOutput,CoreMedia.CMSampleBuffer,AVFoundation.AVCaptureConnection) M:AVFoundation.AVCaptureVideoPreviewLayer.#ctor(AVFoundation.AVCaptureSession,AVFoundation.AVCaptureVideoPreviewLayer.InitMode) M:AVFoundation.AVCaptureVideoPreviewLayer.#ctor(AVFoundation.AVCaptureSession) M:AVFoundation.AVCaptureWhiteBalanceChromaticityValues.#ctor(System.Single,System.Single) @@ -27891,9 +26427,6 @@ M:AVFoundation.AVComposition_AVCompositionTrackInspection.LoadTracksWithMediaCha M:AVFoundation.AVComposition_AVCompositionTrackInspection.LoadTracksWithMediaCharacteristicAsync(AVFoundation.AVComposition,System.String) M:AVFoundation.AVComposition_AVCompositionTrackInspection.LoadTracksWithMediaType(AVFoundation.AVComposition,System.String,System.Action{Foundation.NSArray{AVFoundation.AVMutableCompositionTrack},Foundation.NSError}) M:AVFoundation.AVComposition_AVCompositionTrackInspection.LoadTracksWithMediaTypeAsync(AVFoundation.AVComposition,System.String) -M:AVFoundation.AVComposition.Copy(Foundation.NSZone) -M:AVFoundation.AVComposition.MutableCopy(Foundation.NSZone) -M:AVFoundation.AVCompositionTrackFormatDescriptionReplacement.EncodeTo(Foundation.NSCoder) M:AVFoundation.AVCompressionProperties.#ctor M:AVFoundation.AVCompressionProperties.#ctor(Foundation.NSDictionary) M:AVFoundation.AVContentKeyRecipient_Extensions.DidProvideContentKey(AVFoundation.IAVContentKeyRecipient,AVFoundation.AVContentKeySession,AVFoundation.AVContentKey) @@ -27921,25 +26454,12 @@ M:AVFoundation.AVContentKeySessionDelegate_Extensions.DidProvideRenewingContentK M:AVFoundation.AVContentKeySessionDelegate_Extensions.DidSucceed(AVFoundation.IAVContentKeySessionDelegate,AVFoundation.AVContentKeySession,AVFoundation.AVContentKeyRequest) M:AVFoundation.AVContentKeySessionDelegate_Extensions.DidUpdate(AVFoundation.IAVContentKeySessionDelegate,AVFoundation.AVContentKeySession,Foundation.NSData,Foundation.NSObject) M:AVFoundation.AVContentKeySessionDelegate_Extensions.ShouldRetryContentKeyRequest(AVFoundation.IAVContentKeySessionDelegate,AVFoundation.AVContentKeySession,AVFoundation.AVContentKeyRequest,System.String) -M:AVFoundation.AVContentKeySessionDelegate.DidChange(AVFoundation.AVContentKeySession) -M:AVFoundation.AVContentKeySessionDelegate.DidFail(AVFoundation.AVContentKeySession,AVFoundation.AVContentKeyRequest,Foundation.NSError) -M:AVFoundation.AVContentKeySessionDelegate.DidGenerateExpiredSessionReport(AVFoundation.AVContentKeySession) -M:AVFoundation.AVContentKeySessionDelegate.DidProvideContentKeyRequest(AVFoundation.AVContentKeySession,AVFoundation.AVContentKeyRequest) -M:AVFoundation.AVContentKeySessionDelegate.DidProvidePersistableContentKeyRequest(AVFoundation.AVContentKeySession,AVFoundation.AVPersistableContentKeyRequest) -M:AVFoundation.AVContentKeySessionDelegate.DidProvideRenewingContentKeyRequest(AVFoundation.AVContentKeySession,AVFoundation.AVContentKeyRequest) -M:AVFoundation.AVContentKeySessionDelegate.DidSucceed(AVFoundation.AVContentKeySession,AVFoundation.AVContentKeyRequest) -M:AVFoundation.AVContentKeySessionDelegate.DidUpdate(AVFoundation.AVContentKeySession,Foundation.NSData,Foundation.NSObject) -M:AVFoundation.AVContentKeySessionDelegate.ShouldRetryContentKeyRequest(AVFoundation.AVContentKeySession,AVFoundation.AVContentKeyRequest,System.String) M:AVFoundation.AVContentKeySessionServerPlaybackContextOptions.#ctor M:AVFoundation.AVContentKeySessionServerPlaybackContextOptions.#ctor(Foundation.NSDictionary) M:AVFoundation.AVContentProposal.#ctor(CoreMedia.CMTime,System.String,UIKit.UIImage) -M:AVFoundation.AVContentProposal.Copy(Foundation.NSZone) M:AVFoundation.AVContentProposal.Dispose(System.Boolean) -M:AVFoundation.AVDateRangeMetadataGroup.Copy(Foundation.NSZone) -M:AVFoundation.AVDateRangeMetadataGroup.MutableCopy(Foundation.NSZone) M:AVFoundation.AVDelegatingPlaybackCoordinator.Dispose(System.Boolean) M:AVFoundation.AVDepthData.Create(ImageIO.CGImageAuxiliaryDataInfo,Foundation.NSError@) -M:AVFoundation.AVDisplayCriteria.Copy(Foundation.NSZone) M:AVFoundation.AVEdgeWidths.#ctor(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:AVFoundation.AVEdgeWidths.Equals(System.Object) M:AVFoundation.AVEdgeWidths.GetHashCode @@ -27958,7 +26478,6 @@ M:AVFoundation.AVFragmentedAsset_AVFragmentedAssetTrackInspection.LoadTracksWith M:AVFoundation.AVFragmentedAsset_AVFragmentedAssetTrackInspection.LoadTracksWithMediaCharacteristicAsync(AVFoundation.AVFragmentedAsset,System.String) M:AVFoundation.AVFragmentedAsset_AVFragmentedAssetTrackInspection.LoadTracksWithMediaType(AVFoundation.AVFragmentedAsset,System.String,System.Action{Foundation.NSArray{AVFoundation.AVFragmentedAssetTrack},Foundation.NSError}) M:AVFoundation.AVFragmentedAsset_AVFragmentedAssetTrackInspection.LoadTracksWithMediaTypeAsync(AVFoundation.AVFragmentedAsset,System.String) -M:AVFoundation.AVFragmentedAsset.#ctor(Foundation.NSUrl,Foundation.NSDictionary) M:AVFoundation.AVFragmentedAsset.IsAssociatedWithFragmentMinder M:AVFoundation.AVFragmentedMovie_AVFragmentedMovieTrackInspection.GetTrack(AVFoundation.AVFragmentedMovie,System.Int32) M:AVFoundation.AVFragmentedMovie_AVFragmentedMovieTrackInspection.GetTracks(AVFoundation.AVFragmentedMovie,AVFoundation.AVMediaCharacteristics) @@ -27971,28 +26490,13 @@ M:AVFoundation.AVFragmentedMovie_AVFragmentedMovieTrackInspection.LoadTracksWith M:AVFoundation.AVFragmentedMovie_AVFragmentedMovieTrackInspection.LoadTracksWithMediaCharacteristicAsync(AVFoundation.AVFragmentedMovie,System.String) M:AVFoundation.AVFragmentedMovie_AVFragmentedMovieTrackInspection.LoadTracksWithMediaType(AVFoundation.AVFragmentedMovie,System.String,System.Action{Foundation.NSArray{AVFoundation.AVMutableCompositionTrack},Foundation.NSError}) M:AVFoundation.AVFragmentedMovie_AVFragmentedMovieTrackInspection.LoadTracksWithMediaTypeAsync(AVFoundation.AVFragmentedMovie,System.String) -M:AVFoundation.AVFragmentedMovie.#ctor(Foundation.NSData,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:AVFoundation.AVFragmentedMovie.#ctor(Foundation.NSUrl,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:AVFoundation.AVFragmentedMovie.IsAssociatedWithFragmentMinder -M:AVFoundation.AVMediaSelection.Copy(Foundation.NSZone) M:AVFoundation.AVMediaSelection.Dispose(System.Boolean) -M:AVFoundation.AVMediaSelection.MutableCopy(Foundation.NSZone) -M:AVFoundation.AVMediaSelectionGroup.Copy(Foundation.NSZone) -M:AVFoundation.AVMediaSelectionOption.Copy(Foundation.NSZone) -M:AVFoundation.AVMetadataBodyObject.Copy(Foundation.NSZone) -M:AVFoundation.AVMetadataCatBodyObject.Copy(Foundation.NSZone) -M:AVFoundation.AVMetadataDogBodyObject.Copy(Foundation.NSZone) -M:AVFoundation.AVMetadataFaceObject.Copy(Foundation.NSZone) -M:AVFoundation.AVMetadataHumanBodyObject.Copy(Foundation.NSZone) -M:AVFoundation.AVMetadataItem.Copy(Foundation.NSZone) M:AVFoundation.AVMetadataItem.LoadValuesTaskAsync(System.String[]) -M:AVFoundation.AVMetadataItem.MutableCopy(Foundation.NSZone) M:AVFoundation.AVMetadataItemValueRequest.Dispose(System.Boolean) M:AVFoundation.AVMetadataObjectTypeExtensions.ToFlags(System.Collections.Generic.IEnumerable{Foundation.NSString}) -M:AVFoundation.AVMetadataSalientObject.Copy(Foundation.NSZone) M:AVFoundation.AVMidiPlayer.#ctor(Foundation.NSData,Foundation.NSUrl,Foundation.NSError@) M:AVFoundation.AVMidiPlayer.#ctor(Foundation.NSUrl,Foundation.NSUrl,Foundation.NSError@) -M:AVFoundation.AVMidiPlayer.Play(System.Action) M:AVFoundation.AVMidiPlayer.PlayAsync M:AVFoundation.AVMidiPlayer.PrepareToPlay M:AVFoundation.AVMidiPlayer.Stop @@ -28010,9 +26514,6 @@ M:AVFoundation.AVMovie_AVMovieTrackInspection.LoadTracksWithMediaCharacteristic( M:AVFoundation.AVMovie_AVMovieTrackInspection.LoadTracksWithMediaCharacteristicAsync(AVFoundation.AVMovie,System.String) M:AVFoundation.AVMovie_AVMovieTrackInspection.LoadTracksWithMediaType(AVFoundation.AVMovie,System.String,System.Action{Foundation.NSArray{AVFoundation.AVMutableCompositionTrack},Foundation.NSError}) M:AVFoundation.AVMovie_AVMovieTrackInspection.LoadTracksWithMediaTypeAsync(AVFoundation.AVMovie,System.String) -M:AVFoundation.AVMovie.Copy(Foundation.NSZone) -M:AVFoundation.AVMovie.MutableCopy(Foundation.NSZone) -M:AVFoundation.AVMutableCaption.#ctor(System.String,CoreMedia.CMTimeRange) M:AVFoundation.AVMutableComposition_AVMutableCompositionTrackInspection.GetTrack(AVFoundation.AVMutableComposition,System.Int32) M:AVFoundation.AVMutableComposition_AVMutableCompositionTrackInspection.GetTracks(AVFoundation.AVMutableComposition,AVFoundation.AVMediaCharacteristics) M:AVFoundation.AVMutableComposition_AVMutableCompositionTrackInspection.GetTracks(AVFoundation.AVMutableComposition,AVFoundation.AVMediaTypes) @@ -28055,10 +26556,6 @@ M:AVFoundation.AVPixelAspectRatio.op_Inequality(AVFoundation.AVPixelAspectRatio, M:AVFoundation.AVPixelAspectRatio.ToString M:AVFoundation.AVPixelAspectRatioProperties.#ctor M:AVFoundation.AVPixelAspectRatioProperties.#ctor(Foundation.NSDictionary) -M:AVFoundation.AVPlaybackCoordinatorPlaybackControlDelegate.DidIssueBufferingCommand(AVFoundation.AVDelegatingPlaybackCoordinator,AVFoundation.AVDelegatingPlaybackCoordinatorBufferingCommand,System.Action) -M:AVFoundation.AVPlaybackCoordinatorPlaybackControlDelegate.DidIssuePauseCommand(AVFoundation.AVDelegatingPlaybackCoordinator,AVFoundation.AVDelegatingPlaybackCoordinatorPauseCommand,System.Action) -M:AVFoundation.AVPlaybackCoordinatorPlaybackControlDelegate.DidIssuePlayCommand(AVFoundation.AVDelegatingPlaybackCoordinator,AVFoundation.AVDelegatingPlaybackCoordinatorPlayCommand,System.Action) -M:AVFoundation.AVPlaybackCoordinatorPlaybackControlDelegate.DidIssueSeekCommand(AVFoundation.AVDelegatingPlaybackCoordinator,AVFoundation.AVDelegatingPlaybackCoordinatorSeekCommand,System.Action) M:AVFoundation.AVPlayer.PrerollAsync(System.Single) M:AVFoundation.AVPlayer.SeekAsync(CoreMedia.CMTime,CoreMedia.CMTime,CoreMedia.CMTime) M:AVFoundation.AVPlayer.SeekAsync(CoreMedia.CMTime) @@ -28082,25 +26579,14 @@ M:AVFoundation.AVPlayerItem.SeekAsync(CoreMedia.CMTime,CoreMedia.CMTime,CoreMedi M:AVFoundation.AVPlayerItem.SeekAsync(CoreMedia.CMTime) M:AVFoundation.AVPlayerItem.SeekAsync(Foundation.NSDate,System.Boolean@) M:AVFoundation.AVPlayerItem.SeekAsync(Foundation.NSDate) -M:AVFoundation.AVPlayerItemAccessLog.Copy(Foundation.NSZone) -M:AVFoundation.AVPlayerItemAccessLogEvent.Copy(Foundation.NSZone) M:AVFoundation.AVPlayerItemErrorEventArgs.#ctor(Foundation.NSNotification) -M:AVFoundation.AVPlayerItemErrorLog.Copy(Foundation.NSZone) -M:AVFoundation.AVPlayerItemErrorLogEvent.Copy(Foundation.NSZone) M:AVFoundation.AVPlayerItemLegibleOutputPushDelegate_Extensions.DidOutputAttributedStrings(AVFoundation.IAVPlayerItemLegibleOutputPushDelegate,AVFoundation.AVPlayerItemLegibleOutput,Foundation.NSAttributedString[],CoreMedia.CMSampleBuffer[],CoreMedia.CMTime) -M:AVFoundation.AVPlayerItemLegibleOutputPushDelegate.DidOutputAttributedStrings(AVFoundation.AVPlayerItemLegibleOutput,Foundation.NSAttributedString[],CoreMedia.CMSampleBuffer[],CoreMedia.CMTime) M:AVFoundation.AVPlayerItemMetadataCollector.Dispose(System.Boolean) -M:AVFoundation.AVPlayerItemMetadataCollectorPushDelegate.DidCollectDateRange(AVFoundation.AVPlayerItemMetadataCollector,AVFoundation.AVDateRangeMetadataGroup[],Foundation.NSIndexSet,Foundation.NSIndexSet) M:AVFoundation.AVPlayerItemMetadataOutput.Dispose(System.Boolean) M:AVFoundation.AVPlayerItemMetadataOutputPushDelegate_Extensions.DidOutputTimedMetadataGroups(AVFoundation.IAVPlayerItemMetadataOutputPushDelegate,AVFoundation.AVPlayerItemMetadataOutput,AVFoundation.AVTimedMetadataGroup[],AVFoundation.AVPlayerItemTrack) -M:AVFoundation.AVPlayerItemMetadataOutputPushDelegate.DidOutputTimedMetadataGroups(AVFoundation.AVPlayerItemMetadataOutput,AVFoundation.AVTimedMetadataGroup[],AVFoundation.AVPlayerItemTrack) -M:AVFoundation.AVPlayerItemMetadataOutputPushDelegate.OutputSequenceWasFlushed(AVFoundation.AVPlayerItemOutput) M:AVFoundation.AVPlayerItemOutputPullDelegate_Extensions.OutputMediaDataWillChange(AVFoundation.IAVPlayerItemOutputPullDelegate,AVFoundation.AVPlayerItemOutput) M:AVFoundation.AVPlayerItemOutputPullDelegate_Extensions.OutputSequenceWasFlushed(AVFoundation.IAVPlayerItemOutputPullDelegate,AVFoundation.AVPlayerItemOutput) -M:AVFoundation.AVPlayerItemOutputPullDelegate.OutputMediaDataWillChange(AVFoundation.AVPlayerItemOutput) -M:AVFoundation.AVPlayerItemOutputPullDelegate.OutputSequenceWasFlushed(AVFoundation.AVPlayerItemOutput) M:AVFoundation.AVPlayerItemOutputPushDelegate_Extensions.OutputSequenceWasFlushed(AVFoundation.IAVPlayerItemOutputPushDelegate,AVFoundation.AVPlayerItemOutput) -M:AVFoundation.AVPlayerItemOutputPushDelegate.OutputSequenceWasFlushed(AVFoundation.AVPlayerItemOutput) M:AVFoundation.AVPlayerItemTimeJumpedEventArgs.#ctor(Foundation.NSNotification) M:AVFoundation.AVPlayerItemVideoOutput.#ctor(AVFoundation.AVPlayerItemVideoOutputSettings) M:AVFoundation.AVPlayerItemVideoOutput.#ctor(CoreVideo.CVPixelBufferAttributes) @@ -28112,20 +26598,12 @@ M:AVFoundation.AVPlayerItemVideoOutputSettings.#ctor(Foundation.NSDictionary) M:AVFoundation.AVPlayerPlaybackCoordinator.Dispose(System.Boolean) M:AVFoundation.AVPlayerPlaybackCoordinatorDelegate_Extensions.GetIdentifier(AVFoundation.IAVPlayerPlaybackCoordinatorDelegate,AVFoundation.AVPlayerPlaybackCoordinator,AVFoundation.AVPlayerItem) M:AVFoundation.AVPlayerPlaybackCoordinatorDelegate_Extensions.GetInterstitialTimeRanges(AVFoundation.IAVPlayerPlaybackCoordinatorDelegate,AVFoundation.AVPlayerPlaybackCoordinator,AVFoundation.AVPlayerItem) -M:AVFoundation.AVPlayerPlaybackCoordinatorDelegate.GetIdentifier(AVFoundation.AVPlayerPlaybackCoordinator,AVFoundation.AVPlayerItem) -M:AVFoundation.AVPlayerPlaybackCoordinatorDelegate.GetInterstitialTimeRanges(AVFoundation.AVPlayerPlaybackCoordinator,AVFoundation.AVPlayerItem) M:AVFoundation.AVPlayerRateDidChangeEventArgs.#ctor(Foundation.NSNotification) -M:AVFoundation.AVSampleBufferAudioRenderer.Enqueue(CoreMedia.CMSampleBuffer) -M:AVFoundation.AVSampleBufferAudioRenderer.Flush M:AVFoundation.AVSampleBufferAudioRenderer.FlushAsync(CoreMedia.CMTime) -M:AVFoundation.AVSampleBufferAudioRenderer.RequestMediaData(CoreFoundation.DispatchQueue,System.Action) -M:AVFoundation.AVSampleBufferAudioRenderer.StopRequestingMediaData M:AVFoundation.AVSampleBufferDisplayLayer_ProtectedContent.GetOutputObscuredDueToInsufficientExternalProtection(AVFoundation.AVSampleBufferDisplayLayer) M:AVFoundation.AVSampleBufferGenerator.NotifyOfDataReadyAsync(CoreMedia.CMSampleBuffer) M:AVFoundation.AVSampleBufferRenderSynchronizer.RemoveAsync(AVFoundation.IAVQueuedSampleBufferRendering,CoreMedia.CMTime) -M:AVFoundation.AVSampleCursor.Copy(Foundation.NSZone) M:AVFoundation.AVSampleRateEventArgs.#ctor(System.Double) -M:AVFoundation.AVSpeechSynthesisVoice.EncodeTo(Foundation.NSCoder) M:AVFoundation.AVSpeechSynthesisVoice.FromIdentifier(System.String) M:AVFoundation.AVSpeechSynthesisVoice.FromLanguage(System.String) M:AVFoundation.AVSpeechSynthesisVoice.GetSpeechVoices @@ -28163,23 +26641,17 @@ M:AVFoundation.AVSpeechSynthesizerUteranceEventArgs.#ctor(AVFoundation.AVSpeechU M:AVFoundation.AVSpeechSynthesizerWillSpeakEventArgs.#ctor(Foundation.NSRange,AVFoundation.AVSpeechUtterance) M:AVFoundation.AVSpeechUtterance.#ctor(Foundation.NSAttributedString) M:AVFoundation.AVSpeechUtterance.#ctor(System.String) -M:AVFoundation.AVSpeechUtterance.Copy(Foundation.NSZone) -M:AVFoundation.AVSpeechUtterance.EncodeTo(Foundation.NSCoder) M:AVFoundation.AVSpeechUtterance.FromString(Foundation.NSAttributedString) M:AVFoundation.AVSpeechUtterance.FromString(System.String) M:AVFoundation.AVStatusEventArgs.#ctor(System.Boolean) M:AVFoundation.AVTextStyleRule.#ctor(CoreMedia.CMTextMarkupAttributes,System.String) M:AVFoundation.AVTextStyleRule.#ctor(CoreMedia.CMTextMarkupAttributes) -M:AVFoundation.AVTextStyleRule.Copy(Foundation.NSZone) M:AVFoundation.AVTextStyleRule.FromTextMarkupAttributes(CoreMedia.CMTextMarkupAttributes,System.String) M:AVFoundation.AVTextStyleRule.FromTextMarkupAttributes(CoreMedia.CMTextMarkupAttributes) -M:AVFoundation.AVTimedMetadataGroup.Copy(Foundation.NSZone) -M:AVFoundation.AVTimedMetadataGroup.MutableCopy(Foundation.NSZone) M:AVFoundation.AVUrlAsset.#ctor(Foundation.NSUrl,AVFoundation.AVUrlAssetOptions) M:AVFoundation.AVUrlAsset.#ctor(Foundation.NSUrl) M:AVFoundation.AVUrlAsset.Create(Foundation.NSUrl,AVFoundation.AVUrlAssetOptions) M:AVFoundation.AVUrlAsset.Create(Foundation.NSUrl) -M:AVFoundation.AVUrlAsset.DidProvideContentKey(AVFoundation.AVContentKeySession,AVFoundation.AVContentKey) M:AVFoundation.AVUrlAsset.FindCompatibleTrackAsync(AVFoundation.AVCompositionTrack) M:AVFoundation.AVUrlAssetOptions.#ctor M:AVFoundation.AVUrlAssetOptions.#ctor(Foundation.NSDictionary) @@ -28194,29 +26666,10 @@ M:AVFoundation.AVVideoCompositing_Extensions.GetCanConformColorOfSourceFrames(AV M:AVFoundation.AVVideoCompositing_Extensions.GetSupportsHdrSourceFrames(AVFoundation.IAVVideoCompositing) M:AVFoundation.AVVideoCompositing_Extensions.GetSupportsWideColorSourceFrames(AVFoundation.IAVVideoCompositing) M:AVFoundation.AVVideoCompositing_Extensions.PrerollForRendering(AVFoundation.IAVVideoCompositing,AVFoundation.AVVideoCompositionRenderHint) -M:AVFoundation.AVVideoCompositing.AnticipateRendering(AVFoundation.AVVideoCompositionRenderHint) -M:AVFoundation.AVVideoCompositing.CancelAllPendingVideoCompositionRequests -M:AVFoundation.AVVideoCompositing.PrerollForRendering(AVFoundation.AVVideoCompositionRenderHint) -M:AVFoundation.AVVideoCompositing.RenderContextChanged(AVFoundation.AVVideoCompositionRenderContext) -M:AVFoundation.AVVideoCompositing.RequiredPixelBufferAttributesForRenderContext -M:AVFoundation.AVVideoCompositing.SourcePixelBufferAttributes -M:AVFoundation.AVVideoCompositing.StartVideoCompositionRequest(AVFoundation.AVAsynchronousVideoCompositionRequest) -M:AVFoundation.AVVideoComposition.Copy(Foundation.NSZone) -M:AVFoundation.AVVideoComposition.MutableCopy(Foundation.NSZone) -M:AVFoundation.AVVideoCompositionInstruction.Copy(Foundation.NSZone) -M:AVFoundation.AVVideoCompositionInstruction.EncodeTo(Foundation.NSCoder) -M:AVFoundation.AVVideoCompositionInstruction.MutableCopy(Foundation.NSZone) -M:AVFoundation.AVVideoCompositionLayerInstruction.Copy(Foundation.NSZone) -M:AVFoundation.AVVideoCompositionLayerInstruction.EncodeTo(Foundation.NSCoder) -M:AVFoundation.AVVideoCompositionLayerInstruction.MutableCopy(Foundation.NSZone) M:AVFoundation.AVVideoCompositionValidationHandling_Extensions.ShouldContinueValidatingAfterFindingEmptyTimeRange(AVFoundation.IAVVideoCompositionValidationHandling,AVFoundation.AVVideoComposition,CoreMedia.CMTimeRange) M:AVFoundation.AVVideoCompositionValidationHandling_Extensions.ShouldContinueValidatingAfterFindingInvalidTimeRangeInInstruction(AVFoundation.IAVVideoCompositionValidationHandling,AVFoundation.AVVideoComposition,AVFoundation.AVVideoCompositionInstruction) M:AVFoundation.AVVideoCompositionValidationHandling_Extensions.ShouldContinueValidatingAfterFindingInvalidTrackIDInInstruction(AVFoundation.IAVVideoCompositionValidationHandling,AVFoundation.AVVideoComposition,AVFoundation.AVVideoCompositionInstruction,AVFoundation.AVVideoCompositionLayerInstruction,AVFoundation.AVAsset) M:AVFoundation.AVVideoCompositionValidationHandling_Extensions.ShouldContinueValidatingAfterFindingInvalidValueForKey(AVFoundation.IAVVideoCompositionValidationHandling,AVFoundation.AVVideoComposition,System.String) -M:AVFoundation.AVVideoCompositionValidationHandling.ShouldContinueValidatingAfterFindingEmptyTimeRange(AVFoundation.AVVideoComposition,CoreMedia.CMTimeRange) -M:AVFoundation.AVVideoCompositionValidationHandling.ShouldContinueValidatingAfterFindingInvalidTimeRangeInInstruction(AVFoundation.AVVideoComposition,AVFoundation.AVVideoCompositionInstruction) -M:AVFoundation.AVVideoCompositionValidationHandling.ShouldContinueValidatingAfterFindingInvalidTrackIDInInstruction(AVFoundation.AVVideoComposition,AVFoundation.AVVideoCompositionInstruction,AVFoundation.AVVideoCompositionLayerInstruction,AVFoundation.AVAsset) -M:AVFoundation.AVVideoCompositionValidationHandling.ShouldContinueValidatingAfterFindingInvalidValueForKey(AVFoundation.AVVideoComposition,System.String) M:AVFoundation.AVVideoPixelAspectRatioSettings.#ctor M:AVFoundation.AVVideoPixelAspectRatioSettings.#ctor(Foundation.NSDictionary) M:AVFoundation.AVVideoSettingsCompressed.#ctor @@ -28332,39 +26785,21 @@ M:AVFoundation.RenderingModeChangeNotificationEventArgs.#ctor(Foundation.NSNotif M:AVFoundation.SpatialPlaybackCapabilitiesChangedEventArgs.#ctor(Foundation.NSNotification) M:AVKit.AVAudioSession_AVPlaybackRouteSelecting.PrepareRouteSelectionForPlayback(AVFoundation.AVAudioSession,System.Action{System.Boolean,AVKit.AVAudioSessionRouteSelection}) M:AVKit.AVAudioSession_AVPlaybackRouteSelecting.PrepareRouteSelectionForPlaybackAsync(AVFoundation.AVAudioSession) -M:AVKit.AVCaptureEventInteraction.#ctor(System.Action{AVKit.AVCaptureEvent},System.Action{AVKit.AVCaptureEvent}) -M:AVKit.AVCaptureEventInteraction.#ctor(System.Action{AVKit.AVCaptureEvent}) M:AVKit.AVCaptureEventInteraction.DidMoveToView(UIKit.UIView) M:AVKit.AVCaptureEventInteraction.Dispose(System.Boolean) M:AVKit.AVCaptureEventInteraction.WillMoveToView(UIKit.UIView) M:AVKit.AVCaptureView.#ctor(CoreGraphics.CGRect) M:AVKit.AVCaptureView.Dispose(System.Boolean) -M:AVKit.AVCaptureView.SetSession(AVFoundation.AVCaptureSession,System.Boolean,System.Boolean) -M:AVKit.AVCaptureViewDelegate.StartRecording(AVKit.AVCaptureView,AVFoundation.AVCaptureFileOutput) M:AVKit.AVContentProposalViewController.#ctor(System.String,Foundation.NSBundle) -M:AVKit.AVContentProposalViewController.DismissContentProposal(AVFoundation.AVContentProposalAction,System.Boolean,System.Action) M:AVKit.AVContentProposalViewController.Dispose(System.Boolean) M:AVKit.AVCustomRoutingControllerDelegate_Extensions.DidSelectItem(AVKit.IAVCustomRoutingControllerDelegate,AVRouting.AVCustomRoutingController,AVRouting.AVCustomRoutingActionItem) M:AVKit.AVCustomRoutingControllerDelegate_Extensions.EventDidTimeOut(AVKit.IAVCustomRoutingControllerDelegate,AVRouting.AVCustomRoutingController,AVRouting.AVCustomRoutingEvent) M:AVKit.AVCustomRoutingControllerDelegate.DidSelectItem(AVRouting.AVCustomRoutingController,AVRouting.AVCustomRoutingActionItem) M:AVKit.AVCustomRoutingControllerDelegate.EventDidTimeOut(AVRouting.AVCustomRoutingController,AVRouting.AVCustomRoutingEvent) M:AVKit.AVCustomRoutingControllerDelegate.HandleEvent(AVRouting.AVCustomRoutingController,AVRouting.AVCustomRoutingEvent,AVKit.AVCustomRoutingControllerDelegateCompletionHandler) -M:AVKit.AVInterstitialTimeRange.#ctor(CoreMedia.CMTimeRange) M:AVKit.AVInterstitialTimeRange.Copy(Foundation.NSZone) M:AVKit.AVInterstitialTimeRange.EncodeTo(Foundation.NSCoder) -M:AVKit.AVNavigationMarkersGroup.#ctor(System.String,AVFoundation.AVDateRangeMetadataGroup[]) -M:AVKit.AVNavigationMarkersGroup.#ctor(System.String,AVFoundation.AVTimedMetadataGroup[]) -M:AVKit.AVPictureInPictureController.#ctor(AVFoundation.AVPlayerLayer) -M:AVKit.AVPictureInPictureController.#ctor(AVKit.AVPictureInPictureControllerContentSource) -M:AVKit.AVPictureInPictureController.CreateStartButton(UIKit.UITraitCollection) -M:AVKit.AVPictureInPictureController.CreateStopButton(UIKit.UITraitCollection) M:AVKit.AVPictureInPictureController.Dispose(System.Boolean) -M:AVKit.AVPictureInPictureController.InvalidatePlaybackState -M:AVKit.AVPictureInPictureController.StartPictureInPicture -M:AVKit.AVPictureInPictureController.StopPictureInPicture -M:AVKit.AVPictureInPictureControllerContentSource.#ctor(AVFoundation.AVPlayerLayer) -M:AVKit.AVPictureInPictureControllerContentSource.#ctor(AVFoundation.AVSampleBufferDisplayLayer,AVKit.IAVPictureInPictureSampleBufferPlaybackDelegate) -M:AVKit.AVPictureInPictureControllerContentSource.#ctor(UIKit.UIView,AVKit.AVPictureInPictureVideoCallViewController) M:AVKit.AVPictureInPictureControllerContentSource.Dispose(System.Boolean) M:AVKit.AVPictureInPictureControllerDelegate_Extensions.DidStartPictureInPicture(AVKit.IAVPictureInPictureControllerDelegate,AVKit.AVPictureInPictureController) M:AVKit.AVPictureInPictureControllerDelegate_Extensions.DidStopPictureInPicture(AVKit.IAVPictureInPictureControllerDelegate,AVKit.AVPictureInPictureController) @@ -28372,30 +26807,12 @@ M:AVKit.AVPictureInPictureControllerDelegate_Extensions.FailedToStartPictureInPi M:AVKit.AVPictureInPictureControllerDelegate_Extensions.RestoreUserInterfaceForPictureInPicture(AVKit.IAVPictureInPictureControllerDelegate,AVKit.AVPictureInPictureController,System.Action{System.Boolean}) M:AVKit.AVPictureInPictureControllerDelegate_Extensions.WillStartPictureInPicture(AVKit.IAVPictureInPictureControllerDelegate,AVKit.AVPictureInPictureController) M:AVKit.AVPictureInPictureControllerDelegate_Extensions.WillStopPictureInPicture(AVKit.IAVPictureInPictureControllerDelegate,AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureControllerDelegate.DidStartPictureInPicture(AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureControllerDelegate.DidStopPictureInPicture(AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureControllerDelegate.FailedToStartPictureInPicture(AVKit.AVPictureInPictureController,Foundation.NSError) -M:AVKit.AVPictureInPictureControllerDelegate.RestoreUserInterfaceForPictureInPicture(AVKit.AVPictureInPictureController,System.Action{System.Boolean}) -M:AVKit.AVPictureInPictureControllerDelegate.WillStartPictureInPicture(AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureControllerDelegate.WillStopPictureInPicture(AVKit.AVPictureInPictureController) M:AVKit.AVPictureInPictureSampleBufferPlaybackDelegate_Extensions.ShouldProhibitBackgroundAudioPlayback(AVKit.IAVPictureInPictureSampleBufferPlaybackDelegate,AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureSampleBufferPlaybackDelegate.DidTransitionToRenderSize(AVKit.AVPictureInPictureController,CoreMedia.CMVideoDimensions) -M:AVKit.AVPictureInPictureSampleBufferPlaybackDelegate.GetTimeRange(AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureSampleBufferPlaybackDelegate.IsPlaybackPaused(AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureSampleBufferPlaybackDelegate.SetPlaying(AVKit.AVPictureInPictureController,System.Boolean) -M:AVKit.AVPictureInPictureSampleBufferPlaybackDelegate.ShouldProhibitBackgroundAudioPlayback(AVKit.AVPictureInPictureController) -M:AVKit.AVPictureInPictureSampleBufferPlaybackDelegate.SkipByInterval(AVKit.AVPictureInPictureController,CoreMedia.CMTime,System.Action) M:AVKit.AVPictureInPictureVideoCallViewController.#ctor(System.String,Foundation.NSBundle) -M:AVKit.AVPlaybackSpeed.#ctor(System.Single,System.String) M:AVKit.AVPlayerView.#ctor(CoreGraphics.CGRect) -M:AVKit.AVPlayerView.BeginTrimming(System.Action{AVKit.AVPlayerViewTrimResult}) M:AVKit.AVPlayerView.Dispose(System.Boolean) -M:AVKit.AVPlayerView.FlashChapter(System.UIntPtr,System.String) -M:AVKit.AVPlayerView.SelectSpeed(AVKit.AVPlaybackSpeed) -M:AVKit.AVPlayerView.SetMagnification(System.Runtime.InteropServices.NFloat,CoreGraphics.CGPoint) M:AVKit.AVPlayerViewController.#ctor(System.String,Foundation.NSBundle) M:AVKit.AVPlayerViewController.Dispose(System.Boolean) -M:AVKit.AVPlayerViewController.SelectSpeed(AVKit.AVPlaybackSpeed) M:AVKit.AVPlayerViewControllerDelegate_Extensions.DidAcceptContentProposal(AVKit.IAVPlayerViewControllerDelegate,AVKit.AVPlayerViewController,AVFoundation.AVContentProposal) M:AVKit.AVPlayerViewControllerDelegate_Extensions.DidEndDismissalTransition(AVKit.IAVPlayerViewControllerDelegate,AVKit.AVPlayerViewController) M:AVKit.AVPlayerViewControllerDelegate_Extensions.DidPresentInterstitialTimeRange(AVKit.IAVPlayerViewControllerDelegate,AVKit.AVPlayerViewController,AVKit.AVInterstitialTimeRange) @@ -28425,45 +26842,11 @@ M:AVKit.AVPlayerViewControllerDelegate_Extensions.WillResumePlaybackAfterUserNav M:AVKit.AVPlayerViewControllerDelegate_Extensions.WillStartPictureInPicture(AVKit.IAVPlayerViewControllerDelegate,AVKit.AVPlayerViewController) M:AVKit.AVPlayerViewControllerDelegate_Extensions.WillStopPictureInPicture(AVKit.IAVPlayerViewControllerDelegate,AVKit.AVPlayerViewController) M:AVKit.AVPlayerViewControllerDelegate_Extensions.WillTransitionToVisibilityOfTransportBar(AVKit.IAVPlayerViewControllerDelegate,AVKit.AVPlayerViewController,System.Boolean,AVKit.IAVPlayerViewControllerAnimationCoordinator) -M:AVKit.AVPlayerViewControllerDelegate.DidAcceptContentProposal(AVKit.AVPlayerViewController,AVFoundation.AVContentProposal) -M:AVKit.AVPlayerViewControllerDelegate.DidEndDismissalTransition(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.DidPresentInterstitialTimeRange(AVKit.AVPlayerViewController,AVKit.AVInterstitialTimeRange) -M:AVKit.AVPlayerViewControllerDelegate.DidRejectContentProposal(AVKit.AVPlayerViewController,AVFoundation.AVContentProposal) -M:AVKit.AVPlayerViewControllerDelegate.DidSelectExternalSubtitleOptionLanguage(AVKit.AVPlayerViewController,System.String) -M:AVKit.AVPlayerViewControllerDelegate.DidSelectMediaSelectionOption(AVKit.AVPlayerViewController,AVFoundation.AVMediaSelectionOption,AVFoundation.AVMediaSelectionGroup) -M:AVKit.AVPlayerViewControllerDelegate.DidStartPictureInPicture(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.DidStopPictureInPicture(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.FailedToStartPictureInPicture(AVKit.AVPlayerViewController,Foundation.NSError) -M:AVKit.AVPlayerViewControllerDelegate.GetNextChannelInterstitialViewController(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.GetPreviousChannelInterstitialViewController(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.GetTimeToSeekAfterUserNavigated(AVKit.AVPlayerViewController,CoreMedia.CMTime,CoreMedia.CMTime) -M:AVKit.AVPlayerViewControllerDelegate.RestoreUserInterfaceForFullScreenExit(AVKit.AVPlayerViewController,System.Action{System.Boolean}) -M:AVKit.AVPlayerViewControllerDelegate.RestoreUserInterfaceForPictureInPicture(AVKit.AVPlayerViewController,System.Action{System.Boolean}) -M:AVKit.AVPlayerViewControllerDelegate.ShouldAutomaticallyDismissAtPictureInPictureStart(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.ShouldDismiss(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.ShouldPresentContentProposal(AVKit.AVPlayerViewController,AVFoundation.AVContentProposal) -M:AVKit.AVPlayerViewControllerDelegate.SkipToNextChannel(AVKit.AVPlayerViewController,System.Action{System.Boolean}) -M:AVKit.AVPlayerViewControllerDelegate.SkipToNextItem(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.SkipToPreviousChannel(AVKit.AVPlayerViewController,System.Action{System.Boolean}) -M:AVKit.AVPlayerViewControllerDelegate.SkipToPreviousItem(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.WillBeginDismissalTransition(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.WillBeginFullScreenPresentation(AVKit.AVPlayerViewController,UIKit.IUIViewControllerTransitionCoordinator) -M:AVKit.AVPlayerViewControllerDelegate.WillEndFullScreenPresentation(AVKit.AVPlayerViewController,UIKit.IUIViewControllerTransitionCoordinator) -M:AVKit.AVPlayerViewControllerDelegate.WillPresentInterstitialTimeRange(AVKit.AVPlayerViewController,AVKit.AVInterstitialTimeRange) -M:AVKit.AVPlayerViewControllerDelegate.WillResumePlaybackAfterUserNavigatedFromTime(AVKit.AVPlayerViewController,CoreMedia.CMTime,CoreMedia.CMTime) -M:AVKit.AVPlayerViewControllerDelegate.WillStartPictureInPicture(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.WillStopPictureInPicture(AVKit.AVPlayerViewController) -M:AVKit.AVPlayerViewControllerDelegate.WillTransitionToVisibilityOfTransportBar(AVKit.AVPlayerViewController,System.Boolean,AVKit.IAVPlayerViewControllerAnimationCoordinator) M:AVKit.AVPlayerViewDelegate_Extensions.DidEnterFullScreen(AVKit.IAVPlayerViewDelegate,AVKit.AVPlayerView) M:AVKit.AVPlayerViewDelegate_Extensions.DidExitFullScreen(AVKit.IAVPlayerViewDelegate,AVKit.AVPlayerView) M:AVKit.AVPlayerViewDelegate_Extensions.RestoreUserInterfaceForFullScreenExit(AVKit.IAVPlayerViewDelegate,AVKit.AVPlayerView,System.Action{System.Boolean}) M:AVKit.AVPlayerViewDelegate_Extensions.WillEnterFullScreen(AVKit.IAVPlayerViewDelegate,AVKit.AVPlayerView) M:AVKit.AVPlayerViewDelegate_Extensions.WillExitFullScreen(AVKit.IAVPlayerViewDelegate,AVKit.AVPlayerView) -M:AVKit.AVPlayerViewDelegate.DidEnterFullScreen(AVKit.AVPlayerView) -M:AVKit.AVPlayerViewDelegate.DidExitFullScreen(AVKit.AVPlayerView) -M:AVKit.AVPlayerViewDelegate.RestoreUserInterfaceForFullScreenExit(AVKit.AVPlayerView,System.Action{System.Boolean}) -M:AVKit.AVPlayerViewDelegate.WillEnterFullScreen(AVKit.AVPlayerView) -M:AVKit.AVPlayerViewDelegate.WillExitFullScreen(AVKit.AVPlayerView) M:AVKit.AVPlayerViewPictureInPictureDelegate_Extensions.DidStart(AVKit.IAVPlayerViewPictureInPictureDelegate,AVKit.AVPlayerView) M:AVKit.AVPlayerViewPictureInPictureDelegate_Extensions.DidStop(AVKit.IAVPlayerViewPictureInPictureDelegate,AVKit.AVPlayerView) M:AVKit.AVPlayerViewPictureInPictureDelegate_Extensions.FailedToStart(AVKit.IAVPlayerViewPictureInPictureDelegate,AVKit.AVPlayerView,Foundation.NSError) @@ -28471,22 +26854,11 @@ M:AVKit.AVPlayerViewPictureInPictureDelegate_Extensions.RestoreUserInterface(AVK M:AVKit.AVPlayerViewPictureInPictureDelegate_Extensions.ShouldAutomaticallyDismiss(AVKit.IAVPlayerViewPictureInPictureDelegate,AVKit.AVPlayerView) M:AVKit.AVPlayerViewPictureInPictureDelegate_Extensions.WillStart(AVKit.IAVPlayerViewPictureInPictureDelegate,AVKit.AVPlayerView) M:AVKit.AVPlayerViewPictureInPictureDelegate_Extensions.WillStop(AVKit.IAVPlayerViewPictureInPictureDelegate,AVKit.AVPlayerView) -M:AVKit.AVPlayerViewPictureInPictureDelegate.DidStart(AVKit.AVPlayerView) -M:AVKit.AVPlayerViewPictureInPictureDelegate.DidStop(AVKit.AVPlayerView) -M:AVKit.AVPlayerViewPictureInPictureDelegate.FailedToStart(AVKit.AVPlayerView,Foundation.NSError) -M:AVKit.AVPlayerViewPictureInPictureDelegate.RestoreUserInterface(AVKit.AVPlayerView,System.Action{System.Boolean}) -M:AVKit.AVPlayerViewPictureInPictureDelegate.ShouldAutomaticallyDismiss(AVKit.AVPlayerView) -M:AVKit.AVPlayerViewPictureInPictureDelegate.WillStart(AVKit.AVPlayerView) -M:AVKit.AVPlayerViewPictureInPictureDelegate.WillStop(AVKit.AVPlayerView) M:AVKit.AVRoutePickerView.#ctor(CoreGraphics.CGRect) M:AVKit.AVRoutePickerView.AVRoutePickerViewAppearance.#ctor(System.IntPtr) M:AVKit.AVRoutePickerView.Dispose(System.Boolean) -M:AVKit.AVRoutePickerView.GetRoutePickerButtonColor(AVKit.AVRoutePickerViewButtonState) -M:AVKit.AVRoutePickerView.SetRoutePickerButtonColor(AppKit.NSColor,AVKit.AVRoutePickerViewButtonState) M:AVKit.AVRoutePickerViewDelegate_Extensions.DidEndPresentingRoutes(AVKit.IAVRoutePickerViewDelegate,AVKit.AVRoutePickerView) M:AVKit.AVRoutePickerViewDelegate_Extensions.WillBeginPresentingRoutes(AVKit.IAVRoutePickerViewDelegate,AVKit.AVRoutePickerView) -M:AVKit.AVRoutePickerViewDelegate.DidEndPresentingRoutes(AVKit.AVRoutePickerView) -M:AVKit.AVRoutePickerViewDelegate.WillBeginPresentingRoutes(AVKit.AVRoutePickerView) M:AVKit.IAVCaptureViewDelegate.StartRecording(AVKit.AVCaptureView,AVFoundation.AVCaptureFileOutput) M:AVKit.IAVCustomRoutingControllerDelegate.DidSelectItem(AVRouting.AVCustomRoutingController,AVRouting.AVCustomRoutingActionItem) M:AVKit.IAVCustomRoutingControllerDelegate.EventDidTimeOut(AVRouting.AVCustomRoutingController,AVRouting.AVCustomRoutingEvent) @@ -28550,10 +26922,6 @@ M:AVKit.IAVRoutePickerViewDelegate.WillBeginPresentingRoutes(AVKit.AVRoutePicker M:AVKit.PreparingRouteSelectionForPlayback.#ctor(System.Boolean,AVKit.AVAudioSessionRouteSelection) M:AVKit.UIWindow_AVAdditions.GetAVDisplayManager(UIKit.UIWindow) M:AVRouting.AVCustomRoutingController.Dispose(System.Boolean) -M:AVRouting.AVCustomRoutingController.InvalidateAuthorization(AVRouting.AVCustomDeviceRoute) -M:AVRouting.AVCustomRoutingController.IsRouteActive(AVRouting.AVCustomDeviceRoute) -M:AVRouting.AVCustomRoutingController.SetActive(System.Boolean,AVRouting.AVCustomDeviceRoute) -M:AVRouting.AVCustomRoutingPartialIP.#ctor(Foundation.NSData,Foundation.NSData) M:BackgroundAssets.BAAppExtensionInfo.EncodeTo(Foundation.NSCoder) M:BackgroundAssets.BADownload.Copy(Foundation.NSZone) M:BackgroundAssets.BADownload.CopyAsNonEssential @@ -28609,91 +26977,18 @@ M:BackgroundTasks.BGTaskScheduler.GetPending(System.Action{BackgroundTasks.BGTas M:BackgroundTasks.BGTaskScheduler.GetPendingAsync M:BackgroundTasks.BGTaskScheduler.Register(System.String,CoreFoundation.DispatchQueue,System.Action{BackgroundTasks.BGTask}) M:BackgroundTasks.BGTaskScheduler.Submit(BackgroundTasks.BGTaskRequest,Foundation.NSError@) -M:BrowserEngineKit.BEContextMenuConfiguration.#ctor -M:BrowserEngineKit.BEContextMenuConfiguration.Fulfill(UIKit.UIContextMenuConfiguration) -M:BrowserEngineKit.BEDragInteraction.#ctor(BrowserEngineKit.IBEDragInteractionDelegate) M:BrowserEngineKit.BEDragInteraction.Dispose(System.Boolean) -M:BrowserEngineKit.BEDragInteractionDelegate.GetDragItems(BrowserEngineKit.BEDragInteraction,UIKit.IUIDragSession,CoreGraphics.CGPoint,BrowserEngineKit.BEDragInteractionDelegateGetDragItemsCallback) -M:BrowserEngineKit.BEDragInteractionDelegate.PrepareDragSession(BrowserEngineKit.BEDragInteraction,UIKit.IUIDragSession,System.Func{System.Boolean}) -M:BrowserEngineKit.BEKeyEntryContext.#ctor(BrowserEngineKit.BEKeyEntry) -M:BrowserEngineKit.BELayerHierarchy.Create(Foundation.NSError@) -M:BrowserEngineKit.BELayerHierarchy.Invalidate -M:BrowserEngineKit.BELayerHierarchyHandle.Create(Foundation.NSObject,Foundation.NSError@) -M:BrowserEngineKit.BELayerHierarchyHandle.CreateXpcRepresentation M:BrowserEngineKit.BELayerHierarchyHandle.EncodeTo(Foundation.NSCoder) -M:BrowserEngineKit.BELayerHierarchyHostingTransactionCoordinator.Add(BrowserEngineKit.BELayerHierarchy) -M:BrowserEngineKit.BELayerHierarchyHostingTransactionCoordinator.Add(BrowserEngineKit.BELayerHierarchyHostingView) -M:BrowserEngineKit.BELayerHierarchyHostingTransactionCoordinator.Commit -M:BrowserEngineKit.BELayerHierarchyHostingTransactionCoordinator.Create(Foundation.NSError@) -M:BrowserEngineKit.BELayerHierarchyHostingTransactionCoordinator.Create(Foundation.NSObject,Foundation.NSError@) -M:BrowserEngineKit.BELayerHierarchyHostingTransactionCoordinator.CreateXpcRepresentation M:BrowserEngineKit.BELayerHierarchyHostingTransactionCoordinator.EncodeTo(Foundation.NSCoder) M:BrowserEngineKit.BELayerHierarchyHostingView.BELayerHierarchyHostingViewAppearance.#ctor(System.IntPtr) -M:BrowserEngineKit.BEMediaEnvironment.#ctor(Foundation.NSObject,Foundation.NSError@) -M:BrowserEngineKit.BEMediaEnvironment.#ctor(Foundation.NSUrl) -M:BrowserEngineKit.BEMediaEnvironment.Activate(Foundation.NSError@) -M:BrowserEngineKit.BEMediaEnvironment.CreateXpcRepresentation -M:BrowserEngineKit.BEMediaEnvironment.MakeCaptureSession(Foundation.NSError@) -M:BrowserEngineKit.BEMediaEnvironment.Suspend(Foundation.NSError@) -M:BrowserEngineKit.BENetworkingProcess.Create(System.Action,BrowserEngineKit.BENetworkingProcessCreateCallback) M:BrowserEngineKit.BENetworkingProcess.CreateAsync(System.Action) -M:BrowserEngineKit.BENetworkingProcess.GrantCapability(BrowserEngineKit.BEProcessCapability,Foundation.NSError@,System.Action) -M:BrowserEngineKit.BENetworkingProcess.GrantCapability(BrowserEngineKit.BEProcessCapability,Foundation.NSError@) -M:BrowserEngineKit.BENetworkingProcess.Invalidate -M:BrowserEngineKit.BENetworkingProcess.MakeLibXpcConnection(Foundation.NSError@) -M:BrowserEngineKit.BEProcessCapability.CreateBackground -M:BrowserEngineKit.BEProcessCapability.CreateForeground -M:BrowserEngineKit.BEProcessCapability.CreateMediaPlaybackAndCaptureProcess(BrowserEngineKit.BEMediaEnvironment) -M:BrowserEngineKit.BEProcessCapability.CreateSuspended -M:BrowserEngineKit.BEProcessCapability.Request(Foundation.NSError@) -M:BrowserEngineKit.BERenderingProcess.Create(System.Action,BrowserEngineKit.BERenderingProcessCreateCallback) M:BrowserEngineKit.BERenderingProcess.CreateAsync(System.Action) -M:BrowserEngineKit.BERenderingProcess.CreateVisibilityPropagationInteraction -M:BrowserEngineKit.BERenderingProcess.GrantCapability(BrowserEngineKit.BEProcessCapability,Foundation.NSError@,System.Action) -M:BrowserEngineKit.BERenderingProcess.GrantCapability(BrowserEngineKit.BEProcessCapability,Foundation.NSError@) -M:BrowserEngineKit.BERenderingProcess.Invalidate -M:BrowserEngineKit.BERenderingProcess.MakeLibXpcConnection(Foundation.NSError@) M:BrowserEngineKit.BEScrollView.BEScrollViewAppearance.#ctor(System.IntPtr) M:BrowserEngineKit.BEScrollView.Dispose(System.Boolean) -M:BrowserEngineKit.BEScrollViewDelegate.GetParentScrollView(BrowserEngineKit.BEScrollView) -M:BrowserEngineKit.BEScrollViewDelegate.HandleScrollUpdate(BrowserEngineKit.BEScrollView,BrowserEngineKit.BEScrollViewScrollUpdate,System.Action{System.Boolean}) -M:BrowserEngineKit.BEScrollViewScrollUpdate.GetLocation(UIKit.UIView) -M:BrowserEngineKit.BEScrollViewScrollUpdate.GetTranslation(UIKit.UIView) -M:BrowserEngineKit.BETextDocumentContext.#ctor(Foundation.NSAttributedString,Foundation.NSAttributedString,Foundation.NSAttributedString,Foundation.NSAttributedString,Foundation.NSRange) -M:BrowserEngineKit.BETextDocumentContext.#ctor(System.String,System.String,System.String,System.String,Foundation.NSRange) -M:BrowserEngineKit.BETextDocumentContext.AddTextRect(CoreGraphics.CGRect,Foundation.NSRange) -M:BrowserEngineKit.BETextInputDelegate.DeferReplaceTextActionToSystem(BrowserEngineKit.IBETextInput,Foundation.NSObject) -M:BrowserEngineKit.BETextInputDelegate.InvalidateTextEntryContext(BrowserEngineKit.IBETextInput) -M:BrowserEngineKit.BETextInputDelegate.SelectionDidChange(BrowserEngineKit.IBETextInput) -M:BrowserEngineKit.BETextInputDelegate.SelectionWillChange(BrowserEngineKit.IBETextInput) -M:BrowserEngineKit.BETextInputDelegate.SetCandidateSuggestions(BrowserEngineKit.IBETextInput,BrowserEngineKit.BETextSuggestion[]) -M:BrowserEngineKit.BETextInputDelegate.ShouldDeferEventHandlingToSystem(BrowserEngineKit.IBETextInput,BrowserEngineKit.BEKeyEntryContext) -M:BrowserEngineKit.BETextInteraction.AddShortcut(System.String,CoreGraphics.CGRect) M:BrowserEngineKit.BETextInteraction.DidMoveToView(UIKit.UIView) -M:BrowserEngineKit.BETextInteraction.DismissEditMenuForSelection M:BrowserEngineKit.BETextInteraction.Dispose(System.Boolean) -M:BrowserEngineKit.BETextInteraction.EditabilityChanged -M:BrowserEngineKit.BETextInteraction.PresentEditMenuForSelection -M:BrowserEngineKit.BETextInteraction.RefreshKeyboardUI -M:BrowserEngineKit.BETextInteraction.SelectionBoundaryAdjusted(CoreGraphics.CGPoint,BrowserEngineKit.BESelectionTouchPhase,BrowserEngineKit.BESelectionFlags) -M:BrowserEngineKit.BETextInteraction.SelectionChangedWithGesture(CoreGraphics.CGPoint,BrowserEngineKit.BEGestureType,UIKit.UIGestureRecognizerState,BrowserEngineKit.BESelectionFlags) -M:BrowserEngineKit.BETextInteraction.Share(System.String,CoreGraphics.CGRect) -M:BrowserEngineKit.BETextInteraction.ShowDictionary(System.String,Foundation.NSRange,CoreGraphics.CGRect) -M:BrowserEngineKit.BETextInteraction.ShowReplacements(System.String) -M:BrowserEngineKit.BETextInteraction.Translate(System.String,CoreGraphics.CGRect) -M:BrowserEngineKit.BETextInteraction.TransliterateChinese(System.String) M:BrowserEngineKit.BETextInteraction.WillMoveToView(UIKit.UIView) -M:BrowserEngineKit.BETextInteractionDelegate.SystemDidChangeSelection(BrowserEngineKit.BETextInteraction) -M:BrowserEngineKit.BETextInteractionDelegate.SystemWillChangeSelection(BrowserEngineKit.BETextInteraction) -M:BrowserEngineKit.BETextSuggestion.#ctor(System.String) -M:BrowserEngineKit.BEWebAppManifest.#ctor(Foundation.NSData,Foundation.NSUrl) -M:BrowserEngineKit.BEWebContentProcess.Create(System.Action,BrowserEngineKit.BEWebContentProcessCreateCallback) M:BrowserEngineKit.BEWebContentProcess.CreateAsync(System.Action) -M:BrowserEngineKit.BEWebContentProcess.CreateVisibilityPropagationInteraction -M:BrowserEngineKit.BEWebContentProcess.GrantCapability(BrowserEngineKit.BEProcessCapability,Foundation.NSError@,System.Action) -M:BrowserEngineKit.BEWebContentProcess.GrantCapability(BrowserEngineKit.BEProcessCapability,Foundation.NSError@) -M:BrowserEngineKit.BEWebContentProcess.Invalidate -M:BrowserEngineKit.BEWebContentProcess.MakeLibXpcConnection(Foundation.NSError@) M:BrowserEngineKit.IBEDragInteractionDelegate.GetDragItems(BrowserEngineKit.BEDragInteraction,UIKit.IUIDragSession,CoreGraphics.CGPoint,BrowserEngineKit.BEDragInteractionDelegateGetDragItemsCallback) M:BrowserEngineKit.IBEDragInteractionDelegate.PrepareDragSession(BrowserEngineKit.BEDragInteraction,UIKit.IUIDragSession,System.Func{System.Boolean}) M:BrowserEngineKit.IBEProcessCapabilityGrant.Invalidate @@ -28791,64 +27086,22 @@ M:BrowserEngineKit.NSObject_BEAccessibility.SetBrowserAccessibilitySortDirection M:BusinessChat.BCChatAction.OpenTranscript(System.String,System.Collections.Generic.Dictionary{BusinessChat.BCParameterName,System.String}) M:BusinessChat.BCChatButton.#ctor(BusinessChat.BCChatButtonStyle) M:BusinessChat.BCChatButton.BCChatButtonAppearance.#ctor(System.IntPtr) -M:CallKit.CXAction.#ctor M:CallKit.CXAction.Copy(Foundation.NSZone) M:CallKit.CXAction.EncodeTo(Foundation.NSCoder) -M:CallKit.CXAction.Fail -M:CallKit.CXAction.Fulfill -M:CallKit.CXAnswerCallAction.#ctor(Foundation.NSUuid) -M:CallKit.CXAnswerCallAction.Fulfill(Foundation.NSDate) -M:CallKit.CXCall.IsEqual(CallKit.CXCall) -M:CallKit.CXCallAction.#ctor(Foundation.NSUuid) -M:CallKit.CXCallController.#ctor(CoreFoundation.DispatchQueue) -M:CallKit.CXCallController.RequestTransaction(CallKit.CXAction,System.Action{Foundation.NSError}) -M:CallKit.CXCallController.RequestTransaction(CallKit.CXAction[],System.Action{Foundation.NSError}) -M:CallKit.CXCallController.RequestTransaction(CallKit.CXTransaction,System.Action{Foundation.NSError}) M:CallKit.CXCallController.RequestTransactionAsync(CallKit.CXAction) M:CallKit.CXCallController.RequestTransactionAsync(CallKit.CXAction[]) M:CallKit.CXCallController.RequestTransactionAsync(CallKit.CXTransaction) -M:CallKit.CXCallDirectoryExtensionContext.AddBlockingEntry(System.Int64) -M:CallKit.CXCallDirectoryExtensionContext.AddIdentificationEntry(System.Int64,System.String) -M:CallKit.CXCallDirectoryExtensionContext.CompleteRequest(System.Action{System.Boolean}) M:CallKit.CXCallDirectoryExtensionContext.CompleteRequestAsync M:CallKit.CXCallDirectoryExtensionContext.Dispose(System.Boolean) -M:CallKit.CXCallDirectoryExtensionContext.RemoveAllBlockingEntries -M:CallKit.CXCallDirectoryExtensionContext.RemoveAllIdentificationEntries -M:CallKit.CXCallDirectoryExtensionContext.RemoveBlockingEntry(System.Int64) -M:CallKit.CXCallDirectoryExtensionContext.RemoveIdentificationEntry(System.Int64) -M:CallKit.CXCallDirectoryExtensionContextDelegate.RequestFailed(CallKit.CXCallDirectoryExtensionContext,Foundation.NSError) -M:CallKit.CXCallDirectoryManager.GetEnabledStatusForExtension(System.String,System.Action{CallKit.CXCallDirectoryEnabledStatus,Foundation.NSError}) M:CallKit.CXCallDirectoryManager.GetEnabledStatusForExtensionAsync(System.String) -M:CallKit.CXCallDirectoryManager.OpenSettings(System.Action{Foundation.NSError}) M:CallKit.CXCallDirectoryManager.OpenSettingsAsync -M:CallKit.CXCallDirectoryManager.ReloadExtension(System.String,System.Action{Foundation.NSError}) M:CallKit.CXCallDirectoryManager.ReloadExtensionAsync(System.String) -M:CallKit.CXCallDirectoryProvider.BeginRequestWithExtensionContext(Foundation.NSExtensionContext) -M:CallKit.CXCallObserver.SetDelegate(CallKit.ICXCallObserverDelegate,CoreFoundation.DispatchQueue) -M:CallKit.CXCallObserverDelegate.CallChanged(CallKit.CXCallObserver,CallKit.CXCall) M:CallKit.CXCallUpdate.Copy(Foundation.NSZone) -M:CallKit.CXEndCallAction.#ctor(Foundation.NSUuid) -M:CallKit.CXEndCallAction.Fulfill(Foundation.NSDate) -M:CallKit.CXHandle.#ctor(CallKit.CXHandleType,System.String) M:CallKit.CXHandle.Copy(Foundation.NSZone) M:CallKit.CXHandle.EncodeTo(Foundation.NSCoder) -M:CallKit.CXHandle.IsEqual(CallKit.CXHandle) -M:CallKit.CXPlayDtmfCallAction.#ctor(Foundation.NSUuid,System.String,CallKit.CXPlayDtmfCallActionType) -M:CallKit.CXProvider.#ctor(CallKit.CXProviderConfiguration) -M:CallKit.CXProvider.GetPendingCallActions(ObjCRuntime.Class,Foundation.NSUuid) M:CallKit.CXProvider.GetPendingCallActions``1(Foundation.NSUuid) -M:CallKit.CXProvider.Invalidate -M:CallKit.CXProvider.ReportCall(Foundation.NSUuid,CallKit.CXCallUpdate) -M:CallKit.CXProvider.ReportCall(Foundation.NSUuid,Foundation.NSDate,CallKit.CXCallEndedReason) -M:CallKit.CXProvider.ReportConnectedOutgoingCall(Foundation.NSUuid,Foundation.NSDate) -M:CallKit.CXProvider.ReportConnectingOutgoingCall(Foundation.NSUuid,Foundation.NSDate) -M:CallKit.CXProvider.ReportNewIncomingCall(Foundation.NSUuid,CallKit.CXCallUpdate,System.Action{Foundation.NSError}) M:CallKit.CXProvider.ReportNewIncomingCallAsync(Foundation.NSUuid,CallKit.CXCallUpdate) -M:CallKit.CXProvider.ReportNewIncomingVoIPPushPayload(Foundation.NSDictionary,System.Action{Foundation.NSError}) M:CallKit.CXProvider.ReportNewIncomingVoIPPushPayloadAsync(Foundation.NSDictionary) -M:CallKit.CXProvider.SetDelegate(CallKit.ICXProviderDelegate,CoreFoundation.DispatchQueue) -M:CallKit.CXProviderConfiguration.#ctor -M:CallKit.CXProviderConfiguration.#ctor(System.String) M:CallKit.CXProviderConfiguration.Copy(Foundation.NSZone) M:CallKit.CXProviderDelegate_Extensions.DidActivateAudioSession(CallKit.ICXProviderDelegate,CallKit.CXProvider,AVFoundation.AVAudioSession) M:CallKit.CXProviderDelegate_Extensions.DidBegin(CallKit.ICXProviderDelegate,CallKit.CXProvider) @@ -28862,28 +27115,6 @@ M:CallKit.CXProviderDelegate_Extensions.PerformSetHeldCallAction(CallKit.ICXProv M:CallKit.CXProviderDelegate_Extensions.PerformSetMutedCallAction(CallKit.ICXProviderDelegate,CallKit.CXProvider,CallKit.CXSetMutedCallAction) M:CallKit.CXProviderDelegate_Extensions.PerformStartCallAction(CallKit.ICXProviderDelegate,CallKit.CXProvider,CallKit.CXStartCallAction) M:CallKit.CXProviderDelegate_Extensions.TimedOutPerformingAction(CallKit.ICXProviderDelegate,CallKit.CXProvider,CallKit.CXAction) -M:CallKit.CXProviderDelegate.DidActivateAudioSession(CallKit.CXProvider,AVFoundation.AVAudioSession) -M:CallKit.CXProviderDelegate.DidBegin(CallKit.CXProvider) -M:CallKit.CXProviderDelegate.DidDeactivateAudioSession(CallKit.CXProvider,AVFoundation.AVAudioSession) -M:CallKit.CXProviderDelegate.DidReset(CallKit.CXProvider) -M:CallKit.CXProviderDelegate.ExecuteTransaction(CallKit.CXProvider,CallKit.CXTransaction) -M:CallKit.CXProviderDelegate.PerformAnswerCallAction(CallKit.CXProvider,CallKit.CXAnswerCallAction) -M:CallKit.CXProviderDelegate.PerformEndCallAction(CallKit.CXProvider,CallKit.CXEndCallAction) -M:CallKit.CXProviderDelegate.PerformPlayDtmfCallAction(CallKit.CXProvider,CallKit.CXPlayDtmfCallAction) -M:CallKit.CXProviderDelegate.PerformSetGroupCallAction(CallKit.CXProvider,CallKit.CXSetGroupCallAction) -M:CallKit.CXProviderDelegate.PerformSetHeldCallAction(CallKit.CXProvider,CallKit.CXSetHeldCallAction) -M:CallKit.CXProviderDelegate.PerformSetMutedCallAction(CallKit.CXProvider,CallKit.CXSetMutedCallAction) -M:CallKit.CXProviderDelegate.PerformStartCallAction(CallKit.CXProvider,CallKit.CXStartCallAction) -M:CallKit.CXProviderDelegate.TimedOutPerformingAction(CallKit.CXProvider,CallKit.CXAction) -M:CallKit.CXSetGroupCallAction.#ctor(Foundation.NSUuid,Foundation.NSUuid) -M:CallKit.CXSetHeldCallAction.#ctor(Foundation.NSUuid,System.Boolean) -M:CallKit.CXSetMutedCallAction.#ctor(Foundation.NSUuid,System.Boolean) -M:CallKit.CXSetMutedCallAction.#ctor(Foundation.NSUuid) -M:CallKit.CXStartCallAction.#ctor(Foundation.NSUuid,CallKit.CXHandle) -M:CallKit.CXStartCallAction.Fulfill(Foundation.NSDate) -M:CallKit.CXTransaction.#ctor(CallKit.CXAction) -M:CallKit.CXTransaction.#ctor(CallKit.CXAction[]) -M:CallKit.CXTransaction.AddAction(CallKit.CXAction) M:CallKit.CXTransaction.Copy(Foundation.NSZone) M:CallKit.CXTransaction.EncodeTo(Foundation.NSCoder) M:CallKit.ICXCallDirectoryExtensionContextDelegate.RequestFailed(CallKit.CXCallDirectoryExtensionContext,Foundation.NSError) @@ -28901,11 +27132,7 @@ M:CallKit.ICXProviderDelegate.PerformSetHeldCallAction(CallKit.CXProvider,CallKi M:CallKit.ICXProviderDelegate.PerformSetMutedCallAction(CallKit.CXProvider,CallKit.CXSetMutedCallAction) M:CallKit.ICXProviderDelegate.PerformStartCallAction(CallKit.CXProvider,CallKit.CXStartCallAction) M:CallKit.ICXProviderDelegate.TimedOutPerformingAction(CallKit.CXProvider,CallKit.CXAction) -M:CarPlay.CPActionSheetTemplate.#ctor(System.String,System.String,CarPlay.CPAlertAction[]) -M:CarPlay.CPAlertAction.#ctor(System.String,CarPlay.CPAlertActionStyle,System.Action{CarPlay.CPAlertAction}) -M:CarPlay.CPAlertAction.#ctor(System.String,UIKit.UIColor,System.Action{CarPlay.CPAlertAction}) M:CarPlay.CPAlertAction.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPAlertTemplate.#ctor(System.String[],CarPlay.CPAlertAction[]) M:CarPlay.CPApplicationDelegate_Extensions.DidSelectManeuver(CarPlay.ICPApplicationDelegate,UIKit.UIApplication,CarPlay.CPManeuver) M:CarPlay.CPApplicationDelegate_Extensions.DidSelectNavigationAlert(CarPlay.ICPApplicationDelegate,UIKit.UIApplication,CarPlay.CPNavigationAlert) M:CarPlay.CPApplicationDelegate.AccessibilityPerformMagicTap @@ -28913,16 +27140,12 @@ M:CarPlay.CPApplicationDelegate.ApplicationSignificantTimeChange(UIKit.UIApplica M:CarPlay.CPApplicationDelegate.ChangedStatusBarFrame(UIKit.UIApplication,CoreGraphics.CGRect) M:CarPlay.CPApplicationDelegate.ContinueUserActivity(UIKit.UIApplication,Foundation.NSUserActivity,UIKit.UIApplicationRestorationHandler) M:CarPlay.CPApplicationDelegate.DidChangeStatusBarOrientation(UIKit.UIApplication,UIKit.UIInterfaceOrientation) -M:CarPlay.CPApplicationDelegate.DidConnectCarInterfaceController(UIKit.UIApplication,CarPlay.CPInterfaceController,CarPlay.CPWindow) M:CarPlay.CPApplicationDelegate.DidDecodeRestorableState(UIKit.UIApplication,Foundation.NSCoder) M:CarPlay.CPApplicationDelegate.DidDiscardSceneSessions(UIKit.UIApplication,Foundation.NSSet{UIKit.UISceneSession}) -M:CarPlay.CPApplicationDelegate.DidDisconnectCarInterfaceController(UIKit.UIApplication,CarPlay.CPInterfaceController,CarPlay.CPWindow) M:CarPlay.CPApplicationDelegate.DidEnterBackground(UIKit.UIApplication) M:CarPlay.CPApplicationDelegate.DidFailToContinueUserActivity(UIKit.UIApplication,System.String,Foundation.NSError) M:CarPlay.CPApplicationDelegate.DidReceiveRemoteNotification(UIKit.UIApplication,Foundation.NSDictionary,System.Action{UIKit.UIBackgroundFetchResult}) M:CarPlay.CPApplicationDelegate.DidRegisterUserNotificationSettings(UIKit.UIApplication,UIKit.UIUserNotificationSettings) -M:CarPlay.CPApplicationDelegate.DidSelectManeuver(UIKit.UIApplication,CarPlay.CPManeuver) -M:CarPlay.CPApplicationDelegate.DidSelectNavigationAlert(UIKit.UIApplication,CarPlay.CPNavigationAlert) M:CarPlay.CPApplicationDelegate.FailedToRegisterForRemoteNotifications(UIKit.UIApplication,Foundation.NSError) M:CarPlay.CPApplicationDelegate.FinishedLaunching(UIKit.UIApplication,Foundation.NSDictionary) M:CarPlay.CPApplicationDelegate.FinishedLaunching(UIKit.UIApplication) @@ -28967,125 +27190,43 @@ M:CarPlay.CPApplicationDelegate.WillEncodeRestorableState(UIKit.UIApplication,Fo M:CarPlay.CPApplicationDelegate.WillEnterForeground(UIKit.UIApplication) M:CarPlay.CPApplicationDelegate.WillFinishLaunching(UIKit.UIApplication,Foundation.NSDictionary) M:CarPlay.CPApplicationDelegate.WillTerminate(UIKit.UIApplication) -M:CarPlay.CPAssistantCellConfiguration.#ctor(CarPlay.CPAssistantCellPosition,CarPlay.CPAssistantCellVisibility,CarPlay.CPAssistantCellActionType) M:CarPlay.CPAssistantCellConfiguration.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPBarButton.#ctor(CarPlay.CPBarButtonType,System.Action{CarPlay.CPBarButton}) -M:CarPlay.CPBarButton.#ctor(System.String,CarPlay.CPBarButtonHandler) -M:CarPlay.CPBarButton.#ctor(UIKit.UIImage,CarPlay.CPBarButtonHandler) M:CarPlay.CPBarButton.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPButton.#ctor(UIKit.UIImage,System.Action{CarPlay.CPButton}) -M:CarPlay.CPContact.#ctor(System.String,UIKit.UIImage) M:CarPlay.CPContact.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPContactCallButton.#ctor(System.Action{CarPlay.CPButton}) -M:CarPlay.CPContactCallButton.#ctor(UIKit.UIImage,System.Action{CarPlay.CPButton}) -M:CarPlay.CPContactDirectionsButton.#ctor(System.Action{CarPlay.CPButton}) -M:CarPlay.CPContactDirectionsButton.#ctor(UIKit.UIImage,System.Action{CarPlay.CPButton}) -M:CarPlay.CPContactMessageButton.#ctor(System.String) -M:CarPlay.CPContactMessageButton.#ctor(UIKit.UIImage,System.Action{CarPlay.CPButton}) -M:CarPlay.CPContactTemplate.#ctor(CarPlay.CPContact) -M:CarPlay.CPDashboardButton.#ctor(System.String[],System.String[],UIKit.UIImage,System.Action{CarPlay.CPDashboardButton}) M:CarPlay.CPDashboardButton.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPGridButton.#ctor(System.String[],UIKit.UIImage,System.Action{CarPlay.CPGridButton}) M:CarPlay.CPGridButton.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPGridTemplate.#ctor(System.String,CarPlay.CPGridButton[]) -M:CarPlay.CPGridTemplate.UpdateGridButtons(CarPlay.CPGridButton[]) -M:CarPlay.CPGridTemplate.UpdateTitle(System.String) -M:CarPlay.CPImageSet.#ctor(UIKit.UIImage,UIKit.UIImage) M:CarPlay.CPImageSet.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPInformationItem.#ctor(System.String,System.String) M:CarPlay.CPInformationItem.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPInformationRatingItem.#ctor(Foundation.NSNumber,Foundation.NSNumber,System.String,System.String) -M:CarPlay.CPInformationTemplate.#ctor(System.String,CarPlay.CPInformationTemplateLayout,CarPlay.CPInformationItem[],CarPlay.CPTextButton[]) M:CarPlay.CPInstrumentClusterController.Dispose(System.Boolean) M:CarPlay.CPInstrumentClusterControllerDelegate_Extensions.DidChangeCompassSetting(CarPlay.ICPInstrumentClusterControllerDelegate,CarPlay.CPInstrumentClusterController,CarPlay.CPInstrumentClusterSetting) M:CarPlay.CPInstrumentClusterControllerDelegate_Extensions.DidChangeSpeedLimitSetting(CarPlay.ICPInstrumentClusterControllerDelegate,CarPlay.CPInstrumentClusterController,CarPlay.CPInstrumentClusterSetting) M:CarPlay.CPInstrumentClusterControllerDelegate_Extensions.DidZoomIn(CarPlay.ICPInstrumentClusterControllerDelegate,CarPlay.CPInstrumentClusterController) M:CarPlay.CPInstrumentClusterControllerDelegate_Extensions.DidZoomOut(CarPlay.ICPInstrumentClusterControllerDelegate,CarPlay.CPInstrumentClusterController) -M:CarPlay.CPInstrumentClusterControllerDelegate.DidChangeCompassSetting(CarPlay.CPInstrumentClusterController,CarPlay.CPInstrumentClusterSetting) -M:CarPlay.CPInstrumentClusterControllerDelegate.DidChangeSpeedLimitSetting(CarPlay.CPInstrumentClusterController,CarPlay.CPInstrumentClusterSetting) -M:CarPlay.CPInstrumentClusterControllerDelegate.DidConnectWindow(UIKit.UIWindow) -M:CarPlay.CPInstrumentClusterControllerDelegate.DidDisconnectWindow(UIKit.UIWindow) -M:CarPlay.CPInstrumentClusterControllerDelegate.DidZoomIn(CarPlay.CPInstrumentClusterController) -M:CarPlay.CPInstrumentClusterControllerDelegate.DidZoomOut(CarPlay.CPInstrumentClusterController) -M:CarPlay.CPInterfaceController.DismissTemplate(System.Boolean,System.Action{System.Boolean,Foundation.NSError}) -M:CarPlay.CPInterfaceController.DismissTemplate(System.Boolean) M:CarPlay.CPInterfaceController.DismissTemplateAsync(System.Boolean) M:CarPlay.CPInterfaceController.Dispose(System.Boolean) -M:CarPlay.CPInterfaceController.PopTemplate(System.Boolean,System.Action{System.Boolean,Foundation.NSError}) -M:CarPlay.CPInterfaceController.PopTemplate(System.Boolean) M:CarPlay.CPInterfaceController.PopTemplateAsync(System.Boolean) -M:CarPlay.CPInterfaceController.PopToRootTemplate(System.Boolean,System.Action{System.Boolean,Foundation.NSError}) -M:CarPlay.CPInterfaceController.PopToRootTemplate(System.Boolean) M:CarPlay.CPInterfaceController.PopToRootTemplateAsync(System.Boolean) -M:CarPlay.CPInterfaceController.PopToTemplate(CarPlay.CPTemplate,System.Boolean,System.Action{System.Boolean,Foundation.NSError}) -M:CarPlay.CPInterfaceController.PopToTemplate(CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceController.PopToTemplateAsync(CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPInterfaceController.PresentTemplate(CarPlay.CPTemplate,System.Boolean,System.Action{System.Boolean,Foundation.NSError}) -M:CarPlay.CPInterfaceController.PresentTemplate(CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceController.PresentTemplateAsync(CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPInterfaceController.PushTemplate(CarPlay.CPTemplate,System.Boolean,System.Action{System.Boolean,Foundation.NSError}) -M:CarPlay.CPInterfaceController.PushTemplate(CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceController.PushTemplateAsync(CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPInterfaceController.SetRootTemplate(CarPlay.CPTemplate,System.Boolean,System.Action{System.Boolean,Foundation.NSError}) -M:CarPlay.CPInterfaceController.SetRootTemplate(CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceController.SetRootTemplateAsync(CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceControllerDelegate_Extensions.TemplateDidAppear(CarPlay.ICPInterfaceControllerDelegate,CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceControllerDelegate_Extensions.TemplateDidDisappear(CarPlay.ICPInterfaceControllerDelegate,CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceControllerDelegate_Extensions.TemplateWillAppear(CarPlay.ICPInterfaceControllerDelegate,CarPlay.CPTemplate,System.Boolean) M:CarPlay.CPInterfaceControllerDelegate_Extensions.TemplateWillDisappear(CarPlay.ICPInterfaceControllerDelegate,CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPInterfaceControllerDelegate.TemplateDidAppear(CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPInterfaceControllerDelegate.TemplateDidDisappear(CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPInterfaceControllerDelegate.TemplateWillAppear(CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPInterfaceControllerDelegate.TemplateWillDisappear(CarPlay.CPTemplate,System.Boolean) -M:CarPlay.CPLane.#ctor -M:CarPlay.CPLane.#ctor(Foundation.NSMeasurement{Foundation.NSUnitAngle}[],Foundation.NSMeasurement{Foundation.NSUnitAngle}[],System.Boolean) -M:CarPlay.CPLane.#ctor(Foundation.NSMeasurement{Foundation.NSUnitAngle}[]) M:CarPlay.CPLane.Copy(Foundation.NSZone) M:CarPlay.CPLane.EncodeTo(Foundation.NSCoder) M:CarPlay.CPLaneGuidance.Copy(Foundation.NSZone) M:CarPlay.CPLaneGuidance.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPListImageRowItem.#ctor(System.String,UIKit.UIImage[],System.String[]) -M:CarPlay.CPListImageRowItem.#ctor(System.String,UIKit.UIImage[]) -M:CarPlay.CPListImageRowItem.UpdateImages(UIKit.UIImage[]) -M:CarPlay.CPListItem.#ctor(System.String,System.String,UIKit.UIImage,System.Boolean) -M:CarPlay.CPListItem.#ctor(System.String,System.String,UIKit.UIImage,UIKit.UIImage,CarPlay.CPListItemAccessoryType) -M:CarPlay.CPListItem.#ctor(System.String,System.String,UIKit.UIImage) -M:CarPlay.CPListItem.#ctor(System.String,System.String) M:CarPlay.CPListItem.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPListItem.SetAccessoryImage(UIKit.UIImage) -M:CarPlay.CPListItem.SetDetailText(System.String) -M:CarPlay.CPListItem.SetImage(UIKit.UIImage) -M:CarPlay.CPListItem.SetText(System.String) -M:CarPlay.CPListSection.#ctor(CarPlay.ICPListTemplateItem[],System.String,System.String,UIKit.UIImage,CarPlay.CPButton,System.String) -M:CarPlay.CPListSection.#ctor(CarPlay.ICPListTemplateItem[],System.String,System.String) -M:CarPlay.CPListSection.#ctor(CarPlay.ICPListTemplateItem[]) M:CarPlay.CPListSection.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPListSection.GetIndex(CarPlay.ICPListTemplateItem) -M:CarPlay.CPListSection.GetItem(System.UIntPtr) -M:CarPlay.CPListTemplate.#ctor(System.String,CarPlay.CPListSection[],CarPlay.CPAssistantCellConfiguration) -M:CarPlay.CPListTemplate.#ctor(System.String,CarPlay.CPListSection[]) M:CarPlay.CPListTemplate.Dispose(System.Boolean) -M:CarPlay.CPListTemplate.GetIndexPath(CarPlay.ICPListTemplateItem) -M:CarPlay.CPListTemplate.UpdateSections(CarPlay.CPListSection[]) -M:CarPlay.CPListTemplateDelegate.DidSelectListItem(CarPlay.CPListTemplate,CarPlay.CPListItem,System.Action) M:CarPlay.CPManeuver.Copy(Foundation.NSZone) M:CarPlay.CPManeuver.Dispose(System.Boolean) M:CarPlay.CPManeuver.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPMapButton.#ctor(System.Action{CarPlay.CPMapButton}) M:CarPlay.CPMapButton.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPMapTemplate.DismissNavigationAlert(System.Boolean,System.Action{System.Boolean}) M:CarPlay.CPMapTemplate.DismissNavigationAlertAsync(System.Boolean) -M:CarPlay.CPMapTemplate.DismissPanningInterface(System.Boolean) M:CarPlay.CPMapTemplate.Dispose(System.Boolean) -M:CarPlay.CPMapTemplate.HideTripPreviews -M:CarPlay.CPMapTemplate.PresentNavigationAlert(CarPlay.CPNavigationAlert,System.Boolean) -M:CarPlay.CPMapTemplate.ShowPanningInterface(System.Boolean) -M:CarPlay.CPMapTemplate.ShowRouteChoicesPreview(CarPlay.CPTrip,CarPlay.CPTripPreviewTextConfiguration) -M:CarPlay.CPMapTemplate.ShowTripPreviews(CarPlay.CPTrip[],CarPlay.CPTrip,CarPlay.CPTripPreviewTextConfiguration) -M:CarPlay.CPMapTemplate.ShowTripPreviews(CarPlay.CPTrip[],CarPlay.CPTripPreviewTextConfiguration) -M:CarPlay.CPMapTemplate.StartNavigationSession(CarPlay.CPTrip) -M:CarPlay.CPMapTemplate.UpdateTravelEstimates(CarPlay.CPTravelEstimates,CarPlay.CPTrip,CarPlay.CPTimeRemainingColor) -M:CarPlay.CPMapTemplate.UpdateTravelEstimates(CarPlay.CPTravelEstimates,CarPlay.CPTrip) M:CarPlay.CPMapTemplateDelegate_Extensions.DidBeginPanGesture(CarPlay.ICPMapTemplateDelegate,CarPlay.CPMapTemplate) M:CarPlay.CPMapTemplateDelegate_Extensions.DidCancelNavigation(CarPlay.ICPMapTemplateDelegate,CarPlay.CPMapTemplate) M:CarPlay.CPMapTemplateDelegate_Extensions.DidDismissNavigationAlert(CarPlay.ICPMapTemplateDelegate,CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert,CarPlay.CPNavigationAlertDismissalContext) @@ -29107,98 +27248,30 @@ M:CarPlay.CPMapTemplateDelegate_Extensions.StartedTrip(CarPlay.ICPMapTemplateDel M:CarPlay.CPMapTemplateDelegate_Extensions.WillDismissNavigationAlert(CarPlay.ICPMapTemplateDelegate,CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert,CarPlay.CPNavigationAlertDismissalContext) M:CarPlay.CPMapTemplateDelegate_Extensions.WillDismissPanningInterface(CarPlay.ICPMapTemplateDelegate,CarPlay.CPMapTemplate) M:CarPlay.CPMapTemplateDelegate_Extensions.WillShowNavigationAlert(CarPlay.ICPMapTemplateDelegate,CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert) -M:CarPlay.CPMapTemplateDelegate.DidBeginPanGesture(CarPlay.CPMapTemplate) -M:CarPlay.CPMapTemplateDelegate.DidCancelNavigation(CarPlay.CPMapTemplate) -M:CarPlay.CPMapTemplateDelegate.DidDismissNavigationAlert(CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert,CarPlay.CPNavigationAlertDismissalContext) -M:CarPlay.CPMapTemplateDelegate.DidDismissPanningInterface(CarPlay.CPMapTemplate) -M:CarPlay.CPMapTemplateDelegate.DidEndPanGesture(CarPlay.CPMapTemplate,CoreGraphics.CGPoint) -M:CarPlay.CPMapTemplateDelegate.DidShowNavigationAlert(CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert) -M:CarPlay.CPMapTemplateDelegate.DidShowPanningInterface(CarPlay.CPMapTemplate) -M:CarPlay.CPMapTemplateDelegate.DidUpdatePanGesture(CarPlay.CPMapTemplate,CoreGraphics.CGPoint,CoreGraphics.CGPoint) -M:CarPlay.CPMapTemplateDelegate.GetDisplayStyle(CarPlay.CPMapTemplate,CarPlay.CPManeuver) -M:CarPlay.CPMapTemplateDelegate.Pan(CarPlay.CPMapTemplate,CarPlay.CPPanDirection) -M:CarPlay.CPMapTemplateDelegate.PanBegan(CarPlay.CPMapTemplate,CarPlay.CPPanDirection) -M:CarPlay.CPMapTemplateDelegate.PanEnded(CarPlay.CPMapTemplate,CarPlay.CPPanDirection) -M:CarPlay.CPMapTemplateDelegate.SelectedPreview(CarPlay.CPMapTemplate,CarPlay.CPTrip,CarPlay.CPRouteChoice) -M:CarPlay.CPMapTemplateDelegate.ShouldProvideNavigationMetadata(CarPlay.CPMapTemplate) -M:CarPlay.CPMapTemplateDelegate.ShouldShowNotificationForManeuver(CarPlay.CPMapTemplate,CarPlay.CPManeuver) -M:CarPlay.CPMapTemplateDelegate.ShouldShowNotificationForNavigationAlert(CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert) -M:CarPlay.CPMapTemplateDelegate.ShouldUpdateNotificationForManeuver(CarPlay.CPMapTemplate,CarPlay.CPManeuver,CarPlay.CPTravelEstimates) -M:CarPlay.CPMapTemplateDelegate.StartedTrip(CarPlay.CPMapTemplate,CarPlay.CPTrip,CarPlay.CPRouteChoice) -M:CarPlay.CPMapTemplateDelegate.WillDismissNavigationAlert(CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert,CarPlay.CPNavigationAlertDismissalContext) -M:CarPlay.CPMapTemplateDelegate.WillDismissPanningInterface(CarPlay.CPMapTemplate) -M:CarPlay.CPMapTemplateDelegate.WillShowNavigationAlert(CarPlay.CPMapTemplate,CarPlay.CPNavigationAlert) -M:CarPlay.CPMessageComposeBarButton.#ctor(UIKit.UIImage) -M:CarPlay.CPMessageComposeBarButton.Create M:CarPlay.CPMessageListItem.#ctor(System.String,System.String,CarPlay.CPMessageListItemLeadingConfiguration,CarPlay.CPMessageListItemTrailingConfiguration,System.String,System.String,CarPlay.CPMessageListItemType) M:CarPlay.CPMessageListItem.#ctor(System.String,System.String,CarPlay.CPMessageListItemLeadingConfiguration,CarPlay.CPMessageListItemTrailingConfiguration,System.String,System.String) -M:CarPlay.CPMessageListItemLeadingConfiguration.#ctor(CarPlay.CPMessageLeadingItem,UIKit.UIImage,System.Boolean) -M:CarPlay.CPMessageListItemTrailingConfiguration.#ctor(CarPlay.CPMessageTrailingItem,UIKit.UIImage) -M:CarPlay.CPNavigationAlert.#ctor(System.String[],System.String[],CarPlay.CPImageSet,CarPlay.CPAlertAction,CarPlay.CPAlertAction,System.Double) -M:CarPlay.CPNavigationAlert.#ctor(System.String[],System.String[],UIKit.UIImage,CarPlay.CPAlertAction,CarPlay.CPAlertAction,System.Double) M:CarPlay.CPNavigationAlert.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPNavigationAlert.UpdateTitleVariants(System.String[],System.String[]) -M:CarPlay.CPNavigationSession.AddLaneGuidances(CarPlay.CPLaneGuidance[]) -M:CarPlay.CPNavigationSession.AddManeuvers(CarPlay.CPManeuver[]) -M:CarPlay.CPNavigationSession.CancelTrip -M:CarPlay.CPNavigationSession.FinishTrip -M:CarPlay.CPNavigationSession.PauseTrip(CarPlay.CPTripPauseReason,System.String,UIKit.UIColor) -M:CarPlay.CPNavigationSession.PauseTrip(CarPlay.CPTripPauseReason,System.String) -M:CarPlay.CPNavigationSession.ResumeTrip(CarPlay.CPRouteInformation) -M:CarPlay.CPNavigationSession.UpdateTravelEstimates(CarPlay.CPTravelEstimates,CarPlay.CPManeuver) -M:CarPlay.CPNowPlayingAddToLibraryButton.#ctor(System.Action{CarPlay.CPNowPlayingButton}) -M:CarPlay.CPNowPlayingButton.#ctor(System.Action{CarPlay.CPNowPlayingButton}) M:CarPlay.CPNowPlayingButton.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPNowPlayingImageButton.#ctor(System.Action{CarPlay.CPNowPlayingButton}) -M:CarPlay.CPNowPlayingImageButton.#ctor(UIKit.UIImage,System.Action{CarPlay.CPNowPlayingButton}) -M:CarPlay.CPNowPlayingMoreButton.#ctor(System.Action{CarPlay.CPNowPlayingButton}) -M:CarPlay.CPNowPlayingPlaybackRateButton.#ctor(System.Action{CarPlay.CPNowPlayingButton}) -M:CarPlay.CPNowPlayingRepeatButton.#ctor(System.Action{CarPlay.CPNowPlayingButton}) -M:CarPlay.CPNowPlayingShuffleButton.#ctor(System.Action{CarPlay.CPNowPlayingButton}) -M:CarPlay.CPNowPlayingTemplate.AddObserver(CarPlay.ICPNowPlayingTemplateObserver) -M:CarPlay.CPNowPlayingTemplate.RemoveObserver(CarPlay.ICPNowPlayingTemplateObserver) -M:CarPlay.CPNowPlayingTemplate.UpdateNowPlayingButtons(CarPlay.CPNowPlayingButton[]) M:CarPlay.CPNowPlayingTemplateObserver_Extensions.AlbumArtistButtonTapped(CarPlay.ICPNowPlayingTemplateObserver,CarPlay.CPNowPlayingTemplate) M:CarPlay.CPNowPlayingTemplateObserver_Extensions.UpNextButtonTapped(CarPlay.ICPNowPlayingTemplateObserver,CarPlay.CPNowPlayingTemplate) -M:CarPlay.CPPointOfInterest.#ctor(MapKit.MKMapItem,System.String,System.String,System.String,System.String,System.String,System.String,UIKit.UIImage,UIKit.UIImage) -M:CarPlay.CPPointOfInterest.#ctor(MapKit.MKMapItem,System.String,System.String,System.String,System.String,System.String,System.String,UIKit.UIImage) M:CarPlay.CPPointOfInterest.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPPointOfInterestTemplate.#ctor(System.String,CarPlay.CPPointOfInterest[],System.IntPtr) M:CarPlay.CPPointOfInterestTemplate.Dispose(System.Boolean) -M:CarPlay.CPPointOfInterestTemplate.SetPointsOfInterest(CarPlay.CPPointOfInterest[],System.IntPtr) M:CarPlay.CPPointOfInterestTemplateDelegate_Extensions.DidSelectPointOfInterest(CarPlay.ICPPointOfInterestTemplateDelegate,CarPlay.CPPointOfInterestTemplate,CarPlay.CPPointOfInterest) -M:CarPlay.CPPointOfInterestTemplateDelegate.DidChangeMapRegion(CarPlay.CPPointOfInterestTemplate,MapKit.MKCoordinateRegion) -M:CarPlay.CPPointOfInterestTemplateDelegate.DidSelectPointOfInterest(CarPlay.CPPointOfInterestTemplate,CarPlay.CPPointOfInterest) -M:CarPlay.CPRouteChoice.#ctor(System.String[],System.String[],System.String[]) M:CarPlay.CPRouteChoice.Copy(Foundation.NSZone) M:CarPlay.CPRouteChoice.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPRouteInformation.#ctor(CarPlay.CPManeuver[],CarPlay.CPLaneGuidance[],CarPlay.CPManeuver[],CarPlay.CPLaneGuidance,CarPlay.CPTravelEstimates,CarPlay.CPTravelEstimates) M:CarPlay.CPSearchTemplate.Dispose(System.Boolean) M:CarPlay.CPSearchTemplateDelegate_Extensions.SearchButtonPressed(CarPlay.ICPSearchTemplateDelegate,CarPlay.CPSearchTemplate) -M:CarPlay.CPSearchTemplateDelegate.SearchButtonPressed(CarPlay.CPSearchTemplate) -M:CarPlay.CPSearchTemplateDelegate.SelectedResult(CarPlay.CPSearchTemplate,CarPlay.CPListItem,System.Action) -M:CarPlay.CPSearchTemplateDelegate.UpdatedSearchText(CarPlay.CPSearchTemplate,System.String,CarPlay.CPSearchTemplateDelegateUpdateHandler) -M:CarPlay.CPSessionConfiguration.#ctor(CarPlay.ICPSessionConfigurationDelegate) M:CarPlay.CPSessionConfiguration.Dispose(System.Boolean) M:CarPlay.CPSessionConfigurationDelegate_Extensions.ContentStyleChanged(CarPlay.ICPSessionConfigurationDelegate,CarPlay.CPSessionConfiguration,CarPlay.CPContentStyle) M:CarPlay.CPSessionConfigurationDelegate_Extensions.LimitedUserInterfacesChanged(CarPlay.ICPSessionConfigurationDelegate,CarPlay.CPSessionConfiguration,CarPlay.CPLimitableUserInterface) -M:CarPlay.CPSessionConfigurationDelegate.ContentStyleChanged(CarPlay.CPSessionConfiguration,CarPlay.CPContentStyle) -M:CarPlay.CPSessionConfigurationDelegate.LimitedUserInterfacesChanged(CarPlay.CPSessionConfiguration,CarPlay.CPLimitableUserInterface) -M:CarPlay.CPTabBarTemplate.#ctor(CarPlay.CPTemplate[]) M:CarPlay.CPTabBarTemplate.Dispose(System.Boolean) -M:CarPlay.CPTabBarTemplate.SelectTemplate(CarPlay.CPTemplate) -M:CarPlay.CPTabBarTemplate.SelectTemplate(System.IntPtr) -M:CarPlay.CPTabBarTemplate.UpdateTemplates(CarPlay.CPTemplate[]) -M:CarPlay.CPTabBarTemplateDelegate.DidSelectTemplate(CarPlay.CPTabBarTemplate,CarPlay.CPTemplate) M:CarPlay.CPTemplate.EncodeTo(Foundation.NSCoder) M:CarPlay.CPTemplateApplicationDashboardScene.#ctor(UIKit.UISceneSession,UIKit.UISceneConnectionOptions) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate_Extensions.DidConnectDashboardController(CarPlay.ICPTemplateApplicationDashboardSceneDelegate,CarPlay.CPTemplateApplicationDashboardScene,CarPlay.CPDashboardController,UIKit.UIWindow) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate_Extensions.DidDisconnectDashboardController(CarPlay.ICPTemplateApplicationDashboardSceneDelegate,CarPlay.CPTemplateApplicationDashboardScene,CarPlay.CPDashboardController,UIKit.UIWindow) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.ContinueUserActivity(UIKit.UIScene,Foundation.NSUserActivity) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.DidBecomeActive(UIKit.UIScene) -M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.DidConnectDashboardController(CarPlay.CPTemplateApplicationDashboardScene,CarPlay.CPDashboardController,UIKit.UIWindow) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.DidDisconnect(UIKit.UIScene) -M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.DidDisconnectDashboardController(CarPlay.CPTemplateApplicationDashboardScene,CarPlay.CPDashboardController,UIKit.UIWindow) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.DidEnterBackground(UIKit.UIScene) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.DidFailToContinueUserActivity(UIKit.UIScene,System.String,Foundation.NSError) M:CarPlay.CPTemplateApplicationDashboardSceneDelegate.DidUpdateUserActivity(UIKit.UIScene,Foundation.NSUserActivity) @@ -29213,12 +27286,9 @@ M:CarPlay.CPTemplateApplicationInstrumentClusterScene.#ctor(UIKit.UISceneSession M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate_Extensions.ContentStyleDidChange(CarPlay.ICPTemplateApplicationInstrumentClusterSceneDelegate,UIKit.UIUserInterfaceStyle) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate_Extensions.DidConnectInstrumentClusterController(CarPlay.ICPTemplateApplicationInstrumentClusterSceneDelegate,CarPlay.CPTemplateApplicationInstrumentClusterScene,CarPlay.CPInstrumentClusterController) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate_Extensions.DidDisconnectInstrumentClusterController(CarPlay.ICPTemplateApplicationInstrumentClusterSceneDelegate,CarPlay.CPTemplateApplicationInstrumentClusterScene,CarPlay.CPInstrumentClusterController) -M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.ContentStyleDidChange(UIKit.UIUserInterfaceStyle) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.ContinueUserActivity(UIKit.UIScene,Foundation.NSUserActivity) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.DidBecomeActive(UIKit.UIScene) -M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.DidConnectInstrumentClusterController(CarPlay.CPTemplateApplicationInstrumentClusterScene,CarPlay.CPInstrumentClusterController) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.DidDisconnect(UIKit.UIScene) -M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.DidDisconnectInstrumentClusterController(CarPlay.CPTemplateApplicationInstrumentClusterScene,CarPlay.CPInstrumentClusterController) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.DidEnterBackground(UIKit.UIScene) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.DidFailToContinueUserActivity(UIKit.UIScene,System.String,Foundation.NSError) M:CarPlay.CPTemplateApplicationInstrumentClusterSceneDelegate.DidUpdateUserActivity(UIKit.UIScene,Foundation.NSUserActivity) @@ -29237,18 +27307,11 @@ M:CarPlay.CPTemplateApplicationSceneDelegate_Extensions.DidDisconnect(CarPlay.IC M:CarPlay.CPTemplateApplicationSceneDelegate_Extensions.DidDisconnect(CarPlay.ICPTemplateApplicationSceneDelegate,CarPlay.CPTemplateApplicationScene,CarPlay.CPInterfaceController) M:CarPlay.CPTemplateApplicationSceneDelegate_Extensions.DidSelect(CarPlay.ICPTemplateApplicationSceneDelegate,CarPlay.CPTemplateApplicationScene,CarPlay.CPManeuver) M:CarPlay.CPTemplateApplicationSceneDelegate_Extensions.DidSelect(CarPlay.ICPTemplateApplicationSceneDelegate,CarPlay.CPTemplateApplicationScene,CarPlay.CPNavigationAlert) -M:CarPlay.CPTemplateApplicationSceneDelegate.ContentStyleDidChange(UIKit.UIUserInterfaceStyle) M:CarPlay.CPTemplateApplicationSceneDelegate.ContinueUserActivity(UIKit.UIScene,Foundation.NSUserActivity) M:CarPlay.CPTemplateApplicationSceneDelegate.DidBecomeActive(UIKit.UIScene) -M:CarPlay.CPTemplateApplicationSceneDelegate.DidConnect(CarPlay.CPTemplateApplicationScene,CarPlay.CPInterfaceController,CarPlay.CPWindow) -M:CarPlay.CPTemplateApplicationSceneDelegate.DidConnect(CarPlay.CPTemplateApplicationScene,CarPlay.CPInterfaceController) -M:CarPlay.CPTemplateApplicationSceneDelegate.DidDisconnect(CarPlay.CPTemplateApplicationScene,CarPlay.CPInterfaceController,CarPlay.CPWindow) -M:CarPlay.CPTemplateApplicationSceneDelegate.DidDisconnect(CarPlay.CPTemplateApplicationScene,CarPlay.CPInterfaceController) M:CarPlay.CPTemplateApplicationSceneDelegate.DidDisconnect(UIKit.UIScene) M:CarPlay.CPTemplateApplicationSceneDelegate.DidEnterBackground(UIKit.UIScene) M:CarPlay.CPTemplateApplicationSceneDelegate.DidFailToContinueUserActivity(UIKit.UIScene,System.String,Foundation.NSError) -M:CarPlay.CPTemplateApplicationSceneDelegate.DidSelect(CarPlay.CPTemplateApplicationScene,CarPlay.CPManeuver) -M:CarPlay.CPTemplateApplicationSceneDelegate.DidSelect(CarPlay.CPTemplateApplicationScene,CarPlay.CPNavigationAlert) M:CarPlay.CPTemplateApplicationSceneDelegate.DidUpdateUserActivity(UIKit.UIScene,Foundation.NSUserActivity) M:CarPlay.CPTemplateApplicationSceneDelegate.GetStateRestorationActivity(UIKit.UIScene) M:CarPlay.CPTemplateApplicationSceneDelegate.OpenUrlContexts(UIKit.UIScene,Foundation.NSSet{UIKit.UIOpenUrlContext}) @@ -29257,18 +27320,10 @@ M:CarPlay.CPTemplateApplicationSceneDelegate.WillConnect(UIKit.UIScene,UIKit.UIS M:CarPlay.CPTemplateApplicationSceneDelegate.WillContinueUserActivity(UIKit.UIScene,System.String) M:CarPlay.CPTemplateApplicationSceneDelegate.WillEnterForeground(UIKit.UIScene) M:CarPlay.CPTemplateApplicationSceneDelegate.WillResignActive(UIKit.UIScene) -M:CarPlay.CPTextButton.#ctor(System.String,CarPlay.CPTextButtonStyle,System.Action{CarPlay.CPTextButton}) -M:CarPlay.CPTravelEstimates.#ctor(Foundation.NSMeasurement{Foundation.NSUnitLength},Foundation.NSMeasurement{Foundation.NSUnitLength},System.Double) -M:CarPlay.CPTravelEstimates.#ctor(Foundation.NSMeasurement{Foundation.NSUnitLength},System.Double) M:CarPlay.CPTravelEstimates.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPTrip.#ctor(MapKit.MKMapItem,MapKit.MKMapItem,CarPlay.CPRouteChoice[]) M:CarPlay.CPTrip.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPTripPreviewTextConfiguration.#ctor(System.String,System.String,System.String) M:CarPlay.CPTripPreviewTextConfiguration.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPVoiceControlState.#ctor(System.String,System.String[],UIKit.UIImage,System.Boolean) M:CarPlay.CPVoiceControlState.EncodeTo(Foundation.NSCoder) -M:CarPlay.CPVoiceControlTemplate.#ctor(CarPlay.CPVoiceControlState[]) -M:CarPlay.CPVoiceControlTemplate.ActivateVoiceControlState(System.String) M:CarPlay.CPWindow.#ctor(CoreGraphics.CGRect) M:CarPlay.CPWindow.CPWindowAppearance.#ctor(System.IntPtr) M:CarPlay.CPWindow.Dispose(System.Boolean) @@ -29363,41 +27418,13 @@ M:Cinematic.CNRenderingSessionFrameAttributes.Copy(Foundation.NSZone) M:Cinematic.CNRenderingSessionFrameAttributes.MutableCopy(Foundation.NSZone) M:Cinematic.CNScript.LoadAsync(AVFoundation.AVAsset,Cinematic.CNScriptChanges,Foundation.NSProgress) M:Cinematic.CNScriptFrame.Copy(Foundation.NSZone) -M:ClassKit.CLSActivity.AddAdditionalActivityItem(ClassKit.CLSActivityItem) -M:ClassKit.CLSActivity.AddProgressRange(System.Double,System.Double) -M:ClassKit.CLSActivity.RemoveAllActivityItems -M:ClassKit.CLSActivity.Start -M:ClassKit.CLSActivity.Stop -M:ClassKit.CLSBinaryItem.#ctor(System.String,System.String,ClassKit.CLSBinaryValueType) -M:ClassKit.CLSContext.#ctor(ClassKit.CLSContextType,System.String,System.String) -M:ClassKit.CLSContext.AddChild(ClassKit.CLSContext) -M:ClassKit.CLSContext.AddNavigationChild(ClassKit.CLSContext) -M:ClassKit.CLSContext.AddProgressReportingCapabilities(Foundation.NSSet{ClassKit.CLSProgressReportingCapability}) -M:ClassKit.CLSContext.BecomeActive -M:ClassKit.CLSContext.CreateNewActivity -M:ClassKit.CLSContext.FindDescendantMatching(System.String[],System.Action{ClassKit.CLSContext,Foundation.NSError}) M:ClassKit.CLSContext.FindDescendantMatchingAsync(System.String[]) -M:ClassKit.CLSContext.RemoveFromParent -M:ClassKit.CLSContext.RemoveNavigationChild(ClassKit.CLSContext) -M:ClassKit.CLSContext.ResetProgressReportingCapabilities -M:ClassKit.CLSContext.ResignActive -M:ClassKit.CLSContext.SetType(ClassKit.CLSContextType) -M:ClassKit.CLSDataStore.CompleteAllAssignedActivitiesMatching(System.String[]) M:ClassKit.CLSDataStore.Dispose(System.Boolean) -M:ClassKit.CLSDataStore.FetchActivity(Foundation.NSUrl,System.Action{ClassKit.CLSActivity,Foundation.NSError}) M:ClassKit.CLSDataStore.FetchActivityAsync(Foundation.NSUrl) -M:ClassKit.CLSDataStore.FindContextsMatching(Foundation.NSPredicate,System.Action{ClassKit.CLSContext[],Foundation.NSError}) -M:ClassKit.CLSDataStore.FindContextsMatching(System.String[],System.Action{ClassKit.CLSContext[],Foundation.NSError}) M:ClassKit.CLSDataStore.FindContextsMatchingAsync(Foundation.NSPredicate) M:ClassKit.CLSDataStore.FindContextsMatchingAsync(System.String[]) -M:ClassKit.CLSDataStore.Remove(ClassKit.CLSContext) -M:ClassKit.CLSDataStore.Save(System.Action{Foundation.NSError}) M:ClassKit.CLSDataStore.SaveAsync -M:ClassKit.CLSDataStoreDelegate.CreateContext(System.String,ClassKit.CLSContext,System.String[]) M:ClassKit.CLSObject.EncodeTo(Foundation.NSCoder) -M:ClassKit.CLSProgressReportingCapability.#ctor(ClassKit.CLSProgressReportingCapabilityKind,System.String) -M:ClassKit.CLSQuantityItem.#ctor(System.String,System.String) -M:ClassKit.CLSScoreItem.#ctor(System.String,System.String,System.Double,System.Double) M:ClassKit.ICLSContextProvider.UpdateDescendants(ClassKit.CLSContext,System.Action{Foundation.NSError}) M:ClassKit.ICLSDataStoreDelegate.CreateContext(System.String,ClassKit.CLSContext,System.String[]) M:CloudKit.CKAllowedSharingOptions.Copy(Foundation.NSZone) @@ -29491,9 +27518,6 @@ M:CloudKit.CKSyncEngine.SendChangesAsync M:CloudKit.CKSyncEngine.SendChangesAsync(CloudKit.CKSyncEngineSendChangesOptions) M:CloudKit.CKSyncEngineConfiguration.Dispose(System.Boolean) M:CloudKit.CKSyncEngineDelegate_Extensions.SyncEngine(CloudKit.ICKSyncEngineDelegate,CloudKit.CKSyncEngine,CloudKit.CKSyncEngineFetchChangesContext) -M:CloudKit.CKSyncEngineDelegate.SyncEngine(CloudKit.CKSyncEngine,CloudKit.CKSyncEngineEvent) -M:CloudKit.CKSyncEngineDelegate.SyncEngine(CloudKit.CKSyncEngine,CloudKit.CKSyncEngineFetchChangesContext) -M:CloudKit.CKSyncEngineDelegate.SyncEngine(CloudKit.CKSyncEngine,CloudKit.CKSyncEngineSendChangesContext) M:CloudKit.CKSyncEngineFetchChangesOptions.Copy(Foundation.NSZone) M:CloudKit.CKSyncEngineFetchChangesScope.#ctor(Foundation.NSSet{CloudKit.CKRecordZoneID},System.Boolean) M:CloudKit.CKSyncEngineFetchChangesScope.Copy(Foundation.NSZone) @@ -29532,7 +27556,6 @@ M:Compression.CompressionStream.Write(System.Byte[],System.Int32,System.Int32) M:Compression.CompressionStream.Write(System.ReadOnlySpan{System.Byte}) M:Compression.CompressionStream.WriteAsync(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken) M:Compression.CompressionStream.WriteAsync(System.ReadOnlyMemory{System.Byte},System.Threading.CancellationToken) -M:Contacts.CNChangeHistoryEvent.AcceptEventVisitor(Contacts.ICNChangeHistoryEventVisitor) M:Contacts.CNChangeHistoryEvent.Copy(Foundation.NSZone) M:Contacts.CNChangeHistoryEvent.EncodeTo(Foundation.NSCoder) M:Contacts.CNChangeHistoryEventVisitor_Extensions.AddGroup(Contacts.ICNChangeHistoryEventVisitor,Contacts.CNChangeHistoryAddGroupEvent) @@ -29544,123 +27567,52 @@ M:Contacts.CNChangeHistoryEventVisitor_Extensions.RemoveSubgroupFromGroup(Contac M:Contacts.CNChangeHistoryEventVisitor_Extensions.UpdateGroup(Contacts.ICNChangeHistoryEventVisitor,Contacts.CNChangeHistoryUpdateGroupEvent) M:Contacts.CNChangeHistoryFetchRequest.EncodeTo(Foundation.NSCoder) M:Contacts.CNContact.AreKeysAvailable(Contacts.CNContactOptions) -M:Contacts.CNContact.AreKeysAvailable(Foundation.NSArray) M:Contacts.CNContact.AreKeysAvailable``1(`0[]) -M:Contacts.CNContact.ComparatorForName(Contacts.CNContactSortOrder) M:Contacts.CNContact.Copy(Foundation.NSZone) M:Contacts.CNContact.EncodeTo(Foundation.NSCoder) -M:Contacts.CNContact.GetDescriptorForAllComparatorKeys M:Contacts.CNContact.GetItemProviderVisibilityForTypeIdentifier(System.String) M:Contacts.CNContact.GetObject(Foundation.NSData,System.String,Foundation.NSError@) -M:Contacts.CNContact.GetPredicateForContacts(Contacts.CNPhoneNumber) -M:Contacts.CNContact.GetPredicateForContacts(System.String) -M:Contacts.CNContact.GetPredicateForContacts(System.String[]) -M:Contacts.CNContact.GetPredicateForContactsInContainer(System.String) -M:Contacts.CNContact.GetPredicateForContactsInGroup(System.String) -M:Contacts.CNContact.GetPredicateForContactsMatchingEmailAddress(System.String) M:Contacts.CNContact.IsKeyAvailable(Contacts.CNContactOptions) -M:Contacts.CNContact.IsKeyAvailable(Foundation.NSString) -M:Contacts.CNContact.IsUnifiedWithContact(System.String) M:Contacts.CNContact.LoadData(System.String,System.Action{Foundation.NSData,Foundation.NSError}) M:Contacts.CNContact.LoadDataAsync(System.String,Foundation.NSProgress@) M:Contacts.CNContact.LoadDataAsync(System.String) M:Contacts.CNContact.LocalizeProperty(Contacts.CNContactOptions) -M:Contacts.CNContact.LocalizeProperty(Foundation.NSString) M:Contacts.CNContact.MutableCopy(Foundation.NSZone) M:Contacts.CNContactFetchRequest.#ctor(Contacts.ICNKeyDescriptor[]) -M:Contacts.CNContactFetchRequest.#ctor(Foundation.NSArray) M:Contacts.CNContactFetchRequest.#ctor(Foundation.NSString[]) M:Contacts.CNContactFetchRequest.#ctor(ObjCRuntime.INativeObject[]) M:Contacts.CNContactFetchRequest.EncodeTo(Foundation.NSCoder) M:Contacts.CNContactFormatter.EncodeTo(Foundation.NSCoder) -M:Contacts.CNContactFormatter.GetAttributedString(Contacts.CNContact,Foundation.NSDictionary) -M:Contacts.CNContactFormatter.GetAttributedStringFrom(Contacts.CNContact,Contacts.CNContactFormatterStyle,Foundation.NSDictionary) -M:Contacts.CNContactFormatter.GetDelimiterFor(Contacts.CNContact) -M:Contacts.CNContactFormatter.GetDescriptorForRequiredKeys(Contacts.CNContactFormatterStyle) -M:Contacts.CNContactFormatter.GetNameOrderFor(Contacts.CNContact) -M:Contacts.CNContactFormatter.GetString(Contacts.CNContact) -M:Contacts.CNContactFormatter.GetStringFrom(Contacts.CNContact,Contacts.CNContactFormatterStyle) M:Contacts.CNContactProperty.Copy(Foundation.NSZone) M:Contacts.CNContactProperty.EncodeTo(Foundation.NSCoder) -M:Contacts.CNContactRelation.#ctor(System.String) M:Contacts.CNContactRelation.Copy(Foundation.NSZone) M:Contacts.CNContactRelation.EncodeTo(Foundation.NSCoder) -M:Contacts.CNContactRelation.FromName(System.String) -M:Contacts.CNContactStore.EnumerateContacts(Contacts.CNContactFetchRequest,Foundation.NSError@,Contacts.CNContactStoreListContactsHandler) -M:Contacts.CNContactStore.ExecuteSaveRequest(Contacts.CNSaveRequest,Foundation.NSError@) -M:Contacts.CNContactStore.GetAuthorizationStatus(Contacts.CNEntityType) -M:Contacts.CNContactStore.GetContainers(Foundation.NSPredicate,Foundation.NSError@) -M:Contacts.CNContactStore.GetEnumeratorForChangeHistory(Contacts.CNChangeHistoryFetchRequest,Foundation.NSError@) -M:Contacts.CNContactStore.GetEnumeratorForContact(Contacts.CNContactFetchRequest,Foundation.NSError@) -M:Contacts.CNContactStore.GetGroups(Foundation.NSPredicate,Foundation.NSError@) -M:Contacts.CNContactStore.GetUnifiedContact(System.String,Foundation.NSArray,Foundation.NSError@) M:Contacts.CNContactStore.GetUnifiedContact``1(System.String,`0[],Foundation.NSError@) -M:Contacts.CNContactStore.GetUnifiedContacts(Foundation.NSPredicate,Foundation.NSArray,Foundation.NSError@) M:Contacts.CNContactStore.GetUnifiedContacts``1(Foundation.NSPredicate,`0[],Foundation.NSError@) -M:Contacts.CNContactStore.GetUnifiedMeContact(Foundation.NSArray,Foundation.NSError@) M:Contacts.CNContactStore.GetUnifiedMeContact``1(`0[],Foundation.NSError@) -M:Contacts.CNContactStore.RequestAccess(Contacts.CNEntityType,Contacts.CNContactStoreRequestAccessHandler) M:Contacts.CNContactStore.RequestAccessAsync(Contacts.CNEntityType) -M:Contacts.CNContactsUserDefaults.GetSharedDefaults -M:Contacts.CNContactVCardSerialization.GetContactsFromData(Foundation.NSData,Foundation.NSError@) -M:Contacts.CNContactVCardSerialization.GetDataFromContacts(Contacts.CNContact[],Foundation.NSError@) -M:Contacts.CNContactVCardSerialization.GetDescriptorFromRequiredKeys M:Contacts.CNContainer.Copy(Foundation.NSZone) -M:Contacts.CNContainer.CreatePredicateForContainerOfContact(System.String) -M:Contacts.CNContainer.CreatePredicateForContainerOfGroup(System.String) -M:Contacts.CNContainer.CreatePredicateForContainers(System.String[]) M:Contacts.CNContainer.EncodeTo(Foundation.NSCoder) M:Contacts.CNGroup.Copy(Foundation.NSZone) -M:Contacts.CNGroup.CreatePredicateForGroups(System.String[]) -M:Contacts.CNGroup.CreatePredicateForGroupsInContainer(System.String) -M:Contacts.CNGroup.CreatePredicateForSubgroupsInGroup(System.String) M:Contacts.CNGroup.EncodeTo(Foundation.NSCoder) M:Contacts.CNGroup.MutableCopy(Foundation.NSZone) -M:Contacts.CNInstantMessageAddress.#ctor(System.String,System.String) M:Contacts.CNInstantMessageAddress.Copy(Foundation.NSZone) M:Contacts.CNInstantMessageAddress.EncodeTo(Foundation.NSCoder) M:Contacts.CNInstantMessageAddress.LocalizeProperty(Contacts.CNInstantMessageAddressOption) -M:Contacts.CNInstantMessageAddress.LocalizeProperty(Foundation.NSString) M:Contacts.CNInstantMessageAddress.LocalizeService(Contacts.CNInstantMessageServiceOption) -M:Contacts.CNInstantMessageAddress.LocalizeService(Foundation.NSString) -M:Contacts.CNLabeledValue`1.#ctor(System.String,`0) M:Contacts.CNLabeledValue`1.Copy(Foundation.NSZone) M:Contacts.CNLabeledValue`1.EncodeTo(Foundation.NSCoder) -M:Contacts.CNLabeledValue`1.FromLabel(System.String,`0) -M:Contacts.CNLabeledValue`1.GetLabeledValue(`0) -M:Contacts.CNLabeledValue`1.GetLabeledValue(System.String,`0) -M:Contacts.CNLabeledValue`1.GetLabeledValue(System.String) -M:Contacts.CNLabeledValue`1.LocalizeLabel(Foundation.NSString) -M:Contacts.CNPhoneNumber.#ctor(System.String) M:Contacts.CNPhoneNumber.Copy(Foundation.NSZone) M:Contacts.CNPhoneNumber.EncodeTo(Foundation.NSCoder) -M:Contacts.CNPhoneNumber.PhoneNumberWithStringValue(System.String) M:Contacts.CNPostalAddress.Copy(Foundation.NSZone) M:Contacts.CNPostalAddress.EncodeTo(Foundation.NSCoder) M:Contacts.CNPostalAddress.LocalizeProperty(Contacts.CNPostalAddressKeyOption) -M:Contacts.CNPostalAddress.LocalizeProperty(Foundation.NSString) M:Contacts.CNPostalAddress.MutableCopy(Foundation.NSZone) -M:Contacts.CNPostalAddressFormatter.GetAttributedStringFrom(Contacts.CNPostalAddress,Contacts.CNPostalAddressFormatterStyle,Foundation.NSDictionary) -M:Contacts.CNPostalAddressFormatter.GetAttributedStringFromPostalAddress(Contacts.CNPostalAddress,Foundation.NSDictionary) -M:Contacts.CNPostalAddressFormatter.GetStringFrom(Contacts.CNPostalAddress,Contacts.CNPostalAddressFormatterStyle) -M:Contacts.CNPostalAddressFormatter.GetStringFromPostalAddress(Contacts.CNPostalAddress) -M:Contacts.CNSaveRequest.AddContact(Contacts.CNMutableContact,System.String) -M:Contacts.CNSaveRequest.AddGroup(Contacts.CNMutableGroup,System.String) -M:Contacts.CNSaveRequest.AddMember(Contacts.CNContact,Contacts.CNGroup) -M:Contacts.CNSaveRequest.AddSubgroup(Contacts.CNGroup,Contacts.CNGroup) -M:Contacts.CNSaveRequest.DeleteContact(Contacts.CNMutableContact) -M:Contacts.CNSaveRequest.DeleteGroup(Contacts.CNMutableGroup) -M:Contacts.CNSaveRequest.RemoveMember(Contacts.CNContact,Contacts.CNGroup) -M:Contacts.CNSaveRequest.RemoveSubgroup(Contacts.CNGroup,Contacts.CNGroup) -M:Contacts.CNSaveRequest.UpdateContact(Contacts.CNMutableContact) -M:Contacts.CNSaveRequest.UpdateGroup(Contacts.CNMutableGroup) -M:Contacts.CNSocialProfile.#ctor(System.String,System.String,System.String,System.String) M:Contacts.CNSocialProfile.Copy(Foundation.NSZone) M:Contacts.CNSocialProfile.EncodeTo(Foundation.NSCoder) M:Contacts.CNSocialProfile.LocalizeProperty(Contacts.CNPostalAddressKeyOption) M:Contacts.CNSocialProfile.LocalizeProperty(Contacts.CNSocialProfileOption) M:Contacts.CNSocialProfile.LocalizeService(Contacts.CNSocialProfileServiceOption) -M:Contacts.CNSocialProfile.LocalizeService(Foundation.NSString) M:Contacts.ICNChangeHistoryEventVisitor.AddContact(Contacts.CNChangeHistoryAddContactEvent) M:Contacts.ICNChangeHistoryEventVisitor.AddGroup(Contacts.CNChangeHistoryAddGroupEvent) M:Contacts.ICNChangeHistoryEventVisitor.AddMemberToGroup(Contacts.CNChangeHistoryAddMemberToGroupEvent) @@ -34635,7 +32587,6 @@ M:CryptoTokenKit.TKSmartCard.BeginSessionAsync M:CryptoTokenKit.TKSmartCard.Dispose(System.Boolean) M:CryptoTokenKit.TKSmartCard.TransmitRequestAsync(Foundation.NSData) M:CryptoTokenKit.TKSmartCardSlotManager.GetSlotAsync(System.String) -M:CryptoTokenKit.TKSmartCardTokenSession.#ctor(CryptoTokenKit.TKToken) M:CryptoTokenKit.TKSmartCardUserInteraction.Dispose(System.Boolean) M:CryptoTokenKit.TKSmartCardUserInteraction.RunAsync M:CryptoTokenKit.TKSmartCardUserInteractionDelegate_Extensions.CharacterEntered(CryptoTokenKit.ITKSmartCardUserInteractionDelegate,CryptoTokenKit.TKSmartCardUserInteraction) @@ -34649,13 +32600,9 @@ M:CryptoTokenKit.TKSmartCardUserInteractionForPinOperation.Dispose(System.Boolea M:CryptoTokenKit.TKToken.Dispose(System.Boolean) M:CryptoTokenKit.TKTokenAuthOperation.EncodeTo(Foundation.NSCoder) M:CryptoTokenKit.TKTokenDelegate_Extensions.TerminateSession(CryptoTokenKit.ITKTokenDelegate,CryptoTokenKit.TKToken,CryptoTokenKit.TKTokenSession) -M:CryptoTokenKit.TKTokenDelegate.CreateSession(CryptoTokenKit.TKToken,Foundation.NSError@) -M:CryptoTokenKit.TKTokenDelegate.TerminateSession(CryptoTokenKit.TKToken,CryptoTokenKit.TKTokenSession) M:CryptoTokenKit.TKTokenDriver.Dispose(System.Boolean) M:CryptoTokenKit.TKTokenDriverDelegate_Extensions.GetToken(CryptoTokenKit.ITKTokenDriverDelegate,CryptoTokenKit.TKTokenDriver,CryptoTokenKit.TKTokenConfiguration,Foundation.NSError@) M:CryptoTokenKit.TKTokenDriverDelegate_Extensions.TerminateToken(CryptoTokenKit.ITKTokenDriverDelegate,CryptoTokenKit.TKTokenDriver,CryptoTokenKit.TKToken) -M:CryptoTokenKit.TKTokenDriverDelegate.GetToken(CryptoTokenKit.TKTokenDriver,CryptoTokenKit.TKTokenConfiguration,Foundation.NSError@) -M:CryptoTokenKit.TKTokenDriverDelegate.TerminateToken(CryptoTokenKit.TKTokenDriver,CryptoTokenKit.TKToken) M:CryptoTokenKit.TKTokenKeychainKey.#ctor(Security.SecCertificate,Foundation.NSObject) M:CryptoTokenKit.TKTokenSession.Dispose(System.Boolean) M:CryptoTokenKit.TKTokenSessionDelegate_Extensions.BeginAuthentication(CryptoTokenKit.ITKTokenSessionDelegate,CryptoTokenKit.TKTokenSession,CryptoTokenKit.TKTokenOperation,Foundation.NSObject,Foundation.NSError@) @@ -34663,11 +32610,6 @@ M:CryptoTokenKit.TKTokenSessionDelegate_Extensions.DecryptData(CryptoTokenKit.IT M:CryptoTokenKit.TKTokenSessionDelegate_Extensions.PerformKeyExchange(CryptoTokenKit.ITKTokenSessionDelegate,CryptoTokenKit.TKTokenSession,Foundation.NSData,Foundation.NSObject,CryptoTokenKit.TKTokenKeyAlgorithm,CryptoTokenKit.TKTokenKeyExchangeParameters,Foundation.NSError@) M:CryptoTokenKit.TKTokenSessionDelegate_Extensions.SignData(CryptoTokenKit.ITKTokenSessionDelegate,CryptoTokenKit.TKTokenSession,Foundation.NSData,Foundation.NSObject,CryptoTokenKit.TKTokenKeyAlgorithm,Foundation.NSError@) M:CryptoTokenKit.TKTokenSessionDelegate_Extensions.SupportsOperation(CryptoTokenKit.ITKTokenSessionDelegate,CryptoTokenKit.TKTokenSession,CryptoTokenKit.TKTokenOperation,Foundation.NSObject,CryptoTokenKit.TKTokenKeyAlgorithm) -M:CryptoTokenKit.TKTokenSessionDelegate.BeginAuthentication(CryptoTokenKit.TKTokenSession,CryptoTokenKit.TKTokenOperation,Foundation.NSObject,Foundation.NSError@) -M:CryptoTokenKit.TKTokenSessionDelegate.DecryptData(CryptoTokenKit.TKTokenSession,Foundation.NSData,Foundation.NSObject,CryptoTokenKit.TKTokenKeyAlgorithm,Foundation.NSError@) -M:CryptoTokenKit.TKTokenSessionDelegate.PerformKeyExchange(CryptoTokenKit.TKTokenSession,Foundation.NSData,Foundation.NSObject,CryptoTokenKit.TKTokenKeyAlgorithm,CryptoTokenKit.TKTokenKeyExchangeParameters,Foundation.NSError@) -M:CryptoTokenKit.TKTokenSessionDelegate.SignData(CryptoTokenKit.TKTokenSession,Foundation.NSData,Foundation.NSObject,CryptoTokenKit.TKTokenKeyAlgorithm,Foundation.NSError@) -M:CryptoTokenKit.TKTokenSessionDelegate.SupportsOperation(CryptoTokenKit.TKTokenSession,CryptoTokenKit.TKTokenOperation,Foundation.NSObject,CryptoTokenKit.TKTokenKeyAlgorithm) M:CryptoTokenKit.TKTokenSmartCardPinAuthOperation.Dispose(System.Boolean) M:Darwin.KernelQueue.#ctor M:Darwin.KernelQueue.Dispose @@ -34690,13 +32632,9 @@ M:Darwin.SystemLog.Log(System.String) M:Darwin.SystemLog.RemoveLogFile(System.Int32) M:Darwin.SystemLog.Search(Darwin.Message) M:Darwin.SystemLog.SetFilter(System.Int32) -M:DeviceCheck.DCAppAttestService.AttestKey(System.String,Foundation.NSData,System.Action{Foundation.NSData,Foundation.NSError}) M:DeviceCheck.DCAppAttestService.AttestKeyAsync(System.String,Foundation.NSData) -M:DeviceCheck.DCAppAttestService.GenerateAssertion(System.String,Foundation.NSData,System.Action{Foundation.NSData,Foundation.NSError}) M:DeviceCheck.DCAppAttestService.GenerateAssertionAsync(System.String,Foundation.NSData) -M:DeviceCheck.DCAppAttestService.GenerateKey(System.Action{System.String,Foundation.NSError}) M:DeviceCheck.DCAppAttestService.GenerateKeyAsync -M:DeviceCheck.DCDevice.GenerateToken(DeviceCheck.DCDeviceGenerateTokenCompletionHandler) M:DeviceCheck.DCDevice.GenerateTokenAsync M:EventKit.EKAlarm.Copy(Foundation.NSZone) M:EventKit.EKEventStore.FetchRemindersAsync(Foundation.NSPredicate,System.IntPtr@) @@ -34759,13 +32697,10 @@ M:ExecutionPolicy.EPExecutionPolicy.AddPolicyException(Foundation.NSUrl,Foundati M:ExtensionKit.EXAppExtensionBrowserViewController.#ctor(System.String,Foundation.NSBundle) M:ExtensionKit.EXHostViewController.#ctor(System.String,Foundation.NSBundle) M:ExtensionKit.EXHostViewController.Dispose(System.Boolean) -M:ExtensionKit.EXHostViewController.MakeXpcConnection(Foundation.NSError@) M:ExtensionKit.EXHostViewControllerDelegate_Extensions.DidActivate(ExtensionKit.IEXHostViewControllerDelegate,ExtensionKit.EXHostViewController) M:ExtensionKit.EXHostViewControllerDelegate_Extensions.ShouldAcceptXpcConnection(ExtensionKit.IEXHostViewControllerDelegate,Foundation.NSXpcConnection) M:ExtensionKit.EXHostViewControllerDelegate_Extensions.WillDeactivate(ExtensionKit.IEXHostViewControllerDelegate,ExtensionKit.EXHostViewController,Foundation.NSError) -M:ExtensionKit.EXHostViewControllerDelegate.DidActivate(ExtensionKit.EXHostViewController) M:ExtensionKit.EXHostViewControllerDelegate.ShouldAcceptXpcConnection(Foundation.NSXpcConnection) -M:ExtensionKit.EXHostViewControllerDelegate.WillDeactivate(ExtensionKit.EXHostViewController,Foundation.NSError) M:ExtensionKit.IEXHostViewControllerDelegate.DidActivate(ExtensionKit.EXHostViewController) M:ExtensionKit.IEXHostViewControllerDelegate.ShouldAcceptXpcConnection(Foundation.NSXpcConnection) M:ExtensionKit.IEXHostViewControllerDelegate.WillDeactivate(ExtensionKit.EXHostViewController,Foundation.NSError) @@ -35285,21 +33220,13 @@ M:Foundation.ModelNotImplementedException.#ctor M:Foundation.NotImplementedAttribute.#ctor M:Foundation.NotImplementedAttribute.#ctor(System.String) M:Foundation.NSAffineTransform.Concat -M:Foundation.NSAffineTransform.Copy(Foundation.NSZone) -M:Foundation.NSAffineTransform.EncodeTo(Foundation.NSCoder) -M:Foundation.NSAffineTransform.Set M:Foundation.NSAffineTransform.TransformBezierPath(AppKit.NSBezierPath) M:Foundation.NSAppleEventDescriptor.#ctor(Foundation.NSAppleEventDescriptorType) -M:Foundation.NSAppleEventDescriptor.Copy(Foundation.NSZone) -M:Foundation.NSAppleEventDescriptor.EncodeTo(Foundation.NSCoder) -M:Foundation.NSAppleScript.Copy(Foundation.NSZone) M:Foundation.NSArchiveReplaceEventArgs.#ctor(Foundation.NSObject,Foundation.NSObject) M:Foundation.NSArray.ArrayFromHandle``1(ObjCRuntime.NativeHandle,System.Converter{ObjCRuntime.NativeHandle,`0},System.Boolean) M:Foundation.NSArray.ArrayFromHandle``1(ObjCRuntime.NativeHandle,System.Converter{ObjCRuntime.NativeHandle,`0}) M:Foundation.NSArray.ArrayFromHandle``1(ObjCRuntime.NativeHandle) M:Foundation.NSArray.ArrayFromHandleFunc``1(ObjCRuntime.NativeHandle,System.Func{ObjCRuntime.NativeHandle,`0}) -M:Foundation.NSArray.Copy(Foundation.NSZone) -M:Foundation.NSArray.EncodeTo(Foundation.NSCoder) M:Foundation.NSArray.EnumsFromHandle``1(ObjCRuntime.NativeHandle) M:Foundation.NSArray.From(Foundation.NSObject[][]) M:Foundation.NSArray.FromArray``1(Foundation.NSArray) @@ -35320,7 +33247,6 @@ M:Foundation.NSArray.FromObjects(System.Object[]) M:Foundation.NSArray.FromStrings(System.Collections.Generic.IReadOnlyList{System.String}) M:Foundation.NSArray.FromStrings(System.String[]) M:Foundation.NSArray.GetItem``1(System.UIntPtr) -M:Foundation.NSArray.MutableCopy(Foundation.NSZone) M:Foundation.NSArray.ToArray M:Foundation.NSArray.ToArray``1 M:Foundation.NSArray`1.#ctor @@ -35350,7 +33276,6 @@ M:Foundation.NSAttributedString.#ctor(System.String,UIKit.UIFont,UIKit.UIColor,U M:Foundation.NSAttributedString.#ctor(System.String,UIKit.UIStringAttributes) M:Foundation.NSAttributedString.BoundingRectWithSize(CoreGraphics.CGSize,Foundation.NSStringDrawingOptions) M:Foundation.NSAttributedString.ContainsAttachmentsInRange(Foundation.NSRange) -M:Foundation.NSAttributedString.Copy(Foundation.NSZone) M:Foundation.NSAttributedString.Create(AppKit.NSAdaptiveImageGlyph,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:Foundation.NSAttributedString.Create(UIKit.NSAdaptiveImageGlyph,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:Foundation.NSAttributedString.CreateWithDocFormat(Foundation.NSData,Foundation.NSDictionary@) @@ -35362,7 +33287,6 @@ M:Foundation.NSAttributedString.DrawString(CoreGraphics.CGPoint) M:Foundation.NSAttributedString.DrawString(CoreGraphics.CGRect,Foundation.NSStringDrawingOptions,Foundation.NSStringDrawingContext) M:Foundation.NSAttributedString.DrawString(CoreGraphics.CGRect,Foundation.NSStringDrawingOptions) M:Foundation.NSAttributedString.DrawString(CoreGraphics.CGRect) -M:Foundation.NSAttributedString.EncodeTo(Foundation.NSCoder) M:Foundation.NSAttributedString.FromAttachment(AppKit.NSTextAttachment,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:Foundation.NSAttributedString.FromAttachment(AppKit.NSTextAttachment) M:Foundation.NSAttributedString.FromAttachment(UIKit.NSTextAttachment,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) @@ -35381,11 +33305,9 @@ M:Foundation.NSAttributedString.GetFileWrapper(Foundation.NSRange,Foundation.NSA M:Foundation.NSAttributedString.GetFileWrapper(Foundation.NSRange,Foundation.NSDictionary,Foundation.NSError@) M:Foundation.NSAttributedString.GetFontAttributes(Foundation.NSRange) M:Foundation.NSAttributedString.GetItemNumber(AppKit.NSTextList,System.UIntPtr) -M:Foundation.NSAttributedString.GetItemProviderVisibilityForTypeIdentifier(System.String) M:Foundation.NSAttributedString.GetLineBreak(System.UIntPtr,Foundation.NSRange) M:Foundation.NSAttributedString.GetLineBreakByHyphenating(System.UIntPtr,Foundation.NSRange) M:Foundation.NSAttributedString.GetNextWord(System.UIntPtr,System.Boolean) -M:Foundation.NSAttributedString.GetObject(Foundation.NSData,System.String,Foundation.NSError@) M:Foundation.NSAttributedString.GetPasteboardPropertyListForType(System.String) M:Foundation.NSAttributedString.GetRange(AppKit.NSTextBlock,System.UIntPtr) M:Foundation.NSAttributedString.GetRange(AppKit.NSTextList,System.UIntPtr) @@ -35404,7 +33326,6 @@ M:Foundation.NSAttributedString.GetUIKitAttributes(System.IntPtr,Foundation.NSRa M:Foundation.NSAttributedString.GetUrl(System.UIntPtr,Foundation.NSRange@) M:Foundation.NSAttributedString.GetWritableTypesForPasteboard(AppKit.NSPasteboard) M:Foundation.NSAttributedString.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) -M:Foundation.NSAttributedString.LoadData(System.String,System.Action{Foundation.NSData,Foundation.NSError}) M:Foundation.NSAttributedString.LoadDataAsync(System.String,Foundation.NSProgress@) M:Foundation.NSAttributedString.LoadDataAsync(System.String) M:Foundation.NSAttributedString.LoadFromHtml(Foundation.NSData,Foundation.NSAttributedStringDocumentAttributes,Foundation.NSAttributedStringCompletionHandler) @@ -35416,15 +33337,10 @@ M:Foundation.NSAttributedString.LoadFromHtmlAsync(Foundation.NSUrl,Foundation.NS M:Foundation.NSAttributedString.LoadFromHtmlAsync(Foundation.NSUrlRequest,Foundation.NSAttributedStringDocumentAttributes) M:Foundation.NSAttributedString.LoadFromHtmlAsync(System.String,Foundation.NSAttributedStringDocumentAttributes) M:Foundation.NSAttributedString.LowLevelGetAttributes(System.IntPtr,Foundation.NSRange@) -M:Foundation.NSAttributedString.MutableCopy(Foundation.NSZone) M:Foundation.NSAttributedString.PrefersRtfdInRange(Foundation.NSRange) M:Foundation.NSAttributedString.Substring(System.IntPtr,System.IntPtr) M:Foundation.NSAttributedStringDocumentAttributes.#ctor M:Foundation.NSAttributedStringDocumentAttributes.#ctor(Foundation.NSDictionary) -M:Foundation.NSAttributedStringMarkdownParsingOptions.Copy(Foundation.NSZone) -M:Foundation.NSAttributedStringMarkdownSourcePosition.Copy(Foundation.NSZone) -M:Foundation.NSAttributedStringMarkdownSourcePosition.EncodeTo(Foundation.NSCoder) -M:Foundation.NSBindingSelectionMarker.Copy(Foundation.NSZone) M:Foundation.NSBindingSelectionMarker.GetDefaultPlaceholder(Foundation.NSBindingSelectionMarker,ObjCRuntime.Class,System.String) M:Foundation.NSBindingSelectionMarker.SetDefaultPlaceholder(Foundation.NSObject,Foundation.NSBindingSelectionMarker,ObjCRuntime.Class,System.String) M:Foundation.NSBundle.GetContextHelp(System.String) @@ -35447,15 +33363,7 @@ M:Foundation.NSCache.add_WillEvictObject(System.EventHandler{Foundation.NSObject M:Foundation.NSCache.Dispose(System.Boolean) M:Foundation.NSCache.remove_WillEvictObject(System.EventHandler{Foundation.NSObjectEventArgs}) M:Foundation.NSCacheDelegate_Extensions.WillEvictObject(Foundation.INSCacheDelegate,Foundation.NSCache,Foundation.NSObject) -M:Foundation.NSCacheDelegate.WillEvictObject(Foundation.NSCache,Foundation.NSObject) -M:Foundation.NSCachedUrlResponse.Copy(Foundation.NSZone) -M:Foundation.NSCachedUrlResponse.EncodeTo(Foundation.NSCoder) M:Foundation.NSCalendar.#ctor(Foundation.NSCalendarType) -M:Foundation.NSCalendar.Copy(Foundation.NSZone) -M:Foundation.NSCalendar.EncodeTo(Foundation.NSCoder) -M:Foundation.NSCharacterSet.Copy(Foundation.NSZone) -M:Foundation.NSCharacterSet.EncodeTo(Foundation.NSCoder) -M:Foundation.NSCharacterSet.MutableCopy(Foundation.NSZone) M:Foundation.NSCoder.DecodeBytes M:Foundation.NSCoder.DecodeBytes(System.String) M:Foundation.NSCoder.DecodeTopLevelObject(System.Type,System.String,Foundation.NSError@) @@ -35470,14 +33378,6 @@ M:Foundation.NSCoder.TryDecode(System.String,System.Int32@) M:Foundation.NSCoder.TryDecode(System.String,System.Int64@) M:Foundation.NSCoder.TryDecode(System.String,System.IntPtr@) M:Foundation.NSCoder.TryDecode(System.String,System.Single@) -M:Foundation.NSCoding.#ctor(Foundation.NSCoder) -M:Foundation.NSCoding.EncodeTo(Foundation.NSCoder) -M:Foundation.NSComparisonPredicate.EncodeTo(Foundation.NSCoder) -M:Foundation.NSCompoundPredicate.EncodeTo(Foundation.NSCoder) -M:Foundation.NSCondition.Lock -M:Foundation.NSCondition.Unlock -M:Foundation.NSConditionLock.Lock -M:Foundation.NSConditionLock.Unlock M:Foundation.NSConnection.Dispose(System.Boolean) M:Foundation.NSConnection.GetRootProxy``1 M:Foundation.NSConnection.GetRootProxy``1(System.String,System.String,Foundation.NSPortNameServer) @@ -35488,21 +33388,11 @@ M:Foundation.NSConnectionDelegate_Extensions.CreateConversation(Foundation.INSCo M:Foundation.NSConnectionDelegate_Extensions.GetAuthenticationData(Foundation.INSConnectionDelegate,Foundation.NSArray) M:Foundation.NSConnectionDelegate_Extensions.HandleRequest(Foundation.INSConnectionDelegate,Foundation.NSConnection,Foundation.NSDistantObjectRequest) M:Foundation.NSConnectionDelegate_Extensions.ShouldMakeNewConnection(Foundation.INSConnectionDelegate,Foundation.NSConnection,Foundation.NSConnection) -M:Foundation.NSConnectionDelegate.AllowNewConnection(Foundation.NSConnection,Foundation.NSConnection) -M:Foundation.NSConnectionDelegate.AuthenticateComponents(Foundation.NSArray,Foundation.NSData) -M:Foundation.NSConnectionDelegate.CreateConversation(Foundation.NSConnection) -M:Foundation.NSConnectionDelegate.GetAuthenticationData(Foundation.NSArray) -M:Foundation.NSConnectionDelegate.HandleRequest(Foundation.NSConnection,Foundation.NSDistantObjectRequest) -M:Foundation.NSConnectionDelegate.ShouldMakeNewConnection(Foundation.NSConnection,Foundation.NSConnection) -M:Foundation.NSCopying.Copy(Foundation.NSZone) M:Foundation.NSData.AsStream -M:Foundation.NSData.Copy(Foundation.NSZone) -M:Foundation.NSData.EncodeTo(Foundation.NSCoder) M:Foundation.NSData.FromArray(System.Byte[]) M:Foundation.NSData.FromStream(System.IO.Stream) M:Foundation.NSData.FromString(System.String,Foundation.NSStringEncoding) M:Foundation.NSData.FromString(System.String) -M:Foundation.NSData.MutableCopy(Foundation.NSZone) M:Foundation.NSData.op_Implicit(System.String)~Foundation.NSData M:Foundation.NSData.Save(Foundation.NSUrl,Foundation.NSDataWritingOptions,Foundation.NSError@) M:Foundation.NSData.Save(Foundation.NSUrl,System.Boolean,Foundation.NSError@) @@ -35512,19 +33402,11 @@ M:Foundation.NSData.ToArray M:Foundation.NSData.ToString M:Foundation.NSData.ToString(Foundation.NSStringEncoding) M:Foundation.NSDataDetector.#ctor(Foundation.NSTextCheckingType,Foundation.NSError@) -M:Foundation.NSDataDetector.Copy(Foundation.NSZone) M:Foundation.NSDataDetector.Create(Foundation.NSTextCheckingType,Foundation.NSError@) -M:Foundation.NSDataDetector.EncodeTo(Foundation.NSCoder) M:Foundation.NSDate.#ctor(System.Double) -M:Foundation.NSDate.Copy(Foundation.NSZone) M:Foundation.NSDate.CreateFromSRAbsoluteTime(System.Double) -M:Foundation.NSDate.EncodeTo(Foundation.NSCoder) M:Foundation.NSDate.op_Explicit(Foundation.NSDate)~System.DateTime M:Foundation.NSDate.op_Explicit(System.DateTime)~Foundation.NSDate -M:Foundation.NSDateComponents.Copy(Foundation.NSZone) -M:Foundation.NSDateComponents.EncodeTo(Foundation.NSCoder) -M:Foundation.NSDateInterval.Copy(Foundation.NSZone) -M:Foundation.NSDateInterval.EncodeTo(Foundation.NSCoder) M:Foundation.NSDecimal.Add(Foundation.NSDecimal@,Foundation.NSDecimal@,Foundation.NSDecimal@,Foundation.NSRoundingMode) M:Foundation.NSDecimal.Compare(Foundation.NSDecimal@,Foundation.NSDecimal@) M:Foundation.NSDecimal.Divide(Foundation.NSDecimal@,Foundation.NSDecimal@,Foundation.NSDecimal@,Foundation.NSRoundingMode) @@ -35552,18 +33434,14 @@ M:Foundation.NSDecimal.Power(Foundation.NSDecimal@,Foundation.NSDecimal@,System. M:Foundation.NSDecimal.Round(Foundation.NSDecimal@,Foundation.NSDecimal@,System.IntPtr,Foundation.NSRoundingMode) M:Foundation.NSDecimal.Subtract(Foundation.NSDecimal@,Foundation.NSDecimal@,Foundation.NSDecimal@,Foundation.NSRoundingMode) M:Foundation.NSDecimal.ToString -M:Foundation.NSDecimalNumber.EncodeTo(Foundation.NSCoder) M:Foundation.NSDictionary.#ctor(Foundation.NSObject,Foundation.NSObject,Foundation.NSObject[]) M:Foundation.NSDictionary.#ctor(System.Object,System.Object,System.Object[]) M:Foundation.NSDictionary.ContainsKey(Foundation.NSObject) -M:Foundation.NSDictionary.Copy(Foundation.NSZone) -M:Foundation.NSDictionary.EncodeTo(Foundation.NSCoder) M:Foundation.NSDictionary.FromObjectsAndKeys(Foundation.NSObject[],Foundation.NSObject[],System.IntPtr) M:Foundation.NSDictionary.FromObjectsAndKeys(Foundation.NSObject[],Foundation.NSObject[]) M:Foundation.NSDictionary.FromObjectsAndKeys(System.Object[],System.Object[],System.IntPtr) M:Foundation.NSDictionary.FromObjectsAndKeys(System.Object[],System.Object[]) M:Foundation.NSDictionary.LowlevelObjectForKey(System.IntPtr) -M:Foundation.NSDictionary.MutableCopy(Foundation.NSZone) M:Foundation.NSDictionary.ToFileAttributes M:Foundation.NSDictionary.TryGetValue(Foundation.NSObject,Foundation.NSObject@) M:Foundation.NSDictionary`2.#ctor @@ -35583,13 +33461,9 @@ M:Foundation.NSDictionary`2.KeysForObject(`1) M:Foundation.NSDictionary`2.ObjectForKey(`0) M:Foundation.NSDictionary`2.ObjectsForKeys(`0[],`1) M:Foundation.NSDictionary`2.TryGetValue(`0,.TValue@) -M:Foundation.NSDimension.#ctor(System.String) -M:Foundation.NSDimension.EncodeTo(Foundation.NSCoder) M:Foundation.NSEnumerator`1.NextObject M:Foundation.NSError.#ctor M:Foundation.NSError.#ctor(Foundation.NSString,System.IntPtr) -M:Foundation.NSError.Copy(Foundation.NSZone) -M:Foundation.NSError.EncodeTo(Foundation.NSCoder) M:Foundation.NSError.FromDomain(Foundation.NSString,System.IntPtr) M:Foundation.NSError.GetFileProviderError(FileProvider.INSFileProviderItem) M:Foundation.NSError.GetFileProviderError(System.String) @@ -35597,20 +33471,12 @@ M:Foundation.NSError.GetFileProviderErrorForRejectedDeletion(FileProvider.INSFil M:Foundation.NSError.ToString M:Foundation.NSErrorEventArgs.#ctor(Foundation.NSError) M:Foundation.NSErrorException.#ctor(Foundation.NSError) -M:Foundation.NSException.Copy(Foundation.NSZone) -M:Foundation.NSException.EncodeTo(Foundation.NSCoder) M:Foundation.NSExceptionError.#ctor(System.Exception) -M:Foundation.NSExpression.Copy(Foundation.NSZone) -M:Foundation.NSExpression.EncodeTo(Foundation.NSCoder) M:Foundation.NSExtensionContext.CompleteRequestAsync(Foundation.NSExtensionItem[]) M:Foundation.NSExtensionContext.OpenUrlAsync(Foundation.NSUrl) -M:Foundation.NSExtensionItem.Copy(Foundation.NSZone) -M:Foundation.NSExtensionItem.EncodeTo(Foundation.NSCoder) -M:Foundation.NSExtensionRequestHandling.BeginRequestWithExtensionContext(Foundation.NSExtensionContext) M:Foundation.NSFileAttributes.#ctor M:Foundation.NSFileAttributes.FromDictionary(Foundation.NSDictionary) M:Foundation.NSFileHandle.AcceptConnectionInBackground(Foundation.NSRunLoopMode[]) -M:Foundation.NSFileHandle.EncodeTo(Foundation.NSCoder) M:Foundation.NSFileHandle.ReadInBackground(Foundation.NSRunLoopMode[]) M:Foundation.NSFileHandle.ReadToEndOfFileInBackground(Foundation.NSRunLoopMode[]) M:Foundation.NSFileHandle.SetReadabilityHandler(System.Action{Foundation.NSFileHandle}) @@ -35656,23 +33522,7 @@ M:Foundation.NSFileManagerDelegate_Extensions.ShouldProceedAfterErrorRemovingIte M:Foundation.NSFileManagerDelegate_Extensions.ShouldProceedAfterErrorRemovingItem(Foundation.INSFileManagerDelegate,Foundation.NSFileManager,Foundation.NSError,System.String) M:Foundation.NSFileManagerDelegate_Extensions.ShouldRemoveItemAtPath(Foundation.INSFileManagerDelegate,Foundation.NSFileManager,System.String) M:Foundation.NSFileManagerDelegate_Extensions.ShouldRemoveItemAtUrl(Foundation.INSFileManagerDelegate,Foundation.NSFileManager,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldCopyItemAtPath(Foundation.NSFileManager,Foundation.NSString,Foundation.NSString) M:Foundation.NSFileManagerDelegate.ShouldCopyItemAtPath(Foundation.NSFileManager,System.String,System.String) -M:Foundation.NSFileManagerDelegate.ShouldCopyItemAtUrl(Foundation.NSFileManager,Foundation.NSUrl,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldLinkItemAtPath(Foundation.NSFileManager,System.String,System.String) -M:Foundation.NSFileManagerDelegate.ShouldLinkItemAtUrl(Foundation.NSFileManager,Foundation.NSUrl,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldMoveItemAtPath(Foundation.NSFileManager,System.String,System.String) -M:Foundation.NSFileManagerDelegate.ShouldMoveItemAtUrl(Foundation.NSFileManager,Foundation.NSUrl,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorCopyingItem(Foundation.NSFileManager,Foundation.NSError,Foundation.NSUrl,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorCopyingItem(Foundation.NSFileManager,Foundation.NSError,System.String,System.String) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorLinkingItem(Foundation.NSFileManager,Foundation.NSError,Foundation.NSUrl,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorLinkingItem(Foundation.NSFileManager,Foundation.NSError,System.String,System.String) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorMovingItem(Foundation.NSFileManager,Foundation.NSError,Foundation.NSUrl,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorMovingItem(Foundation.NSFileManager,Foundation.NSError,System.String,System.String) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorRemovingItem(Foundation.NSFileManager,Foundation.NSError,Foundation.NSUrl) -M:Foundation.NSFileManagerDelegate.ShouldProceedAfterErrorRemovingItem(Foundation.NSFileManager,Foundation.NSError,System.String) -M:Foundation.NSFileManagerDelegate.ShouldRemoveItemAtPath(Foundation.NSFileManager,System.String) -M:Foundation.NSFileManagerDelegate.ShouldRemoveItemAtUrl(Foundation.NSFileManager,Foundation.NSUrl) M:Foundation.NSFilePresenter_Extensions.AccommodatePresentedItemDeletion(Foundation.INSFilePresenter,System.Action{Foundation.NSError}) M:Foundation.NSFilePresenter_Extensions.AccommodatePresentedItemEviction(Foundation.INSFilePresenter,System.Action{Foundation.NSError}) M:Foundation.NSFilePresenter_Extensions.AccommodatePresentedSubitemDeletion(Foundation.INSFilePresenter,Foundation.NSUrl,System.Action{Foundation.NSError}) @@ -35693,30 +33543,9 @@ M:Foundation.NSFilePresenter_Extensions.PresentedSubitemResolvedConflictVersion( M:Foundation.NSFilePresenter_Extensions.RelinquishPresentedItemToReader(Foundation.INSFilePresenter,Foundation.NSFilePresenterReacquirer) M:Foundation.NSFilePresenter_Extensions.RelinquishPresentedItemToWriter(Foundation.INSFilePresenter,Foundation.NSFilePresenterReacquirer) M:Foundation.NSFilePresenter_Extensions.SavePresentedItemChanges(Foundation.INSFilePresenter,System.Action{Foundation.NSError}) -M:Foundation.NSFilePresenter.AccommodatePresentedItemDeletion(System.Action{Foundation.NSError}) -M:Foundation.NSFilePresenter.AccommodatePresentedItemEviction(System.Action{Foundation.NSError}) -M:Foundation.NSFilePresenter.AccommodatePresentedSubitemDeletion(Foundation.NSUrl,System.Action{Foundation.NSError}) -M:Foundation.NSFilePresenter.PresentedItemChanged -M:Foundation.NSFilePresenter.PresentedItemChangedUbiquityAttributes(Foundation.NSSet{Foundation.NSString}) -M:Foundation.NSFilePresenter.PresentedItemGainedVersion(Foundation.NSFileVersion) -M:Foundation.NSFilePresenter.PresentedItemLostVersion(Foundation.NSFileVersion) -M:Foundation.NSFilePresenter.PresentedItemMoved(Foundation.NSUrl) -M:Foundation.NSFilePresenter.PresentedItemResolveConflictVersion(Foundation.NSFileVersion) -M:Foundation.NSFilePresenter.PresentedSubitemAppeared(Foundation.NSUrl) -M:Foundation.NSFilePresenter.PresentedSubitemChanged(Foundation.NSUrl) -M:Foundation.NSFilePresenter.PresentedSubitemGainedVersion(Foundation.NSUrl,Foundation.NSFileVersion) -M:Foundation.NSFilePresenter.PresentedSubitemLostVersion(Foundation.NSUrl,Foundation.NSFileVersion) -M:Foundation.NSFilePresenter.PresentedSubitemMoved(Foundation.NSUrl,Foundation.NSUrl) -M:Foundation.NSFilePresenter.PresentedSubitemResolvedConflictVersion(Foundation.NSUrl,Foundation.NSFileVersion) -M:Foundation.NSFilePresenter.RelinquishPresentedItemToReader(Foundation.NSFilePresenterReacquirer) -M:Foundation.NSFilePresenter.RelinquishPresentedItemToWriter(Foundation.NSFilePresenterReacquirer) -M:Foundation.NSFilePresenter.SavePresentedItemChanges(System.Action{Foundation.NSError}) M:Foundation.NSFileProviderService.GetFileProviderConnectionAsync M:Foundation.NSFileSystemAttributes.op_Implicit(Foundation.NSFileSystemAttributes)~Foundation.NSDictionary M:Foundation.NSFileVersion.GetNonlocalVersionsAsync(Foundation.NSUrl) -M:Foundation.NSFileWrapper.EncodeTo(Foundation.NSCoder) -M:Foundation.NSFormatter.Copy(Foundation.NSZone) -M:Foundation.NSFormatter.EncodeTo(Foundation.NSCoder) M:Foundation.NSFormatter.GetAttributedString(Foundation.NSObject,AppKit.NSStringAttributes) M:Foundation.NSFormatter.GetAttributedString(Foundation.NSObject,UIKit.UIStringAttributes) M:Foundation.NSHost.Equals(System.Object) @@ -35736,13 +33565,10 @@ M:Foundation.NSHttpCookie.#ctor(System.String,System.String,System.String,System M:Foundation.NSHttpCookie.#ctor(System.String,System.String,System.String) M:Foundation.NSHttpCookie.#ctor(System.String,System.String) M:Foundation.NSHttpCookieStorage.GetCookiesForTaskAsync(Foundation.NSUrlSessionTask) -M:Foundation.NSHttpUrlResponse.#ctor(Foundation.NSUrl,System.String,System.IntPtr,System.String) -M:Foundation.NSIndexPath.Copy(Foundation.NSZone) M:Foundation.NSIndexPath.Create(System.Int32[]) M:Foundation.NSIndexPath.Create(System.IntPtr[]) M:Foundation.NSIndexPath.Create(System.UInt32[]) M:Foundation.NSIndexPath.Create(System.UIntPtr[]) -M:Foundation.NSIndexPath.EncodeTo(Foundation.NSCoder) M:Foundation.NSIndexPath.FromItemSection(System.IntPtr,System.IntPtr) M:Foundation.NSIndexPath.FromRowSection(System.IntPtr,System.IntPtr) M:Foundation.NSIndexPath.GetIndexes @@ -35750,27 +33576,18 @@ M:Foundation.NSIndexPath.GetIndexes(Foundation.NSRange) M:Foundation.NSIndexSet.#ctor(System.Int32) M:Foundation.NSIndexSet.#ctor(System.IntPtr) M:Foundation.NSIndexSet.#ctor(System.UInt32) -M:Foundation.NSIndexSet.Copy(Foundation.NSZone) -M:Foundation.NSIndexSet.EncodeTo(Foundation.NSCoder) M:Foundation.NSIndexSet.FromArray(System.Int32[]) M:Foundation.NSIndexSet.FromArray(System.UInt32[]) M:Foundation.NSIndexSet.FromArray(System.UIntPtr[]) -M:Foundation.NSIndexSet.MutableCopy(Foundation.NSZone) M:Foundation.NSIndexSet.ToArray -M:Foundation.NSInflectionRule.Copy(Foundation.NSZone) -M:Foundation.NSInflectionRule.EncodeTo(Foundation.NSCoder) M:Foundation.NSInputStream.Dispose(System.Boolean) -M:Foundation.NSInputStream.GetProperty(Foundation.NSString) M:Foundation.NSInputStream.Notify(CoreFoundation.CFStreamEventType) M:Foundation.NSInputStream.Read(System.Byte[],System.Int32,System.UIntPtr) M:Foundation.NSInputStream.Read(System.Byte[],System.UIntPtr) M:Foundation.NSInputStream.SetCFClientFlags(CoreFoundation.CFStreamEventType,System.IntPtr,System.IntPtr) -M:Foundation.NSInputStream.SetProperty(Foundation.NSObject,Foundation.NSString) M:Foundation.NSInvocation.Dispose(System.Boolean) -M:Foundation.NSIso8601DateFormatter.EncodeTo(Foundation.NSCoder) M:Foundation.NSItemProvider.#ctor(Foundation.NSUrl,UniformTypeIdentifiers.UTType,System.Boolean,System.Boolean,Foundation.NSItemProviderRepresentationVisibility) M:Foundation.NSItemProvider.CanLoadObject(System.Type) -M:Foundation.NSItemProvider.Copy(Foundation.NSZone) M:Foundation.NSItemProvider.LoadDataRepresentation(UniformTypeIdentifiers.UTType,Foundation.ItemProviderDataCompletionHandler) M:Foundation.NSItemProvider.LoadDataRepresentationAsync(System.String,Foundation.NSProgress@) M:Foundation.NSItemProvider.LoadDataRepresentationAsync(System.String) @@ -35816,11 +33633,6 @@ M:Foundation.NSKeyedArchiverDelegate_Extensions.Finished(Foundation.INSKeyedArch M:Foundation.NSKeyedArchiverDelegate_Extensions.Finishing(Foundation.INSKeyedArchiverDelegate,Foundation.NSKeyedArchiver) M:Foundation.NSKeyedArchiverDelegate_Extensions.ReplacingObject(Foundation.INSKeyedArchiverDelegate,Foundation.NSKeyedArchiver,Foundation.NSObject,Foundation.NSObject) M:Foundation.NSKeyedArchiverDelegate_Extensions.WillEncode(Foundation.INSKeyedArchiverDelegate,Foundation.NSKeyedArchiver,Foundation.NSObject) -M:Foundation.NSKeyedArchiverDelegate.EncodedObject(Foundation.NSKeyedArchiver,Foundation.NSObject) -M:Foundation.NSKeyedArchiverDelegate.Finished(Foundation.NSKeyedArchiver) -M:Foundation.NSKeyedArchiverDelegate.Finishing(Foundation.NSKeyedArchiver) -M:Foundation.NSKeyedArchiverDelegate.ReplacingObject(Foundation.NSKeyedArchiver,Foundation.NSObject,Foundation.NSObject) -M:Foundation.NSKeyedArchiverDelegate.WillEncode(Foundation.NSKeyedArchiver,Foundation.NSObject) M:Foundation.NSKeyedUnarchiver.add_Finished(System.EventHandler) M:Foundation.NSKeyedUnarchiver.add_Finishing(System.EventHandler) M:Foundation.NSKeyedUnarchiver.add_ReplacingObject(System.EventHandler{Foundation.NSArchiveReplaceEventArgs}) @@ -35837,11 +33649,6 @@ M:Foundation.NSKeyedUnarchiverDelegate_Extensions.DecodedObject(Foundation.INSKe M:Foundation.NSKeyedUnarchiverDelegate_Extensions.Finished(Foundation.INSKeyedUnarchiverDelegate,Foundation.NSKeyedUnarchiver) M:Foundation.NSKeyedUnarchiverDelegate_Extensions.Finishing(Foundation.INSKeyedUnarchiverDelegate,Foundation.NSKeyedUnarchiver) M:Foundation.NSKeyedUnarchiverDelegate_Extensions.ReplacingObject(Foundation.INSKeyedUnarchiverDelegate,Foundation.NSKeyedUnarchiver,Foundation.NSObject,Foundation.NSObject) -M:Foundation.NSKeyedUnarchiverDelegate.CannotDecodeClass(Foundation.NSKeyedUnarchiver,System.String,System.String[]) -M:Foundation.NSKeyedUnarchiverDelegate.DecodedObject(Foundation.NSKeyedUnarchiver,Foundation.NSObject) -M:Foundation.NSKeyedUnarchiverDelegate.Finished(Foundation.NSKeyedUnarchiver) -M:Foundation.NSKeyedUnarchiverDelegate.Finishing(Foundation.NSKeyedUnarchiver) -M:Foundation.NSKeyedUnarchiverDelegate.ReplacingObject(Foundation.NSKeyedUnarchiver,Foundation.NSObject,Foundation.NSObject) M:Foundation.NSKeyValueSharedObserverRegistration_NSObject.SetSharedObservers(Foundation.NSObject,Foundation.NSKeyValueSharedObserversSnapshot) M:Foundation.NSKeyValueSharedObservers.#ctor(System.Type) M:Foundation.NSKeyValueSorting_NSMutableOrderedSet.SortUsingDescriptors(Foundation.NSMutableOrderedSet,Foundation.NSSortDescriptor[]) @@ -35849,33 +33656,15 @@ M:Foundation.NSKeyValueSorting_NSOrderedSet.GetSortedArray(Foundation.NSOrderedS M:Foundation.NSLinguisticAnalysis.EnumerateLinguisticTags(Foundation.NSString,Foundation.NSRange,Foundation.NSLinguisticTagScheme,Foundation.NSLinguisticTaggerOptions,Foundation.NSOrthography,Foundation.NSEnumerateLinguisticTagsEnumerator) M:Foundation.NSLinguisticAnalysis.GetLinguisticTags(Foundation.NSString,Foundation.NSRange,Foundation.NSLinguisticTagScheme,Foundation.NSLinguisticTaggerOptions,Foundation.NSOrthography,Foundation.NSValue[]@) M:Foundation.NSLoadFromHtmlResult.#ctor(Foundation.NSAttributedString,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:Foundation.NSLocale.Copy(Foundation.NSZone) -M:Foundation.NSLocale.EncodeTo(Foundation.NSCoder) M:Foundation.NSLocale.GetCountryCodeDisplayName(System.String) M:Foundation.NSLocale.GetCurrencyCodeDisplayName(System.String) M:Foundation.NSLocale.GetIdentifierDisplayName(System.String) M:Foundation.NSLocale.GetLanguageCodeDisplayName(System.String) -M:Foundation.NSLocalizedNumberFormatRule.Copy(Foundation.NSZone) -M:Foundation.NSLocalizedNumberFormatRule.EncodeTo(Foundation.NSCoder) -M:Foundation.NSLock.Lock -M:Foundation.NSLock.Unlock M:Foundation.NSMachPort.Dispose(System.Boolean) M:Foundation.NSMachPortDelegate_Extensions.MachMessageReceived(Foundation.INSMachPortDelegate,System.IntPtr) -M:Foundation.NSMachPortDelegate.MachMessageReceived(System.IntPtr) -M:Foundation.NSMeasurement`1.Copy(Foundation.NSZone) -M:Foundation.NSMeasurement`1.EncodeTo(Foundation.NSCoder) -M:Foundation.NSMeasurementFormatter.EncodeTo(Foundation.NSCoder) M:Foundation.NSMetadataQuery.Dispose(System.Boolean) M:Foundation.NSMetadataQueryDelegate_Extensions.ReplacementObjectForResultObject(Foundation.INSMetadataQueryDelegate,Foundation.NSMetadataQuery,Foundation.NSMetadataItem) M:Foundation.NSMetadataQueryDelegate_Extensions.ReplacementValueForAttributevalue(Foundation.INSMetadataQueryDelegate,Foundation.NSMetadataQuery,System.String,Foundation.NSObject) -M:Foundation.NSMetadataQueryDelegate.ReplacementObjectForResultObject(Foundation.NSMetadataQuery,Foundation.NSMetadataItem) -M:Foundation.NSMetadataQueryDelegate.ReplacementValueForAttributevalue(Foundation.NSMetadataQuery,System.String,Foundation.NSObject) -M:Foundation.NSMorphology.Copy(Foundation.NSZone) -M:Foundation.NSMorphology.EncodeTo(Foundation.NSCoder) -M:Foundation.NSMorphologyCustomPronoun.Copy(Foundation.NSZone) -M:Foundation.NSMorphologyCustomPronoun.EncodeTo(Foundation.NSCoder) -M:Foundation.NSMorphologyPronoun.Copy(Foundation.NSZone) -M:Foundation.NSMorphologyPronoun.EncodeTo(Foundation.NSCoder) M:Foundation.NSMutableArray`1.#ctor M:Foundation.NSMutableArray`1.#ctor(`0[]) M:Foundation.NSMutableArray`1.#ctor(Foundation.NSCoder) @@ -35887,12 +33676,9 @@ M:Foundation.NSMutableArray`1.IndexOf(`0) M:Foundation.NSMutableArray`1.Insert(`0,System.IntPtr) M:Foundation.NSMutableArray`1.InsertObjects(`0[],Foundation.NSIndexSet) M:Foundation.NSMutableArray`1.ReplaceObject(System.IntPtr,`0) -M:Foundation.NSMutableAttributedString.#ctor(Foundation.NSAttributedString) M:Foundation.NSMutableAttributedString.#ctor(System.String,CoreText.CTStringAttributes) -M:Foundation.NSMutableAttributedString.#ctor(System.String,Foundation.NSDictionary) M:Foundation.NSMutableAttributedString.#ctor(System.String,UIKit.UIFont,UIKit.UIColor,UIKit.UIColor,UIKit.UIColor,UIKit.NSParagraphStyle,Foundation.NSLigatureType,System.Single,Foundation.NSUnderlineStyle,UIKit.NSShadow,System.Single,Foundation.NSUnderlineStyle) M:Foundation.NSMutableAttributedString.#ctor(System.String,UIKit.UIStringAttributes) -M:Foundation.NSMutableAttributedString.#ctor(System.String) M:Foundation.NSMutableAttributedString.AddAttributes(AppKit.NSStringAttributes,Foundation.NSRange) M:Foundation.NSMutableAttributedString.AddAttributes(CoreText.CTStringAttributes,Foundation.NSRange) M:Foundation.NSMutableAttributedString.AddAttributes(UIKit.UIStringAttributes,Foundation.NSRange) @@ -35906,17 +33692,10 @@ M:Foundation.NSMutableAttributedString.ReadFromUrl(Foundation.NSUrl,Foundation.N M:Foundation.NSMutableAttributedString.SetAttributes(CoreText.CTStringAttributes,Foundation.NSRange) M:Foundation.NSMutableAttributedString.SetAttributes(Foundation.NSDictionary,Foundation.NSRange) M:Foundation.NSMutableAttributedString.SetAttributes(UIKit.UIStringAttributes,Foundation.NSRange) -M:Foundation.NSMutableCopying.Copy(Foundation.NSZone) -M:Foundation.NSMutableCopying.MutableCopy(Foundation.NSZone) M:Foundation.NSMutableData.AppendBytes(System.Byte[],System.IntPtr,System.IntPtr) M:Foundation.NSMutableData.AppendBytes(System.Byte[]) -M:Foundation.NSMutableData.Create -M:Foundation.NSMutableDictionary.#ctor(Foundation.NSDictionary,System.Boolean) -M:Foundation.NSMutableDictionary.#ctor(Foundation.NSDictionary) M:Foundation.NSMutableDictionary.Add(Foundation.NSObject,Foundation.NSObject) M:Foundation.NSMutableDictionary.Clear -M:Foundation.NSMutableDictionary.FromDictionary(Foundation.NSDictionary) -M:Foundation.NSMutableDictionary.FromObjectAndKey(Foundation.NSObject,Foundation.NSObject) M:Foundation.NSMutableDictionary.FromObjectsAndKeys(Foundation.NSObject[],Foundation.NSObject[],System.IntPtr) M:Foundation.NSMutableDictionary.FromObjectsAndKeys(Foundation.NSObject[],Foundation.NSObject[]) M:Foundation.NSMutableDictionary.FromObjectsAndKeys(System.Object[],System.Object[],System.IntPtr) @@ -35945,13 +33724,7 @@ M:Foundation.NSMutableDictionary`2.ObjectForKey(`0) M:Foundation.NSMutableDictionary`2.ObjectsForKeys(`0[],`1) M:Foundation.NSMutableDictionary`2.Remove(`0) M:Foundation.NSMutableDictionary`2.TryGetValue(`0,.TValue@) -M:Foundation.NSMutableIndexSet.#ctor(Foundation.NSIndexSet) -M:Foundation.NSMutableIndexSet.#ctor(System.UIntPtr) -M:Foundation.NSMutableIndexSet.EncodeTo(Foundation.NSCoder) -M:Foundation.NSMutableOrderedSet.#ctor(Foundation.NSObject) M:Foundation.NSMutableOrderedSet.#ctor(Foundation.NSObject[]) -M:Foundation.NSMutableOrderedSet.#ctor(Foundation.NSOrderedSet) -M:Foundation.NSMutableOrderedSet.#ctor(Foundation.NSSet) M:Foundation.NSMutableOrderedSet.#ctor(System.Object[]) M:Foundation.NSMutableOrderedSet.#ctor(System.String[]) M:Foundation.NSMutableOrderedSet`1.#ctor @@ -35977,9 +33750,7 @@ M:Foundation.NSMutableOrderedSet`1.RemoveObject(`0) M:Foundation.NSMutableOrderedSet`1.RemoveObjects(`0[]) M:Foundation.NSMutableOrderedSet`1.Replace(System.IntPtr,`0) M:Foundation.NSMutableOrderedSet`1.ReplaceObjects(Foundation.NSIndexSet,`0[]) -M:Foundation.NSMutableSet.#ctor(Foundation.NSArray) M:Foundation.NSMutableSet.#ctor(Foundation.NSObject[]) -M:Foundation.NSMutableSet.#ctor(Foundation.NSSet) M:Foundation.NSMutableSet.#ctor(System.String[]) M:Foundation.NSMutableSet.op_Addition(Foundation.NSMutableSet,Foundation.NSMutableSet) M:Foundation.NSMutableSet.op_Subtraction(Foundation.NSMutableSet,Foundation.NSMutableSet) @@ -35998,9 +33769,6 @@ M:Foundation.NSMutableSet`1.op_Subtraction(Foundation.NSMutableSet{`0},Foundatio M:Foundation.NSMutableSet`1.Remove(`0) M:Foundation.NSMutableSet`1.ToArray M:Foundation.NSMutableString.ApplyTransform(Foundation.NSStringTransform,System.Boolean,Foundation.NSRange,Foundation.NSRange@) -M:Foundation.NSMutableString.EncodeTo(Foundation.NSCoder) -M:Foundation.NSMutableUrlRequest.#ctor(Foundation.NSUrl,Foundation.NSUrlRequestCachePolicy,System.Double) -M:Foundation.NSMutableUrlRequest.#ctor(Foundation.NSUrl) M:Foundation.NSNetDomainEventArgs.#ctor(System.String,System.Boolean) M:Foundation.NSNetService.add_AddressResolved(System.EventHandler) M:Foundation.NSNetService.add_DidAcceptConnection(System.EventHandler{Foundation.NSNetServiceConnectionEventArgs}) @@ -36047,13 +33815,6 @@ M:Foundation.NSNetServiceBrowserDelegate_Extensions.NotSearched(Foundation.INSNe M:Foundation.NSNetServiceBrowserDelegate_Extensions.SearchStarted(Foundation.INSNetServiceBrowserDelegate,Foundation.NSNetServiceBrowser) M:Foundation.NSNetServiceBrowserDelegate_Extensions.SearchStopped(Foundation.INSNetServiceBrowserDelegate,Foundation.NSNetServiceBrowser) M:Foundation.NSNetServiceBrowserDelegate_Extensions.ServiceRemoved(Foundation.INSNetServiceBrowserDelegate,Foundation.NSNetServiceBrowser,Foundation.NSNetService,System.Boolean) -M:Foundation.NSNetServiceBrowserDelegate.DomainRemoved(Foundation.NSNetServiceBrowser,System.String,System.Boolean) -M:Foundation.NSNetServiceBrowserDelegate.FoundDomain(Foundation.NSNetServiceBrowser,System.String,System.Boolean) -M:Foundation.NSNetServiceBrowserDelegate.FoundService(Foundation.NSNetServiceBrowser,Foundation.NSNetService,System.Boolean) -M:Foundation.NSNetServiceBrowserDelegate.NotSearched(Foundation.NSNetServiceBrowser,Foundation.NSDictionary) -M:Foundation.NSNetServiceBrowserDelegate.SearchStarted(Foundation.NSNetServiceBrowser) -M:Foundation.NSNetServiceBrowserDelegate.SearchStopped(Foundation.NSNetServiceBrowser) -M:Foundation.NSNetServiceBrowserDelegate.ServiceRemoved(Foundation.NSNetServiceBrowser,Foundation.NSNetService,System.Boolean) M:Foundation.NSNetServiceConnectionEventArgs.#ctor(Foundation.NSInputStream,Foundation.NSOutputStream) M:Foundation.NSNetServiceDataEventArgs.#ctor(Foundation.NSData) M:Foundation.NSNetServiceDelegate_Extensions.AddressResolved(Foundation.INSNetServiceDelegate,Foundation.NSNetService) @@ -36065,26 +33826,13 @@ M:Foundation.NSNetServiceDelegate_Extensions.Stopped(Foundation.INSNetServiceDel M:Foundation.NSNetServiceDelegate_Extensions.UpdatedTxtRecordData(Foundation.INSNetServiceDelegate,Foundation.NSNetService,Foundation.NSData) M:Foundation.NSNetServiceDelegate_Extensions.WillPublish(Foundation.INSNetServiceDelegate,Foundation.NSNetService) M:Foundation.NSNetServiceDelegate_Extensions.WillResolve(Foundation.INSNetServiceDelegate,Foundation.NSNetService) -M:Foundation.NSNetServiceDelegate.AddressResolved(Foundation.NSNetService) -M:Foundation.NSNetServiceDelegate.DidAcceptConnection(Foundation.NSNetService,Foundation.NSInputStream,Foundation.NSOutputStream) -M:Foundation.NSNetServiceDelegate.Published(Foundation.NSNetService) -M:Foundation.NSNetServiceDelegate.PublishFailure(Foundation.NSNetService,Foundation.NSDictionary) -M:Foundation.NSNetServiceDelegate.ResolveFailure(Foundation.NSNetService,Foundation.NSDictionary) -M:Foundation.NSNetServiceDelegate.Stopped(Foundation.NSNetService) -M:Foundation.NSNetServiceDelegate.UpdatedTxtRecordData(Foundation.NSNetService,Foundation.NSData) -M:Foundation.NSNetServiceDelegate.WillPublish(Foundation.NSNetService) -M:Foundation.NSNetServiceDelegate.WillResolve(Foundation.NSNetService) M:Foundation.NSNetServiceErrorEventArgs.#ctor(Foundation.NSDictionary) M:Foundation.NSNetServiceEventArgs.#ctor(Foundation.NSNetService,System.Boolean) -M:Foundation.NSNotification.Copy(Foundation.NSZone) -M:Foundation.NSNotification.EncodeTo(Foundation.NSCoder) M:Foundation.NSNotificationCenter.AddObserver(Foundation.NSString,System.Action{Foundation.NSNotification},Foundation.NSObject) M:Foundation.NSNotificationCenter.AddObserver(Foundation.NSString,System.Action{Foundation.NSNotification}) M:Foundation.NSNotificationCenter.RemoveObservers(System.Collections.Generic.IEnumerable{Foundation.NSObject}) M:Foundation.NSNotificationEventArgs.#ctor(Foundation.NSNotification) M:Foundation.NSNotificationQueue.EnqueueNotification(Foundation.NSNotification,Foundation.NSPostingStyle,Foundation.NSNotificationCoalescing,Foundation.NSRunLoopMode[]) -M:Foundation.NSNull.Copy(Foundation.NSZone) -M:Foundation.NSNull.EncodeTo(Foundation.NSCoder) M:Foundation.NSNull.RunAction(System.String,Foundation.NSObject,Foundation.NSDictionary) M:Foundation.NSNumber.#ctor(System.Runtime.InteropServices.NFloat) M:Foundation.NSNumber.CompareTo(Foundation.NSNumber) @@ -36118,7 +33866,6 @@ M:Foundation.NSNumber.op_Implicit(System.UInt16)~Foundation.NSNumber M:Foundation.NSNumber.op_Implicit(System.UInt32)~Foundation.NSNumber M:Foundation.NSNumber.op_Implicit(System.UInt64)~Foundation.NSNumber M:Foundation.NSNumber.ToString -M:Foundation.NSObject.#ctor M:Foundation.NSObject.#ctor(Foundation.NSObjectFlag) M:Foundation.NSObject.AddObserver(Foundation.NSObject,System.String,Foundation.NSKeyValueObservingOptions,System.IntPtr) M:Foundation.NSObject.AddObserver(Foundation.NSString,Foundation.NSKeyValueObservingOptions,System.Action{Foundation.NSObservedChange}) @@ -36130,7 +33877,6 @@ M:Foundation.NSObject.Bind(Foundation.NSString,Foundation.NSObject,System.String M:Foundation.NSObject.CommitEditing M:Foundation.NSObject.CommitEditing(Foundation.NSObject,ObjCRuntime.Selector,System.IntPtr) M:Foundation.NSObject.ConformsToProtocol(ObjCRuntime.NativeHandle) -M:Foundation.NSObject.Copy M:Foundation.NSObject.DangerousAutorelease M:Foundation.NSObject.DangerousRelease M:Foundation.NSObject.DangerousRetain @@ -36182,12 +33928,9 @@ M:Foundation.NSOrderedSet.#ctor(Foundation.NSObject[]) M:Foundation.NSOrderedSet.#ctor(System.Object[]) M:Foundation.NSOrderedSet.#ctor(System.String[]) M:Foundation.NSOrderedSet.Contains(System.Object) -M:Foundation.NSOrderedSet.Copy(Foundation.NSZone) -M:Foundation.NSOrderedSet.EncodeTo(Foundation.NSCoder) M:Foundation.NSOrderedSet.Equals(System.Object) M:Foundation.NSOrderedSet.GetHashCode M:Foundation.NSOrderedSet.MakeNSOrderedSet``1(`0[]) -M:Foundation.NSOrderedSet.MutableCopy(Foundation.NSZone) M:Foundation.NSOrderedSet.op_Addition(Foundation.NSOrderedSet,Foundation.NSOrderedSet) M:Foundation.NSOrderedSet.op_Addition(Foundation.NSOrderedSet,Foundation.NSSet) M:Foundation.NSOrderedSet.op_Equality(Foundation.NSOrderedSet,Foundation.NSOrderedSet) @@ -36216,24 +33959,13 @@ M:Foundation.NSOrderedSet`1.op_Inequality(Foundation.NSOrderedSet{`0},Foundation M:Foundation.NSOrderedSet`1.op_Subtraction(Foundation.NSOrderedSet{`0},Foundation.NSOrderedSet{`0}) M:Foundation.NSOrderedSet`1.op_Subtraction(Foundation.NSOrderedSet{`0},Foundation.NSSet{`0}) M:Foundation.NSOrderedSet`1.ToArray -M:Foundation.NSOrthography.Copy(Foundation.NSZone) -M:Foundation.NSOrthography.EncodeTo(Foundation.NSCoder) -M:Foundation.NSOutputStream.GetProperty(Foundation.NSString) -M:Foundation.NSOutputStream.SetProperty(Foundation.NSObject,Foundation.NSString) M:Foundation.NSOutputStream.Write(System.Byte[],System.Int32,System.UIntPtr) M:Foundation.NSOutputStream.Write(System.Byte[],System.UIntPtr) M:Foundation.NSOutputStream.Write(System.Byte[]) -M:Foundation.NSPersonNameComponents.Copy(Foundation.NSZone) -M:Foundation.NSPersonNameComponents.EncodeTo(Foundation.NSCoder) -M:Foundation.NSPort.Copy(Foundation.NSZone) M:Foundation.NSPort.Dispose(System.Boolean) -M:Foundation.NSPort.EncodeTo(Foundation.NSCoder) M:Foundation.NSPort.RemoveFromRunLoop(Foundation.NSRunLoop,Foundation.NSRunLoopMode) M:Foundation.NSPort.ScheduleInRunLoop(Foundation.NSRunLoop,Foundation.NSRunLoopMode) M:Foundation.NSPortDelegate_Extensions.MessageReceived(Foundation.INSPortDelegate,Foundation.NSPortMessage) -M:Foundation.NSPortDelegate.MessageReceived(Foundation.NSPortMessage) -M:Foundation.NSPredicate.Copy(Foundation.NSZone) -M:Foundation.NSPredicate.EncodeTo(Foundation.NSCoder) M:Foundation.NSPredicate.FromFormat(System.String,Foundation.NSObject) M:Foundation.NSPredicate.FromFormat(System.String,Foundation.NSObject[]) M:Foundation.NSPredicate.FromFormat(System.String) @@ -36243,8 +33975,6 @@ M:Foundation.NSPredicateSupport_NSMutableOrderedSet.FilterUsingPredicate(Foundat M:Foundation.NSPredicateSupport_NSMutableSet.FilterUsingPredicate(Foundation.NSMutableSet,Foundation.NSPredicate) M:Foundation.NSPredicateSupport_NSOrderedSet.FilterUsingPredicate(Foundation.NSOrderedSet,Foundation.NSPredicate) M:Foundation.NSPredicateSupport_NSSet.FilterUsingPredicate(Foundation.NSSet,Foundation.NSPredicate) -M:Foundation.NSPresentationIntent.Copy(Foundation.NSZone) -M:Foundation.NSPresentationIntent.EncodeTo(Foundation.NSCoder) M:Foundation.NSProcessInfo_NSUserInformation.GetFullUserName(Foundation.NSProcessInfo) M:Foundation.NSProcessInfo_NSUserInformation.GetUserName(Foundation.NSProcessInfo) M:Foundation.NSProgress.AcknowledgeWithSuccess(System.Boolean) @@ -36257,21 +33987,11 @@ M:Foundation.NSPropertyListSerialization.DataWithPropertyList(Foundation.NSObjec M:Foundation.NSPropertyListSerialization.PropertyListWithData(Foundation.NSData,Foundation.NSPropertyListFormat@,Foundation.NSError@) M:Foundation.NSPropertyListSerialization.PropertyListWithStream(Foundation.NSInputStream,Foundation.NSPropertyListFormat@,Foundation.NSError@) M:Foundation.NSPropertyListSerialization.WritePropertyList(Foundation.NSObject,Foundation.NSOutputStream,Foundation.NSPropertyListFormat,Foundation.NSError@) -M:Foundation.NSPurgeableData.BeginContentAccess -M:Foundation.NSPurgeableData.Copy(Foundation.NSZone) -M:Foundation.NSPurgeableData.DiscardContentIfPossible -M:Foundation.NSPurgeableData.EncodeTo(Foundation.NSCoder) -M:Foundation.NSPurgeableData.EndContentAccess -M:Foundation.NSPurgeableData.MutableCopy(Foundation.NSZone) M:Foundation.NSRange.#ctor(System.IntPtr,System.IntPtr) M:Foundation.NSRange.Equals(Foundation.NSRange) M:Foundation.NSRange.Equals(System.Object) M:Foundation.NSRange.GetHashCode M:Foundation.NSRange.ToString -M:Foundation.NSRecursiveLock.Lock -M:Foundation.NSRecursiveLock.Unlock -M:Foundation.NSRegularExpression.Copy(Foundation.NSZone) -M:Foundation.NSRegularExpression.EncodeTo(Foundation.NSCoder) M:Foundation.NSRunLoop.AcceptInputForMode(Foundation.NSRunLoopMode,Foundation.NSDate) M:Foundation.NSRunLoop.AddTimer(Foundation.NSTimer,Foundation.NSRunLoopMode) M:Foundation.NSRunLoop.LimitDateForMode(Foundation.NSRunLoopMode) @@ -36280,13 +34000,11 @@ M:Foundation.NSRunLoop.RunUntil(Foundation.NSRunLoopMode,Foundation.NSDate) M:Foundation.NSRunLoop.Stop M:Foundation.NSRunLoop.WakeUp M:Foundation.NSRunLoopModeExtensions.GetConstants(Foundation.NSRunLoopMode[]) -M:Foundation.NSScriptCommand.EncodeTo(Foundation.NSCoder) M:Foundation.NSScriptCommandArgumentDescription.#ctor M:Foundation.NSScriptCommandArgumentDescription.#ctor(Foundation.NSDictionary) M:Foundation.NSScriptCommandArgumentDescription.#ctor(System.String,System.String,System.String,System.Boolean) M:Foundation.NSScriptCommandDescription.Create(System.String,System.String,Foundation.NSScriptCommandDescriptionDictionary) M:Foundation.NSScriptCommandDescription.CreateCommand -M:Foundation.NSScriptCommandDescription.EncodeTo(Foundation.NSCoder) M:Foundation.NSScriptCommandDescription.GetAppleEventCodeForArgument(System.String) M:Foundation.NSScriptCommandDescription.GetTypeForArgument(System.String) M:Foundation.NSScriptCommandDescription.IsOptionalArgument(System.String) @@ -36301,10 +34019,7 @@ M:Foundation.NSSet.#ctor(Foundation.NSObject[]) M:Foundation.NSSet.#ctor(System.Object[]) M:Foundation.NSSet.#ctor(System.String[]) M:Foundation.NSSet.Contains(System.Object) -M:Foundation.NSSet.Copy(Foundation.NSZone) -M:Foundation.NSSet.EncodeTo(Foundation.NSCoder) M:Foundation.NSSet.MakeNSObjectSet``1(`0[]) -M:Foundation.NSSet.MutableCopy(Foundation.NSZone) M:Foundation.NSSet.op_Addition(Foundation.NSSet,Foundation.NSOrderedSet) M:Foundation.NSSet.op_Addition(Foundation.NSSet,Foundation.NSSet) M:Foundation.NSSet.op_Subtraction(Foundation.NSSet,Foundation.NSOrderedSet) @@ -36320,8 +34035,6 @@ M:Foundation.NSSet`1.LookupMember(`0) M:Foundation.NSSet`1.op_Addition(Foundation.NSSet{`0},Foundation.NSSet{`0}) M:Foundation.NSSet`1.op_Subtraction(Foundation.NSSet{`0},Foundation.NSSet{`0}) M:Foundation.NSSet`1.ToArray -M:Foundation.NSSortDescriptor.Copy(Foundation.NSZone) -M:Foundation.NSSortDescriptor.EncodeTo(Foundation.NSCoder) M:Foundation.NSSortDescriptorSorting_NSMutableArray.SortUsingDescriptors(Foundation.NSMutableArray,Foundation.NSSortDescriptor[]) M:Foundation.NSStream.add_OnEvent(System.EventHandler{Foundation.NSStreamEventArgs}) M:Foundation.NSStream.CreateBoundPair(Foundation.NSInputStream@,Foundation.NSOutputStream@,System.IntPtr) @@ -36333,14 +34046,12 @@ M:Foundation.NSStream.remove_OnEvent(System.EventHandler{Foundation.NSStreamEven M:Foundation.NSStream.Schedule(Foundation.NSRunLoop,Foundation.NSRunLoopMode) M:Foundation.NSStream.Unschedule(Foundation.NSRunLoop,Foundation.NSRunLoopMode) M:Foundation.NSStreamDelegate_Extensions.HandleEvent(Foundation.INSStreamDelegate,Foundation.NSStream,Foundation.NSStreamEvent) -M:Foundation.NSStreamDelegate.HandleEvent(Foundation.NSStream,Foundation.NSStreamEvent) M:Foundation.NSStreamEventArgs.#ctor(Foundation.NSStreamEvent) M:Foundation.NSStreamSocksOptions.#ctor M:Foundation.NSString.#ctor(System.String,System.Int32,System.Int32) M:Foundation.NSString.#ctor(System.String) M:Foundation.NSString.BoundingRectWithSize(CoreGraphics.CGSize,Foundation.NSStringDrawingOptions,Foundation.NSDictionary) M:Foundation.NSString.CompareTo(Foundation.NSString) -M:Foundation.NSString.Copy(Foundation.NSZone) M:Foundation.NSString.CreateNative(System.String,System.Boolean) M:Foundation.NSString.CreateNative(System.String,System.Int32,System.Int32,System.Boolean) M:Foundation.NSString.CreateNative(System.String,System.Int32,System.Int32) @@ -36349,27 +34060,22 @@ M:Foundation.NSString.DrawString(CoreGraphics.CGPoint,Foundation.NSDictionary) M:Foundation.NSString.DrawString(CoreGraphics.CGRect,Foundation.NSDictionary) M:Foundation.NSString.DrawString(CoreGraphics.CGRect,Foundation.NSStringDrawingOptions,Foundation.NSDictionary) M:Foundation.NSString.Encode(Foundation.NSStringEncoding,System.Boolean) -M:Foundation.NSString.EncodeTo(Foundation.NSCoder) M:Foundation.NSString.Equals(Foundation.NSString,Foundation.NSString) M:Foundation.NSString.Equals(System.Object) M:Foundation.NSString.FromData(Foundation.NSData,Foundation.NSStringEncoding) M:Foundation.NSString.GetHashCode -M:Foundation.NSString.GetItemProviderVisibilityForTypeIdentifier(System.String) M:Foundation.NSString.GetLocalizedUserNotificationString(Foundation.NSString,Foundation.NSObject[]) -M:Foundation.NSString.GetObject(Foundation.NSData,System.String,Foundation.NSError@) M:Foundation.NSString.GetPasteboardPropertyListForType(System.String) M:Foundation.NSString.GetReadableTypesForPasteboard(AppKit.NSPasteboard) M:Foundation.NSString.GetReadingOptionsForType(System.String,AppKit.NSPasteboard) M:Foundation.NSString.GetWritableTypesForPasteboard(AppKit.NSPasteboard) M:Foundation.NSString.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) M:Foundation.NSString.IsEqualTo(System.IntPtr) -M:Foundation.NSString.LoadData(System.String,System.Action{Foundation.NSData,Foundation.NSError}) M:Foundation.NSString.LoadDataAsync(System.String,Foundation.NSProgress@) M:Foundation.NSString.LoadDataAsync(System.String) M:Foundation.NSString.LocalizedFormat(Foundation.NSString,Foundation.NSObject[]) M:Foundation.NSString.LocalizedFormat(Foundation.NSString,System.Object[]) M:Foundation.NSString.LocalizedFormat(System.String,System.Object[]) -M:Foundation.NSString.MutableCopy(Foundation.NSZone) M:Foundation.NSString.op_Equality(Foundation.NSString,Foundation.NSString) M:Foundation.NSString.op_Explicit(System.String)~Foundation.NSString M:Foundation.NSString.op_Implicit(Foundation.NSString)~System.String @@ -36378,13 +34084,9 @@ M:Foundation.NSString.ReleaseNative(ObjCRuntime.NativeHandle) M:Foundation.NSString.StringSize(Foundation.NSDictionary) M:Foundation.NSString.ToString M:Foundation.NSString.TransliterateString(Foundation.NSStringTransform,System.Boolean) -M:Foundation.NSTermOfAddress.Copy(Foundation.NSZone) -M:Foundation.NSTermOfAddress.EncodeTo(Foundation.NSCoder) M:Foundation.NSTextCheckingAddressComponents.#ctor M:Foundation.NSTextCheckingAddressComponents.#ctor(Foundation.NSDictionary) M:Foundation.NSTextCheckingResult.AddressCheckingResult(Foundation.NSRange,Foundation.NSTextCheckingAddressComponents) -M:Foundation.NSTextCheckingResult.Copy(Foundation.NSZone) -M:Foundation.NSTextCheckingResult.EncodeTo(Foundation.NSCoder) M:Foundation.NSTextCheckingResult.TransitInformationCheckingResult(Foundation.NSRange,Foundation.NSTextCheckingTransitComponents) M:Foundation.NSTextCheckingTransitComponents.#ctor M:Foundation.NSTextCheckingTransitComponents.#ctor(Foundation.NSDictionary) @@ -36399,8 +34101,6 @@ M:Foundation.NSTimer.CreateScheduledTimer(System.TimeSpan,System.Action{Foundati M:Foundation.NSTimer.CreateTimer(System.Double,System.Action{Foundation.NSTimer}) M:Foundation.NSTimer.CreateTimer(System.TimeSpan,System.Action{Foundation.NSTimer}) M:Foundation.NSTimer.Dispose(System.Boolean) -M:Foundation.NSTimeZone.Copy(Foundation.NSZone) -M:Foundation.NSTimeZone.EncodeTo(Foundation.NSCoder) M:Foundation.NSTimeZone.ToString M:Foundation.NSUbiquitousKeyValueStore.SetArray(System.String,Foundation.NSObject[]) M:Foundation.NSUbiquitousKeyValueStore.SetBool(System.String,System.Boolean) @@ -36411,71 +34111,18 @@ M:Foundation.NSUbiquitousKeyValueStore.SetLong(System.String,System.Int64) M:Foundation.NSUbiquitousKeyValueStore.SetString(System.String,System.String) M:Foundation.NSUbiquitousKeyValueStoreChangeEventArgs.#ctor(Foundation.NSNotification) M:Foundation.NSUndoManagerCloseUndoGroupEventArgs.#ctor(Foundation.NSNotification) -M:Foundation.NSUnit.Copy(Foundation.NSZone) -M:Foundation.NSUnit.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitAcceleration.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitAcceleration.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitAngle.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitAngle.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitArea.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitArea.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitConcentrationMass.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitConcentrationMass.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitConverterLinear.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitDispersion.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitDispersion.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitDuration.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitDuration.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitElectricCharge.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitElectricCharge.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitElectricCurrent.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitElectricCurrent.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitElectricPotentialDifference.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitElectricPotentialDifference.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitElectricResistance.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitElectricResistance.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitEnergy.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitEnergy.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitFrequency.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitFrequency.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitFuelEfficiency.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitFuelEfficiency.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitIlluminance.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitIlluminance.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitInformationStorage.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitInformationStorage.#ctor(System.String) -M:Foundation.NSUnitInformationStorage.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitLength.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitLength.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitMass.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitMass.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitPower.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitPower.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitPressure.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitPressure.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitSpeed.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitSpeed.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitTemperature.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitTemperature.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUnitVolume.#ctor(System.String,Foundation.NSUnitConverter) -M:Foundation.NSUnitVolume.EncodeTo(Foundation.NSCoder) M:Foundation.NSUrl_PromisedItems.CheckPromisedItemIsReachable(Foundation.NSUrl,Foundation.NSError@) M:Foundation.NSUrl_PromisedItems.GetPromisedItemResourceValue(Foundation.NSUrl,Foundation.NSObject@,Foundation.NSString,Foundation.NSError@) M:Foundation.NSUrl_PromisedItems.GetPromisedItemResourceValues(Foundation.NSUrl,Foundation.NSString[],Foundation.NSError@) M:Foundation.NSUrl.#ctor(System.String,System.String) -M:Foundation.NSUrl.Copy(Foundation.NSZone) -M:Foundation.NSUrl.EncodeTo(Foundation.NSCoder) M:Foundation.NSUrl.Equals(Foundation.NSUrl) M:Foundation.NSUrl.FromFilename(System.String) M:Foundation.NSUrl.FromPasteboard(AppKit.NSPasteboard) -M:Foundation.NSUrl.GetItemProviderVisibilityForTypeIdentifier(System.String) -M:Foundation.NSUrl.GetObject(Foundation.NSData,System.String,Foundation.NSError@) M:Foundation.NSUrl.GetPasteboardPropertyListForType(System.String) M:Foundation.NSUrl.GetReadableTypesForPasteboard(AppKit.NSPasteboard) M:Foundation.NSUrl.GetReadingOptionsForType(System.String,AppKit.NSPasteboard) M:Foundation.NSUrl.GetWritableTypesForPasteboard(AppKit.NSPasteboard) M:Foundation.NSUrl.GetWritingOptionsForType(System.String,AppKit.NSPasteboard) -M:Foundation.NSUrl.LoadData(System.String,System.Action{Foundation.NSData,Foundation.NSError}) M:Foundation.NSUrl.LoadDataAsync(System.String,Foundation.NSProgress@) M:Foundation.NSUrl.LoadDataAsync(System.String) M:Foundation.NSUrl.MakeRelative(System.String) @@ -36490,19 +34137,12 @@ M:Foundation.NSUrl.TryGetResource(Foundation.NSString,Foundation.NSObject@,Found M:Foundation.NSUrl.TryGetResource(Foundation.NSString,Foundation.NSObject@) M:Foundation.NSUrl.WriteToPasteboard(AppKit.NSPasteboard) M:Foundation.NSUrlAsyncResult.#ctor(Foundation.NSUrlResponse,Foundation.NSData) -M:Foundation.NSUrlAuthenticationChallenge.EncodeTo(Foundation.NSCoder) M:Foundation.NSUrlAuthenticationChallengeSender_Extensions.PerformDefaultHandling(Foundation.INSUrlAuthenticationChallengeSender,Foundation.NSUrlAuthenticationChallenge) M:Foundation.NSUrlAuthenticationChallengeSender_Extensions.RejectProtectionSpaceAndContinue(Foundation.INSUrlAuthenticationChallengeSender,Foundation.NSUrlAuthenticationChallenge) M:Foundation.NSUrlCache.GetCachedResponseAsync(Foundation.NSUrlSessionDataTask) -M:Foundation.NSUrlComponents.Copy(Foundation.NSZone) -M:Foundation.NSUrlConnection.CancelAuthenticationChallenge(Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlConnection.ContinueWithoutCredential(Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlConnection.PerformDefaultHandling(Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlConnection.RejectProtectionSpaceAndContinue(Foundation.NSUrlAuthenticationChallenge) M:Foundation.NSUrlConnection.Schedule(Foundation.NSRunLoop,Foundation.NSRunLoopMode) M:Foundation.NSUrlConnection.SendRequestAsync(Foundation.NSUrlRequest,Foundation.NSOperationQueue) M:Foundation.NSUrlConnection.Unschedule(Foundation.NSRunLoop,Foundation.NSRunLoopMode) -M:Foundation.NSUrlConnection.UseCredential(Foundation.NSUrlCredential,Foundation.NSUrlAuthenticationChallenge) M:Foundation.NSUrlConnectionDataDelegate_Extensions.FinishedLoading(Foundation.INSUrlConnectionDataDelegate,Foundation.NSUrlConnection) M:Foundation.NSUrlConnectionDataDelegate_Extensions.NeedNewBodyStream(Foundation.INSUrlConnectionDataDelegate,Foundation.NSUrlConnection,Foundation.NSUrlRequest) M:Foundation.NSUrlConnectionDataDelegate_Extensions.ReceivedData(Foundation.INSUrlConnectionDataDelegate,Foundation.NSUrlConnection,Foundation.NSData) @@ -36510,33 +34150,15 @@ M:Foundation.NSUrlConnectionDataDelegate_Extensions.ReceivedResponse(Foundation. M:Foundation.NSUrlConnectionDataDelegate_Extensions.SentBodyData(Foundation.INSUrlConnectionDataDelegate,Foundation.NSUrlConnection,System.IntPtr,System.IntPtr,System.IntPtr) M:Foundation.NSUrlConnectionDataDelegate_Extensions.WillCacheResponse(Foundation.INSUrlConnectionDataDelegate,Foundation.NSUrlConnection,Foundation.NSCachedUrlResponse) M:Foundation.NSUrlConnectionDataDelegate_Extensions.WillSendRequest(Foundation.INSUrlConnectionDataDelegate,Foundation.NSUrlConnection,Foundation.NSUrlRequest,Foundation.NSUrlResponse) -M:Foundation.NSUrlConnectionDataDelegate.FinishedLoading(Foundation.NSUrlConnection) -M:Foundation.NSUrlConnectionDataDelegate.NeedNewBodyStream(Foundation.NSUrlConnection,Foundation.NSUrlRequest) -M:Foundation.NSUrlConnectionDataDelegate.ReceivedData(Foundation.NSUrlConnection,Foundation.NSData) -M:Foundation.NSUrlConnectionDataDelegate.ReceivedResponse(Foundation.NSUrlConnection,Foundation.NSUrlResponse) -M:Foundation.NSUrlConnectionDataDelegate.SentBodyData(Foundation.NSUrlConnection,System.IntPtr,System.IntPtr,System.IntPtr) -M:Foundation.NSUrlConnectionDataDelegate.WillCacheResponse(Foundation.NSUrlConnection,Foundation.NSCachedUrlResponse) -M:Foundation.NSUrlConnectionDataDelegate.WillSendRequest(Foundation.NSUrlConnection,Foundation.NSUrlRequest,Foundation.NSUrlResponse) M:Foundation.NSUrlConnectionDelegate_Extensions.CanAuthenticateAgainstProtectionSpace(Foundation.INSUrlConnectionDelegate,Foundation.NSUrlConnection,Foundation.NSUrlProtectionSpace) M:Foundation.NSUrlConnectionDelegate_Extensions.CanceledAuthenticationChallenge(Foundation.INSUrlConnectionDelegate,Foundation.NSUrlConnection,Foundation.NSUrlAuthenticationChallenge) M:Foundation.NSUrlConnectionDelegate_Extensions.ConnectionShouldUseCredentialStorage(Foundation.INSUrlConnectionDelegate,Foundation.NSUrlConnection) M:Foundation.NSUrlConnectionDelegate_Extensions.FailedWithError(Foundation.INSUrlConnectionDelegate,Foundation.NSUrlConnection,Foundation.NSError) M:Foundation.NSUrlConnectionDelegate_Extensions.ReceivedAuthenticationChallenge(Foundation.INSUrlConnectionDelegate,Foundation.NSUrlConnection,Foundation.NSUrlAuthenticationChallenge) M:Foundation.NSUrlConnectionDelegate_Extensions.WillSendRequestForAuthenticationChallenge(Foundation.INSUrlConnectionDelegate,Foundation.NSUrlConnection,Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlConnectionDelegate.CanAuthenticateAgainstProtectionSpace(Foundation.NSUrlConnection,Foundation.NSUrlProtectionSpace) -M:Foundation.NSUrlConnectionDelegate.CanceledAuthenticationChallenge(Foundation.NSUrlConnection,Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlConnectionDelegate.ConnectionShouldUseCredentialStorage(Foundation.NSUrlConnection) -M:Foundation.NSUrlConnectionDelegate.FailedWithError(Foundation.NSUrlConnection,Foundation.NSError) -M:Foundation.NSUrlConnectionDelegate.ReceivedAuthenticationChallenge(Foundation.NSUrlConnection,Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlConnectionDelegate.WillSendRequestForAuthenticationChallenge(Foundation.NSUrlConnection,Foundation.NSUrlAuthenticationChallenge) M:Foundation.NSUrlConnectionDownloadDelegate_Extensions.ResumedDownloading(Foundation.INSUrlConnectionDownloadDelegate,Foundation.NSUrlConnection,System.Int64,System.Int64) M:Foundation.NSUrlConnectionDownloadDelegate_Extensions.WroteData(Foundation.INSUrlConnectionDownloadDelegate,Foundation.NSUrlConnection,System.Int64,System.Int64,System.Int64) -M:Foundation.NSUrlConnectionDownloadDelegate.FinishedDownloading(Foundation.NSUrlConnection,Foundation.NSUrl) -M:Foundation.NSUrlConnectionDownloadDelegate.ResumedDownloading(Foundation.NSUrlConnection,System.Int64,System.Int64) -M:Foundation.NSUrlConnectionDownloadDelegate.WroteData(Foundation.NSUrlConnection,System.Int64,System.Int64,System.Int64) M:Foundation.NSUrlCredential.#ctor(Security.SecIdentity,Security.SecCertificate[],Foundation.NSUrlCredentialPersistence) -M:Foundation.NSUrlCredential.Copy(Foundation.NSZone) -M:Foundation.NSUrlCredential.EncodeTo(Foundation.NSCoder) M:Foundation.NSUrlCredential.FromIdentityCertificatesPersistance(Security.SecIdentity,Security.SecCertificate[],Foundation.NSUrlCredentialPersistence) M:Foundation.NSUrlCredential.FromTrust(Security.SecTrust) M:Foundation.NSUrlCredentialStorage.GetCredentialsAsync(Foundation.NSUrlProtectionSpace,Foundation.NSUrlSessionTask) @@ -36554,30 +34176,9 @@ M:Foundation.NSUrlDownloadDelegate_Extensions.ReceivedData(Foundation.INSUrlDown M:Foundation.NSUrlDownloadDelegate_Extensions.ReceivedResponse(Foundation.INSUrlDownloadDelegate,Foundation.NSUrlDownload,Foundation.NSUrlResponse) M:Foundation.NSUrlDownloadDelegate_Extensions.Resume(Foundation.INSUrlDownloadDelegate,Foundation.NSUrlDownload,Foundation.NSUrlResponse,System.Int64) M:Foundation.NSUrlDownloadDelegate_Extensions.WillSendRequest(Foundation.INSUrlDownloadDelegate,Foundation.NSUrlDownload,Foundation.NSUrlRequest,Foundation.NSUrlResponse) -M:Foundation.NSUrlDownloadDelegate.CanceledAuthenticationChallenge(Foundation.NSUrlDownload,Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlDownloadDelegate.CreatedDestination(Foundation.NSUrlDownload,System.String) -M:Foundation.NSUrlDownloadDelegate.DecideDestination(Foundation.NSUrlDownload,System.String) -M:Foundation.NSUrlDownloadDelegate.DecodeSourceData(Foundation.NSUrlDownload,System.String) -M:Foundation.NSUrlDownloadDelegate.DownloadBegan(Foundation.NSUrlDownload) -M:Foundation.NSUrlDownloadDelegate.FailedWithError(Foundation.NSUrlDownload,Foundation.NSError) -M:Foundation.NSUrlDownloadDelegate.Finished(Foundation.NSUrlDownload) -M:Foundation.NSUrlDownloadDelegate.ReceivedAuthenticationChallenge(Foundation.NSUrlDownload,Foundation.NSUrlAuthenticationChallenge) -M:Foundation.NSUrlDownloadDelegate.ReceivedData(Foundation.NSUrlDownload,System.UIntPtr) -M:Foundation.NSUrlDownloadDelegate.ReceivedResponse(Foundation.NSUrlDownload,Foundation.NSUrlResponse) -M:Foundation.NSUrlDownloadDelegate.Resume(Foundation.NSUrlDownload,Foundation.NSUrlResponse,System.Int64) -M:Foundation.NSUrlDownloadDelegate.WillSendRequest(Foundation.NSUrlDownload,Foundation.NSUrlRequest,Foundation.NSUrlResponse) M:Foundation.NSUrlProtectionSpace.#ctor(System.String,System.Int32,System.String,System.String,System.String,System.Boolean) M:Foundation.NSUrlProtectionSpace.#ctor(System.String,System.Int32,System.String,System.String,System.String) -M:Foundation.NSUrlProtectionSpace.Copy(Foundation.NSZone) -M:Foundation.NSUrlProtectionSpace.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUrlQueryItem.Copy(Foundation.NSZone) -M:Foundation.NSUrlQueryItem.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUrlRequest.Copy(Foundation.NSZone) -M:Foundation.NSUrlRequest.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUrlRequest.MutableCopy(Foundation.NSZone) M:Foundation.NSUrlRequest.ToString -M:Foundation.NSUrlResponse.Copy(Foundation.NSZone) -M:Foundation.NSUrlResponse.EncodeTo(Foundation.NSCoder) M:Foundation.NSUrlSession.CreateDataTaskAsync(Foundation.NSUrl,Foundation.NSUrlSessionDataTask@) M:Foundation.NSUrlSession.CreateDataTaskAsync(Foundation.NSUrl) M:Foundation.NSUrlSession.CreateDataTaskAsync(Foundation.NSUrlRequest,Foundation.NSUrlSessionDataTask@) @@ -36602,7 +34203,6 @@ M:Foundation.NSUrlSession.ResetAsync M:Foundation.NSUrlSessionActiveTasks.#ctor(Foundation.NSUrlSessionTask[],Foundation.NSUrlSessionTask[],Foundation.NSUrlSessionTask[]) M:Foundation.NSUrlSessionCombinedTasks.#ctor(Foundation.NSUrlSessionTask[]) M:Foundation.NSUrlSessionConfiguration.BackgroundSessionConfiguration(System.String) -M:Foundation.NSUrlSessionConfiguration.Copy(Foundation.NSZone) M:Foundation.NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(System.String) M:Foundation.NSUrlSessionConfiguration.Dispose(System.Boolean) M:Foundation.NSUrlSessionDataDelegate_Extensions.DidBecomeDownloadTask(Foundation.INSUrlSessionDataDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSUrlSessionDownloadTask) @@ -36610,23 +34210,12 @@ M:Foundation.NSUrlSessionDataDelegate_Extensions.DidBecomeStreamTask(Foundation. M:Foundation.NSUrlSessionDataDelegate_Extensions.DidReceiveData(Foundation.INSUrlSessionDataDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSData) M:Foundation.NSUrlSessionDataDelegate_Extensions.DidReceiveResponse(Foundation.INSUrlSessionDataDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSUrlResponse,System.Action{Foundation.NSUrlSessionResponseDisposition}) M:Foundation.NSUrlSessionDataDelegate_Extensions.WillCacheResponse(Foundation.INSUrlSessionDataDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSCachedUrlResponse,System.Action{Foundation.NSCachedUrlResponse}) -M:Foundation.NSUrlSessionDataDelegate.DidBecomeDownloadTask(Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSUrlSessionDownloadTask) -M:Foundation.NSUrlSessionDataDelegate.DidBecomeStreamTask(Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSUrlSessionStreamTask) -M:Foundation.NSUrlSessionDataDelegate.DidReceiveData(Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSData) -M:Foundation.NSUrlSessionDataDelegate.DidReceiveResponse(Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSUrlResponse,System.Action{Foundation.NSUrlSessionResponseDisposition}) -M:Foundation.NSUrlSessionDataDelegate.WillCacheResponse(Foundation.NSUrlSession,Foundation.NSUrlSessionDataTask,Foundation.NSCachedUrlResponse,System.Action{Foundation.NSCachedUrlResponse}) M:Foundation.NSUrlSessionDataTaskRequest.#ctor(Foundation.NSData,Foundation.NSUrlResponse) M:Foundation.NSUrlSessionDelegate_Extensions.DidBecomeInvalid(Foundation.INSUrlSessionDelegate,Foundation.NSUrlSession,Foundation.NSError) M:Foundation.NSUrlSessionDelegate_Extensions.DidFinishEventsForBackgroundSession(Foundation.INSUrlSessionDelegate,Foundation.NSUrlSession) M:Foundation.NSUrlSessionDelegate_Extensions.DidReceiveChallenge(Foundation.INSUrlSessionDelegate,Foundation.NSUrlSession,Foundation.NSUrlAuthenticationChallenge,System.Action{Foundation.NSUrlSessionAuthChallengeDisposition,Foundation.NSUrlCredential}) -M:Foundation.NSUrlSessionDelegate.DidBecomeInvalid(Foundation.NSUrlSession,Foundation.NSError) -M:Foundation.NSUrlSessionDelegate.DidFinishEventsForBackgroundSession(Foundation.NSUrlSession) -M:Foundation.NSUrlSessionDelegate.DidReceiveChallenge(Foundation.NSUrlSession,Foundation.NSUrlAuthenticationChallenge,System.Action{Foundation.NSUrlSessionAuthChallengeDisposition,Foundation.NSUrlCredential}) M:Foundation.NSUrlSessionDownloadDelegate_Extensions.DidResume(Foundation.INSUrlSessionDownloadDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionDownloadTask,System.Int64,System.Int64) M:Foundation.NSUrlSessionDownloadDelegate_Extensions.DidWriteData(Foundation.INSUrlSessionDownloadDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionDownloadTask,System.Int64,System.Int64,System.Int64) -M:Foundation.NSUrlSessionDownloadDelegate.DidFinishDownloading(Foundation.NSUrlSession,Foundation.NSUrlSessionDownloadTask,Foundation.NSUrl) -M:Foundation.NSUrlSessionDownloadDelegate.DidResume(Foundation.NSUrlSession,Foundation.NSUrlSessionDownloadTask,System.Int64,System.Int64) -M:Foundation.NSUrlSessionDownloadDelegate.DidWriteData(Foundation.NSUrlSession,Foundation.NSUrlSessionDownloadTask,System.Int64,System.Int64,System.Int64) M:Foundation.NSUrlSessionDownloadTaskRequest.#ctor(Foundation.NSUrl,Foundation.NSUrlResponse) M:Foundation.NSUrlSessionDownloadTaskRequest.Dispose M:Foundation.NSUrlSessionDownloadTaskRequest.Dispose(System.Boolean) @@ -36640,13 +34229,8 @@ M:Foundation.NSUrlSessionStreamDelegate_Extensions.BetterRouteDiscovered(Foundat M:Foundation.NSUrlSessionStreamDelegate_Extensions.CompletedTaskCaptureStreams(Foundation.INSUrlSessionStreamDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionStreamTask,Foundation.NSInputStream,Foundation.NSOutputStream) M:Foundation.NSUrlSessionStreamDelegate_Extensions.ReadClosed(Foundation.INSUrlSessionStreamDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionStreamTask) M:Foundation.NSUrlSessionStreamDelegate_Extensions.WriteClosed(Foundation.INSUrlSessionStreamDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionStreamTask) -M:Foundation.NSUrlSessionStreamDelegate.BetterRouteDiscovered(Foundation.NSUrlSession,Foundation.NSUrlSessionStreamTask) -M:Foundation.NSUrlSessionStreamDelegate.CompletedTaskCaptureStreams(Foundation.NSUrlSession,Foundation.NSUrlSessionStreamTask,Foundation.NSInputStream,Foundation.NSOutputStream) -M:Foundation.NSUrlSessionStreamDelegate.ReadClosed(Foundation.NSUrlSession,Foundation.NSUrlSessionStreamTask) -M:Foundation.NSUrlSessionStreamDelegate.WriteClosed(Foundation.NSUrlSession,Foundation.NSUrlSessionStreamTask) M:Foundation.NSUrlSessionStreamTask.ReadDataAsync(System.UIntPtr,System.UIntPtr,System.Double) M:Foundation.NSUrlSessionStreamTask.WriteDataAsync(Foundation.NSData,System.Double) -M:Foundation.NSUrlSessionTask.Copy(Foundation.NSZone) M:Foundation.NSUrlSessionTaskDelegate_Extensions.DidCompleteWithError(Foundation.INSUrlSessionTaskDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSError) M:Foundation.NSUrlSessionTaskDelegate_Extensions.DidCreateTask(Foundation.INSUrlSessionTaskDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionTask) M:Foundation.NSUrlSessionTaskDelegate_Extensions.DidFinishCollectingMetrics(Foundation.INSUrlSessionTaskDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlSessionTaskMetrics) @@ -36658,23 +34242,10 @@ M:Foundation.NSUrlSessionTaskDelegate_Extensions.NeedNewBodyStream(Foundation.IN M:Foundation.NSUrlSessionTaskDelegate_Extensions.TaskIsWaitingForConnectivity(Foundation.INSUrlSessionTaskDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionTask) M:Foundation.NSUrlSessionTaskDelegate_Extensions.WillBeginDelayedRequest(Foundation.INSUrlSessionTaskDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlRequest,System.Action{Foundation.NSUrlSessionDelayedRequestDisposition,Foundation.NSUrlRequest}) M:Foundation.NSUrlSessionTaskDelegate_Extensions.WillPerformHttpRedirection(Foundation.INSUrlSessionTaskDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSHttpUrlResponse,Foundation.NSUrlRequest,System.Action{Foundation.NSUrlRequest}) -M:Foundation.NSUrlSessionTaskDelegate.DidCompleteWithError(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSError) -M:Foundation.NSUrlSessionTaskDelegate.DidCreateTask(Foundation.NSUrlSession,Foundation.NSUrlSessionTask) -M:Foundation.NSUrlSessionTaskDelegate.DidFinishCollectingMetrics(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlSessionTaskMetrics) -M:Foundation.NSUrlSessionTaskDelegate.DidReceiveChallenge(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlAuthenticationChallenge,System.Action{Foundation.NSUrlSessionAuthChallengeDisposition,Foundation.NSUrlCredential}) -M:Foundation.NSUrlSessionTaskDelegate.DidReceiveInformationalResponse(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSHttpUrlResponse) -M:Foundation.NSUrlSessionTaskDelegate.DidSendBodyData(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,System.Int64,System.Int64,System.Int64) -M:Foundation.NSUrlSessionTaskDelegate.NeedNewBodyStream(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,System.Action{Foundation.NSInputStream}) -M:Foundation.NSUrlSessionTaskDelegate.NeedNewBodyStream(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,System.Int64,System.Action{Foundation.NSInputStream}) -M:Foundation.NSUrlSessionTaskDelegate.TaskIsWaitingForConnectivity(Foundation.NSUrlSession,Foundation.NSUrlSessionTask) -M:Foundation.NSUrlSessionTaskDelegate.WillBeginDelayedRequest(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSUrlRequest,System.Action{Foundation.NSUrlSessionDelayedRequestDisposition,Foundation.NSUrlRequest}) -M:Foundation.NSUrlSessionTaskDelegate.WillPerformHttpRedirection(Foundation.NSUrlSession,Foundation.NSUrlSessionTask,Foundation.NSHttpUrlResponse,Foundation.NSUrlRequest,System.Action{Foundation.NSUrlRequest}) M:Foundation.NSUrlSessionUploadTask.CancelByProducingResumeDataAsync M:Foundation.NSUrlSessionUploadTaskResumeRequest.#ctor(Foundation.NSData,Foundation.NSUrlResponse) M:Foundation.NSUrlSessionWebSocketDelegate_Extensions.DidClose(Foundation.INSUrlSessionWebSocketDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionWebSocketTask,Foundation.NSUrlSessionWebSocketCloseCode,Foundation.NSData) M:Foundation.NSUrlSessionWebSocketDelegate_Extensions.DidOpen(Foundation.INSUrlSessionWebSocketDelegate,Foundation.NSUrlSession,Foundation.NSUrlSessionWebSocketTask,System.String) -M:Foundation.NSUrlSessionWebSocketDelegate.DidClose(Foundation.NSUrlSession,Foundation.NSUrlSessionWebSocketTask,Foundation.NSUrlSessionWebSocketCloseCode,Foundation.NSData) -M:Foundation.NSUrlSessionWebSocketDelegate.DidOpen(Foundation.NSUrlSession,Foundation.NSUrlSessionWebSocketTask,System.String) M:Foundation.NSUrlSessionWebSocketTask.ReceiveMessageAsync M:Foundation.NSUrlSessionWebSocketTask.SendMessageAsync(Foundation.NSUrlSessionWebSocketMessage) M:Foundation.NSUrlSessionWebSocketTask.SendPingAsync @@ -36686,24 +34257,15 @@ M:Foundation.NSUserActivity.DeleteAllSavedUserActivitiesAsync M:Foundation.NSUserActivity.DeleteSavedUserActivitiesAsync(System.String[]) M:Foundation.NSUserActivity.Dispose(System.Boolean) M:Foundation.NSUserActivity.GetContinuationStreamsAsync -M:Foundation.NSUserActivity.GetItemProviderVisibilityForTypeIdentifier(System.String) -M:Foundation.NSUserActivity.GetObject(Foundation.NSData,System.String,Foundation.NSError@) -M:Foundation.NSUserActivity.LoadData(System.String,System.Action{Foundation.NSData,Foundation.NSError}) M:Foundation.NSUserActivity.LoadDataAsync(System.String,Foundation.NSProgress@) M:Foundation.NSUserActivity.LoadDataAsync(System.String) M:Foundation.NSUserActivityContinuation.#ctor(Foundation.NSInputStream,Foundation.NSOutputStream) M:Foundation.NSUserActivityDelegate_Extensions.UserActivityReceivedData(Foundation.INSUserActivityDelegate,Foundation.NSUserActivity,Foundation.NSInputStream,Foundation.NSOutputStream) M:Foundation.NSUserActivityDelegate_Extensions.UserActivityWasContinued(Foundation.INSUserActivityDelegate,Foundation.NSUserActivity) M:Foundation.NSUserActivityDelegate_Extensions.UserActivityWillSave(Foundation.INSUserActivityDelegate,Foundation.NSUserActivity) -M:Foundation.NSUserActivityDelegate.UserActivityReceivedData(Foundation.NSUserActivity,Foundation.NSInputStream,Foundation.NSOutputStream) -M:Foundation.NSUserActivityDelegate.UserActivityWasContinued(Foundation.NSUserActivity) -M:Foundation.NSUserActivityDelegate.UserActivityWillSave(Foundation.NSUserActivity) M:Foundation.NSUserDefaults.#ctor(System.String,Foundation.NSUserDefaultsType) M:Foundation.NSUserDefaults.#ctor(System.String) M:Foundation.NSUserDefaults.SetString(System.String,System.String) -M:Foundation.NSUserNotification.Copy(Foundation.NSZone) -M:Foundation.NSUserNotification.EncodeTo(Foundation.NSCoder) -M:Foundation.NSUserNotificationAction.Copy(Foundation.NSZone) M:Foundation.NSUserNotificationCenter.add_DidActivateNotification(System.EventHandler{Foundation.UNCDidActivateNotificationEventArgs}) M:Foundation.NSUserNotificationCenter.add_DidDeliverNotification(System.EventHandler{Foundation.UNCDidDeliverNotificationEventArgs}) M:Foundation.NSUserNotificationCenter.Dispose(System.Boolean) @@ -36712,15 +34274,8 @@ M:Foundation.NSUserNotificationCenter.remove_DidDeliverNotification(System.Event M:Foundation.NSUserNotificationCenterDelegate_Extensions.DidActivateNotification(Foundation.INSUserNotificationCenterDelegate,Foundation.NSUserNotificationCenter,Foundation.NSUserNotification) M:Foundation.NSUserNotificationCenterDelegate_Extensions.DidDeliverNotification(Foundation.INSUserNotificationCenterDelegate,Foundation.NSUserNotificationCenter,Foundation.NSUserNotification) M:Foundation.NSUserNotificationCenterDelegate_Extensions.ShouldPresentNotification(Foundation.INSUserNotificationCenterDelegate,Foundation.NSUserNotificationCenter,Foundation.NSUserNotification) -M:Foundation.NSUserNotificationCenterDelegate.DidActivateNotification(Foundation.NSUserNotificationCenter,Foundation.NSUserNotification) -M:Foundation.NSUserNotificationCenterDelegate.DidDeliverNotification(Foundation.NSUserNotificationCenter,Foundation.NSUserNotification) -M:Foundation.NSUserNotificationCenterDelegate.ShouldPresentNotification(Foundation.NSUserNotificationCenter,Foundation.NSUserNotification) M:Foundation.NSUuid.#ctor(System.Byte[]) -M:Foundation.NSUuid.Copy(Foundation.NSZone) -M:Foundation.NSUuid.EncodeTo(Foundation.NSCoder) M:Foundation.NSUuid.GetBytes -M:Foundation.NSValue.Copy(Foundation.NSZone) -M:Foundation.NSValue.EncodeTo(Foundation.NSCoder) M:Foundation.NSValue.FromCATransform3D(CoreAnimation.CATransform3D) M:Foundation.NSValue.FromCGAffineTransform(CoreGraphics.CGAffineTransform) M:Foundation.NSValue.FromCGVector(CoreGraphics.CGVector) @@ -36747,8 +34302,6 @@ M:Foundation.NSXpcInterface.GetAllowedClasses(System.Reflection.MethodInfo,Syste M:Foundation.NSXpcInterface.SetAllowedClasses(System.Reflection.MethodInfo,Foundation.NSSet{ObjCRuntime.Class},System.UIntPtr,System.Boolean) M:Foundation.NSXpcListener.Dispose(System.Boolean) M:Foundation.NSXpcListenerDelegate_Extensions.ShouldAcceptConnection(Foundation.INSXpcListenerDelegate,Foundation.NSXpcListener,Foundation.NSXpcConnection) -M:Foundation.NSXpcListenerDelegate.ShouldAcceptConnection(Foundation.NSXpcListener,Foundation.NSXpcConnection) -M:Foundation.NSXpcListenerEndpoint.EncodeTo(Foundation.NSCoder) M:Foundation.OptionalMemberAttribute.#ctor M:Foundation.OutletAttribute.#ctor M:Foundation.OutletAttribute.#ctor(System.String) @@ -36874,7 +34427,6 @@ M:GameKit.GKAchievementViewController.add_DidFinish(System.EventHandler) M:GameKit.GKAchievementViewController.Dispose(System.Boolean) M:GameKit.GKAchievementViewController.GKAchievementViewControllerAppearance.#ctor(System.IntPtr) M:GameKit.GKAchievementViewController.remove_DidFinish(System.EventHandler) -M:GameKit.GKAchievementViewControllerDelegate.DidFinish(GameKit.GKAchievementViewController) M:GameKit.GKCategoryResult.#ctor(System.String[],System.String[]) M:GameKit.GKChallenge.EncodeTo(Foundation.NSCoder) M:GameKit.GKChallenge.LoadReceivedChallengesAsync @@ -36899,24 +34451,12 @@ M:GameKit.GKChallengeEventHandlerDelegate_Extensions.RemotePlayerCompletedChalle M:GameKit.GKChallengeEventHandlerDelegate_Extensions.ShouldShowBannerForLocallyCompletedChallenge(GameKit.IGKChallengeEventHandlerDelegate,GameKit.GKChallenge) M:GameKit.GKChallengeEventHandlerDelegate_Extensions.ShouldShowBannerForLocallyReceivedChallenge(GameKit.IGKChallengeEventHandlerDelegate,GameKit.GKChallenge) M:GameKit.GKChallengeEventHandlerDelegate_Extensions.ShouldShowBannerForRemotelyCompletedChallenge(GameKit.IGKChallengeEventHandlerDelegate,GameKit.GKChallenge) -M:GameKit.GKChallengeEventHandlerDelegate.LocalPlayerCompletedChallenge(GameKit.GKChallenge) -M:GameKit.GKChallengeEventHandlerDelegate.LocalPlayerReceivedChallenge(GameKit.GKChallenge) -M:GameKit.GKChallengeEventHandlerDelegate.LocalPlayerSelectedChallenge(GameKit.GKChallenge) -M:GameKit.GKChallengeEventHandlerDelegate.RemotePlayerCompletedChallenge(GameKit.GKChallenge) -M:GameKit.GKChallengeEventHandlerDelegate.ShouldShowBannerForLocallyCompletedChallenge(GameKit.GKChallenge) -M:GameKit.GKChallengeEventHandlerDelegate.ShouldShowBannerForLocallyReceivedChallenge(GameKit.GKChallenge) -M:GameKit.GKChallengeEventHandlerDelegate.ShouldShowBannerForRemotelyCompletedChallenge(GameKit.GKChallenge) M:GameKit.GKChallengeListener_Extensions.DidCompleteChallenge(GameKit.IGKChallengeListener,GameKit.GKPlayer,GameKit.GKChallenge,GameKit.GKPlayer) M:GameKit.GKChallengeListener_Extensions.DidReceiveChallenge(GameKit.IGKChallengeListener,GameKit.GKPlayer,GameKit.GKChallenge) M:GameKit.GKChallengeListener_Extensions.IssuedChallengeWasCompleted(GameKit.IGKChallengeListener,GameKit.GKPlayer,GameKit.GKChallenge,GameKit.GKPlayer) M:GameKit.GKChallengeListener_Extensions.WantsToPlayChallenge(GameKit.IGKChallengeListener,GameKit.GKPlayer,GameKit.GKChallenge) -M:GameKit.GKChallengeListener.DidCompleteChallenge(GameKit.GKPlayer,GameKit.GKChallenge,GameKit.GKPlayer) -M:GameKit.GKChallengeListener.DidReceiveChallenge(GameKit.GKPlayer,GameKit.GKChallenge) -M:GameKit.GKChallengeListener.IssuedChallengeWasCompleted(GameKit.GKPlayer,GameKit.GKChallenge,GameKit.GKPlayer) -M:GameKit.GKChallengeListener.WantsToPlayChallenge(GameKit.GKPlayer,GameKit.GKChallenge) M:GameKit.GKChallengesViewController.#ctor(System.String,Foundation.NSBundle) M:GameKit.GKChallengesViewController.Dispose(System.Boolean) -M:GameKit.GKChallengesViewControllerDelegate.DidFinish(GameKit.GKChallengesViewController) M:GameKit.GKDataEventArgs.#ctor(Foundation.NSData,System.String) M:GameKit.GKDataReceivedEventArgs.#ctor(Foundation.NSData,System.String,GameKit.GKSession) M:GameKit.GKDataReceivedForRecipientEventArgs.#ctor(Foundation.NSData,GameKit.GKPlayer,GameKit.GKPlayer) @@ -36930,8 +34470,6 @@ M:GameKit.GKFriendRequestComposeViewController.add_DidFinish(System.EventHandler M:GameKit.GKFriendRequestComposeViewController.Dispose(System.Boolean) M:GameKit.GKFriendRequestComposeViewController.GKFriendRequestComposeViewControllerAppearance.#ctor(System.IntPtr) M:GameKit.GKFriendRequestComposeViewController.remove_DidFinish(System.EventHandler) -M:GameKit.GKFriendRequestComposeViewControllerDelegate.DidFinish(GameKit.GKFriendRequestComposeViewController) -M:GameKit.GKGameCenterControllerDelegate.Finished(GameKit.GKGameCenterViewController) M:GameKit.GKGameCenterViewController.#ctor(System.String,Foundation.NSBundle) M:GameKit.GKGameCenterViewController.add_Finished(System.EventHandler) M:GameKit.GKGameCenterViewController.Dispose(System.Boolean) @@ -36955,14 +34493,10 @@ M:GameKit.GKGameSessionEventListener_Extensions.DidRemovePlayer(GameKit.IGKGameS M:GameKit.GKGameSessionEventListener_Extensions.DidSaveData(GameKit.IGKGameSessionEventListener,GameKit.GKGameSession,GameKit.GKCloudPlayer,Foundation.NSData) M:GameKit.GKGameSessionSharingViewController.#ctor(System.String,Foundation.NSBundle) M:GameKit.GKGameSessionSharingViewController.Dispose(System.Boolean) -M:GameKit.GKGameSessionSharingViewControllerDelegate.DidFinish(GameKit.GKGameSessionSharingViewController,Foundation.NSError) M:GameKit.GKIdentityVerificationSignatureResult.#ctor(Foundation.NSUrl,Foundation.NSData,Foundation.NSData,System.UInt64) M:GameKit.GKInviteEventListener_Extensions.DidAcceptInvite(GameKit.IGKInviteEventListener,GameKit.GKPlayer,GameKit.GKInvite) M:GameKit.GKInviteEventListener_Extensions.DidRequestMatch(GameKit.IGKInviteEventListener,GameKit.GKPlayer,GameKit.GKPlayer[]) M:GameKit.GKInviteEventListener_Extensions.DidRequestMatch(GameKit.IGKInviteEventListener,GameKit.GKPlayer,System.String[]) -M:GameKit.GKInviteEventListener.DidAcceptInvite(GameKit.GKPlayer,GameKit.GKInvite) -M:GameKit.GKInviteEventListener.DidRequestMatch(GameKit.GKPlayer,GameKit.GKPlayer[]) -M:GameKit.GKInviteEventListener.DidRequestMatch(GameKit.GKPlayer,System.String[]) M:GameKit.GKLeaderboard.LoadCategoriesAsync M:GameKit.GKLeaderboard.LoadEntriesAsync(GameKit.GKLeaderboardPlayerScope,GameKit.GKLeaderboardTimeScope,Foundation.NSRange) M:GameKit.GKLeaderboard.LoadEntriesAsync(GameKit.GKPlayer[],GameKit.GKLeaderboardTimeScope) @@ -36989,12 +34523,9 @@ M:GameKit.GKLeaderboardViewController.add_DidFinish(System.EventHandler) M:GameKit.GKLeaderboardViewController.Dispose(System.Boolean) M:GameKit.GKLeaderboardViewController.GKLeaderboardViewControllerAppearance.#ctor(System.IntPtr) M:GameKit.GKLeaderboardViewController.remove_DidFinish(System.EventHandler) -M:GameKit.GKLeaderboardViewControllerDelegate.DidFinish(GameKit.GKLeaderboardViewController) M:GameKit.GKLocalPlayer.AuthenticateAsync -M:GameKit.GKLocalPlayer.DidModifySavedGame(GameKit.GKPlayer,GameKit.GKSavedGame) M:GameKit.GKLocalPlayer.FetchItemsForIdentityVerificationSignatureAsync M:GameKit.GKLocalPlayer.GenerateIdentityVerificationSignatureAsync -M:GameKit.GKLocalPlayer.HasConflictingSavedGames(GameKit.GKPlayer,GameKit.GKSavedGame[]) M:GameKit.GKLocalPlayer.LoadChallengeableFriendsAsync M:GameKit.GKLocalPlayer.LoadDefaultLeaderboardCategoryIDAsync M:GameKit.GKLocalPlayer.LoadDefaultLeaderboardIdentifierAsync @@ -37006,22 +34537,6 @@ M:GameKit.GKLocalPlayer.LoadFriendsListAsync(System.String[]) M:GameKit.GKLocalPlayer.LoadRecentPlayersAsync M:GameKit.GKLocalPlayer.SetDefaultLeaderboardCategoryIDAsync(System.String) M:GameKit.GKLocalPlayer.SetDefaultLeaderboardIdentifierAsync(System.String) -M:GameKit.GKLocalPlayerListener.DidAcceptInvite(GameKit.GKPlayer,GameKit.GKInvite) -M:GameKit.GKLocalPlayerListener.DidCompleteChallenge(GameKit.GKPlayer,GameKit.GKChallenge,GameKit.GKPlayer) -M:GameKit.GKLocalPlayerListener.DidModifySavedGame(GameKit.GKPlayer,GameKit.GKSavedGame) -M:GameKit.GKLocalPlayerListener.DidReceiveChallenge(GameKit.GKPlayer,GameKit.GKChallenge) -M:GameKit.GKLocalPlayerListener.DidRequestMatch(GameKit.GKPlayer,GameKit.GKPlayer[]) -M:GameKit.GKLocalPlayerListener.DidRequestMatch(GameKit.GKPlayer,System.String[]) -M:GameKit.GKLocalPlayerListener.DidRequestMatchWithOtherPlayers(GameKit.GKPlayer,GameKit.GKPlayer[]) -M:GameKit.GKLocalPlayerListener.HasConflictingSavedGames(GameKit.GKPlayer,GameKit.GKSavedGame[]) -M:GameKit.GKLocalPlayerListener.IssuedChallengeWasCompleted(GameKit.GKPlayer,GameKit.GKChallenge,GameKit.GKPlayer) -M:GameKit.GKLocalPlayerListener.MatchEnded(GameKit.GKPlayer,GameKit.GKTurnBasedMatch) -M:GameKit.GKLocalPlayerListener.ReceivedExchangeCancellation(GameKit.GKPlayer,GameKit.GKTurnBasedExchange,GameKit.GKTurnBasedMatch) -M:GameKit.GKLocalPlayerListener.ReceivedExchangeReplies(GameKit.GKPlayer,GameKit.GKTurnBasedExchangeReply[],GameKit.GKTurnBasedExchange,GameKit.GKTurnBasedMatch) -M:GameKit.GKLocalPlayerListener.ReceivedExchangeRequest(GameKit.GKPlayer,GameKit.GKTurnBasedExchange,GameKit.GKTurnBasedMatch) -M:GameKit.GKLocalPlayerListener.ReceivedTurnEvent(GameKit.GKPlayer,GameKit.GKTurnBasedMatch,System.Boolean) -M:GameKit.GKLocalPlayerListener.WantsToPlayChallenge(GameKit.GKPlayer,GameKit.GKChallenge) -M:GameKit.GKLocalPlayerListener.WantsToQuitMatch(GameKit.GKPlayer,GameKit.GKTurnBasedMatch) M:GameKit.GKMatch.add_DataReceived(System.EventHandler{GameKit.GKDataEventArgs}) M:GameKit.GKMatch.add_DataReceivedForRecipient(System.EventHandler{GameKit.GKDataReceivedForRecipientEventArgs}) M:GameKit.GKMatch.add_DataReceivedFromPlayer(System.EventHandler{GameKit.GKMatchReceivedDataFromRemotePlayerEventArgs}) @@ -37047,14 +34562,6 @@ M:GameKit.GKMatchDelegate_Extensions.ShouldReinviteDisconnectedPlayer(GameKit.IG M:GameKit.GKMatchDelegate_Extensions.ShouldReinvitePlayer(GameKit.IGKMatchDelegate,GameKit.GKMatch,System.String) M:GameKit.GKMatchDelegate_Extensions.StateChanged(GameKit.IGKMatchDelegate,GameKit.GKMatch,System.String,GameKit.GKPlayerConnectionState) M:GameKit.GKMatchDelegate_Extensions.StateChangedForPlayer(GameKit.IGKMatchDelegate,GameKit.GKMatch,GameKit.GKPlayer,GameKit.GKPlayerConnectionState) -M:GameKit.GKMatchDelegate.DataReceived(GameKit.GKMatch,Foundation.NSData,System.String) -M:GameKit.GKMatchDelegate.DataReceivedForRecipient(GameKit.GKMatch,Foundation.NSData,GameKit.GKPlayer,GameKit.GKPlayer) -M:GameKit.GKMatchDelegate.DataReceivedFromPlayer(GameKit.GKMatch,Foundation.NSData,GameKit.GKPlayer) -M:GameKit.GKMatchDelegate.Failed(GameKit.GKMatch,Foundation.NSError) -M:GameKit.GKMatchDelegate.ShouldReinviteDisconnectedPlayer(GameKit.GKMatch,GameKit.GKPlayer) -M:GameKit.GKMatchDelegate.ShouldReinvitePlayer(GameKit.GKMatch,System.String) -M:GameKit.GKMatchDelegate.StateChanged(GameKit.GKMatch,System.String,GameKit.GKPlayerConnectionState) -M:GameKit.GKMatchDelegate.StateChangedForPlayer(GameKit.GKMatch,GameKit.GKPlayer,GameKit.GKPlayerConnectionState) M:GameKit.GKMatchEventArgs.#ctor(GameKit.GKMatch) M:GameKit.GKMatchmaker.AddPlayersAsync(GameKit.GKMatch,GameKit.GKMatchRequest) M:GameKit.GKMatchmaker.FindMatchAsync(GameKit.GKMatchRequest) @@ -37087,14 +34594,6 @@ M:GameKit.GKMatchmakerViewControllerDelegate_Extensions.DidFindPlayers(GameKit.I M:GameKit.GKMatchmakerViewControllerDelegate_Extensions.GetMatchProperties(GameKit.IGKMatchmakerViewControllerDelegate,GameKit.GKMatchmakerViewController,GameKit.GKPlayer,System.Action{Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}}) M:GameKit.GKMatchmakerViewControllerDelegate_Extensions.HostedPlayerDidAccept(GameKit.IGKMatchmakerViewControllerDelegate,GameKit.GKMatchmakerViewController,GameKit.GKPlayer) M:GameKit.GKMatchmakerViewControllerDelegate_Extensions.ReceivedAcceptFromHostedPlayer(GameKit.IGKMatchmakerViewControllerDelegate,GameKit.GKMatchmakerViewController,System.String) -M:GameKit.GKMatchmakerViewControllerDelegate.DidFailWithError(GameKit.GKMatchmakerViewController,Foundation.NSError) -M:GameKit.GKMatchmakerViewControllerDelegate.DidFindHostedPlayers(GameKit.GKMatchmakerViewController,GameKit.GKPlayer[]) -M:GameKit.GKMatchmakerViewControllerDelegate.DidFindMatch(GameKit.GKMatchmakerViewController,GameKit.GKMatch) -M:GameKit.GKMatchmakerViewControllerDelegate.DidFindPlayers(GameKit.GKMatchmakerViewController,System.String[]) -M:GameKit.GKMatchmakerViewControllerDelegate.GetMatchProperties(GameKit.GKMatchmakerViewController,GameKit.GKPlayer,System.Action{Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}}) -M:GameKit.GKMatchmakerViewControllerDelegate.HostedPlayerDidAccept(GameKit.GKMatchmakerViewController,GameKit.GKPlayer) -M:GameKit.GKMatchmakerViewControllerDelegate.ReceivedAcceptFromHostedPlayer(GameKit.GKMatchmakerViewController,System.String) -M:GameKit.GKMatchmakerViewControllerDelegate.WasCancelled(GameKit.GKMatchmakerViewController) M:GameKit.GKMatchmakingPlayerEventArgs.#ctor(GameKit.GKPlayer) M:GameKit.GKMatchmakingPlayersEventArgs.#ctor(GameKit.GKPlayer[]) M:GameKit.GKMatchReceivedDataFromRemotePlayerEventArgs.#ctor(Foundation.NSData,GameKit.GKPlayer) @@ -37128,8 +34627,6 @@ M:GameKit.GKSavedGame.Copy(Foundation.NSZone) M:GameKit.GKSavedGame.LoadDataAsync M:GameKit.GKSavedGameListener_Extensions.DidModifySavedGame(GameKit.IGKSavedGameListener,GameKit.GKPlayer,GameKit.GKSavedGame) M:GameKit.GKSavedGameListener_Extensions.HasConflictingSavedGames(GameKit.IGKSavedGameListener,GameKit.GKPlayer,GameKit.GKSavedGame[]) -M:GameKit.GKSavedGameListener.DidModifySavedGame(GameKit.GKPlayer,GameKit.GKSavedGame) -M:GameKit.GKSavedGameListener.HasConflictingSavedGames(GameKit.GKPlayer,GameKit.GKSavedGame[]) M:GameKit.GKScore.#ctor(System.String) M:GameKit.GKScore.ChallengeComposeControllerAsync(System.String,GameKit.GKPlayer[],AppKit.NSViewController@) M:GameKit.GKScore.ChallengeComposeControllerAsync(System.String,GameKit.GKPlayer[],UIKit.UIViewController@) @@ -37155,18 +34652,10 @@ M:GameKit.GKSessionDelegate_Extensions.FailedWithError(GameKit.IGKSessionDelegat M:GameKit.GKSessionDelegate_Extensions.PeerChangedState(GameKit.IGKSessionDelegate,GameKit.GKSession,System.String,GameKit.GKPeerConnectionState) M:GameKit.GKSessionDelegate_Extensions.PeerConnectionFailed(GameKit.IGKSessionDelegate,GameKit.GKSession,System.String,Foundation.NSError) M:GameKit.GKSessionDelegate_Extensions.PeerConnectionRequest(GameKit.IGKSessionDelegate,GameKit.GKSession,System.String) -M:GameKit.GKSessionDelegate.FailedWithError(GameKit.GKSession,Foundation.NSError) -M:GameKit.GKSessionDelegate.PeerChangedState(GameKit.GKSession,System.String,GameKit.GKPeerConnectionState) -M:GameKit.GKSessionDelegate.PeerConnectionFailed(GameKit.GKSession,System.String,Foundation.NSError) -M:GameKit.GKSessionDelegate.PeerConnectionRequest(GameKit.GKSession,System.String) M:GameKit.GKStateEventArgs.#ctor(System.String,GameKit.GKPlayerConnectionState) M:GameKit.GKTurnBasedEventHandler.Dispose(System.Boolean) M:GameKit.GKTurnBasedEventHandlerDelegate_Extensions.HandleMatchEnded(GameKit.IGKTurnBasedEventHandlerDelegate,GameKit.GKTurnBasedMatch) M:GameKit.GKTurnBasedEventHandlerDelegate_Extensions.HandleTurnEventForMatch(GameKit.IGKTurnBasedEventHandlerDelegate,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedEventHandlerDelegate.HandleInviteFromGameCenter(Foundation.NSString[]) -M:GameKit.GKTurnBasedEventHandlerDelegate.HandleMatchEnded(GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedEventHandlerDelegate.HandleTurnEvent(GameKit.GKTurnBasedMatch,System.Boolean) -M:GameKit.GKTurnBasedEventHandlerDelegate.HandleTurnEventForMatch(GameKit.GKTurnBasedMatch) M:GameKit.GKTurnBasedEventListener_Extensions.DidRequestMatchWithOtherPlayers(GameKit.IGKTurnBasedEventListener,GameKit.GKPlayer,GameKit.GKPlayer[]) M:GameKit.GKTurnBasedEventListener_Extensions.DidRequestMatchWithPlayers(GameKit.IGKTurnBasedEventListener,GameKit.GKPlayer,System.String[]) M:GameKit.GKTurnBasedEventListener_Extensions.MatchEnded(GameKit.IGKTurnBasedEventListener,GameKit.GKPlayer,GameKit.GKTurnBasedMatch) @@ -37175,14 +34664,6 @@ M:GameKit.GKTurnBasedEventListener_Extensions.ReceivedExchangeReplies(GameKit.IG M:GameKit.GKTurnBasedEventListener_Extensions.ReceivedExchangeRequest(GameKit.IGKTurnBasedEventListener,GameKit.GKPlayer,GameKit.GKTurnBasedExchange,GameKit.GKTurnBasedMatch) M:GameKit.GKTurnBasedEventListener_Extensions.ReceivedTurnEvent(GameKit.IGKTurnBasedEventListener,GameKit.GKPlayer,GameKit.GKTurnBasedMatch,System.Boolean) M:GameKit.GKTurnBasedEventListener_Extensions.WantsToQuitMatch(GameKit.IGKTurnBasedEventListener,GameKit.GKPlayer,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedEventListener.DidRequestMatchWithOtherPlayers(GameKit.GKPlayer,GameKit.GKPlayer[]) -M:GameKit.GKTurnBasedEventListener.DidRequestMatchWithPlayers(GameKit.GKPlayer,System.String[]) -M:GameKit.GKTurnBasedEventListener.MatchEnded(GameKit.GKPlayer,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedEventListener.ReceivedExchangeCancellation(GameKit.GKPlayer,GameKit.GKTurnBasedExchange,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedEventListener.ReceivedExchangeReplies(GameKit.GKPlayer,GameKit.GKTurnBasedExchangeReply[],GameKit.GKTurnBasedExchange,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedEventListener.ReceivedExchangeRequest(GameKit.GKPlayer,GameKit.GKTurnBasedExchange,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedEventListener.ReceivedTurnEvent(GameKit.GKPlayer,GameKit.GKTurnBasedMatch,System.Boolean) -M:GameKit.GKTurnBasedEventListener.WantsToQuitMatch(GameKit.GKPlayer,GameKit.GKTurnBasedMatch) M:GameKit.GKTurnBasedExchange.CancelAsync(System.String,Foundation.NSObject[]) M:GameKit.GKTurnBasedExchange.ReplyAsync(System.String,Foundation.NSObject[],Foundation.NSData) M:GameKit.GKTurnBasedExchange.ToString @@ -37212,23 +34693,12 @@ M:GameKit.GKTurnBasedMatchmakerViewController.Dispose(System.Boolean) M:GameKit.GKTurnBasedMatchmakerViewController.GKTurnBasedMatchmakerViewControllerAppearance.#ctor(System.IntPtr) M:GameKit.GKTurnBasedMatchmakerViewControllerDelegate_Extensions.FoundMatch(GameKit.IGKTurnBasedMatchmakerViewControllerDelegate,GameKit.GKTurnBasedMatchmakerViewController,GameKit.GKTurnBasedMatch) M:GameKit.GKTurnBasedMatchmakerViewControllerDelegate_Extensions.PlayerQuitForMatch(GameKit.IGKTurnBasedMatchmakerViewControllerDelegate,GameKit.GKTurnBasedMatchmakerViewController,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedMatchmakerViewControllerDelegate.FailedWithError(GameKit.GKTurnBasedMatchmakerViewController,Foundation.NSError) -M:GameKit.GKTurnBasedMatchmakerViewControllerDelegate.FoundMatch(GameKit.GKTurnBasedMatchmakerViewController,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedMatchmakerViewControllerDelegate.PlayerQuitForMatch(GameKit.GKTurnBasedMatchmakerViewController,GameKit.GKTurnBasedMatch) -M:GameKit.GKTurnBasedMatchmakerViewControllerDelegate.WasCancelled(GameKit.GKTurnBasedMatchmakerViewController) M:GameKit.GKVoiceChat.SetPlayerVoiceChatStateChangeHandler(System.Action{GameKit.GKPlayer,GameKit.GKVoiceChatPlayerState}) M:GameKit.GKVoiceChatClient_Extensions.FailedToConnect(GameKit.IGKVoiceChatClient,GameKit.GKVoiceChatService,System.String,Foundation.NSError) M:GameKit.GKVoiceChatClient_Extensions.ReceivedInvitation(GameKit.IGKVoiceChatClient,GameKit.GKVoiceChatService,System.String,System.IntPtr) M:GameKit.GKVoiceChatClient_Extensions.SendRealTimeData(GameKit.IGKVoiceChatClient,GameKit.GKVoiceChatService,Foundation.NSData,System.String) M:GameKit.GKVoiceChatClient_Extensions.Started(GameKit.IGKVoiceChatClient,GameKit.GKVoiceChatService,System.String) M:GameKit.GKVoiceChatClient_Extensions.Stopped(GameKit.IGKVoiceChatClient,GameKit.GKVoiceChatService,System.String,Foundation.NSError) -M:GameKit.GKVoiceChatClient.FailedToConnect(GameKit.GKVoiceChatService,System.String,Foundation.NSError) -M:GameKit.GKVoiceChatClient.ParticipantID -M:GameKit.GKVoiceChatClient.ReceivedInvitation(GameKit.GKVoiceChatService,System.String,System.IntPtr) -M:GameKit.GKVoiceChatClient.SendData(GameKit.GKVoiceChatService,Foundation.NSData,System.String) -M:GameKit.GKVoiceChatClient.SendRealTimeData(GameKit.GKVoiceChatService,Foundation.NSData,System.String) -M:GameKit.GKVoiceChatClient.Started(GameKit.GKVoiceChatService,System.String) -M:GameKit.GKVoiceChatClient.Stopped(GameKit.GKVoiceChatService,System.String,Foundation.NSError) M:GameKit.GKVoiceChatService.Dispose(System.Boolean) M:GameKit.IGKAchievementViewControllerDelegate.DidFinish(GameKit.GKAchievementViewController) M:GameKit.IGKChallengeEventHandlerDelegate.LocalPlayerCompletedChallenge(GameKit.GKChallenge) @@ -37304,313 +34774,66 @@ M:GameKit.IGKVoiceChatClient.Stopped(GameKit.GKVoiceChatService,System.String,Fo M:GameplayKit.GKAgent.Dispose(System.Boolean) M:GameplayKit.GKAgent.EncodeTo(Foundation.NSCoder) M:GameplayKit.GKAgent2D.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKAgent2D.Update(System.Double) -M:GameplayKit.GKAgent3D.Update(System.Double) M:GameplayKit.GKAgentDelegate_Extensions.AgentDidUpdate(GameplayKit.IGKAgentDelegate,GameplayKit.GKAgent) M:GameplayKit.GKAgentDelegate_Extensions.AgentWillUpdate(GameplayKit.IGKAgentDelegate,GameplayKit.GKAgent) -M:GameplayKit.GKAgentDelegate.AgentDidUpdate(GameplayKit.GKAgent) -M:GameplayKit.GKAgentDelegate.AgentWillUpdate(GameplayKit.GKAgent) -M:GameplayKit.GKARC4RandomSource.#ctor(Foundation.NSData) -M:GameplayKit.GKARC4RandomSource.DropValues(System.UIntPtr) M:GameplayKit.GKBehavior.Copy(Foundation.NSZone) -M:GameplayKit.GKBehavior.FromGoal(GameplayKit.GKGoal,System.Single) -M:GameplayKit.GKBehavior.FromGoals(Foundation.NSDictionary{GameplayKit.GKGoal,Foundation.NSNumber}) -M:GameplayKit.GKBehavior.FromGoals(GameplayKit.GKGoal[],Foundation.NSNumber[]) -M:GameplayKit.GKBehavior.FromGoals(GameplayKit.GKGoal[]) -M:GameplayKit.GKBehavior.GetWeight(GameplayKit.GKGoal) -M:GameplayKit.GKBehavior.RemoveAllGoals -M:GameplayKit.GKBehavior.RemoveGoal(GameplayKit.GKGoal) -M:GameplayKit.GKBehavior.SetWeight(System.Single,GameplayKit.GKGoal) -M:GameplayKit.GKBillowNoiseSource.#ctor(System.Double,System.IntPtr,System.Double,System.Double,System.Int32) -M:GameplayKit.GKBillowNoiseSource.Create(System.Double,System.IntPtr,System.Double,System.Double,System.Int32) -M:GameplayKit.GKCheckerboardNoiseSource.#ctor(System.Double) -M:GameplayKit.GKCheckerboardNoiseSource.Create(System.Double) -M:GameplayKit.GKCircleObstacle.#ctor(System.Single) -M:GameplayKit.GKCircleObstacle.FromRadius(System.Single) M:GameplayKit.GKComponent.Copy(Foundation.NSZone) -M:GameplayKit.GKComponent.DidAddToEntity M:GameplayKit.GKComponent.Dispose(System.Boolean) M:GameplayKit.GKComponent.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKComponent.Update(System.Double) -M:GameplayKit.GKComponent.WillRemoveFromEntity M:GameplayKit.GKComponentSystem`1.#ctor -M:GameplayKit.GKComponentSystem`1.#ctor(ObjCRuntime.Class) -M:GameplayKit.GKComponentSystem`1.AddComponent(`0) -M:GameplayKit.GKComponentSystem`1.AddComponent(GameplayKit.GKEntity) M:GameplayKit.GKComponentSystem`1.GetTypeForGenericArgument(System.UIntPtr) -M:GameplayKit.GKComponentSystem`1.RemoveComponent(`0) -M:GameplayKit.GKComponentSystem`1.RemoveComponent(GameplayKit.GKEntity) -M:GameplayKit.GKComponentSystem`1.Update(System.Double) -M:GameplayKit.GKCompositeBehavior.FromBehaviors(GameplayKit.GKBehavior[],Foundation.NSNumber[]) -M:GameplayKit.GKCompositeBehavior.FromBehaviors(GameplayKit.GKBehavior[]) -M:GameplayKit.GKCompositeBehavior.GetWeight(GameplayKit.GKBehavior) -M:GameplayKit.GKCompositeBehavior.RemoveAllBehaviors -M:GameplayKit.GKCompositeBehavior.RemoveBehavior(GameplayKit.GKBehavior) -M:GameplayKit.GKCompositeBehavior.SetWeight(System.Single,GameplayKit.GKBehavior) -M:GameplayKit.GKConstantNoiseSource.#ctor(System.Double) -M:GameplayKit.GKConstantNoiseSource.Create(System.Double) -M:GameplayKit.GKCylindersNoiseSource.#ctor(System.Double) -M:GameplayKit.GKCylindersNoiseSource.Create(System.Double) -M:GameplayKit.GKDecisionNode.CreateBranch(Foundation.NSNumber,Foundation.NSObject) -M:GameplayKit.GKDecisionNode.CreateBranch(Foundation.NSPredicate,Foundation.NSObject) -M:GameplayKit.GKDecisionNode.CreateBranch(System.IntPtr,Foundation.NSObject) -M:GameplayKit.GKDecisionTree.#ctor(Foundation.NSArray{Foundation.NSObject}[],Foundation.NSObject[],Foundation.NSObject[]) -M:GameplayKit.GKDecisionTree.#ctor(Foundation.NSObject) -M:GameplayKit.GKDecisionTree.#ctor(Foundation.NSUrl,Foundation.NSError) M:GameplayKit.GKDecisionTree.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKDecisionTree.Export(Foundation.NSUrl,Foundation.NSError) -M:GameplayKit.GKDecisionTree.FindAction(Foundation.NSDictionary{Foundation.NSObject,Foundation.NSObject}) -M:GameplayKit.GKEntity.#ctor -M:GameplayKit.GKEntity.AddComponent(GameplayKit.GKComponent) M:GameplayKit.GKEntity.Copy(Foundation.NSZone) M:GameplayKit.GKEntity.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKEntity.GetComponent(ObjCRuntime.Class) M:GameplayKit.GKEntity.GetComponent(System.Type) -M:GameplayKit.GKEntity.GetEntity -M:GameplayKit.GKEntity.RemoveComponent(ObjCRuntime.Class) M:GameplayKit.GKEntity.RemoveComponent(System.Type) -M:GameplayKit.GKEntity.Update(System.Double) M:GameplayKit.GKGameModel_Extensions.GetScore(GameplayKit.IGKGameModel,GameplayKit.IGKGameModelPlayer) M:GameplayKit.GKGameModel_Extensions.IsLoss(GameplayKit.IGKGameModel,GameplayKit.IGKGameModelPlayer) M:GameplayKit.GKGameModel_Extensions.IsWin(GameplayKit.IGKGameModel,GameplayKit.IGKGameModelPlayer) M:GameplayKit.GKGameModel_Extensions.UnapplyGameModelUpdate(GameplayKit.IGKGameModel,GameplayKit.IGKGameModelUpdate) M:GameplayKit.GKGameModel.#ctor -M:GameplayKit.GKGaussianDistribution.#ctor(GameplayKit.IGKRandom,System.IntPtr,System.IntPtr) -M:GameplayKit.GKGaussianDistribution.#ctor(GameplayKit.IGKRandom,System.Single,System.Single) M:GameplayKit.GKGoal.Copy(Foundation.NSZone) -M:GameplayKit.GKGoal.GetGoalToAlign(GameplayKit.GKAgent[],System.Single,System.Single) -M:GameplayKit.GKGoal.GetGoalToAvoidAgents(GameplayKit.GKAgent[],System.Double) -M:GameplayKit.GKGoal.GetGoalToAvoidObstacles(GameplayKit.GKObstacle[],System.Double) -M:GameplayKit.GKGoal.GetGoalToCohere(GameplayKit.GKAgent[],System.Single,System.Single) -M:GameplayKit.GKGoal.GetGoalToFleeAgent(GameplayKit.GKAgent) -M:GameplayKit.GKGoal.GetGoalToFollowPath(GameplayKit.GKPath,System.Double,System.Boolean) -M:GameplayKit.GKGoal.GetGoalToInterceptAgent(GameplayKit.GKAgent,System.Double) -M:GameplayKit.GKGoal.GetGoalToReachTargetSpeed(System.Single) -M:GameplayKit.GKGoal.GetGoalToSeekAgent(GameplayKit.GKAgent) -M:GameplayKit.GKGoal.GetGoalToSeparate(GameplayKit.GKAgent[],System.Single,System.Single) -M:GameplayKit.GKGoal.GetGoalToStayOnPath(GameplayKit.GKPath,System.Double) -M:GameplayKit.GKGoal.GetGoalToWander(System.Single) -M:GameplayKit.GKGraph.#ctor(GameplayKit.GKGraphNode[]) -M:GameplayKit.GKGraph.AddNodes(GameplayKit.GKGraphNode[]) -M:GameplayKit.GKGraph.ConnectNodeToLowestCostNode(GameplayKit.GKGraphNode,System.Boolean) M:GameplayKit.GKGraph.Copy(Foundation.NSZone) M:GameplayKit.GKGraph.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKGraph.FindPath(GameplayKit.GKGraphNode,GameplayKit.GKGraphNode) -M:GameplayKit.GKGraph.FromNodes(GameplayKit.GKGraphNode[]) -M:GameplayKit.GKGraph.RemoveNodes(GameplayKit.GKGraphNode[]) -M:GameplayKit.GKGraphNode.AddConnections(GameplayKit.GKGraphNode[],System.Boolean) M:GameplayKit.GKGraphNode.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKGraphNode.FindPathFrom(GameplayKit.GKGraphNode) -M:GameplayKit.GKGraphNode.FindPathTo(GameplayKit.GKGraphNode) -M:GameplayKit.GKGraphNode.GetCost(GameplayKit.GKGraphNode) -M:GameplayKit.GKGraphNode.GetEstimatedCost(GameplayKit.GKGraphNode) -M:GameplayKit.GKGraphNode.RemoveConnections(GameplayKit.GKGraphNode[],System.Boolean) -M:GameplayKit.GKGraphNode2D.#ctor(System.Numerics.Vector2) -M:GameplayKit.GKGraphNode2D.FromPoint(System.Numerics.Vector2) -M:GameplayKit.GKGraphNode3D.#ctor(System.Numerics.Vector3) -M:GameplayKit.GKGraphNode3D.FromPoint(System.Numerics.Vector3) -M:GameplayKit.GKGridGraph.#ctor(CoreGraphics.NVector2i,System.Int32,System.Int32,System.Boolean,ObjCRuntime.Class) M:GameplayKit.GKGridGraph.#ctor(CoreGraphics.NVector2i,System.Int32,System.Int32,System.Boolean,System.Type) -M:GameplayKit.GKGridGraph.#ctor(CoreGraphics.NVector2i,System.Int32,System.Int32,System.Boolean) -M:GameplayKit.GKGridGraph.ConnectNodeToAdjacentNodes(GameplayKit.GKGridGraphNode) -M:GameplayKit.GKGridGraph.FromGridStartingAt(CoreGraphics.NVector2i,System.Int32,System.Int32,System.Boolean,ObjCRuntime.Class) M:GameplayKit.GKGridGraph.FromGridStartingAt(CoreGraphics.NVector2i,System.Int32,System.Int32,System.Boolean,System.Type) -M:GameplayKit.GKGridGraph.FromGridStartingAt(CoreGraphics.NVector2i,System.Int32,System.Int32,System.Boolean) M:GameplayKit.GKGridGraph.GetNodeAt``1(CoreGraphics.NVector2i) M:GameplayKit.GKGridGraph.GetTypeForGenericArgument(System.UIntPtr) -M:GameplayKit.GKGridGraphNode.#ctor(CoreGraphics.NVector2i) -M:GameplayKit.GKGridGraphNode.FromGridPosition(CoreGraphics.NVector2i) M:GameplayKit.GKHybridStrategist.#ctor M:GameplayKit.GKHybridStrategist.GetBestMoveForActivePlayer -M:GameplayKit.GKLinearCongruentialRandomSource.#ctor(System.UInt64) -M:GameplayKit.GKMersenneTwisterRandomSource.#ctor(System.UInt64) -M:GameplayKit.GKMeshGraph`1.#ctor(System.Single,System.Numerics.Vector2,System.Numerics.Vector2,ObjCRuntime.Class) M:GameplayKit.GKMeshGraph`1.#ctor(System.Single,System.Numerics.Vector2,System.Numerics.Vector2,System.Type) -M:GameplayKit.GKMeshGraph`1.#ctor(System.Single,System.Numerics.Vector2,System.Numerics.Vector2) -M:GameplayKit.GKMeshGraph`1.AddObstacles(GameplayKit.GKPolygonObstacle[]) -M:GameplayKit.GKMeshGraph`1.ConnectNodeUsingObstacles(`0) -M:GameplayKit.GKMeshGraph`1.FromBufferRadius(System.Single,System.Numerics.Vector2,System.Numerics.Vector2,ObjCRuntime.Class) M:GameplayKit.GKMeshGraph`1.FromBufferRadius(System.Single,System.Numerics.Vector2,System.Numerics.Vector2,System.Type) -M:GameplayKit.GKMeshGraph`1.FromBufferRadius(System.Single,System.Numerics.Vector2,System.Numerics.Vector2) -M:GameplayKit.GKMeshGraph`1.GetTriangle(System.UIntPtr) M:GameplayKit.GKMeshGraph`1.GetTypeForGenericArgument(System.UIntPtr) -M:GameplayKit.GKMeshGraph`1.RemoveObstacles(GameplayKit.GKPolygonObstacle[]) -M:GameplayKit.GKMeshGraph`1.Triangulate -M:GameplayKit.GKMinMaxStrategist.GetBestMove(GameplayKit.IGKGameModelPlayer) -M:GameplayKit.GKMinMaxStrategist.GetBestMoveForActivePlayer -M:GameplayKit.GKMinMaxStrategist.GetRandomMove(GameplayKit.IGKGameModelPlayer,System.IntPtr) -M:GameplayKit.GKMonteCarloStrategist.GetBestMoveForActivePlayer -M:GameplayKit.GKNoise.#ctor(GameplayKit.GKNoiseSource,Foundation.NSDictionary{Foundation.NSNumber,AppKit.NSColor}) -M:GameplayKit.GKNoise.#ctor(GameplayKit.GKNoiseSource,Foundation.NSDictionary{Foundation.NSNumber,UIKit.UIColor}) -M:GameplayKit.GKNoise.#ctor(GameplayKit.GKNoiseSource) -M:GameplayKit.GKNoise.Add(GameplayKit.GKNoise) -M:GameplayKit.GKNoise.ApplyAbsoluteValue -M:GameplayKit.GKNoise.ApplyTurbulence(System.Double,System.Double,System.Int32,System.Int32) -M:GameplayKit.GKNoise.Clamp(System.Double,System.Double) -M:GameplayKit.GKNoise.Displace(GameplayKit.GKNoise,GameplayKit.GKNoise,GameplayKit.GKNoise) -M:GameplayKit.GKNoise.FromComponentNoises(GameplayKit.GKNoise[],GameplayKit.GKNoise,Foundation.NSNumber[],Foundation.NSNumber[]) -M:GameplayKit.GKNoise.FromComponentNoises(GameplayKit.GKNoise[],GameplayKit.GKNoise) -M:GameplayKit.GKNoise.FromNoiseSource(GameplayKit.GKNoiseSource,Foundation.NSDictionary{Foundation.NSNumber,AppKit.NSColor}) -M:GameplayKit.GKNoise.FromNoiseSource(GameplayKit.GKNoiseSource,Foundation.NSDictionary{Foundation.NSNumber,UIKit.UIColor}) -M:GameplayKit.GKNoise.FromNoiseSource(GameplayKit.GKNoiseSource) -M:GameplayKit.GKNoise.GetMaximum(GameplayKit.GKNoise) -M:GameplayKit.GKNoise.GetMinimum(GameplayKit.GKNoise) -M:GameplayKit.GKNoise.GetValue(System.Numerics.Vector2) -M:GameplayKit.GKNoise.Invert -M:GameplayKit.GKNoise.Move(CoreGraphics.NVector3d) -M:GameplayKit.GKNoise.Multiply(GameplayKit.GKNoise) -M:GameplayKit.GKNoise.RaiseToPower(GameplayKit.GKNoise) -M:GameplayKit.GKNoise.RaiseToPower(System.Double) -M:GameplayKit.GKNoise.RemapValuesToCurve(Foundation.NSDictionary{Foundation.NSNumber,Foundation.NSNumber}) -M:GameplayKit.GKNoise.RemapValuesToTerraces(Foundation.NSNumber[],System.Boolean) -M:GameplayKit.GKNoise.Rotate(CoreGraphics.NVector3d) -M:GameplayKit.GKNoise.Scale(CoreGraphics.NVector3d) -M:GameplayKit.GKNoiseMap.#ctor(GameplayKit.GKNoise,CoreGraphics.NVector2d,CoreGraphics.NVector2d,CoreGraphics.NVector2i,System.Boolean) -M:GameplayKit.GKNoiseMap.#ctor(GameplayKit.GKNoise) -M:GameplayKit.GKNoiseMap.FromNoise(GameplayKit.GKNoise,CoreGraphics.NVector2d,CoreGraphics.NVector2d,CoreGraphics.NVector2i,System.Boolean) -M:GameplayKit.GKNoiseMap.FromNoise(GameplayKit.GKNoise) -M:GameplayKit.GKNoiseMap.GetInterpolatedValue(System.Numerics.Vector2) -M:GameplayKit.GKNoiseMap.GetValue(CoreGraphics.NVector2i) -M:GameplayKit.GKNoiseMap.SetValue(System.Single,CoreGraphics.NVector2i) -M:GameplayKit.GKNSPredicateRule.#ctor(Foundation.NSPredicate) -M:GameplayKit.GKNSPredicateRule.EvaluatePredicate(GameplayKit.GKRuleSystem) -M:GameplayKit.GKObstacleGraph.#ctor(GameplayKit.GKPolygonObstacle[],System.Single) -M:GameplayKit.GKObstacleGraph.AddObstacles(GameplayKit.GKPolygonObstacle[]) -M:GameplayKit.GKObstacleGraph.ConnectNodeUsingObstacles(GameplayKit.GKGraphNode2D,GameplayKit.GKPolygonObstacle[]) -M:GameplayKit.GKObstacleGraph.ConnectNodeUsingObstacles(GameplayKit.GKGraphNode2D) -M:GameplayKit.GKObstacleGraph.ConnectNodeUsingObstaclesIgnoringBufferRadius(GameplayKit.GKGraphNode2D,GameplayKit.GKPolygonObstacle[]) -M:GameplayKit.GKObstacleGraph.FromObstacles(GameplayKit.GKPolygonObstacle[],System.Single) M:GameplayKit.GKObstacleGraph.GetNodes(GameplayKit.GKPolygonObstacle) M:GameplayKit.GKObstacleGraph.GetTypeForGenericArgument(System.UIntPtr) -M:GameplayKit.GKObstacleGraph.IsConnectionLocked(GameplayKit.GKGraphNode2D,GameplayKit.GKGraphNode2D) -M:GameplayKit.GKObstacleGraph.LockConnection(GameplayKit.GKGraphNode2D,GameplayKit.GKGraphNode2D) -M:GameplayKit.GKObstacleGraph.RemoveAllObstacles -M:GameplayKit.GKObstacleGraph.RemoveObstacles(GameplayKit.GKPolygonObstacle[]) -M:GameplayKit.GKObstacleGraph.UnlockConnection(GameplayKit.GKGraphNode2D,GameplayKit.GKGraphNode2D) M:GameplayKit.GKObstacleGraph`1.#ctor(Foundation.NSCoder) M:GameplayKit.GKObstacleGraph`1.#ctor(GameplayKit.GKPolygonObstacle[],System.Single) M:GameplayKit.GKObstacleGraph`1.FromObstacles(GameplayKit.GKPolygonObstacle[],System.Single) M:GameplayKit.GKObstacleGraph`1.GetNodes(GameplayKit.GKPolygonObstacle) -M:GameplayKit.GKOctree`1.#ctor(GameplayKit.GKBox,System.Single) -M:GameplayKit.GKOctree`1.AddElement(`0,GameplayKit.GKBox) -M:GameplayKit.GKOctree`1.AddElement(`0,System.Numerics.Vector3) -M:GameplayKit.GKOctree`1.FromBoundingBox(GameplayKit.GKBox,System.Single) -M:GameplayKit.GKOctree`1.GetElements(GameplayKit.GKBox) -M:GameplayKit.GKOctree`1.GetElements(System.Numerics.Vector3) -M:GameplayKit.GKOctree`1.RemoveElement(`0,GameplayKit.GKOctreeNode) -M:GameplayKit.GKOctree`1.RemoveElement(`0) -M:GameplayKit.GKPath.#ctor(GameplayKit.GKGraphNode[],System.Single) M:GameplayKit.GKPath.#ctor(GameplayKit.GKGraphNode2D[],System.Single) M:GameplayKit.GKPath.#ctor(System.Numerics.Vector2[],System.Single,System.Boolean) M:GameplayKit.GKPath.#ctor(System.Numerics.Vector3[],System.Single,System.Boolean) -M:GameplayKit.GKPath.FromGraphNodes(GameplayKit.GKGraphNode[],System.Single) M:GameplayKit.GKPath.FromGraphNodes(GameplayKit.GKGraphNode2D[],System.Single) M:GameplayKit.GKPath.FromPoints(System.Numerics.Vector2[],System.Single,System.Boolean) M:GameplayKit.GKPath.FromPoints(System.Numerics.Vector3[],System.Single,System.Boolean) -M:GameplayKit.GKPath.GetPoint(System.UIntPtr) -M:GameplayKit.GKPath.GetVector2Point(System.UIntPtr) -M:GameplayKit.GKPath.GetVector3Point(System.UIntPtr) -M:GameplayKit.GKPerlinNoiseSource.#ctor(System.Double,System.IntPtr,System.Double,System.Double,System.Int32) -M:GameplayKit.GKPerlinNoiseSource.Create(System.Double,System.IntPtr,System.Double,System.Double,System.Int32) M:GameplayKit.GKPolygonObstacle.#ctor(System.Numerics.Vector2[]) M:GameplayKit.GKPolygonObstacle.EncodeTo(Foundation.NSCoder) M:GameplayKit.GKPolygonObstacle.FromPoints(System.Numerics.Vector2[]) -M:GameplayKit.GKPolygonObstacle.GetVertex(System.UIntPtr) -M:GameplayKit.GKQuadTree.#ctor(GameplayKit.GKQuad,System.Single) -M:GameplayKit.GKQuadTree.AddElement(Foundation.NSObject,GameplayKit.GKQuad) -M:GameplayKit.GKQuadTree.AddElement(Foundation.NSObject,System.Numerics.Vector2) -M:GameplayKit.GKQuadTree.FromBoundingQuad(GameplayKit.GKQuad,System.Single) -M:GameplayKit.GKQuadTree.GetElements(GameplayKit.GKQuad) -M:GameplayKit.GKQuadTree.GetElements(System.Numerics.Vector2) -M:GameplayKit.GKQuadTree.RemoveElement(Foundation.NSObject,GameplayKit.GKQuadTreeNode) -M:GameplayKit.GKQuadTree.RemoveElement(Foundation.NSObject) -M:GameplayKit.GKRandomDistribution.#ctor(GameplayKit.IGKRandom,System.IntPtr,System.IntPtr) -M:GameplayKit.GKRandomDistribution.GetD20 -M:GameplayKit.GKRandomDistribution.GetD6 -M:GameplayKit.GKRandomDistribution.GetDie(System.IntPtr) -M:GameplayKit.GKRandomDistribution.GetDistributionBetween(System.IntPtr,System.IntPtr) -M:GameplayKit.GKRandomDistribution.GetNextBool -M:GameplayKit.GKRandomDistribution.GetNextInt -M:GameplayKit.GKRandomDistribution.GetNextInt(System.UIntPtr) -M:GameplayKit.GKRandomDistribution.GetNextUniform -M:GameplayKit.GKRandomSource.#ctor M:GameplayKit.GKRandomSource.Copy(Foundation.NSZone) M:GameplayKit.GKRandomSource.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKRandomSource.GetNextBool -M:GameplayKit.GKRandomSource.GetNextInt -M:GameplayKit.GKRandomSource.GetNextInt(System.UIntPtr) -M:GameplayKit.GKRandomSource.GetNextUniform -M:GameplayKit.GKRandomSource.ShuffleObjects(Foundation.NSObject[]) -M:GameplayKit.GKRidgedNoiseSource.#ctor(System.Double,System.IntPtr,System.Double,System.Int32) -M:GameplayKit.GKRidgedNoiseSource.Create(System.Double,System.IntPtr,System.Double,System.Int32) -M:GameplayKit.GKRTree`1.#ctor(System.UIntPtr) -M:GameplayKit.GKRTree`1.AddElement(`0,System.Numerics.Vector2,System.Numerics.Vector2,GameplayKit.GKRTreeSplitStrategy) -M:GameplayKit.GKRTree`1.FromMaxNumberOfChildren(System.UIntPtr) -M:GameplayKit.GKRTree`1.GetElements(System.Numerics.Vector2,System.Numerics.Vector2) -M:GameplayKit.GKRTree`1.RemoveElement(`0,System.Numerics.Vector2,System.Numerics.Vector2) -M:GameplayKit.GKRule.EvaluatePredicate(GameplayKit.GKRuleSystem) -M:GameplayKit.GKRule.FromPredicate(System.Func{GameplayKit.GKRuleSystem,System.Boolean},System.Action{GameplayKit.GKRuleSystem}) -M:GameplayKit.GKRule.FromPredicateAssertingFact(Foundation.NSPredicate,Foundation.NSObject,System.Single) -M:GameplayKit.GKRule.FromPredicateRetractingFact(Foundation.NSPredicate,Foundation.NSObject,System.Single) -M:GameplayKit.GKRule.PerformAction(GameplayKit.GKRuleSystem) -M:GameplayKit.GKRuleSystem.#ctor -M:GameplayKit.GKRuleSystem.AddRule(GameplayKit.GKRule) -M:GameplayKit.GKRuleSystem.AddRules(GameplayKit.GKRule[]) -M:GameplayKit.GKRuleSystem.AssertFact(Foundation.NSObject,System.Single) -M:GameplayKit.GKRuleSystem.AssertFact(Foundation.NSObject) -M:GameplayKit.GKRuleSystem.Evaluate -M:GameplayKit.GKRuleSystem.GetGrade(Foundation.NSObject) -M:GameplayKit.GKRuleSystem.GetMaximumGrade(Foundation.NSObject[]) -M:GameplayKit.GKRuleSystem.GetMinimumGrade(Foundation.NSObject[]) -M:GameplayKit.GKRuleSystem.RemoveAllRules -M:GameplayKit.GKRuleSystem.Reset -M:GameplayKit.GKRuleSystem.RetractFact(Foundation.NSObject,System.Single) -M:GameplayKit.GKRuleSystem.RetractFact(Foundation.NSObject) -M:GameplayKit.GKScene.AddEntity(GameplayKit.GKEntity) -M:GameplayKit.GKScene.AddGraph(GameplayKit.GKGraph,System.String) M:GameplayKit.GKScene.Copy(Foundation.NSZone) M:GameplayKit.GKScene.Dispose(System.Boolean) M:GameplayKit.GKScene.EncodeTo(Foundation.NSCoder) -M:GameplayKit.GKScene.FromFile(System.String,GameplayKit.IGKSceneRootNodeType) -M:GameplayKit.GKScene.FromFile(System.String) -M:GameplayKit.GKScene.RemoveEntity(GameplayKit.GKEntity) -M:GameplayKit.GKScene.RemoveGraph(System.String) -M:GameplayKit.GKSCNNodeComponent.#ctor(SceneKit.SCNNode) -M:GameplayKit.GKSCNNodeComponent.AgentDidUpdate(GameplayKit.GKAgent) -M:GameplayKit.GKSCNNodeComponent.AgentWillUpdate(GameplayKit.GKAgent) -M:GameplayKit.GKSCNNodeComponent.FromNode(SceneKit.SCNNode) -M:GameplayKit.GKShuffledDistribution.#ctor(GameplayKit.IGKRandom,System.IntPtr,System.IntPtr) -M:GameplayKit.GKSKNodeComponent.#ctor(SpriteKit.SKNode) -M:GameplayKit.GKSKNodeComponent.AgentDidUpdate(GameplayKit.GKAgent) -M:GameplayKit.GKSKNodeComponent.AgentWillUpdate(GameplayKit.GKAgent) -M:GameplayKit.GKSKNodeComponent.FromNode(SpriteKit.SKNode) -M:GameplayKit.GKSphereObstacle.#ctor(System.Single) -M:GameplayKit.GKSphereObstacle.FromRadius(System.Single) -M:GameplayKit.GKSpheresNoiseSource.#ctor(System.Double) -M:GameplayKit.GKSpheresNoiseSource.Create(System.Double) -M:GameplayKit.GKState.#ctor -M:GameplayKit.GKState.DidEnter(GameplayKit.GKState) M:GameplayKit.GKState.Dispose(System.Boolean) -M:GameplayKit.GKState.GetState M:GameplayKit.GKState.IsValidNextState(GameplayKit.GKState) -M:GameplayKit.GKState.IsValidNextState(ObjCRuntime.Class) M:GameplayKit.GKState.IsValidNextState(System.Type) -M:GameplayKit.GKState.Update(System.Double) -M:GameplayKit.GKState.WillExit(GameplayKit.GKState) -M:GameplayKit.GKStateMachine.#ctor(GameplayKit.GKState[]) M:GameplayKit.GKStateMachine.CanEnterState(GameplayKit.GKState) -M:GameplayKit.GKStateMachine.CanEnterState(ObjCRuntime.Class) M:GameplayKit.GKStateMachine.CanEnterState(System.Type) M:GameplayKit.GKStateMachine.EnterState(GameplayKit.GKState) -M:GameplayKit.GKStateMachine.EnterState(ObjCRuntime.Class) M:GameplayKit.GKStateMachine.EnterState(System.Type) -M:GameplayKit.GKStateMachine.FromStates(GameplayKit.GKState[]) M:GameplayKit.GKStateMachine.GetState(GameplayKit.GKState) -M:GameplayKit.GKStateMachine.GetState(ObjCRuntime.Class) M:GameplayKit.GKStateMachine.GetState(System.Type) -M:GameplayKit.GKStateMachine.Update(System.Double) -M:GameplayKit.GKVoronoiNoiseSource.#ctor(System.Double,System.Double,System.Boolean,System.Int32) -M:GameplayKit.GKVoronoiNoiseSource.Create(System.Double,System.Double,System.Boolean,System.Int32) M:GameplayKit.IGKAgentDelegate.AgentDidUpdate(GameplayKit.GKAgent) M:GameplayKit.IGKAgentDelegate.AgentWillUpdate(GameplayKit.GKAgent) M:GameplayKit.IGKGameModel.ApplyGameModelUpdate(GameplayKit.IGKGameModelUpdate) @@ -37633,8 +34856,6 @@ M:GameplayKit.SCNNode_GameplayKit.GetEntity(SceneKit.SCNNode) M:GameplayKit.SCNNode_GameplayKit.SetEntity(SceneKit.SCNNode,GameplayKit.GKEntity) M:GameplayKit.SKNode_GameplayKit.GetEntity(SpriteKit.SKNode) M:GameplayKit.SKNode_GameplayKit.SetEntity(SpriteKit.SKNode,GameplayKit.GKEntity) -M:GLKit.GLKBaseEffect.PrepareToDraw -M:GLKit.GLKMesh.#ctor(ModelIO.MDLMesh,Foundation.NSError@) M:GLKit.GLKMesh.FromAsset(ModelIO.MDLAsset,ModelIO.MDLMesh[]@,Foundation.NSError@) M:GLKit.GLKMeshBuffer.Copy(Foundation.NSZone) M:GLKit.GLKMeshBuffer.FillData(Foundation.NSData,System.UIntPtr) @@ -37644,76 +34865,47 @@ M:GLKit.GLKMeshBufferAllocator.CreateBuffer(ModelIO.IMDLMeshBufferZone,System.UI M:GLKit.GLKMeshBufferAllocator.CreateBuffer(System.UIntPtr,ModelIO.MDLMeshBufferType) M:GLKit.GLKMeshBufferAllocator.CreateZone(Foundation.NSNumber[],Foundation.NSNumber[]) M:GLKit.GLKMeshBufferAllocator.CreateZone(System.UIntPtr) -M:GLKit.GLKNamedEffect.PrepareToDraw -M:GLKit.GLKReflectionMapEffect.PrepareToDraw -M:GLKit.GLKSkyboxEffect.Draw -M:GLKit.GLKSkyboxEffect.PrepareToDraw M:GLKit.GLKSubmesh.Dispose(System.Boolean) M:GLKit.GLKTextureInfo.Copy(Foundation.NSZone) -M:GLKit.GLKTextureLoader.#ctor(AppKit.NSOpenGLContext) -M:GLKit.GLKTextureLoader.#ctor(OpenGLES.EAGLSharegroup) -M:GLKit.GLKTextureLoader.BeginLoadCubeMap(Foundation.NSUrl,Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginLoadCubeMap(Foundation.NSUrl,GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginLoadCubeMap(Foundation.NSUrl[],Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginLoadCubeMap(Foundation.NSUrl[],GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) -M:GLKit.GLKTextureLoader.BeginLoadCubeMap(System.String,Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginLoadCubeMap(System.String,GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginLoadCubeMap(System.String[],Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginLoadCubeMap(System.String[],GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginLoadCubeMapAsync(Foundation.NSUrl,Foundation.NSDictionary,CoreFoundation.DispatchQueue) M:GLKit.GLKTextureLoader.BeginLoadCubeMapAsync(System.String,Foundation.NSDictionary,CoreFoundation.DispatchQueue) -M:GLKit.GLKTextureLoader.BeginTextureLoad(CoreGraphics.CGImage,Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginTextureLoad(CoreGraphics.CGImage,GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) -M:GLKit.GLKTextureLoader.BeginTextureLoad(Foundation.NSData,Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginTextureLoad(Foundation.NSData,GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) -M:GLKit.GLKTextureLoader.BeginTextureLoad(Foundation.NSUrl,Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginTextureLoad(Foundation.NSUrl,GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) -M:GLKit.GLKTextureLoader.BeginTextureLoad(System.String,Foundation.NSDictionary,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginTextureLoad(System.String,GLKit.GLKTextureOperations,CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) -M:GLKit.GLKTextureLoader.BeginTextureLoad(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary{Foundation.NSString,Foundation.NSNumber},CoreFoundation.DispatchQueue,GLKit.GLKTextureLoaderCallback) M:GLKit.GLKTextureLoader.BeginTextureLoadAsync(CoreGraphics.CGImage,Foundation.NSDictionary,CoreFoundation.DispatchQueue) M:GLKit.GLKTextureLoader.BeginTextureLoadAsync(Foundation.NSData,Foundation.NSDictionary,CoreFoundation.DispatchQueue) M:GLKit.GLKTextureLoader.BeginTextureLoadAsync(Foundation.NSUrl,Foundation.NSDictionary,CoreFoundation.DispatchQueue) M:GLKit.GLKTextureLoader.BeginTextureLoadAsync(System.String,Foundation.NSDictionary,CoreFoundation.DispatchQueue) M:GLKit.GLKTextureLoader.BeginTextureLoadAsync(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary{Foundation.NSString,Foundation.NSNumber},CoreFoundation.DispatchQueue) -M:GLKit.GLKTextureLoader.CubeMapFromFile(System.String,Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.CubeMapFromFile(System.String,GLKit.GLKTextureOperations,Foundation.NSError@) M:GLKit.GLKTextureLoader.CubeMapFromFiles(System.String[],Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.CubeMapFromFiles(System.String[],GLKit.GLKTextureOperations,Foundation.NSError@) -M:GLKit.GLKTextureLoader.CubeMapFromUrl(Foundation.NSUrl,Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.CubeMapFromUrl(Foundation.NSUrl,GLKit.GLKTextureOperations,Foundation.NSError@) M:GLKit.GLKTextureLoader.CubeMapFromUrls(Foundation.NSUrl[],Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.CubeMapFromUrls(Foundation.NSUrl[],GLKit.GLKTextureOperations,Foundation.NSError@) -M:GLKit.GLKTextureLoader.FromData(Foundation.NSData,Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.FromData(Foundation.NSData,GLKit.GLKTextureOperations,Foundation.NSError@) -M:GLKit.GLKTextureLoader.FromFile(System.String,Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.FromFile(System.String,GLKit.GLKTextureOperations,Foundation.NSError@) -M:GLKit.GLKTextureLoader.FromImage(CoreGraphics.CGImage,Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.FromImage(CoreGraphics.CGImage,GLKit.GLKTextureOperations,Foundation.NSError@) -M:GLKit.GLKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary{Foundation.NSString,Foundation.NSNumber},Foundation.NSError@) -M:GLKit.GLKTextureLoader.FromUrl(Foundation.NSUrl,Foundation.NSDictionary,Foundation.NSError@) M:GLKit.GLKTextureLoader.FromUrl(Foundation.NSUrl,GLKit.GLKTextureOperations,Foundation.NSError@) M:GLKit.GLKTextureOperations.#ctor M:GLKit.GLKTextureOperations.#ctor(Foundation.NSDictionary) M:GLKit.GLKVertexAttributeParameters.FromVertexFormat(ModelIO.MDLVertexFormat) -M:GLKit.GLKView.#ctor(CoreGraphics.CGRect,OpenGLES.EAGLContext) M:GLKit.GLKView.#ctor(CoreGraphics.CGRect) M:GLKit.GLKView.add_DrawInRect(System.EventHandler{GLKit.GLKViewDrawEventArgs}) -M:GLKit.GLKView.BindDrawable -M:GLKit.GLKView.DeleteDrawable -M:GLKit.GLKView.Display M:GLKit.GLKView.Dispose(System.Boolean) M:GLKit.GLKView.GLKViewAppearance.#ctor(System.IntPtr) M:GLKit.GLKView.remove_DrawInRect(System.EventHandler{GLKit.GLKViewDrawEventArgs}) -M:GLKit.GLKView.Snapshot M:GLKit.GLKViewController.#ctor(System.String,Foundation.NSBundle) M:GLKit.GLKViewController.Dispose(System.Boolean) -M:GLKit.GLKViewController.DrawInRect(GLKit.GLKView,CoreGraphics.CGRect) M:GLKit.GLKViewController.Update M:GLKit.GLKViewControllerDelegate_Extensions.WillPause(GLKit.IGLKViewControllerDelegate,GLKit.GLKViewController,System.Boolean) -M:GLKit.GLKViewControllerDelegate.Update(GLKit.GLKViewController) -M:GLKit.GLKViewControllerDelegate.WillPause(GLKit.GLKViewController,System.Boolean) -M:GLKit.GLKViewDelegate.DrawInRect(GLKit.GLKView,CoreGraphics.CGRect) M:GLKit.GLKViewDrawEventArgs.#ctor(CoreGraphics.CGRect) M:GLKit.IGLKNamedEffect.PrepareToDraw M:GLKit.IGLKViewControllerDelegate.Update(GLKit.GLKViewController) @@ -37794,10 +34986,6 @@ M:HealthKit.HKHeartbeatSeriesSample.EncodeTo(Foundation.NSCoder) M:HealthKit.HKLiveWorkoutBuilder.Dispose(System.Boolean) M:HealthKit.HKLiveWorkoutBuilderDelegate_Extensions.DidBeginActivity(HealthKit.IHKLiveWorkoutBuilderDelegate,HealthKit.HKLiveWorkoutBuilder,HealthKit.HKWorkoutActivity) M:HealthKit.HKLiveWorkoutBuilderDelegate_Extensions.DidEndActivity(HealthKit.IHKLiveWorkoutBuilderDelegate,HealthKit.HKLiveWorkoutBuilder,HealthKit.HKWorkoutActivity) -M:HealthKit.HKLiveWorkoutBuilderDelegate.DidBeginActivity(HealthKit.HKLiveWorkoutBuilder,HealthKit.HKWorkoutActivity) -M:HealthKit.HKLiveWorkoutBuilderDelegate.DidCollectData(HealthKit.HKLiveWorkoutBuilder,Foundation.NSSet{HealthKit.HKSampleType}) -M:HealthKit.HKLiveWorkoutBuilderDelegate.DidCollectEvent(HealthKit.HKLiveWorkoutBuilder) -M:HealthKit.HKLiveWorkoutBuilderDelegate.DidEndActivity(HealthKit.HKLiveWorkoutBuilder,HealthKit.HKWorkoutActivity) M:HealthKit.HKMetadata.#ctor M:HealthKit.HKMetadata.#ctor(Foundation.NSDictionary) M:HealthKit.HKObject.EncodeTo(Foundation.NSCoder) @@ -37885,13 +35073,6 @@ M:HealthKit.HKWorkoutSessionDelegate_Extensions.DidDisconnect(HealthKit.IHKWorko M:HealthKit.HKWorkoutSessionDelegate_Extensions.DidEndActivity(HealthKit.IHKWorkoutSessionDelegate,HealthKit.HKWorkoutSession,HealthKit.HKWorkoutConfiguration,Foundation.NSDate) M:HealthKit.HKWorkoutSessionDelegate_Extensions.DidGenerateEvent(HealthKit.IHKWorkoutSessionDelegate,HealthKit.HKWorkoutSession,HealthKit.HKWorkoutEvent) M:HealthKit.HKWorkoutSessionDelegate_Extensions.DidReceiveData(HealthKit.IHKWorkoutSessionDelegate,HealthKit.HKWorkoutSession,Foundation.NSData[]) -M:HealthKit.HKWorkoutSessionDelegate.DidBeginActivity(HealthKit.HKWorkoutSession,HealthKit.HKWorkoutConfiguration,Foundation.NSDate) -M:HealthKit.HKWorkoutSessionDelegate.DidChangeToState(HealthKit.HKWorkoutSession,HealthKit.HKWorkoutSessionState,HealthKit.HKWorkoutSessionState,Foundation.NSDate) -M:HealthKit.HKWorkoutSessionDelegate.DidDisconnect(HealthKit.HKWorkoutSession,Foundation.NSError) -M:HealthKit.HKWorkoutSessionDelegate.DidEndActivity(HealthKit.HKWorkoutSession,HealthKit.HKWorkoutConfiguration,Foundation.NSDate) -M:HealthKit.HKWorkoutSessionDelegate.DidFail(HealthKit.HKWorkoutSession,Foundation.NSError) -M:HealthKit.HKWorkoutSessionDelegate.DidGenerateEvent(HealthKit.HKWorkoutSession,HealthKit.HKWorkoutEvent) -M:HealthKit.HKWorkoutSessionDelegate.DidReceiveData(HealthKit.HKWorkoutSession,Foundation.NSData[]) M:HealthKit.IHKLiveWorkoutBuilderDelegate.DidBeginActivity(HealthKit.HKLiveWorkoutBuilder,HealthKit.HKWorkoutActivity) M:HealthKit.IHKLiveWorkoutBuilderDelegate.DidCollectData(HealthKit.HKLiveWorkoutBuilder,Foundation.NSSet{HealthKit.HKSampleType}) M:HealthKit.IHKLiveWorkoutBuilderDelegate.DidCollectEvent(HealthKit.HKLiveWorkoutBuilder) @@ -37905,7 +35086,6 @@ M:HealthKit.IHKWorkoutSessionDelegate.DidGenerateEvent(HealthKit.HKWorkoutSessio M:HealthKit.IHKWorkoutSessionDelegate.DidReceiveData(HealthKit.HKWorkoutSession,Foundation.NSData[]) M:HealthKitUI.HKActivityRingView.#ctor(CoreGraphics.CGRect) M:HealthKitUI.HKActivityRingView.HKActivityRingViewAppearance.#ctor(System.IntPtr) -M:HomeKit.HMAccessory.#ctor M:HomeKit.HMAccessory.add_DidAddProfile(System.EventHandler{HomeKit.HMAccessoryProfileEventArgs}) M:HomeKit.HMAccessory.add_DidRemoveProfile(System.EventHandler{HomeKit.HMAccessoryProfileEventArgs}) M:HomeKit.HMAccessory.add_DidUpdateAssociatedServiceType(System.EventHandler{HomeKit.HMAccessoryUpdateEventArgs}) @@ -37916,7 +35096,6 @@ M:HomeKit.HMAccessory.add_DidUpdateReachability(System.EventHandler) M:HomeKit.HMAccessory.add_DidUpdateServices(System.EventHandler) M:HomeKit.HMAccessory.add_DidUpdateValueForCharacteristic(System.EventHandler{HomeKit.HMAccessoryServiceUpdateCharacteristicEventArgs}) M:HomeKit.HMAccessory.Dispose(System.Boolean) -M:HomeKit.HMAccessory.Identify(System.Action{Foundation.NSError}) M:HomeKit.HMAccessory.IdentifyAsync M:HomeKit.HMAccessory.remove_DidAddProfile(System.EventHandler{HomeKit.HMAccessoryProfileEventArgs}) M:HomeKit.HMAccessory.remove_DidRemoveProfile(System.EventHandler{HomeKit.HMAccessoryProfileEventArgs}) @@ -37927,19 +35106,14 @@ M:HomeKit.HMAccessory.remove_DidUpdateNameForService(System.EventHandler{HomeKit M:HomeKit.HMAccessory.remove_DidUpdateReachability(System.EventHandler) M:HomeKit.HMAccessory.remove_DidUpdateServices(System.EventHandler) M:HomeKit.HMAccessory.remove_DidUpdateValueForCharacteristic(System.EventHandler{HomeKit.HMAccessoryServiceUpdateCharacteristicEventArgs}) -M:HomeKit.HMAccessory.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMAccessory.UpdateNameAsync(System.String) M:HomeKit.HMAccessoryBrowser.add_DidFindNewAccessory(System.EventHandler{HomeKit.HMAccessoryBrowserEventArgs}) M:HomeKit.HMAccessoryBrowser.add_DidRemoveNewAccessory(System.EventHandler{HomeKit.HMAccessoryBrowserEventArgs}) M:HomeKit.HMAccessoryBrowser.Dispose(System.Boolean) M:HomeKit.HMAccessoryBrowser.remove_DidFindNewAccessory(System.EventHandler{HomeKit.HMAccessoryBrowserEventArgs}) M:HomeKit.HMAccessoryBrowser.remove_DidRemoveNewAccessory(System.EventHandler{HomeKit.HMAccessoryBrowserEventArgs}) -M:HomeKit.HMAccessoryBrowser.StartSearchingForNewAccessories -M:HomeKit.HMAccessoryBrowser.StopSearchingForNewAccessories M:HomeKit.HMAccessoryBrowserDelegate_Extensions.DidFindNewAccessory(HomeKit.IHMAccessoryBrowserDelegate,HomeKit.HMAccessoryBrowser,HomeKit.HMAccessory) M:HomeKit.HMAccessoryBrowserDelegate_Extensions.DidRemoveNewAccessory(HomeKit.IHMAccessoryBrowserDelegate,HomeKit.HMAccessoryBrowser,HomeKit.HMAccessory) -M:HomeKit.HMAccessoryBrowserDelegate.DidFindNewAccessory(HomeKit.HMAccessoryBrowser,HomeKit.HMAccessory) -M:HomeKit.HMAccessoryBrowserDelegate.DidRemoveNewAccessory(HomeKit.HMAccessoryBrowser,HomeKit.HMAccessory) M:HomeKit.HMAccessoryBrowserEventArgs.#ctor(HomeKit.HMAccessory) M:HomeKit.HMAccessoryDelegate_Extensions.DidAddProfile(HomeKit.IHMAccessoryDelegate,HomeKit.HMAccessory,HomeKit.HMAccessoryProfile) M:HomeKit.HMAccessoryDelegate_Extensions.DidRemoveProfile(HomeKit.IHMAccessoryDelegate,HomeKit.HMAccessory,HomeKit.HMAccessoryProfile) @@ -37950,115 +35124,50 @@ M:HomeKit.HMAccessoryDelegate_Extensions.DidUpdateNameForService(HomeKit.IHMAcce M:HomeKit.HMAccessoryDelegate_Extensions.DidUpdateReachability(HomeKit.IHMAccessoryDelegate,HomeKit.HMAccessory) M:HomeKit.HMAccessoryDelegate_Extensions.DidUpdateServices(HomeKit.IHMAccessoryDelegate,HomeKit.HMAccessory) M:HomeKit.HMAccessoryDelegate_Extensions.DidUpdateValueForCharacteristic(HomeKit.IHMAccessoryDelegate,HomeKit.HMAccessory,HomeKit.HMService,HomeKit.HMCharacteristic) -M:HomeKit.HMAccessoryDelegate.DidAddProfile(HomeKit.HMAccessory,HomeKit.HMAccessoryProfile) -M:HomeKit.HMAccessoryDelegate.DidRemoveProfile(HomeKit.HMAccessory,HomeKit.HMAccessoryProfile) -M:HomeKit.HMAccessoryDelegate.DidUpdateAssociatedServiceType(HomeKit.HMAccessory,HomeKit.HMService) -M:HomeKit.HMAccessoryDelegate.DidUpdateFirmwareVersion(HomeKit.HMAccessory,System.String) -M:HomeKit.HMAccessoryDelegate.DidUpdateName(HomeKit.HMAccessory) -M:HomeKit.HMAccessoryDelegate.DidUpdateNameForService(HomeKit.HMAccessory,HomeKit.HMService) -M:HomeKit.HMAccessoryDelegate.DidUpdateReachability(HomeKit.HMAccessory) -M:HomeKit.HMAccessoryDelegate.DidUpdateServices(HomeKit.HMAccessory) -M:HomeKit.HMAccessoryDelegate.DidUpdateValueForCharacteristic(HomeKit.HMAccessory,HomeKit.HMService,HomeKit.HMCharacteristic) M:HomeKit.HMAccessoryFirmwareVersionEventArgs.#ctor(System.String) -M:HomeKit.HMAccessoryOwnershipToken.#ctor(Foundation.NSData) M:HomeKit.HMAccessoryProfile.Dispose(System.Boolean) M:HomeKit.HMAccessoryProfileEventArgs.#ctor(HomeKit.HMAccessoryProfile) M:HomeKit.HMAccessoryServiceUpdateCharacteristicEventArgs.#ctor(HomeKit.HMService,HomeKit.HMCharacteristic) -M:HomeKit.HMAccessorySetupManager.PerformAccessorySetup(HomeKit.HMAccessorySetupRequest,System.Action{HomeKit.HMAccessorySetupResult,Foundation.NSError}) M:HomeKit.HMAccessorySetupManager.PerformAccessorySetupAsync(HomeKit.HMAccessorySetupRequest) -M:HomeKit.HMAccessorySetupPayload.#ctor(Foundation.NSUrl,HomeKit.HMAccessoryOwnershipToken) -M:HomeKit.HMAccessorySetupPayload.#ctor(Foundation.NSUrl) M:HomeKit.HMAccessorySetupRequest.Copy(Foundation.NSZone) M:HomeKit.HMAccessorySetupResult.Copy(Foundation.NSZone) M:HomeKit.HMAccessoryUpdateEventArgs.#ctor(HomeKit.HMService) -M:HomeKit.HMAction.#ctor -M:HomeKit.HMActionSet.AddAction(HomeKit.HMAction,System.Action{Foundation.NSError}) M:HomeKit.HMActionSet.AddActionAsync(HomeKit.HMAction) -M:HomeKit.HMActionSet.RemoveAction(HomeKit.HMAction,System.Action{Foundation.NSError}) M:HomeKit.HMActionSet.RemoveActionAsync(HomeKit.HMAction) -M:HomeKit.HMActionSet.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMActionSet.UpdateNameAsync(System.String) -M:HomeKit.HMAddAccessoryRequest.GetPayload(Foundation.NSUrl,HomeKit.HMAccessoryOwnershipToken) -M:HomeKit.HMAddAccessoryRequest.GetPayload(HomeKit.HMAccessoryOwnershipToken) -M:HomeKit.HMCalendarEvent.#ctor(Foundation.NSDateComponents) M:HomeKit.HMCalendarEvent.Copy(Foundation.NSZone) M:HomeKit.HMCalendarEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMCameraControl.#ctor -M:HomeKit.HMCameraSnapshot.#ctor -M:HomeKit.HMCameraSnapshotControl.#ctor M:HomeKit.HMCameraSnapshotControl.Dispose(System.Boolean) -M:HomeKit.HMCameraSnapshotControl.TakeSnapshot M:HomeKit.HMCameraSnapshotControlDelegate_Extensions.DidTakeSnapshot(HomeKit.IHMCameraSnapshotControlDelegate,HomeKit.HMCameraSnapshotControl,HomeKit.HMCameraSnapshot,Foundation.NSError) M:HomeKit.HMCameraSnapshotControlDelegate_Extensions.DidUpdateMostRecentSnapshot(HomeKit.IHMCameraSnapshotControlDelegate,HomeKit.HMCameraSnapshotControl) -M:HomeKit.HMCameraSnapshotControlDelegate.DidTakeSnapshot(HomeKit.HMCameraSnapshotControl,HomeKit.HMCameraSnapshot,Foundation.NSError) -M:HomeKit.HMCameraSnapshotControlDelegate.DidUpdateMostRecentSnapshot(HomeKit.HMCameraSnapshotControl) -M:HomeKit.HMCameraSource.#ctor -M:HomeKit.HMCameraStream.#ctor -M:HomeKit.HMCameraStream.UpdateAudioStreamSetting(HomeKit.HMCameraAudioStreamSetting,System.Action{Foundation.NSError}) M:HomeKit.HMCameraStream.UpdateAudioStreamSettingAsync(HomeKit.HMCameraAudioStreamSetting) -M:HomeKit.HMCameraStreamControl.#ctor M:HomeKit.HMCameraStreamControl.Dispose(System.Boolean) -M:HomeKit.HMCameraStreamControl.StartStream -M:HomeKit.HMCameraStreamControl.StopStream M:HomeKit.HMCameraStreamControlDelegate_Extensions.DidStartStream(HomeKit.IHMCameraStreamControlDelegate,HomeKit.HMCameraStreamControl) M:HomeKit.HMCameraStreamControlDelegate_Extensions.DidStopStream(HomeKit.IHMCameraStreamControlDelegate,HomeKit.HMCameraStreamControl,Foundation.NSError) -M:HomeKit.HMCameraStreamControlDelegate.DidStartStream(HomeKit.HMCameraStreamControl) -M:HomeKit.HMCameraStreamControlDelegate.DidStopStream(HomeKit.HMCameraStreamControl,Foundation.NSError) M:HomeKit.HMCameraView.#ctor(CoreGraphics.CGRect) M:HomeKit.HMCameraView.HMCameraViewAppearance.#ctor(System.IntPtr) -M:HomeKit.HMCharacteristic.#ctor M:HomeKit.HMCharacteristic.Dispose(System.Boolean) -M:HomeKit.HMCharacteristic.EnableNotification(System.Boolean,System.Action{Foundation.NSError}) M:HomeKit.HMCharacteristic.EnableNotificationAsync(System.Boolean) -M:HomeKit.HMCharacteristic.ReadValue(System.Action{Foundation.NSError}) M:HomeKit.HMCharacteristic.ReadValueAsync -M:HomeKit.HMCharacteristic.UpdateAuthorizationData(Foundation.NSData,System.Action{Foundation.NSError}) M:HomeKit.HMCharacteristic.UpdateAuthorizationDataAsync(Foundation.NSData) -M:HomeKit.HMCharacteristic.WriteValue(Foundation.NSObject,System.Action{Foundation.NSError}) M:HomeKit.HMCharacteristic.WriteValueAsync(Foundation.NSObject) -M:HomeKit.HMCharacteristicEvent.#ctor(HomeKit.HMCharacteristic,Foundation.INSCopying) M:HomeKit.HMCharacteristicEvent.Copy(Foundation.NSZone) M:HomeKit.HMCharacteristicEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMCharacteristicEvent.UpdateTriggerValue(Foundation.INSCopying,System.Action{Foundation.NSError}) M:HomeKit.HMCharacteristicEvent.UpdateTriggerValueAsync(Foundation.INSCopying) M:HomeKit.HMCharacteristicProperties.#ctor -M:HomeKit.HMCharacteristicThresholdRangeEvent.#ctor(HomeKit.HMCharacteristic,HomeKit.HMNumberRange) M:HomeKit.HMCharacteristicThresholdRangeEvent.Copy(Foundation.NSZone) M:HomeKit.HMCharacteristicThresholdRangeEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMCharacteristicWriteAction.#ctor(HomeKit.HMCharacteristic,Foundation.INSCopying) -M:HomeKit.HMCharacteristicWriteAction.UpdateTargetValue(Foundation.INSCopying,System.Action{Foundation.NSError}) M:HomeKit.HMCharacteristicWriteAction.UpdateTargetValueAsync(Foundation.INSCopying) -M:HomeKit.HMDurationEvent.#ctor(System.Double) M:HomeKit.HMDurationEvent.Copy(Foundation.NSZone) M:HomeKit.HMDurationEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMEvent.#ctor -M:HomeKit.HMEvent.IsSupported(HomeKit.HMHome) -M:HomeKit.HMEventTrigger.#ctor(System.String,HomeKit.HMEvent[],Foundation.NSPredicate) -M:HomeKit.HMEventTrigger.#ctor(System.String,HomeKit.HMEvent[],HomeKit.HMEvent[],Foundation.NSDateComponents[],Foundation.NSPredicate) -M:HomeKit.HMEventTrigger.AddEvent(HomeKit.HMEvent,System.Action{Foundation.NSError}) M:HomeKit.HMEventTrigger.AddEventAsync(HomeKit.HMEvent) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTrigger(HomeKit.HMCharacteristic,Foundation.NSPredicateOperatorType,Foundation.NSObject) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTrigger(HomeKit.HMPresenceEvent) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringAfterDate(Foundation.NSDateComponents) M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent(HomeKit.HMSignificantEvent,Foundation.NSDateComponents) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent(HomeKit.HMSignificantTimeEvent) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringBeforeDate(Foundation.NSDateComponents) M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent(HomeKit.HMSignificantEvent,Foundation.NSDateComponents) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent(HomeKit.HMSignificantTimeEvent) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringBetweenDates(Foundation.NSDateComponents,Foundation.NSDateComponents) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringBetweenSignificantEvent(HomeKit.HMSignificantTimeEvent,HomeKit.HMSignificantTimeEvent) -M:HomeKit.HMEventTrigger.CreatePredicateForEvaluatingTriggerOccurringOnDate(Foundation.NSDateComponents) -M:HomeKit.HMEventTrigger.RemoveEvent(HomeKit.HMEvent,System.Action{Foundation.NSError}) M:HomeKit.HMEventTrigger.RemoveEventAsync(HomeKit.HMEvent) -M:HomeKit.HMEventTrigger.UpdateEndEvents(HomeKit.HMEvent[],System.Action{Foundation.NSError}) M:HomeKit.HMEventTrigger.UpdateEndEventsAsync(HomeKit.HMEvent[]) -M:HomeKit.HMEventTrigger.UpdateEvents(HomeKit.HMEvent[],System.Action{Foundation.NSError}) M:HomeKit.HMEventTrigger.UpdateEventsAsync(HomeKit.HMEvent[]) -M:HomeKit.HMEventTrigger.UpdateExecuteOnce(System.Boolean,System.Action{Foundation.NSError}) M:HomeKit.HMEventTrigger.UpdateExecuteOnceAsync(System.Boolean) -M:HomeKit.HMEventTrigger.UpdatePredicate(Foundation.NSPredicate,System.Action{Foundation.NSError}) M:HomeKit.HMEventTrigger.UpdatePredicateAsync(Foundation.NSPredicate) -M:HomeKit.HMEventTrigger.UpdateRecurrences(Foundation.NSDateComponents[],System.Action{Foundation.NSError}) M:HomeKit.HMEventTrigger.UpdateRecurrencesAsync(Foundation.NSDateComponents[]) M:HomeKit.HMHome.add_DidAddAccessory(System.EventHandler{HomeKit.HMHomeAccessoryEventArgs}) M:HomeKit.HMHome.add_DidAddActionSet(System.EventHandler{HomeKit.HMHomeActionSetEventArgs}) @@ -38092,34 +35201,19 @@ M:HomeKit.HMHome.add_DidUpdateNameForZone(System.EventHandler{HomeKit.HMHomeZone M:HomeKit.HMHome.add_DidUpdateRoom(System.EventHandler{HomeKit.HMHomeRoomAccessoryEventArgs}) M:HomeKit.HMHome.add_DidUpdateSupportedFeatures(System.EventHandler) M:HomeKit.HMHome.add_DidUpdateTrigger(System.EventHandler{HomeKit.HMHomeTriggerEventArgs}) -M:HomeKit.HMHome.AddAccessory(HomeKit.HMAccessory,System.Action{Foundation.NSError}) M:HomeKit.HMHome.AddAccessoryAsync(HomeKit.HMAccessory) -M:HomeKit.HMHome.AddActionSet(System.String,System.Action{HomeKit.HMActionSet,Foundation.NSError}) M:HomeKit.HMHome.AddActionSetAsync(System.String) -M:HomeKit.HMHome.AddAndSetupAccessories(HomeKit.HMAccessorySetupPayload,System.Action{HomeKit.HMAccessory[],Foundation.NSError}) -M:HomeKit.HMHome.AddAndSetupAccessories(System.Action{Foundation.NSError}) M:HomeKit.HMHome.AddAndSetupAccessoriesAsync M:HomeKit.HMHome.AddAndSetupAccessoriesAsync(HomeKit.HMAccessorySetupPayload) -M:HomeKit.HMHome.AddRoom(System.String,System.Action{HomeKit.HMRoom,Foundation.NSError}) M:HomeKit.HMHome.AddRoomAsync(System.String) -M:HomeKit.HMHome.AddServiceGroup(System.String,System.Action{HomeKit.HMServiceGroup,Foundation.NSError}) M:HomeKit.HMHome.AddServiceGroupAsync(System.String) -M:HomeKit.HMHome.AddTrigger(HomeKit.HMTrigger,System.Action{Foundation.NSError}) M:HomeKit.HMHome.AddTriggerAsync(HomeKit.HMTrigger) -M:HomeKit.HMHome.AddUser(System.Action{HomeKit.HMUser,Foundation.NSError}) M:HomeKit.HMHome.AddUserAsync -M:HomeKit.HMHome.AddZone(System.String,System.Action{HomeKit.HMZone,Foundation.NSError}) M:HomeKit.HMHome.AddZoneAsync(System.String) -M:HomeKit.HMHome.AssignAccessory(HomeKit.HMAccessory,HomeKit.HMRoom,System.Action{Foundation.NSError}) M:HomeKit.HMHome.AssignAccessoryAsync(HomeKit.HMAccessory,HomeKit.HMRoom) M:HomeKit.HMHome.Dispose(System.Boolean) -M:HomeKit.HMHome.ExecuteActionSet(HomeKit.HMActionSet,System.Action{Foundation.NSError}) M:HomeKit.HMHome.ExecuteActionSetAsync(HomeKit.HMActionSet) -M:HomeKit.HMHome.GetBuiltinActionSet(System.String) -M:HomeKit.HMHome.GetHomeAccessControl(HomeKit.HMUser) -M:HomeKit.HMHome.GetRoomForEntireHome M:HomeKit.HMHome.GetServices(HomeKit.HMServiceType) -M:HomeKit.HMHome.ManageUsers(System.Action{Foundation.NSError}) M:HomeKit.HMHome.ManageUsersAsync M:HomeKit.HMHome.remove_DidAddAccessory(System.EventHandler{HomeKit.HMHomeAccessoryEventArgs}) M:HomeKit.HMHome.remove_DidAddActionSet(System.EventHandler{HomeKit.HMHomeActionSetEventArgs}) @@ -38153,21 +35247,13 @@ M:HomeKit.HMHome.remove_DidUpdateNameForZone(System.EventHandler{HomeKit.HMHomeZ M:HomeKit.HMHome.remove_DidUpdateRoom(System.EventHandler{HomeKit.HMHomeRoomAccessoryEventArgs}) M:HomeKit.HMHome.remove_DidUpdateSupportedFeatures(System.EventHandler) M:HomeKit.HMHome.remove_DidUpdateTrigger(System.EventHandler{HomeKit.HMHomeTriggerEventArgs}) -M:HomeKit.HMHome.RemoveAccessory(HomeKit.HMAccessory,System.Action{Foundation.NSError}) M:HomeKit.HMHome.RemoveAccessoryAsync(HomeKit.HMAccessory) -M:HomeKit.HMHome.RemoveActionSet(HomeKit.HMActionSet,System.Action{Foundation.NSError}) M:HomeKit.HMHome.RemoveActionSetAsync(HomeKit.HMActionSet) -M:HomeKit.HMHome.RemoveRoom(HomeKit.HMRoom,System.Action{Foundation.NSError}) M:HomeKit.HMHome.RemoveRoomAsync(HomeKit.HMRoom) -M:HomeKit.HMHome.RemoveServiceGroup(HomeKit.HMServiceGroup,System.Action{Foundation.NSError}) M:HomeKit.HMHome.RemoveServiceGroupAsync(HomeKit.HMServiceGroup) -M:HomeKit.HMHome.RemoveTrigger(HomeKit.HMTrigger,System.Action{Foundation.NSError}) M:HomeKit.HMHome.RemoveTriggerAsync(HomeKit.HMTrigger) -M:HomeKit.HMHome.RemoveZone(HomeKit.HMZone,System.Action{Foundation.NSError}) M:HomeKit.HMHome.RemoveZoneAsync(HomeKit.HMZone) -M:HomeKit.HMHome.UnblockAccessory(HomeKit.HMAccessory,System.Action{Foundation.NSError}) M:HomeKit.HMHome.UnblockAccessoryAsync(HomeKit.HMAccessory) -M:HomeKit.HMHome.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMHome.UpdateNameAsync(System.String) M:HomeKit.HMHomeAccessoryEventArgs.#ctor(HomeKit.HMAccessory) M:HomeKit.HMHomeActionSetEventArgs.#ctor(HomeKit.HMActionSet) @@ -38203,38 +35289,6 @@ M:HomeKit.HMHomeDelegate_Extensions.DidUpdateNameForZone(HomeKit.IHMHomeDelegate M:HomeKit.HMHomeDelegate_Extensions.DidUpdateRoom(HomeKit.IHMHomeDelegate,HomeKit.HMHome,HomeKit.HMRoom,HomeKit.HMAccessory) M:HomeKit.HMHomeDelegate_Extensions.DidUpdateSupportedFeatures(HomeKit.IHMHomeDelegate,HomeKit.HMHome) M:HomeKit.HMHomeDelegate_Extensions.DidUpdateTrigger(HomeKit.IHMHomeDelegate,HomeKit.HMHome,HomeKit.HMTrigger) -M:HomeKit.HMHomeDelegate.DidAddAccessory(HomeKit.HMHome,HomeKit.HMAccessory) -M:HomeKit.HMHomeDelegate.DidAddActionSet(HomeKit.HMHome,HomeKit.HMActionSet) -M:HomeKit.HMHomeDelegate.DidAddRoom(HomeKit.HMHome,HomeKit.HMRoom) -M:HomeKit.HMHomeDelegate.DidAddRoomToZone(HomeKit.HMHome,HomeKit.HMRoom,HomeKit.HMZone) -M:HomeKit.HMHomeDelegate.DidAddService(HomeKit.HMHome,HomeKit.HMService,HomeKit.HMServiceGroup) -M:HomeKit.HMHomeDelegate.DidAddServiceGroup(HomeKit.HMHome,HomeKit.HMServiceGroup) -M:HomeKit.HMHomeDelegate.DidAddTrigger(HomeKit.HMHome,HomeKit.HMTrigger) -M:HomeKit.HMHomeDelegate.DidAddUser(HomeKit.HMHome,HomeKit.HMUser) -M:HomeKit.HMHomeDelegate.DidAddZone(HomeKit.HMHome,HomeKit.HMZone) -M:HomeKit.HMHomeDelegate.DidEncounterError(HomeKit.HMHome,Foundation.NSError,HomeKit.HMAccessory) -M:HomeKit.HMHomeDelegate.DidRemoveAccessory(HomeKit.HMHome,HomeKit.HMAccessory) -M:HomeKit.HMHomeDelegate.DidRemoveActionSet(HomeKit.HMHome,HomeKit.HMActionSet) -M:HomeKit.HMHomeDelegate.DidRemoveRoom(HomeKit.HMHome,HomeKit.HMRoom) -M:HomeKit.HMHomeDelegate.DidRemoveRoomFromZone(HomeKit.HMHome,HomeKit.HMRoom,HomeKit.HMZone) -M:HomeKit.HMHomeDelegate.DidRemoveService(HomeKit.HMHome,HomeKit.HMService,HomeKit.HMServiceGroup) -M:HomeKit.HMHomeDelegate.DidRemoveServiceGroup(HomeKit.HMHome,HomeKit.HMServiceGroup) -M:HomeKit.HMHomeDelegate.DidRemoveTrigger(HomeKit.HMHome,HomeKit.HMTrigger) -M:HomeKit.HMHomeDelegate.DidRemoveUser(HomeKit.HMHome,HomeKit.HMUser) -M:HomeKit.HMHomeDelegate.DidRemoveZone(HomeKit.HMHome,HomeKit.HMZone) -M:HomeKit.HMHomeDelegate.DidUnblockAccessory(HomeKit.HMHome,HomeKit.HMAccessory) -M:HomeKit.HMHomeDelegate.DidUpdateAccessControlForCurrentUser(HomeKit.HMHome) -M:HomeKit.HMHomeDelegate.DidUpdateActionsForActionSet(HomeKit.HMHome,HomeKit.HMActionSet) -M:HomeKit.HMHomeDelegate.DidUpdateHomeHubState(HomeKit.HMHome,HomeKit.HMHomeHubState) -M:HomeKit.HMHomeDelegate.DidUpdateNameForActionSet(HomeKit.HMHome,HomeKit.HMActionSet) -M:HomeKit.HMHomeDelegate.DidUpdateNameForHome(HomeKit.HMHome) -M:HomeKit.HMHomeDelegate.DidUpdateNameForRoom(HomeKit.HMHome,HomeKit.HMRoom) -M:HomeKit.HMHomeDelegate.DidUpdateNameForServiceGroup(HomeKit.HMHome,HomeKit.HMServiceGroup) -M:HomeKit.HMHomeDelegate.DidUpdateNameForTrigger(HomeKit.HMHome,HomeKit.HMTrigger) -M:HomeKit.HMHomeDelegate.DidUpdateNameForZone(HomeKit.HMHome,HomeKit.HMZone) -M:HomeKit.HMHomeDelegate.DidUpdateRoom(HomeKit.HMHome,HomeKit.HMRoom,HomeKit.HMAccessory) -M:HomeKit.HMHomeDelegate.DidUpdateSupportedFeatures(HomeKit.HMHome) -M:HomeKit.HMHomeDelegate.DidUpdateTrigger(HomeKit.HMHome,HomeKit.HMTrigger) M:HomeKit.HMHomeErrorAccessoryEventArgs.#ctor(Foundation.NSError,HomeKit.HMAccessory) M:HomeKit.HMHomeHubStateEventArgs.#ctor(HomeKit.HMHomeHubState) M:HomeKit.HMHomeManager.add_DidAddHome(System.EventHandler{HomeKit.HMHomeManagerEventArgs}) @@ -38243,7 +35297,6 @@ M:HomeKit.HMHomeManager.add_DidRemoveHome(System.EventHandler{HomeKit.HMHomeMana M:HomeKit.HMHomeManager.add_DidUpdateAuthorizationStatus(System.EventHandler{HomeKit.HMHomeManagerAuthorizationStatusEventArgs}) M:HomeKit.HMHomeManager.add_DidUpdateHomes(System.EventHandler) M:HomeKit.HMHomeManager.add_DidUpdatePrimaryHome(System.EventHandler) -M:HomeKit.HMHomeManager.AddHome(System.String,System.Action{HomeKit.HMHome,Foundation.NSError}) M:HomeKit.HMHomeManager.AddHomeAsync(System.String) M:HomeKit.HMHomeManager.Dispose(System.Boolean) M:HomeKit.HMHomeManager.remove_DidAddHome(System.EventHandler{HomeKit.HMHomeManagerEventArgs}) @@ -38252,9 +35305,7 @@ M:HomeKit.HMHomeManager.remove_DidRemoveHome(System.EventHandler{HomeKit.HMHomeM M:HomeKit.HMHomeManager.remove_DidUpdateAuthorizationStatus(System.EventHandler{HomeKit.HMHomeManagerAuthorizationStatusEventArgs}) M:HomeKit.HMHomeManager.remove_DidUpdateHomes(System.EventHandler) M:HomeKit.HMHomeManager.remove_DidUpdatePrimaryHome(System.EventHandler) -M:HomeKit.HMHomeManager.RemoveHome(HomeKit.HMHome,System.Action{Foundation.NSError}) M:HomeKit.HMHomeManager.RemoveHomeAsync(HomeKit.HMHome) -M:HomeKit.HMHomeManager.UpdatePrimaryHome(HomeKit.HMHome,System.Action{Foundation.NSError}) M:HomeKit.HMHomeManager.UpdatePrimaryHomeAsync(HomeKit.HMHome) M:HomeKit.HMHomeManagerAddAccessoryRequestEventArgs.#ctor(HomeKit.HMAddAccessoryRequest) M:HomeKit.HMHomeManagerAuthorizationStatusEventArgs.#ctor(HomeKit.HMHomeManagerAuthorizationStatus) @@ -38264,12 +35315,6 @@ M:HomeKit.HMHomeManagerDelegate_Extensions.DidRemoveHome(HomeKit.IHMHomeManagerD M:HomeKit.HMHomeManagerDelegate_Extensions.DidUpdateAuthorizationStatus(HomeKit.IHMHomeManagerDelegate,HomeKit.HMHomeManager,HomeKit.HMHomeManagerAuthorizationStatus) M:HomeKit.HMHomeManagerDelegate_Extensions.DidUpdateHomes(HomeKit.IHMHomeManagerDelegate,HomeKit.HMHomeManager) M:HomeKit.HMHomeManagerDelegate_Extensions.DidUpdatePrimaryHome(HomeKit.IHMHomeManagerDelegate,HomeKit.HMHomeManager) -M:HomeKit.HMHomeManagerDelegate.DidAddHome(HomeKit.HMHomeManager,HomeKit.HMHome) -M:HomeKit.HMHomeManagerDelegate.DidReceiveAddAccessoryRequest(HomeKit.HMHomeManager,HomeKit.HMAddAccessoryRequest) -M:HomeKit.HMHomeManagerDelegate.DidRemoveHome(HomeKit.HMHomeManager,HomeKit.HMHome) -M:HomeKit.HMHomeManagerDelegate.DidUpdateAuthorizationStatus(HomeKit.HMHomeManager,HomeKit.HMHomeManagerAuthorizationStatus) -M:HomeKit.HMHomeManagerDelegate.DidUpdateHomes(HomeKit.HMHomeManager) -M:HomeKit.HMHomeManagerDelegate.DidUpdatePrimaryHome(HomeKit.HMHomeManager) M:HomeKit.HMHomeManagerEventArgs.#ctor(HomeKit.HMHome) M:HomeKit.HMHomeRoomAccessoryEventArgs.#ctor(HomeKit.HMRoom,HomeKit.HMAccessory) M:HomeKit.HMHomeRoomEventArgs.#ctor(HomeKit.HMRoom) @@ -38279,10 +35324,8 @@ M:HomeKit.HMHomeServiceServiceGroupEventArgs.#ctor(HomeKit.HMService,HomeKit.HMS M:HomeKit.HMHomeTriggerEventArgs.#ctor(HomeKit.HMTrigger) M:HomeKit.HMHomeUserEventArgs.#ctor(HomeKit.HMUser) M:HomeKit.HMHomeZoneEventArgs.#ctor(HomeKit.HMZone) -M:HomeKit.HMLocationEvent.#ctor(CoreLocation.CLRegion) M:HomeKit.HMLocationEvent.Copy(Foundation.NSZone) M:HomeKit.HMLocationEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMLocationEvent.UpdateRegion(CoreLocation.CLRegion,System.Action{Foundation.NSError}) M:HomeKit.HMLocationEvent.UpdateRegionAsync(CoreLocation.CLRegion) M:HomeKit.HMMatterHome.#ctor(Foundation.NSCoder) M:HomeKit.HMMatterHome.#ctor(Foundation.NSObjectFlag) @@ -38312,62 +35355,34 @@ M:HomeKit.HMMatterTopology.#ctor(HomeKit.HMMatterHome[]) M:HomeKit.HMMatterTopology.#ctor(ObjCRuntime.NativeHandle) M:HomeKit.HMMatterTopology.Copy(Foundation.NSZone) M:HomeKit.HMMatterTopology.EncodeTo(Foundation.NSCoder) -M:HomeKit.HMMutableCalendarEvent.#ctor(Foundation.NSDateComponents) -M:HomeKit.HMMutableCharacteristicEvent.#ctor(HomeKit.HMCharacteristic,Foundation.INSCopying) M:HomeKit.HMMutableCharacteristicEvent.Copy(Foundation.NSZone) M:HomeKit.HMMutableCharacteristicEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMMutableCharacteristicThresholdRangeEvent.#ctor(HomeKit.HMCharacteristic,HomeKit.HMNumberRange) -M:HomeKit.HMMutableDurationEvent.#ctor(System.Double) -M:HomeKit.HMMutableLocationEvent.#ctor(CoreLocation.CLRegion) M:HomeKit.HMMutableSignificantTimeEvent.#ctor(HomeKit.HMSignificantEvent,Foundation.NSDateComponents) M:HomeKit.HMNetworkConfigurationProfile.Dispose(System.Boolean) M:HomeKit.HMNetworkConfigurationProfileDelegate_Extensions.DidUpdateNetworkAccessMode(HomeKit.IHMNetworkConfigurationProfileDelegate,HomeKit.HMNetworkConfigurationProfile) -M:HomeKit.HMNetworkConfigurationProfileDelegate.DidUpdateNetworkAccessMode(HomeKit.HMNetworkConfigurationProfile) -M:HomeKit.HMNumberRange.FromMax(Foundation.NSNumber) -M:HomeKit.HMNumberRange.FromMin(Foundation.NSNumber) -M:HomeKit.HMNumberRange.FromRange(Foundation.NSNumber,Foundation.NSNumber) -M:HomeKit.HMPresenceEvent.#ctor(HomeKit.HMPresenceEventType,HomeKit.HMPresenceEventUserType) M:HomeKit.HMPresenceEvent.Copy(Foundation.NSZone) M:HomeKit.HMPresenceEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMRoom.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMRoom.UpdateNameAsync(System.String) -M:HomeKit.HMService.#ctor M:HomeKit.HMService.Dispose(System.Boolean) M:HomeKit.HMService.UpdateAssociatedServiceType(HomeKit.HMServiceType,System.Action{Foundation.NSError}) M:HomeKit.HMService.UpdateAssociatedServiceTypeAsync(HomeKit.HMServiceType) -M:HomeKit.HMService.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMService.UpdateNameAsync(System.String) -M:HomeKit.HMServiceGroup.AddService(HomeKit.HMService,System.Action{Foundation.NSError}) M:HomeKit.HMServiceGroup.AddServiceAsync(HomeKit.HMService) -M:HomeKit.HMServiceGroup.RemoveService(HomeKit.HMService,System.Action{Foundation.NSError}) M:HomeKit.HMServiceGroup.RemoveServiceAsync(HomeKit.HMService) -M:HomeKit.HMServiceGroup.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMServiceGroup.UpdateNameAsync(System.String) M:HomeKit.HMServiceTypeExtensions.ToFlags(System.Collections.Generic.IEnumerable{Foundation.NSString}) M:HomeKit.HMSignificantTimeEvent.#ctor(HomeKit.HMSignificantEvent,Foundation.NSDateComponents) M:HomeKit.HMSignificantTimeEvent.Copy(Foundation.NSZone) M:HomeKit.HMSignificantTimeEvent.MutableCopy(Foundation.NSZone) -M:HomeKit.HMTimerTrigger.#ctor(System.String,Foundation.NSDate,Foundation.NSDateComponents) -M:HomeKit.HMTimerTrigger.#ctor(System.String,Foundation.NSDate,Foundation.NSTimeZone,Foundation.NSDateComponents,Foundation.NSCalendar) -M:HomeKit.HMTimerTrigger.UpdateFireDate(Foundation.NSDate,System.Action{Foundation.NSError}) M:HomeKit.HMTimerTrigger.UpdateFireDateAsync(Foundation.NSDate) -M:HomeKit.HMTimerTrigger.UpdateRecurrence(Foundation.NSDateComponents,System.Action{Foundation.NSError}) M:HomeKit.HMTimerTrigger.UpdateRecurrenceAsync(Foundation.NSDateComponents) -M:HomeKit.HMTimerTrigger.UpdateTimeZone(Foundation.NSTimeZone,System.Action{Foundation.NSError}) M:HomeKit.HMTimerTrigger.UpdateTimeZoneAsync(Foundation.NSTimeZone) -M:HomeKit.HMTrigger.AddActionSet(HomeKit.HMActionSet,System.Action{Foundation.NSError}) M:HomeKit.HMTrigger.AddActionSetAsync(HomeKit.HMActionSet) -M:HomeKit.HMTrigger.Enable(System.Boolean,System.Action{Foundation.NSError}) M:HomeKit.HMTrigger.EnableAsync(System.Boolean) -M:HomeKit.HMTrigger.RemoveActionSet(HomeKit.HMActionSet,System.Action{Foundation.NSError}) M:HomeKit.HMTrigger.RemoveActionSetAsync(HomeKit.HMActionSet) -M:HomeKit.HMTrigger.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMTrigger.UpdateNameAsync(System.String) -M:HomeKit.HMZone.AddRoom(HomeKit.HMRoom,System.Action{Foundation.NSError}) M:HomeKit.HMZone.AddRoomAsync(HomeKit.HMRoom) -M:HomeKit.HMZone.RemoveRoom(HomeKit.HMRoom,System.Action{Foundation.NSError}) M:HomeKit.HMZone.RemoveRoomAsync(HomeKit.HMRoom) -M:HomeKit.HMZone.UpdateName(System.String,System.Action{Foundation.NSError}) M:HomeKit.HMZone.UpdateNameAsync(System.String) M:HomeKit.IHMAccessoryBrowserDelegate.DidFindNewAccessory(HomeKit.HMAccessoryBrowser,HomeKit.HMAccessory) M:HomeKit.IHMAccessoryBrowserDelegate.DidRemoveNewAccessory(HomeKit.HMAccessoryBrowser,HomeKit.HMAccessory) @@ -38444,46 +35459,16 @@ M:ImageCaptureCore.ICCameraDeviceDelegate_Extensions.DidReceiveThumbnailForItem( M:ImageCaptureCore.ICCameraDeviceDelegate_Extensions.DidRemoveItems(ImageCaptureCore.IICCameraDeviceDelegate,ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem[]) M:ImageCaptureCore.ICCameraDeviceDelegate_Extensions.ShouldGetMetadata(ImageCaptureCore.IICCameraDeviceDelegate,ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) M:ImageCaptureCore.ICCameraDeviceDelegate_Extensions.ShouldGetThumbnail(ImageCaptureCore.IICCameraDeviceDelegate,ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidAddItem(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidAddItems(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem[]) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidBecomeReady(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidBecomeReadyWithCompleteContentCatalog(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidChangeCapability(ImageCaptureCore.ICCameraDevice) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidChangeName(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidChangeSharingState(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidCloseSession(ImageCaptureCore.ICDevice,Foundation.NSError) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidCompleteDeleteFiles(ImageCaptureCore.ICCameraDevice,Foundation.NSError) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidEncounterError(ImageCaptureCore.ICDevice,Foundation.NSError) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidOpenSession(ImageCaptureCore.ICDevice,Foundation.NSError) M:ImageCaptureCore.ICCameraDeviceDelegate.DidReceiveButtonPress(ImageCaptureCore.ICDevice,Foundation.NSString) M:ImageCaptureCore.ICCameraDeviceDelegate.DidReceiveCustomNotification(ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},Foundation.NSData) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidReceiveMetadata(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidReceivePtpEvent(ImageCaptureCore.ICCameraDevice,Foundation.NSData) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidReceiveStatusInformation(ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidReceiveThumbnail(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidReceiveThumbnailForItem(ImageCaptureCore.ICCameraDevice,System.IntPtr,ImageCaptureCore.ICCameraItem,Foundation.NSError) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidRemoveDevice(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidRemoveItem(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidRemoveItems(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem[]) -M:ImageCaptureCore.ICCameraDeviceDelegate.DidRenameItems(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem[]) -M:ImageCaptureCore.ICCameraDeviceDelegate.ShouldGetMetadata(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) -M:ImageCaptureCore.ICCameraDeviceDelegate.ShouldGetThumbnail(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) M:ImageCaptureCore.ICCameraDeviceDownloadDelegate_Extensions.DidDownloadFile(ImageCaptureCore.IICCameraDeviceDownloadDelegate,ImageCaptureCore.ICCameraFile,Foundation.NSError,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.IntPtr) M:ImageCaptureCore.ICCameraDeviceDownloadDelegate_Extensions.DidReceiveDownloadProgress(ImageCaptureCore.IICCameraDeviceDownloadDelegate,ImageCaptureCore.ICCameraFile,System.Int64,System.Int64) -M:ImageCaptureCore.ICCameraDeviceDownloadDelegate.DidDownloadFile(ImageCaptureCore.ICCameraFile,Foundation.NSError,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.IntPtr) -M:ImageCaptureCore.ICCameraDeviceDownloadDelegate.DidReceiveDownloadProgress(ImageCaptureCore.ICCameraFile,System.Int64,System.Int64) M:ImageCaptureCore.ICDevice.Dispose(System.Boolean) M:ImageCaptureCore.ICDeviceBrowser.Dispose(System.Boolean) M:ImageCaptureCore.ICDeviceBrowserDelegate_Extensions.DeviceDidChangeName(ImageCaptureCore.IICDeviceBrowserDelegate,ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice) M:ImageCaptureCore.ICDeviceBrowserDelegate_Extensions.DeviceDidChangeSharingState(ImageCaptureCore.IICDeviceBrowserDelegate,ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice) M:ImageCaptureCore.ICDeviceBrowserDelegate_Extensions.DidEnumerateLocalDevices(ImageCaptureCore.IICDeviceBrowserDelegate,ImageCaptureCore.ICDeviceBrowser) M:ImageCaptureCore.ICDeviceBrowserDelegate_Extensions.RequestsSelectDevice(ImageCaptureCore.IICDeviceBrowserDelegate,ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICDeviceBrowserDelegate.DeviceDidChangeName(ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICDeviceBrowserDelegate.DeviceDidChangeSharingState(ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICDeviceBrowserDelegate.DidAddDevice(ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice,System.Boolean) -M:ImageCaptureCore.ICDeviceBrowserDelegate.DidEnumerateLocalDevices(ImageCaptureCore.ICDeviceBrowser) -M:ImageCaptureCore.ICDeviceBrowserDelegate.DidRemoveDevice(ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice,System.Boolean) -M:ImageCaptureCore.ICDeviceBrowserDelegate.RequestsSelectDevice(ImageCaptureCore.ICDeviceBrowser,ImageCaptureCore.ICDevice) M:ImageCaptureCore.ICDeviceDelegate_Extensions.DidBecomeReady(ImageCaptureCore.IICDeviceDelegate,ImageCaptureCore.ICDevice) M:ImageCaptureCore.ICDeviceDelegate_Extensions.DidChangeName(ImageCaptureCore.IICDeviceDelegate,ImageCaptureCore.ICDevice) M:ImageCaptureCore.ICDeviceDelegate_Extensions.DidChangeSharingState(ImageCaptureCore.IICDeviceDelegate,ImageCaptureCore.ICDevice) @@ -38493,16 +35478,8 @@ M:ImageCaptureCore.ICDeviceDelegate_Extensions.DidOpenSession(ImageCaptureCore.I M:ImageCaptureCore.ICDeviceDelegate_Extensions.DidReceiveButtonPress(ImageCaptureCore.IICDeviceDelegate,ImageCaptureCore.ICDevice,Foundation.NSString) M:ImageCaptureCore.ICDeviceDelegate_Extensions.DidReceiveCustomNotification(ImageCaptureCore.IICDeviceDelegate,ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},Foundation.NSData) M:ImageCaptureCore.ICDeviceDelegate_Extensions.DidReceiveStatusInformation(ImageCaptureCore.IICDeviceDelegate,ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:ImageCaptureCore.ICDeviceDelegate.DidBecomeReady(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICDeviceDelegate.DidChangeName(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICDeviceDelegate.DidChangeSharingState(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICDeviceDelegate.DidCloseSession(ImageCaptureCore.ICDevice,Foundation.NSError) -M:ImageCaptureCore.ICDeviceDelegate.DidEncounterError(ImageCaptureCore.ICDevice,Foundation.NSError) -M:ImageCaptureCore.ICDeviceDelegate.DidOpenSession(ImageCaptureCore.ICDevice,Foundation.NSError) M:ImageCaptureCore.ICDeviceDelegate.DidReceiveButtonPress(ImageCaptureCore.ICDevice,Foundation.NSString) M:ImageCaptureCore.ICDeviceDelegate.DidReceiveCustomNotification(ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},Foundation.NSData) -M:ImageCaptureCore.ICDeviceDelegate.DidReceiveStatusInformation(ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:ImageCaptureCore.ICDeviceDelegate.DidRemoveDevice(ImageCaptureCore.ICDevice) M:ImageCaptureCore.ICScannerDeviceDelegate_Extensions.DidBecomeAvailable(ImageCaptureCore.IICScannerDeviceDelegate,ImageCaptureCore.ICScannerDevice) M:ImageCaptureCore.ICScannerDeviceDelegate_Extensions.DidCompleteOverviewScan(ImageCaptureCore.IICScannerDeviceDelegate,ImageCaptureCore.ICScannerDevice,Foundation.NSError) M:ImageCaptureCore.ICScannerDeviceDelegate_Extensions.DidCompleteScan(ImageCaptureCore.IICScannerDeviceDelegate,ImageCaptureCore.ICScannerDevice,Foundation.NSError) @@ -38510,23 +35487,8 @@ M:ImageCaptureCore.ICScannerDeviceDelegate_Extensions.DidScanToBandData(ImageCap M:ImageCaptureCore.ICScannerDeviceDelegate_Extensions.DidScanToUrl(ImageCaptureCore.IICScannerDeviceDelegate,ImageCaptureCore.ICScannerDevice,Foundation.NSUrl,Foundation.NSData) M:ImageCaptureCore.ICScannerDeviceDelegate_Extensions.DidScanToUrl(ImageCaptureCore.IICScannerDeviceDelegate,ImageCaptureCore.ICScannerDevice,Foundation.NSUrl) M:ImageCaptureCore.ICScannerDeviceDelegate_Extensions.DidSelectFunctionalUnit(ImageCaptureCore.IICScannerDeviceDelegate,ImageCaptureCore.ICScannerDevice,ImageCaptureCore.ICScannerFunctionalUnit,Foundation.NSError) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidBecomeAvailable(ImageCaptureCore.ICScannerDevice) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidBecomeReady(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidChangeName(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidChangeSharingState(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidCloseSession(ImageCaptureCore.ICDevice,Foundation.NSError) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidCompleteOverviewScan(ImageCaptureCore.ICScannerDevice,Foundation.NSError) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidCompleteScan(ImageCaptureCore.ICScannerDevice,Foundation.NSError) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidEncounterError(ImageCaptureCore.ICDevice,Foundation.NSError) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidOpenSession(ImageCaptureCore.ICDevice,Foundation.NSError) M:ImageCaptureCore.ICScannerDeviceDelegate.DidReceiveButtonPress(ImageCaptureCore.ICDevice,Foundation.NSString) M:ImageCaptureCore.ICScannerDeviceDelegate.DidReceiveCustomNotification(ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},Foundation.NSData) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidReceiveStatusInformation(ImageCaptureCore.ICDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidRemoveDevice(ImageCaptureCore.ICDevice) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidScanToBandData(ImageCaptureCore.ICScannerDevice,ImageCaptureCore.ICScannerBandData) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidScanToUrl(ImageCaptureCore.ICScannerDevice,Foundation.NSUrl,Foundation.NSData) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidScanToUrl(ImageCaptureCore.ICScannerDevice,Foundation.NSUrl) -M:ImageCaptureCore.ICScannerDeviceDelegate.DidSelectFunctionalUnit(ImageCaptureCore.ICScannerDevice,ImageCaptureCore.ICScannerFunctionalUnit,Foundation.NSError) M:ImageCaptureCore.ICScannerFeatureEnumeration.Dispose(System.Boolean) M:ImageCaptureCore.IICCameraDeviceDelegate.DidAddItem(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem) M:ImageCaptureCore.IICCameraDeviceDelegate.DidAddItems(ImageCaptureCore.ICCameraDevice,ImageCaptureCore.ICCameraItem[]) @@ -39176,24 +36138,12 @@ M:Intents.IINUpdateMediaAffinityIntentHandling.Confirm(Intents.INUpdateMediaAffi M:Intents.IINUpdateMediaAffinityIntentHandling.HandleUpdateMediaAffinity(Intents.INUpdateMediaAffinityIntent,System.Action{Intents.INUpdateMediaAffinityIntentResponse}) M:Intents.IINUpdateMediaAffinityIntentHandling.ResolveAffinityType(Intents.INUpdateMediaAffinityIntent,System.Action{Intents.INMediaAffinityTypeResolutionResult}) M:Intents.IINUpdateMediaAffinityIntentHandling.ResolveMediaItems(Intents.INUpdateMediaAffinityIntent,System.Action{Foundation.NSArray{Intents.INUpdateMediaAffinityMediaItemResolutionResult}}) -M:Intents.INAccountTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INAccountTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INActivateCarSignalIntentHandling_Extensions.Confirm(Intents.IINActivateCarSignalIntentHandling,Intents.INActivateCarSignalIntent,System.Action{Intents.INActivateCarSignalIntentResponse}) M:Intents.INActivateCarSignalIntentHandling_Extensions.ResolveCarName(Intents.IINActivateCarSignalIntentHandling,Intents.INActivateCarSignalIntent,System.Action{Intents.INSpeakableStringResolutionResult}) M:Intents.INActivateCarSignalIntentHandling_Extensions.ResolveSignals(Intents.IINActivateCarSignalIntentHandling,Intents.INActivateCarSignalIntent,System.Action{Intents.INCarSignalOptionsResolutionResult}) M:Intents.INAddMediaIntentHandling_Extensions.Confirm(Intents.IINAddMediaIntentHandling,Intents.INAddMediaIntent,System.Action{Intents.INAddMediaIntentResponse}) M:Intents.INAddMediaIntentHandling_Extensions.ResolveMediaDestination(Intents.IINAddMediaIntentHandling,Intents.INAddMediaIntent,System.Action{Intents.INAddMediaMediaDestinationResolutionResult}) M:Intents.INAddMediaIntentHandling_Extensions.ResolveMediaItems(Intents.IINAddMediaIntentHandling,Intents.INAddMediaIntent,System.Action{Intents.INAddMediaMediaItemResolutionResult[]}) -M:Intents.INAddMediaMediaDestinationResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INAddMediaMediaDestinationResolutionResult.GetConfirmationRequired(Intents.INMediaDestination) -M:Intents.INAddMediaMediaDestinationResolutionResult.GetDisambiguation(Intents.INMediaDestination[]) -M:Intents.INAddMediaMediaDestinationResolutionResult.GetSuccess(Intents.INMediaDestination) -M:Intents.INAddMediaMediaDestinationResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INAddMediaMediaItemResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INAddMediaMediaItemResolutionResult.GetConfirmationRequired(Intents.INMediaItem) -M:Intents.INAddMediaMediaItemResolutionResult.GetDisambiguation(Intents.INMediaItem[]) -M:Intents.INAddMediaMediaItemResolutionResult.GetSuccess(Intents.INMediaItem) -M:Intents.INAddMediaMediaItemResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INAddTasksIntentHandling_Extensions.Confirm(Intents.IINAddTasksIntentHandling,Intents.INAddTasksIntent,System.Action{Intents.INAddTasksIntentResponse}) M:Intents.INAddTasksIntentHandling_Extensions.ResolvePriority(Intents.IINAddTasksIntentHandling,Intents.INAddTasksIntent,System.Action{Intents.INTaskPriorityResolutionResult}) M:Intents.INAddTasksIntentHandling_Extensions.ResolveSpatialEventTrigger(Intents.IINAddTasksIntentHandling,Intents.INAddTasksIntent,System.Action{Intents.INSpatialEventTriggerResolutionResult}) @@ -39202,16 +36152,6 @@ M:Intents.INAddTasksIntentHandling_Extensions.ResolveTargetTaskList(Intents.IINA M:Intents.INAddTasksIntentHandling_Extensions.ResolveTaskTitles(Intents.IINAddTasksIntentHandling,Intents.INAddTasksIntent,System.Action{Intents.INSpeakableStringResolutionResult[]}) M:Intents.INAddTasksIntentHandling_Extensions.ResolveTemporalEventTrigger(Intents.IINAddTasksIntentHandling,Intents.INAddTasksIntent,System.Action{Intents.INAddTasksTemporalEventTriggerResolutionResult}) M:Intents.INAddTasksIntentHandling_Extensions.ResolveTemporalEventTrigger(Intents.IINAddTasksIntentHandling,Intents.INAddTasksIntent,System.Action{Intents.INTemporalEventTriggerResolutionResult}) -M:Intents.INAddTasksTargetTaskListResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INAddTasksTargetTaskListResolutionResult.GetConfirmationRequired(Intents.INTaskList) -M:Intents.INAddTasksTargetTaskListResolutionResult.GetDisambiguation(Intents.INTaskList[]) -M:Intents.INAddTasksTargetTaskListResolutionResult.GetSuccess(Intents.INTaskList) -M:Intents.INAddTasksTargetTaskListResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INAddTasksTemporalEventTriggerResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INAddTasksTemporalEventTriggerResolutionResult.GetConfirmationRequired(Intents.INTemporalEventTrigger) -M:Intents.INAddTasksTemporalEventTriggerResolutionResult.GetDisambiguation(Intents.INTemporalEventTrigger[]) -M:Intents.INAddTasksTemporalEventTriggerResolutionResult.GetSuccess(Intents.INTemporalEventTrigger) -M:Intents.INAddTasksTemporalEventTriggerResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INAirline.Copy(Foundation.NSZone) M:Intents.INAirline.EncodeTo(Foundation.NSCoder) M:Intents.INAirport.Copy(Foundation.NSZone) @@ -39224,18 +36164,12 @@ M:Intents.INAppendToNoteIntentHandling_Extensions.ResolveContentForAppend(Intent M:Intents.INAppendToNoteIntentHandling_Extensions.ResolveTargetNoteForAppend(Intents.IINAppendToNoteIntentHandling,Intents.INAppendToNoteIntent,System.Action{Intents.INNoteResolutionResult}) M:Intents.INBalanceAmount.Copy(Foundation.NSZone) M:Intents.INBalanceAmount.EncodeTo(Foundation.NSCoder) -M:Intents.INBalanceTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INBalanceTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INBillDetails.Copy(Foundation.NSZone) M:Intents.INBillDetails.EncodeTo(Foundation.NSCoder) M:Intents.INBillPayee.Copy(Foundation.NSZone) M:Intents.INBillPayee.EncodeTo(Foundation.NSCoder) -M:Intents.INBillPayeeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INBillPayeeResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INBillTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INBillTypeResolutionResult.GetConfirmationRequired(Intents.INBillType) M:Intents.INBillTypeResolutionResult.GetSuccess(Intents.INBillType) -M:Intents.INBillTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INBoatReservation.Copy(Foundation.NSZone) M:Intents.INBoatReservation.EncodeTo(Foundation.NSCoder) M:Intents.INBoatTrip.Copy(Foundation.NSZone) @@ -39247,57 +36181,35 @@ M:Intents.INBookRestaurantReservationIntentHandling_Extensions.ResolveGuest(Inte M:Intents.INBookRestaurantReservationIntentHandling_Extensions.ResolveGuestProvidedSpecialRequest(Intents.IINBookRestaurantReservationIntentHandling,Intents.INBookRestaurantReservationIntent,System.Action{Intents.INStringResolutionResult}) M:Intents.INBookRestaurantReservationIntentHandling_Extensions.ResolvePartySize(Intents.IINBookRestaurantReservationIntentHandling,Intents.INBookRestaurantReservationIntent,System.Action{Intents.INIntegerResolutionResult}) M:Intents.INBookRestaurantReservationIntentHandling_Extensions.ResolveRestaurant(Intents.IINBookRestaurantReservationIntentHandling,Intents.INBookRestaurantReservationIntent,System.Action{Intents.INRestaurantResolutionResult}) -M:Intents.INBooleanResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INBooleanResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INBusReservation.Copy(Foundation.NSZone) M:Intents.INBusReservation.EncodeTo(Foundation.NSCoder) M:Intents.INBusTrip.Copy(Foundation.NSZone) M:Intents.INBusTrip.EncodeTo(Foundation.NSCoder) -M:Intents.INCallCapabilityResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INCallCapabilityResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INCallDestinationTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INCallDestinationTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INCallGroup.Copy(Foundation.NSZone) M:Intents.INCallGroup.EncodeTo(Foundation.NSCoder) M:Intents.INCallRecord.Copy(Foundation.NSZone) M:Intents.INCallRecord.EncodeTo(Foundation.NSCoder) M:Intents.INCallRecordFilter.Copy(Foundation.NSZone) M:Intents.INCallRecordFilter.EncodeTo(Foundation.NSCoder) -M:Intents.INCallRecordResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INCallRecordResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INCallRecordTypeOptionsResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INCallRecordTypeOptionsResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INCallRecordTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INCallRecordTypeResolutionResult.GetConfirmationRequired(Intents.INCallRecordType) M:Intents.INCallRecordTypeResolutionResult.GetSuccess(Intents.INCallRecordType) -M:Intents.INCallRecordTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INCancelRideIntentHandling_Extensions.Confirm(Intents.IINCancelRideIntentHandling,Intents.INCancelRideIntent,System.Action{Intents.INCancelRideIntentResponse}) M:Intents.INCancelWorkoutIntentHandling_Extensions.Confirm(Intents.IINCancelWorkoutIntentHandling,Intents.INCancelWorkoutIntent,System.Action{Intents.INCancelWorkoutIntentResponse}) M:Intents.INCancelWorkoutIntentHandling_Extensions.ResolveWorkoutName(Intents.IINCancelWorkoutIntentHandling,Intents.INCancelWorkoutIntent,System.Action{Intents.INSpeakableStringResolutionResult}) M:Intents.INCar.Copy(Foundation.NSZone) M:Intents.INCar.EncodeTo(Foundation.NSCoder) -M:Intents.INCarAirCirculationModeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INCarAirCirculationModeResolutionResult.GetConfirmationRequired(Intents.INCarAirCirculationMode) M:Intents.INCarAirCirculationModeResolutionResult.GetSuccess(Intents.INCarAirCirculationMode) -M:Intents.INCarAirCirculationModeResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INCarAudioSourceResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INCarAudioSourceResolutionResult.GetConfirmationRequired(Intents.INCarAudioSource) M:Intents.INCarAudioSourceResolutionResult.GetSuccess(Intents.INCarAudioSource) -M:Intents.INCarAudioSourceResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INCarDefrosterResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INCarDefrosterResolutionResult.GetConfirmationRequired(Intents.INCarDefroster) M:Intents.INCarDefrosterResolutionResult.GetSuccess(Intents.INCarDefroster) -M:Intents.INCarDefrosterResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INCarHeadUnit.Copy(Foundation.NSZone) M:Intents.INCarHeadUnit.EncodeTo(Foundation.NSCoder) -M:Intents.INCarSeatResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INCarSeatResolutionResult.GetConfirmationRequired(Intents.INCarSeat) M:Intents.INCarSeatResolutionResult.GetSuccess(Intents.INCarSeat) -M:Intents.INCarSeatResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INCarSignalOptionsResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INCarSignalOptionsResolutionResult.GetConfirmationRequired(Intents.INCarSignalOptions) M:Intents.INCarSignalOptionsResolutionResult.GetSuccess(Intents.INCarSignalOptions) -M:Intents.INCarSignalOptionsResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INCreateNoteIntentHandling_Extensions.Confirm(Intents.IINCreateNoteIntentHandling,Intents.INCreateNoteIntent,System.Action{Intents.INCreateNoteIntentResponse}) M:Intents.INCreateNoteIntentHandling_Extensions.ResolveContent(Intents.IINCreateNoteIntentHandling,Intents.INCreateNoteIntent,System.Action{Intents.INNoteContentResolutionResult}) M:Intents.INCreateNoteIntentHandling_Extensions.ResolveGroupName(Intents.IINCreateNoteIntentHandling,Intents.INCreateNoteIntent,System.Action{Intents.INSpeakableStringResolutionResult}) @@ -39308,45 +36220,18 @@ M:Intents.INCreateTaskListIntentHandling_Extensions.ResolveTaskTitles(Intents.II M:Intents.INCreateTaskListIntentHandling_Extensions.ResolveTitle(Intents.IINCreateTaskListIntentHandling,Intents.INCreateTaskListIntent,System.Action{Intents.INSpeakableStringResolutionResult}) M:Intents.INCurrencyAmount.Copy(Foundation.NSZone) M:Intents.INCurrencyAmount.EncodeTo(Foundation.NSCoder) -M:Intents.INCurrencyAmountResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INCurrencyAmountResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INDateComponentsRange.Copy(Foundation.NSZone) M:Intents.INDateComponentsRange.EncodeTo(Foundation.NSCoder) -M:Intents.INDateComponentsRangeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INDateComponentsRangeResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INDateComponentsResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INDateComponentsResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INDateSearchTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INDateSearchTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INDefaultCardTemplate.Copy(Foundation.NSZone) M:Intents.INDefaultCardTemplate.EncodeTo(Foundation.NSCoder) M:Intents.INDeleteTasksIntentHandling_Extensions.Confirm(Intents.IINDeleteTasksIntentHandling,Intents.INDeleteTasksIntent,System.Action{Intents.INDeleteTasksIntentResponse}) M:Intents.INDeleteTasksIntentHandling_Extensions.ResolveTaskList(Intents.IINDeleteTasksIntentHandling,Intents.INDeleteTasksIntent,System.Action{Intents.INDeleteTasksTaskListResolutionResult}) M:Intents.INDeleteTasksIntentHandling_Extensions.ResolveTasks(Intents.IINDeleteTasksIntentHandling,Intents.INDeleteTasksIntent,System.Action{Intents.INDeleteTasksTaskResolutionResult[]}) -M:Intents.INDeleteTasksTaskListResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INDeleteTasksTaskListResolutionResult.GetConfirmationRequired(Intents.INTaskList) -M:Intents.INDeleteTasksTaskListResolutionResult.GetDisambiguation(Intents.INTaskList[]) -M:Intents.INDeleteTasksTaskListResolutionResult.GetSuccess(Intents.INTaskList) -M:Intents.INDeleteTasksTaskListResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INDeleteTasksTaskResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INDeleteTasksTaskResolutionResult.GetConfirmationRequired(Intents.INTask) -M:Intents.INDeleteTasksTaskResolutionResult.GetDisambiguation(Intents.INTask[]) -M:Intents.INDeleteTasksTaskResolutionResult.GetSuccess(Intents.INTask) -M:Intents.INDeleteTasksTaskResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INDoubleResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INDoubleResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INEditMessageIntentHandling_Extensions.ConfirmEditMessage(Intents.IINEditMessageIntentHandling,Intents.INEditMessageIntent,System.Action{Intents.INEditMessageIntentResponse}) M:Intents.INEditMessageIntentHandling_Extensions.ResolveEditedContent(Intents.IINEditMessageIntentHandling,Intents.INEditMessageIntent,System.Action{Intents.INStringResolutionResult}) M:Intents.INEndWorkoutIntentHandling_Extensions.Confirm(Intents.IINEndWorkoutIntentHandling,Intents.INEndWorkoutIntent,System.Action{Intents.INEndWorkoutIntentResponse}) M:Intents.INEndWorkoutIntentHandling_Extensions.ResolveWorkoutName(Intents.IINEndWorkoutIntentHandling,Intents.INEndWorkoutIntent,System.Action{Intents.INSpeakableStringResolutionResult}) -M:Intents.INEnergyResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INEnergyResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INEnumResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INEnumResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INExtension.GetHandler(Intents.INIntent) M:Intents.INFile.EncodeTo(Foundation.NSCoder) -M:Intents.INFileResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INFileResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INFlight.Copy(Foundation.NSZone) M:Intents.INFlight.EncodeTo(Foundation.NSCoder) M:Intents.INFlightReservation.Copy(Foundation.NSZone) @@ -39386,8 +36271,6 @@ M:Intents.INImage.FromImage(UIKit.UIImage) M:Intents.INImage.GetImageSize(Intents.INIntentResponse) M:Intents.INImageNoteContent.Copy(Foundation.NSZone) M:Intents.INImageNoteContent.EncodeTo(Foundation.NSCoder) -M:Intents.INIntegerResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INIntegerResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INIntent.Copy(Foundation.NSZone) M:Intents.INIntent.EncodeTo(Foundation.NSCoder) M:Intents.INIntentDonationMetadata.Copy(Foundation.NSZone) @@ -39403,68 +36286,40 @@ M:Intents.INInteraction.DeleteInteractionsAsync(System.String[]) M:Intents.INInteraction.DonateInteractionAsync M:Intents.INInteraction.EncodeTo(Foundation.NSCoder) M:Intents.INInteraction.GetParameterValue``1(Intents.INParameter) -M:Intents.INLengthResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INLengthResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INListCarsIntentHandling_Extensions.ConfirmListCars(Intents.IINListCarsIntentHandling,Intents.INListCarsIntent,System.Action{Intents.INListCarsIntentResponse}) M:Intents.INListRideOptionsIntentHandling_Extensions.Confirm(Intents.IINListRideOptionsIntentHandling,Intents.INListRideOptionsIntent,System.Action{Intents.INListRideOptionsIntentResponse}) M:Intents.INListRideOptionsIntentHandling_Extensions.ResolveDropOffLocation(Intents.IINListRideOptionsIntentHandling,Intents.INListRideOptionsIntent,System.Action{Intents.INPlacemarkResolutionResult}) M:Intents.INListRideOptionsIntentHandling_Extensions.ResolvePickupLocation(Intents.IINListRideOptionsIntentHandling,Intents.INListRideOptionsIntent,System.Action{Intents.INPlacemarkResolutionResult}) -M:Intents.INLocationSearchTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INLocationSearchTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INLodgingReservation.Copy(Foundation.NSZone) M:Intents.INLodgingReservation.EncodeTo(Foundation.NSCoder) -M:Intents.INMassResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INMassResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INMediaAffinityTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INMediaAffinityTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INMediaDestination.Copy(Foundation.NSZone) M:Intents.INMediaDestination.EncodeTo(Foundation.NSCoder) -M:Intents.INMediaDestinationResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INMediaDestinationResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INMediaItem.Copy(Foundation.NSZone) M:Intents.INMediaItem.EncodeTo(Foundation.NSCoder) -M:Intents.INMediaItemResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INMediaItemResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INMediaSearch.Copy(Foundation.NSZone) M:Intents.INMediaSearch.EncodeTo(Foundation.NSCoder) M:Intents.INMessage.Copy(Foundation.NSZone) M:Intents.INMessage.EncodeTo(Foundation.NSCoder) -M:Intents.INMessageAttributeOptionsResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INMessageAttributeOptionsResolutionResult.GetConfirmationRequired(Intents.INMessageAttributeOptions) M:Intents.INMessageAttributeOptionsResolutionResult.GetSuccess(Intents.INMessageAttributeOptions) -M:Intents.INMessageAttributeOptionsResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INMessageAttributeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INMessageAttributeResolutionResult.GetConfirmationRequired(Intents.INMessageAttribute) M:Intents.INMessageAttributeResolutionResult.GetSuccess(Intents.INMessageAttribute) -M:Intents.INMessageAttributeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INMessageLinkMetadata.Copy(Foundation.NSZone) M:Intents.INMessageLinkMetadata.EncodeTo(Foundation.NSCoder) M:Intents.INMessageReaction.Copy(Foundation.NSZone) M:Intents.INMessageReaction.EncodeTo(Foundation.NSCoder) M:Intents.INNote.Copy(Foundation.NSZone) M:Intents.INNote.EncodeTo(Foundation.NSCoder) -M:Intents.INNotebookItemTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INNotebookItemTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INNoteContent.Copy(Foundation.NSZone) M:Intents.INNoteContent.EncodeTo(Foundation.NSCoder) -M:Intents.INNoteContentResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INNoteContentResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INNoteContentTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INNoteContentTypeResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INNoteResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INNoteResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INObject.Copy(Foundation.NSZone) M:Intents.INObject.EncodeTo(Foundation.NSCoder) M:Intents.INObject.GetAlternativeSpeakableMatches M:Intents.INObject.SetAlternativeSpeakableMatches(Intents.INSpeakableString[]) M:Intents.INObjectCollection`1.Copy(Foundation.NSZone) M:Intents.INObjectCollection`1.EncodeTo(Foundation.NSCoder) -M:Intents.INObjectResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INObjectResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INObjectSection`1.Copy(Foundation.NSZone) M:Intents.INObjectSection`1.EncodeTo(Foundation.NSCoder) -M:Intents.INOutgoingMessageTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INOutgoingMessageTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INParameter.Copy(Foundation.NSZone) M:Intents.INParameter.EncodeTo(Foundation.NSCoder) M:Intents.INParameter.GetParameter(System.Type,System.String) @@ -39480,22 +36335,14 @@ M:Intents.INPayBillIntentHandling_Extensions.ResolveTransactionNote(Intents.IINP M:Intents.INPayBillIntentHandling_Extensions.ResolveTransactionScheduledDate(Intents.IINPayBillIntentHandling,Intents.INPayBillIntent,System.Action{Intents.INDateComponentsRangeResolutionResult}) M:Intents.INPaymentAccount.Copy(Foundation.NSZone) M:Intents.INPaymentAccount.EncodeTo(Foundation.NSCoder) -M:Intents.INPaymentAccountResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPaymentAccountResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INPaymentAmount.Copy(Foundation.NSZone) M:Intents.INPaymentAmount.EncodeTo(Foundation.NSCoder) -M:Intents.INPaymentAmountResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPaymentAmountResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INPaymentMethod.Copy(Foundation.NSZone) M:Intents.INPaymentMethod.EncodeTo(Foundation.NSCoder) -M:Intents.INPaymentMethodResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPaymentMethodResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INPaymentRecord.Copy(Foundation.NSZone) M:Intents.INPaymentRecord.EncodeTo(Foundation.NSCoder) -M:Intents.INPaymentStatusResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INPaymentStatusResolutionResult.GetConfirmationRequired(Intents.INPaymentStatus) M:Intents.INPaymentStatusResolutionResult.GetSuccess(Intents.INPaymentStatus) -M:Intents.INPaymentStatusResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INPerson.#ctor(Intents.INPersonHandle,Foundation.NSPersonNameComponents,System.String,Intents.INImage,System.String,System.String,System.Boolean,Intents.INPersonSuggestionType,Intents.INPerson.INPersonType) M:Intents.INPerson.#ctor(Intents.INPersonHandle,Foundation.NSPersonNameComponents,System.String,Intents.INImage,System.String,System.String,System.Boolean,Intents.INPersonSuggestionType) M:Intents.INPerson.Copy(Foundation.NSZone) @@ -39503,14 +36350,6 @@ M:Intents.INPerson.EncodeTo(Foundation.NSCoder) M:Intents.INPersonHandle.#ctor(System.String,Intents.INPersonHandleType,Intents.INPersonHandleLabel) M:Intents.INPersonHandle.Copy(Foundation.NSZone) M:Intents.INPersonHandle.EncodeTo(Foundation.NSCoder) -M:Intents.INPersonResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPersonResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INPlacemarkResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPlacemarkResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INPlaybackQueueLocationResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPlaybackQueueLocationResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INPlaybackRepeatModeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPlaybackRepeatModeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INPlayMediaIntentHandling_Extensions.Confirm(Intents.IINPlayMediaIntentHandling,Intents.INPlayMediaIntent,System.Action{Intents.INPlayMediaIntentResponse}) M:Intents.INPlayMediaIntentHandling_Extensions.ResolveMediaItems(Intents.IINPlayMediaIntentHandling,Intents.INPlayMediaIntent,System.Action{Foundation.NSArray{Intents.INPlayMediaMediaItemResolutionResult}}) M:Intents.INPlayMediaIntentHandling_Extensions.ResolvePlaybackQueueLocation(Intents.IINPlayMediaIntentHandling,Intents.INPlayMediaIntent,System.Action{Intents.INPlaybackQueueLocationResolutionResult}) @@ -39518,33 +36357,18 @@ M:Intents.INPlayMediaIntentHandling_Extensions.ResolvePlaybackRepeatMode(Intents M:Intents.INPlayMediaIntentHandling_Extensions.ResolvePlaybackSpeed(Intents.IINPlayMediaIntentHandling,Intents.INPlayMediaIntent,System.Action{Intents.INPlayMediaPlaybackSpeedResolutionResult}) M:Intents.INPlayMediaIntentHandling_Extensions.ResolvePlayShuffled(Intents.IINPlayMediaIntentHandling,Intents.INPlayMediaIntent,System.Action{Intents.INBooleanResolutionResult}) M:Intents.INPlayMediaIntentHandling_Extensions.ResolveResumePlayback(Intents.IINPlayMediaIntentHandling,Intents.INPlayMediaIntent,System.Action{Intents.INBooleanResolutionResult}) -M:Intents.INPlayMediaMediaItemResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPlayMediaMediaItemResolutionResult.GetConfirmationRequired(Intents.INMediaItem) -M:Intents.INPlayMediaMediaItemResolutionResult.GetDisambiguation(Intents.INMediaItem[]) -M:Intents.INPlayMediaMediaItemResolutionResult.GetSuccess(Intents.INMediaItem) -M:Intents.INPlayMediaMediaItemResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INPlayMediaPlaybackSpeedResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INPlayMediaPlaybackSpeedResolutionResult.GetConfirmationRequired(System.Nullable{System.Double}) -M:Intents.INPlayMediaPlaybackSpeedResolutionResult.GetSuccess(System.Double) -M:Intents.INPlayMediaPlaybackSpeedResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INPreferences.RequestSiriAuthorizationAsync M:Intents.INPriceRange.#ctor(Intents.INPriceRangeOption,Foundation.NSDecimalNumber,System.String) M:Intents.INPriceRange.Copy(Foundation.NSZone) M:Intents.INPriceRange.EncodeTo(Foundation.NSCoder) -M:Intents.INRadioTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INRadioTypeResolutionResult.GetConfirmationRequired(Intents.INRadioType) M:Intents.INRadioTypeResolutionResult.GetSuccess(Intents.INRadioType) -M:Intents.INRadioTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INRecurrenceRule.Copy(Foundation.NSZone) M:Intents.INRecurrenceRule.EncodeTo(Foundation.NSCoder) -M:Intents.INRelativeReferenceResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INRelativeReferenceResolutionResult.GetConfirmationRequired(Intents.INRelativeReference) M:Intents.INRelativeReferenceResolutionResult.GetSuccess(Intents.INRelativeReference) -M:Intents.INRelativeReferenceResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INRelativeSettingResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INRelativeSettingResolutionResult.GetConfirmationRequired(Intents.INRelativeSetting) M:Intents.INRelativeSettingResolutionResult.GetSuccess(Intents.INRelativeSetting) -M:Intents.INRelativeSettingResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INRelevanceProvider.Copy(Foundation.NSZone) M:Intents.INRelevanceProvider.EncodeTo(Foundation.NSCoder) M:Intents.INRelevantShortcut.Copy(Foundation.NSZone) @@ -39554,19 +36378,12 @@ M:Intents.INRentalCar.Copy(Foundation.NSZone) M:Intents.INRentalCar.EncodeTo(Foundation.NSCoder) M:Intents.INRentalCarReservation.Copy(Foundation.NSZone) M:Intents.INRentalCarReservation.EncodeTo(Foundation.NSCoder) -M:Intents.INRequestPaymentCurrencyAmountResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INRequestPaymentCurrencyAmountResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INRequestPaymentIntentHandling_Extensions.Confirm(Intents.IINRequestPaymentIntentHandling,Intents.INRequestPaymentIntent,System.Action{Intents.INRequestPaymentIntentResponse}) M:Intents.INRequestPaymentIntentHandling_Extensions.ResolveCurrencyAmount(Intents.IINRequestPaymentIntentHandling,Intents.INRequestPaymentIntent,System.Action{Intents.INCurrencyAmountResolutionResult}) M:Intents.INRequestPaymentIntentHandling_Extensions.ResolveCurrencyAmount(Intents.IINRequestPaymentIntentHandling,Intents.INRequestPaymentIntent,System.Action{Intents.INRequestPaymentCurrencyAmountResolutionResult}) M:Intents.INRequestPaymentIntentHandling_Extensions.ResolveNote(Intents.IINRequestPaymentIntentHandling,Intents.INRequestPaymentIntent,System.Action{Intents.INStringResolutionResult}) M:Intents.INRequestPaymentIntentHandling_Extensions.ResolvePayer(Intents.IINRequestPaymentIntentHandling,Intents.INRequestPaymentIntent,System.Action{Intents.INPersonResolutionResult}) M:Intents.INRequestPaymentIntentHandling_Extensions.ResolvePayer(Intents.IINRequestPaymentIntentHandling,Intents.INRequestPaymentIntent,System.Action{Intents.INRequestPaymentPayerResolutionResult}) -M:Intents.INRequestPaymentPayerResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INRequestPaymentPayerResolutionResult.GetConfirmationRequired(Intents.INPerson) -M:Intents.INRequestPaymentPayerResolutionResult.GetDisambiguation(Intents.INPerson[]) -M:Intents.INRequestPaymentPayerResolutionResult.GetSuccess(Intents.INPerson) -M:Intents.INRequestPaymentPayerResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INRequestRideIntentHandling_Extensions.Confirm(Intents.IINRequestRideIntentHandling,Intents.INRequestRideIntent,System.Action{Intents.INRequestRideIntentResponse}) M:Intents.INRequestRideIntentHandling_Extensions.ResolveDropOffLocation(Intents.IINRequestRideIntentHandling,Intents.INRequestRideIntent,System.Action{Intents.INPlacemarkResolutionResult}) M:Intents.INRequestRideIntentHandling_Extensions.ResolvePartySize(Intents.IINRequestRideIntentHandling,Intents.INRequestRideIntent,System.Action{Intents.INIntegerResolutionResult}) @@ -39581,18 +36398,13 @@ M:Intents.INRestaurant.Copy(Foundation.NSZone) M:Intents.INRestaurant.EncodeTo(Foundation.NSCoder) M:Intents.INRestaurantGuestDisplayPreferences.Copy(Foundation.NSZone) M:Intents.INRestaurantGuestDisplayPreferences.EncodeTo(Foundation.NSCoder) -M:Intents.INRestaurantGuestResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INRestaurantGuestResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INRestaurantOffer.Copy(Foundation.NSZone) M:Intents.INRestaurantOffer.EncodeTo(Foundation.NSCoder) M:Intents.INRestaurantReservation.Copy(Foundation.NSZone) M:Intents.INRestaurantReservation.EncodeTo(Foundation.NSCoder) M:Intents.INRestaurantReservationBooking.Copy(Foundation.NSZone) M:Intents.INRestaurantReservationBooking.EncodeTo(Foundation.NSCoder) -M:Intents.INRestaurantReservationUserBooking.#ctor(Intents.INRestaurant,Foundation.NSDate,System.UIntPtr,System.String) M:Intents.INRestaurantReservationUserBooking.Copy(Foundation.NSZone) -M:Intents.INRestaurantResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INRestaurantResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INResumeWorkoutIntentHandling_Extensions.Confirm(Intents.IINResumeWorkoutIntentHandling,Intents.INResumeWorkoutIntent,System.Action{Intents.INResumeWorkoutIntentResponse}) M:Intents.INResumeWorkoutIntentHandling_Extensions.ResolveWorkoutName(Intents.IINResumeWorkoutIntentHandling,Intents.INResumeWorkoutIntent,System.Action{Intents.INSpeakableStringResolutionResult}) M:Intents.INRideCompletionStatus.Copy(Foundation.NSZone) @@ -39633,11 +36445,6 @@ M:Intents.INSearchForBillsIntentHandling_Extensions.ResolvePaymentDateRange(Inte M:Intents.INSearchForBillsIntentHandling_Extensions.ResolveStatus(Intents.IINSearchForBillsIntentHandling,Intents.INSearchForBillsIntent,System.Action{Intents.INPaymentStatusResolutionResult}) M:Intents.INSearchForMediaIntentHandling_Extensions.Confirm(Intents.IINSearchForMediaIntentHandling,Intents.INSearchForMediaIntent,System.Action{Intents.INSearchForMediaIntentResponse}) M:Intents.INSearchForMediaIntentHandling_Extensions.ResolveMediaItems(Intents.IINSearchForMediaIntentHandling,Intents.INSearchForMediaIntent,System.Action{Intents.INSearchForMediaMediaItemResolutionResult[]}) -M:Intents.INSearchForMediaMediaItemResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSearchForMediaMediaItemResolutionResult.GetConfirmationRequired(Intents.INMediaItem) -M:Intents.INSearchForMediaMediaItemResolutionResult.GetDisambiguation(Intents.INMediaItem[]) -M:Intents.INSearchForMediaMediaItemResolutionResult.GetSuccess(Intents.INMediaItem) -M:Intents.INSearchForMediaMediaItemResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INSearchForMessagesIntentHandling_Extensions.Confirm(Intents.IINSearchForMessagesIntentHandling,Intents.INSearchForMessagesIntent,System.Action{Intents.INSearchForMessagesIntentResponse}) M:Intents.INSearchForMessagesIntentHandling_Extensions.ResolveAttributes(Intents.IINSearchForMessagesIntentHandling,Intents.INSearchForMessagesIntent,System.Action{Intents.INMessageAttributeOptionsResolutionResult}) M:Intents.INSearchForMessagesIntentHandling_Extensions.ResolveDateTimeRange(Intents.IINSearchForMessagesIntentHandling,Intents.INSearchForMessagesIntent,System.Action{Intents.INDateComponentsRangeResolutionResult}) @@ -39671,24 +36478,12 @@ M:Intents.INSendMessageIntentHandling_Extensions.ResolveOutgoingMessageType(Inte M:Intents.INSendMessageIntentHandling_Extensions.ResolveRecipients(Intents.IINSendMessageIntentHandling,Intents.INSendMessageIntent,System.Action{Intents.INPersonResolutionResult[]}) M:Intents.INSendMessageIntentHandling_Extensions.ResolveRecipients(Intents.IINSendMessageIntentHandling,Intents.INSendMessageIntent,System.Action{Intents.INSendMessageRecipientResolutionResult[]}) M:Intents.INSendMessageIntentHandling_Extensions.ResolveSpeakableGroupName(Intents.IINSendMessageIntentHandling,Intents.INSendMessageIntent,System.Action{Intents.INSpeakableStringResolutionResult}) -M:Intents.INSendMessageRecipientResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSendMessageRecipientResolutionResult.GetConfirmationRequired(Intents.INPerson) -M:Intents.INSendMessageRecipientResolutionResult.GetDisambiguation(Intents.INPerson[]) -M:Intents.INSendMessageRecipientResolutionResult.GetSuccess(Intents.INPerson) -M:Intents.INSendMessageRecipientResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INSendPaymentCurrencyAmountResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSendPaymentCurrencyAmountResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INSendPaymentIntentHandling_Extensions.Confirm(Intents.IINSendPaymentIntentHandling,Intents.INSendPaymentIntent,System.Action{Intents.INSendPaymentIntentResponse}) M:Intents.INSendPaymentIntentHandling_Extensions.ResolveCurrencyAmount(Intents.IINSendPaymentIntentHandling,Intents.INSendPaymentIntent,System.Action{Intents.INCurrencyAmountResolutionResult}) M:Intents.INSendPaymentIntentHandling_Extensions.ResolveCurrencyAmount(Intents.IINSendPaymentIntentHandling,Intents.INSendPaymentIntent,System.Action{Intents.INSendPaymentCurrencyAmountResolutionResult}) M:Intents.INSendPaymentIntentHandling_Extensions.ResolveNote(Intents.IINSendPaymentIntentHandling,Intents.INSendPaymentIntent,System.Action{Intents.INStringResolutionResult}) M:Intents.INSendPaymentIntentHandling_Extensions.ResolvePayee(Intents.IINSendPaymentIntentHandling,Intents.INSendPaymentIntent,System.Action{Intents.INPersonResolutionResult}) M:Intents.INSendPaymentIntentHandling_Extensions.ResolvePayee(Intents.IINSendPaymentIntentHandling,Intents.INSendPaymentIntent,System.Action{Intents.INSendPaymentPayeeResolutionResult}) -M:Intents.INSendPaymentPayeeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSendPaymentPayeeResolutionResult.GetConfirmationRequired(Intents.INPerson) -M:Intents.INSendPaymentPayeeResolutionResult.GetDisambiguation(Intents.INPerson[]) -M:Intents.INSendPaymentPayeeResolutionResult.GetSuccess(Intents.INPerson) -M:Intents.INSendPaymentPayeeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INSendRideFeedbackIntentHandling_Extensions.Confirm(Intents.IINSendRideFeedbackIntentHandling,Intents.INSendRideFeedbackIntent,System.Action{Intents.INSendRideFeedbackIntentResponse}) M:Intents.INSetAudioSourceInCarIntentHandling_Extensions.Confirm(Intents.IINSetAudioSourceInCarIntentHandling,Intents.INSetAudioSourceInCarIntent,System.Action{Intents.INSetAudioSourceInCarIntentResponse}) M:Intents.INSetAudioSourceInCarIntentHandling_Extensions.ResolveAudioSource(Intents.IINSetAudioSourceInCarIntentHandling,Intents.INSetAudioSourceInCarIntent,System.Action{Intents.INCarAudioSourceResolutionResult}) @@ -39748,51 +36543,21 @@ M:Intents.INSetTaskAttributeIntentHandling_Extensions.ResolveTargetTask(Intents. M:Intents.INSetTaskAttributeIntentHandling_Extensions.ResolveTaskTitle(Intents.IINSetTaskAttributeIntentHandling,Intents.INSetTaskAttributeIntent,System.Action{Intents.INSpeakableStringResolutionResult}) M:Intents.INSetTaskAttributeIntentHandling_Extensions.ResolveTemporalEventTrigger(Intents.IINSetTaskAttributeIntentHandling,Intents.INSetTaskAttributeIntent,System.Action{Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult}) M:Intents.INSetTaskAttributeIntentHandling_Extensions.ResolveTemporalEventTrigger(Intents.IINSetTaskAttributeIntentHandling,Intents.INSetTaskAttributeIntent,System.Action{Intents.INTemporalEventTriggerResolutionResult}) -M:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.GetConfirmationRequired(Intents.INTemporalEventTrigger) -M:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.GetDisambiguation(Intents.INTemporalEventTrigger[]) -M:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.GetSuccess(Intents.INTemporalEventTrigger) -M:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INShareFocusStatusIntentHandling_Extensions.ConfirmShareFocusStatus(Intents.IINShareFocusStatusIntentHandling,Intents.INShareFocusStatusIntent,System.Action{Intents.INShareFocusStatusIntentResponse}) M:Intents.INShortcut.Copy(Foundation.NSZone) M:Intents.INShortcut.EncodeTo(Foundation.NSCoder) M:Intents.INSnoozeTasksIntentHandling_Extensions.Confirm(Intents.IINSnoozeTasksIntentHandling,Intents.INSnoozeTasksIntent,System.Action{Intents.INSnoozeTasksIntentResponse}) M:Intents.INSnoozeTasksIntentHandling_Extensions.ResolveNextTriggerTime(Intents.IINSnoozeTasksIntentHandling,Intents.INSnoozeTasksIntent,System.Action{Intents.INDateComponentsRangeResolutionResult}) M:Intents.INSnoozeTasksIntentHandling_Extensions.ResolveTasks(Intents.IINSnoozeTasksIntentHandling,Intents.INSnoozeTasksIntent,System.Action{Intents.INSnoozeTasksTaskResolutionResult[]}) -M:Intents.INSnoozeTasksTaskResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSnoozeTasksTaskResolutionResult.GetConfirmationRequired(Intents.INTask) -M:Intents.INSnoozeTasksTaskResolutionResult.GetDisambiguation(Intents.INTask[]) -M:Intents.INSnoozeTasksTaskResolutionResult.GetSuccess(Intents.INTask) -M:Intents.INSnoozeTasksTaskResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INSpatialEventTrigger.Copy(Foundation.NSZone) M:Intents.INSpatialEventTrigger.EncodeTo(Foundation.NSCoder) -M:Intents.INSpatialEventTriggerResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSpatialEventTriggerResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INSpeakable_Extensions.GetIdentifier(Intents.IINSpeakable) M:Intents.INSpeakableString.#ctor(System.String,System.String,System.String) M:Intents.INSpeakableString.Copy(Foundation.NSZone) M:Intents.INSpeakableString.EncodeTo(Foundation.NSCoder) -M:Intents.INSpeakableStringResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSpeakableStringResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INSpeedResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INSpeedResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INStartAudioCallIntentHandling_Extensions.Confirm(Intents.IINStartAudioCallIntentHandling,Intents.INStartAudioCallIntent,System.Action{Intents.INStartAudioCallIntentResponse}) M:Intents.INStartAudioCallIntentHandling_Extensions.ResolveContacts(Intents.IINStartAudioCallIntentHandling,Intents.INStartAudioCallIntent,System.Action{Intents.INPersonResolutionResult[]}) M:Intents.INStartAudioCallIntentHandling_Extensions.ResolveDestinationType(Intents.IINStartAudioCallIntentHandling,Intents.INStartAudioCallIntent,System.Action{Intents.INCallDestinationTypeResolutionResult}) -M:Intents.INStartCallCallCapabilityResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INStartCallCallCapabilityResolutionResult.GetConfirmationRequired(Intents.INCallCapability) -M:Intents.INStartCallCallCapabilityResolutionResult.GetSuccess(Intents.INCallCapability) -M:Intents.INStartCallCallCapabilityResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INStartCallCallRecordToCallBackResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INStartCallCallRecordToCallBackResolutionResult.GetConfirmationRequired(Intents.INCallRecord) -M:Intents.INStartCallCallRecordToCallBackResolutionResult.GetDisambiguation(Intents.INCallRecord[]) -M:Intents.INStartCallCallRecordToCallBackResolutionResult.GetSuccess(Intents.INCallRecord) -M:Intents.INStartCallCallRecordToCallBackResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INStartCallContactResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INStartCallContactResolutionResult.GetConfirmationRequired(Intents.INPerson) -M:Intents.INStartCallContactResolutionResult.GetDisambiguation(Intents.INPerson[]) -M:Intents.INStartCallContactResolutionResult.GetSuccess(Intents.INPerson) -M:Intents.INStartCallContactResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INStartCallIntentHandling_Extensions.Confirm(Intents.IINStartCallIntentHandling,Intents.INStartCallIntent,System.Action{Intents.INStartCallIntentResponse}) M:Intents.INStartCallIntentHandling_Extensions.ResolveCallCapability(Intents.IINStartCallIntentHandling,Intents.INStartCallIntent,System.Action{Intents.INStartCallCallCapabilityResolutionResult}) M:Intents.INStartCallIntentHandling_Extensions.ResolveCallRecordToCallBack(Intents.IINStartCallIntentHandling,Intents.INStartCallIntent,System.Action{Intents.INCallRecordResolutionResult}) @@ -39814,28 +36579,12 @@ M:Intents.INStartWorkoutIntentHandling_Extensions.ResolveWorkoutLocationType(Int M:Intents.INStartWorkoutIntentHandling_Extensions.ResolveWorkoutName(Intents.IINStartWorkoutIntentHandling,Intents.INStartWorkoutIntent,System.Action{Intents.INSpeakableStringResolutionResult}) M:Intents.INSticker.Copy(Foundation.NSZone) M:Intents.INSticker.EncodeTo(Foundation.NSCoder) -M:Intents.INStringResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INStringResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INTask.Copy(Foundation.NSZone) M:Intents.INTask.EncodeTo(Foundation.NSCoder) M:Intents.INTaskList.Copy(Foundation.NSZone) M:Intents.INTaskList.EncodeTo(Foundation.NSCoder) -M:Intents.INTaskListResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTaskListResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INTaskPriorityResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTaskPriorityResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INTaskResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTaskResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INTaskStatusResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTaskStatusResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INTemperatureResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTemperatureResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INTemporalEventTrigger.Copy(Foundation.NSZone) M:Intents.INTemporalEventTrigger.EncodeTo(Foundation.NSCoder) -M:Intents.INTemporalEventTriggerResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTemporalEventTriggerResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INTemporalEventTriggerTypeOptionsResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTemporalEventTriggerTypeOptionsResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INTermsAndConditions.Copy(Foundation.NSZone) M:Intents.INTermsAndConditions.EncodeTo(Foundation.NSCoder) M:Intents.INTextNoteContent.Copy(Foundation.NSZone) @@ -39844,8 +36593,6 @@ M:Intents.INTicketedEvent.Copy(Foundation.NSZone) M:Intents.INTicketedEvent.EncodeTo(Foundation.NSCoder) M:Intents.INTicketedEventReservation.Copy(Foundation.NSZone) M:Intents.INTicketedEventReservation.EncodeTo(Foundation.NSCoder) -M:Intents.INTimeIntervalResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INTimeIntervalResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INTrainReservation.Copy(Foundation.NSZone) M:Intents.INTrainReservation.EncodeTo(Foundation.NSCoder) M:Intents.INTrainTrip.Copy(Foundation.NSZone) @@ -39860,30 +36607,15 @@ M:Intents.INUnsendMessagesIntentHandling_Extensions.ConfirmUnsendMessages(Intent M:Intents.INUpdateMediaAffinityIntentHandling_Extensions.Confirm(Intents.IINUpdateMediaAffinityIntentHandling,Intents.INUpdateMediaAffinityIntent,System.Action{Intents.INUpdateMediaAffinityIntentResponse}) M:Intents.INUpdateMediaAffinityIntentHandling_Extensions.ResolveAffinityType(Intents.IINUpdateMediaAffinityIntentHandling,Intents.INUpdateMediaAffinityIntent,System.Action{Intents.INMediaAffinityTypeResolutionResult}) M:Intents.INUpdateMediaAffinityIntentHandling_Extensions.ResolveMediaItems(Intents.IINUpdateMediaAffinityIntentHandling,Intents.INUpdateMediaAffinityIntent,System.Action{Foundation.NSArray{Intents.INUpdateMediaAffinityMediaItemResolutionResult}}) -M:Intents.INUpdateMediaAffinityMediaItemResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INUpdateMediaAffinityMediaItemResolutionResult.GetConfirmationRequired(Intents.INMediaItem) -M:Intents.INUpdateMediaAffinityMediaItemResolutionResult.GetDisambiguation(Intents.INMediaItem[]) -M:Intents.INUpdateMediaAffinityMediaItemResolutionResult.GetSuccess(Intents.INMediaItem) -M:Intents.INUpdateMediaAffinityMediaItemResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INUrlResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INUrlResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INUserContext.EncodeTo(Foundation.NSCoder) -M:Intents.INVisualCodeTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INVisualCodeTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.INVoiceShortcut.Copy(Foundation.NSZone) M:Intents.INVoiceShortcut.EncodeTo(Foundation.NSCoder) M:Intents.INVoiceShortcutCenter.GetAllVoiceShortcutsAsync M:Intents.INVoiceShortcutCenter.GetVoiceShortcutAsync(Foundation.NSUuid) -M:Intents.INVolumeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) -M:Intents.INVolumeResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INWorkoutGoalUnitTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INWorkoutGoalUnitTypeResolutionResult.GetConfirmationRequired(Intents.INWorkoutGoalUnitType) M:Intents.INWorkoutGoalUnitTypeResolutionResult.GetSuccess(Intents.INWorkoutGoalUnitType) -M:Intents.INWorkoutGoalUnitTypeResolutionResult.GetUnsupported(System.IntPtr) -M:Intents.INWorkoutLocationTypeResolutionResult.GetConfirmationRequired(Foundation.NSObject,System.IntPtr) M:Intents.INWorkoutLocationTypeResolutionResult.GetConfirmationRequired(Intents.INWorkoutLocationType) M:Intents.INWorkoutLocationTypeResolutionResult.GetSuccess(Intents.INWorkoutLocationType) -M:Intents.INWorkoutLocationTypeResolutionResult.GetUnsupported(System.IntPtr) M:Intents.NSExtensionContext_ShareExtension.GetIntent(Foundation.NSExtensionContext) M:Intents.NSUserActivity_IntentsAdditions.GetInteraction(Foundation.NSUserActivity) M:Intents.NSUserActivity_IntentsAdditions.GetShortcutAvailability(Foundation.NSUserActivity) @@ -39901,15 +36633,8 @@ M:IntentsUI.IINUIHostedViewControlling.Configure(Intents.INInteraction,IntentsUI M:IntentsUI.IINUIHostedViewControlling.ConfigureView(Foundation.NSSet{Intents.INParameter},Intents.INInteraction,IntentsUI.INUIInteractiveBehavior,IntentsUI.INUIHostedViewContext,IntentsUI.INUIHostedViewControllingConfigureViewHandler) M:IntentsUI.INUIAddVoiceShortcutButton.Dispose(System.Boolean) M:IntentsUI.INUIAddVoiceShortcutButton.INUIAddVoiceShortcutButtonAppearance.#ctor(System.IntPtr) -M:IntentsUI.INUIAddVoiceShortcutButtonDelegate.PresentAddVoiceShortcut(IntentsUI.INUIAddVoiceShortcutViewController,IntentsUI.INUIAddVoiceShortcutButton) -M:IntentsUI.INUIAddVoiceShortcutButtonDelegate.PresentEditVoiceShortcut(IntentsUI.INUIEditVoiceShortcutViewController,IntentsUI.INUIAddVoiceShortcutButton) M:IntentsUI.INUIAddVoiceShortcutViewController.Dispose(System.Boolean) -M:IntentsUI.INUIAddVoiceShortcutViewControllerDelegate.DidCancel(IntentsUI.INUIAddVoiceShortcutViewController) -M:IntentsUI.INUIAddVoiceShortcutViewControllerDelegate.DidFinish(IntentsUI.INUIAddVoiceShortcutViewController,Intents.INVoiceShortcut,Foundation.NSError) M:IntentsUI.INUIEditVoiceShortcutViewController.Dispose(System.Boolean) -M:IntentsUI.INUIEditVoiceShortcutViewControllerDelegate.DidCancel(IntentsUI.INUIEditVoiceShortcutViewController) -M:IntentsUI.INUIEditVoiceShortcutViewControllerDelegate.DidDelete(IntentsUI.INUIEditVoiceShortcutViewController,Foundation.NSUuid) -M:IntentsUI.INUIEditVoiceShortcutViewControllerDelegate.DidUpdate(IntentsUI.INUIEditVoiceShortcutViewController,Intents.INVoiceShortcut,Foundation.NSError) M:IntentsUI.INUIHostedViewControlling_Extensions.Configure(IntentsUI.IINUIHostedViewControlling,Intents.INInteraction,IntentsUI.INUIHostedViewContext,System.Action{CoreGraphics.CGSize}) M:IntentsUI.INUIHostedViewControlling_Extensions.ConfigureView(IntentsUI.IINUIHostedViewControlling,Foundation.NSSet{Intents.INParameter},Intents.INInteraction,IntentsUI.INUIInteractiveBehavior,IntentsUI.INUIHostedViewContext,IntentsUI.INUIHostedViewControllingConfigureViewHandler) M:IntentsUI.INUIHostedViewSiriProviding_Extensions.GetDisplaysMap(IntentsUI.IINUIHostedViewSiriProviding) @@ -39919,22 +36644,9 @@ M:IntentsUI.NSExtensionContext_INUIHostedViewControlling.GetHostedViewMaximumAll M:IntentsUI.NSExtensionContext_INUIHostedViewControlling.GetHostedViewMinimumAllowedSize(Foundation.NSExtensionContext) M:IntentsUI.NSExtensionContext_INUIHostedViewControlling.GetInterfaceParametersDescription(Foundation.NSExtensionContext) M:IOSurface.IOSurface.#ctor(IOSurface.IOSurfaceOptions) -M:IOSurface.IOSurface.DecrementUseCount M:IOSurface.IOSurface.EncodeTo(Foundation.NSCoder) -M:IOSurface.IOSurface.GetAttachment(Foundation.NSString) -M:IOSurface.IOSurface.GetBaseAddress(System.UIntPtr) -M:IOSurface.IOSurface.GetBytesPerElement(System.UIntPtr) -M:IOSurface.IOSurface.GetBytesPerRow(System.UIntPtr) -M:IOSurface.IOSurface.GetElementHeight(System.UIntPtr) -M:IOSurface.IOSurface.GetElementWidth(System.UIntPtr) -M:IOSurface.IOSurface.GetHeight(System.UIntPtr) -M:IOSurface.IOSurface.GetWidth(System.UIntPtr) -M:IOSurface.IOSurface.IncrementUseCount M:IOSurface.IOSurface.Lock(IOSurface.IOSurfaceLockOptions,System.Int32@) M:IOSurface.IOSurface.Lock(IOSurface.IOSurfaceLockOptions) -M:IOSurface.IOSurface.RemoveAllAttachments -M:IOSurface.IOSurface.RemoveAttachment(Foundation.NSString) -M:IOSurface.IOSurface.SetAttachment(Foundation.NSObject,Foundation.NSString) M:IOSurface.IOSurface.SetPurgeable(IOSurface.IOSurfacePurgeabilityState,IOSurface.IOSurfacePurgeabilityState@) M:IOSurface.IOSurface.SetPurgeable(IOSurface.IOSurfacePurgeabilityState) M:IOSurface.IOSurface.Unlock(IOSurface.IOSurfaceLockOptions,System.Int32@) @@ -39951,76 +36663,8 @@ M:iTunesLibrary.ITLibrary.GetLibrary(System.String,Foundation.NSError@) M:iTunesLibrary.ITLibrary.GetLibrary(System.String,iTunesLibrary.ITLibInitOptions,Foundation.NSError@) M:iTunesLibrary.ITLibrary.ReloadData M:iTunesLibrary.ITLibrary.UnloadData -M:JavaScriptCore.JSContext.#ctor -M:JavaScriptCore.JSContext.#ctor(JavaScriptCore.JSVirtualMachine) -M:JavaScriptCore.JSContext.EvaluateScript(System.String,Foundation.NSUrl) -M:JavaScriptCore.JSContext.EvaluateScript(System.String) -M:JavaScriptCore.JSContext.FromJSGlobalContextRef(System.IntPtr) -M:JavaScriptCore.JSManagedValue.#ctor(JavaScriptCore.JSValue) -M:JavaScriptCore.JSManagedValue.Get(JavaScriptCore.JSValue,Foundation.NSObject) -M:JavaScriptCore.JSManagedValue.Get(JavaScriptCore.JSValue) -M:JavaScriptCore.JSValue.Call(JavaScriptCore.JSValue[]) -M:JavaScriptCore.JSValue.Compare(JavaScriptCore.JSValue) -M:JavaScriptCore.JSValue.Compare(System.Double) -M:JavaScriptCore.JSValue.Compare(System.Int64) -M:JavaScriptCore.JSValue.Compare(System.UInt64) -M:JavaScriptCore.JSValue.Construct(JavaScriptCore.JSValue[]) -M:JavaScriptCore.JSValue.CreateArray(JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateError(System.String,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateNewBigInt(System.Double,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateNewBigInt(System.Int64,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateNewBigInt(System.String,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateNewBigInt(System.UInt64,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateObject(JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreatePromise(JavaScriptCore.JSContext,JavaScriptCore.JSPromiseCreationExecutor) -M:JavaScriptCore.JSValue.CreateRegularExpression(System.String,System.String,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateRejectedPromise(Foundation.NSObject,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateResolvedPromise(Foundation.NSObject,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.CreateSymbol(System.String,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.DefineProperty(System.String,Foundation.NSObject) -M:JavaScriptCore.JSValue.DeleteProperty(System.String) -M:JavaScriptCore.JSValue.From(CoreGraphics.CGPoint,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(CoreGraphics.CGRect,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(CoreGraphics.CGSize,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(Foundation.NSObject,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(Foundation.NSRange,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(System.Boolean,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(System.Double,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(System.Int32,JavaScriptCore.JSContext) M:JavaScriptCore.JSValue.From(System.String,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.From(System.UInt32,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.FromJSJSValueRef(System.IntPtr,JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.GetProperty(System.String) -M:JavaScriptCore.JSValue.GetValueAt(System.UIntPtr) -M:JavaScriptCore.JSValue.HasProperty(System.String) -M:JavaScriptCore.JSValue.Invoke(System.String,JavaScriptCore.JSValue[]) -M:JavaScriptCore.JSValue.IsEqualTo(Foundation.NSObject) -M:JavaScriptCore.JSValue.IsEqualWithTypeCoercionTo(Foundation.NSObject) -M:JavaScriptCore.JSValue.IsInstanceOf(Foundation.NSObject) -M:JavaScriptCore.JSValue.Null(JavaScriptCore.JSContext) -M:JavaScriptCore.JSValue.SetProperty(Foundation.NSObject,System.String) -M:JavaScriptCore.JSValue.SetValue(JavaScriptCore.JSValue,System.UIntPtr) -M:JavaScriptCore.JSValue.ToArray -M:JavaScriptCore.JSValue.ToBool -M:JavaScriptCore.JSValue.ToDate -M:JavaScriptCore.JSValue.ToDictionary -M:JavaScriptCore.JSValue.ToDouble -M:JavaScriptCore.JSValue.ToInt32 -M:JavaScriptCore.JSValue.ToInt64 -M:JavaScriptCore.JSValue.ToNumber -M:JavaScriptCore.JSValue.ToObject -M:JavaScriptCore.JSValue.ToObject(ObjCRuntime.Class) -M:JavaScriptCore.JSValue.ToPoint -M:JavaScriptCore.JSValue.ToRange -M:JavaScriptCore.JSValue.ToRect -M:JavaScriptCore.JSValue.ToSize M:JavaScriptCore.JSValue.ToString -M:JavaScriptCore.JSValue.ToUInt32 -M:JavaScriptCore.JSValue.ToUInt64 -M:JavaScriptCore.JSValue.Undefined(JavaScriptCore.JSContext) -M:JavaScriptCore.JSVirtualMachine.#ctor -M:JavaScriptCore.JSVirtualMachine.AddManagedReference(Foundation.NSObject,Foundation.NSObject) -M:JavaScriptCore.JSVirtualMachine.RemoveManagedReference(Foundation.NSObject,Foundation.NSObject) M:LinkPresentation.LPLinkMetadata.Copy(Foundation.NSZone) M:LinkPresentation.LPLinkMetadata.EncodeTo(Foundation.NSCoder) M:LinkPresentation.LPLinkView.#ctor(CoreGraphics.CGRect) @@ -40101,49 +36745,29 @@ M:MailKit.IMEMessageEncoder.GetEncodingStatus(MailKit.MEMessage,MailKit.MECompos M:MailKit.IMEMessageSecurityHandler.GetExtensionViewController(Foundation.NSData) M:MailKit.IMEMessageSecurityHandler.GetExtensionViewController(MailKit.MEMessageSigner[]) M:MailKit.IMEMessageSecurityHandler.SetPrimaryActionClicked(Foundation.NSData,System.Action{MailKit.MEExtensionViewController}) -M:MailKit.MEAddressAnnotation.CreateErrorAnnotation(System.String) -M:MailKit.MEAddressAnnotation.CreateSuccessAnnotation(System.String) -M:MailKit.MEAddressAnnotation.CreateWarningAnnotation(System.String) M:MailKit.MEAddressAnnotation.EncodeTo(Foundation.NSCoder) M:MailKit.MEComposeSession.EncodeTo(Foundation.NSCoder) -M:MailKit.MEComposeSession.ReloadSession M:MailKit.MEComposeSessionHandler_Extensions.AllowMessageSend(MailKit.IMEComposeSessionHandler,MailKit.MEComposeSession,System.Action{Foundation.NSError}) M:MailKit.MEComposeSessionHandler_Extensions.AnnotateAddress(MailKit.IMEComposeSessionHandler,MailKit.MEComposeSession,System.Action{Foundation.NSDictionary{MailKit.MEEmailAddress,MailKit.MEAddressAnnotation}}) M:MailKit.MEComposeSessionHandler_Extensions.GetAdditionalHeaders(MailKit.IMEComposeSessionHandler,MailKit.MEComposeSession) -M:MailKit.MEDecodedMessage.#ctor(Foundation.NSData,MailKit.MEMessageSecurityInformation,Foundation.NSData,MailKit.MEDecodedMessageBanner) -M:MailKit.MEDecodedMessage.#ctor(Foundation.NSData,MailKit.MEMessageSecurityInformation,Foundation.NSData) M:MailKit.MEDecodedMessage.EncodeTo(Foundation.NSCoder) -M:MailKit.MEDecodedMessageBanner.#ctor(System.String,System.String,System.Boolean) M:MailKit.MEDecodedMessageBanner.Copy(Foundation.NSZone) M:MailKit.MEDecodedMessageBanner.EncodeTo(Foundation.NSCoder) -M:MailKit.MEEmailAddress.#ctor(System.String) M:MailKit.MEEmailAddress.Copy(Foundation.NSZone) M:MailKit.MEEmailAddress.EncodeTo(Foundation.NSCoder) -M:MailKit.MEEncodedOutgoingMessage.#ctor(Foundation.NSData,System.Boolean,System.Boolean) M:MailKit.MEEncodedOutgoingMessage.EncodeTo(Foundation.NSCoder) M:MailKit.MEExtension_Extensions.GetHandlerForComposeSession(MailKit.IMEExtension,MailKit.MEComposeSession) M:MailKit.MEExtension_Extensions.GetHandlerForContentBlocker(MailKit.IMEExtension) M:MailKit.MEExtension_Extensions.GetHandlerForMessageActions(MailKit.IMEExtension) M:MailKit.MEExtension_Extensions.GetHandlerForMessageSecurity(MailKit.IMEExtension) -M:MailKit.MEExtensionManager.ReloadContentBlocker(System.String,System.Action{Foundation.NSError}) -M:MailKit.MEExtensionManager.ReloadVisibleMessages(System.Action{Foundation.NSError}) M:MailKit.MEExtensionViewController.#ctor(System.String,Foundation.NSBundle) M:MailKit.MEMessage.EncodeTo(Foundation.NSCoder) M:MailKit.MEMessageAction.EncodeTo(Foundation.NSCoder) -M:MailKit.MEMessageAction.SetBackgroundColorAction(MailKit.MEMessageActionMessageColor) -M:MailKit.MEMessageAction.SetFlagAction(MailKit.MEMessageActionFlag) -M:MailKit.MEMessageActionDecision.Apply(MailKit.MEMessageAction) -M:MailKit.MEMessageActionDecision.Apply(MailKit.MEMessageAction[]) M:MailKit.MEMessageActionDecision.EncodeTo(Foundation.NSCoder) M:MailKit.MEMessageActionHandler_Extensions.GetRequiredHeaders(MailKit.IMEMessageActionHandler) -M:MailKit.MEMessageEncodingResult.#ctor(MailKit.MEEncodedOutgoingMessage,Foundation.NSError,Foundation.NSError) M:MailKit.MEMessageEncodingResult.EncodeTo(Foundation.NSCoder) -M:MailKit.MEMessageSecurityInformation.#ctor(MailKit.MEMessageSigner[],System.Boolean,Foundation.NSError,Foundation.NSError,System.Boolean,System.String) -M:MailKit.MEMessageSecurityInformation.#ctor(MailKit.MEMessageSigner[],System.Boolean,Foundation.NSError,Foundation.NSError) M:MailKit.MEMessageSecurityInformation.EncodeTo(Foundation.NSCoder) -M:MailKit.MEMessageSigner.#ctor(MailKit.MEEmailAddress[],System.String,Foundation.NSData) M:MailKit.MEMessageSigner.EncodeTo(Foundation.NSCoder) -M:MailKit.MEOutgoingMessageEncodingStatus.#ctor(System.Boolean,System.Boolean,Foundation.NSError,MailKit.MEEmailAddress[]) M:MailKit.MEOutgoingMessageEncodingStatus.EncodeTo(Foundation.NSCoder) M:MapKit.IMKAnnotation.SetCoordinate(CoreLocation.CLLocationCoordinate2D) M:MapKit.IMKLocalSearchCompleterDelegate.DidFail(MapKit.MKLocalSearchCompleter,Foundation.NSError) @@ -40190,16 +36814,13 @@ M:MapKit.MKAddressFilter.EncodeTo(Foundation.NSCoder) M:MapKit.MKAnnotation_Extensions.GetSubtitle(MapKit.IMKAnnotation) M:MapKit.MKAnnotation_Extensions.GetTitle(MapKit.IMKAnnotation) M:MapKit.MKAnnotation_Extensions.SetCoordinate(MapKit.IMKAnnotation,CoreLocation.CLLocationCoordinate2D) -M:MapKit.MKAnnotation.SetCoordinate(CoreLocation.CLLocationCoordinate2D) M:MapKit.MKAnnotationEventArgs.#ctor(MapKit.IMKAnnotation) M:MapKit.MKAnnotationView.#ctor(CoreGraphics.CGRect) M:MapKit.MKAnnotationView.Dispose(System.Boolean) M:MapKit.MKAnnotationView.MKAnnotationViewAppearance.#ctor(System.IntPtr) M:MapKit.MKAnnotationViewEventArgs.#ctor(MapKit.MKAnnotationView) -M:MapKit.MKCircle.Intersects(MapKit.MKMapRect) M:MapKit.MKCircleView.#ctor(CoreGraphics.CGRect) M:MapKit.MKCircleView.MKCircleViewAppearance.#ctor(System.IntPtr) -M:MapKit.MKClusterAnnotation.SetCoordinate(CoreLocation.CLLocationCoordinate2D) M:MapKit.MKCompassButton.Dispose(System.Boolean) M:MapKit.MKCompassButton.MKCompassButtonAppearance.#ctor(System.IntPtr) M:MapKit.MKCoordinateRegion.#ctor(CoreLocation.CLLocationCoordinate2D,MapKit.MKCoordinateSpan) @@ -40224,8 +36845,6 @@ M:MapKit.MKLocalSearch.StartAsync(System.Threading.CancellationToken) M:MapKit.MKLocalSearchCompleter.Dispose(System.Boolean) M:MapKit.MKLocalSearchCompleterDelegate_Extensions.DidFail(MapKit.IMKLocalSearchCompleterDelegate,MapKit.MKLocalSearchCompleter,Foundation.NSError) M:MapKit.MKLocalSearchCompleterDelegate_Extensions.DidUpdateResults(MapKit.IMKLocalSearchCompleterDelegate,MapKit.MKLocalSearchCompleter) -M:MapKit.MKLocalSearchCompleterDelegate.DidFail(MapKit.MKLocalSearchCompleter,Foundation.NSError) -M:MapKit.MKLocalSearchCompleterDelegate.DidUpdateResults(MapKit.MKLocalSearchCompleter) M:MapKit.MKLocalSearchRequest.Copy(Foundation.NSZone) M:MapKit.MKLookAroundScene.Copy(Foundation.NSZone) M:MapKit.MKLookAroundSceneRequest.GetSceneAsync @@ -40238,12 +36857,6 @@ M:MapKit.MKLookAroundViewControllerDelegate_Extensions.DidUpdateScene(MapKit.IMK M:MapKit.MKLookAroundViewControllerDelegate_Extensions.WillDismissFullScreen(MapKit.IMKLookAroundViewControllerDelegate,MapKit.MKLookAroundViewController) M:MapKit.MKLookAroundViewControllerDelegate_Extensions.WillPresentFullScreen(MapKit.IMKLookAroundViewControllerDelegate,MapKit.MKLookAroundViewController) M:MapKit.MKLookAroundViewControllerDelegate_Extensions.WillUpdateScene(MapKit.IMKLookAroundViewControllerDelegate,MapKit.MKLookAroundViewController) -M:MapKit.MKLookAroundViewControllerDelegate.DidDismissFullScreen(MapKit.MKLookAroundViewController) -M:MapKit.MKLookAroundViewControllerDelegate.DidPresentFullScreen(MapKit.MKLookAroundViewController) -M:MapKit.MKLookAroundViewControllerDelegate.DidUpdateScene(MapKit.MKLookAroundViewController) -M:MapKit.MKLookAroundViewControllerDelegate.WillDismissFullScreen(MapKit.MKLookAroundViewController) -M:MapKit.MKLookAroundViewControllerDelegate.WillPresentFullScreen(MapKit.MKLookAroundViewController) -M:MapKit.MKLookAroundViewControllerDelegate.WillUpdateScene(MapKit.MKLookAroundViewController) M:MapKit.MKMapCamera.Copy(Foundation.NSZone) M:MapKit.MKMapCamera.EncodeTo(Foundation.NSCoder) M:MapKit.MKMapCameraBoundary.Copy(Foundation.NSZone) @@ -40254,7 +36867,6 @@ M:MapKit.MKMapCameraZoomRange.Copy(Foundation.NSZone) M:MapKit.MKMapCameraZoomRange.EncodeTo(Foundation.NSCoder) M:MapKit.MKMapConfiguration.Copy(Foundation.NSZone) M:MapKit.MKMapConfiguration.EncodeTo(Foundation.NSCoder) -M:MapKit.MKMapFeatureAnnotation.SetCoordinate(CoreLocation.CLLocationCoordinate2D) M:MapKit.MKMapItem.EncodeTo(Foundation.NSCoder) M:MapKit.MKMapItem.GetItemProviderVisibilityForTypeIdentifier(System.String) M:MapKit.MKMapItem.GetObject(Foundation.NSData,System.String,Foundation.NSError@) @@ -40267,9 +36879,7 @@ M:MapKit.MKMapItem.OpenInMapsAsync(Foundation.NSDictionary) M:MapKit.MKMapItem.OpenMaps(MapKit.MKMapItem[],MapKit.MKLaunchOptions) M:MapKit.MKMapItem.OpenMapsAsync(MapKit.MKMapItem[],Foundation.NSDictionary,UIKit.UIScene) M:MapKit.MKMapItem.OpenMapsAsync(MapKit.MKMapItem[],Foundation.NSDictionary) -M:MapKit.MKMapItemAnnotation.SetCoordinate(CoreLocation.CLLocationCoordinate2D) M:MapKit.MKMapItemDetailViewController.Dispose(System.Boolean) -M:MapKit.MKMapItemDetailViewControllerDelegate.DidFinish(MapKit.MKMapItemDetailViewController) M:MapKit.MKMapItemIdentifier.Copy(Foundation.NSZone) M:MapKit.MKMapItemIdentifier.EncodeTo(Foundation.NSCoder) M:MapKit.MKMapItemRequest.GetMapItemAsync @@ -40384,45 +36994,12 @@ M:MapKit.MKMapViewDelegate_Extensions.RegionWillChange(MapKit.IMKMapViewDelegate M:MapKit.MKMapViewDelegate_Extensions.WillStartLoadingMap(MapKit.IMKMapViewDelegate,MapKit.MKMapView) M:MapKit.MKMapViewDelegate_Extensions.WillStartLocatingUser(MapKit.IMKMapViewDelegate,MapKit.MKMapView) M:MapKit.MKMapViewDelegate_Extensions.WillStartRenderingMap(MapKit.IMKMapViewDelegate,MapKit.MKMapView) -M:MapKit.MKMapViewDelegate.CalloutAccessoryControlTapped(MapKit.MKMapView,MapKit.MKAnnotationView,UIKit.UIControl) -M:MapKit.MKMapViewDelegate.ChangedDragState(MapKit.MKMapView,MapKit.MKAnnotationView,MapKit.MKAnnotationViewDragState,MapKit.MKAnnotationViewDragState) -M:MapKit.MKMapViewDelegate.CreateClusterAnnotation(MapKit.MKMapView,MapKit.IMKAnnotation[]) -M:MapKit.MKMapViewDelegate.DidAddAnnotationViews(MapKit.MKMapView,MapKit.MKAnnotationView[]) -M:MapKit.MKMapViewDelegate.DidAddOverlayRenderers(MapKit.MKMapView,MapKit.MKOverlayRenderer[]) -M:MapKit.MKMapViewDelegate.DidAddOverlayViews(MapKit.MKMapView,MapKit.MKOverlayView) -M:MapKit.MKMapViewDelegate.DidChangeUserTrackingMode(MapKit.MKMapView,MapKit.MKUserTrackingMode,System.Boolean) -M:MapKit.MKMapViewDelegate.DidChangeVisibleRegion(MapKit.MKMapView) -M:MapKit.MKMapViewDelegate.DidDeselectAnnotation(MapKit.MKMapView,MapKit.IMKAnnotation) -M:MapKit.MKMapViewDelegate.DidDeselectAnnotationView(MapKit.MKMapView,MapKit.MKAnnotationView) -M:MapKit.MKMapViewDelegate.DidFailToLocateUser(MapKit.MKMapView,Foundation.NSError) -M:MapKit.MKMapViewDelegate.DidFinishRenderingMap(MapKit.MKMapView,System.Boolean) -M:MapKit.MKMapViewDelegate.DidSelectAnnotation(MapKit.MKMapView,MapKit.IMKAnnotation) -M:MapKit.MKMapViewDelegate.DidSelectAnnotationView(MapKit.MKMapView,MapKit.MKAnnotationView) -M:MapKit.MKMapViewDelegate.DidStopLocatingUser(MapKit.MKMapView) -M:MapKit.MKMapViewDelegate.DidUpdateUserLocation(MapKit.MKMapView,MapKit.MKUserLocation) -M:MapKit.MKMapViewDelegate.GetSelectionAccessory(MapKit.MKMapView,MapKit.IMKAnnotation) -M:MapKit.MKMapViewDelegate.GetViewForAnnotation(MapKit.MKMapView,MapKit.IMKAnnotation) -M:MapKit.MKMapViewDelegate.GetViewForOverlay(MapKit.MKMapView,MapKit.IMKOverlay) -M:MapKit.MKMapViewDelegate.LoadingMapFailed(MapKit.MKMapView,Foundation.NSError) -M:MapKit.MKMapViewDelegate.MapLoaded(MapKit.MKMapView) -M:MapKit.MKMapViewDelegate.OverlayRenderer(MapKit.MKMapView,MapKit.IMKOverlay) -M:MapKit.MKMapViewDelegate.RegionChanged(MapKit.MKMapView,System.Boolean) -M:MapKit.MKMapViewDelegate.RegionWillChange(MapKit.MKMapView,System.Boolean) -M:MapKit.MKMapViewDelegate.WillStartLoadingMap(MapKit.MKMapView) -M:MapKit.MKMapViewDelegate.WillStartLocatingUser(MapKit.MKMapView) -M:MapKit.MKMapViewDelegate.WillStartRenderingMap(MapKit.MKMapView) M:MapKit.MKMapViewDragStateEventArgs.#ctor(MapKit.MKAnnotationView,MapKit.MKAnnotationViewDragState,MapKit.MKAnnotationViewDragState) -M:MapKit.MKMarkerAnnotationView.#ctor(MapKit.IMKAnnotation,System.String) M:MapKit.MKMarkerAnnotationView.MKMarkerAnnotationViewAppearance.#ctor(System.IntPtr) M:MapKit.MKMultiPoint.GetCoordinates(System.Int32,System.Int32) -M:MapKit.MKMultiPolygon.Intersects(MapKit.MKMapRect) -M:MapKit.MKMultiPolyline.Intersects(MapKit.MKMapRect) M:MapKit.MKOverlay_Extensions.GetCanReplaceMapContent(MapKit.IMKOverlay) M:MapKit.MKOverlay_Extensions.Intersects(MapKit.IMKOverlay,MapKit.MKMapRect) -M:MapKit.MKOverlay.Intersects(MapKit.MKMapRect) -M:MapKit.MKOverlayPathRenderer.#ctor(MapKit.IMKOverlay) M:MapKit.MKOverlayPathView.#ctor(CoreGraphics.CGRect) -M:MapKit.MKOverlayPathView.#ctor(MapKit.IMKOverlay) M:MapKit.MKOverlayPathView.MKOverlayPathViewAppearance.#ctor(System.IntPtr) M:MapKit.MKOverlayRenderer.MKRoadWidthAtZoomScale(System.Runtime.InteropServices.NFloat) M:MapKit.MKOverlayView.#ctor(CoreGraphics.CGRect) @@ -40430,14 +37007,12 @@ M:MapKit.MKOverlayView.MKOverlayViewAppearance.#ctor(System.IntPtr) M:MapKit.MKOverlayView.MKRoadWidthAtZoomScale(System.Runtime.InteropServices.NFloat) M:MapKit.MKOverlayViewsEventArgs.#ctor(MapKit.MKOverlayView) M:MapKit.MKPinAnnotationView.#ctor(CoreGraphics.CGRect) -M:MapKit.MKPinAnnotationView.#ctor(MapKit.IMKAnnotation,System.String) M:MapKit.MKPinAnnotationView.MKPinAnnotationViewAppearance.#ctor(System.IntPtr) M:MapKit.MKPitchControl.#ctor(CoreGraphics.CGRect) M:MapKit.MKPitchControl.Dispose(System.Boolean) M:MapKit.MKPitchControl.MKPitchControlAppearance.#ctor(System.IntPtr) M:MapKit.MKPlacemark.#ctor(CoreLocation.CLLocationCoordinate2D,MapKit.MKPlacemarkAddress) M:MapKit.MKPlacemark.Copy(Foundation.NSZone) -M:MapKit.MKPlacemark.SetCoordinate(CoreLocation.CLLocationCoordinate2D) M:MapKit.MKPlacemarkAddress.#ctor M:MapKit.MKPlacemarkAddress.#ctor(Foundation.NSDictionary) M:MapKit.MKPointOfInterestFilter.#ctor(MapKit.MKPointOfInterestCategory[],MapKit.MKPointOfInterestFilterType) @@ -40448,24 +37023,17 @@ M:MapKit.MKPolygon.FromCoordinates(CoreLocation.CLLocationCoordinate2D[],MapKit. M:MapKit.MKPolygon.FromCoordinates(CoreLocation.CLLocationCoordinate2D[]) M:MapKit.MKPolygon.FromPoints(MapKit.MKMapPoint[],MapKit.MKPolygon[]) M:MapKit.MKPolygon.FromPoints(MapKit.MKMapPoint[]) -M:MapKit.MKPolygon.Intersects(MapKit.MKMapRect) M:MapKit.MKPolygonView.#ctor(CoreGraphics.CGRect) M:MapKit.MKPolygonView.MKPolygonViewAppearance.#ctor(System.IntPtr) M:MapKit.MKPolyline.FromCoordinates(CoreLocation.CLLocationCoordinate2D[]) M:MapKit.MKPolyline.FromPoints(MapKit.MKMapPoint[]) -M:MapKit.MKPolyline.Intersects(MapKit.MKMapRect) M:MapKit.MKPolylineView.#ctor(CoreGraphics.CGRect) M:MapKit.MKPolylineView.MKPolylineViewAppearance.#ctor(System.IntPtr) M:MapKit.MKReverseGeocoder.Dispose(System.Boolean) -M:MapKit.MKReverseGeocoderDelegate.FailedWithError(MapKit.MKReverseGeocoder,Foundation.NSError) -M:MapKit.MKReverseGeocoderDelegate.FoundWithPlacemark(MapKit.MKReverseGeocoder,MapKit.MKPlacemark) M:MapKit.MKScaleView.Dispose(System.Boolean) M:MapKit.MKScaleView.MKScaleViewAppearance.#ctor(System.IntPtr) -M:MapKit.MKShape.SetCoordinate(CoreLocation.CLLocationCoordinate2D) -M:MapKit.MKTileOverlay.Intersects(MapKit.MKMapRect) M:MapKit.MKUserLocationEventArgs.#ctor(MapKit.MKUserLocation) M:MapKit.MKUserLocationView.#ctor(CoreGraphics.CGRect) -M:MapKit.MKUserLocationView.#ctor(MapKit.IMKAnnotation,System.String) M:MapKit.MKUserLocationView.MKUserLocationViewAppearance.#ctor(System.IntPtr) M:MapKit.MKUserTrackingBarButtonItem.MKUserTrackingBarButtonItemAppearance.#ctor(System.IntPtr) M:MapKit.MKUserTrackingButton.Dispose(System.Boolean) @@ -40798,62 +37366,22 @@ M:MediaToolbox.MTProfessionalVideoWorkflow.RegisterFormatReaders M:Messages.IMSMessagesAppTranscriptPresentation.GetContentSizeThatFits(CoreGraphics.CGSize) M:Messages.IMSStickerBrowserViewDataSource.GetNumberOfStickers(Messages.MSStickerBrowserView) M:Messages.IMSStickerBrowserViewDataSource.GetSticker(Messages.MSStickerBrowserView,System.IntPtr) -M:Messages.MSConversation.InsertAttachment(Foundation.NSUrl,System.String,System.Action{Foundation.NSError}) M:Messages.MSConversation.InsertAttachmentAsync(Foundation.NSUrl,System.String) -M:Messages.MSConversation.InsertMessage(Messages.MSMessage,System.Action{Foundation.NSError}) M:Messages.MSConversation.InsertMessageAsync(Messages.MSMessage) -M:Messages.MSConversation.InsertSticker(Messages.MSSticker,System.Action{Foundation.NSError}) M:Messages.MSConversation.InsertStickerAsync(Messages.MSSticker) -M:Messages.MSConversation.InsertText(System.String,System.Action{Foundation.NSError}) M:Messages.MSConversation.InsertTextAsync(System.String) -M:Messages.MSConversation.SendAttachment(Foundation.NSUrl,System.String,System.Action{Foundation.NSError}) M:Messages.MSConversation.SendAttachmentAsync(Foundation.NSUrl,System.String) -M:Messages.MSConversation.SendMessage(Messages.MSMessage,System.Action{Foundation.NSError}) M:Messages.MSConversation.SendMessageAsync(Messages.MSMessage) -M:Messages.MSConversation.SendSticker(Messages.MSSticker,System.Action{Foundation.NSError}) M:Messages.MSConversation.SendStickerAsync(Messages.MSSticker) -M:Messages.MSConversation.SendText(System.String,System.Action{Foundation.NSError}) M:Messages.MSConversation.SendTextAsync(System.String) -M:Messages.MSMessage.#ctor -M:Messages.MSMessage.#ctor(Messages.MSSession) M:Messages.MSMessage.Copy(Foundation.NSZone) M:Messages.MSMessage.EncodeTo(Foundation.NSCoder) M:Messages.MSMessageLayout.Copy(Foundation.NSZone) -M:Messages.MSMessageLiveLayout.#ctor(Messages.MSMessageTemplateLayout) M:Messages.MSMessagesAppViewController.#ctor(System.String,Foundation.NSBundle) -M:Messages.MSMessagesAppViewController.DidBecomeActive(Messages.MSConversation) -M:Messages.MSMessagesAppViewController.DidCancelSendingMessage(Messages.MSMessage,Messages.MSConversation) -M:Messages.MSMessagesAppViewController.DidReceiveMessage(Messages.MSMessage,Messages.MSConversation) -M:Messages.MSMessagesAppViewController.DidResignActive(Messages.MSConversation) -M:Messages.MSMessagesAppViewController.DidSelectMessage(Messages.MSMessage,Messages.MSConversation) -M:Messages.MSMessagesAppViewController.DidStartSendingMessage(Messages.MSMessage,Messages.MSConversation) -M:Messages.MSMessagesAppViewController.DidTransition(Messages.MSMessagesAppPresentationStyle) -M:Messages.MSMessagesAppViewController.Dismiss -M:Messages.MSMessagesAppViewController.GetContentSizeThatFits(CoreGraphics.CGSize) -M:Messages.MSMessagesAppViewController.Request(Messages.MSMessagesAppPresentationStyle) -M:Messages.MSMessagesAppViewController.WillBecomeActive(Messages.MSConversation) -M:Messages.MSMessagesAppViewController.WillResignActive(Messages.MSConversation) -M:Messages.MSMessagesAppViewController.WillSelectMessage(Messages.MSMessage,Messages.MSConversation) -M:Messages.MSMessagesAppViewController.WillTransition(Messages.MSMessagesAppPresentationStyle) M:Messages.MSSession.EncodeTo(Foundation.NSCoder) -M:Messages.MSSticker.#ctor(Foundation.NSUrl,Foundation.NSUuid,System.String) -M:Messages.MSSticker.#ctor(Foundation.NSUrl,System.String,Foundation.NSError@) -M:Messages.MSStickerBrowserView.#ctor(CoreGraphics.CGRect,Messages.MSStickerSize) -M:Messages.MSStickerBrowserView.#ctor(CoreGraphics.CGRect) M:Messages.MSStickerBrowserView.Dispose(System.Boolean) M:Messages.MSStickerBrowserView.MSStickerBrowserViewAppearance.#ctor(System.IntPtr) -M:Messages.MSStickerBrowserView.ReloadData -M:Messages.MSStickerBrowserView.SetContentOffset(CoreGraphics.CGPoint,System.Boolean) -M:Messages.MSStickerBrowserViewController.#ctor(Messages.MSStickerSize) -M:Messages.MSStickerBrowserViewController.GetNumberOfStickers(Messages.MSStickerBrowserView) -M:Messages.MSStickerBrowserViewController.GetSticker(Messages.MSStickerBrowserView,System.IntPtr) -M:Messages.MSStickerBrowserViewDataSource.GetNumberOfStickers(Messages.MSStickerBrowserView) -M:Messages.MSStickerBrowserViewDataSource.GetSticker(Messages.MSStickerBrowserView,System.IntPtr) -M:Messages.MSStickerView.#ctor(CoreGraphics.CGRect,Messages.MSSticker) -M:Messages.MSStickerView.#ctor(CoreGraphics.CGRect) M:Messages.MSStickerView.MSStickerViewAppearance.#ctor(System.IntPtr) -M:Messages.MSStickerView.StartAnimating -M:Messages.MSStickerView.StopAnimating M:MessageUI.IMFMailComposeViewControllerDelegate.Finished(MessageUI.MFMailComposeViewController,MessageUI.MFMailComposeResult,Foundation.NSError) M:MessageUI.IMFMessageComposeViewControllerDelegate.Finished(MessageUI.MFMessageComposeViewController,MessageUI.MessageComposeResult) M:MessageUI.MFComposeResultEventArgs.#ctor(MessageUI.MFMailComposeViewController,MessageUI.MFMailComposeResult,Foundation.NSError) @@ -41380,8 +37908,6 @@ M:Metal.MTLBlitPassSampleBufferAttachmentDescriptor.Copy(Foundation.NSZone) M:Metal.MTLBuffer_Extensions.GetGpuAddress(Metal.IMTLBuffer) M:Metal.MTLBufferLayoutDescriptor.Copy(Foundation.NSZone) M:Metal.MTLCaptureDescriptor.Copy(Foundation.NSZone) -M:Metal.MTLCaptureScope.BeginScope -M:Metal.MTLCaptureScope.EndScope M:Metal.MTLClearColor.#ctor(System.Double,System.Double,System.Double,System.Double) M:Metal.MTLClearValue.#ctor(Metal.MTLClearColor) M:Metal.MTLClearValue.#ctor(System.Double) @@ -41452,13 +37978,8 @@ M:Metal.MTLDevice.GetAllDevices M:Metal.MTLDevice.GetAllDevices(Metal.MTLDeviceNotificationHandler,Foundation.NSObject@) M:Metal.MTLDevice.RemoveObserver(Foundation.NSObject) M:Metal.MTLDevice.TrampolineNotificationHandler(System.IntPtr,System.IntPtr,System.IntPtr) -M:Metal.MTLDrawable.AddPresentedHandler(System.Action{Metal.IMTLDrawable}) -M:Metal.MTLDrawable.Present -M:Metal.MTLDrawable.Present(System.Double) -M:Metal.MTLDrawable.PresentAfter(System.Double) M:Metal.MTLDrawPatchIndirectArguments.#ctor(System.UInt32,System.UInt32,System.UInt32,System.UInt32) M:Metal.MTLFunction_Extensions.GetOptions(Metal.IMTLFunction) -M:Metal.MTLFunctionConstantValues.#ctor M:Metal.MTLFunctionConstantValues.Copy(Foundation.NSZone) M:Metal.MTLFunctionDescriptor.Copy(Foundation.NSZone) M:Metal.MTLFunctionStitchingFunctionNode.Copy(Foundation.NSZone) @@ -41619,19 +38140,11 @@ M:Metal.NSProcessInfo_NSDeviceCertification.HasPerformanceProfile(Foundation.NSP M:Metal.NSProcessInfo_NSDeviceCertification.IsDeviceCertifiedFor(Foundation.NSProcessInfo,Metal.NSDeviceCertification) M:MetalFX.IMTLFXSpatialScaler.Encode(Metal.IMTLCommandBuffer) M:MetalFX.IMTLFXTemporalScaler.Encode(Metal.IMTLCommandBuffer) -M:MetalFX.MTLFXSpatialScalerDescriptor.Create(Metal.IMTLDevice) -M:MetalFX.MTLFXSpatialScalerDescriptor.SupportsDevice(Metal.IMTLDevice) -M:MetalFX.MTLFXTemporalScalerDescriptor.Create(Metal.IMTLDevice) -M:MetalFX.MTLFXTemporalScalerDescriptor.GetSupportedInputContentMaxScale(Metal.IMTLDevice) -M:MetalFX.MTLFXTemporalScalerDescriptor.GetSupportedInputContentMinScale(Metal.IMTLDevice) -M:MetalFX.MTLFXTemporalScalerDescriptor.SupportsDevice(Metal.IMTLDevice) M:MetalKit.IMTKViewDelegate.Draw(MetalKit.MTKView) M:MetalKit.IMTKViewDelegate.DrawableSizeWillChange(MetalKit.MTKView,CoreGraphics.CGSize) -M:MetalKit.MTKMesh.#ctor(ModelIO.MDLMesh,Metal.IMTLDevice,Foundation.NSError@) M:MetalKit.MTKMesh.FromAsset(ModelIO.MDLAsset,Metal.IMTLDevice,ModelIO.MDLMesh[]@,Foundation.NSError@) M:MetalKit.MTKMeshBuffer.Copy(Foundation.NSZone) M:MetalKit.MTKMeshBuffer.FillData(Foundation.NSData,System.UIntPtr) -M:MetalKit.MTKMeshBufferAllocator.#ctor(Metal.IMTLDevice) M:MetalKit.MTKMeshBufferAllocator.CreateBuffer(Foundation.NSData,ModelIO.MDLMeshBufferType) M:MetalKit.MTKMeshBufferAllocator.CreateBuffer(ModelIO.IMDLMeshBufferZone,Foundation.NSData,ModelIO.MDLMeshBufferType) M:MetalKit.MTKMeshBufferAllocator.CreateBuffer(ModelIO.IMDLMeshBufferZone,System.UIntPtr,ModelIO.MDLMeshBufferType) @@ -41639,35 +38152,26 @@ M:MetalKit.MTKMeshBufferAllocator.CreateBuffer(System.UIntPtr,ModelIO.MDLMeshBuf M:MetalKit.MTKMeshBufferAllocator.CreateZone(Foundation.NSNumber[],Foundation.NSNumber[]) M:MetalKit.MTKMeshBufferAllocator.CreateZone(System.UIntPtr) M:MetalKit.MTKSubmesh.Dispose(System.Boolean) -M:MetalKit.MTKTextureLoader.#ctor(Metal.IMTLDevice) M:MetalKit.MTKTextureLoader.FromCGImage(CoreGraphics.CGImage,MetalKit.MTKTextureLoaderOptions,Foundation.NSError@) M:MetalKit.MTKTextureLoader.FromCGImage(CoreGraphics.CGImage,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromCGImageAsync(CoreGraphics.CGImage,MetalKit.MTKTextureLoaderOptions) M:MetalKit.MTKTextureLoader.FromData(Foundation.NSData,MetalKit.MTKTextureLoaderOptions,Foundation.NSError@) M:MetalKit.MTKTextureLoader.FromData(Foundation.NSData,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromDataAsync(Foundation.NSData,MetalKit.MTKTextureLoaderOptions) -M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,Foundation.NSDictionary,Foundation.NSError@) -M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,Foundation.NSDictionary,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions,Foundation.NSError@) M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderCallback) -M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary,Foundation.NSError@) -M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions,Foundation.NSError@) M:MetalKit.MTKTextureLoader.FromName(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromNameAsync(System.String,System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,Foundation.NSDictionary) M:MetalKit.MTKTextureLoader.FromNameAsync(System.String,System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions) M:MetalKit.MTKTextureLoader.FromNameAsync(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary) M:MetalKit.MTKTextureLoader.FromNameAsync(System.String,System.Runtime.InteropServices.NFloat,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions) -M:MetalKit.MTKTextureLoader.FromNames(System.String[],System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,Foundation.NSDictionary,MetalKit.MTKTextureLoaderArrayCallback) M:MetalKit.MTKTextureLoader.FromNames(System.String[],System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderArrayCallback) -M:MetalKit.MTKTextureLoader.FromNames(System.String[],System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary,MetalKit.MTKTextureLoaderArrayCallback) M:MetalKit.MTKTextureLoader.FromNames(System.String[],System.Runtime.InteropServices.NFloat,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderArrayCallback) M:MetalKit.MTKTextureLoader.FromNamesAsync(System.String[],System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,Foundation.NSDictionary) M:MetalKit.MTKTextureLoader.FromNamesAsync(System.String[],System.Runtime.InteropServices.NFloat,AppKit.NSDisplayGamut,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions) M:MetalKit.MTKTextureLoader.FromNamesAsync(System.String[],System.Runtime.InteropServices.NFloat,Foundation.NSBundle,Foundation.NSDictionary) M:MetalKit.MTKTextureLoader.FromNamesAsync(System.String[],System.Runtime.InteropServices.NFloat,Foundation.NSBundle,MetalKit.MTKTextureLoaderOptions) -M:MetalKit.MTKTextureLoader.FromTexture(ModelIO.MDLTexture,Foundation.NSDictionary,Foundation.NSError@) -M:MetalKit.MTKTextureLoader.FromTexture(ModelIO.MDLTexture,Foundation.NSDictionary,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromTexture(ModelIO.MDLTexture,MetalKit.MTKTextureLoaderOptions,Foundation.NSError@) M:MetalKit.MTKTextureLoader.FromTexture(ModelIO.MDLTexture,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromTextureAsync(ModelIO.MDLTexture,Foundation.NSDictionary) @@ -41675,27 +38179,20 @@ M:MetalKit.MTKTextureLoader.FromTextureAsync(ModelIO.MDLTexture,MetalKit.MTKText M:MetalKit.MTKTextureLoader.FromUrl(Foundation.NSUrl,MetalKit.MTKTextureLoaderOptions,Foundation.NSError@) M:MetalKit.MTKTextureLoader.FromUrl(Foundation.NSUrl,MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderCallback) M:MetalKit.MTKTextureLoader.FromUrlAsync(Foundation.NSUrl,MetalKit.MTKTextureLoaderOptions) -M:MetalKit.MTKTextureLoader.FromUrls(Foundation.NSUrl[],Foundation.NSDictionary,Foundation.NSError@) -M:MetalKit.MTKTextureLoader.FromUrls(Foundation.NSUrl[],Foundation.NSDictionary,MetalKit.MTKTextureLoaderArrayCallback) M:MetalKit.MTKTextureLoader.FromUrls(Foundation.NSUrl[],MetalKit.MTKTextureLoaderOptions,Foundation.NSError@) M:MetalKit.MTKTextureLoader.FromUrls(Foundation.NSUrl[],MetalKit.MTKTextureLoaderOptions,MetalKit.MTKTextureLoaderArrayCallback) M:MetalKit.MTKTextureLoader.FromUrlsAsync(Foundation.NSUrl[],Foundation.NSDictionary) M:MetalKit.MTKTextureLoader.FromUrlsAsync(Foundation.NSUrl[],MetalKit.MTKTextureLoaderOptions) M:MetalKit.MTKTextureLoaderOptions.#ctor M:MetalKit.MTKTextureLoaderOptions.#ctor(Foundation.NSDictionary) -M:MetalKit.MTKView.#ctor(CoreGraphics.CGRect,Metal.IMTLDevice) M:MetalKit.MTKView.ActionForLayer(CoreAnimation.CALayer,System.String) M:MetalKit.MTKView.DisplayLayer(CoreAnimation.CALayer) M:MetalKit.MTKView.Dispose(System.Boolean) -M:MetalKit.MTKView.Draw M:MetalKit.MTKView.DrawLayer(CoreAnimation.CALayer,CoreGraphics.CGContext) M:MetalKit.MTKView.EncodeTo(Foundation.NSCoder) M:MetalKit.MTKView.LayoutSublayersOfLayer(CoreAnimation.CALayer) M:MetalKit.MTKView.MTKViewAppearance.#ctor(System.IntPtr) -M:MetalKit.MTKView.ReleaseDrawables M:MetalKit.MTKView.WillDrawLayer(CoreAnimation.CALayer) -M:MetalKit.MTKViewDelegate.Draw(MetalKit.MTKView) -M:MetalKit.MTKViewDelegate.DrawableSizeWillChange(MetalKit.MTKView,CoreGraphics.CGSize) M:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.Copy(Foundation.NSZone,Metal.IMTLDevice) M:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.CreateInstance``1(Foundation.NSCoder) M:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.Encode(Foundation.NSCoder) @@ -43333,11 +39830,7 @@ M:MetricKit.MXHistogram`1.EncodeTo(Foundation.NSCoder) M:MetricKit.MXHistogramBucket`1.EncodeTo(Foundation.NSCoder) M:MetricKit.MXMetaData.EncodeTo(Foundation.NSCoder) M:MetricKit.MXMetric.EncodeTo(Foundation.NSCoder) -M:MetricKit.MXMetricManager.Add(MetricKit.IMXMetricManagerSubscriber) -M:MetricKit.MXMetricManager.ExtendLaunchMeasurement(System.String,Foundation.NSError@) -M:MetricKit.MXMetricManager.FinishExtendedLaunchMeasurement(System.String,Foundation.NSError@) M:MetricKit.MXMetricManager.MakeLogHandle(Foundation.NSString) -M:MetricKit.MXMetricManager.Remove(MetricKit.IMXMetricManagerSubscriber) M:MetricKit.MXMetricManagerSubscriber_Extensions.DidReceiveDiagnosticPayloads(MetricKit.IMXMetricManagerSubscriber,MetricKit.MXDiagnosticPayload[]) M:MetricKit.MXMetricManagerSubscriber_Extensions.DidReceiveMetricPayloads(MetricKit.IMXMetricManagerSubscriber,MetricKit.MXMetricPayload[]) M:MetricKit.MXMetricPayload.EncodeTo(Foundation.NSCoder) @@ -45130,15 +41623,6 @@ M:OpenGLES.EAGLContext.RenderBufferStorage(System.UIntPtr,CoreAnimation.CAEAGLLa M:OpenGLES.EAGLContext.SetCurrentContext(OpenGLES.EAGLContext) M:OpenGLES.EAGLContext.TexImage(IOSurface.IOSurface,System.UIntPtr,System.UIntPtr,System.UInt32,System.UInt32,System.UIntPtr,System.UIntPtr,System.UInt32) M:OSLog.OSLogMessageComponent.EncodeTo(Foundation.NSCoder) -M:OSLog.OSLogStore.#ctor -M:OSLog.OSLogStore.CreateLocalStore(Foundation.NSError@) -M:OSLog.OSLogStore.CreateStore(Foundation.NSUrl,Foundation.NSError@) -M:OSLog.OSLogStore.CreateStore(OSLog.OSLogStoreScope,Foundation.NSError@) -M:OSLog.OSLogStore.GetEntriesEnumerator(Foundation.NSError@) -M:OSLog.OSLogStore.GetEntriesEnumerator(OSLog.OSLogEnumeratorOptions,OSLog.OSLogPosition,Foundation.NSPredicate,Foundation.NSError@) -M:OSLog.OSLogStore.GetPosition(Foundation.NSDate) -M:OSLog.OSLogStore.GetPositionWithTimeIntervalSinceEnd(System.Double) -M:OSLog.OSLogStore.GetPositionWithTimeIntervalSinceLatestBoot(System.Double) M:PassKit.IPKAddPassesViewControllerDelegate.Finished(PassKit.PKAddPassesViewController) M:PassKit.IPKAddPaymentPassViewControllerDelegate.DidFinishAddingPaymentPass(PassKit.PKAddPaymentPassViewController,PassKit.PKPaymentPass,Foundation.NSError) M:PassKit.IPKAddPaymentPassViewControllerDelegate.GenerateRequestWithCertificateChain(PassKit.PKAddPaymentPassViewController,Foundation.NSData[],Foundation.NSData,Foundation.NSData,System.Action{PassKit.PKAddPaymentPassRequest}) @@ -45755,26 +42239,17 @@ M:PencilKit.IPKToolPickerObserver.IsRulerActiveDidChange(PencilKit.PKToolPicker) M:PencilKit.IPKToolPickerObserver.SelectedToolDidChange(PencilKit.PKToolPicker) M:PencilKit.IPKToolPickerObserver.SelectedToolItemDidChange(PencilKit.PKToolPicker) M:PencilKit.IPKToolPickerObserver.VisibilityDidChange(PencilKit.PKToolPicker) -M:PencilKit.PKCanvasView.FramesObscuredDidChange(PencilKit.PKToolPicker) -M:PencilKit.PKCanvasView.IsRulerActiveDidChange(PencilKit.PKToolPicker) M:PencilKit.PKCanvasView.PKCanvasViewAppearance.#ctor(System.IntPtr) -M:PencilKit.PKCanvasView.SelectedToolDidChange(PencilKit.PKToolPicker) -M:PencilKit.PKCanvasView.SelectedToolItemDidChange(PencilKit.PKToolPicker) -M:PencilKit.PKCanvasView.VisibilityDidChange(PencilKit.PKToolPicker) M:PencilKit.PKCanvasViewDelegate_Extensions.DidBeginUsingTool(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate_Extensions.DidFinishRendering(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate_Extensions.DrawingDidChange(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate_Extensions.EndUsingTool(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate.DecelerationEnded(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.DecelerationStarted(UIKit.UIScrollView) -M:PencilKit.PKCanvasViewDelegate.DidBeginUsingTool(PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate.DidChangeAdjustedContentInset(UIKit.UIScrollView) -M:PencilKit.PKCanvasViewDelegate.DidFinishRendering(PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate.DidZoom(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.DraggingEnded(UIKit.UIScrollView,System.Boolean) M:PencilKit.PKCanvasViewDelegate.DraggingStarted(UIKit.UIScrollView) -M:PencilKit.PKCanvasViewDelegate.DrawingDidChange(PencilKit.PKCanvasView) -M:PencilKit.PKCanvasViewDelegate.EndUsingTool(PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate.ScrollAnimationEnded(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.Scrolled(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.ScrolledToTop(UIKit.UIScrollView) @@ -45783,72 +42258,18 @@ M:PencilKit.PKCanvasViewDelegate.ViewForZoomingInScrollView(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.WillEndDragging(UIKit.UIScrollView,CoreGraphics.CGPoint,CoreGraphics.CGPoint@) M:PencilKit.PKCanvasViewDelegate.ZoomingEnded(UIKit.UIScrollView,UIKit.UIView,System.Runtime.InteropServices.NFloat) M:PencilKit.PKCanvasViewDelegate.ZoomingStarted(UIKit.UIScrollView,UIKit.UIView) -M:PencilKit.PKDrawing.#ctor(Foundation.NSData,Foundation.NSError@) -M:PencilKit.PKDrawing.#ctor(PencilKit.PKStroke[]) M:PencilKit.PKDrawing.Copy(Foundation.NSZone) M:PencilKit.PKDrawing.EncodeTo(Foundation.NSCoder) -M:PencilKit.PKDrawing.GetDrawing(CoreGraphics.CGAffineTransform) -M:PencilKit.PKDrawing.GetDrawing(PencilKit.PKDrawing) -M:PencilKit.PKDrawing.GetDrawing(PencilKit.PKStroke[]) -M:PencilKit.PKDrawing.GetImage(CoreGraphics.CGRect,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKEraserTool.#ctor(PencilKit.PKEraserType,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKEraserTool.#ctor(PencilKit.PKEraserType) -M:PencilKit.PKEraserTool.GetDefaultWidth(PencilKit.PKEraserType) -M:PencilKit.PKEraserTool.GetMaximumWidth(PencilKit.PKEraserType) -M:PencilKit.PKEraserTool.GetMinimumWidth(PencilKit.PKEraserType) -M:PencilKit.PKFloatRange.#ctor(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:PencilKit.PKFloatRange.Copy(Foundation.NSZone) M:PencilKit.PKInk.#ctor(PencilKit.PKInkType,AppKit.NSColor) M:PencilKit.PKInk.#ctor(PencilKit.PKInkType,UIKit.UIColor) M:PencilKit.PKInk.Copy(Foundation.NSZone) -M:PencilKit.PKInkingTool.#ctor(PencilKit.PKInk,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKInkingTool.#ctor(PencilKit.PKInkType,AppKit.NSColor,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKInkingTool.#ctor(PencilKit.PKInkType,AppKit.NSColor) -M:PencilKit.PKInkingTool.#ctor(PencilKit.PKInkType,UIKit.UIColor,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKInkingTool.#ctor(PencilKit.PKInkType,UIKit.UIColor) -M:PencilKit.PKInkingTool.ConvertColor(UIKit.UIColor,UIKit.UIUserInterfaceStyle,UIKit.UIUserInterfaceStyle) -M:PencilKit.PKInkingTool.GetDefaultWidth(PencilKit.PKInkType) -M:PencilKit.PKInkingTool.GetMaximumWidth(PencilKit.PKInkType) -M:PencilKit.PKInkingTool.GetMinimumWidth(PencilKit.PKInkType) -M:PencilKit.PKStroke.#ctor(PencilKit.PKInk,PencilKit.PKStrokePath,CoreGraphics.CGAffineTransform,AppKit.NSBezierPath,System.UInt32) -M:PencilKit.PKStroke.#ctor(PencilKit.PKInk,PencilKit.PKStrokePath,CoreGraphics.CGAffineTransform,AppKit.NSBezierPath) -M:PencilKit.PKStroke.#ctor(PencilKit.PKInk,PencilKit.PKStrokePath,CoreGraphics.CGAffineTransform,UIKit.UIBezierPath,System.UInt32) -M:PencilKit.PKStroke.#ctor(PencilKit.PKInk,PencilKit.PKStrokePath,CoreGraphics.CGAffineTransform,UIKit.UIBezierPath) M:PencilKit.PKStroke.Copy(Foundation.NSZone) -M:PencilKit.PKStrokePath.#ctor(PencilKit.PKStrokePoint[],Foundation.NSDate) M:PencilKit.PKStrokePath.Copy(Foundation.NSZone) -M:PencilKit.PKStrokePath.EnumerateInterpolatedPointsByDistanceStep(PencilKit.PKFloatRange,System.Runtime.InteropServices.NFloat,PencilKit.PKInterpolatedPointsEnumeratorHandler) -M:PencilKit.PKStrokePath.EnumerateInterpolatedPointsByParametricStep(PencilKit.PKFloatRange,System.Runtime.InteropServices.NFloat,PencilKit.PKInterpolatedPointsEnumeratorHandler) -M:PencilKit.PKStrokePath.EnumerateInterpolatedPointsByTimeStep(PencilKit.PKFloatRange,System.Double,PencilKit.PKInterpolatedPointsEnumeratorHandler) -M:PencilKit.PKStrokePath.GetInterpolatedLocation(System.Runtime.InteropServices.NFloat) -M:PencilKit.PKStrokePath.GetInterpolatedPoint(System.Runtime.InteropServices.NFloat) -M:PencilKit.PKStrokePath.GetObject(System.UIntPtr) -M:PencilKit.PKStrokePath.GetParametricValue(System.Runtime.InteropServices.NFloat,System.Double) -M:PencilKit.PKStrokePath.GetParametricValue(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKStrokePath.GetPoint(System.UIntPtr) -M:PencilKit.PKStrokePoint.#ctor(CoreGraphics.CGPoint,System.Double,CoreGraphics.CGSize,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKStrokePoint.#ctor(CoreGraphics.CGPoint,System.Double,CoreGraphics.CGSize,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:PencilKit.PKStrokePoint.Copy(Foundation.NSZone) M:PencilKit.PKTool.Copy(Foundation.NSZone) -M:PencilKit.PKToolPicker.#ctor -M:PencilKit.PKToolPicker.#ctor(PencilKit.PKToolPickerItem[]) -M:PencilKit.PKToolPicker.AddObserver(PencilKit.IPKToolPickerObserver) M:PencilKit.PKToolPicker.Dispose(System.Boolean) -M:PencilKit.PKToolPicker.GetFrameObscured(UIKit.UIView) -M:PencilKit.PKToolPicker.GetSharedToolPicker(UIKit.UIWindow) -M:PencilKit.PKToolPicker.RemoveObserver(PencilKit.IPKToolPickerObserver) -M:PencilKit.PKToolPicker.SetVisible(System.Boolean,UIKit.UIResponder) -M:PencilKit.PKToolPickerCustomItem.#ctor(PencilKit.PKToolPickerCustomItemConfiguration) -M:PencilKit.PKToolPickerCustomItem.ReloadImage -M:PencilKit.PKToolPickerCustomItemConfiguration.#ctor(System.String,System.String) M:PencilKit.PKToolPickerCustomItemConfiguration.Copy(Foundation.NSZone) -M:PencilKit.PKToolPickerEraserItem.#ctor(PencilKit.PKEraserType,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKToolPickerEraserItem.#ctor(PencilKit.PKEraserType) -M:PencilKit.PKToolPickerInkingItem.#ctor(PencilKit.PKInkType,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKToolPickerInkingItem.#ctor(PencilKit.PKInkType,UIKit.UIColor,System.Runtime.InteropServices.NFloat,System.String) -M:PencilKit.PKToolPickerInkingItem.#ctor(PencilKit.PKInkType,UIKit.UIColor,System.Runtime.InteropServices.NFloat) -M:PencilKit.PKToolPickerInkingItem.#ctor(PencilKit.PKInkType,UIKit.UIColor) -M:PencilKit.PKToolPickerInkingItem.#ctor(PencilKit.PKInkType) M:PencilKit.PKToolPickerItem.Copy(Foundation.NSZone) M:PencilKit.PKToolPickerObserver_Extensions.FramesObscuredDidChange(PencilKit.IPKToolPickerObserver,PencilKit.PKToolPicker) M:PencilKit.PKToolPickerObserver_Extensions.IsRulerActiveDidChange(PencilKit.IPKToolPickerObserver,PencilKit.PKToolPicker) @@ -46021,7 +42442,6 @@ M:Photos.PHPhotoLibrary.RegisterChangeObserver(System.Action{Photos.PHChange}) M:Photos.PHPhotoLibrary.RequestAuthorizationAsync M:Photos.PHPhotoLibrary.RequestAuthorizationAsync(Photos.PHAccessLevel) M:Photos.PHPhotoLibrary.UnregisterChangeObserver(System.Object) -M:Photos.PHPhotoLibraryChangeObserver.PhotoLibraryDidChange(Photos.PHChange) M:Photos.PHVideoRequestOptions.Copy(Foundation.NSZone) M:PhotosUI.IPHContentEditingController.CancelContentEditing M:PhotosUI.IPHContentEditingController.CanHandleAdjustmentData(Photos.PHAdjustmentData) @@ -46051,10 +42471,6 @@ M:PhotosUI.PHLivePhotoViewDelegate_Extensions.CanBeginPlayback(PhotosUI.IPHLiveP M:PhotosUI.PHLivePhotoViewDelegate_Extensions.DidEndPlayback(PhotosUI.IPHLivePhotoViewDelegate,PhotosUI.PHLivePhotoView,PhotosUI.PHLivePhotoViewPlaybackStyle) M:PhotosUI.PHLivePhotoViewDelegate_Extensions.GetExtraMinimumTouchDuration(PhotosUI.IPHLivePhotoViewDelegate,PhotosUI.PHLivePhotoView,UIKit.UITouch,PhotosUI.PHLivePhotoViewPlaybackStyle) M:PhotosUI.PHLivePhotoViewDelegate_Extensions.WillBeginPlayback(PhotosUI.IPHLivePhotoViewDelegate,PhotosUI.PHLivePhotoView,PhotosUI.PHLivePhotoViewPlaybackStyle) -M:PhotosUI.PHLivePhotoViewDelegate.CanBeginPlayback(PhotosUI.PHLivePhotoView,PhotosUI.PHLivePhotoViewPlaybackStyle) -M:PhotosUI.PHLivePhotoViewDelegate.DidEndPlayback(PhotosUI.PHLivePhotoView,PhotosUI.PHLivePhotoViewPlaybackStyle) -M:PhotosUI.PHLivePhotoViewDelegate.GetExtraMinimumTouchDuration(PhotosUI.PHLivePhotoView,UIKit.UITouch,PhotosUI.PHLivePhotoViewPlaybackStyle) -M:PhotosUI.PHLivePhotoViewDelegate.WillBeginPlayback(PhotosUI.PHLivePhotoView,PhotosUI.PHLivePhotoViewPlaybackStyle) M:PhotosUI.PHPhotoLibrary_PhotosUISupport.PresentLimitedLibraryPicker(Photos.PHPhotoLibrary,UIKit.UIViewController,System.Action{System.String[]}) M:PhotosUI.PHPhotoLibrary_PhotosUISupport.PresentLimitedLibraryPicker(Photos.PHPhotoLibrary,UIKit.UIViewController) M:PhotosUI.PHPhotoLibrary_PhotosUISupport.PresentLimitedLibraryPickerAsync(Photos.PHPhotoLibrary,UIKit.UIViewController) @@ -46063,7 +42479,6 @@ M:PhotosUI.PHPickerFilter.Copy(Foundation.NSZone) M:PhotosUI.PHPickerUpdateConfiguration.Copy(Foundation.NSZone) M:PhotosUI.PHPickerUpdateConfiguration.EncodeTo(Foundation.NSCoder) M:PhotosUI.PHPickerViewController.Dispose(System.Boolean) -M:PhotosUI.PHPickerViewControllerDelegate.DidFinishPicking(PhotosUI.PHPickerViewController,PhotosUI.PHPickerResult[]) M:PhotosUI.PHProjectAssetElement.EncodeTo(Foundation.NSCoder) M:PhotosUI.PHProjectElement.EncodeTo(Foundation.NSCoder) M:PhotosUI.PHProjectExtensionContext.Copy(Foundation.NSZone) @@ -46079,10 +42494,6 @@ M:PhotosUI.PHProjectSectionContent.EncodeTo(Foundation.NSCoder) M:PhotosUI.PHProjectTextElement.EncodeTo(Foundation.NSCoder) M:PhotosUI.PHProjectTypeDescription.EncodeTo(Foundation.NSCoder) M:PhotosUI.PHProjectTypeDescriptionDataSource_Extensions.WillDiscardDataSource(PhotosUI.IPHProjectTypeDescriptionDataSource) -M:PhotosUI.PHProjectTypeDescriptionDataSource.GetFooterTextForSubtypes(Foundation.NSString) -M:PhotosUI.PHProjectTypeDescriptionDataSource.GetSubtypes(Foundation.NSString) -M:PhotosUI.PHProjectTypeDescriptionDataSource.GetTypeDescription(Foundation.NSString) -M:PhotosUI.PHProjectTypeDescriptionDataSource.WillDiscardDataSource M:PrintCore.PMPageFormat.#ctor(PrintCore.PMPaper) M:PrintCore.PMPageFormat.TryCreate(PrintCore.PMPageFormat@,PrintCore.PMPaper) M:PrintCore.PMPaper.GetLocalizedName(PrintCore.PMPrinter) @@ -46124,16 +42535,10 @@ M:PushKit.IPKPushRegistryDelegate.DidInvalidatePushToken(PushKit.PKPushRegistry, M:PushKit.IPKPushRegistryDelegate.DidReceiveIncomingPush(PushKit.PKPushRegistry,PushKit.PKPushPayload,System.String,System.Action) M:PushKit.IPKPushRegistryDelegate.DidReceiveIncomingPush(PushKit.PKPushRegistry,PushKit.PKPushPayload,System.String) M:PushKit.IPKPushRegistryDelegate.DidUpdatePushCredentials(PushKit.PKPushRegistry,PushKit.PKPushCredentials,System.String) -M:PushKit.PKPushRegistry.#ctor(CoreFoundation.DispatchQueue) M:PushKit.PKPushRegistry.Dispose(System.Boolean) -M:PushKit.PKPushRegistry.PushToken(System.String) M:PushKit.PKPushRegistryDelegate_Extensions.DidInvalidatePushToken(PushKit.IPKPushRegistryDelegate,PushKit.PKPushRegistry,System.String) M:PushKit.PKPushRegistryDelegate_Extensions.DidReceiveIncomingPush(PushKit.IPKPushRegistryDelegate,PushKit.PKPushRegistry,PushKit.PKPushPayload,System.String,System.Action) M:PushKit.PKPushRegistryDelegate_Extensions.DidReceiveIncomingPush(PushKit.IPKPushRegistryDelegate,PushKit.PKPushRegistry,PushKit.PKPushPayload,System.String) -M:PushKit.PKPushRegistryDelegate.DidInvalidatePushToken(PushKit.PKPushRegistry,System.String) -M:PushKit.PKPushRegistryDelegate.DidReceiveIncomingPush(PushKit.PKPushRegistry,PushKit.PKPushPayload,System.String,System.Action) -M:PushKit.PKPushRegistryDelegate.DidReceiveIncomingPush(PushKit.PKPushRegistry,PushKit.PKPushPayload,System.String) -M:PushKit.PKPushRegistryDelegate.DidUpdatePushCredentials(PushKit.PKPushRegistry,PushKit.PKPushCredentials,System.String) M:PushToTalk.IPTChannelManagerDelegate.DidActivateAudioSession(PushToTalk.PTChannelManager,AVFoundation.AVAudioSession) M:PushToTalk.IPTChannelManagerDelegate.DidBeginTransmitting(PushToTalk.PTChannelManager,Foundation.NSUuid,PushToTalk.PTChannelTransmitRequestSource) M:PushToTalk.IPTChannelManagerDelegate.DidDeactivateAudioSession(PushToTalk.PTChannelManager,AVFoundation.AVAudioSession) @@ -46214,16 +42619,11 @@ M:QuickLook.QLPreviewController.add_DidDismiss(System.EventHandler) M:QuickLook.QLPreviewController.add_DidSaveEditedCopy(System.EventHandler{QuickLook.QLPreviewControllerDelegateDidSaveEventArgs}) M:QuickLook.QLPreviewController.add_DidUpdateContents(System.EventHandler{QuickLook.QLPreviewControllerDelegateDidUpdateEventArgs}) M:QuickLook.QLPreviewController.add_WillDismiss(System.EventHandler) -M:QuickLook.QLPreviewController.CanPreviewItem(QuickLook.IQLPreviewItem) M:QuickLook.QLPreviewController.Dispose(System.Boolean) -M:QuickLook.QLPreviewController.RefreshCurrentPreviewItem -M:QuickLook.QLPreviewController.ReloadData M:QuickLook.QLPreviewController.remove_DidDismiss(System.EventHandler) M:QuickLook.QLPreviewController.remove_DidSaveEditedCopy(System.EventHandler{QuickLook.QLPreviewControllerDelegateDidSaveEventArgs}) M:QuickLook.QLPreviewController.remove_DidUpdateContents(System.EventHandler{QuickLook.QLPreviewControllerDelegateDidUpdateEventArgs}) M:QuickLook.QLPreviewController.remove_WillDismiss(System.EventHandler) -M:QuickLook.QLPreviewControllerDataSource.GetPreviewItem(QuickLook.QLPreviewController,System.IntPtr) -M:QuickLook.QLPreviewControllerDataSource.PreviewItemCount(QuickLook.QLPreviewController) M:QuickLook.QLPreviewControllerDelegate_Extensions.DidDismiss(QuickLook.IQLPreviewControllerDelegate,QuickLook.QLPreviewController) M:QuickLook.QLPreviewControllerDelegate_Extensions.DidSaveEditedCopy(QuickLook.IQLPreviewControllerDelegate,QuickLook.QLPreviewController,QuickLook.IQLPreviewItem,Foundation.NSUrl) M:QuickLook.QLPreviewControllerDelegate_Extensions.DidUpdateContents(QuickLook.IQLPreviewControllerDelegate,QuickLook.QLPreviewController,QuickLook.IQLPreviewItem) @@ -46233,15 +42633,6 @@ M:QuickLook.QLPreviewControllerDelegate_Extensions.ShouldOpenUrl(QuickLook.IQLPr M:QuickLook.QLPreviewControllerDelegate_Extensions.TransitionImageForPreviewItem(QuickLook.IQLPreviewControllerDelegate,QuickLook.QLPreviewController,QuickLook.IQLPreviewItem,CoreGraphics.CGRect) M:QuickLook.QLPreviewControllerDelegate_Extensions.TransitionViewForPreviewItem(QuickLook.IQLPreviewControllerDelegate,QuickLook.QLPreviewController,QuickLook.IQLPreviewItem) M:QuickLook.QLPreviewControllerDelegate_Extensions.WillDismiss(QuickLook.IQLPreviewControllerDelegate,QuickLook.QLPreviewController) -M:QuickLook.QLPreviewControllerDelegate.DidDismiss(QuickLook.QLPreviewController) -M:QuickLook.QLPreviewControllerDelegate.DidSaveEditedCopy(QuickLook.QLPreviewController,QuickLook.IQLPreviewItem,Foundation.NSUrl) -M:QuickLook.QLPreviewControllerDelegate.DidUpdateContents(QuickLook.QLPreviewController,QuickLook.IQLPreviewItem) -M:QuickLook.QLPreviewControllerDelegate.FrameForPreviewItem(QuickLook.QLPreviewController,QuickLook.IQLPreviewItem,UIKit.UIView@) -M:QuickLook.QLPreviewControllerDelegate.GetEditingMode(QuickLook.QLPreviewController,QuickLook.IQLPreviewItem) -M:QuickLook.QLPreviewControllerDelegate.ShouldOpenUrl(QuickLook.QLPreviewController,Foundation.NSUrl,QuickLook.IQLPreviewItem) -M:QuickLook.QLPreviewControllerDelegate.TransitionImageForPreviewItem(QuickLook.QLPreviewController,QuickLook.IQLPreviewItem,CoreGraphics.CGRect) -M:QuickLook.QLPreviewControllerDelegate.TransitionViewForPreviewItem(QuickLook.QLPreviewController,QuickLook.IQLPreviewItem) -M:QuickLook.QLPreviewControllerDelegate.WillDismiss(QuickLook.QLPreviewController) M:QuickLook.QLPreviewControllerDelegateDidSaveEventArgs.#ctor(QuickLook.IQLPreviewItem,Foundation.NSUrl) M:QuickLook.QLPreviewControllerDelegateDidUpdateEventArgs.#ctor(QuickLook.IQLPreviewItem) M:QuickLook.QLPreviewingController_Extensions.PreparePreviewOfFile(QuickLook.IQLPreviewingController,Foundation.NSUrl,System.Action{Foundation.NSError}) @@ -46249,12 +42640,6 @@ M:QuickLook.QLPreviewingController_Extensions.PreparePreviewOfSearchableItem(Qui M:QuickLook.QLPreviewingController_Extensions.ProvidePreview(QuickLook.IQLPreviewingController,QuickLook.QLFilePreviewRequest,System.Action{QuickLook.QLPreviewReply,Foundation.NSError}) M:QuickLook.QLPreviewItem_Extensions.GetPreviewItemTitle(QuickLook.IQLPreviewItem) M:QuickLook.QLPreviewProvider.BeginRequestWithExtensionContext(Foundation.NSExtensionContext) -M:QuickLook.QLPreviewReply.#ctor(CoreGraphics.CGSize,QuickLook.QLPreviewReplyUIDocumentCreationHandler) -M:QuickLook.QLPreviewReply.#ctor(CoreGraphics.CGSize,System.Boolean,QuickLook.QLPreviewReplyDrawingHandler) -M:QuickLook.QLPreviewReply.#ctor(Foundation.NSUrl) -M:QuickLook.QLPreviewReply.#ctor(UniformTypeIdentifiers.UTType,CoreGraphics.CGSize,QuickLook.QLPreviewReplyDataCreationHandler) -M:QuickLook.QLPreviewReplyAttachment.#ctor(Foundation.NSData,UniformTypeIdentifiers.UTType) -M:QuickLook.QLPreviewSceneActivationConfiguration.#ctor(Foundation.NSUrl[],QuickLook.QLPreviewSceneOptions) M:QuickLook.QLPreviewSceneActivationConfiguration.#ctor(Foundation.NSUserActivity) M:QuickLook.QLThumbnailImage.Create(Foundation.NSUrl,CoreGraphics.CGSize,System.Single,System.Boolean) M:QuickLookThumbnailing.QLThumbnailGenerationRequest.#ctor(Foundation.NSUrl,CoreGraphics.CGSize,System.Runtime.InteropServices.NFloat,QuickLookThumbnailing.QLThumbnailGenerationRequestRepresentationTypes) @@ -46289,19 +42674,10 @@ M:QuickLookUI.QLPreviewItem_Extensions.GetPreviewItemDisplayState(QuickLookUI.IQ M:QuickLookUI.QLPreviewItem_Extensions.GetPreviewItemTitle(QuickLookUI.IQLPreviewItem) M:QuickLookUI.QLPreviewPanel.Dispose(System.Boolean) M:QuickLookUI.QLPreviewPanel.EnterFullScreenMode -M:QuickLookUI.QLPreviewPanel.EnterFullScreenMode(AppKit.NSScreen,Foundation.NSDictionary) M:QuickLookUI.QLPreviewPanel.ExitFullScreenModeWithOptions -M:QuickLookUI.QLPreviewPanel.ExitFullScreenModeWithOptions(Foundation.NSDictionary) -M:QuickLookUI.QLPreviewPanel.RefreshCurrentPreviewItem -M:QuickLookUI.QLPreviewPanel.ReloadData -M:QuickLookUI.QLPreviewPanel.SharedPreviewPanel -M:QuickLookUI.QLPreviewPanel.SharedPreviewPanelExists -M:QuickLookUI.QLPreviewPanel.UpdateController M:QuickLookUI.QLPreviewPanelController.AcceptsPreviewPanelControl(Foundation.NSObject,QuickLookUI.QLPreviewPanel) M:QuickLookUI.QLPreviewPanelController.BeginPreviewPanelControl(Foundation.NSObject,QuickLookUI.QLPreviewPanel) M:QuickLookUI.QLPreviewPanelController.EndPreviewPanelControl(Foundation.NSObject,QuickLookUI.QLPreviewPanel) -M:QuickLookUI.QLPreviewPanelDataSource.NumberOfPreviewItemsInPreviewPanel(QuickLookUI.QLPreviewPanel) -M:QuickLookUI.QLPreviewPanelDataSource.PreviewItemAtIndex(QuickLookUI.QLPreviewPanel,System.IntPtr) M:QuickLookUI.QLPreviewPanelDelegate_Extensions.HandleEvent(QuickLookUI.IQLPreviewPanelDelegate,QuickLookUI.QLPreviewPanel,AppKit.NSEvent) M:QuickLookUI.QLPreviewPanelDelegate_Extensions.SourceFrameOnScreenForPreviewItem(QuickLookUI.IQLPreviewPanelDelegate,QuickLookUI.QLPreviewPanel,QuickLookUI.IQLPreviewItem) M:QuickLookUI.QLPreviewPanelDelegate_Extensions.TransitionImageForPreviewItem(QuickLookUI.IQLPreviewPanelDelegate,QuickLookUI.QLPreviewPanel,QuickLookUI.IQLPreviewItem,CoreGraphics.CGRect) @@ -46331,14 +42707,11 @@ M:QuickLookUI.QLPreviewPanelDelegate.DidResize(Foundation.NSNotification) M:QuickLookUI.QLPreviewPanelDelegate.DidUpdate(Foundation.NSNotification) M:QuickLookUI.QLPreviewPanelDelegate.GetPreviewRepresentableActivityItems(AppKit.NSWindow) M:QuickLookUI.QLPreviewPanelDelegate.GetWindowForSharingRequest(AppKit.NSWindow) -M:QuickLookUI.QLPreviewPanelDelegate.HandleEvent(QuickLookUI.QLPreviewPanel,AppKit.NSEvent) M:QuickLookUI.QLPreviewPanelDelegate.ShouldDragDocumentWithEvent(AppKit.NSWindow,AppKit.NSEvent,CoreGraphics.CGPoint,AppKit.NSPasteboard) M:QuickLookUI.QLPreviewPanelDelegate.ShouldPopUpDocumentPathMenu(AppKit.NSWindow,AppKit.NSMenu) M:QuickLookUI.QLPreviewPanelDelegate.ShouldZoom(AppKit.NSWindow,CoreGraphics.CGRect) -M:QuickLookUI.QLPreviewPanelDelegate.SourceFrameOnScreenForPreviewItem(QuickLookUI.QLPreviewPanel,QuickLookUI.IQLPreviewItem) M:QuickLookUI.QLPreviewPanelDelegate.StartCustomAnimationToEnterFullScreen(AppKit.NSWindow,System.Double) M:QuickLookUI.QLPreviewPanelDelegate.StartCustomAnimationToExitFullScreen(AppKit.NSWindow,System.Double) -M:QuickLookUI.QLPreviewPanelDelegate.TransitionImageForPreviewItem(QuickLookUI.QLPreviewPanel,QuickLookUI.IQLPreviewItem,CoreGraphics.CGRect) M:QuickLookUI.QLPreviewPanelDelegate.WillBeginSheet(Foundation.NSNotification) M:QuickLookUI.QLPreviewPanelDelegate.WillClose(Foundation.NSNotification) M:QuickLookUI.QLPreviewPanelDelegate.WillEncodeRestorableState(AppKit.NSWindow,Foundation.NSCoder) @@ -46359,15 +42732,6 @@ M:QuickLookUI.QLPreviewPanelDelegate.WillUseFullScreenPresentationOptions(AppKit M:QuickLookUI.QLPreviewPanelDelegate.WillUseStandardFrame(AppKit.NSWindow,CoreGraphics.CGRect) M:QuickLookUI.QLPreviewPanelDelegate.WindowShouldClose(Foundation.NSObject) M:QuickLookUI.QLPreviewProvider.BeginRequestWithExtensionContext(Foundation.NSExtensionContext) -M:QuickLookUI.QLPreviewReply.#ctor(CoreGraphics.CGSize,QuickLookUI.QLPreviewReplyUIDocumentCreationHandler) -M:QuickLookUI.QLPreviewReply.#ctor(CoreGraphics.CGSize,System.Boolean,QuickLookUI.QLPreviewReplyDrawingHandler) -M:QuickLookUI.QLPreviewReply.#ctor(Foundation.NSUrl) -M:QuickLookUI.QLPreviewReply.#ctor(UniformTypeIdentifiers.UTType,CoreGraphics.CGSize,QuickLookUI.QLPreviewReplyDataCreationHandler) -M:QuickLookUI.QLPreviewReplyAttachment.#ctor(Foundation.NSData,UniformTypeIdentifiers.UTType) -M:QuickLookUI.QLPreviewView.#ctor(CoreGraphics.CGRect,QuickLookUI.QLPreviewViewStyle) -M:QuickLookUI.QLPreviewView.#ctor(CoreGraphics.CGRect) -M:QuickLookUI.QLPreviewView.Close -M:QuickLookUI.QLPreviewView.RefreshPreviewItem M:ReplayKit.IRPBroadcastActivityControllerDelegate.DidFinish(ReplayKit.RPBroadcastActivityController,ReplayKit.RPBroadcastController,Foundation.NSError) M:ReplayKit.IRPBroadcastActivityViewControllerDelegate.DidFinish(ReplayKit.RPBroadcastActivityViewController,ReplayKit.RPBroadcastController,Foundation.NSError) M:ReplayKit.IRPBroadcastControllerDelegate.DidFinish(ReplayKit.RPBroadcastController,Foundation.NSError) @@ -46382,73 +42746,36 @@ M:ReplayKit.NSExtensionContext_RPBroadcastExtension.CompleteRequest(Foundation.N M:ReplayKit.NSExtensionContext_RPBroadcastExtension.CompleteRequest(Foundation.NSExtensionContext,Foundation.NSUrl,ReplayKit.RPBroadcastConfiguration,Foundation.NSDictionary{Foundation.NSString,Foundation.INSCoding}) M:ReplayKit.NSExtensionContext_RPBroadcastExtension.LoadBroadcastingApplicationInfo(Foundation.NSExtensionContext,ReplayKit.LoadBroadcastingHandler) M:ReplayKit.RPBroadcastActivityController.Dispose(System.Boolean) -M:ReplayKit.RPBroadcastActivityController.ShowBroadcastPicker(CoreGraphics.CGPoint,AppKit.NSWindow,System.String,System.Action{ReplayKit.RPBroadcastActivityController,Foundation.NSError}) -M:ReplayKit.RPBroadcastActivityControllerDelegate.DidFinish(ReplayKit.RPBroadcastActivityController,ReplayKit.RPBroadcastController,Foundation.NSError) M:ReplayKit.RPBroadcastActivityViewController.#ctor(System.String,Foundation.NSBundle) M:ReplayKit.RPBroadcastActivityViewController.Dispose(System.Boolean) -M:ReplayKit.RPBroadcastActivityViewController.LoadBroadcastActivityViewController(System.Action{ReplayKit.RPBroadcastActivityViewController,Foundation.NSError}) -M:ReplayKit.RPBroadcastActivityViewController.LoadBroadcastActivityViewController(System.String,System.Action{ReplayKit.RPBroadcastActivityViewController,Foundation.NSError}) M:ReplayKit.RPBroadcastActivityViewController.LoadBroadcastActivityViewControllerAsync M:ReplayKit.RPBroadcastActivityViewController.LoadBroadcastActivityViewControllerAsync(System.String) -M:ReplayKit.RPBroadcastActivityViewControllerDelegate.DidFinish(ReplayKit.RPBroadcastActivityViewController,ReplayKit.RPBroadcastController,Foundation.NSError) M:ReplayKit.RPBroadcastConfiguration.EncodeTo(Foundation.NSCoder) M:ReplayKit.RPBroadcastController.Dispose(System.Boolean) -M:ReplayKit.RPBroadcastController.FinishBroadcast(System.Action{Foundation.NSError}) M:ReplayKit.RPBroadcastController.FinishBroadcastAsync -M:ReplayKit.RPBroadcastController.PauseBroadcast -M:ReplayKit.RPBroadcastController.ResumeBroadcast -M:ReplayKit.RPBroadcastController.StartBroadcast(System.Action{Foundation.NSError}) M:ReplayKit.RPBroadcastController.StartBroadcastAsync M:ReplayKit.RPBroadcastControllerDelegate_Extensions.DidFinish(ReplayKit.IRPBroadcastControllerDelegate,ReplayKit.RPBroadcastController,Foundation.NSError) M:ReplayKit.RPBroadcastControllerDelegate_Extensions.DidUpdateBroadcastUrl(ReplayKit.IRPBroadcastControllerDelegate,ReplayKit.RPBroadcastController,Foundation.NSUrl) M:ReplayKit.RPBroadcastControllerDelegate_Extensions.DidUpdateServiceInfo(ReplayKit.IRPBroadcastControllerDelegate,ReplayKit.RPBroadcastController,Foundation.NSDictionary{Foundation.NSString,Foundation.INSCoding}) -M:ReplayKit.RPBroadcastControllerDelegate.DidFinish(ReplayKit.RPBroadcastController,Foundation.NSError) -M:ReplayKit.RPBroadcastControllerDelegate.DidUpdateBroadcastUrl(ReplayKit.RPBroadcastController,Foundation.NSUrl) -M:ReplayKit.RPBroadcastControllerDelegate.DidUpdateServiceInfo(ReplayKit.RPBroadcastController,Foundation.NSDictionary{Foundation.NSString,Foundation.INSCoding}) M:ReplayKit.RPBroadcastHandler.BeginRequestWithExtensionContext(Foundation.NSExtensionContext) -M:ReplayKit.RPBroadcastHandler.UpdateServiceInfo(Foundation.NSDictionary{Foundation.NSString,Foundation.INSCoding}) -M:ReplayKit.RPBroadcastMP4ClipHandler.FinishedProcessingMP4Clip(ReplayKit.RPBroadcastConfiguration,Foundation.NSError) -M:ReplayKit.RPBroadcastMP4ClipHandler.ProcessMP4Clip(Foundation.NSUrl,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.Boolean) -M:ReplayKit.RPBroadcastSampleHandler.BroadcastAnnotated(Foundation.NSDictionary) -M:ReplayKit.RPBroadcastSampleHandler.BroadcastFinished -M:ReplayKit.RPBroadcastSampleHandler.BroadcastPaused -M:ReplayKit.RPBroadcastSampleHandler.BroadcastResumed -M:ReplayKit.RPBroadcastSampleHandler.BroadcastStarted(Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:ReplayKit.RPBroadcastSampleHandler.FinishBroadcast(Foundation.NSError) -M:ReplayKit.RPBroadcastSampleHandler.ProcessSampleBuffer(CoreMedia.CMSampleBuffer,ReplayKit.RPSampleBufferType) M:ReplayKit.RPPreviewViewController.#ctor(System.String,Foundation.NSBundle) M:ReplayKit.RPPreviewViewController.Dispose(System.Boolean) M:ReplayKit.RPPreviewViewControllerDelegate_Extensions.DidFinish(ReplayKit.IRPPreviewViewControllerDelegate,ReplayKit.RPPreviewViewController,Foundation.NSSet{Foundation.NSString}) M:ReplayKit.RPPreviewViewControllerDelegate_Extensions.DidFinish(ReplayKit.IRPPreviewViewControllerDelegate,ReplayKit.RPPreviewViewController) -M:ReplayKit.RPPreviewViewControllerDelegate.DidFinish(ReplayKit.RPPreviewViewController,Foundation.NSSet{Foundation.NSString}) -M:ReplayKit.RPPreviewViewControllerDelegate.DidFinish(ReplayKit.RPPreviewViewController) -M:ReplayKit.RPScreenRecorder.DiscardRecording(System.Action) M:ReplayKit.RPScreenRecorder.DiscardRecordingAsync M:ReplayKit.RPScreenRecorder.Dispose(System.Boolean) -M:ReplayKit.RPScreenRecorder.ExportClip(Foundation.NSUrl,System.Double,System.Action{Foundation.NSError}) M:ReplayKit.RPScreenRecorder.ExportClipAsync(Foundation.NSUrl,System.Double) -M:ReplayKit.RPScreenRecorder.StartCapture(System.Action{CoreMedia.CMSampleBuffer,ReplayKit.RPSampleBufferType,Foundation.NSError},System.Action{Foundation.NSError}) M:ReplayKit.RPScreenRecorder.StartCaptureAsync(System.Action{CoreMedia.CMSampleBuffer,ReplayKit.RPSampleBufferType,Foundation.NSError}) -M:ReplayKit.RPScreenRecorder.StartClipBuffering(System.Action{Foundation.NSError}) M:ReplayKit.RPScreenRecorder.StartClipBufferingAsync -M:ReplayKit.RPScreenRecorder.StartRecording(System.Action{Foundation.NSError}) -M:ReplayKit.RPScreenRecorder.StartRecording(System.Boolean,System.Action{Foundation.NSError}) M:ReplayKit.RPScreenRecorder.StartRecordingAsync M:ReplayKit.RPScreenRecorder.StartRecordingAsync(System.Boolean) -M:ReplayKit.RPScreenRecorder.StopCapture(System.Action{Foundation.NSError}) M:ReplayKit.RPScreenRecorder.StopCaptureAsync -M:ReplayKit.RPScreenRecorder.StopClipBuffering(System.Action{Foundation.NSError}) M:ReplayKit.RPScreenRecorder.StopClipBufferingAsync -M:ReplayKit.RPScreenRecorder.StopRecording(Foundation.NSUrl,System.Action{Foundation.NSError}) -M:ReplayKit.RPScreenRecorder.StopRecording(System.Action{ReplayKit.RPPreviewViewController,Foundation.NSError}) M:ReplayKit.RPScreenRecorder.StopRecordingAsync M:ReplayKit.RPScreenRecorder.StopRecordingAsync(Foundation.NSUrl) M:ReplayKit.RPScreenRecorderDelegate_Extensions.DidChangeAvailability(ReplayKit.IRPScreenRecorderDelegate,ReplayKit.RPScreenRecorder) M:ReplayKit.RPScreenRecorderDelegate_Extensions.DidStopRecording(ReplayKit.IRPScreenRecorderDelegate,ReplayKit.RPScreenRecorder,Foundation.NSError,ReplayKit.RPPreviewViewController) M:ReplayKit.RPScreenRecorderDelegate_Extensions.DidStopRecording(ReplayKit.IRPScreenRecorderDelegate,ReplayKit.RPScreenRecorder,ReplayKit.RPPreviewViewController,Foundation.NSError) -M:ReplayKit.RPScreenRecorderDelegate.DidChangeAvailability(ReplayKit.RPScreenRecorder) -M:ReplayKit.RPScreenRecorderDelegate.DidStopRecording(ReplayKit.RPScreenRecorder,Foundation.NSError,ReplayKit.RPPreviewViewController) -M:ReplayKit.RPScreenRecorderDelegate.DidStopRecording(ReplayKit.RPScreenRecorder,ReplayKit.RPPreviewViewController,Foundation.NSError) M:ReplayKit.RPSystemBroadcastPickerView.#ctor(CoreGraphics.CGRect) M:ReplayKit.RPSystemBroadcastPickerView.EncodeTo(Foundation.NSCoder) M:ReplayKit.RPSystemBroadcastPickerView.RPSystemBroadcastPickerViewAppearance.#ctor(System.IntPtr) @@ -46596,15 +42923,11 @@ M:SafariServices.SSReadingList.SupportsUrl(Foundation.NSUrl) M:SafetyKit.ISACrashDetectionDelegate.DidDetectEvent(SafetyKit.SACrashDetectionManager,SafetyKit.SACrashDetectionEvent) M:SafetyKit.ISAEmergencyResponseDelegate.DidUpdateVoiceCallStatus(SafetyKit.SAEmergencyResponseManager,SafetyKit.SAEmergencyResponseManagerVoiceCallStatus) M:SafetyKit.SACrashDetectionDelegate_Extensions.DidDetectEvent(SafetyKit.ISACrashDetectionDelegate,SafetyKit.SACrashDetectionManager,SafetyKit.SACrashDetectionEvent) -M:SafetyKit.SACrashDetectionDelegate.DidDetectEvent(SafetyKit.SACrashDetectionManager,SafetyKit.SACrashDetectionEvent) M:SafetyKit.SACrashDetectionEvent.Copy(Foundation.NSZone) M:SafetyKit.SACrashDetectionEvent.EncodeTo(Foundation.NSCoder) M:SafetyKit.SACrashDetectionManager.Dispose(System.Boolean) -M:SafetyKit.SACrashDetectionManager.RequestAuthorization(SafetyKit.SACrashDetectionManagerRequestAuthorizationCompletionHandler) M:SafetyKit.SACrashDetectionManager.RequestAuthorizationAsync M:SafetyKit.SAEmergencyResponseDelegate_Extensions.DidUpdateVoiceCallStatus(SafetyKit.ISAEmergencyResponseDelegate,SafetyKit.SAEmergencyResponseManager,SafetyKit.SAEmergencyResponseManagerVoiceCallStatus) -M:SafetyKit.SAEmergencyResponseDelegate.DidUpdateVoiceCallStatus(SafetyKit.SAEmergencyResponseManager,SafetyKit.SAEmergencyResponseManagerVoiceCallStatus) -M:SafetyKit.SAEmergencyResponseManager.DialVoiceCall(System.String,SafetyKit.SAEmergencyResponseManagerDialVoiceCallCompletionHandler) M:SafetyKit.SAEmergencyResponseManager.DialVoiceCallAsync(System.String) M:SafetyKit.SAEmergencyResponseManager.Dispose(System.Boolean) M:SceneKit.ISCNActionable.GetAction(System.String) @@ -46666,115 +42989,25 @@ M:SceneKit.ISCNShadable.HandleBinding(System.String,SceneKit.SCNBindingHandler) M:SceneKit.ISCNShadable.HandleUnbinding(System.String,SceneKit.SCNBindingHandler) M:SceneKit.SCNAction.Copy(Foundation.NSZone) M:SceneKit.SCNAction.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNActionable.GetAction(System.String) -M:SceneKit.SCNActionable.HasActions -M:SceneKit.SCNActionable.RemoveAction(System.String) -M:SceneKit.SCNActionable.RemoveAllActions -M:SceneKit.SCNActionable.RunAction(SceneKit.SCNAction,System.Action) -M:SceneKit.SCNActionable.RunAction(SceneKit.SCNAction,System.String,System.Action) -M:SceneKit.SCNActionable.RunAction(SceneKit.SCNAction,System.String) -M:SceneKit.SCNActionable.RunAction(SceneKit.SCNAction) M:SceneKit.SCNAnimatable.AddAnimation(CoreAnimation.CAAnimation,System.String) -M:SceneKit.SCNAnimatable.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNAnimatable.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) -M:SceneKit.SCNAnimatable.GetAnimation(Foundation.NSString) -M:SceneKit.SCNAnimatable.GetAnimationKeys -M:SceneKit.SCNAnimatable.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNAnimatable.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNAnimatable.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNAnimatable.RemoveAllAnimations -M:SceneKit.SCNAnimatable.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNAnimatable.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNAnimatable.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNAnimatable.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNAnimatable.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNAnimatable.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNAnimation.Copy(Foundation.NSZone) M:SceneKit.SCNAnimation.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNAnimationPlayer.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNAnimationPlayer.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNAnimationPlayer.Copy(Foundation.NSZone) M:SceneKit.SCNAnimationPlayer.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNAnimationPlayer.GetAnimation(Foundation.NSString) -M:SceneKit.SCNAnimationPlayer.GetAnimationKeys -M:SceneKit.SCNAnimationPlayer.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNAnimationPlayer.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNAnimationPlayer.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNAnimationPlayer.RemoveAllAnimations -M:SceneKit.SCNAnimationPlayer.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNAnimationPlayer.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNAnimationPlayer.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNAnimationPlayer.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNAnimationPlayer.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNAnimationPlayer.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNAudioSource.Copy(Foundation.NSZone) M:SceneKit.SCNAudioSource.EncodeTo(Foundation.NSCoder) M:SceneKit.SCNAvoidOccluderConstraint.Dispose(System.Boolean) M:SceneKit.SCNAvoidOccluderConstraintDelegate_Extensions.DidAvoidOccluder(SceneKit.ISCNAvoidOccluderConstraintDelegate,SceneKit.SCNAvoidOccluderConstraint,SceneKit.SCNNode,SceneKit.SCNNode) M:SceneKit.SCNAvoidOccluderConstraintDelegate_Extensions.ShouldAvoidOccluder(SceneKit.ISCNAvoidOccluderConstraintDelegate,SceneKit.SCNAvoidOccluderConstraint,SceneKit.SCNNode,SceneKit.SCNNode) -M:SceneKit.SCNAvoidOccluderConstraintDelegate.DidAvoidOccluder(SceneKit.SCNAvoidOccluderConstraint,SceneKit.SCNNode,SceneKit.SCNNode) -M:SceneKit.SCNAvoidOccluderConstraintDelegate.ShouldAvoidOccluder(SceneKit.SCNAvoidOccluderConstraint,SceneKit.SCNNode,SceneKit.SCNNode) -M:SceneKit.SCNBoundingVolume.GetBoundingBox(SceneKit.SCNVector3@,SceneKit.SCNVector3@) -M:SceneKit.SCNBoundingVolume.GetBoundingSphere(SceneKit.SCNVector3@,System.Runtime.InteropServices.NFloat@) -M:SceneKit.SCNBoundingVolume.SetBoundingBox(SceneKit.SCNVector3@,SceneKit.SCNVector3@) -M:SceneKit.SCNCamera.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNCamera.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNCamera.Copy(Foundation.NSZone) M:SceneKit.SCNCamera.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNCamera.GetAnimation(Foundation.NSString) -M:SceneKit.SCNCamera.GetAnimationKeys -M:SceneKit.SCNCamera.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNCamera.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNCamera.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNCamera.RemoveAllAnimations -M:SceneKit.SCNCamera.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNCamera.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNCamera.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNCamera.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNCamera.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNCamera.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNCameraController.Dispose(System.Boolean) M:SceneKit.SCNCameraControllerDelegate_Extensions.CameraInertiaDidEnd(SceneKit.ISCNCameraControllerDelegate,SceneKit.SCNCameraController) M:SceneKit.SCNCameraControllerDelegate_Extensions.CameraInertiaWillStart(SceneKit.ISCNCameraControllerDelegate,SceneKit.SCNCameraController) -M:SceneKit.SCNCameraControllerDelegate.CameraInertiaDidEnd(SceneKit.SCNCameraController) -M:SceneKit.SCNCameraControllerDelegate.CameraInertiaWillStart(SceneKit.SCNCameraController) -M:SceneKit.SCNConstraint.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNConstraint.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNConstraint.Copy(Foundation.NSZone) M:SceneKit.SCNConstraint.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNConstraint.GetAnimation(Foundation.NSString) -M:SceneKit.SCNConstraint.GetAnimationKeys -M:SceneKit.SCNConstraint.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNConstraint.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNConstraint.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNConstraint.RemoveAllAnimations -M:SceneKit.SCNConstraint.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNConstraint.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNConstraint.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNConstraint.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNConstraint.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNConstraint.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) -M:SceneKit.SCNGeometry.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNGeometry.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNGeometry.Copy(Foundation.NSZone) M:SceneKit.SCNGeometry.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNGeometry.GetAnimation(Foundation.NSString) -M:SceneKit.SCNGeometry.GetAnimationKeys -M:SceneKit.SCNGeometry.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNGeometry.GetBoundingBox(SceneKit.SCNVector3@,SceneKit.SCNVector3@) -M:SceneKit.SCNGeometry.GetBoundingSphere(SceneKit.SCNVector3@,System.Runtime.InteropServices.NFloat@) -M:SceneKit.SCNGeometry.HandleBinding(System.String,SceneKit.SCNBindingHandler) -M:SceneKit.SCNGeometry.HandleUnbinding(System.String,SceneKit.SCNBindingHandler) -M:SceneKit.SCNGeometry.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNGeometry.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNGeometry.RemoveAllAnimations -M:SceneKit.SCNGeometry.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNGeometry.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNGeometry.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNGeometry.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNGeometry.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNGeometry.SetBoundingBox(SceneKit.SCNVector3@,SceneKit.SCNVector3@) -M:SceneKit.SCNGeometry.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNGeometryElement.EncodeTo(Foundation.NSCoder) M:SceneKit.SCNGeometrySource.EncodeTo(Foundation.NSCoder) M:SceneKit.SCNGeometrySource.FromData(Foundation.NSData,SceneKit.SCNGeometrySourceSemantics,System.IntPtr,System.Boolean,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr) @@ -46788,162 +43021,54 @@ M:SceneKit.SCNHitTestOptions.#ctor M:SceneKit.SCNHitTestOptions.#ctor(Foundation.NSDictionary) M:SceneKit.SCNJavaScript.ExportModule(JavaScriptCore.JSContext) M:SceneKit.SCNLayer.Dispose(System.Boolean) -M:SceneKit.SCNLayer.GetNodesInsideFrustum(SceneKit.SCNNode) M:SceneKit.SCNLayer.HitTest(CoreGraphics.CGPoint,SceneKit.SCNHitTestOptions) -M:SceneKit.SCNLayer.IsNodeInsideFrustum(SceneKit.SCNNode,SceneKit.SCNNode) -M:SceneKit.SCNLayer.Prepare(Foundation.NSObject,System.Func{System.Boolean}) -M:SceneKit.SCNLayer.Prepare(Foundation.NSObject[],System.Action{System.Boolean}) M:SceneKit.SCNLayer.PrepareAsync(Foundation.NSObject[]) -M:SceneKit.SCNLayer.PresentScene(SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode,System.Action) M:SceneKit.SCNLayer.PresentSceneAsync(SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode) -M:SceneKit.SCNLayer.ProjectPoint(SceneKit.SCNVector3) -M:SceneKit.SCNLayer.UnprojectPoint(SceneKit.SCNVector3) M:SceneKit.SCNLevelOfDetail.Copy(Foundation.NSZone) M:SceneKit.SCNLevelOfDetail.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNLight.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNLight.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNLight.Copy(Foundation.NSZone) M:SceneKit.SCNLight.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNLight.GetAnimation(Foundation.NSString) -M:SceneKit.SCNLight.GetAnimationKeys -M:SceneKit.SCNLight.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNLight.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNLight.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNLight.RemoveAllAnimations -M:SceneKit.SCNLight.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNLight.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNLight.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNLight.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNLight.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNLight.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) -M:SceneKit.SCNMaterial.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNMaterial.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNMaterial.Copy(Foundation.NSZone) M:SceneKit.SCNMaterial.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNMaterial.GetAnimation(Foundation.NSString) -M:SceneKit.SCNMaterial.GetAnimationKeys -M:SceneKit.SCNMaterial.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNMaterial.HandleBinding(System.String,SceneKit.SCNBindingHandler) -M:SceneKit.SCNMaterial.HandleUnbinding(System.String,SceneKit.SCNBindingHandler) -M:SceneKit.SCNMaterial.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNMaterial.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNMaterial.RemoveAllAnimations -M:SceneKit.SCNMaterial.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMaterial.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMaterial.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNMaterial.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMaterial.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNMaterial.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) -M:SceneKit.SCNMaterialProperty.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNMaterialProperty.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNMaterialProperty.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNMaterialProperty.GetAnimation(Foundation.NSString) -M:SceneKit.SCNMaterialProperty.GetAnimationKeys -M:SceneKit.SCNMaterialProperty.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNMaterialProperty.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNMaterialProperty.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNMaterialProperty.RemoveAllAnimations -M:SceneKit.SCNMaterialProperty.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMaterialProperty.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMaterialProperty.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNMaterialProperty.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMaterialProperty.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNMaterialProperty.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNMatrix4.#ctor(CoreAnimation.CATransform3D) M:SceneKit.SCNMatrix4.CreateFromAxisAngle(CoreGraphics.NVector3d,System.Double,SceneKit.SCNMatrix4@) M:SceneKit.SCNMatrix4.CreateFromAxisAngle(System.Numerics.Vector3,System.Single,SceneKit.SCNMatrix4@) M:SceneKit.SCNMatrix4.CreateFromColumns(SceneKit.SCNVector4,SceneKit.SCNVector4,SceneKit.SCNVector4,SceneKit.SCNVector4,SceneKit.SCNMatrix4@) M:SceneKit.SCNMatrix4.CreateFromColumns(SceneKit.SCNVector4,SceneKit.SCNVector4,SceneKit.SCNVector4,SceneKit.SCNVector4) -M:SceneKit.SCNMorpher.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNMorpher.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNMorpher.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNMorpher.GetAnimation(Foundation.NSString) -M:SceneKit.SCNMorpher.GetAnimationKeys -M:SceneKit.SCNMorpher.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNMorpher.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNMorpher.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNMorpher.RemoveAllAnimations -M:SceneKit.SCNMorpher.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMorpher.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMorpher.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNMorpher.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNMorpher.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNMorpher.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNNode.Add(SceneKit.SCNNode) M:SceneKit.SCNNode.AddAnimation(CoreAnimation.CAAnimation,System.String) -M:SceneKit.SCNNode.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNNode.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNNode.AddNodes(SceneKit.SCNNode[]) M:SceneKit.SCNNode.Copy(Foundation.NSZone) M:SceneKit.SCNNode.DidHintFocusMovement(UIKit.UIFocusMovementHint) M:SceneKit.SCNNode.DidUpdateFocus(UIKit.UIFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) M:SceneKit.SCNNode.Dispose(System.Boolean) M:SceneKit.SCNNode.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNNode.GetAction(System.String) -M:SceneKit.SCNNode.GetAnimation(Foundation.NSString) M:SceneKit.SCNNode.GetAnimation(System.String) -M:SceneKit.SCNNode.GetAnimationKeys -M:SceneKit.SCNNode.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNNode.GetBoundingBox(SceneKit.SCNVector3@,SceneKit.SCNVector3@) -M:SceneKit.SCNNode.GetBoundingSphere(SceneKit.SCNVector3@,System.Runtime.InteropServices.NFloat@) M:SceneKit.SCNNode.GetEnumerator M:SceneKit.SCNNode.GetSoundIdentifier(UIKit.UIFocusUpdateContext) -M:SceneKit.SCNNode.HasActions M:SceneKit.SCNNode.HitTest(SceneKit.SCNVector3,SceneKit.SCNVector3,SceneKit.SCNHitTestOptions) -M:SceneKit.SCNNode.IsAnimationPaused(Foundation.NSString) M:SceneKit.SCNNode.IsAnimationPaused(System.String) -M:SceneKit.SCNNode.PauseAnimation(Foundation.NSString) M:SceneKit.SCNNode.PauseAnimation(System.String) -M:SceneKit.SCNNode.RemoveAction(System.String) -M:SceneKit.SCNNode.RemoveAllActions -M:SceneKit.SCNNode.RemoveAllAnimations -M:SceneKit.SCNNode.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNNode.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNNode.RemoveAnimation(Foundation.NSString) M:SceneKit.SCNNode.RemoveAnimation(System.String,System.Runtime.InteropServices.NFloat) M:SceneKit.SCNNode.RemoveAnimation(System.String) -M:SceneKit.SCNNode.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNNode.ResumeAnimation(Foundation.NSString) M:SceneKit.SCNNode.ResumeAnimation(System.String) -M:SceneKit.SCNNode.RunAction(SceneKit.SCNAction,System.Action) -M:SceneKit.SCNNode.RunAction(SceneKit.SCNAction,System.String,System.Action) -M:SceneKit.SCNNode.RunAction(SceneKit.SCNAction,System.String) -M:SceneKit.SCNNode.RunAction(SceneKit.SCNAction) -M:SceneKit.SCNNode.SetBoundingBox(SceneKit.SCNVector3@,SceneKit.SCNVector3@) M:SceneKit.SCNNode.SetNeedsFocusUpdate -M:SceneKit.SCNNode.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNNode.ShouldUpdateFocus(UIKit.UIFocusUpdateContext) M:SceneKit.SCNNode.UpdateFocusIfNeeded M:SceneKit.SCNNodeRendererDelegate_Extensions.Render(SceneKit.ISCNNodeRendererDelegate,SceneKit.SCNNode,SceneKit.SCNRenderer,Foundation.NSDictionary) -M:SceneKit.SCNNodeRendererDelegate.Render(SceneKit.SCNNode,SceneKit.SCNRenderer,Foundation.NSDictionary) M:SceneKit.SCNParticlePropertyController.Copy(Foundation.NSZone) M:SceneKit.SCNParticlePropertyController.Dispose(System.Boolean) M:SceneKit.SCNParticlePropertyController.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNParticleSystem.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNParticleSystem.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNParticleSystem.Copy(Foundation.NSZone) M:SceneKit.SCNParticleSystem.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNParticleSystem.GetAnimation(Foundation.NSString) -M:SceneKit.SCNParticleSystem.GetAnimationKeys -M:SceneKit.SCNParticleSystem.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNParticleSystem.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNParticleSystem.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNParticleSystem.RemoveAllAnimations -M:SceneKit.SCNParticleSystem.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNParticleSystem.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNParticleSystem.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNParticleSystem.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNParticleSystem.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNParticleSystem.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNPhysicsBehavior.EncodeTo(Foundation.NSCoder) M:SceneKit.SCNPhysicsBody.Copy(Foundation.NSZone) M:SceneKit.SCNPhysicsBody.EncodeTo(Foundation.NSCoder) M:SceneKit.SCNPhysicsContactDelegate_Extensions.DidBeginContact(SceneKit.ISCNPhysicsContactDelegate,SceneKit.SCNPhysicsWorld,SceneKit.SCNPhysicsContact) M:SceneKit.SCNPhysicsContactDelegate_Extensions.DidEndContact(SceneKit.ISCNPhysicsContactDelegate,SceneKit.SCNPhysicsWorld,SceneKit.SCNPhysicsContact) M:SceneKit.SCNPhysicsContactDelegate_Extensions.DidUpdateContact(SceneKit.ISCNPhysicsContactDelegate,SceneKit.SCNPhysicsWorld,SceneKit.SCNPhysicsContact) -M:SceneKit.SCNPhysicsContactDelegate.DidBeginContact(SceneKit.SCNPhysicsWorld,SceneKit.SCNPhysicsContact) -M:SceneKit.SCNPhysicsContactDelegate.DidEndContact(SceneKit.SCNPhysicsWorld,SceneKit.SCNPhysicsContact) -M:SceneKit.SCNPhysicsContactDelegate.DidUpdateContact(SceneKit.SCNPhysicsWorld,SceneKit.SCNPhysicsContact) M:SceneKit.SCNPhysicsContactEventArgs.#ctor(SceneKit.SCNPhysicsContact) M:SceneKit.SCNPhysicsField.Copy(Foundation.NSZone) M:SceneKit.SCNPhysicsField.EncodeTo(Foundation.NSCoder) @@ -46980,10 +43105,6 @@ M:SceneKit.SCNProgramDelegate_Extensions.BindValue(SceneKit.ISCNProgramDelegate, M:SceneKit.SCNProgramDelegate_Extensions.HandleError(SceneKit.ISCNProgramDelegate,SceneKit.SCNProgram,Foundation.NSError) M:SceneKit.SCNProgramDelegate_Extensions.IsProgramOpaque(SceneKit.ISCNProgramDelegate,SceneKit.SCNProgram) M:SceneKit.SCNProgramDelegate_Extensions.UnbindValue(SceneKit.ISCNProgramDelegate,SceneKit.SCNProgram,System.String,System.UInt32,System.UInt32,SceneKit.SCNRenderer) -M:SceneKit.SCNProgramDelegate.BindValue(SceneKit.SCNProgram,System.String,System.UInt32,System.UInt32,SceneKit.SCNRenderer) -M:SceneKit.SCNProgramDelegate.HandleError(SceneKit.SCNProgram,Foundation.NSError) -M:SceneKit.SCNProgramDelegate.IsProgramOpaque(SceneKit.SCNProgram) -M:SceneKit.SCNProgramDelegate.UnbindValue(SceneKit.SCNProgram,System.String,System.UInt32,System.UInt32,SceneKit.SCNRenderer) M:SceneKit.SCNProgramSemanticOptions.#ctor M:SceneKit.SCNProgramSemanticOptions.#ctor(Foundation.NSDictionary) M:SceneKit.SCNPropertyControllers.#ctor @@ -46993,16 +43114,9 @@ M:SceneKit.SCNReferenceNode.EncodeTo(Foundation.NSCoder) M:SceneKit.SCNRenderer.Dispose(System.Boolean) M:SceneKit.SCNRenderer.FromContext(OpenGL.CGLContext,Foundation.NSDictionary) M:SceneKit.SCNRenderer.FromContext(OpenGLES.EAGLContext,Foundation.NSDictionary) -M:SceneKit.SCNRenderer.GetNodesInsideFrustum(SceneKit.SCNNode) M:SceneKit.SCNRenderer.HitTest(CoreGraphics.CGPoint,SceneKit.SCNHitTestOptions) -M:SceneKit.SCNRenderer.IsNodeInsideFrustum(SceneKit.SCNNode,SceneKit.SCNNode) -M:SceneKit.SCNRenderer.Prepare(Foundation.NSObject,System.Func{System.Boolean}) -M:SceneKit.SCNRenderer.Prepare(Foundation.NSObject[],System.Action{System.Boolean}) M:SceneKit.SCNRenderer.PrepareAsync(Foundation.NSObject[]) -M:SceneKit.SCNRenderer.PresentScene(SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode,System.Action) M:SceneKit.SCNRenderer.PresentSceneAsync(SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode) -M:SceneKit.SCNRenderer.ProjectPoint(SceneKit.SCNVector3) -M:SceneKit.SCNRenderer.UnprojectPoint(SceneKit.SCNVector3) M:SceneKit.SCNRenderingOptions.#ctor M:SceneKit.SCNRenderingOptions.#ctor(Foundation.NSDictionary) M:SceneKit.SCNScene.Add(SceneKit.SCNNode) @@ -47013,33 +43127,18 @@ M:SceneKit.SCNScene.GetEnumerator M:SceneKit.SCNScene.WriteToUrl(Foundation.NSUrl,SceneKit.SCNSceneLoadingOptions,SceneKit.ISCNSceneExportDelegate,SceneKit.SCNSceneExportProgressHandler) M:SceneKit.SCNSceneExportDelegate_Extensions.WriteImage(SceneKit.ISCNSceneExportDelegate,AppKit.NSImage,Foundation.NSUrl,Foundation.NSUrl) M:SceneKit.SCNSceneExportDelegate_Extensions.WriteImage(SceneKit.ISCNSceneExportDelegate,UIKit.UIImage,Foundation.NSUrl,Foundation.NSUrl) -M:SceneKit.SCNSceneExportDelegate.WriteImage(AppKit.NSImage,Foundation.NSUrl,Foundation.NSUrl) -M:SceneKit.SCNSceneExportDelegate.WriteImage(UIKit.UIImage,Foundation.NSUrl,Foundation.NSUrl) M:SceneKit.SCNSceneLoadingOptions.#ctor M:SceneKit.SCNSceneLoadingOptions.#ctor(Foundation.NSDictionary) M:SceneKit.SCNSceneRenderer_Extensions.GetWorkingColorSpace(SceneKit.ISCNSceneRenderer) M:SceneKit.SCNSceneRenderer_Extensions.PrepareAsync(SceneKit.ISCNSceneRenderer,Foundation.NSObject[]) M:SceneKit.SCNSceneRenderer_Extensions.PresentSceneAsync(SceneKit.ISCNSceneRenderer,SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode) -M:SceneKit.SCNSceneRenderer.GetNodesInsideFrustum(SceneKit.SCNNode) M:SceneKit.SCNSceneRenderer.HitTest(CoreGraphics.CGPoint,SceneKit.SCNHitTestOptions) -M:SceneKit.SCNSceneRenderer.IsNodeInsideFrustum(SceneKit.SCNNode,SceneKit.SCNNode) -M:SceneKit.SCNSceneRenderer.Prepare(Foundation.NSObject,System.Func{System.Boolean}) -M:SceneKit.SCNSceneRenderer.Prepare(Foundation.NSObject[],System.Action{System.Boolean}) -M:SceneKit.SCNSceneRenderer.PresentScene(SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode,System.Action) -M:SceneKit.SCNSceneRenderer.ProjectPoint(SceneKit.SCNVector3) -M:SceneKit.SCNSceneRenderer.UnprojectPoint(SceneKit.SCNVector3) M:SceneKit.SCNSceneRendererDelegate_Extensions.DidApplyAnimations(SceneKit.ISCNSceneRendererDelegate,SceneKit.ISCNSceneRenderer,System.Double) M:SceneKit.SCNSceneRendererDelegate_Extensions.DidApplyConstraints(SceneKit.ISCNSceneRendererDelegate,SceneKit.ISCNSceneRenderer,System.Double) M:SceneKit.SCNSceneRendererDelegate_Extensions.DidRenderScene(SceneKit.ISCNSceneRendererDelegate,SceneKit.ISCNSceneRenderer,SceneKit.SCNScene,System.Double) M:SceneKit.SCNSceneRendererDelegate_Extensions.DidSimulatePhysics(SceneKit.ISCNSceneRendererDelegate,SceneKit.ISCNSceneRenderer,System.Double) M:SceneKit.SCNSceneRendererDelegate_Extensions.Update(SceneKit.ISCNSceneRendererDelegate,SceneKit.ISCNSceneRenderer,System.Double) M:SceneKit.SCNSceneRendererDelegate_Extensions.WillRenderScene(SceneKit.ISCNSceneRendererDelegate,SceneKit.ISCNSceneRenderer,SceneKit.SCNScene,System.Double) -M:SceneKit.SCNSceneRendererDelegate.DidApplyAnimations(SceneKit.ISCNSceneRenderer,System.Double) -M:SceneKit.SCNSceneRendererDelegate.DidApplyConstraints(SceneKit.ISCNSceneRenderer,System.Double) -M:SceneKit.SCNSceneRendererDelegate.DidRenderScene(SceneKit.ISCNSceneRenderer,SceneKit.SCNScene,System.Double) -M:SceneKit.SCNSceneRendererDelegate.DidSimulatePhysics(SceneKit.ISCNSceneRenderer,System.Double) -M:SceneKit.SCNSceneRendererDelegate.Update(SceneKit.ISCNSceneRenderer,System.Double) -M:SceneKit.SCNSceneRendererDelegate.WillRenderScene(SceneKit.ISCNSceneRenderer,SceneKit.SCNScene,System.Double) M:SceneKit.SCNSceneSource.#ctor(Foundation.NSData,SceneKit.SCNSceneLoadingOptions) M:SceneKit.SCNSceneSource.#ctor(Foundation.NSUrl,SceneKit.SCNSceneLoadingOptions) M:SceneKit.SCNSceneSource.FromData(Foundation.NSData,SceneKit.SCNSceneLoadingOptions) @@ -47056,28 +43155,12 @@ M:SceneKit.SCNShadable_Extensions.HandleUnbinding(SceneKit.ISCNShadable,System.S M:SceneKit.SCNShadable_Extensions.SetMinimumLanguageVersion(SceneKit.ISCNShadable,Foundation.NSNumber) M:SceneKit.SCNShadable_Extensions.SetProgram(SceneKit.ISCNShadable,SceneKit.SCNProgram) M:SceneKit.SCNShadable_Extensions.SetWeakShaderModifiers(SceneKit.ISCNShadable,Foundation.NSDictionary) -M:SceneKit.SCNShadable.HandleBinding(System.String,SceneKit.SCNBindingHandler) -M:SceneKit.SCNShadable.HandleUnbinding(System.String,SceneKit.SCNBindingHandler) M:SceneKit.SCNShaderModifiers.#ctor M:SceneKit.SCNShaderModifiers.#ctor(Foundation.NSDictionary) M:SceneKit.SCNSkinner.Create(SceneKit.SCNGeometry,SceneKit.SCNNode[],SceneKit.SCNMatrix4[],SceneKit.SCNGeometrySource,SceneKit.SCNGeometrySource) M:SceneKit.SCNSkinner.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNTechnique.AddAnimation(SceneKit.ISCNAnimationProtocol,System.String) -M:SceneKit.SCNTechnique.AddAnimation(SceneKit.SCNAnimationPlayer,Foundation.NSString) M:SceneKit.SCNTechnique.Copy(Foundation.NSZone) M:SceneKit.SCNTechnique.EncodeTo(Foundation.NSCoder) -M:SceneKit.SCNTechnique.GetAnimation(Foundation.NSString) -M:SceneKit.SCNTechnique.GetAnimationKeys -M:SceneKit.SCNTechnique.GetAnimationPlayer(Foundation.NSString) -M:SceneKit.SCNTechnique.IsAnimationPaused(Foundation.NSString) -M:SceneKit.SCNTechnique.PauseAnimation(Foundation.NSString) -M:SceneKit.SCNTechnique.RemoveAllAnimations -M:SceneKit.SCNTechnique.RemoveAllAnimationsWithBlendOutDuration(System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNTechnique.RemoveAnimation(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNTechnique.RemoveAnimation(Foundation.NSString) -M:SceneKit.SCNTechnique.RemoveAnimationUsingBlendOutDuration(Foundation.NSString,System.Runtime.InteropServices.NFloat) -M:SceneKit.SCNTechnique.ResumeAnimation(Foundation.NSString) -M:SceneKit.SCNTechnique.SetSpeed(System.Runtime.InteropServices.NFloat,Foundation.NSString) M:SceneKit.SCNText.Create(Foundation.NSAttributedString,System.Runtime.InteropServices.NFloat) M:SceneKit.SCNText.Create(System.String,System.Runtime.InteropServices.NFloat) M:SceneKit.SCNTimingFunction.EncodeTo(Foundation.NSCoder) @@ -47092,17 +43175,10 @@ M:SceneKit.SCNVector4.op_Implicit(System.Numerics.Vector4)~SceneKit.SCNVector4 M:SceneKit.SCNView.#ctor(CoreGraphics.CGRect,SceneKit.SCNRenderingOptions) M:SceneKit.SCNView.#ctor(CoreGraphics.CGRect) M:SceneKit.SCNView.Dispose(System.Boolean) -M:SceneKit.SCNView.GetNodesInsideFrustum(SceneKit.SCNNode) M:SceneKit.SCNView.HitTest(CoreGraphics.CGPoint,SceneKit.SCNHitTestOptions) -M:SceneKit.SCNView.IsNodeInsideFrustum(SceneKit.SCNNode,SceneKit.SCNNode) -M:SceneKit.SCNView.Prepare(Foundation.NSObject,System.Func{System.Boolean}) -M:SceneKit.SCNView.Prepare(Foundation.NSObject[],System.Action{System.Boolean}) M:SceneKit.SCNView.PrepareAsync(Foundation.NSObject[]) -M:SceneKit.SCNView.PresentScene(SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode,System.Action) M:SceneKit.SCNView.PresentSceneAsync(SceneKit.SCNScene,SpriteKit.SKTransition,SceneKit.SCNNode) -M:SceneKit.SCNView.ProjectPoint(SceneKit.SCNVector3) M:SceneKit.SCNView.SCNViewAppearance.#ctor(System.IntPtr) -M:SceneKit.SCNView.UnprojectPoint(SceneKit.SCNVector3) M:ScreenCaptureKit.ISCContentSharingPickerObserver.DidCancel(ScreenCaptureKit.SCContentSharingPicker,ScreenCaptureKit.SCStream) M:ScreenCaptureKit.ISCContentSharingPickerObserver.DidFail(Foundation.NSError) M:ScreenCaptureKit.ISCContentSharingPickerObserver.DidUpdate(ScreenCaptureKit.SCContentSharingPicker,ScreenCaptureKit.SCContentFilter,ScreenCaptureKit.SCStream) @@ -47115,12 +43191,6 @@ M:ScreenCaptureKit.ISCStreamDelegate.OutputVideoEffectDidStop(ScreenCaptureKit.S M:ScreenCaptureKit.ISCStreamOutput.DidOutputSampleBuffer(ScreenCaptureKit.SCStream,CoreMedia.CMSampleBuffer,ScreenCaptureKit.SCStreamOutputType) M:ScreenCaptureKit.SCContentFilter.#ctor(ScreenCaptureKit.SCDisplay,ScreenCaptureKit.SCRunningApplication[],ScreenCaptureKit.SCWindow[],ScreenCaptureKit.SCContentFilterOption) M:ScreenCaptureKit.SCContentFilter.#ctor(ScreenCaptureKit.SCDisplay,ScreenCaptureKit.SCWindow[],ScreenCaptureKit.SCContentFilterOption) -M:ScreenCaptureKit.SCContentSharingPickerObserver.DidCancel(ScreenCaptureKit.SCContentSharingPicker,ScreenCaptureKit.SCStream) -M:ScreenCaptureKit.SCContentSharingPickerObserver.DidFail(Foundation.NSError) -M:ScreenCaptureKit.SCContentSharingPickerObserver.DidUpdate(ScreenCaptureKit.SCContentSharingPicker,ScreenCaptureKit.SCContentFilter,ScreenCaptureKit.SCStream) -M:ScreenCaptureKit.SCRecordingOutputDelegate.DidFail(ScreenCaptureKit.SCRecordingOutput,Foundation.NSError) -M:ScreenCaptureKit.SCRecordingOutputDelegate.DidFinishRecording(ScreenCaptureKit.SCRecordingOutput) -M:ScreenCaptureKit.SCRecordingOutputDelegate.DidStartRecording(ScreenCaptureKit.SCRecordingOutput) M:ScreenCaptureKit.SCScreenshotManager.CaptureImageAsync(ScreenCaptureKit.SCContentFilter,ScreenCaptureKit.SCStreamConfiguration) M:ScreenCaptureKit.SCScreenshotManager.CaptureSampleBufferAsync(ScreenCaptureKit.SCContentFilter,ScreenCaptureKit.SCStreamConfiguration) M:ScreenCaptureKit.SCShareableContent.GetCurrentProcessShareableContentAsync @@ -47134,9 +43204,6 @@ M:ScreenCaptureKit.SCStreamConfiguration.Dispose(System.Boolean) M:ScreenCaptureKit.SCStreamDelegate_Extensions.DidStop(ScreenCaptureKit.ISCStreamDelegate,ScreenCaptureKit.SCStream,Foundation.NSError) M:ScreenCaptureKit.SCStreamDelegate_Extensions.OutputVideoEffectDidStart(ScreenCaptureKit.ISCStreamDelegate,ScreenCaptureKit.SCStream) M:ScreenCaptureKit.SCStreamDelegate_Extensions.OutputVideoEffectDidStop(ScreenCaptureKit.ISCStreamDelegate,ScreenCaptureKit.SCStream) -M:ScreenCaptureKit.SCStreamDelegate.DidStop(ScreenCaptureKit.SCStream,Foundation.NSError) -M:ScreenCaptureKit.SCStreamDelegate.OutputVideoEffectDidStart(ScreenCaptureKit.SCStream) -M:ScreenCaptureKit.SCStreamDelegate.OutputVideoEffectDidStop(ScreenCaptureKit.SCStream) M:ScreenCaptureKit.SCStreamOutput_Extensions.DidOutputSampleBuffer(ScreenCaptureKit.ISCStreamOutput,ScreenCaptureKit.SCStream,CoreMedia.CMSampleBuffer,ScreenCaptureKit.SCStreamOutputType) M:ScreenTime.STScreenTimeConfiguration.EncodeTo(Foundation.NSCoder) M:ScreenTime.STScreenTimeConfigurationObserver.#ctor(CoreFoundation.DispatchQueue) @@ -47423,11 +43490,8 @@ M:Security.SslContext.Write(System.Byte[],System.IntPtr@) M:Security.SslStreamConnection.#ctor(System.IO.Stream) M:Security.SslStreamConnection.Read(System.IntPtr,System.IntPtr@) M:Security.SslStreamConnection.Write(System.IntPtr,System.IntPtr@) -M:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalyzeImage(CoreGraphics.CGImage,System.Action{SensitiveContentAnalysis.SCSensitivityAnalysis,Foundation.NSError}) -M:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalyzeImage(Foundation.NSUrl,System.Action{SensitiveContentAnalysis.SCSensitivityAnalysis,Foundation.NSError}) M:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalyzeImageAsync(CoreGraphics.CGImage) M:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalyzeImageAsync(Foundation.NSUrl) -M:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalyzeVideo(Foundation.NSUrl,System.Action{SensitiveContentAnalysis.SCSensitivityAnalysis,Foundation.NSError}) M:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalyzeVideoAsync(Foundation.NSUrl,Foundation.NSProgress@) M:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalyzeVideoAsync(Foundation.NSUrl) M:SensorKit.ISRSensorReaderDelegate.DidChangeAuthorizationStatus(SensorKit.SRSensorReader,SensorKit.SRAuthorizationStatus) @@ -47482,16 +43546,6 @@ M:SensorKit.SRSensorReaderDelegate_Extensions.FetchingRequestFailed(SensorKit.IS M:SensorKit.SRSensorReaderDelegate_Extensions.StartRecordingFailed(SensorKit.ISRSensorReaderDelegate,SensorKit.SRSensorReader,Foundation.NSError) M:SensorKit.SRSensorReaderDelegate_Extensions.StopRecordingFailed(SensorKit.ISRSensorReaderDelegate,SensorKit.SRSensorReader,Foundation.NSError) M:SensorKit.SRSensorReaderDelegate_Extensions.WillStartRecording(SensorKit.ISRSensorReaderDelegate,SensorKit.SRSensorReader) -M:SensorKit.SRSensorReaderDelegate.DidChangeAuthorizationStatus(SensorKit.SRSensorReader,SensorKit.SRAuthorizationStatus) -M:SensorKit.SRSensorReaderDelegate.DidCompleteFetch(SensorKit.SRSensorReader,SensorKit.SRFetchRequest) -M:SensorKit.SRSensorReaderDelegate.DidFetchDevices(SensorKit.SRSensorReader,SensorKit.SRDevice[]) -M:SensorKit.SRSensorReaderDelegate.DidFetchResult(SensorKit.SRSensorReader,SensorKit.SRFetchRequest,SensorKit.SRFetchResult{Foundation.NSObject}) -M:SensorKit.SRSensorReaderDelegate.DidStopRecording(SensorKit.SRSensorReader) -M:SensorKit.SRSensorReaderDelegate.FetchDevicesFailed(SensorKit.SRSensorReader,Foundation.NSError) -M:SensorKit.SRSensorReaderDelegate.FetchingRequestFailed(SensorKit.SRSensorReader,SensorKit.SRFetchRequest,Foundation.NSError) -M:SensorKit.SRSensorReaderDelegate.StartRecordingFailed(SensorKit.SRSensorReader,Foundation.NSError) -M:SensorKit.SRSensorReaderDelegate.StopRecordingFailed(SensorKit.SRSensorReader,Foundation.NSError) -M:SensorKit.SRSensorReaderDelegate.WillStartRecording(SensorKit.SRSensorReader) M:SensorKit.SRSpeechExpression.Copy(Foundation.NSZone) M:SensorKit.SRSpeechExpression.EncodeTo(Foundation.NSCoder) M:SensorKit.SRSpeechMetrics.Copy(Foundation.NSZone) @@ -47527,16 +43581,12 @@ M:SharedWithYou.SWCollaborationView.SWCollaborationViewAppearance.#ctor(System.I M:SharedWithYou.SWCollaborationViewDelegate_Extensions.DidDismissPopover(SharedWithYou.ISWCollaborationViewDelegate,SharedWithYou.SWCollaborationView) M:SharedWithYou.SWCollaborationViewDelegate_Extensions.ShouldPresentPopover(SharedWithYou.ISWCollaborationViewDelegate,SharedWithYou.SWCollaborationView) M:SharedWithYou.SWCollaborationViewDelegate_Extensions.WillPresentPopover(SharedWithYou.ISWCollaborationViewDelegate,SharedWithYou.SWCollaborationView) -M:SharedWithYou.SWCollaborationViewDelegate.DidDismissPopover(SharedWithYou.SWCollaborationView) -M:SharedWithYou.SWCollaborationViewDelegate.ShouldPresentPopover(SharedWithYou.SWCollaborationView) -M:SharedWithYou.SWCollaborationViewDelegate.WillPresentPopover(SharedWithYou.SWCollaborationView) M:SharedWithYou.SWHighlight.Copy(Foundation.NSZone) M:SharedWithYou.SWHighlight.EncodeTo(Foundation.NSCoder) M:SharedWithYou.SWHighlightCenter.Dispose(System.Boolean) M:SharedWithYou.SWHighlightCenter.GetCollaborationHighlightAsync(Foundation.NSUrl) M:SharedWithYou.SWHighlightCenter.GetHighlightAsync(Foundation.NSUrl) M:SharedWithYou.SWHighlightCenter.GetSignedIdentityProofAsync(SharedWithYou.SWCollaborationHighlight,Foundation.NSData) -M:SharedWithYou.SWHighlightCenterDelegate.HighlightsDidChange(SharedWithYou.SWHighlightCenter) M:SharedWithYou.SWHighlightChangeEvent.Copy(Foundation.NSZone) M:SharedWithYou.SWHighlightChangeEvent.EncodeTo(Foundation.NSCoder) M:SharedWithYou.SWHighlightMembershipEvent.Copy(Foundation.NSZone) @@ -47564,7 +43614,6 @@ M:SharedWithYouCore.SWCollaborationOption.Copy(Foundation.NSZone) M:SharedWithYouCore.SWCollaborationOption.EncodeTo(Foundation.NSCoder) M:SharedWithYouCore.SWCollaborationOptionsGroup.Copy(Foundation.NSZone) M:SharedWithYouCore.SWCollaborationOptionsGroup.EncodeTo(Foundation.NSCoder) -M:SharedWithYouCore.SWCollaborationOptionsPickerGroup.#ctor(System.String,SharedWithYouCore.SWCollaborationOption[]) M:SharedWithYouCore.SWCollaborationShareOptions.Copy(Foundation.NSZone) M:SharedWithYouCore.SWCollaborationShareOptions.EncodeTo(Foundation.NSCoder) M:SharedWithYouCore.SWPerson.EncodeTo(Foundation.NSCoder) @@ -47578,43 +43627,21 @@ M:SharedWithYouCore.SWUpdateCollaborationParticipantsAction.Copy(Foundation.NSZo M:SharedWithYouCore.SWUpdateCollaborationParticipantsAction.EncodeTo(Foundation.NSCoder) M:ShazamKit.ISHSessionDelegate.DidFindMatch(ShazamKit.SHSession,ShazamKit.SHMatch) M:ShazamKit.ISHSessionDelegate.DidNotFindMatch(ShazamKit.SHSession,ShazamKit.SHSignature,Foundation.NSError) -M:ShazamKit.SHCustomCatalog.#ctor(Foundation.NSData,Foundation.NSError@) -M:ShazamKit.SHCustomCatalog.Add(Foundation.NSUrl,Foundation.NSError@) -M:ShazamKit.SHCustomCatalog.Add(ShazamKit.SHSignature,ShazamKit.SHMediaItem[],Foundation.NSError@) -M:ShazamKit.SHCustomCatalog.Create -M:ShazamKit.SHCustomCatalog.Write(Foundation.NSUrl,Foundation.NSError@) M:ShazamKit.SHMatch.EncodeTo(Foundation.NSCoder) M:ShazamKit.SHMatchedMediaItem.EncodeTo(Foundation.NSCoder) M:ShazamKit.SHMediaItem.Copy(Foundation.NSZone) -M:ShazamKit.SHMediaItem.Create(Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:ShazamKit.SHMediaItem.EncodeTo(Foundation.NSCoder) -M:ShazamKit.SHMediaItem.FetchMediaItem(System.String,System.Action{ShazamKit.SHMediaItem,Foundation.NSError}) M:ShazamKit.SHMediaItem.FetchMediaItemAsync(System.String) -M:ShazamKit.SHMediaItem.GetObject(System.String) -M:ShazamKit.SHMediaItem.GetValue(System.String) -M:ShazamKit.SHMediaLibrary.Add(ShazamKit.SHMediaItem[],System.Action{Foundation.NSError}) M:ShazamKit.SHMediaLibrary.AddAsync(ShazamKit.SHMediaItem[]) -M:ShazamKit.SHRange.#ctor(System.Double,System.Double) M:ShazamKit.SHRange.Copy(Foundation.NSZone) -M:ShazamKit.SHRange.CreateRange(System.Double,System.Double) M:ShazamKit.SHRange.EncodeTo(Foundation.NSCoder) -M:ShazamKit.SHSession.#ctor(ShazamKit.SHCatalog) M:ShazamKit.SHSession.Dispose(System.Boolean) -M:ShazamKit.SHSession.Match(AVFoundation.AVAudioPcmBuffer,AVFoundation.AVAudioTime) -M:ShazamKit.SHSession.Match(ShazamKit.SHSignature) M:ShazamKit.SHSessionDelegate_Extensions.DidFindMatch(ShazamKit.ISHSessionDelegate,ShazamKit.SHSession,ShazamKit.SHMatch) M:ShazamKit.SHSessionDelegate_Extensions.DidNotFindMatch(ShazamKit.ISHSessionDelegate,ShazamKit.SHSession,ShazamKit.SHSignature,Foundation.NSError) -M:ShazamKit.SHSessionDelegate.DidFindMatch(ShazamKit.SHSession,ShazamKit.SHMatch) -M:ShazamKit.SHSessionDelegate.DidNotFindMatch(ShazamKit.SHSession,ShazamKit.SHSignature,Foundation.NSError) -M:ShazamKit.SHSignature.#ctor(Foundation.NSData,Foundation.NSError@) M:ShazamKit.SHSignature.Copy(Foundation.NSZone) M:ShazamKit.SHSignature.EncodeTo(Foundation.NSCoder) -M:ShazamKit.SHSignature.GetSignature(Foundation.NSData,Foundation.NSError@) -M:ShazamKit.SHSignatureGenerator.Append(AVFoundation.AVAudioPcmBuffer,AVFoundation.AVAudioTime,Foundation.NSError@) -M:ShazamKit.SHSignatureGenerator.GenerateSignature(AVFoundation.AVAsset,System.Action{ShazamKit.SHSignature,Foundation.NSError}) M:ShazamKit.SHSignatureGenerator.GenerateSignatureAsync(AVFoundation.AVAsset) M:Social.SLComposeServiceViewController.#ctor(System.String,Foundation.NSBundle) -M:Social.SLComposeServiceViewController.Cancel M:Social.SLComposeServiceViewController.CellClicked(AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) M:Social.SLComposeServiceViewController.CellDoubleClicked(AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,System.UIntPtr) M:Social.SLComposeServiceViewController.Changed(UIKit.UITextView) @@ -47623,15 +43650,12 @@ M:Social.SLComposeServiceViewController.DidChangeSelection(Foundation.NSNotifica M:Social.SLComposeServiceViewController.DidChangeTypingAttributes(Foundation.NSNotification) M:Social.SLComposeServiceViewController.DidCheckText(AppKit.NSTextView,Foundation.NSRange,Foundation.NSTextCheckingTypes,Foundation.NSDictionary,Foundation.NSTextCheckingResult[],Foundation.NSOrthography,System.IntPtr) M:Social.SLComposeServiceViewController.DidEndFormatting(UIKit.UITextView,UIKit.UITextFormattingViewController) -M:Social.SLComposeServiceViewController.DidSelectCancel -M:Social.SLComposeServiceViewController.DidSelectPost M:Social.SLComposeServiceViewController.DoCommandBySelector(AppKit.NSTextView,ObjCRuntime.Selector) M:Social.SLComposeServiceViewController.DraggedCell(AppKit.NSTextView,AppKit.NSTextAttachmentCell,CoreGraphics.CGRect,AppKit.NSEvent,System.UIntPtr) M:Social.SLComposeServiceViewController.EditingEnded(UIKit.UITextView) M:Social.SLComposeServiceViewController.EditingStarted(UIKit.UITextView) M:Social.SLComposeServiceViewController.GetCandidates(AppKit.NSTextView,Foundation.NSRange) M:Social.SLComposeServiceViewController.GetCompletions(AppKit.NSTextView,System.String[],Foundation.NSRange,System.IntPtr@) -M:Social.SLComposeServiceViewController.GetConfigurationItems M:Social.SLComposeServiceViewController.GetEditMenuForText(UIKit.UITextView,Foundation.NSRange,UIKit.UIMenuElement[]) M:Social.SLComposeServiceViewController.GetMenuConfiguration(UIKit.UITextView,UIKit.UITextItem,UIKit.UIMenu) M:Social.SLComposeServiceViewController.GetPrimaryAction(UIKit.UITextView,UIKit.UITextItem,UIKit.UIAction) @@ -47640,14 +43664,8 @@ M:Social.SLComposeServiceViewController.GetUndoManager(AppKit.NSTextView) M:Social.SLComposeServiceViewController.GetWritablePasteboardTypes(AppKit.NSTextView,AppKit.NSTextAttachmentCell,System.UIntPtr) M:Social.SLComposeServiceViewController.GetWritingToolsIgnoredRangesInEnclosingRange(AppKit.NSTextView,Foundation.NSRange) M:Social.SLComposeServiceViewController.GetWritingToolsIgnoredRangesInEnclosingRange(UIKit.UITextView,Foundation.NSRange) -M:Social.SLComposeServiceViewController.IsContentValid M:Social.SLComposeServiceViewController.LinkClicked(AppKit.NSTextView,Foundation.NSObject,System.UIntPtr) -M:Social.SLComposeServiceViewController.LoadPreviewView M:Social.SLComposeServiceViewController.MenuForEvent(AppKit.NSTextView,AppKit.NSMenu,AppKit.NSEvent,System.UIntPtr) -M:Social.SLComposeServiceViewController.PopConfigurationViewController -M:Social.SLComposeServiceViewController.PresentationAnimationDidFinish -M:Social.SLComposeServiceViewController.PushConfigurationViewController(UIKit.UIViewController) -M:Social.SLComposeServiceViewController.ReloadConfigurationItems M:Social.SLComposeServiceViewController.SelectionChanged(UIKit.UITextView) M:Social.SLComposeServiceViewController.ShouldBeginEditing(UIKit.UITextView) M:Social.SLComposeServiceViewController.ShouldChangeText(UIKit.UITextView,Foundation.NSRange,System.String) @@ -47662,7 +43680,6 @@ M:Social.SLComposeServiceViewController.ShouldInteractWithUrl(UIKit.UITextView,F M:Social.SLComposeServiceViewController.ShouldSelectCandidates(AppKit.NSTextView,System.UIntPtr) M:Social.SLComposeServiceViewController.ShouldSetSpellingState(AppKit.NSTextView,System.IntPtr,Foundation.NSRange) M:Social.SLComposeServiceViewController.ShouldUpdateTouchBarItemIdentifiers(AppKit.NSTextView,System.String[]) -M:Social.SLComposeServiceViewController.ValidateContent M:Social.SLComposeServiceViewController.WillBeginFormatting(UIKit.UITextView,UIKit.UITextFormattingViewController) M:Social.SLComposeServiceViewController.WillChangeSelection(AppKit.NSTextView,Foundation.NSRange,Foundation.NSRange) M:Social.SLComposeServiceViewController.WillChangeSelectionFromRanges(AppKit.NSTextView,Foundation.NSValue[],Foundation.NSValue[]) @@ -47678,23 +43695,10 @@ M:Social.SLComposeServiceViewController.WritingToolsDidEnd(AppKit.NSTextView) M:Social.SLComposeServiceViewController.WritingToolsDidEnd(UIKit.UITextView) M:Social.SLComposeServiceViewController.WritingToolsWillBegin(AppKit.NSTextView) M:Social.SLComposeServiceViewController.WritingToolsWillBegin(UIKit.UITextView) -M:Social.SLComposeSheetConfigurationItem.#ctor M:Social.SLComposeViewController.#ctor(System.String,Foundation.NSBundle) -M:Social.SLComposeViewController.AddImage(UIKit.UIImage) -M:Social.SLComposeViewController.AddUrl(Foundation.NSUrl) -M:Social.SLComposeViewController.FromService(Foundation.NSString) M:Social.SLComposeViewController.FromService(Social.SLServiceKind) -M:Social.SLComposeViewController.IsAvailable(Foundation.NSString) M:Social.SLComposeViewController.IsAvailable(Social.SLServiceKind) -M:Social.SLComposeViewController.RemoveAllImages -M:Social.SLComposeViewController.RemoveAllUrls -M:Social.SLComposeViewController.SetInitialText(System.String) -M:Social.SLRequest.AddMultipartData(Foundation.NSData,System.String,System.String,System.String) -M:Social.SLRequest.AddMultipartData(Foundation.NSData,System.String,System.String) -M:Social.SLRequest.Create(Foundation.NSString,Social.SLRequestMethod,Foundation.NSUrl,Foundation.NSDictionary) M:Social.SLRequest.Create(Social.SLServiceKind,Social.SLRequestMethod,Foundation.NSUrl,Foundation.NSDictionary) -M:Social.SLRequest.GetPreparedUrlRequest -M:Social.SLRequest.PerformRequest(System.Action{Foundation.NSData,Foundation.NSHttpUrlResponse,Foundation.NSError}) M:Social.SLRequest.PerformRequestAsync M:Social.SLRequestResult.#ctor(Foundation.NSData,Foundation.NSHttpUrlResponse) M:SoundAnalysis.ISNResultsObserving.DidComplete(SoundAnalysis.ISNRequest) @@ -47746,16 +43750,8 @@ M:Speech.SFSpeechRecognitionTaskDelegate_Extensions.DidHypothesizeTranscription( M:Speech.SFSpeechRecognitionTaskDelegate_Extensions.DidProcessAudioDuration(Speech.ISFSpeechRecognitionTaskDelegate,Speech.SFSpeechRecognitionTask,System.Double) M:Speech.SFSpeechRecognitionTaskDelegate_Extensions.FinishedReadingAudio(Speech.ISFSpeechRecognitionTaskDelegate,Speech.SFSpeechRecognitionTask) M:Speech.SFSpeechRecognitionTaskDelegate_Extensions.WasCancelled(Speech.ISFSpeechRecognitionTaskDelegate,Speech.SFSpeechRecognitionTask) -M:Speech.SFSpeechRecognitionTaskDelegate.DidDetectSpeech(Speech.SFSpeechRecognitionTask) -M:Speech.SFSpeechRecognitionTaskDelegate.DidFinishRecognition(Speech.SFSpeechRecognitionTask,Speech.SFSpeechRecognitionResult) -M:Speech.SFSpeechRecognitionTaskDelegate.DidFinishSuccessfully(Speech.SFSpeechRecognitionTask,System.Boolean) -M:Speech.SFSpeechRecognitionTaskDelegate.DidHypothesizeTranscription(Speech.SFSpeechRecognitionTask,Speech.SFTranscription) -M:Speech.SFSpeechRecognitionTaskDelegate.DidProcessAudioDuration(Speech.SFSpeechRecognitionTask,System.Double) -M:Speech.SFSpeechRecognitionTaskDelegate.FinishedReadingAudio(Speech.SFSpeechRecognitionTask) -M:Speech.SFSpeechRecognitionTaskDelegate.WasCancelled(Speech.SFSpeechRecognitionTask) M:Speech.SFSpeechRecognizer.Dispose(System.Boolean) M:Speech.SFSpeechRecognizerDelegate_Extensions.AvailabilityDidChange(Speech.ISFSpeechRecognizerDelegate,Speech.SFSpeechRecognizer,System.Boolean) -M:Speech.SFSpeechRecognizerDelegate.AvailabilityDidChange(Speech.SFSpeechRecognizer,System.Boolean) M:Speech.SFTranscription.Copy(Foundation.NSZone) M:Speech.SFTranscription.EncodeTo(Foundation.NSCoder) M:Speech.SFTranscriptionSegment.Copy(Foundation.NSZone) @@ -47821,8 +43817,6 @@ M:SpriteKit.SKPhysicsBody.Dispose(System.Boolean) M:SpriteKit.SKPhysicsBody.EncodeTo(Foundation.NSCoder) M:SpriteKit.SKPhysicsContactDelegate_Extensions.DidBeginContact(SpriteKit.ISKPhysicsContactDelegate,SpriteKit.SKPhysicsContact) M:SpriteKit.SKPhysicsContactDelegate_Extensions.DidEndContact(SpriteKit.ISKPhysicsContactDelegate,SpriteKit.SKPhysicsContact) -M:SpriteKit.SKPhysicsContactDelegate.DidBeginContact(SpriteKit.SKPhysicsContact) -M:SpriteKit.SKPhysicsContactDelegate.DidEndContact(SpriteKit.SKPhysicsContact) M:SpriteKit.SKPhysicsJoint.EncodeTo(Foundation.NSCoder) M:SpriteKit.SKPhysicsWorld.add_DidBeginContact(System.EventHandler) M:SpriteKit.SKPhysicsWorld.add_DidEndContact(System.EventHandler) @@ -47842,11 +43836,6 @@ M:SpriteKit.SKSceneDelegate_Extensions.DidEvaluateActions(SpriteKit.ISKSceneDele M:SpriteKit.SKSceneDelegate_Extensions.DidFinishUpdate(SpriteKit.ISKSceneDelegate,SpriteKit.SKScene) M:SpriteKit.SKSceneDelegate_Extensions.DidSimulatePhysics(SpriteKit.ISKSceneDelegate,SpriteKit.SKScene) M:SpriteKit.SKSceneDelegate_Extensions.Update(SpriteKit.ISKSceneDelegate,System.Double,SpriteKit.SKScene) -M:SpriteKit.SKSceneDelegate.DidApplyConstraints(SpriteKit.SKScene) -M:SpriteKit.SKSceneDelegate.DidEvaluateActions(SpriteKit.SKScene) -M:SpriteKit.SKSceneDelegate.DidFinishUpdate(SpriteKit.SKScene) -M:SpriteKit.SKSceneDelegate.DidSimulatePhysics(SpriteKit.SKScene) -M:SpriteKit.SKSceneDelegate.Update(System.Double,SpriteKit.SKScene) M:SpriteKit.SKShader.Copy(Foundation.NSZone) M:SpriteKit.SKShader.EncodeTo(Foundation.NSCoder) M:SpriteKit.SKShapeNode.FromPoints(CoreGraphics.CGPoint[],System.Int32,System.Int32) @@ -47892,7 +43881,6 @@ M:SpriteKit.SKView.Dispose(System.Boolean) M:SpriteKit.SKView.EncodeTo(Foundation.NSCoder) M:SpriteKit.SKView.SKViewAppearance.#ctor(System.IntPtr) M:SpriteKit.SKViewDelegate_Extensions.ShouldRender(SpriteKit.ISKViewDelegate,SpriteKit.SKView,System.Double) -M:SpriteKit.SKViewDelegate.ShouldRender(SpriteKit.SKView,System.Double) M:SpriteKit.SKWarpGeometry.Copy(Foundation.NSZone) M:SpriteKit.SKWarpGeometry.EncodeTo(Foundation.NSCoder) M:SpriteKit.SKWarpGeometryGrid.#ctor(System.IntPtr,System.IntPtr,System.Numerics.Vector2[],System.Numerics.Vector2[]) @@ -47941,27 +43929,17 @@ M:StoreKit.SKCloudServiceSetupViewController.Load(StoreKit.SKCloudServiceSetupOp M:StoreKit.SKCloudServiceSetupViewController.LoadAsync(Foundation.NSDictionary) M:StoreKit.SKCloudServiceSetupViewController.LoadAsync(StoreKit.SKCloudServiceSetupOptions) M:StoreKit.SKCloudServiceSetupViewControllerDelegate_Extensions.DidDismiss(StoreKit.ISKCloudServiceSetupViewControllerDelegate,StoreKit.SKCloudServiceSetupViewController) -M:StoreKit.SKCloudServiceSetupViewControllerDelegate.DidDismiss(StoreKit.SKCloudServiceSetupViewController) -M:StoreKit.SKMutablePayment.PaymentWithProduct(StoreKit.SKProduct) -M:StoreKit.SKMutablePayment.PaymentWithProduct(System.String) M:StoreKit.SKOverlay.Dispose(System.Boolean) M:StoreKit.SKOverlayDelegate_Extensions.DidFailToLoad(StoreKit.ISKOverlayDelegate,StoreKit.SKOverlay,Foundation.NSError) M:StoreKit.SKOverlayDelegate_Extensions.DidFinishDismissal(StoreKit.ISKOverlayDelegate,StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) M:StoreKit.SKOverlayDelegate_Extensions.DidFinishPresentation(StoreKit.ISKOverlayDelegate,StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) M:StoreKit.SKOverlayDelegate_Extensions.WillStartDismissal(StoreKit.ISKOverlayDelegate,StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) M:StoreKit.SKOverlayDelegate_Extensions.WillStartPresentation(StoreKit.ISKOverlayDelegate,StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) -M:StoreKit.SKOverlayDelegate.DidFailToLoad(StoreKit.SKOverlay,Foundation.NSError) -M:StoreKit.SKOverlayDelegate.DidFinishDismissal(StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) -M:StoreKit.SKOverlayDelegate.DidFinishPresentation(StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) -M:StoreKit.SKOverlayDelegate.WillStartDismissal(StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) -M:StoreKit.SKOverlayDelegate.WillStartPresentation(StoreKit.SKOverlay,StoreKit.SKOverlayTransitionContext) M:StoreKit.SKPayment.Copy(Foundation.NSZone) M:StoreKit.SKPayment.MutableCopy(Foundation.NSZone) M:StoreKit.SKPaymentQueue.Dispose(System.Boolean) M:StoreKit.SKPaymentQueueDelegate_Extensions.ShouldContinueTransaction(StoreKit.ISKPaymentQueueDelegate,StoreKit.SKPaymentQueue,StoreKit.SKPaymentTransaction,StoreKit.SKStorefront) M:StoreKit.SKPaymentQueueDelegate_Extensions.ShouldShowPriceConsent(StoreKit.ISKPaymentQueueDelegate,StoreKit.SKPaymentQueue) -M:StoreKit.SKPaymentQueueDelegate.ShouldContinueTransaction(StoreKit.SKPaymentQueue,StoreKit.SKPaymentTransaction,StoreKit.SKStorefront) -M:StoreKit.SKPaymentQueueDelegate.ShouldShowPriceConsent(StoreKit.SKPaymentQueue) M:StoreKit.SKPaymentTransactionObserver_Extensions.DidChangeStorefront(StoreKit.ISKPaymentTransactionObserver,StoreKit.SKPaymentQueue) M:StoreKit.SKPaymentTransactionObserver_Extensions.DidRevokeEntitlements(StoreKit.ISKPaymentTransactionObserver,StoreKit.SKPaymentQueue,System.String[]) M:StoreKit.SKPaymentTransactionObserver_Extensions.RemovedTransactions(StoreKit.ISKPaymentTransactionObserver,StoreKit.SKPaymentQueue,StoreKit.SKPaymentTransaction[]) @@ -47969,18 +43947,9 @@ M:StoreKit.SKPaymentTransactionObserver_Extensions.RestoreCompletedTransactionsF M:StoreKit.SKPaymentTransactionObserver_Extensions.RestoreCompletedTransactionsFinished(StoreKit.ISKPaymentTransactionObserver,StoreKit.SKPaymentQueue) M:StoreKit.SKPaymentTransactionObserver_Extensions.ShouldAddStorePayment(StoreKit.ISKPaymentTransactionObserver,StoreKit.SKPaymentQueue,StoreKit.SKPayment,StoreKit.SKProduct) M:StoreKit.SKPaymentTransactionObserver_Extensions.UpdatedDownloads(StoreKit.ISKPaymentTransactionObserver,StoreKit.SKPaymentQueue,StoreKit.SKDownload[]) -M:StoreKit.SKPaymentTransactionObserver.DidChangeStorefront(StoreKit.SKPaymentQueue) -M:StoreKit.SKPaymentTransactionObserver.DidRevokeEntitlements(StoreKit.SKPaymentQueue,System.String[]) -M:StoreKit.SKPaymentTransactionObserver.RemovedTransactions(StoreKit.SKPaymentQueue,StoreKit.SKPaymentTransaction[]) -M:StoreKit.SKPaymentTransactionObserver.RestoreCompletedTransactionsFailedWithError(StoreKit.SKPaymentQueue,Foundation.NSError) -M:StoreKit.SKPaymentTransactionObserver.RestoreCompletedTransactionsFinished(StoreKit.SKPaymentQueue) -M:StoreKit.SKPaymentTransactionObserver.ShouldAddStorePayment(StoreKit.SKPaymentQueue,StoreKit.SKPayment,StoreKit.SKProduct) -M:StoreKit.SKPaymentTransactionObserver.UpdatedDownloads(StoreKit.SKPaymentQueue,StoreKit.SKDownload[]) -M:StoreKit.SKPaymentTransactionObserver.UpdatedTransactions(StoreKit.SKPaymentQueue,StoreKit.SKPaymentTransaction[]) M:StoreKit.SKProductsRequest.add_ReceivedResponse(System.EventHandler{StoreKit.SKProductsRequestResponseEventArgs}) M:StoreKit.SKProductsRequest.Dispose(System.Boolean) M:StoreKit.SKProductsRequest.remove_ReceivedResponse(System.EventHandler{StoreKit.SKProductsRequestResponseEventArgs}) -M:StoreKit.SKProductsRequestDelegate.ReceivedResponse(StoreKit.SKProductsRequest,StoreKit.SKProductsResponse) M:StoreKit.SKProductsRequestResponseEventArgs.#ctor(StoreKit.SKProductsResponse) M:StoreKit.SKProductStorePromotionController.FetchStorePromotionOrderAsync M:StoreKit.SKProductStorePromotionController.FetchStorePromotionVisibilityAsync(StoreKit.SKProduct) @@ -47997,8 +43966,6 @@ M:StoreKit.SKRequest.remove_RequestFailed(System.EventHandler{StoreKit.SKRequest M:StoreKit.SKRequest.remove_RequestFinished(System.EventHandler) M:StoreKit.SKRequestDelegate_Extensions.RequestFailed(StoreKit.ISKRequestDelegate,StoreKit.SKRequest,Foundation.NSError) M:StoreKit.SKRequestDelegate_Extensions.RequestFinished(StoreKit.ISKRequestDelegate,StoreKit.SKRequest) -M:StoreKit.SKRequestDelegate.RequestFailed(StoreKit.SKRequest,Foundation.NSError) -M:StoreKit.SKRequestDelegate.RequestFinished(StoreKit.SKRequest) M:StoreKit.SKRequestErrorEventArgs.#ctor(Foundation.NSError) M:StoreKit.SKStoreProductViewController.add_Finished(System.EventHandler) M:StoreKit.SKStoreProductViewController.Dispose(System.Boolean) @@ -48009,7 +43976,6 @@ M:StoreKit.SKStoreProductViewController.LoadProductAsync(StoreKit.StoreProductPa M:StoreKit.SKStoreProductViewController.LoadProductAsync(StoreKit.StoreProductParameters) M:StoreKit.SKStoreProductViewController.remove_Finished(System.EventHandler) M:StoreKit.SKStoreProductViewControllerDelegate_Extensions.Finished(StoreKit.ISKStoreProductViewControllerDelegate,StoreKit.SKStoreProductViewController) -M:StoreKit.SKStoreProductViewControllerDelegate.Finished(StoreKit.SKStoreProductViewController) M:StoreKit.StoreProductParameters.#ctor M:StoreKit.StoreProductParameters.#ctor(Foundation.NSDictionary) M:StoreKit.StoreProductParameters.#ctor(System.Int32) @@ -48046,23 +44012,14 @@ M:SystemConfiguration.NetworkReachability.Unschedule M:SystemConfiguration.NetworkReachability.Unschedule(CoreFoundation.CFRunLoop,System.String) M:SystemConfiguration.StatusCodeError.GetErrorDescription(SystemConfiguration.StatusCode) M:SystemConfiguration.SystemConfigurationException.#ctor(SystemConfiguration.StatusCode) -M:ThreadNetwork.THClient.CheckPreferredNetwork(Foundation.NSData,System.Action{System.Boolean}) M:ThreadNetwork.THClient.CheckPreferredNetworkAsync(Foundation.NSData) -M:ThreadNetwork.THClient.DeleteCredentialsForBorderAgent(Foundation.NSData,System.Action{Foundation.NSError}) M:ThreadNetwork.THClient.DeleteCredentialsForBorderAgentAsync(Foundation.NSData) -M:ThreadNetwork.THClient.IsPreferredNetworkAvailable(System.Action{System.Boolean}) M:ThreadNetwork.THClient.IsPreferredNetworkAvailableAsync -M:ThreadNetwork.THClient.RetrieveAllActiveCredentials(System.Action{Foundation.NSSet{ThreadNetwork.THCredentials},Foundation.NSError}) M:ThreadNetwork.THClient.RetrieveAllActiveCredentialsAsync -M:ThreadNetwork.THClient.RetrieveAllCredentials(System.Action{Foundation.NSSet{ThreadNetwork.THCredentials},Foundation.NSError}) M:ThreadNetwork.THClient.RetrieveAllCredentialsAsync -M:ThreadNetwork.THClient.RetrieveCredentialsForBorderAgent(Foundation.NSData,System.Action{ThreadNetwork.THCredentials,Foundation.NSError}) M:ThreadNetwork.THClient.RetrieveCredentialsForBorderAgentAsync(Foundation.NSData) -M:ThreadNetwork.THClient.RetrieveCredentialsForExtendedPanId(Foundation.NSData,System.Action{ThreadNetwork.THCredentials,Foundation.NSError}) M:ThreadNetwork.THClient.RetrieveCredentialsForExtendedPanIdAsync(Foundation.NSData) -M:ThreadNetwork.THClient.RetrievePreferredCredentials(System.Action{ThreadNetwork.THCredentials,Foundation.NSError}) M:ThreadNetwork.THClient.RetrievePreferredCredentialsAsync -M:ThreadNetwork.THClient.StoreCredentialsForBorderAgent(Foundation.NSData,Foundation.NSData,System.Action{Foundation.NSError}) M:ThreadNetwork.THClient.StoreCredentialsForBorderAgentAsync(Foundation.NSData,Foundation.NSData) M:ThreadNetwork.THCredentials.EncodeTo(Foundation.NSCoder) M:TVMLKit.ITVApplicationControllerDelegate.DidFail(TVMLKit.TVApplicationController,Foundation.NSError) @@ -48085,85 +44042,42 @@ M:TVMLKit.ITVInterfaceCreating.GetUrlForResource(System.String) M:TVMLKit.ITVInterfaceCreating.GetViewControllerForElement(TVMLKit.TVViewElement,UIKit.UIViewController) M:TVMLKit.ITVInterfaceCreating.GetViewForElement(TVMLKit.TVViewElement,UIKit.UIView) M:TVMLKit.ITVPlaybackEventMarshaling.ProcessReturn(JavaScriptCore.JSValue,JavaScriptCore.JSContext) -M:TVMLKit.TVApplicationController.#ctor(TVMLKit.TVApplicationControllerContext,UIKit.UIWindow,TVMLKit.ITVApplicationControllerDelegate) M:TVMLKit.TVApplicationController.Dispose(System.Boolean) -M:TVMLKit.TVApplicationController.Evaluate(System.Action{JavaScriptCore.JSContext},System.Action{System.Boolean}) M:TVMLKit.TVApplicationController.EvaluateAsync(System.Action{JavaScriptCore.JSContext}) -M:TVMLKit.TVApplicationController.Stop M:TVMLKit.TVApplicationControllerContext.Copy(Foundation.NSZone) M:TVMLKit.TVApplicationControllerDelegate_Extensions.DidFail(TVMLKit.ITVApplicationControllerDelegate,TVMLKit.TVApplicationController,Foundation.NSError) M:TVMLKit.TVApplicationControllerDelegate_Extensions.DidFinishLaunching(TVMLKit.ITVApplicationControllerDelegate,TVMLKit.TVApplicationController,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:TVMLKit.TVApplicationControllerDelegate_Extensions.DidStop(TVMLKit.ITVApplicationControllerDelegate,TVMLKit.TVApplicationController,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:TVMLKit.TVApplicationControllerDelegate_Extensions.EvaluateAppJavaScript(TVMLKit.ITVApplicationControllerDelegate,TVMLKit.TVApplicationController,JavaScriptCore.JSContext) M:TVMLKit.TVApplicationControllerDelegate_Extensions.GetPlayer(TVMLKit.ITVApplicationControllerDelegate,TVMLKit.TVApplicationController) -M:TVMLKit.TVApplicationControllerDelegate.DidFail(TVMLKit.TVApplicationController,Foundation.NSError) -M:TVMLKit.TVApplicationControllerDelegate.DidFinishLaunching(TVMLKit.TVApplicationController,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:TVMLKit.TVApplicationControllerDelegate.DidStop(TVMLKit.TVApplicationController,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:TVMLKit.TVApplicationControllerDelegate.EvaluateAppJavaScript(TVMLKit.TVApplicationController,JavaScriptCore.JSContext) -M:TVMLKit.TVApplicationControllerDelegate.GetPlayer(TVMLKit.TVApplicationController) M:TVMLKit.TVBrowserTransitionAnimator.AnimateTransition(UIKit.IUIViewControllerContextTransitioning) M:TVMLKit.TVBrowserTransitionAnimator.AnimationEnded(System.Boolean) M:TVMLKit.TVBrowserTransitionAnimator.GetInterruptibleAnimator(UIKit.IUIViewControllerContextTransitioning) M:TVMLKit.TVBrowserTransitionAnimator.TransitionDuration(UIKit.IUIViewControllerContextTransitioning) -M:TVMLKit.TVBrowserViewController.#ctor(System.String,Foundation.NSBundle) M:TVMLKit.TVBrowserViewController.Dispose(System.Boolean) -M:TVMLKit.TVBrowserViewController.GetCorrespondingViewController(TVMLKit.TVViewElement) -M:TVMLKit.TVBrowserViewControllerDataSource.GetCorrespondingDocumentViewController(TVMLKit.TVBrowserViewController,TVMLKit.TVViewElement) M:TVMLKit.TVBrowserViewControllerDelegate_Extensions.DidCenterOnViewElement(TVMLKit.ITVBrowserViewControllerDelegate,TVMLKit.TVBrowserViewController,TVMLKit.TVViewElement) M:TVMLKit.TVBrowserViewControllerDelegate_Extensions.WillCenterOnViewElement(TVMLKit.ITVBrowserViewControllerDelegate,TVMLKit.TVBrowserViewController,TVMLKit.TVViewElement) -M:TVMLKit.TVBrowserViewControllerDelegate.DidCenterOnViewElement(TVMLKit.TVBrowserViewController,TVMLKit.TVViewElement) -M:TVMLKit.TVBrowserViewControllerDelegate.WillCenterOnViewElement(TVMLKit.TVBrowserViewController,TVMLKit.TVViewElement) M:TVMLKit.TVColor.Copy(Foundation.NSZone) -M:TVMLKit.TVDocumentViewController.CreateViewController(Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},TVMLKit.TVApplicationController) M:TVMLKit.TVDocumentViewController.Dispose(System.Boolean) -M:TVMLKit.TVDocumentViewController.Update(Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:TVMLKit.TVDocumentViewControllerDelegate_Extensions.DidFailUpdate(TVMLKit.ITVDocumentViewControllerDelegate,TVMLKit.TVDocumentViewController,Foundation.NSError) M:TVMLKit.TVDocumentViewControllerDelegate_Extensions.DidUpdate(TVMLKit.ITVDocumentViewControllerDelegate,TVMLKit.TVDocumentViewController,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:TVMLKit.TVDocumentViewControllerDelegate_Extensions.DidUpdate(TVMLKit.ITVDocumentViewControllerDelegate,TVMLKit.TVDocumentViewController) M:TVMLKit.TVDocumentViewControllerDelegate_Extensions.HandleEvent(TVMLKit.ITVDocumentViewControllerDelegate,TVMLKit.TVDocumentViewController,Foundation.NSString,TVMLKit.TVViewElement) M:TVMLKit.TVDocumentViewControllerDelegate_Extensions.WillUpdate(TVMLKit.ITVDocumentViewControllerDelegate,TVMLKit.TVDocumentViewController) -M:TVMLKit.TVDocumentViewControllerDelegate.DidFailUpdate(TVMLKit.TVDocumentViewController,Foundation.NSError) -M:TVMLKit.TVDocumentViewControllerDelegate.DidUpdate(TVMLKit.TVDocumentViewController,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:TVMLKit.TVDocumentViewControllerDelegate.DidUpdate(TVMLKit.TVDocumentViewController) -M:TVMLKit.TVDocumentViewControllerDelegate.HandleEvent(TVMLKit.TVDocumentViewController,Foundation.NSString,TVMLKit.TVViewElement) -M:TVMLKit.TVDocumentViewControllerDelegate.WillUpdate(TVMLKit.TVDocumentViewController) -M:TVMLKit.TVElementFactory.RegisterViewElementClass(ObjCRuntime.Class,System.String) M:TVMLKit.TVInterfaceCreating_Extensions.GetCollectionViewCellClass(TVMLKit.ITVInterfaceCreating,TVMLKit.TVViewElement) M:TVMLKit.TVInterfaceCreating_Extensions.GetImageForResource(TVMLKit.ITVInterfaceCreating,System.String) M:TVMLKit.TVInterfaceCreating_Extensions.GetPlayerViewController(TVMLKit.ITVInterfaceCreating,TVMLKit.TVPlayer) M:TVMLKit.TVInterfaceCreating_Extensions.GetUrlForResource(TVMLKit.ITVInterfaceCreating,System.String) M:TVMLKit.TVInterfaceCreating_Extensions.GetViewControllerForElement(TVMLKit.ITVInterfaceCreating,TVMLKit.TVViewElement,UIKit.UIViewController) M:TVMLKit.TVInterfaceCreating_Extensions.GetViewForElement(TVMLKit.ITVInterfaceCreating,TVMLKit.TVViewElement,UIKit.UIView) -M:TVMLKit.TVInterfaceFactory.GetCollectionViewCellClass(TVMLKit.TVViewElement) -M:TVMLKit.TVInterfaceFactory.GetImageForResource(System.String) -M:TVMLKit.TVInterfaceFactory.GetPlayerViewController(TVMLKit.TVPlayer) -M:TVMLKit.TVInterfaceFactory.GetUrlForResource(System.String) -M:TVMLKit.TVInterfaceFactory.GetViewControllerForElement(TVMLKit.TVViewElement,UIKit.UIViewController) -M:TVMLKit.TVInterfaceFactory.GetViewForElement(TVMLKit.TVViewElement,UIKit.UIView) -M:TVMLKit.TVPlaybackCustomEventUserInfo.#ctor(Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.Boolean) -M:TVMLKit.TVPlaybackCustomEventUserInfo.ProcessReturn(JavaScriptCore.JSValue,JavaScriptCore.JSContext) M:TVMLKit.TVPlaybackEventMarshaling_Extensions.ProcessReturn(TVMLKit.ITVPlaybackEventMarshaling,JavaScriptCore.JSValue,JavaScriptCore.JSContext) -M:TVMLKit.TVPlayer.#ctor(AVFoundation.AVPlayer) -M:TVMLKit.TVPlayer.ChangeToMediaItem(System.IntPtr) -M:TVMLKit.TVPlayer.DispatchEvent(System.String,TVMLKit.ITVPlaybackEventMarshaling,System.Action{System.Boolean}) M:TVMLKit.TVPlayer.DispatchEventAsync(System.String,TVMLKit.ITVPlaybackEventMarshaling) -M:TVMLKit.TVPlayer.Next -M:TVMLKit.TVPlayer.Pause -M:TVMLKit.TVPlayer.Present(System.Boolean) -M:TVMLKit.TVPlayer.Previous -M:TVMLKit.TVStyleFactory.RegisterStyle(System.String,TVMLKit.TVViewElementStyleType,System.Boolean) -M:TVMLKit.TVTextElement.GetAttributedString(UIKit.UIFont,UIKit.UIColor,UIKit.UITextAlignment) -M:TVMLKit.TVTextElement.GetAttributedString(UIKit.UIFont) M:TVMLKit.TVViewElement.Copy(Foundation.NSZone) -M:TVMLKit.TVViewElement.DispatchEvent(System.String,System.Boolean,System.Boolean,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.Action{System.Boolean,System.Boolean}) -M:TVMLKit.TVViewElement.DispatchEvent(TVMLKit.TVElementEventType,System.Boolean,System.Boolean,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},System.Action{System.Boolean,System.Boolean}) M:TVMLKit.TVViewElement.DispatchEventAsync(System.String,System.Boolean,System.Boolean,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:TVMLKit.TVViewElement.DispatchEventAsync(TVMLKit.TVElementEventType,System.Boolean,System.Boolean,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:TVMLKit.TVViewElement.Dispose(System.Boolean) -M:TVMLKit.TVViewElement.Reset(TVMLKit.TVElementResettableProperty) M:TVMLKit.TVViewElementDispatchResult.#ctor(System.Boolean,System.Boolean) M:TVMLKit.TVViewElementStyle.Copy(Foundation.NSZone) -M:TVMLKit.TVViewElementStyle.ValueForStyleProperty(System.String) M:TVServices.TVAppProfileDescriptor.#ctor(System.String) M:TVServices.TVAppProfileDescriptor.Copy(Foundation.NSZone) M:TVServices.TVAppProfileDescriptor.EncodeTo(Foundation.NSCoder) @@ -48204,54 +44118,39 @@ M:TVUIKit.TVCardView.#ctor(CoreGraphics.CGRect) M:TVUIKit.TVCardView.TVCardViewAppearance.#ctor(System.IntPtr) M:TVUIKit.TVCollectionViewDelegateFullScreenLayout_Extensions.DidCenterCell(TVUIKit.ITVCollectionViewDelegateFullScreenLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,Foundation.NSIndexPath) M:TVUIKit.TVCollectionViewDelegateFullScreenLayout_Extensions.WillCenterCell(TVUIKit.ITVCollectionViewDelegateFullScreenLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,Foundation.NSIndexPath) -M:TVUIKit.TVCollectionViewDelegateFullScreenLayout.DidCenterCell(UIKit.UICollectionView,UIKit.UICollectionViewLayout,Foundation.NSIndexPath) -M:TVUIKit.TVCollectionViewDelegateFullScreenLayout.WillCenterCell(UIKit.UICollectionView,UIKit.UICollectionViewLayout,Foundation.NSIndexPath) M:TVUIKit.TVCollectionViewFullScreenCell.#ctor(CoreGraphics.CGRect) -M:TVUIKit.TVCollectionViewFullScreenCell.MaskAmountDidChange -M:TVUIKit.TVCollectionViewFullScreenCell.MaskAmountWillChange(System.Runtime.InteropServices.NFloat) -M:TVUIKit.TVCollectionViewFullScreenCell.NormalizedPositionDidChange -M:TVUIKit.TVCollectionViewFullScreenCell.NormalizedPositionWillChange(System.Runtime.InteropServices.NFloat) M:TVUIKit.TVCollectionViewFullScreenCell.TVCollectionViewFullScreenCellAppearance.#ctor(System.IntPtr) M:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.CreateForCell(Foundation.NSIndexPath) M:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.CreateForDecorationView(Foundation.NSString,Foundation.NSIndexPath) M:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.CreateForSupplementaryView(Foundation.NSString,Foundation.NSIndexPath) -M:TVUIKit.TVDigitEntryViewController.ClearEntry(System.Boolean) M:TVUIKit.TVLockupHeaderFooterView.#ctor(CoreGraphics.CGRect) M:TVUIKit.TVLockupHeaderFooterView.TVLockupHeaderFooterViewAppearance.#ctor(System.IntPtr) -M:TVUIKit.TVLockupHeaderFooterView.UpdateAppearanceForLockupView(UIKit.UIControlState) M:TVUIKit.TVLockupView.#ctor(CoreGraphics.CGRect) M:TVUIKit.TVLockupView.TVLockupViewAppearance.#ctor(System.IntPtr) M:TVUIKit.TVLockupViewComponent_Extensions.UpdateAppearanceForLockupView(TVUIKit.ITVLockupViewComponent,UIKit.UIControlState) M:TVUIKit.TVMediaItemContentBadgeProperties.Copy(Foundation.NSZone) -M:TVUIKit.TVMediaItemContentBadgeProperties.CreateDefaultBadge -M:TVUIKit.TVMediaItemContentBadgeProperties.CreateLiveContentBadge M:TVUIKit.TVMediaItemContentBadgeProperties.EncodeTo(Foundation.NSCoder) M:TVUIKit.TVMediaItemContentConfiguration.Copy(Foundation.NSZone) -M:TVUIKit.TVMediaItemContentConfiguration.CreateWideCellConfiguration M:TVUIKit.TVMediaItemContentConfiguration.EncodeTo(Foundation.NSCoder) M:TVUIKit.TVMediaItemContentConfiguration.GetUpdatedConfiguration(UIKit.IUIConfigurationState) M:TVUIKit.TVMediaItemContentConfiguration.MakeContentView M:TVUIKit.TVMediaItemContentTextProperties.Copy(Foundation.NSZone) M:TVUIKit.TVMediaItemContentTextProperties.EncodeTo(Foundation.NSCoder) -M:TVUIKit.TVMediaItemContentView.#ctor(TVUIKit.TVMediaItemContentConfiguration) M:TVUIKit.TVMediaItemContentView.GetConfiguration M:TVUIKit.TVMediaItemContentView.SupportsConfiguration(UIKit.IUIContentConfiguration) M:TVUIKit.TVMediaItemContentView.TVMediaItemContentViewAppearance.#ctor(System.IntPtr) M:TVUIKit.TVMonogramContentConfiguration.Copy(Foundation.NSZone) -M:TVUIKit.TVMonogramContentConfiguration.CreateCellConfiguration M:TVUIKit.TVMonogramContentConfiguration.EncodeTo(Foundation.NSCoder) M:TVUIKit.TVMonogramContentConfiguration.GetUpdatedConfiguration(UIKit.IUIConfigurationState) M:TVUIKit.TVMonogramContentConfiguration.MakeContentView M:TVUIKit.TVMonogramContentTextProperties.Copy(Foundation.NSZone) M:TVUIKit.TVMonogramContentTextProperties.EncodeTo(Foundation.NSCoder) -M:TVUIKit.TVMonogramContentView.#ctor(TVUIKit.TVMonogramContentConfiguration) M:TVUIKit.TVMonogramContentView.GetConfiguration M:TVUIKit.TVMonogramContentView.SupportsConfiguration(UIKit.IUIContentConfiguration) M:TVUIKit.TVMonogramContentView.TVMonogramContentViewAppearance.#ctor(System.IntPtr) M:TVUIKit.TVMonogramView.#ctor(CoreGraphics.CGRect) M:TVUIKit.TVMonogramView.TVMonogramViewAppearance.#ctor(System.IntPtr) M:TVUIKit.TVPosterView.#ctor(CoreGraphics.CGRect) -M:TVUIKit.TVPosterView.#ctor(UIKit.UIImage) M:TVUIKit.TVPosterView.TVPosterViewAppearance.#ctor(System.IntPtr) M:Twitter.TWRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary,Twitter.TWRequestMethod) M:Twitter.TWRequest.AddMultiPartData(Foundation.NSData,System.String,System.String) @@ -49305,18 +45204,6 @@ M:UIKit.NSLayoutManagerDelegate_Extensions.ShouldBreakLineByWordBeforeCharacter( M:UIKit.NSLayoutManagerDelegate_Extensions.ShouldGenerateGlyphs(UIKit.INSLayoutManagerDelegate,UIKit.NSLayoutManager,System.IntPtr,System.IntPtr,System.IntPtr,UIKit.UIFont,Foundation.NSRange) M:UIKit.NSLayoutManagerDelegate_Extensions.ShouldSetLineFragmentRect(UIKit.INSLayoutManagerDelegate,UIKit.NSLayoutManager,CoreGraphics.CGRect@,CoreGraphics.CGRect@,System.Runtime.InteropServices.NFloat@,UIKit.NSTextContainer,Foundation.NSRange) M:UIKit.NSLayoutManagerDelegate_Extensions.ShouldUseAction(UIKit.INSLayoutManagerDelegate,UIKit.NSLayoutManager,UIKit.NSControlCharacterAction,System.UIntPtr) -M:UIKit.NSLayoutManagerDelegate.DidChangeGeometry(UIKit.NSLayoutManager,UIKit.NSTextContainer,CoreGraphics.CGSize) -M:UIKit.NSLayoutManagerDelegate.DidCompleteLayout(UIKit.NSLayoutManager,UIKit.NSTextContainer,System.Boolean) -M:UIKit.NSLayoutManagerDelegate.DidInvalidatedLayout(UIKit.NSLayoutManager) -M:UIKit.NSLayoutManagerDelegate.GetBoundingBox(UIKit.NSLayoutManager,System.UIntPtr,UIKit.NSTextContainer,CoreGraphics.CGRect,CoreGraphics.CGPoint,System.UIntPtr) -M:UIKit.NSLayoutManagerDelegate.GetLineSpacingAfterGlyph(UIKit.NSLayoutManager,System.UIntPtr,CoreGraphics.CGRect) -M:UIKit.NSLayoutManagerDelegate.GetParagraphSpacingAfterGlyph(UIKit.NSLayoutManager,System.UIntPtr,CoreGraphics.CGRect) -M:UIKit.NSLayoutManagerDelegate.GetParagraphSpacingBeforeGlyph(UIKit.NSLayoutManager,System.UIntPtr,CoreGraphics.CGRect) -M:UIKit.NSLayoutManagerDelegate.ShouldBreakLineByHyphenatingBeforeCharacter(UIKit.NSLayoutManager,System.UIntPtr) -M:UIKit.NSLayoutManagerDelegate.ShouldBreakLineByWordBeforeCharacter(UIKit.NSLayoutManager,System.UIntPtr) -M:UIKit.NSLayoutManagerDelegate.ShouldGenerateGlyphs(UIKit.NSLayoutManager,System.IntPtr,System.IntPtr,System.IntPtr,UIKit.UIFont,Foundation.NSRange) -M:UIKit.NSLayoutManagerDelegate.ShouldSetLineFragmentRect(UIKit.NSLayoutManager,CoreGraphics.CGRect@,CoreGraphics.CGRect@,System.Runtime.InteropServices.NFloat@,UIKit.NSTextContainer,Foundation.NSRange) -M:UIKit.NSLayoutManagerDelegate.ShouldUseAction(UIKit.NSLayoutManager,UIKit.NSControlCharacterAction,System.UIntPtr) M:UIKit.NSMutableAttributedStringKitAdditions.FixAttributesInRange(Foundation.NSMutableAttributedString,Foundation.NSRange) M:UIKit.NSObject_UIAccessibilityCustomRotor.GetAccessibilityCustomRotors(Foundation.NSObject) M:UIKit.NSObject_UIAccessibilityCustomRotor.SetAccessibilityCustomRotors(Foundation.NSObject,UIKit.UIAccessibilityCustomRotor[]) @@ -49342,37 +45229,17 @@ M:UIKit.NSStringDrawing.WeakDrawString(Foundation.NSString,CoreGraphics.CGPoint, M:UIKit.NSStringDrawing.WeakDrawString(Foundation.NSString,CoreGraphics.CGRect,Foundation.NSDictionary) M:UIKit.NSStringDrawing.WeakGetSizeUsingAttributes(Foundation.NSString,Foundation.NSDictionary) M:UIKit.NSTextAttachment.EncodeTo(Foundation.NSCoder) -M:UIKit.NSTextAttachment.GetAttachmentBounds(Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},UIKit.INSTextLocation,UIKit.NSTextContainer,CoreGraphics.CGRect,CoreGraphics.CGPoint) -M:UIKit.NSTextAttachment.GetAttachmentBounds(UIKit.NSTextContainer,CoreGraphics.CGRect,CoreGraphics.CGPoint,System.UIntPtr) -M:UIKit.NSTextAttachment.GetImageForBounds(CoreGraphics.CGRect,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject},UIKit.INSTextLocation,UIKit.NSTextContainer) -M:UIKit.NSTextAttachment.GetImageForBounds(CoreGraphics.CGRect,UIKit.NSTextContainer,System.UIntPtr) -M:UIKit.NSTextAttachment.GetViewProvider(UIKit.UIView,UIKit.INSTextLocation,UIKit.NSTextContainer) -M:UIKit.NSTextAttachmentContainer.GetAttachmentBounds(UIKit.NSTextContainer,CoreGraphics.CGRect,CoreGraphics.CGPoint,System.UIntPtr) -M:UIKit.NSTextAttachmentContainer.GetImageForBounds(CoreGraphics.CGRect,UIKit.NSTextContainer,System.UIntPtr) M:UIKit.NSTextAttachmentViewProvider.Dispose(System.Boolean) M:UIKit.NSTextContainer.Dispose(System.Boolean) M:UIKit.NSTextContainer.EncodeTo(Foundation.NSCoder) -M:UIKit.NSTextContentManager.AdjustedRange(UIKit.NSTextRange,System.Boolean) M:UIKit.NSTextContentManager.Dispose(System.Boolean) M:UIKit.NSTextContentManager.EncodeTo(Foundation.NSCoder) -M:UIKit.NSTextContentManager.EnumerateTextElements(UIKit.INSTextLocation,UIKit.NSTextContentManagerEnumerationOptions,System.Func{UIKit.NSTextElement,System.Boolean}) -M:UIKit.NSTextContentManager.GetLocation(UIKit.INSTextLocation,System.IntPtr) -M:UIKit.NSTextContentManager.GetOffset(UIKit.INSTextLocation,UIKit.INSTextLocation) M:UIKit.NSTextContentManager.PerformEditingTransactionAsync -M:UIKit.NSTextContentManager.ReplaceContents(UIKit.NSTextRange,UIKit.NSTextElement[]) -M:UIKit.NSTextContentManager.Synchronize(System.Action{Foundation.NSError}) M:UIKit.NSTextContentManager.SynchronizeTextLayoutManagersAsync M:UIKit.NSTextContentManagerDelegate_Extensions.GetTextContentManager(UIKit.INSTextContentManagerDelegate,UIKit.NSTextContentManager,UIKit.INSTextLocation) M:UIKit.NSTextContentManagerDelegate_Extensions.ShouldEnumerateTextElement(UIKit.INSTextContentManagerDelegate,UIKit.NSTextContentManager,UIKit.NSTextElement,UIKit.NSTextContentManagerEnumerationOptions) -M:UIKit.NSTextContentManagerDelegate.GetTextContentManager(UIKit.NSTextContentManager,UIKit.INSTextLocation) -M:UIKit.NSTextContentManagerDelegate.ShouldEnumerateTextElement(UIKit.NSTextContentManager,UIKit.NSTextElement,UIKit.NSTextContentManagerEnumerationOptions) M:UIKit.NSTextContentStorage.Dispose(System.Boolean) -M:UIKit.NSTextContentStorage.PerformEditingTransaction(UIKit.NSTextStorage,System.Action) -M:UIKit.NSTextContentStorage.ProcessEditing(UIKit.NSTextStorage,UIKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr,Foundation.NSRange) M:UIKit.NSTextContentStorageDelegate_Extensions.GetTextParagraph(UIKit.INSTextContentStorageDelegate,UIKit.NSTextContentStorage,Foundation.NSRange) -M:UIKit.NSTextContentStorageDelegate.GetTextContentManager(UIKit.NSTextContentManager,UIKit.INSTextLocation) -M:UIKit.NSTextContentStorageDelegate.GetTextParagraph(UIKit.NSTextContentStorage,Foundation.NSRange) -M:UIKit.NSTextContentStorageDelegate.ShouldEnumerateTextElement(UIKit.NSTextContentManager,UIKit.NSTextElement,UIKit.NSTextContentManagerEnumerationOptions) M:UIKit.NSTextElement.Dispose(System.Boolean) M:UIKit.NSTextElementProvider_Extensions.AdjustedRange(UIKit.INSTextElementProvider,UIKit.NSTextRange,System.Boolean) M:UIKit.NSTextElementProvider_Extensions.GetLocation(UIKit.INSTextElementProvider,UIKit.INSTextLocation,System.IntPtr) @@ -49381,43 +45248,19 @@ M:UIKit.NSTextLayoutFragment.Dispose(System.Boolean) M:UIKit.NSTextLayoutFragment.EncodeTo(Foundation.NSCoder) M:UIKit.NSTextLayoutManager.Dispose(System.Boolean) M:UIKit.NSTextLayoutManager.EncodeTo(Foundation.NSCoder) -M:UIKit.NSTextLayoutManager.EnumerateCaretOffsets(UIKit.INSTextLocation,UIKit.NSTextSelectionDataSourceEnumerateCaretOffsetsDelegate) -M:UIKit.NSTextLayoutManager.EnumerateContainerBoundaries(UIKit.INSTextLocation,System.Boolean,UIKit.NSTextSelectionDataSourceEnumerateContainerBoundariesDelegate) -M:UIKit.NSTextLayoutManager.EnumerateSubstrings(UIKit.INSTextLocation,Foundation.NSStringEnumerationOptions,UIKit.NSTextSelectionDataSourceEnumerateSubstringsDelegate) -M:UIKit.NSTextLayoutManager.GetBaseWritingDirection(UIKit.INSTextLocation) -M:UIKit.NSTextLayoutManager.GetLineFragmentRange(CoreGraphics.CGPoint,UIKit.INSTextLocation) -M:UIKit.NSTextLayoutManager.GetLocation(UIKit.INSTextLocation,System.IntPtr) -M:UIKit.NSTextLayoutManager.GetOffsetFromLocation(UIKit.INSTextLocation,UIKit.INSTextLocation) -M:UIKit.NSTextLayoutManager.GetTextLayoutOrientation(UIKit.INSTextLocation) -M:UIKit.NSTextLayoutManager.GetTextRange(UIKit.NSTextSelectionGranularity,UIKit.INSTextLocation) M:UIKit.NSTextLayoutManagerDelegate_Extensions.GetRenderingAttributes(UIKit.INSTextLayoutManagerDelegate,UIKit.NSTextLayoutManager,Foundation.NSObject,UIKit.INSTextLocation,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:UIKit.NSTextLayoutManagerDelegate_Extensions.GetTextLayoutFragment(UIKit.INSTextLayoutManagerDelegate,UIKit.NSTextLayoutManager,UIKit.INSTextLocation,UIKit.NSTextElement) M:UIKit.NSTextLayoutManagerDelegate_Extensions.ShouldBreakLineBeforeLocation(UIKit.INSTextLayoutManagerDelegate,UIKit.NSTextLayoutManager,UIKit.INSTextLocation,System.Boolean) -M:UIKit.NSTextLayoutManagerDelegate.GetRenderingAttributes(UIKit.NSTextLayoutManager,Foundation.NSObject,UIKit.INSTextLocation,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:UIKit.NSTextLayoutManagerDelegate.GetTextLayoutFragment(UIKit.NSTextLayoutManager,UIKit.INSTextLocation,UIKit.NSTextElement) -M:UIKit.NSTextLayoutManagerDelegate.ShouldBreakLineBeforeLocation(UIKit.NSTextLayoutManager,UIKit.INSTextLocation,System.Boolean) M:UIKit.NSTextLineFragment.EncodeTo(Foundation.NSCoder) M:UIKit.NSTextList.#ctor(System.String) M:UIKit.NSTextList.#ctor(UIKit.NSTextListMarkerFormats,UIKit.NSTextListOptions) M:UIKit.NSTextList.#ctor(UIKit.NSTextListMarkerFormats) M:UIKit.NSTextList.Copy(Foundation.NSZone) M:UIKit.NSTextList.EncodeTo(Foundation.NSCoder) -M:UIKit.NSTextListElement.#ctor(Foundation.NSAttributedString) -M:UIKit.NSTextListElement.#ctor(UIKit.NSTextContentManager) M:UIKit.NSTextListElement.Dispose(System.Boolean) -M:UIKit.NSTextParagraph.#ctor(UIKit.NSTextContentManager) M:UIKit.NSTextSelection.EncodeTo(Foundation.NSCoder) M:UIKit.NSTextSelectionDataSource_Extensions.EnumerateContainerBoundaries(UIKit.INSTextSelectionDataSource,UIKit.INSTextLocation,System.Boolean,UIKit.NSTextSelectionDataSourceEnumerateContainerBoundariesDelegate) M:UIKit.NSTextSelectionDataSource_Extensions.GetTextLayoutOrientation(UIKit.INSTextSelectionDataSource,UIKit.INSTextLocation) -M:UIKit.NSTextSelectionDataSource.EnumerateCaretOffsets(UIKit.INSTextLocation,UIKit.NSTextSelectionDataSourceEnumerateCaretOffsetsDelegate) -M:UIKit.NSTextSelectionDataSource.EnumerateContainerBoundaries(UIKit.INSTextLocation,System.Boolean,UIKit.NSTextSelectionDataSourceEnumerateContainerBoundariesDelegate) -M:UIKit.NSTextSelectionDataSource.EnumerateSubstrings(UIKit.INSTextLocation,Foundation.NSStringEnumerationOptions,UIKit.NSTextSelectionDataSourceEnumerateSubstringsDelegate) -M:UIKit.NSTextSelectionDataSource.GetBaseWritingDirection(UIKit.INSTextLocation) -M:UIKit.NSTextSelectionDataSource.GetLineFragmentRange(CoreGraphics.CGPoint,UIKit.INSTextLocation) -M:UIKit.NSTextSelectionDataSource.GetLocation(UIKit.INSTextLocation,System.IntPtr) -M:UIKit.NSTextSelectionDataSource.GetOffsetFromLocation(UIKit.INSTextLocation,UIKit.INSTextLocation) -M:UIKit.NSTextSelectionDataSource.GetTextLayoutOrientation(UIKit.INSTextLocation) -M:UIKit.NSTextSelectionDataSource.GetTextRange(UIKit.NSTextSelectionGranularity,UIKit.INSTextLocation) M:UIKit.NSTextSelectionNavigation.Dispose(System.Boolean) M:UIKit.NSTextStorage.#ctor(System.String) M:UIKit.NSTextStorage.add_DidProcessEditing(System.EventHandler{UIKit.NSTextStorageEventArgs}) @@ -49428,24 +45271,17 @@ M:UIKit.NSTextStorage.remove_DidProcessEditing(System.EventHandler{UIKit.NSTextS M:UIKit.NSTextStorage.remove_WillProcessEditing(System.EventHandler{UIKit.NSTextStorageEventArgs}) M:UIKit.NSTextStorageDelegate_Extensions.DidProcessEditing(UIKit.INSTextStorageDelegate,UIKit.NSTextStorage,UIKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) M:UIKit.NSTextStorageDelegate_Extensions.WillProcessEditing(UIKit.INSTextStorageDelegate,UIKit.NSTextStorage,UIKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) -M:UIKit.NSTextStorageDelegate.DidProcessEditing(UIKit.NSTextStorage,UIKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) -M:UIKit.NSTextStorageDelegate.WillProcessEditing(UIKit.NSTextStorage,UIKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) M:UIKit.NSTextStorageEventArgs.#ctor(UIKit.NSTextStorageEditActions,Foundation.NSRange,System.IntPtr) M:UIKit.NSTextTab.Copy(Foundation.NSZone) M:UIKit.NSTextTab.EncodeTo(Foundation.NSCoder) M:UIKit.NSTextViewportLayoutController.Dispose(System.Boolean) M:UIKit.NSTextViewportLayoutControllerDelegate_Extensions.DidLayout(UIKit.INSTextViewportLayoutControllerDelegate,UIKit.NSTextViewportLayoutController) M:UIKit.NSTextViewportLayoutControllerDelegate_Extensions.WillLayout(UIKit.INSTextViewportLayoutControllerDelegate,UIKit.NSTextViewportLayoutController) -M:UIKit.NSTextViewportLayoutControllerDelegate.ConfigureRenderingSurface(UIKit.NSTextViewportLayoutController,UIKit.NSTextLayoutFragment) -M:UIKit.NSTextViewportLayoutControllerDelegate.DidLayout(UIKit.NSTextViewportLayoutController) -M:UIKit.NSTextViewportLayoutControllerDelegate.GetViewportBounds(UIKit.NSTextViewportLayoutController) -M:UIKit.NSTextViewportLayoutControllerDelegate.WillLayout(UIKit.NSTextViewportLayoutController) M:UIKit.TransitionCoordinator_UIViewController.GetTransitionCoordinator(UIKit.UIViewController) M:UIKit.UIAccelerometer.add_Acceleration(System.EventHandler{UIKit.UIAccelerometerEventArgs}) M:UIKit.UIAccelerometer.Dispose(System.Boolean) M:UIKit.UIAccelerometer.remove_Acceleration(System.EventHandler{UIKit.UIAccelerometerEventArgs}) M:UIKit.UIAccelerometerDelegate_Extensions.DidAccelerate(UIKit.IUIAccelerometerDelegate,UIKit.UIAccelerometer,UIKit.UIAcceleration) -M:UIKit.UIAccelerometerDelegate.DidAccelerate(UIKit.UIAccelerometer,UIKit.UIAcceleration) M:UIKit.UIAccelerometerEventArgs.#ctor(UIKit.UIAcceleration) M:UIKit.UIAccessibility.ConvertFrameToScreenCoordinates(CoreGraphics.CGRect,UIKit.UIView) M:UIKit.UIAccessibility.ConvertPathToScreenCoordinates(UIKit.UIBezierPath,UIKit.UIView) @@ -49466,9 +45302,6 @@ M:UIKit.UIAccessibilityContainer_Extensions.SetAccessibilityContainerType(UIKit. M:UIKit.UIAccessibilityContainer_Extensions.SetAccessibilityElements(UIKit.IUIAccessibilityContainer,Foundation.NSObject) M:UIKit.UIAccessibilityContainerDataTable_Extensions.GetAccessibilityHeaderElementsForColumn(UIKit.IUIAccessibilityContainerDataTable,System.UIntPtr) M:UIKit.UIAccessibilityContainerDataTable_Extensions.GetAccessibilityHeaderElementsForRow(UIKit.IUIAccessibilityContainerDataTable,System.UIntPtr) -M:UIKit.UIAccessibilityContainerDataTable.GetAccessibilityDataTableCellElement(System.UIntPtr,System.UIntPtr) -M:UIKit.UIAccessibilityContainerDataTable.GetAccessibilityHeaderElementsForColumn(System.UIntPtr) -M:UIKit.UIAccessibilityContainerDataTable.GetAccessibilityHeaderElementsForRow(System.UIntPtr) M:UIKit.UIAccessibilityCustomAction.#ctor(System.String,System.Func{UIKit.UIAccessibilityCustomAction,System.Boolean}) M:UIKit.UIAccessibilityCustomAction.Dispose(System.Boolean) M:UIKit.UIAccessibilityCustomRotorItemResult.Dispose(System.Boolean) @@ -49476,8 +45309,6 @@ M:UIKit.UIAccessibilityElement.Dispose(System.Boolean) M:UIKit.UIAccessibilityLocationDescriptor.Dispose(System.Boolean) M:UIKit.UIAccessibilityReadingContent_Extensions.GetAccessibilityAttributedContent(UIKit.IUIAccessibilityReadingContent,System.IntPtr) M:UIKit.UIAccessibilityReadingContent_Extensions.GetAccessibilityAttributedPageContent(UIKit.IUIAccessibilityReadingContent) -M:UIKit.UIAction.Target(Foundation.NSObject,Foundation.NSObject) -M:UIKit.UIActionSheet.#ctor(CoreGraphics.CGRect) M:UIKit.UIActionSheet.#ctor(System.String,UIKit.IUIActionSheetDelegate,System.String,System.String,System.String[]) M:UIKit.UIActionSheet.#ctor(System.String,UIKit.IUIActionSheetDelegate) M:UIKit.UIActionSheet.#ctor(System.String) @@ -49503,28 +45334,10 @@ M:UIKit.UIActionSheetDelegate_Extensions.Dismissed(UIKit.IUIActionSheetDelegate, M:UIKit.UIActionSheetDelegate_Extensions.Presented(UIKit.IUIActionSheetDelegate,UIKit.UIActionSheet) M:UIKit.UIActionSheetDelegate_Extensions.WillDismiss(UIKit.IUIActionSheetDelegate,UIKit.UIActionSheet,System.IntPtr) M:UIKit.UIActionSheetDelegate_Extensions.WillPresent(UIKit.IUIActionSheetDelegate,UIKit.UIActionSheet) -M:UIKit.UIActionSheetDelegate.Canceled(UIKit.UIActionSheet) -M:UIKit.UIActionSheetDelegate.Clicked(UIKit.UIActionSheet,System.IntPtr) -M:UIKit.UIActionSheetDelegate.Dismissed(UIKit.UIActionSheet,System.IntPtr) -M:UIKit.UIActionSheetDelegate.Presented(UIKit.UIActionSheet) -M:UIKit.UIActionSheetDelegate.WillDismiss(UIKit.UIActionSheet,System.IntPtr) -M:UIKit.UIActionSheetDelegate.WillPresent(UIKit.UIActionSheet) M:UIKit.UIActivityCollaborationModeRestriction.Copy(Foundation.NSZone) M:UIKit.UIActivityCollaborationModeRestriction.EncodeTo(Foundation.NSCoder) M:UIKit.UIActivityIndicatorView.EncodeTo(Foundation.NSCoder) M:UIKit.UIActivityIndicatorView.UIActivityIndicatorViewAppearance.#ctor(System.IntPtr) -M:UIKit.UIActivityItemProvider.GetDataTypeIdentifierForActivity(UIKit.UIActivityViewController,Foundation.NSString) -M:UIKit.UIActivityItemProvider.GetItemForActivity(UIKit.UIActivityViewController,Foundation.NSString) -M:UIKit.UIActivityItemProvider.GetLinkMetadata(UIKit.UIActivityViewController) -M:UIKit.UIActivityItemProvider.GetPlaceholderData(UIKit.UIActivityViewController) -M:UIKit.UIActivityItemProvider.GetShareRecipients(UIKit.UIActivityViewController) -M:UIKit.UIActivityItemProvider.GetSubjectForActivity(UIKit.UIActivityViewController,Foundation.NSString) -M:UIKit.UIActivityItemProvider.GetThumbnailImageForActivity(UIKit.UIActivityViewController,Foundation.NSString,CoreGraphics.CGSize) -M:UIKit.UIActivityItemsConfiguration.GetActivityItemsConfigurationMetadata(Foundation.NSString) -M:UIKit.UIActivityItemsConfiguration.GetActivityItemsConfigurationMetadata(System.IntPtr,Foundation.NSString) -M:UIKit.UIActivityItemsConfiguration.GetActivityItemsConfigurationPreview(System.IntPtr,Foundation.NSString,CoreGraphics.CGSize) -M:UIKit.UIActivityItemsConfiguration.GetActivityItemsConfigurationSupportsInteraction(Foundation.NSString) -M:UIKit.UIActivityItemsConfiguration.GetApplicationActivitiesForActivityItemsConfiguration M:UIKit.UIActivityItemsConfigurationReading_Extensions.GetActivityItemsConfigurationMetadata(UIKit.IUIActivityItemsConfigurationReading,Foundation.NSString) M:UIKit.UIActivityItemsConfigurationReading_Extensions.GetActivityItemsConfigurationMetadata(UIKit.IUIActivityItemsConfigurationReading,System.IntPtr,Foundation.NSString) M:UIKit.UIActivityItemsConfigurationReading_Extensions.GetActivityItemsConfigurationPreview(UIKit.IUIActivityItemsConfigurationReading,System.IntPtr,Foundation.NSString,CoreGraphics.CGSize) @@ -49535,13 +45348,6 @@ M:UIKit.UIActivityItemSource_Extensions.GetLinkMetadata(UIKit.IUIActivityItemSou M:UIKit.UIActivityItemSource_Extensions.GetShareRecipients(UIKit.IUIActivityItemSource,UIKit.UIActivityViewController) M:UIKit.UIActivityItemSource_Extensions.GetSubjectForActivity(UIKit.IUIActivityItemSource,UIKit.UIActivityViewController,Foundation.NSString) M:UIKit.UIActivityItemSource_Extensions.GetThumbnailImageForActivity(UIKit.IUIActivityItemSource,UIKit.UIActivityViewController,Foundation.NSString,CoreGraphics.CGSize) -M:UIKit.UIActivityItemSource.GetDataTypeIdentifierForActivity(UIKit.UIActivityViewController,Foundation.NSString) -M:UIKit.UIActivityItemSource.GetItemForActivity(UIKit.UIActivityViewController,Foundation.NSString) -M:UIKit.UIActivityItemSource.GetLinkMetadata(UIKit.UIActivityViewController) -M:UIKit.UIActivityItemSource.GetPlaceholderData(UIKit.UIActivityViewController) -M:UIKit.UIActivityItemSource.GetShareRecipients(UIKit.UIActivityViewController) -M:UIKit.UIActivityItemSource.GetSubjectForActivity(UIKit.UIActivityViewController,Foundation.NSString) -M:UIKit.UIActivityItemSource.GetThumbnailImageForActivity(UIKit.UIActivityViewController,Foundation.NSString,CoreGraphics.CGSize) M:UIKit.UIAdaptivePresentationControllerDelegate_Extensions.DidAttemptToDismiss(UIKit.IUIAdaptivePresentationControllerDelegate,UIKit.UIPresentationController) M:UIKit.UIAdaptivePresentationControllerDelegate_Extensions.DidDismiss(UIKit.IUIAdaptivePresentationControllerDelegate,UIKit.UIPresentationController) M:UIKit.UIAdaptivePresentationControllerDelegate_Extensions.GetAdaptivePresentationStyle(UIKit.IUIAdaptivePresentationControllerDelegate,UIKit.UIPresentationController,UIKit.UITraitCollection) @@ -49551,17 +45357,7 @@ M:UIKit.UIAdaptivePresentationControllerDelegate_Extensions.PrepareAdaptivePrese M:UIKit.UIAdaptivePresentationControllerDelegate_Extensions.ShouldDismiss(UIKit.IUIAdaptivePresentationControllerDelegate,UIKit.UIPresentationController) M:UIKit.UIAdaptivePresentationControllerDelegate_Extensions.WillDismiss(UIKit.IUIAdaptivePresentationControllerDelegate,UIKit.UIPresentationController) M:UIKit.UIAdaptivePresentationControllerDelegate_Extensions.WillPresent(UIKit.IUIAdaptivePresentationControllerDelegate,UIKit.UIPresentationController,UIKit.UIModalPresentationStyle,UIKit.IUIViewControllerTransitionCoordinator) -M:UIKit.UIAdaptivePresentationControllerDelegate.DidAttemptToDismiss(UIKit.UIPresentationController) -M:UIKit.UIAdaptivePresentationControllerDelegate.DidDismiss(UIKit.UIPresentationController) -M:UIKit.UIAdaptivePresentationControllerDelegate.GetAdaptivePresentationStyle(UIKit.UIPresentationController,UIKit.UITraitCollection) -M:UIKit.UIAdaptivePresentationControllerDelegate.GetAdaptivePresentationStyle(UIKit.UIPresentationController) -M:UIKit.UIAdaptivePresentationControllerDelegate.GetViewControllerForAdaptivePresentation(UIKit.UIPresentationController,UIKit.UIModalPresentationStyle) -M:UIKit.UIAdaptivePresentationControllerDelegate.PrepareAdaptivePresentationController(UIKit.UIPresentationController,UIKit.UIPresentationController) -M:UIKit.UIAdaptivePresentationControllerDelegate.ShouldDismiss(UIKit.UIPresentationController) -M:UIKit.UIAdaptivePresentationControllerDelegate.WillDismiss(UIKit.UIPresentationController) -M:UIKit.UIAdaptivePresentationControllerDelegate.WillPresent(UIKit.UIPresentationController,UIKit.UIModalPresentationStyle,UIKit.IUIViewControllerTransitionCoordinator) M:UIKit.UIAlertAction.Copy(Foundation.NSZone) -M:UIKit.UIAlertController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UIAlertView.#ctor(System.String,System.String,UIKit.IUIAlertViewDelegate,System.String,System.String[]) M:UIKit.UIAlertView.add_Canceled(System.EventHandler) M:UIKit.UIAlertView.add_Clicked(System.EventHandler{UIKit.UIButtonEventArgs}) @@ -49585,13 +45381,6 @@ M:UIKit.UIAlertViewDelegate_Extensions.Presented(UIKit.IUIAlertViewDelegate,UIKi M:UIKit.UIAlertViewDelegate_Extensions.ShouldEnableFirstOtherButton(UIKit.IUIAlertViewDelegate,UIKit.UIAlertView) M:UIKit.UIAlertViewDelegate_Extensions.WillDismiss(UIKit.IUIAlertViewDelegate,UIKit.UIAlertView,System.IntPtr) M:UIKit.UIAlertViewDelegate_Extensions.WillPresent(UIKit.IUIAlertViewDelegate,UIKit.UIAlertView) -M:UIKit.UIAlertViewDelegate.Canceled(UIKit.UIAlertView) -M:UIKit.UIAlertViewDelegate.Clicked(UIKit.UIAlertView,System.IntPtr) -M:UIKit.UIAlertViewDelegate.Dismissed(UIKit.UIAlertView,System.IntPtr) -M:UIKit.UIAlertViewDelegate.Presented(UIKit.UIAlertView) -M:UIKit.UIAlertViewDelegate.ShouldEnableFirstOtherButton(UIKit.UIAlertView) -M:UIKit.UIAlertViewDelegate.WillDismiss(UIKit.UIAlertView,System.IntPtr) -M:UIKit.UIAlertViewDelegate.WillPresent(UIKit.UIAlertView) M:UIKit.UIAppearance.Equals(System.Object) M:UIKit.UIAppearance.GetAppearance(System.IntPtr,System.Type[]) M:UIKit.UIAppearance.GetAppearance(System.IntPtr,UIKit.UITraitCollection,System.Type[]) @@ -49663,61 +45452,7 @@ M:UIKit.UIApplicationDelegate_Extensions.WillEncodeRestorableState(UIKit.IUIAppl M:UIKit.UIApplicationDelegate_Extensions.WillEnterForeground(UIKit.IUIApplicationDelegate,UIKit.UIApplication) M:UIKit.UIApplicationDelegate_Extensions.WillFinishLaunching(UIKit.IUIApplicationDelegate,UIKit.UIApplication,Foundation.NSDictionary) M:UIKit.UIApplicationDelegate_Extensions.WillTerminate(UIKit.IUIApplicationDelegate,UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.AccessibilityPerformMagicTap -M:UIKit.UIApplicationDelegate.ApplicationSignificantTimeChange(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.ChangedStatusBarFrame(UIKit.UIApplication,CoreGraphics.CGRect) -M:UIKit.UIApplicationDelegate.ContinueUserActivity(UIKit.UIApplication,Foundation.NSUserActivity,UIKit.UIApplicationRestorationHandler) -M:UIKit.UIApplicationDelegate.DidChangeStatusBarOrientation(UIKit.UIApplication,UIKit.UIInterfaceOrientation) -M:UIKit.UIApplicationDelegate.DidDecodeRestorableState(UIKit.UIApplication,Foundation.NSCoder) -M:UIKit.UIApplicationDelegate.DidDiscardSceneSessions(UIKit.UIApplication,Foundation.NSSet{UIKit.UISceneSession}) -M:UIKit.UIApplicationDelegate.DidEnterBackground(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.DidFailToContinueUserActivity(UIKit.UIApplication,System.String,Foundation.NSError) -M:UIKit.UIApplicationDelegate.DidReceiveRemoteNotification(UIKit.UIApplication,Foundation.NSDictionary,System.Action{UIKit.UIBackgroundFetchResult}) -M:UIKit.UIApplicationDelegate.DidRegisterUserNotificationSettings(UIKit.UIApplication,UIKit.UIUserNotificationSettings) -M:UIKit.UIApplicationDelegate.FailedToRegisterForRemoteNotifications(UIKit.UIApplication,Foundation.NSError) -M:UIKit.UIApplicationDelegate.FinishedLaunching(UIKit.UIApplication,Foundation.NSDictionary) -M:UIKit.UIApplicationDelegate.FinishedLaunching(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.GetConfiguration(UIKit.UIApplication,UIKit.UISceneSession,UIKit.UISceneConnectionOptions) -M:UIKit.UIApplicationDelegate.GetHandlerForIntent(UIKit.UIApplication,Intents.INIntent) -M:UIKit.UIApplicationDelegate.GetSupportedInterfaceOrientations(UIKit.UIApplication,UIKit.UIWindow) -M:UIKit.UIApplicationDelegate.GetViewController(UIKit.UIApplication,System.String[],Foundation.NSCoder) -M:UIKit.UIApplicationDelegate.HandleAction(UIKit.UIApplication,System.String,Foundation.NSDictionary,Foundation.NSDictionary,System.Action) -M:UIKit.UIApplicationDelegate.HandleAction(UIKit.UIApplication,System.String,Foundation.NSDictionary,System.Action) -M:UIKit.UIApplicationDelegate.HandleAction(UIKit.UIApplication,System.String,UIKit.UILocalNotification,Foundation.NSDictionary,System.Action) -M:UIKit.UIApplicationDelegate.HandleAction(UIKit.UIApplication,System.String,UIKit.UILocalNotification,System.Action) -M:UIKit.UIApplicationDelegate.HandleEventsForBackgroundUrl(UIKit.UIApplication,System.String,System.Action) -M:UIKit.UIApplicationDelegate.HandleIntent(UIKit.UIApplication,Intents.INIntent,System.Action{Intents.INIntentResponse}) -M:UIKit.UIApplicationDelegate.HandleOpenURL(UIKit.UIApplication,Foundation.NSUrl) -M:UIKit.UIApplicationDelegate.HandleWatchKitExtensionRequest(UIKit.UIApplication,Foundation.NSDictionary,System.Action{Foundation.NSDictionary}) -M:UIKit.UIApplicationDelegate.OnActivated(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.OnResignActivation(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.OpenUrl(UIKit.UIApplication,Foundation.NSUrl,Foundation.NSDictionary) -M:UIKit.UIApplicationDelegate.OpenUrl(UIKit.UIApplication,Foundation.NSUrl,System.String,Foundation.NSObject) M:UIKit.UIApplicationDelegate.OpenUrl(UIKit.UIApplication,Foundation.NSUrl,UIKit.UIApplicationOpenUrlOptions) -M:UIKit.UIApplicationDelegate.PerformActionForShortcutItem(UIKit.UIApplication,UIKit.UIApplicationShortcutItem,UIKit.UIOperationHandler) -M:UIKit.UIApplicationDelegate.PerformFetch(UIKit.UIApplication,System.Action{UIKit.UIBackgroundFetchResult}) -M:UIKit.UIApplicationDelegate.ProtectedDataDidBecomeAvailable(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.ProtectedDataWillBecomeUnavailable(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.ReceivedLocalNotification(UIKit.UIApplication,UIKit.UILocalNotification) -M:UIKit.UIApplicationDelegate.ReceivedRemoteNotification(UIKit.UIApplication,Foundation.NSDictionary) -M:UIKit.UIApplicationDelegate.ReceiveMemoryWarning(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.RegisteredForRemoteNotifications(UIKit.UIApplication,Foundation.NSData) -M:UIKit.UIApplicationDelegate.ShouldAllowExtensionPointIdentifier(UIKit.UIApplication,Foundation.NSString) -M:UIKit.UIApplicationDelegate.ShouldAutomaticallyLocalizeKeyCommands(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.ShouldRequestHealthAuthorization(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.ShouldRestoreApplicationState(UIKit.UIApplication,Foundation.NSCoder) -M:UIKit.UIApplicationDelegate.ShouldRestoreSecureApplicationState(UIKit.UIApplication,Foundation.NSCoder) -M:UIKit.UIApplicationDelegate.ShouldSaveApplicationState(UIKit.UIApplication,Foundation.NSCoder) -M:UIKit.UIApplicationDelegate.ShouldSaveSecureApplicationState(UIKit.UIApplication,Foundation.NSCoder) -M:UIKit.UIApplicationDelegate.UserActivityUpdated(UIKit.UIApplication,Foundation.NSUserActivity) -M:UIKit.UIApplicationDelegate.UserDidAcceptCloudKitShare(UIKit.UIApplication,CloudKit.CKShareMetadata) -M:UIKit.UIApplicationDelegate.WillChangeStatusBarFrame(UIKit.UIApplication,CoreGraphics.CGRect) -M:UIKit.UIApplicationDelegate.WillChangeStatusBarOrientation(UIKit.UIApplication,UIKit.UIInterfaceOrientation,System.Double) -M:UIKit.UIApplicationDelegate.WillContinueUserActivity(UIKit.UIApplication,System.String) -M:UIKit.UIApplicationDelegate.WillEncodeRestorableState(UIKit.UIApplication,Foundation.NSCoder) -M:UIKit.UIApplicationDelegate.WillEnterForeground(UIKit.UIApplication) -M:UIKit.UIApplicationDelegate.WillFinishLaunching(UIKit.UIApplication,Foundation.NSDictionary) -M:UIKit.UIApplicationDelegate.WillTerminate(UIKit.UIApplication) M:UIKit.UIApplicationLaunchEventArgs.#ctor(Foundation.NSNotification) M:UIKit.UIApplicationOpenUrlOptions.#ctor M:UIKit.UIApplicationOpenUrlOptions.#ctor(Foundation.NSDictionary) @@ -49727,9 +45462,7 @@ M:UIKit.UIApplicationShortcutItem.Copy(Foundation.NSZone) M:UIKit.UIApplicationShortcutItem.MutableCopy(Foundation.NSZone) M:UIKit.UIBackgroundConfiguration.Copy(Foundation.NSZone) M:UIKit.UIBackgroundConfiguration.EncodeTo(Foundation.NSCoder) -M:UIKit.UIBandSelectionInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIBandSelectionInteraction.Dispose(System.Boolean) -M:UIKit.UIBandSelectionInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIBarAppearance.Copy(Foundation.NSZone) M:UIKit.UIBarAppearance.EncodeTo(Foundation.NSCoder) M:UIKit.UIBarButtonItem.#ctor(System.String,UIKit.UIBarButtonItemStyle,System.EventHandler) @@ -49739,7 +45472,6 @@ M:UIKit.UIBarButtonItem.#ctor(UIKit.UIImage,UIKit.UIBarButtonItemStyle,System.Ev M:UIKit.UIBarButtonItem.add_Clicked(System.EventHandler) M:UIKit.UIBarButtonItem.Dispose(System.Boolean) M:UIKit.UIBarButtonItem.EncodeTo(Foundation.NSCoder) -M:UIKit.UIBarButtonItem.GetFrame(UIKit.UIView) M:UIKit.UIBarButtonItem.remove_Clicked(System.EventHandler) M:UIKit.UIBarButtonItem.UIBarButtonItemAppearance.#ctor(System.IntPtr) M:UIKit.UIBarButtonItem.UIBarButtonItemAppearance.GetBackButtonBackgroundImage(UIKit.UIControlState,UIKit.UIBarMetrics) @@ -49759,7 +45491,6 @@ M:UIKit.UIBarButtonItem.UIBarButtonItemAppearance.SetTitlePositionAdjustment(UIK M:UIKit.UIBarButtonItemAppearance.Copy(Foundation.NSZone) M:UIKit.UIBarButtonItemAppearance.EncodeTo(Foundation.NSCoder) M:UIKit.UIBarButtonItemGroup.EncodeTo(Foundation.NSCoder) -M:UIKit.UIBarItem.AccessibilityActivate M:UIKit.UIBarItem.EncodeTo(Foundation.NSCoder) M:UIKit.UIBarItem.GetTitleTextAttributes(UIKit.UIControlState) M:UIKit.UIBarItem.SetTitleTextAttributes(UIKit.UIStringAttributes,UIKit.UIControlState) @@ -49767,7 +45498,6 @@ M:UIKit.UIBarItem.UIBarItemAppearance.#ctor(System.IntPtr) M:UIKit.UIBarItem.UIBarItemAppearance.GetTitleTextAttributes(UIKit.UIControlState) M:UIKit.UIBarItem.UIBarItemAppearance.SetTitleTextAttributes(UIKit.UIStringAttributes,UIKit.UIControlState) M:UIKit.UIBarPositioningDelegate_Extensions.GetPositionForBar(UIKit.IUIBarPositioningDelegate,UIKit.IUIBarPositioning) -M:UIKit.UIBarPositioningDelegate.GetPositionForBar(UIKit.IUIBarPositioning) M:UIKit.UIBezierPath.Copy(Foundation.NSZone) M:UIKit.UIBezierPath.EncodeTo(Foundation.NSCoder) M:UIKit.UIBezierPath.GetLineDash(System.Runtime.InteropServices.NFloat[]@,System.Runtime.InteropServices.NFloat@) @@ -49790,47 +45520,26 @@ M:UIKit.UIButtonEventArgs.#ctor(System.IntPtr) M:UIKit.UICalendarSelectionMultiDate.Dispose(System.Boolean) M:UIKit.UICalendarSelectionMultiDateDelegate_Extensions.CanDeselectDate(UIKit.IUICalendarSelectionMultiDateDelegate,UIKit.UICalendarSelectionMultiDate,Foundation.NSDateComponents) M:UIKit.UICalendarSelectionMultiDateDelegate_Extensions.CanSelectDate(UIKit.IUICalendarSelectionMultiDateDelegate,UIKit.UICalendarSelectionMultiDate,Foundation.NSDateComponents) -M:UIKit.UICalendarSelectionMultiDateDelegate.CanDeselectDate(UIKit.UICalendarSelectionMultiDate,Foundation.NSDateComponents) -M:UIKit.UICalendarSelectionMultiDateDelegate.CanSelectDate(UIKit.UICalendarSelectionMultiDate,Foundation.NSDateComponents) -M:UIKit.UICalendarSelectionMultiDateDelegate.DidDeselectDate(UIKit.UICalendarSelectionMultiDate,Foundation.NSDateComponents) -M:UIKit.UICalendarSelectionMultiDateDelegate.DidSelectDate(UIKit.UICalendarSelectionMultiDate,Foundation.NSDateComponents) M:UIKit.UICalendarSelectionSingleDate.Dispose(System.Boolean) M:UIKit.UICalendarSelectionSingleDateDelegate_Extensions.CanSelectDate(UIKit.IUICalendarSelectionSingleDateDelegate,UIKit.UICalendarSelectionSingleDate,Foundation.NSDateComponents) -M:UIKit.UICalendarSelectionSingleDateDelegate.CanSelectDate(UIKit.UICalendarSelectionSingleDate,Foundation.NSDateComponents) -M:UIKit.UICalendarSelectionSingleDateDelegate.DidSelectDate(UIKit.UICalendarSelectionSingleDate,Foundation.NSDateComponents) M:UIKit.UICalendarSelectionWeekOfYear.Dispose(System.Boolean) -M:UIKit.UICalendarSelectionWeekOfYearDelegate.CanSelectWeekOfYear(UIKit.UICalendarSelectionWeekOfYear,Foundation.NSDateComponents) -M:UIKit.UICalendarSelectionWeekOfYearDelegate.DidSelectWeekOfYear(UIKit.UICalendarSelectionWeekOfYear,Foundation.NSDateComponents) -M:UIKit.UICalendarView.#ctor(CoreGraphics.CGRect) M:UIKit.UICalendarView.Dispose(System.Boolean) M:UIKit.UICalendarView.UICalendarViewAppearance.#ctor(System.IntPtr) M:UIKit.UICalendarViewDelegate_Extensions.DidChangeVisibleDateComponents(UIKit.IUICalendarViewDelegate,UIKit.UICalendarView,Foundation.NSDateComponents) -M:UIKit.UICalendarViewDelegate.DidChangeVisibleDateComponents(UIKit.UICalendarView,Foundation.NSDateComponents) -M:UIKit.UICalendarViewDelegate.GetDecoration(UIKit.UICalendarView,Foundation.NSDateComponents) -M:UIKit.UICanvasFeedbackGenerator.GetFeedbackGenerator(UIKit.UIView) M:UIKit.UICellAccessory.Copy(Foundation.NSZone) M:UIKit.UICellAccessory.EncodeTo(Foundation.NSCoder) M:UIKit.UICellAccessory.GetPositionAfterAccessory(ObjCRuntime.Class) M:UIKit.UICellAccessory.GetPositionAfterAccessory(System.Type) M:UIKit.UICellAccessory.GetPositionBeforeAccessory(ObjCRuntime.Class) M:UIKit.UICellAccessory.GetPositionBeforeAccessory(System.Type) -M:UIKit.UICellConfigurationState.#ctor(UIKit.UITraitCollection) -M:UIKit.UICloudSharingController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UICloudSharingController.Dispose(System.Boolean) M:UIKit.UICloudSharingControllerDelegate_Extensions.DidSaveShare(UIKit.IUICloudSharingControllerDelegate,UIKit.UICloudSharingController) M:UIKit.UICloudSharingControllerDelegate_Extensions.DidStopSharing(UIKit.IUICloudSharingControllerDelegate,UIKit.UICloudSharingController) M:UIKit.UICloudSharingControllerDelegate_Extensions.GetItemThumbnailData(UIKit.IUICloudSharingControllerDelegate,UIKit.UICloudSharingController) M:UIKit.UICloudSharingControllerDelegate_Extensions.GetItemType(UIKit.IUICloudSharingControllerDelegate,UIKit.UICloudSharingController) -M:UIKit.UICloudSharingControllerDelegate.DidSaveShare(UIKit.UICloudSharingController) -M:UIKit.UICloudSharingControllerDelegate.DidStopSharing(UIKit.UICloudSharingController) -M:UIKit.UICloudSharingControllerDelegate.FailedToSaveShare(UIKit.UICloudSharingController,Foundation.NSError) -M:UIKit.UICloudSharingControllerDelegate.GetItemThumbnailData(UIKit.UICloudSharingController) -M:UIKit.UICloudSharingControllerDelegate.GetItemTitle(UIKit.UICloudSharingController) -M:UIKit.UICloudSharingControllerDelegate.GetItemType(UIKit.UICloudSharingController) M:UIKit.UICollectionLayoutListConfiguration.Copy(Foundation.NSZone) M:UIKit.UICollectionLayoutListConfiguration.Dispose(System.Boolean) M:UIKit.UICollectionLayoutSectionOrthogonalScrollingProperties.Copy(Foundation.NSZone) -M:UIKit.UICollectionReusableView.#ctor(CoreGraphics.CGRect) M:UIKit.UICollectionReusableView.UICollectionReusableViewAppearance.#ctor(System.IntPtr) M:UIKit.UICollectionView.DequeueReusableCell(System.String,Foundation.NSIndexPath) M:UIKit.UICollectionView.DequeueReusableSupplementaryView(Foundation.NSString,System.String,Foundation.NSIndexPath) @@ -49838,12 +45547,7 @@ M:UIKit.UICollectionView.DequeueReusableSupplementaryView(UIKit.UICollectionElem M:UIKit.UICollectionView.DequeueReusableSupplementaryView(UIKit.UICollectionElementKindSection,System.String,Foundation.NSIndexPath) M:UIKit.UICollectionView.Dispose(System.Boolean) M:UIKit.UICollectionView.EncodeTo(Foundation.NSCoder) -M:UIKit.UICollectionView.GetDataSourceIndexPath(Foundation.NSIndexPath) -M:UIKit.UICollectionView.GetDataSourceSectionIndex(System.IntPtr) -M:UIKit.UICollectionView.GetPresentationIndexPath(Foundation.NSIndexPath) -M:UIKit.UICollectionView.GetPresentationSectionIndex(System.IntPtr) M:UIKit.UICollectionView.PerformBatchUpdatesAsync(System.Action) -M:UIKit.UICollectionView.PerformUsingPresentationValues(System.Action) M:UIKit.UICollectionView.RegisterClassForCell(System.Type,Foundation.NSString) M:UIKit.UICollectionView.RegisterClassForCell(System.Type,System.String) M:UIKit.UICollectionView.RegisterClassForSupplementaryView(System.Type,Foundation.NSString,Foundation.NSString) @@ -49857,87 +45561,16 @@ M:UIKit.UICollectionView.SetCollectionViewLayoutAsync(UIKit.UICollectionViewLayo M:UIKit.UICollectionView.StartInteractiveTransitionAsync(UIKit.UICollectionViewLayout,UIKit.UICollectionViewTransitionLayout@) M:UIKit.UICollectionView.StartInteractiveTransitionAsync(UIKit.UICollectionViewLayout) M:UIKit.UICollectionView.UICollectionViewAppearance.#ctor(System.IntPtr) -M:UIKit.UICollectionViewCell.#ctor(CoreGraphics.CGRect) M:UIKit.UICollectionViewCell.UICollectionViewCellAppearance.#ctor(System.IntPtr) M:UIKit.UICollectionViewCellRegistration.GetRegistration(System.Type,UIKit.UICollectionViewCellRegistrationConfigurationHandler) M:UIKit.UICollectionViewCompositionalLayoutConfiguration.Copy(Foundation.NSZone) -M:UIKit.UICollectionViewController.CanEditItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.CanFocusItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.CanMoveItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.CanPerformAction(UIKit.UICollectionView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UICollectionViewController.CanPerformPrimaryActionForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.CellDisplayingEnded(UIKit.UICollectionView,UIKit.UICollectionViewCell,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.DecelerationEnded(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.DecelerationStarted(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.DidBeginMultipleSelectionInteraction(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.DidChangeAdjustedContentInset(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.DidEndMultipleSelectionInteraction(UIKit.UICollectionView) -M:UIKit.UICollectionViewController.DidUpdateFocus(UIKit.UICollectionView,UIKit.UICollectionViewFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) -M:UIKit.UICollectionViewController.DidZoom(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.DraggingEnded(UIKit.UIScrollView,System.Boolean) -M:UIKit.UICollectionViewController.DraggingStarted(UIKit.UIScrollView) M:UIKit.UICollectionViewController.EncodeTo(Foundation.NSCoder) -M:UIKit.UICollectionViewController.GetCell(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.GetContextMenuConfiguration(UIKit.UICollectionView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewController.GetContextMenuConfiguration(UIKit.UICollectionView,Foundation.NSIndexPath[],CoreGraphics.CGPoint) -M:UIKit.UICollectionViewController.GetContextMenuConfigurationDismissalPreview(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.GetContextMenuConfigurationHighlightPreview(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.GetIndexPath(UIKit.UICollectionView,System.String,System.IntPtr) -M:UIKit.UICollectionViewController.GetIndexPathForPreferredFocusedView(UIKit.UICollectionView) -M:UIKit.UICollectionViewController.GetIndexTitles(UIKit.UICollectionView) -M:UIKit.UICollectionViewController.GetItemsCount(UIKit.UICollectionView,System.IntPtr) -M:UIKit.UICollectionViewController.GetPreviewForDismissingContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration) -M:UIKit.UICollectionViewController.GetPreviewForHighlightingContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration) -M:UIKit.UICollectionViewController.GetSceneActivationConfigurationForItem(UIKit.UICollectionView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewController.GetSelectionFollowsFocusForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.GetTargetContentOffset(UIKit.UICollectionView,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewController.GetTargetIndexPathForMove(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.GetTargetIndexPathForMoveOfItemFromOriginalIndexPath(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.GetViewForSupplementaryElement(UIKit.UICollectionView,Foundation.NSString,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ItemDeselected(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ItemHighlighted(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ItemSelected(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ItemUnhighlighted(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.MoveItem(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.NumberOfSections(UIKit.UICollectionView) -M:UIKit.UICollectionViewController.PerformAction(UIKit.UICollectionView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UICollectionViewController.PerformPrimaryActionForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ScrollAnimationEnded(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.Scrolled(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.ScrolledToTop(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.ShouldBeginMultipleSelectionInteraction(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ShouldDeselectItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ShouldHighlightItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ShouldScrollToTop(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.ShouldSelectItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ShouldShowMenu(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.ShouldSpringLoadItem(UIKit.UICollectionView,Foundation.NSIndexPath,UIKit.IUISpringLoadedInteractionContext) -M:UIKit.UICollectionViewController.ShouldUpdateFocus(UIKit.UICollectionView,UIKit.UICollectionViewFocusUpdateContext) -M:UIKit.UICollectionViewController.SupplementaryViewDisplayingEnded(UIKit.UICollectionView,UIKit.UICollectionReusableView,Foundation.NSString,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.TransitionLayout(UIKit.UICollectionView,UIKit.UICollectionViewLayout,UIKit.UICollectionViewLayout) -M:UIKit.UICollectionViewController.ViewForZoomingInScrollView(UIKit.UIScrollView) -M:UIKit.UICollectionViewController.WillDisplayCell(UIKit.UICollectionView,UIKit.UICollectionViewCell,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.WillDisplayContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UICollectionViewController.WillDisplaySupplementaryView(UIKit.UICollectionView,UIKit.UICollectionReusableView,System.String,Foundation.NSIndexPath) -M:UIKit.UICollectionViewController.WillEndContextMenuInteraction(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UICollectionViewController.WillEndDragging(UIKit.UIScrollView,CoreGraphics.CGPoint,CoreGraphics.CGPoint@) -M:UIKit.UICollectionViewController.WillPerformPreviewAction(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UICollectionViewController.ZoomingEnded(UIKit.UIScrollView,UIKit.UIView,System.Runtime.InteropServices.NFloat) -M:UIKit.UICollectionViewController.ZoomingStarted(UIKit.UIScrollView,UIKit.UIView) M:UIKit.UICollectionViewDataSource_Extensions.CanMoveItem(UIKit.IUICollectionViewDataSource,UIKit.UICollectionView,Foundation.NSIndexPath) M:UIKit.UICollectionViewDataSource_Extensions.GetIndexPath(UIKit.IUICollectionViewDataSource,UIKit.UICollectionView,System.String,System.IntPtr) M:UIKit.UICollectionViewDataSource_Extensions.GetIndexTitles(UIKit.IUICollectionViewDataSource,UIKit.UICollectionView) M:UIKit.UICollectionViewDataSource_Extensions.GetViewForSupplementaryElement(UIKit.IUICollectionViewDataSource,UIKit.UICollectionView,Foundation.NSString,Foundation.NSIndexPath) M:UIKit.UICollectionViewDataSource_Extensions.MoveItem(UIKit.IUICollectionViewDataSource,UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) M:UIKit.UICollectionViewDataSource_Extensions.NumberOfSections(UIKit.IUICollectionViewDataSource,UIKit.UICollectionView) -M:UIKit.UICollectionViewDataSource.CanMoveItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDataSource.GetCell(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDataSource.GetIndexPath(UIKit.UICollectionView,System.String,System.IntPtr) -M:UIKit.UICollectionViewDataSource.GetIndexTitles(UIKit.UICollectionView) -M:UIKit.UICollectionViewDataSource.GetItemsCount(UIKit.UICollectionView,System.IntPtr) -M:UIKit.UICollectionViewDataSource.GetViewForSupplementaryElement(UIKit.UICollectionView,Foundation.NSString,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDataSource.MoveItem(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDataSource.NumberOfSections(UIKit.UICollectionView) M:UIKit.UICollectionViewDataSourcePrefetching_Extensions.CancelPrefetching(UIKit.IUICollectionViewDataSourcePrefetching,UIKit.UICollectionView,Foundation.NSIndexPath[]) M:UIKit.UICollectionViewDelegate_Extensions.CanEditItem(UIKit.IUICollectionViewDelegate,UIKit.UICollectionView,Foundation.NSIndexPath) M:UIKit.UICollectionViewDelegate_Extensions.CanFocusItem(UIKit.IUICollectionViewDelegate,UIKit.UICollectionView,Foundation.NSIndexPath) @@ -49979,82 +45612,14 @@ M:UIKit.UICollectionViewDelegate_Extensions.WillDisplayContextMenu(UIKit.IUIColl M:UIKit.UICollectionViewDelegate_Extensions.WillDisplaySupplementaryView(UIKit.IUICollectionViewDelegate,UIKit.UICollectionView,UIKit.UICollectionReusableView,System.String,Foundation.NSIndexPath) M:UIKit.UICollectionViewDelegate_Extensions.WillEndContextMenuInteraction(UIKit.IUICollectionViewDelegate,UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) M:UIKit.UICollectionViewDelegate_Extensions.WillPerformPreviewAction(UIKit.IUICollectionViewDelegate,UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UICollectionViewDelegate.CanEditItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.CanFocusItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.CanPerformAction(UIKit.UICollectionView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UICollectionViewDelegate.CanPerformPrimaryActionForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.CellDisplayingEnded(UIKit.UICollectionView,UIKit.UICollectionViewCell,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.DecelerationEnded(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.DecelerationStarted(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.DidBeginMultipleSelectionInteraction(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.DidChangeAdjustedContentInset(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.DidEndMultipleSelectionInteraction(UIKit.UICollectionView) -M:UIKit.UICollectionViewDelegate.DidUpdateFocus(UIKit.UICollectionView,UIKit.UICollectionViewFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) -M:UIKit.UICollectionViewDelegate.DidZoom(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.DraggingEnded(UIKit.UIScrollView,System.Boolean) -M:UIKit.UICollectionViewDelegate.DraggingStarted(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.GetContextMenuConfiguration(UIKit.UICollectionView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewDelegate.GetContextMenuConfiguration(UIKit.UICollectionView,Foundation.NSIndexPath[],CoreGraphics.CGPoint) -M:UIKit.UICollectionViewDelegate.GetContextMenuConfigurationDismissalPreview(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.GetContextMenuConfigurationHighlightPreview(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.GetIndexPathForPreferredFocusedView(UIKit.UICollectionView) -M:UIKit.UICollectionViewDelegate.GetPreviewForDismissingContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration) -M:UIKit.UICollectionViewDelegate.GetPreviewForHighlightingContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration) -M:UIKit.UICollectionViewDelegate.GetSceneActivationConfigurationForItem(UIKit.UICollectionView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewDelegate.GetSelectionFollowsFocusForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.GetTargetContentOffset(UIKit.UICollectionView,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewDelegate.GetTargetIndexPathForMove(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.GetTargetIndexPathForMoveOfItemFromOriginalIndexPath(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ItemDeselected(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ItemHighlighted(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ItemSelected(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ItemUnhighlighted(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.PerformAction(UIKit.UICollectionView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UICollectionViewDelegate.PerformPrimaryActionForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ScrollAnimationEnded(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.Scrolled(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.ScrolledToTop(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.ShouldBeginMultipleSelectionInteraction(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ShouldDeselectItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ShouldHighlightItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ShouldScrollToTop(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.ShouldSelectItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ShouldShowMenu(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.ShouldSpringLoadItem(UIKit.UICollectionView,Foundation.NSIndexPath,UIKit.IUISpringLoadedInteractionContext) -M:UIKit.UICollectionViewDelegate.ShouldUpdateFocus(UIKit.UICollectionView,UIKit.UICollectionViewFocusUpdateContext) -M:UIKit.UICollectionViewDelegate.SupplementaryViewDisplayingEnded(UIKit.UICollectionView,UIKit.UICollectionReusableView,Foundation.NSString,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.TransitionLayout(UIKit.UICollectionView,UIKit.UICollectionViewLayout,UIKit.UICollectionViewLayout) -M:UIKit.UICollectionViewDelegate.ViewForZoomingInScrollView(UIKit.UIScrollView) -M:UIKit.UICollectionViewDelegate.WillDisplayCell(UIKit.UICollectionView,UIKit.UICollectionViewCell,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.WillDisplayContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UICollectionViewDelegate.WillDisplaySupplementaryView(UIKit.UICollectionView,UIKit.UICollectionReusableView,System.String,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegate.WillEndContextMenuInteraction(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UICollectionViewDelegate.WillEndDragging(UIKit.UIScrollView,CoreGraphics.CGPoint,CoreGraphics.CGPoint@) -M:UIKit.UICollectionViewDelegate.WillPerformPreviewAction(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UICollectionViewDelegate.ZoomingEnded(UIKit.UIScrollView,UIKit.UIView,System.Runtime.InteropServices.NFloat) -M:UIKit.UICollectionViewDelegate.ZoomingStarted(UIKit.UIScrollView,UIKit.UIView) M:UIKit.UICollectionViewDelegateFlowLayout_Extensions.GetInsetForSection(UIKit.IUICollectionViewDelegateFlowLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) M:UIKit.UICollectionViewDelegateFlowLayout_Extensions.GetMinimumInteritemSpacingForSection(UIKit.IUICollectionViewDelegateFlowLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) M:UIKit.UICollectionViewDelegateFlowLayout_Extensions.GetMinimumLineSpacingForSection(UIKit.IUICollectionViewDelegateFlowLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) M:UIKit.UICollectionViewDelegateFlowLayout_Extensions.GetReferenceSizeForFooter(UIKit.IUICollectionViewDelegateFlowLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) M:UIKit.UICollectionViewDelegateFlowLayout_Extensions.GetReferenceSizeForHeader(UIKit.IUICollectionViewDelegateFlowLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) M:UIKit.UICollectionViewDelegateFlowLayout_Extensions.GetSizeForItem(UIKit.IUICollectionViewDelegateFlowLayout,UIKit.UICollectionView,UIKit.UICollectionViewLayout,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDelegateFlowLayout.GetInsetForSection(UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) -M:UIKit.UICollectionViewDelegateFlowLayout.GetMinimumInteritemSpacingForSection(UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) -M:UIKit.UICollectionViewDelegateFlowLayout.GetMinimumLineSpacingForSection(UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) -M:UIKit.UICollectionViewDelegateFlowLayout.GetReferenceSizeForFooter(UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) -M:UIKit.UICollectionViewDelegateFlowLayout.GetReferenceSizeForHeader(UIKit.UICollectionView,UIKit.UICollectionViewLayout,System.IntPtr) -M:UIKit.UICollectionViewDelegateFlowLayout.GetSizeForItem(UIKit.UICollectionView,UIKit.UICollectionViewLayout,Foundation.NSIndexPath) M:UIKit.UICollectionViewDiffableDataSource`2.ApplySnapshotAsync(UIKit.NSDiffableDataSourceSnapshot{`0,`1},System.Boolean) M:UIKit.UICollectionViewDiffableDataSource`2.ApplySnapshotUsingReloadDataAsync(UIKit.NSDiffableDataSourceSnapshot{`0,`1}) -M:UIKit.UICollectionViewDiffableDataSource`2.CanMoveItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDiffableDataSource`2.GetCell(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDiffableDataSource`2.GetIndexPath(UIKit.UICollectionView,System.String,System.IntPtr) -M:UIKit.UICollectionViewDiffableDataSource`2.GetIndexTitles(UIKit.UICollectionView) -M:UIKit.UICollectionViewDiffableDataSource`2.GetItemsCount(UIKit.UICollectionView,System.IntPtr) -M:UIKit.UICollectionViewDiffableDataSource`2.GetViewForSupplementaryElement(UIKit.UICollectionView,Foundation.NSString,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDiffableDataSource`2.MoveItem(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDiffableDataSource`2.NumberOfSections(UIKit.UICollectionView) M:UIKit.UICollectionViewDiffableDataSourceReorderingHandlers`2.Copy(Foundation.NSZone) M:UIKit.UICollectionViewDiffableDataSourceSectionSnapshotHandlers`1.Copy(Foundation.NSZone) M:UIKit.UICollectionViewDragDelegate_Extensions.DragSessionAllowsMoveOperation(UIKit.IUICollectionViewDragDelegate,UIKit.UICollectionView,UIKit.IUIDragSession) @@ -50063,28 +45628,12 @@ M:UIKit.UICollectionViewDragDelegate_Extensions.DragSessionIsRestrictedToDraggin M:UIKit.UICollectionViewDragDelegate_Extensions.DragSessionWillBegin(UIKit.IUICollectionViewDragDelegate,UIKit.UICollectionView,UIKit.IUIDragSession) M:UIKit.UICollectionViewDragDelegate_Extensions.GetDragPreviewParameters(UIKit.IUICollectionViewDragDelegate,UIKit.UICollectionView,Foundation.NSIndexPath) M:UIKit.UICollectionViewDragDelegate_Extensions.GetItemsForAddingToDragSession(UIKit.IUICollectionViewDragDelegate,UIKit.UICollectionView,UIKit.IUIDragSession,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewDragDelegate.DragSessionAllowsMoveOperation(UIKit.UICollectionView,UIKit.IUIDragSession) -M:UIKit.UICollectionViewDragDelegate.DragSessionDidEnd(UIKit.UICollectionView,UIKit.IUIDragSession) -M:UIKit.UICollectionViewDragDelegate.DragSessionIsRestrictedToDraggingApplication(UIKit.UICollectionView,UIKit.IUIDragSession) -M:UIKit.UICollectionViewDragDelegate.DragSessionWillBegin(UIKit.UICollectionView,UIKit.IUIDragSession) -M:UIKit.UICollectionViewDragDelegate.GetDragPreviewParameters(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDragDelegate.GetItemsForAddingToDragSession(UIKit.UICollectionView,UIKit.IUIDragSession,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewDragDelegate.GetItemsForBeginningDragSession(UIKit.UICollectionView,UIKit.IUIDragSession,Foundation.NSIndexPath) M:UIKit.UICollectionViewDropDelegate_Extensions.CanHandleDropSession(UIKit.IUICollectionViewDropDelegate,UIKit.UICollectionView,UIKit.IUIDropSession) M:UIKit.UICollectionViewDropDelegate_Extensions.DropSessionDidEnd(UIKit.IUICollectionViewDropDelegate,UIKit.UICollectionView,UIKit.IUIDropSession) M:UIKit.UICollectionViewDropDelegate_Extensions.DropSessionDidEnter(UIKit.IUICollectionViewDropDelegate,UIKit.UICollectionView,UIKit.IUIDropSession) M:UIKit.UICollectionViewDropDelegate_Extensions.DropSessionDidExit(UIKit.IUICollectionViewDropDelegate,UIKit.UICollectionView,UIKit.IUIDropSession) M:UIKit.UICollectionViewDropDelegate_Extensions.DropSessionDidUpdate(UIKit.IUICollectionViewDropDelegate,UIKit.UICollectionView,UIKit.IUIDropSession,Foundation.NSIndexPath) M:UIKit.UICollectionViewDropDelegate_Extensions.GetDropPreviewParameters(UIKit.IUICollectionViewDropDelegate,UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDropDelegate.CanHandleDropSession(UIKit.UICollectionView,UIKit.IUIDropSession) -M:UIKit.UICollectionViewDropDelegate.DropSessionDidEnd(UIKit.UICollectionView,UIKit.IUIDropSession) -M:UIKit.UICollectionViewDropDelegate.DropSessionDidEnter(UIKit.UICollectionView,UIKit.IUIDropSession) -M:UIKit.UICollectionViewDropDelegate.DropSessionDidExit(UIKit.UICollectionView,UIKit.IUIDropSession) -M:UIKit.UICollectionViewDropDelegate.DropSessionDidUpdate(UIKit.UICollectionView,UIKit.IUIDropSession,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDropDelegate.GetDropPreviewParameters(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewDropDelegate.PerformDrop(UIKit.UICollectionView,UIKit.IUICollectionViewDropCoordinator) -M:UIKit.UICollectionViewDropPlaceholder.#ctor(Foundation.NSIndexPath,System.String) -M:UIKit.UICollectionViewDropProposal.#ctor(UIKit.UIDropOperation) M:UIKit.UICollectionViewLayout.EncodeTo(Foundation.NSCoder) M:UIKit.UICollectionViewLayout.LayoutAttributesForSupplementaryView(UIKit.UICollectionElementKindSection,Foundation.NSIndexPath) M:UIKit.UICollectionViewLayout.RegisterClassForDecorationView(System.Type,Foundation.NSString) @@ -50094,70 +45643,7 @@ M:UIKit.UICollectionViewLayoutAttributes.CreateForDecorationView``1(Foundation.N M:UIKit.UICollectionViewLayoutAttributes.CreateForSupplementaryView(UIKit.UICollectionElementKindSection,Foundation.NSIndexPath) M:UIKit.UICollectionViewLayoutAttributes.CreateForSupplementaryView``1(Foundation.NSString,Foundation.NSIndexPath) M:UIKit.UICollectionViewLayoutAttributes.CreateForSupplementaryView``1(UIKit.UICollectionElementKindSection,Foundation.NSIndexPath) -M:UIKit.UICollectionViewListCell.#ctor(CoreGraphics.CGRect) M:UIKit.UICollectionViewListCell.UICollectionViewListCellAppearance.#ctor(System.IntPtr) -M:UIKit.UICollectionViewSource.CanEditItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.CanFocusItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.CanMoveItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.CanPerformAction(UIKit.UICollectionView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UICollectionViewSource.CanPerformPrimaryActionForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.CellDisplayingEnded(UIKit.UICollectionView,UIKit.UICollectionViewCell,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.DecelerationEnded(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.DecelerationStarted(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.DidBeginMultipleSelectionInteraction(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.DidChangeAdjustedContentInset(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.DidEndMultipleSelectionInteraction(UIKit.UICollectionView) -M:UIKit.UICollectionViewSource.DidUpdateFocus(UIKit.UICollectionView,UIKit.UICollectionViewFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) -M:UIKit.UICollectionViewSource.DidZoom(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.DraggingEnded(UIKit.UIScrollView,System.Boolean) -M:UIKit.UICollectionViewSource.DraggingStarted(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.GetCell(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.GetContextMenuConfiguration(UIKit.UICollectionView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewSource.GetContextMenuConfiguration(UIKit.UICollectionView,Foundation.NSIndexPath[],CoreGraphics.CGPoint) -M:UIKit.UICollectionViewSource.GetContextMenuConfigurationDismissalPreview(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.GetContextMenuConfigurationHighlightPreview(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.GetIndexPath(UIKit.UICollectionView,System.String,System.IntPtr) -M:UIKit.UICollectionViewSource.GetIndexPathForPreferredFocusedView(UIKit.UICollectionView) -M:UIKit.UICollectionViewSource.GetIndexTitles(UIKit.UICollectionView) -M:UIKit.UICollectionViewSource.GetItemsCount(UIKit.UICollectionView,System.IntPtr) -M:UIKit.UICollectionViewSource.GetPreviewForDismissingContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration) -M:UIKit.UICollectionViewSource.GetPreviewForHighlightingContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration) -M:UIKit.UICollectionViewSource.GetSceneActivationConfigurationForItem(UIKit.UICollectionView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewSource.GetSelectionFollowsFocusForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.GetTargetContentOffset(UIKit.UICollectionView,CoreGraphics.CGPoint) -M:UIKit.UICollectionViewSource.GetTargetIndexPathForMove(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.GetTargetIndexPathForMoveOfItemFromOriginalIndexPath(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.GetViewForSupplementaryElement(UIKit.UICollectionView,Foundation.NSString,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ItemDeselected(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ItemHighlighted(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ItemSelected(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ItemUnhighlighted(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.MoveItem(UIKit.UICollectionView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.NumberOfSections(UIKit.UICollectionView) -M:UIKit.UICollectionViewSource.PerformAction(UIKit.UICollectionView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UICollectionViewSource.PerformPrimaryActionForItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ScrollAnimationEnded(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.Scrolled(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.ScrolledToTop(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.ShouldBeginMultipleSelectionInteraction(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ShouldDeselectItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ShouldHighlightItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ShouldScrollToTop(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.ShouldSelectItem(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ShouldShowMenu(UIKit.UICollectionView,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.ShouldSpringLoadItem(UIKit.UICollectionView,Foundation.NSIndexPath,UIKit.IUISpringLoadedInteractionContext) -M:UIKit.UICollectionViewSource.ShouldUpdateFocus(UIKit.UICollectionView,UIKit.UICollectionViewFocusUpdateContext) -M:UIKit.UICollectionViewSource.SupplementaryViewDisplayingEnded(UIKit.UICollectionView,UIKit.UICollectionReusableView,Foundation.NSString,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.TransitionLayout(UIKit.UICollectionView,UIKit.UICollectionViewLayout,UIKit.UICollectionViewLayout) -M:UIKit.UICollectionViewSource.ViewForZoomingInScrollView(UIKit.UIScrollView) -M:UIKit.UICollectionViewSource.WillDisplayCell(UIKit.UICollectionView,UIKit.UICollectionViewCell,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.WillDisplayContextMenu(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UICollectionViewSource.WillDisplaySupplementaryView(UIKit.UICollectionView,UIKit.UICollectionReusableView,System.String,Foundation.NSIndexPath) -M:UIKit.UICollectionViewSource.WillEndContextMenuInteraction(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UICollectionViewSource.WillEndDragging(UIKit.UIScrollView,CoreGraphics.CGPoint,CoreGraphics.CGPoint@) -M:UIKit.UICollectionViewSource.WillPerformPreviewAction(UIKit.UICollectionView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UICollectionViewSource.ZoomingEnded(UIKit.UIScrollView,UIKit.UIView,System.Runtime.InteropServices.NFloat) -M:UIKit.UICollectionViewSource.ZoomingStarted(UIKit.UIScrollView,UIKit.UIView) M:UIKit.UICollectionViewSupplementaryRegistration.GetRegistration(System.Type,System.String,UIKit.UICollectionViewSupplementaryRegistrationConfigurationHandler) M:UIKit.UICollectionViewTransitionLayout.EncodeTo(Foundation.NSCoder) M:UIKit.UICollectionViewTransitionResult.#ctor(System.Boolean,System.Boolean) @@ -50176,10 +45662,6 @@ M:UIKit.UICollisionBehaviorDelegate_Extensions.BeganBoundaryContact(UIKit.IUICol M:UIKit.UICollisionBehaviorDelegate_Extensions.BeganContact(UIKit.IUICollisionBehaviorDelegate,UIKit.UICollisionBehavior,UIKit.IUIDynamicItem,UIKit.IUIDynamicItem,CoreGraphics.CGPoint) M:UIKit.UICollisionBehaviorDelegate_Extensions.EndedBoundaryContact(UIKit.IUICollisionBehaviorDelegate,UIKit.UICollisionBehavior,UIKit.IUIDynamicItem,Foundation.NSObject) M:UIKit.UICollisionBehaviorDelegate_Extensions.EndedContact(UIKit.IUICollisionBehaviorDelegate,UIKit.UICollisionBehavior,UIKit.IUIDynamicItem,UIKit.IUIDynamicItem) -M:UIKit.UICollisionBehaviorDelegate.BeganBoundaryContact(UIKit.UICollisionBehavior,UIKit.IUIDynamicItem,Foundation.NSObject,CoreGraphics.CGPoint) -M:UIKit.UICollisionBehaviorDelegate.BeganContact(UIKit.UICollisionBehavior,UIKit.IUIDynamicItem,UIKit.IUIDynamicItem,CoreGraphics.CGPoint) -M:UIKit.UICollisionBehaviorDelegate.EndedBoundaryContact(UIKit.UICollisionBehavior,UIKit.IUIDynamicItem,Foundation.NSObject) -M:UIKit.UICollisionBehaviorDelegate.EndedContact(UIKit.UICollisionBehavior,UIKit.IUIDynamicItem,UIKit.IUIDynamicItem) M:UIKit.UICollisionEndedBoundaryContactEventArgs.#ctor(UIKit.IUIDynamicItem,Foundation.NSObject) M:UIKit.UICollisionEndedContactEventArgs.#ctor(UIKit.IUIDynamicItem,UIKit.IUIDynamicItem) M:UIKit.UIColor.Copy(Foundation.NSZone) @@ -50198,24 +45680,13 @@ M:UIKit.UIColor.LoadData(System.String,System.Action{Foundation.NSData,Foundatio M:UIKit.UIColor.LoadDataAsync(System.String,Foundation.NSProgress@) M:UIKit.UIColor.LoadDataAsync(System.String) M:UIKit.UIColor.ToString -M:UIKit.UIColorPickerViewController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UIColorPickerViewController.Dispose(System.Boolean) M:UIKit.UIColorPickerViewControllerDelegate_Extensions.DidFinish(UIKit.IUIColorPickerViewControllerDelegate,UIKit.UIColorPickerViewController) M:UIKit.UIColorPickerViewControllerDelegate_Extensions.DidSelectColor(UIKit.IUIColorPickerViewControllerDelegate,UIKit.UIColorPickerViewController,UIKit.UIColor,System.Boolean) M:UIKit.UIColorPickerViewControllerDelegate_Extensions.DidSelectColor(UIKit.IUIColorPickerViewControllerDelegate,UIKit.UIColorPickerViewController) -M:UIKit.UIColorPickerViewControllerDelegate.DidFinish(UIKit.UIColorPickerViewController) -M:UIKit.UIColorPickerViewControllerDelegate.DidSelectColor(UIKit.UIColorPickerViewController,UIKit.UIColor,System.Boolean) -M:UIKit.UIColorPickerViewControllerDelegate.DidSelectColor(UIKit.UIColorPickerViewController) -M:UIKit.UIColorWell.#ctor(CoreGraphics.CGRect) M:UIKit.UIColorWell.UIColorWellAppearance.#ctor(System.IntPtr) -M:UIKit.UICommand.Target(Foundation.NSObject,Foundation.NSObject) M:UIKit.UICommandAlternate.Copy(Foundation.NSZone) M:UIKit.UICommandAlternate.EncodeTo(Foundation.NSCoder) -M:UIKit.UIContentContainer.GetSizeForChildContentContainer(UIKit.IUIContentContainer,CoreGraphics.CGSize) -M:UIKit.UIContentContainer.PreferredContentSizeDidChangeForChildContentContainer(UIKit.IUIContentContainer) -M:UIKit.UIContentContainer.SystemLayoutFittingSizeDidChangeForChildContentContainer(UIKit.IUIContentContainer) -M:UIKit.UIContentContainer.ViewWillTransitionToSize(CoreGraphics.CGSize,UIKit.IUIViewControllerTransitionCoordinator) -M:UIKit.UIContentContainer.WillTransitionToTraitCollection(UIKit.UITraitCollection,UIKit.IUIViewControllerTransitionCoordinator) M:UIKit.UIContentSizeCategoryChangedEventArgs.#ctor(Foundation.NSNotification) M:UIKit.UIContentSizeCategoryExtensions.Compare(UIKit.UIContentSizeCategory,UIKit.UIContentSizeCategory) M:UIKit.UIContentSizeCategoryExtensions.IsAccessibilityCategory(UIKit.UIContentSizeCategory) @@ -50223,24 +45694,15 @@ M:UIKit.UIContentUnavailableButtonProperties.Copy(Foundation.NSZone) M:UIKit.UIContentUnavailableButtonProperties.EncodeTo(Foundation.NSCoder) M:UIKit.UIContentUnavailableConfiguration.Copy(Foundation.NSZone) M:UIKit.UIContentUnavailableConfiguration.EncodeTo(Foundation.NSCoder) -M:UIKit.UIContentUnavailableConfiguration.GetUpdatedConfiguration(UIKit.IUIConfigurationState) -M:UIKit.UIContentUnavailableConfiguration.MakeContentView M:UIKit.UIContentUnavailableConfigurationState.Copy(Foundation.NSZone) M:UIKit.UIContentUnavailableConfigurationState.EncodeTo(Foundation.NSCoder) -M:UIKit.UIContentUnavailableConfigurationState.GetCustomState(System.String) -M:UIKit.UIContentUnavailableConfigurationState.GetObject(System.String) -M:UIKit.UIContentUnavailableConfigurationState.SetCustomState(Foundation.NSObject,System.String) -M:UIKit.UIContentUnavailableConfigurationState.SetObject(Foundation.NSObject,System.String) M:UIKit.UIContentUnavailableImageProperties.Copy(Foundation.NSZone) M:UIKit.UIContentUnavailableImageProperties.EncodeTo(Foundation.NSCoder) M:UIKit.UIContentUnavailableTextProperties.Copy(Foundation.NSZone) M:UIKit.UIContentUnavailableTextProperties.EncodeTo(Foundation.NSCoder) -M:UIKit.UIContentUnavailableView.SupportsConfiguration(UIKit.IUIContentConfiguration) M:UIKit.UIContentUnavailableView.UIContentUnavailableViewAppearance.#ctor(System.IntPtr) M:UIKit.UIContentView_Extensions.SupportsConfiguration(UIKit.IUIContentView,UIKit.IUIContentConfiguration) -M:UIKit.UIContextMenuInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIContextMenuInteraction.Dispose(System.Boolean) -M:UIKit.UIContextMenuInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIContextMenuInteractionDelegate_Extensions.GetDismissalPreview(UIKit.IUIContextMenuInteractionDelegate,UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,Foundation.INSCopying) M:UIKit.UIContextMenuInteractionDelegate_Extensions.GetHighlightPreview(UIKit.IUIContextMenuInteractionDelegate,UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,Foundation.INSCopying) M:UIKit.UIContextMenuInteractionDelegate_Extensions.GetPreviewForDismissingMenu(UIKit.IUIContextMenuInteractionDelegate,UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration) @@ -50248,14 +45710,6 @@ M:UIKit.UIContextMenuInteractionDelegate_Extensions.GetPreviewForHighlightingMen M:UIKit.UIContextMenuInteractionDelegate_Extensions.WillDisplayMenu(UIKit.IUIContextMenuInteractionDelegate,UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) M:UIKit.UIContextMenuInteractionDelegate_Extensions.WillEnd(UIKit.IUIContextMenuInteractionDelegate,UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) M:UIKit.UIContextMenuInteractionDelegate_Extensions.WillPerformPreviewAction(UIKit.IUIContextMenuInteractionDelegate,UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UIContextMenuInteractionDelegate.GetConfigurationForMenu(UIKit.UIContextMenuInteraction,CoreGraphics.CGPoint) -M:UIKit.UIContextMenuInteractionDelegate.GetDismissalPreview(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,Foundation.INSCopying) -M:UIKit.UIContextMenuInteractionDelegate.GetHighlightPreview(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,Foundation.INSCopying) -M:UIKit.UIContextMenuInteractionDelegate.GetPreviewForDismissingMenu(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration) -M:UIKit.UIContextMenuInteractionDelegate.GetPreviewForHighlightingMenu(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration) -M:UIKit.UIContextMenuInteractionDelegate.WillDisplayMenu(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UIContextMenuInteractionDelegate.WillEnd(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UIContextMenuInteractionDelegate.WillPerformPreviewAction(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) M:UIKit.UIControl.add_AllEditingEvents(System.EventHandler) M:UIKit.UIControl.add_AllEvents(System.EventHandler) M:UIKit.UIControl.add_AllTouchEvents(System.EventHandler) @@ -50275,8 +45729,6 @@ M:UIKit.UIControl.add_TouchUpInside(System.EventHandler) M:UIKit.UIControl.add_TouchUpOutside(System.EventHandler) M:UIKit.UIControl.add_ValueChanged(System.EventHandler) M:UIKit.UIControl.AddTarget(System.EventHandler,UIKit.UIControlEvent) -M:UIKit.UIControl.GetDismissalPreview(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,Foundation.INSCopying) -M:UIKit.UIControl.GetHighlightPreview(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,Foundation.INSCopying) M:UIKit.UIControl.remove_AllEditingEvents(System.EventHandler) M:UIKit.UIControl.remove_AllEvents(System.EventHandler) M:UIKit.UIControl.remove_AllTouchEvents(System.EventHandler) @@ -50297,14 +45749,8 @@ M:UIKit.UIControl.remove_TouchUpOutside(System.EventHandler) M:UIKit.UIControl.remove_ValueChanged(System.EventHandler) M:UIKit.UIControl.RemoveTarget(System.EventHandler,UIKit.UIControlEvent) M:UIKit.UIControl.UIControlAppearance.#ctor(System.IntPtr) -M:UIKit.UIControl.WillPerformPreviewAction(UIKit.UIContextMenuInteraction,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UICoordinateSpace.ConvertPointFromCoordinateSpace(CoreGraphics.CGPoint,UIKit.IUICoordinateSpace) -M:UIKit.UICoordinateSpace.ConvertPointToCoordinateSpace(CoreGraphics.CGPoint,UIKit.IUICoordinateSpace) -M:UIKit.UICoordinateSpace.ConvertRectFromCoordinateSpace(CoreGraphics.CGRect,UIKit.IUICoordinateSpace) -M:UIKit.UICoordinateSpace.ConvertRectToCoordinateSpace(CoreGraphics.CGRect,UIKit.IUICoordinateSpace) M:UIKit.UICubicTimingParameters.Copy(Foundation.NSZone) M:UIKit.UICubicTimingParameters.EncodeTo(Foundation.NSCoder) -M:UIKit.UIDatePicker.#ctor(CoreGraphics.CGRect) M:UIKit.UIDatePicker.UIDatePickerAppearance.#ctor(System.IntPtr) M:UIKit.UIDevice.CheckSystemVersion(System.Int32,System.Int32) M:UIKit.UIDeviceOrientationExtensions.IsFlat(UIKit.UIDeviceOrientation) @@ -50334,11 +45780,7 @@ M:UIKit.UIDocument.RelinquishPresentedItemToWriter(Foundation.NSFilePresenterRea M:UIKit.UIDocument.RevertToContentsOfUrlAsync(Foundation.NSUrl) M:UIKit.UIDocument.SaveAsync(Foundation.NSUrl,UIKit.UIDocumentSaveOperation) M:UIKit.UIDocument.SavePresentedItemChanges(System.Action{Foundation.NSError}) -M:UIKit.UIDocumentBrowserTransitionController.AnimateTransition(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIDocumentBrowserTransitionController.AnimationEnded(System.Boolean) M:UIKit.UIDocumentBrowserTransitionController.Dispose(System.Boolean) -M:UIKit.UIDocumentBrowserTransitionController.GetInterruptibleAnimator(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIDocumentBrowserTransitionController.TransitionDuration(UIKit.IUIViewControllerContextTransitioning) M:UIKit.UIDocumentBrowserViewController.Dispose(System.Boolean) M:UIKit.UIDocumentBrowserViewController.EncodeTo(Foundation.NSCoder) M:UIKit.UIDocumentBrowserViewController.GetTransitionController(Foundation.NSUrl) @@ -50352,13 +45794,6 @@ M:UIKit.UIDocumentBrowserViewControllerDelegate_Extensions.DidRequestDocumentCre M:UIKit.UIDocumentBrowserViewControllerDelegate_Extensions.FailedToImportDocument(UIKit.IUIDocumentBrowserViewControllerDelegate,UIKit.UIDocumentBrowserViewController,Foundation.NSUrl,Foundation.NSError) M:UIKit.UIDocumentBrowserViewControllerDelegate_Extensions.GetApplicationActivities(UIKit.IUIDocumentBrowserViewControllerDelegate,UIKit.UIDocumentBrowserViewController,Foundation.NSUrl[]) M:UIKit.UIDocumentBrowserViewControllerDelegate_Extensions.WillPresent(UIKit.IUIDocumentBrowserViewControllerDelegate,UIKit.UIDocumentBrowserViewController,UIKit.UIActivityViewController) -M:UIKit.UIDocumentBrowserViewControllerDelegate.DidImportDocument(UIKit.UIDocumentBrowserViewController,Foundation.NSUrl,Foundation.NSUrl) -M:UIKit.UIDocumentBrowserViewControllerDelegate.DidPickDocumentsAtUrls(UIKit.UIDocumentBrowserViewController,Foundation.NSUrl[]) -M:UIKit.UIDocumentBrowserViewControllerDelegate.DidPickDocumentUrls(UIKit.UIDocumentBrowserViewController,Foundation.NSUrl[]) -M:UIKit.UIDocumentBrowserViewControllerDelegate.DidRequestDocumentCreation(UIKit.UIDocumentBrowserViewController,System.Action{Foundation.NSUrl,UIKit.UIDocumentBrowserImportMode}) -M:UIKit.UIDocumentBrowserViewControllerDelegate.FailedToImportDocument(UIKit.UIDocumentBrowserViewController,Foundation.NSUrl,Foundation.NSError) -M:UIKit.UIDocumentBrowserViewControllerDelegate.GetApplicationActivities(UIKit.UIDocumentBrowserViewController,Foundation.NSUrl[]) -M:UIKit.UIDocumentBrowserViewControllerDelegate.WillPresent(UIKit.UIDocumentBrowserViewController,UIKit.UIActivityViewController) M:UIKit.UIDocumentInteractionController.add_DidDismissOpenInMenu(System.EventHandler) M:UIKit.UIDocumentInteractionController.add_DidDismissOptionsMenu(System.EventHandler) M:UIKit.UIDocumentInteractionController.add_DidEndPreview(System.EventHandler) @@ -50389,22 +45824,7 @@ M:UIKit.UIDocumentInteractionControllerDelegate_Extensions.WillBeginPreview(UIKi M:UIKit.UIDocumentInteractionControllerDelegate_Extensions.WillBeginSendingToApplication(UIKit.IUIDocumentInteractionControllerDelegate,UIKit.UIDocumentInteractionController,System.String) M:UIKit.UIDocumentInteractionControllerDelegate_Extensions.WillPresentOpenInMenu(UIKit.IUIDocumentInteractionControllerDelegate,UIKit.UIDocumentInteractionController) M:UIKit.UIDocumentInteractionControllerDelegate_Extensions.WillPresentOptionsMenu(UIKit.IUIDocumentInteractionControllerDelegate,UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.CanPerformAction(UIKit.UIDocumentInteractionController,ObjCRuntime.Selector) -M:UIKit.UIDocumentInteractionControllerDelegate.DidDismissOpenInMenu(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.DidDismissOptionsMenu(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.DidEndPreview(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.DidEndSendingToApplication(UIKit.UIDocumentInteractionController,System.String) -M:UIKit.UIDocumentInteractionControllerDelegate.PerformAction(UIKit.UIDocumentInteractionController,ObjCRuntime.Selector) -M:UIKit.UIDocumentInteractionControllerDelegate.RectangleForPreview(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.ViewControllerForPreview(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.ViewForPreview(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.WillBeginPreview(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.WillBeginSendingToApplication(UIKit.UIDocumentInteractionController,System.String) -M:UIKit.UIDocumentInteractionControllerDelegate.WillPresentOpenInMenu(UIKit.UIDocumentInteractionController) -M:UIKit.UIDocumentInteractionControllerDelegate.WillPresentOptionsMenu(UIKit.UIDocumentInteractionController) M:UIKit.UIDocumentMenuDelegate_Extensions.WasCancelled(UIKit.IUIDocumentMenuDelegate,UIKit.UIDocumentMenuViewController) -M:UIKit.UIDocumentMenuDelegate.DidPickDocumentPicker(UIKit.UIDocumentMenuViewController,UIKit.UIDocumentPickerViewController) -M:UIKit.UIDocumentMenuDelegate.WasCancelled(UIKit.UIDocumentMenuViewController) M:UIKit.UIDocumentMenuDocumentPickedEventArgs.#ctor(UIKit.UIDocumentPickerViewController) M:UIKit.UIDocumentMenuViewController.add_DidPickDocumentPicker(System.EventHandler{UIKit.UIDocumentMenuDocumentPickedEventArgs}) M:UIKit.UIDocumentMenuViewController.add_WasCancelled(System.EventHandler) @@ -50418,10 +45838,6 @@ M:UIKit.UIDocumentPickedEventArgs.#ctor(Foundation.NSUrl) M:UIKit.UIDocumentPickerDelegate_Extensions.DidPickDocument(UIKit.IUIDocumentPickerDelegate,UIKit.UIDocumentPickerViewController,Foundation.NSUrl) M:UIKit.UIDocumentPickerDelegate_Extensions.DidPickDocument(UIKit.IUIDocumentPickerDelegate,UIKit.UIDocumentPickerViewController,Foundation.NSUrl[]) M:UIKit.UIDocumentPickerDelegate_Extensions.WasCancelled(UIKit.IUIDocumentPickerDelegate,UIKit.UIDocumentPickerViewController) -M:UIKit.UIDocumentPickerDelegate.DidPickDocument(UIKit.UIDocumentPickerViewController,Foundation.NSUrl) -M:UIKit.UIDocumentPickerDelegate.DidPickDocument(UIKit.UIDocumentPickerViewController,Foundation.NSUrl[]) -M:UIKit.UIDocumentPickerDelegate.WasCancelled(UIKit.UIDocumentPickerViewController) -M:UIKit.UIDocumentPickerExtensionViewController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UIDocumentPickerViewController.add_DidPickDocument(System.EventHandler{UIKit.UIDocumentPickedEventArgs}) M:UIKit.UIDocumentPickerViewController.add_DidPickDocumentAtUrls(System.EventHandler{UIKit.UIDocumentPickedAtUrlsEventArgs}) M:UIKit.UIDocumentPickerViewController.add_WasCancelled(System.EventHandler) @@ -50431,13 +45847,10 @@ M:UIKit.UIDocumentPickerViewController.remove_DidPickDocument(System.EventHandle M:UIKit.UIDocumentPickerViewController.remove_DidPickDocumentAtUrls(System.EventHandler{UIKit.UIDocumentPickedAtUrlsEventArgs}) M:UIKit.UIDocumentPickerViewController.remove_WasCancelled(System.EventHandler) M:UIKit.UIDocumentSendingToApplicationEventArgs.#ctor(System.String) -M:UIKit.UIDocViewController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UIDocViewController.OpenDocumentAsync M:UIKit.UIDragDropSessionExtensions.CanLoadObjects(UIKit.IUIDragDropSession,System.Type) M:UIKit.UIDragDropSessionExtensions.LoadObjects``1(UIKit.IUIDropSession,System.Action{`0[]}) -M:UIKit.UIDragInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIDragInteraction.Dispose(System.Boolean) -M:UIKit.UIDragInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIDragInteractionDelegate_Extensions.GetItemsForAddingToSession(UIKit.IUIDragInteractionDelegate,UIKit.UIDragInteraction,UIKit.IUIDragSession,CoreGraphics.CGPoint) M:UIKit.UIDragInteractionDelegate_Extensions.GetPreviewForCancellingItem(UIKit.IUIDragInteractionDelegate,UIKit.UIDragInteraction,UIKit.UIDragItem,UIKit.UITargetedDragPreview) M:UIKit.UIDragInteractionDelegate_Extensions.GetPreviewForLiftingItem(UIKit.IUIDragInteractionDelegate,UIKit.UIDragInteraction,UIKit.UIDragItem,UIKit.IUIDragSession) @@ -50453,31 +45866,10 @@ M:UIKit.UIDragInteractionDelegate_Extensions.SessionWillEnd(UIKit.IUIDragInterac M:UIKit.UIDragInteractionDelegate_Extensions.WillAddItems(UIKit.IUIDragInteractionDelegate,UIKit.UIDragInteraction,UIKit.IUIDragSession,UIKit.UIDragItem[],UIKit.UIDragInteraction) M:UIKit.UIDragInteractionDelegate_Extensions.WillAnimateCancel(UIKit.IUIDragInteractionDelegate,UIKit.UIDragInteraction,UIKit.UIDragItem,UIKit.IUIDragAnimating) M:UIKit.UIDragInteractionDelegate_Extensions.WillAnimateLift(UIKit.IUIDragInteractionDelegate,UIKit.UIDragInteraction,UIKit.IUIDragAnimating,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.GetItemsForAddingToSession(UIKit.UIDragInteraction,UIKit.IUIDragSession,CoreGraphics.CGPoint) -M:UIKit.UIDragInteractionDelegate.GetItemsForBeginningSession(UIKit.UIDragInteraction,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.GetPreviewForCancellingItem(UIKit.UIDragInteraction,UIKit.UIDragItem,UIKit.UITargetedDragPreview) -M:UIKit.UIDragInteractionDelegate.GetPreviewForLiftingItem(UIKit.UIDragInteraction,UIKit.UIDragItem,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.GetSessionForAddingItems(UIKit.UIDragInteraction,UIKit.IUIDragSession[],CoreGraphics.CGPoint) -M:UIKit.UIDragInteractionDelegate.PrefersFullSizePreviews(UIKit.UIDragInteraction,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.SessionAllowsMoveOperation(UIKit.UIDragInteraction,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.SessionDidEnd(UIKit.UIDragInteraction,UIKit.IUIDragSession,UIKit.UIDropOperation) -M:UIKit.UIDragInteractionDelegate.SessionDidMove(UIKit.UIDragInteraction,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.SessionDidTransferItems(UIKit.UIDragInteraction,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.SessionIsRestrictedToDraggingApplication(UIKit.UIDragInteraction,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.SessionWillBegin(UIKit.UIDragInteraction,UIKit.IUIDragSession) -M:UIKit.UIDragInteractionDelegate.SessionWillEnd(UIKit.UIDragInteraction,UIKit.IUIDragSession,UIKit.UIDropOperation) -M:UIKit.UIDragInteractionDelegate.WillAddItems(UIKit.UIDragInteraction,UIKit.IUIDragSession,UIKit.UIDragItem[],UIKit.UIDragInteraction) -M:UIKit.UIDragInteractionDelegate.WillAnimateCancel(UIKit.UIDragInteraction,UIKit.UIDragItem,UIKit.IUIDragAnimating) -M:UIKit.UIDragInteractionDelegate.WillAnimateLift(UIKit.UIDragInteraction,UIKit.IUIDragAnimating,UIKit.IUIDragSession) M:UIKit.UIDragPreview.Copy(Foundation.NSZone) -M:UIKit.UIDragPreviewParameters.#ctor(Foundation.NSValue[]) M:UIKit.UIDragPreviewParameters.Copy(Foundation.NSZone) -M:UIKit.UIDragPreviewTarget.#ctor(UIKit.UIView,CoreGraphics.CGPoint,CoreGraphics.CGAffineTransform) -M:UIKit.UIDragPreviewTarget.#ctor(UIKit.UIView,CoreGraphics.CGPoint) M:UIKit.UIDragPreviewTarget.Copy(Foundation.NSZone) -M:UIKit.UIDropInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIDropInteraction.Dispose(System.Boolean) -M:UIKit.UIDropInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIDropInteractionDelegate_Extensions.CanHandleSession(UIKit.IUIDropInteractionDelegate,UIKit.UIDropInteraction,UIKit.IUIDropSession) M:UIKit.UIDropInteractionDelegate_Extensions.ConcludeDrop(UIKit.IUIDropInteractionDelegate,UIKit.UIDropInteraction,UIKit.IUIDropSession) M:UIKit.UIDropInteractionDelegate_Extensions.GetPreviewForDroppingItem(UIKit.IUIDropInteractionDelegate,UIKit.UIDropInteraction,UIKit.UIDragItem,UIKit.UITargetedDragPreview) @@ -50487,15 +45879,6 @@ M:UIKit.UIDropInteractionDelegate_Extensions.SessionDidEnter(UIKit.IUIDropIntera M:UIKit.UIDropInteractionDelegate_Extensions.SessionDidExit(UIKit.IUIDropInteractionDelegate,UIKit.UIDropInteraction,UIKit.IUIDropSession) M:UIKit.UIDropInteractionDelegate_Extensions.SessionDidUpdate(UIKit.IUIDropInteractionDelegate,UIKit.UIDropInteraction,UIKit.IUIDropSession) M:UIKit.UIDropInteractionDelegate_Extensions.WillAnimateDrop(UIKit.IUIDropInteractionDelegate,UIKit.UIDropInteraction,UIKit.UIDragItem,UIKit.IUIDragAnimating) -M:UIKit.UIDropInteractionDelegate.CanHandleSession(UIKit.UIDropInteraction,UIKit.IUIDropSession) -M:UIKit.UIDropInteractionDelegate.ConcludeDrop(UIKit.UIDropInteraction,UIKit.IUIDropSession) -M:UIKit.UIDropInteractionDelegate.GetPreviewForDroppingItem(UIKit.UIDropInteraction,UIKit.UIDragItem,UIKit.UITargetedDragPreview) -M:UIKit.UIDropInteractionDelegate.PerformDrop(UIKit.UIDropInteraction,UIKit.IUIDropSession) -M:UIKit.UIDropInteractionDelegate.SessionDidEnd(UIKit.UIDropInteraction,UIKit.IUIDropSession) -M:UIKit.UIDropInteractionDelegate.SessionDidEnter(UIKit.UIDropInteraction,UIKit.IUIDropSession) -M:UIKit.UIDropInteractionDelegate.SessionDidExit(UIKit.UIDropInteraction,UIKit.IUIDropSession) -M:UIKit.UIDropInteractionDelegate.SessionDidUpdate(UIKit.UIDropInteraction,UIKit.IUIDropSession) -M:UIKit.UIDropInteractionDelegate.WillAnimateDrop(UIKit.UIDropInteraction,UIKit.UIDragItem,UIKit.IUIDragAnimating) M:UIKit.UIDropProposal.Copy(Foundation.NSZone) M:UIKit.UIDynamicAnimator.Add(UIKit.UIDynamicBehavior) M:UIKit.UIDynamicAnimator.AddBehaviors(UIKit.UIDynamicBehavior[]) @@ -50503,8 +45886,6 @@ M:UIKit.UIDynamicAnimator.Dispose(System.Boolean) M:UIKit.UIDynamicAnimator.RemoveBehaviors(UIKit.UIDynamicBehavior[]) M:UIKit.UIDynamicAnimatorDelegate_Extensions.DidPause(UIKit.IUIDynamicAnimatorDelegate,UIKit.UIDynamicAnimator) M:UIKit.UIDynamicAnimatorDelegate_Extensions.WillResume(UIKit.IUIDynamicAnimatorDelegate,UIKit.UIDynamicAnimator) -M:UIKit.UIDynamicAnimatorDelegate.DidPause(UIKit.UIDynamicAnimator) -M:UIKit.UIDynamicAnimatorDelegate.WillResume(UIKit.UIDynamicAnimator) M:UIKit.UIDynamicItem_Extensions.GetCollisionBoundingPath(UIKit.IUIDynamicItem) M:UIKit.UIDynamicItem_Extensions.GetCollisionBoundsType(UIKit.IUIDynamicItem) M:UIKit.UIEdgeInsets.#ctor(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) @@ -50516,33 +45897,19 @@ M:UIKit.UIEdgeInsets.InsetRect(CoreGraphics.CGRect) M:UIKit.UIEdgeInsets.op_Equality(UIKit.UIEdgeInsets,UIKit.UIEdgeInsets) M:UIKit.UIEdgeInsets.op_Inequality(UIKit.UIEdgeInsets,UIKit.UIEdgeInsets) M:UIKit.UIEdgeInsets.ToString -M:UIKit.UIEditMenuInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIEditMenuInteraction.Dispose(System.Boolean) -M:UIKit.UIEditMenuInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIEditMenuInteractionDelegate_Extensions.GetMenu(UIKit.IUIEditMenuInteractionDelegate,UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration,UIKit.UIMenuElement[]) M:UIKit.UIEditMenuInteractionDelegate_Extensions.GetTargetRect(UIKit.IUIEditMenuInteractionDelegate,UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration) M:UIKit.UIEditMenuInteractionDelegate_Extensions.WillDismissMenu(UIKit.IUIEditMenuInteractionDelegate,UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UIEditMenuInteractionDelegate_Extensions.WillPresentMenu(UIKit.IUIEditMenuInteractionDelegate,UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration,UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UIEditMenuInteractionDelegate.GetMenu(UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration,UIKit.UIMenuElement[]) -M:UIKit.UIEditMenuInteractionDelegate.GetTargetRect(UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration) -M:UIKit.UIEditMenuInteractionDelegate.WillDismissMenu(UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration,UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UIEditMenuInteractionDelegate.WillPresentMenu(UIKit.UIEditMenuInteraction,UIKit.UIEditMenuConfiguration,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UIEvent.ToString M:UIKit.UIEventAttribution.Copy(Foundation.NSZone) -M:UIKit.UIEventAttributionView.#ctor(CoreGraphics.CGRect) M:UIKit.UIEventAttributionView.UIEventAttributionViewAppearance.#ctor(System.IntPtr) M:UIKit.UIEventButtonMaskExtensions.Convert(System.IntPtr) -M:UIKit.UIFeedbackGenerator.DidMoveToView(UIKit.UIView) M:UIKit.UIFeedbackGenerator.Dispose(System.Boolean) -M:UIKit.UIFeedbackGenerator.WillMoveToView(UIKit.UIView) -M:UIKit.UIFindInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIFindInteraction.Dispose(System.Boolean) -M:UIKit.UIFindInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIFindInteractionDelegate_Extensions.DidBeginFindSession(UIKit.IUIFindInteractionDelegate,UIKit.UIFindInteraction,UIKit.UIFindSession) M:UIKit.UIFindInteractionDelegate_Extensions.DidEndFindSession(UIKit.IUIFindInteractionDelegate,UIKit.UIFindInteraction,UIKit.UIFindSession) -M:UIKit.UIFindInteractionDelegate.DidBeginFindSession(UIKit.UIFindInteraction,UIKit.UIFindSession) -M:UIKit.UIFindInteractionDelegate.DidEndFindSession(UIKit.UIFindInteraction,UIKit.UIFindSession) -M:UIKit.UIFindInteractionDelegate.GetSession(UIKit.UIFindInteraction,UIKit.UIView) M:UIKit.UIFloatRange.#ctor(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:UIKit.UIFloatRange.Equals(System.Object) M:UIKit.UIFloatRange.Equals(UIKit.UIFloatRange) @@ -50645,8 +46012,6 @@ M:UIKit.UIFontPickerViewController.Dispose(System.Boolean) M:UIKit.UIFontPickerViewControllerConfiguration.Copy(Foundation.NSZone) M:UIKit.UIFontPickerViewControllerDelegate_Extensions.DidCancel(UIKit.IUIFontPickerViewControllerDelegate,UIKit.UIFontPickerViewController) M:UIKit.UIFontPickerViewControllerDelegate_Extensions.DidPickFont(UIKit.IUIFontPickerViewControllerDelegate,UIKit.UIFontPickerViewController) -M:UIKit.UIFontPickerViewControllerDelegate.DidCancel(UIKit.UIFontPickerViewController) -M:UIKit.UIFontPickerViewControllerDelegate.DidPickFont(UIKit.UIFontPickerViewController) M:UIKit.UIFontTraits.#ctor M:UIKit.UIFontTraits.#ctor(Foundation.NSDictionary) M:UIKit.UIFontWeightExtensions.GetWeight(UIKit.UIFontWeight) @@ -50668,13 +46033,6 @@ M:UIKit.UIGestureRecognizerDelegate_Extensions.ShouldReceivePress(UIKit.IUIGestu M:UIKit.UIGestureRecognizerDelegate_Extensions.ShouldReceiveTouch(UIKit.IUIGestureRecognizerDelegate,UIKit.UIGestureRecognizer,UIKit.UITouch) M:UIKit.UIGestureRecognizerDelegate_Extensions.ShouldRecognizeSimultaneously(UIKit.IUIGestureRecognizerDelegate,UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) M:UIKit.UIGestureRecognizerDelegate_Extensions.ShouldRequireFailureOf(UIKit.IUIGestureRecognizerDelegate,UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) -M:UIKit.UIGestureRecognizerDelegate.ShouldBegin(UIKit.UIGestureRecognizer) -M:UIKit.UIGestureRecognizerDelegate.ShouldBeRequiredToFailBy(UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) -M:UIKit.UIGestureRecognizerDelegate.ShouldReceiveEvent(UIKit.UIGestureRecognizer,UIKit.UIEvent) -M:UIKit.UIGestureRecognizerDelegate.ShouldReceivePress(UIKit.UIGestureRecognizer,UIKit.UIPress) -M:UIKit.UIGestureRecognizerDelegate.ShouldReceiveTouch(UIKit.UIGestureRecognizer,UIKit.UITouch) -M:UIKit.UIGestureRecognizerDelegate.ShouldRecognizeSimultaneously(UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) -M:UIKit.UIGestureRecognizerDelegate.ShouldRequireFailureOf(UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) M:UIKit.UIGraphics.AddPDFContextDestination(System.String,CoreGraphics.CGPoint) M:UIKit.UIGraphics.BeginImageContext(CoreGraphics.CGSize) M:UIKit.UIGraphics.BeginImageContextWithOptions(CoreGraphics.CGSize,System.Boolean,System.Runtime.InteropServices.NFloat) @@ -50702,13 +46060,11 @@ M:UIKit.UIGuidedAccessRestriction.ConfigureAccessibilityFeaturesAsync(UIKit.UIGu M:UIKit.UIGuidedAccessRestriction.GetState(System.String) M:UIKit.UIGuidedAccessRestrictionDelegate_Extensions.GetDetailTextForGuidedAccessRestriction(UIKit.IUIGuidedAccessRestrictionDelegate,System.String) M:UIKit.UIHoverAutomaticEffect.Copy(Foundation.NSZone) -M:UIKit.UIHoverGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UIHoverGestureRecognizer.#ctor(System.Action) M:UIKit.UIHoverGestureRecognizer.#ctor(System.Action{UIKit.UIHoverGestureRecognizer}) M:UIKit.UIHoverHighlightEffect.Copy(Foundation.NSZone) M:UIKit.UIHoverLiftEffect.Copy(Foundation.NSZone) M:UIKit.UIHoverStyle.Copy(Foundation.NSZone) -M:UIKit.UIImage.AccessibilityActivate M:UIKit.UIImage.AsJPEG M:UIKit.UIImage.AsJPEG(System.Runtime.InteropServices.NFloat) M:UIKit.UIImage.AsPNG @@ -50734,42 +46090,24 @@ M:UIKit.UIImagePickerController.remove_Canceled(System.EventHandler) M:UIKit.UIImagePickerController.remove_FinishedPickingMedia(System.EventHandler{UIKit.UIImagePickerMediaPickedEventArgs}) M:UIKit.UIImagePickerControllerDelegate_Extensions.Canceled(UIKit.IUIImagePickerControllerDelegate,UIKit.UIImagePickerController) M:UIKit.UIImagePickerControllerDelegate_Extensions.FinishedPickingMedia(UIKit.IUIImagePickerControllerDelegate,UIKit.UIImagePickerController,Foundation.NSDictionary) -M:UIKit.UIImagePickerControllerDelegate.Canceled(UIKit.UIImagePickerController) -M:UIKit.UIImagePickerControllerDelegate.FinishedPickingMedia(UIKit.UIImagePickerController,Foundation.NSDictionary) M:UIKit.UIImagePickerMediaPickedEventArgs.#ctor(Foundation.NSDictionary) M:UIKit.UIImageReader.GetImageAsync(Foundation.NSData) M:UIKit.UIImageReader.GetImageAsync(Foundation.NSUrl) M:UIKit.UIImageReaderConfiguration.Copy(Foundation.NSZone) M:UIKit.UIImageResizingModeExtensions.ToManaged(System.IntPtr) M:UIKit.UIImageResizingModeExtensions.ToNative(UIKit.UIImageResizingMode) -M:UIKit.UIImageView.#ctor(CoreGraphics.CGRect) M:UIKit.UIImageView.AddSymbolEffectAsync(Symbols.NSSymbolEffect,Symbols.NSSymbolEffectOptions,System.Boolean) M:UIKit.UIImageView.RemoveSymbolEffectAsync(Symbols.NSSymbolEffect,Symbols.NSSymbolEffectOptions,System.Boolean) M:UIKit.UIImageView.SetSymbolImageAsync(UIKit.UIImage,Symbols.NSSymbolContentTransition,Symbols.NSSymbolEffectOptions) M:UIKit.UIImageView.UIImageViewAppearance.#ctor(System.IntPtr) -M:UIKit.UIImpactFeedbackGenerator.GetFeedbackGenerator(UIKit.UIView) -M:UIKit.UIIndirectScribbleInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIIndirectScribbleInteraction.Dispose(System.Boolean) -M:UIKit.UIIndirectScribbleInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIIndirectScribbleInteractionDelegate_Extensions.DidFinishWriting(UIKit.IUIIndirectScribbleInteractionDelegate,UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) M:UIKit.UIIndirectScribbleInteractionDelegate_Extensions.ShouldDelayFocus(UIKit.IUIIndirectScribbleInteractionDelegate,UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) M:UIKit.UIIndirectScribbleInteractionDelegate_Extensions.WillBeginWriting(UIKit.IUIIndirectScribbleInteractionDelegate,UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) -M:UIKit.UIIndirectScribbleInteractionDelegate.DidFinishWriting(UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) -M:UIKit.UIIndirectScribbleInteractionDelegate.FocusElementIfNeeded(UIKit.UIIndirectScribbleInteraction,Foundation.NSObject,CoreGraphics.CGPoint,System.Action{UIKit.IUITextInput}) -M:UIKit.UIIndirectScribbleInteractionDelegate.GetFrameForElement(UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) -M:UIKit.UIIndirectScribbleInteractionDelegate.IsElementFocused(UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) -M:UIKit.UIIndirectScribbleInteractionDelegate.RequestElements(UIKit.UIIndirectScribbleInteraction,CoreGraphics.CGRect,System.Action{Foundation.NSObject[]}) -M:UIKit.UIIndirectScribbleInteractionDelegate.ShouldDelayFocus(UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) -M:UIKit.UIIndirectScribbleInteractionDelegate.WillBeginWriting(UIKit.UIIndirectScribbleInteraction,Foundation.NSObject) M:UIKit.UIInputView.EncodeTo(Foundation.NSCoder) M:UIKit.UIInputView.UIInputViewAppearance.#ctor(System.IntPtr) M:UIKit.UIInputViewAudioFeedback_Extensions.GetEnableInputClicksWhenVisible(UIKit.IUIInputViewAudioFeedback) -M:UIKit.UIInputViewController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UIInputViewController.RequestSupplementaryLexiconAsync -M:UIKit.UIInputViewController.SelectionDidChange(UIKit.IUITextInput) -M:UIKit.UIInputViewController.SelectionWillChange(UIKit.IUITextInput) -M:UIKit.UIInputViewController.TextDidChange(UIKit.IUITextInput) -M:UIKit.UIInputViewController.TextWillChange(UIKit.IUITextInput) M:UIKit.UIInterfaceOrientationExtensions.IsLandscape(UIKit.UIInterfaceOrientation) M:UIKit.UIInterfaceOrientationExtensions.IsPortrait(UIKit.UIInterfaceOrientation) M:UIKit.UIInterpolatingMotionEffect.EncodeTo(Foundation.NSCoder) @@ -50782,42 +46120,30 @@ M:UIKit.UIKeyboard.FrameBeginFromNotification(Foundation.NSNotification) M:UIKit.UIKeyboard.FrameEndFromNotification(Foundation.NSNotification) M:UIKit.UIKeyboardEventArgs.#ctor(Foundation.NSNotification) M:UIKit.UIKitThreadAccessException.#ctor -M:UIKit.UILabel.#ctor(CoreGraphics.CGRect) M:UIKit.UILabel.UILabelAppearance.#ctor(System.IntPtr) -M:UIKit.UILargeContentViewerInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UILargeContentViewerInteraction.Dispose(System.Boolean) -M:UIKit.UILargeContentViewerInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UILargeContentViewerInteractionDelegate_Extensions.DidEnd(UIKit.IUILargeContentViewerInteractionDelegate,UIKit.UILargeContentViewerInteraction,UIKit.IUILargeContentViewerItem,CoreGraphics.CGPoint) M:UIKit.UILargeContentViewerInteractionDelegate_Extensions.GetItem(UIKit.IUILargeContentViewerInteractionDelegate,UIKit.UILargeContentViewerInteraction,CoreGraphics.CGPoint) M:UIKit.UILargeContentViewerInteractionDelegate_Extensions.GetViewController(UIKit.IUILargeContentViewerInteractionDelegate,UIKit.UILargeContentViewerInteraction) -M:UIKit.UILargeContentViewerInteractionDelegate.DidEnd(UIKit.UILargeContentViewerInteraction,UIKit.IUILargeContentViewerItem,CoreGraphics.CGPoint) -M:UIKit.UILargeContentViewerInteractionDelegate.GetItem(UIKit.UILargeContentViewerInteraction,CoreGraphics.CGPoint) -M:UIKit.UILargeContentViewerInteractionDelegate.GetViewController(UIKit.UILargeContentViewerInteraction) M:UIKit.UILayoutGuide_UIConstraintBasedLayoutDebugging.GetConstraintsAffectingLayout(UIKit.UILayoutGuide,UIKit.UILayoutConstraintAxis) M:UIKit.UILayoutGuide_UIConstraintBasedLayoutDebugging.GetHasAmbiguousLayout(UIKit.UILayoutGuide) M:UIKit.UILayoutGuide.Dispose(System.Boolean) M:UIKit.UILayoutGuide.EncodeTo(Foundation.NSCoder) -M:UIKit.UILayoutGuide.GetFrame(UIKit.UIView) M:UIKit.UILexicon.Copy(Foundation.NSZone) M:UIKit.UILexiconEntry.Copy(Foundation.NSZone) M:UIKit.UIListContentConfiguration.Copy(Foundation.NSZone) M:UIKit.UIListContentConfiguration.EncodeTo(Foundation.NSCoder) -M:UIKit.UIListContentConfiguration.GetUpdatedConfiguration(UIKit.IUIConfigurationState) -M:UIKit.UIListContentConfiguration.MakeContentView M:UIKit.UIListContentImageProperties.Copy(Foundation.NSZone) M:UIKit.UIListContentImageProperties.EncodeTo(Foundation.NSCoder) M:UIKit.UIListContentTextProperties.Copy(Foundation.NSZone) M:UIKit.UIListContentTextProperties.EncodeTo(Foundation.NSCoder) -M:UIKit.UIListContentView.SupportsConfiguration(UIKit.IUIContentConfiguration) M:UIKit.UIListContentView.UIListContentViewAppearance.#ctor(System.IntPtr) M:UIKit.UIListSeparatorConfiguration.Copy(Foundation.NSZone) M:UIKit.UIListSeparatorConfiguration.EncodeTo(Foundation.NSCoder) M:UIKit.UILocalNotification.Copy(Foundation.NSZone) M:UIKit.UILocalNotification.EncodeTo(Foundation.NSCoder) -M:UIKit.UILongPressGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UILongPressGestureRecognizer.#ctor(System.Action) M:UIKit.UILongPressGestureRecognizer.#ctor(System.Action{UIKit.UILongPressGestureRecognizer}) -M:UIKit.UIManagedDocument.#ctor(Foundation.NSUrl) M:UIKit.UIMenuDisplayPreferences.Copy(Foundation.NSZone) M:UIKit.UIMenuDisplayPreferences.EncodeTo(Foundation.NSCoder) M:UIKit.UIMenuElement.Copy(Foundation.NSZone) @@ -50826,15 +46152,6 @@ M:UIKit.UIMenuLeaf_Extensions.GetSelectedImage(UIKit.IUIMenuLeaf) M:UIKit.UIMenuLeaf_Extensions.SetSelectedImage(UIKit.IUIMenuLeaf,UIKit.UIImage) M:UIKit.UIMotionEffect.Copy(Foundation.NSZone) M:UIKit.UIMotionEffect.EncodeTo(Foundation.NSCoder) -M:UIKit.UIMutableApplicationShortcutItem.#ctor(System.String,System.String,System.String,UIKit.UIApplicationShortcutIcon,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:UIKit.UIMutableApplicationShortcutItem.#ctor(System.String,System.String) -M:UIKit.UIMutableTraits.GetObject(UIKit.IUIObjectTraitDefinition) -M:UIKit.UIMutableTraits.GetValue(UIKit.IUICGFloatTraitDefinition) -M:UIKit.UIMutableTraits.GetValue(UIKit.IUINSIntegerTraitDefinition) -M:UIKit.UIMutableTraits.SetObject(Foundation.NSObject,UIKit.IUIObjectTraitDefinition) -M:UIKit.UIMutableTraits.SetValue(System.IntPtr,UIKit.IUINSIntegerTraitDefinition) -M:UIKit.UIMutableTraits.SetValue(System.Runtime.InteropServices.NFloat,UIKit.IUICGFloatTraitDefinition) -M:UIKit.UINavigationBar.#ctor(CoreGraphics.CGRect) M:UIKit.UINavigationBar.Dispose(System.Boolean) M:UIKit.UINavigationBar.EncodeTo(Foundation.NSCoder) M:UIKit.UINavigationBar.UINavigationBarAppearance.#ctor(System.IntPtr) @@ -50846,18 +46163,11 @@ M:UIKit.UINavigationBar.UINavigationBarAppearance.SetBackgroundImage(UIKit.UIIma M:UIKit.UINavigationBar.UINavigationBarAppearance.SetBackgroundImage(UIKit.UIImage,UIKit.UIBarPosition,UIKit.UIBarMetrics) M:UIKit.UINavigationBar.UINavigationBarAppearance.SetTitleTextAttributes(UIKit.UITextAttributes) M:UIKit.UINavigationBar.UINavigationBarAppearance.SetTitleVerticalPositionAdjustment(System.Runtime.InteropServices.NFloat,UIKit.UIBarMetrics) -M:UIKit.UINavigationBarAppearance.#ctor(UIKit.UIBarAppearance) -M:UIKit.UINavigationBarAppearance.#ctor(UIKit.UIUserInterfaceIdiom) M:UIKit.UINavigationBarDelegate_Extensions.DidPopItem(UIKit.IUINavigationBarDelegate,UIKit.UINavigationBar,UIKit.UINavigationItem) M:UIKit.UINavigationBarDelegate_Extensions.DidPushItem(UIKit.IUINavigationBarDelegate,UIKit.UINavigationBar,UIKit.UINavigationItem) M:UIKit.UINavigationBarDelegate_Extensions.GetNSToolbarSection(UIKit.IUINavigationBarDelegate,UIKit.UINavigationBar) M:UIKit.UINavigationBarDelegate_Extensions.ShouldPopItem(UIKit.IUINavigationBarDelegate,UIKit.UINavigationBar,UIKit.UINavigationItem) M:UIKit.UINavigationBarDelegate_Extensions.ShouldPushItem(UIKit.IUINavigationBarDelegate,UIKit.UINavigationBar,UIKit.UINavigationItem) -M:UIKit.UINavigationBarDelegate.DidPopItem(UIKit.UINavigationBar,UIKit.UINavigationItem) -M:UIKit.UINavigationBarDelegate.DidPushItem(UIKit.UINavigationBar,UIKit.UINavigationItem) -M:UIKit.UINavigationBarDelegate.GetNSToolbarSection(UIKit.UINavigationBar) -M:UIKit.UINavigationBarDelegate.ShouldPopItem(UIKit.UINavigationBar,UIKit.UINavigationItem) -M:UIKit.UINavigationBarDelegate.ShouldPushItem(UIKit.UINavigationBar,UIKit.UINavigationItem) M:UIKit.UINavigationController.#ctor(System.Type,System.Type) M:UIKit.UINavigationController.Dispose(System.Boolean) M:UIKit.UINavigationControllerDelegate_Extensions.DidShowViewController(UIKit.IUINavigationControllerDelegate,UIKit.UINavigationController,UIKit.UIViewController,System.Boolean) @@ -50866,42 +46176,23 @@ M:UIKit.UINavigationControllerDelegate_Extensions.GetInteractionControllerForAni M:UIKit.UINavigationControllerDelegate_Extensions.GetPreferredInterfaceOrientation(UIKit.IUINavigationControllerDelegate,UIKit.UINavigationController) M:UIKit.UINavigationControllerDelegate_Extensions.SupportedInterfaceOrientations(UIKit.IUINavigationControllerDelegate,UIKit.UINavigationController) M:UIKit.UINavigationControllerDelegate_Extensions.WillShowViewController(UIKit.IUINavigationControllerDelegate,UIKit.UINavigationController,UIKit.UIViewController,System.Boolean) -M:UIKit.UINavigationControllerDelegate.DidShowViewController(UIKit.UINavigationController,UIKit.UIViewController,System.Boolean) -M:UIKit.UINavigationControllerDelegate.GetAnimationControllerForOperation(UIKit.UINavigationController,UIKit.UINavigationControllerOperation,UIKit.UIViewController,UIKit.UIViewController) -M:UIKit.UINavigationControllerDelegate.GetInteractionControllerForAnimationController(UIKit.UINavigationController,UIKit.IUIViewControllerAnimatedTransitioning) -M:UIKit.UINavigationControllerDelegate.GetPreferredInterfaceOrientation(UIKit.UINavigationController) -M:UIKit.UINavigationControllerDelegate.SupportedInterfaceOrientations(UIKit.UINavigationController) -M:UIKit.UINavigationControllerDelegate.WillShowViewController(UIKit.UINavigationController,UIKit.UIViewController,System.Boolean) M:UIKit.UINavigationItem.Dispose(System.Boolean) M:UIKit.UINavigationItem.EncodeTo(Foundation.NSCoder) M:UIKit.UINavigationItemRenameDelegate_Extensions.ShouldBeginRenaming(UIKit.IUINavigationItemRenameDelegate,UIKit.UINavigationItem) M:UIKit.UINavigationItemRenameDelegate_Extensions.ShouldEndRenaming(UIKit.IUINavigationItemRenameDelegate,UIKit.UINavigationItem,System.String) M:UIKit.UINavigationItemRenameDelegate_Extensions.WillBeginRenaming(UIKit.IUINavigationItemRenameDelegate,UIKit.UINavigationItem,System.String,Foundation.NSRange) -M:UIKit.UINavigationItemRenameDelegate.DidEndRenaming(UIKit.UINavigationItem,System.String) -M:UIKit.UINavigationItemRenameDelegate.ShouldBeginRenaming(UIKit.UINavigationItem) -M:UIKit.UINavigationItemRenameDelegate.ShouldEndRenaming(UIKit.UINavigationItem,System.String) -M:UIKit.UINavigationItemRenameDelegate.WillBeginRenaming(UIKit.UINavigationItem,System.String,Foundation.NSRange) -M:UIKit.UINotificationFeedbackGenerator.GetFeedbackGenerator(UIKit.UIView) M:UIKit.UIOffset.#ctor(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:UIKit.UIOffset.Equals(System.Object) M:UIKit.UIOffset.GetHashCode M:UIKit.UIOffset.op_Equality(UIKit.UIOffset,UIKit.UIOffset) M:UIKit.UIOffset.op_Inequality(UIKit.UIOffset,UIKit.UIOffset) -M:UIKit.UIPageControl.#ctor(CoreGraphics.CGRect) M:UIKit.UIPageControl.UIPageControlAppearance.#ctor(System.IntPtr) M:UIKit.UIPageControlProgress.Dispose(System.Boolean) M:UIKit.UIPageControlProgressDelegate_Extensions.GetInitialProgressForPage(UIKit.IUIPageControlProgressDelegate,UIKit.UIPageControlProgress,System.IntPtr) M:UIKit.UIPageControlProgressDelegate_Extensions.VisibilityDidChange(UIKit.IUIPageControlProgressDelegate,UIKit.UIPageControlProgress) -M:UIKit.UIPageControlProgressDelegate.GetInitialProgressForPage(UIKit.UIPageControlProgress,System.IntPtr) -M:UIKit.UIPageControlProgressDelegate.VisibilityDidChange(UIKit.UIPageControlProgress) M:UIKit.UIPageControlTimerProgress.Dispose(System.Boolean) M:UIKit.UIPageControlTimerProgressDelegate_Extensions.PageControlTimerProgressDidChange(UIKit.IUIPageControlTimerProgressDelegate,UIKit.UIPageControlTimerProgress) M:UIKit.UIPageControlTimerProgressDelegate_Extensions.ShouldAdvanceToPage(UIKit.IUIPageControlTimerProgressDelegate,UIKit.UIPageControlTimerProgress,System.IntPtr) -M:UIKit.UIPageControlTimerProgressDelegate.GetInitialProgressForPage(UIKit.UIPageControlProgress,System.IntPtr) -M:UIKit.UIPageControlTimerProgressDelegate.PageControlTimerProgressDidChange(UIKit.UIPageControlTimerProgress) -M:UIKit.UIPageControlTimerProgressDelegate.ShouldAdvanceToPage(UIKit.UIPageControlTimerProgress,System.IntPtr) -M:UIKit.UIPageControlTimerProgressDelegate.VisibilityDidChange(UIKit.UIPageControlProgress) -M:UIKit.UIPageViewController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UIPageViewController.#ctor(UIKit.UIPageViewControllerTransitionStyle,UIKit.UIPageViewControllerNavigationOrientation,UIKit.UIPageViewControllerSpineLocation,System.Single) M:UIKit.UIPageViewController.#ctor(UIKit.UIPageViewControllerTransitionStyle,UIKit.UIPageViewControllerNavigationOrientation,UIKit.UIPageViewControllerSpineLocation) M:UIKit.UIPageViewController.#ctor(UIKit.UIPageViewControllerTransitionStyle,UIKit.UIPageViewControllerNavigationOrientation) @@ -50914,23 +46205,13 @@ M:UIKit.UIPageViewController.remove_WillTransition(System.EventHandler{UIKit.UIP M:UIKit.UIPageViewController.SetViewControllersAsync(UIKit.UIViewController[],UIKit.UIPageViewControllerNavigationDirection,System.Boolean) M:UIKit.UIPageViewControllerDataSource_Extensions.GetPresentationCount(UIKit.IUIPageViewControllerDataSource,UIKit.UIPageViewController) M:UIKit.UIPageViewControllerDataSource_Extensions.GetPresentationIndex(UIKit.IUIPageViewControllerDataSource,UIKit.UIPageViewController) -M:UIKit.UIPageViewControllerDataSource.GetNextViewController(UIKit.UIPageViewController,UIKit.UIViewController) -M:UIKit.UIPageViewControllerDataSource.GetPresentationCount(UIKit.UIPageViewController) -M:UIKit.UIPageViewControllerDataSource.GetPresentationIndex(UIKit.UIPageViewController) -M:UIKit.UIPageViewControllerDataSource.GetPreviousViewController(UIKit.UIPageViewController,UIKit.UIViewController) M:UIKit.UIPageViewControllerDelegate_Extensions.DidFinishAnimating(UIKit.IUIPageViewControllerDelegate,UIKit.UIPageViewController,System.Boolean,UIKit.UIViewController[],System.Boolean) M:UIKit.UIPageViewControllerDelegate_Extensions.GetPreferredInterfaceOrientationForPresentation(UIKit.IUIPageViewControllerDelegate,UIKit.UIPageViewController) M:UIKit.UIPageViewControllerDelegate_Extensions.GetSpineLocation(UIKit.IUIPageViewControllerDelegate,UIKit.UIPageViewController,UIKit.UIInterfaceOrientation) M:UIKit.UIPageViewControllerDelegate_Extensions.SupportedInterfaceOrientations(UIKit.IUIPageViewControllerDelegate,UIKit.UIPageViewController) M:UIKit.UIPageViewControllerDelegate_Extensions.WillTransition(UIKit.IUIPageViewControllerDelegate,UIKit.UIPageViewController,UIKit.UIViewController[]) -M:UIKit.UIPageViewControllerDelegate.DidFinishAnimating(UIKit.UIPageViewController,System.Boolean,UIKit.UIViewController[],System.Boolean) -M:UIKit.UIPageViewControllerDelegate.GetPreferredInterfaceOrientationForPresentation(UIKit.UIPageViewController) -M:UIKit.UIPageViewControllerDelegate.GetSpineLocation(UIKit.UIPageViewController,UIKit.UIInterfaceOrientation) -M:UIKit.UIPageViewControllerDelegate.SupportedInterfaceOrientations(UIKit.UIPageViewController) -M:UIKit.UIPageViewControllerDelegate.WillTransition(UIKit.UIPageViewController,UIKit.UIViewController[]) M:UIKit.UIPageViewControllerTransitionEventArgs.#ctor(UIKit.UIViewController[]) M:UIKit.UIPageViewFinishedAnimationEventArgs.#ctor(System.Boolean,UIKit.UIViewController[],System.Boolean) -M:UIKit.UIPanGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UIPanGestureRecognizer.#ctor(System.Action) M:UIKit.UIPanGestureRecognizer.#ctor(System.Action{UIKit.UIPanGestureRecognizer}) M:UIKit.UIPasteboard.DetectPatternsAsync(Foundation.NSSet{Foundation.NSString},Foundation.NSIndexSet) @@ -50951,20 +46232,11 @@ M:UIKit.UIPasteControl.Dispose(System.Boolean) M:UIKit.UIPasteControl.UIPasteControlAppearance.#ctor(System.IntPtr) M:UIKit.UIPasteControlConfiguration.EncodeTo(Foundation.NSCoder) M:UIKit.UIPathEventArgs.#ctor(System.String) -M:UIKit.UIPencilInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIPencilInteraction.Dispose(System.Boolean) -M:UIKit.UIPencilInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIPencilInteractionDelegate_Extensions.DidReceiveSqueeze(UIKit.IUIPencilInteractionDelegate,UIKit.UIPencilInteraction,UIKit.UIPencilInteractionSqueeze) M:UIKit.UIPencilInteractionDelegate_Extensions.DidReceiveTap(UIKit.IUIPencilInteractionDelegate,UIKit.UIPencilInteraction,UIKit.UIPencilInteractionTap) M:UIKit.UIPencilInteractionDelegate_Extensions.DidTap(UIKit.IUIPencilInteractionDelegate,UIKit.UIPencilInteraction) -M:UIKit.UIPencilInteractionDelegate.DidReceiveSqueeze(UIKit.UIPencilInteraction,UIKit.UIPencilInteractionSqueeze) -M:UIKit.UIPencilInteractionDelegate.DidReceiveTap(UIKit.UIPencilInteraction,UIKit.UIPencilInteractionTap) -M:UIKit.UIPencilInteractionDelegate.DidTap(UIKit.UIPencilInteraction) -M:UIKit.UIPercentDrivenInteractiveTransition.StartInteractiveTransition(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIPickerView.#ctor(CoreGraphics.CGRect) M:UIKit.UIPickerView.Dispose(System.Boolean) -M:UIKit.UIPickerView.GetCell(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UIPickerView.RowsInSection(UIKit.UITableView,System.IntPtr) M:UIKit.UIPickerView.UIPickerViewAppearance.#ctor(System.IntPtr) M:UIKit.UIPickerViewAccessibilityDelegate_Extensions.GetAccessibilityAttributedHint(UIKit.IUIPickerViewAccessibilityDelegate,UIKit.UIPickerView,System.IntPtr) M:UIKit.UIPickerViewAccessibilityDelegate_Extensions.GetAccessibilityAttributedLabel(UIKit.IUIPickerViewAccessibilityDelegate,UIKit.UIPickerView,System.IntPtr) @@ -50972,59 +46244,26 @@ M:UIKit.UIPickerViewAccessibilityDelegate_Extensions.GetAccessibilityAttributedU M:UIKit.UIPickerViewAccessibilityDelegate_Extensions.GetAccessibilityHint(UIKit.IUIPickerViewAccessibilityDelegate,UIKit.UIPickerView,System.IntPtr) M:UIKit.UIPickerViewAccessibilityDelegate_Extensions.GetAccessibilityLabel(UIKit.IUIPickerViewAccessibilityDelegate,UIKit.UIPickerView,System.IntPtr) M:UIKit.UIPickerViewAccessibilityDelegate_Extensions.GetAccessibilityUserInputLabels(UIKit.IUIPickerViewAccessibilityDelegate,UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewAccessibilityDelegate.GetAccessibilityAttributedHint(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewAccessibilityDelegate.GetAccessibilityAttributedLabel(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewAccessibilityDelegate.GetAccessibilityAttributedUserInputLabels(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewAccessibilityDelegate.GetAccessibilityHint(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewAccessibilityDelegate.GetAccessibilityLabel(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewAccessibilityDelegate.GetAccessibilityUserInputLabels(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewDataSource.GetComponentCount(UIKit.UIPickerView) -M:UIKit.UIPickerViewDataSource.GetRowsInComponent(UIKit.UIPickerView,System.IntPtr) M:UIKit.UIPickerViewDelegate_Extensions.GetAttributedTitle(UIKit.IUIPickerViewDelegate,UIKit.UIPickerView,System.IntPtr,System.IntPtr) M:UIKit.UIPickerViewDelegate_Extensions.GetComponentWidth(UIKit.IUIPickerViewDelegate,UIKit.UIPickerView,System.IntPtr) M:UIKit.UIPickerViewDelegate_Extensions.GetRowHeight(UIKit.IUIPickerViewDelegate,UIKit.UIPickerView,System.IntPtr) M:UIKit.UIPickerViewDelegate_Extensions.GetTitle(UIKit.IUIPickerViewDelegate,UIKit.UIPickerView,System.IntPtr,System.IntPtr) M:UIKit.UIPickerViewDelegate_Extensions.GetView(UIKit.IUIPickerViewDelegate,UIKit.UIPickerView,System.IntPtr,System.IntPtr,UIKit.UIView) M:UIKit.UIPickerViewDelegate_Extensions.Selected(UIKit.IUIPickerViewDelegate,UIKit.UIPickerView,System.IntPtr,System.IntPtr) -M:UIKit.UIPickerViewDelegate.GetAttributedTitle(UIKit.UIPickerView,System.IntPtr,System.IntPtr) -M:UIKit.UIPickerViewDelegate.GetComponentWidth(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewDelegate.GetRowHeight(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewDelegate.GetTitle(UIKit.UIPickerView,System.IntPtr,System.IntPtr) -M:UIKit.UIPickerViewDelegate.GetView(UIKit.UIPickerView,System.IntPtr,System.IntPtr,UIKit.UIView) -M:UIKit.UIPickerViewDelegate.Selected(UIKit.UIPickerView,System.IntPtr,System.IntPtr) -M:UIKit.UIPickerViewModel.GetAttributedTitle(UIKit.UIPickerView,System.IntPtr,System.IntPtr) -M:UIKit.UIPickerViewModel.GetComponentCount(UIKit.UIPickerView) -M:UIKit.UIPickerViewModel.GetComponentWidth(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewModel.GetRowHeight(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewModel.GetRowsInComponent(UIKit.UIPickerView,System.IntPtr) -M:UIKit.UIPickerViewModel.GetTitle(UIKit.UIPickerView,System.IntPtr,System.IntPtr) -M:UIKit.UIPickerViewModel.GetView(UIKit.UIPickerView,System.IntPtr,System.IntPtr,UIKit.UIView) -M:UIKit.UIPickerViewModel.Selected(UIKit.UIPickerView,System.IntPtr,System.IntPtr) -M:UIKit.UIPinchGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UIPinchGestureRecognizer.#ctor(System.Action) M:UIKit.UIPinchGestureRecognizer.#ctor(System.Action{UIKit.UIPinchGestureRecognizer}) M:UIKit.UIPointerAccessory.Copy(Foundation.NSZone) M:UIKit.UIPointerAccessoryPosition.#ctor(System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat) M:UIKit.UIPointerEffect.Copy(Foundation.NSZone) -M:UIKit.UIPointerInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIPointerInteraction.Dispose(System.Boolean) -M:UIKit.UIPointerInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIPointerInteractionDelegate_Extensions.GetRegionForRequest(UIKit.IUIPointerInteractionDelegate,UIKit.UIPointerInteraction,UIKit.UIPointerRegionRequest,UIKit.UIPointerRegion) M:UIKit.UIPointerInteractionDelegate_Extensions.GetStyleForRegion(UIKit.IUIPointerInteractionDelegate,UIKit.UIPointerInteraction,UIKit.UIPointerRegion) M:UIKit.UIPointerInteractionDelegate_Extensions.WillEnterRegion(UIKit.IUIPointerInteractionDelegate,UIKit.UIPointerInteraction,UIKit.UIPointerRegion,UIKit.IUIPointerInteractionAnimating) M:UIKit.UIPointerInteractionDelegate_Extensions.WillExitRegion(UIKit.IUIPointerInteractionDelegate,UIKit.UIPointerInteraction,UIKit.UIPointerRegion,UIKit.IUIPointerInteractionAnimating) -M:UIKit.UIPointerInteractionDelegate.GetRegionForRequest(UIKit.UIPointerInteraction,UIKit.UIPointerRegionRequest,UIKit.UIPointerRegion) -M:UIKit.UIPointerInteractionDelegate.GetStyleForRegion(UIKit.UIPointerInteraction,UIKit.UIPointerRegion) -M:UIKit.UIPointerInteractionDelegate.WillEnterRegion(UIKit.UIPointerInteraction,UIKit.UIPointerRegion,UIKit.IUIPointerInteractionAnimating) -M:UIKit.UIPointerInteractionDelegate.WillExitRegion(UIKit.UIPointerInteraction,UIKit.UIPointerRegion,UIKit.IUIPointerInteractionAnimating) M:UIKit.UIPointerLockStateDidChangeEventArgs.#ctor(Foundation.NSNotification) M:UIKit.UIPointerRegion.Copy(Foundation.NSZone) M:UIKit.UIPointerShape.Copy(Foundation.NSZone) M:UIKit.UIPointerStyle.Copy(Foundation.NSZone) -M:UIKit.UIPopoverBackgroundView.#ctor(CoreGraphics.CGRect) -M:UIKit.UIPopoverBackgroundView.GetArrowBase -M:UIKit.UIPopoverBackgroundView.GetArrowHeight -M:UIKit.UIPopoverBackgroundView.GetContentViewInsets M:UIKit.UIPopoverBackgroundView.UIPopoverBackgroundViewAppearance.#ctor(System.IntPtr) M:UIKit.UIPopoverController.add_DidDismiss(System.EventHandler) M:UIKit.UIPopoverController.add_WillReposition(System.EventHandler{UIKit.UIPopoverControllerRepositionEventArgs}) @@ -51034,11 +46273,7 @@ M:UIKit.UIPopoverController.remove_WillReposition(System.EventHandler{UIKit.UIPo M:UIKit.UIPopoverControllerDelegate_Extensions.DidDismiss(UIKit.IUIPopoverControllerDelegate,UIKit.UIPopoverController) M:UIKit.UIPopoverControllerDelegate_Extensions.ShouldDismiss(UIKit.IUIPopoverControllerDelegate,UIKit.UIPopoverController) M:UIKit.UIPopoverControllerDelegate_Extensions.WillReposition(UIKit.IUIPopoverControllerDelegate,UIKit.UIPopoverController,CoreGraphics.CGRect@,UIKit.UIView@) -M:UIKit.UIPopoverControllerDelegate.DidDismiss(UIKit.UIPopoverController) -M:UIKit.UIPopoverControllerDelegate.ShouldDismiss(UIKit.UIPopoverController) -M:UIKit.UIPopoverControllerDelegate.WillReposition(UIKit.UIPopoverController,CoreGraphics.CGRect@,UIKit.UIView@) M:UIKit.UIPopoverControllerRepositionEventArgs.#ctor(CoreGraphics.CGRect,UIKit.UIView) -M:UIKit.UIPopoverPresentationController.#ctor(UIKit.UIViewController,UIKit.UIViewController) M:UIKit.UIPopoverPresentationController.add_DidDismiss(System.EventHandler) M:UIKit.UIPopoverPresentationController.add_PrepareForPresentation(System.EventHandler) M:UIKit.UIPopoverPresentationController.add_WillReposition(System.EventHandler{UIKit.UIPopoverPresentationControllerRepositionEventArgs}) @@ -51050,28 +46285,9 @@ M:UIKit.UIPopoverPresentationControllerDelegate_Extensions.DidDismissPopover(UIK M:UIKit.UIPopoverPresentationControllerDelegate_Extensions.PrepareForPopoverPresentation(UIKit.IUIPopoverPresentationControllerDelegate,UIKit.UIPopoverPresentationController) M:UIKit.UIPopoverPresentationControllerDelegate_Extensions.ShouldDismissPopover(UIKit.IUIPopoverPresentationControllerDelegate,UIKit.UIPopoverPresentationController) M:UIKit.UIPopoverPresentationControllerDelegate_Extensions.WillRepositionPopover(UIKit.IUIPopoverPresentationControllerDelegate,UIKit.UIPopoverPresentationController,CoreGraphics.CGRect@,UIKit.UIView@) -M:UIKit.UIPopoverPresentationControllerDelegate.DidDismissPopover(UIKit.UIPopoverPresentationController) -M:UIKit.UIPopoverPresentationControllerDelegate.PrepareForPopoverPresentation(UIKit.UIPopoverPresentationController) -M:UIKit.UIPopoverPresentationControllerDelegate.ShouldDismissPopover(UIKit.UIPopoverPresentationController) -M:UIKit.UIPopoverPresentationControllerDelegate.WillRepositionPopover(UIKit.UIPopoverPresentationController,CoreGraphics.CGRect@,UIKit.UIView@) M:UIKit.UIPopoverPresentationControllerRepositionEventArgs.#ctor(CoreGraphics.CGRect,UIKit.UIView) M:UIKit.UIPopoverPresentationControllerSourceItem_Extensions.GetFrame(UIKit.IUIPopoverPresentationControllerSourceItem,UIKit.UIView) -M:UIKit.UIPresentationController.DidUpdateFocus(UIKit.UIFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) M:UIKit.UIPresentationController.Dispose(System.Boolean) -M:UIKit.UIPresentationController.GetSizeForChildContentContainer(UIKit.IUIContentContainer,CoreGraphics.CGSize) -M:UIKit.UIPresentationController.GetSoundIdentifier(UIKit.UIFocusUpdateContext) -M:UIKit.UIPresentationController.PreferredContentSizeDidChangeForChildContentContainer(UIKit.IUIContentContainer) -M:UIKit.UIPresentationController.RegisterForTraitChanges(ObjCRuntime.Class[],Foundation.NSObject,ObjCRuntime.Selector) -M:UIKit.UIPresentationController.RegisterForTraitChanges(ObjCRuntime.Class[],ObjCRuntime.Selector) -M:UIKit.UIPresentationController.RegisterForTraitChanges(ObjCRuntime.Class[],System.Action{UIKit.IUITraitEnvironment,UIKit.UITraitCollection}) -M:UIKit.UIPresentationController.SetNeedsFocusUpdate -M:UIKit.UIPresentationController.ShouldUpdateFocus(UIKit.UIFocusUpdateContext) -M:UIKit.UIPresentationController.SystemLayoutFittingSizeDidChangeForChildContentContainer(UIKit.IUIContentContainer) -M:UIKit.UIPresentationController.TraitCollectionDidChange(UIKit.UITraitCollection) -M:UIKit.UIPresentationController.UnregisterForTraitChanges(UIKit.IUITraitChangeRegistration) -M:UIKit.UIPresentationController.UpdateFocusIfNeeded -M:UIKit.UIPresentationController.ViewWillTransitionToSize(CoreGraphics.CGSize,UIKit.IUIViewControllerTransitionCoordinator) -M:UIKit.UIPresentationController.WillTransitionToTraitCollection(UIKit.UITraitCollection,UIKit.IUIViewControllerTransitionCoordinator) M:UIKit.UIPreviewAction.Copy(Foundation.NSZone) M:UIKit.UIPreviewActionGroup.Copy(Foundation.NSZone) M:UIKit.UIPreviewInteraction.add_DidCancel(System.EventHandler) @@ -51083,10 +46299,6 @@ M:UIKit.UIPreviewInteraction.remove_DidUpdateCommit(System.EventHandler{UIKit.NS M:UIKit.UIPreviewInteraction.remove_DidUpdatePreviewTransition(System.EventHandler{UIKit.NSPreviewInteractionPreviewUpdateEventArgs}) M:UIKit.UIPreviewInteractionDelegate_Extensions.DidUpdateCommit(UIKit.IUIPreviewInteractionDelegate,UIKit.UIPreviewInteraction,System.Runtime.InteropServices.NFloat,System.Boolean) M:UIKit.UIPreviewInteractionDelegate_Extensions.ShouldBegin(UIKit.IUIPreviewInteractionDelegate,UIKit.UIPreviewInteraction) -M:UIKit.UIPreviewInteractionDelegate.DidCancel(UIKit.UIPreviewInteraction) -M:UIKit.UIPreviewInteractionDelegate.DidUpdateCommit(UIKit.UIPreviewInteraction,System.Runtime.InteropServices.NFloat,System.Boolean) -M:UIKit.UIPreviewInteractionDelegate.DidUpdatePreviewTransition(UIKit.UIPreviewInteraction,System.Runtime.InteropServices.NFloat,System.Boolean) -M:UIKit.UIPreviewInteractionDelegate.ShouldBegin(UIKit.UIPreviewInteraction) M:UIKit.UIPreviewParameters.Copy(Foundation.NSZone) M:UIKit.UIPreviewTarget.Copy(Foundation.NSZone) M:UIKit.UIPrinter.ContactPrinterAsync @@ -51106,13 +46318,6 @@ M:UIKit.UIPrinterPickerControllerDelegate_Extensions.GetParentViewController(UIK M:UIKit.UIPrinterPickerControllerDelegate_Extensions.ShouldShowPrinter(UIKit.IUIPrinterPickerControllerDelegate,UIKit.UIPrinterPickerController,UIKit.UIPrinter) M:UIKit.UIPrinterPickerControllerDelegate_Extensions.WillDismiss(UIKit.IUIPrinterPickerControllerDelegate,UIKit.UIPrinterPickerController) M:UIKit.UIPrinterPickerControllerDelegate_Extensions.WillPresent(UIKit.IUIPrinterPickerControllerDelegate,UIKit.UIPrinterPickerController) -M:UIKit.UIPrinterPickerControllerDelegate.DidDismiss(UIKit.UIPrinterPickerController) -M:UIKit.UIPrinterPickerControllerDelegate.DidPresent(UIKit.UIPrinterPickerController) -M:UIKit.UIPrinterPickerControllerDelegate.DidSelectPrinter(UIKit.UIPrinterPickerController) -M:UIKit.UIPrinterPickerControllerDelegate.GetParentViewController(UIKit.UIPrinterPickerController) -M:UIKit.UIPrinterPickerControllerDelegate.ShouldShowPrinter(UIKit.UIPrinterPickerController,UIKit.UIPrinter) -M:UIKit.UIPrinterPickerControllerDelegate.WillDismiss(UIKit.UIPrinterPickerController) -M:UIKit.UIPrinterPickerControllerDelegate.WillPresent(UIKit.UIPrinterPickerController) M:UIKit.UIPrintFormatter.Copy(Foundation.NSZone) M:UIKit.UIPrintFormatter.Dispose(System.Boolean) M:UIKit.UIPrintInfo.Copy(Foundation.NSZone) @@ -51149,63 +46354,15 @@ M:UIKit.UIPrintInteractionControllerDelegate_Extensions.GetViewController(UIKit. M:UIKit.UIPrintInteractionControllerDelegate_Extensions.WillDismissPrinterOptions(UIKit.IUIPrintInteractionControllerDelegate,UIKit.UIPrintInteractionController) M:UIKit.UIPrintInteractionControllerDelegate_Extensions.WillPresentPrinterOptions(UIKit.IUIPrintInteractionControllerDelegate,UIKit.UIPrintInteractionController) M:UIKit.UIPrintInteractionControllerDelegate_Extensions.WillStartJob(UIKit.IUIPrintInteractionControllerDelegate,UIKit.UIPrintInteractionController) -M:UIKit.UIPrintInteractionControllerDelegate.ChooseCutterBehavior(UIKit.UIPrintInteractionController,Foundation.NSNumber[]) -M:UIKit.UIPrintInteractionControllerDelegate.ChoosePaper(UIKit.UIPrintInteractionController,UIKit.UIPrintPaper[]) -M:UIKit.UIPrintInteractionControllerDelegate.CutLengthForPaper(UIKit.UIPrintInteractionController,UIKit.UIPrintPaper) -M:UIKit.UIPrintInteractionControllerDelegate.DidDismissPrinterOptions(UIKit.UIPrintInteractionController) -M:UIKit.UIPrintInteractionControllerDelegate.DidFinishJob(UIKit.UIPrintInteractionController) -M:UIKit.UIPrintInteractionControllerDelegate.DidPresentPrinterOptions(UIKit.UIPrintInteractionController) -M:UIKit.UIPrintInteractionControllerDelegate.GetViewController(UIKit.UIPrintInteractionController) -M:UIKit.UIPrintInteractionControllerDelegate.WillDismissPrinterOptions(UIKit.UIPrintInteractionController) -M:UIKit.UIPrintInteractionControllerDelegate.WillPresentPrinterOptions(UIKit.UIPrintInteractionController) -M:UIKit.UIPrintInteractionControllerDelegate.WillStartJob(UIKit.UIPrintInteractionController) M:UIKit.UIPrintInteractionResult.#ctor(UIKit.UIPrintInteractionController,System.Boolean) M:UIKit.UIProgressView.EncodeTo(Foundation.NSCoder) M:UIKit.UIProgressView.UIProgressViewAppearance.#ctor(System.IntPtr) M:UIKit.UIPushBehavior.#ctor(UIKit.UIPushBehaviorMode,UIKit.IUIDynamicItem[]) -M:UIKit.UIReferenceLibraryViewController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UIReferenceLibraryViewController.EncodeTo(Foundation.NSCoder) M:UIKit.UIRefreshControl.UIRefreshControlAppearance.#ctor(System.IntPtr) M:UIKit.UIRegion.Copy(Foundation.NSZone) M:UIKit.UIRegion.EncodeTo(Foundation.NSCoder) M:UIKit.UIResolvedShape.Copy(Foundation.NSZone) -M:UIKit.UIResponder.AccessibilityDecrement -M:UIKit.UIResponder.AccessibilityElementDidBecomeFocused -M:UIKit.UIResponder.AccessibilityElementDidLoseFocus -M:UIKit.UIResponder.AccessibilityElementIsFocused -M:UIKit.UIResponder.AccessibilityIncrement -M:UIKit.UIResponder.AccessibilityPerformEscape -M:UIKit.UIResponder.AccessibilityPerformMagicTap -M:UIKit.UIResponder.AccessibilityScroll(UIKit.UIAccessibilityScrollDirection) -M:UIKit.UIResponder.CanPaste(Foundation.NSItemProvider[]) -M:UIKit.UIResponder.Copy(Foundation.NSObject) -M:UIKit.UIResponder.Cut(Foundation.NSObject) -M:UIKit.UIResponder.DecreaseSize(Foundation.NSObject) -M:UIKit.UIResponder.Delete(Foundation.NSObject) -M:UIKit.UIResponder.Duplicate(Foundation.NSObject) -M:UIKit.UIResponder.Export(Foundation.NSObject) -M:UIKit.UIResponder.Find(Foundation.NSObject) -M:UIKit.UIResponder.FindAndReplace(Foundation.NSObject) -M:UIKit.UIResponder.FindNext(Foundation.NSObject) -M:UIKit.UIResponder.FindPrevious(Foundation.NSObject) -M:UIKit.UIResponder.IncreaseSize(Foundation.NSObject) -M:UIKit.UIResponder.MakeTextWritingDirectionLeftToRight(Foundation.NSObject) -M:UIKit.UIResponder.MakeTextWritingDirectionRightToLeft(Foundation.NSObject) -M:UIKit.UIResponder.Move(Foundation.NSObject) -M:UIKit.UIResponder.Paste(Foundation.NSItemProvider[]) -M:UIKit.UIResponder.Paste(Foundation.NSObject) -M:UIKit.UIResponder.PasteAndGo(Foundation.NSObject) -M:UIKit.UIResponder.PasteAndMatchStyle(Foundation.NSObject) -M:UIKit.UIResponder.PasteAndSearch(Foundation.NSObject) -M:UIKit.UIResponder.Print(Foundation.NSObject) -M:UIKit.UIResponder.Rename(Foundation.NSObject) -M:UIKit.UIResponder.Select(Foundation.NSObject) -M:UIKit.UIResponder.SelectAll(Foundation.NSObject) -M:UIKit.UIResponder.ToggleBoldface(Foundation.NSObject) -M:UIKit.UIResponder.ToggleItalics(Foundation.NSObject) -M:UIKit.UIResponder.ToggleUnderline(Foundation.NSObject) -M:UIKit.UIResponder.UpdateTextAttributes(UIKit.UITextAttributesConversionHandler) -M:UIKit.UIResponder.UseSelectionForFind(Foundation.NSObject) M:UIKit.UIResponderStandardEditActions_Extensions.Copy(UIKit.IUIResponderStandardEditActions,Foundation.NSObject) M:UIKit.UIResponderStandardEditActions_Extensions.Cut(UIKit.IUIResponderStandardEditActions,Foundation.NSObject) M:UIKit.UIResponderStandardEditActions_Extensions.DecreaseSize(UIKit.IUIResponderStandardEditActions,Foundation.NSObject) @@ -51233,7 +46390,6 @@ M:UIKit.UIResponderStandardEditActions_Extensions.ToggleItalics(UIKit.IUIRespond M:UIKit.UIResponderStandardEditActions_Extensions.ToggleUnderline(UIKit.IUIResponderStandardEditActions,Foundation.NSObject) M:UIKit.UIResponderStandardEditActions_Extensions.UpdateTextAttributes(UIKit.IUIResponderStandardEditActions,UIKit.UITextAttributesConversionHandler) M:UIKit.UIResponderStandardEditActions_Extensions.UseSelectionForFind(UIKit.IUIResponderStandardEditActions,Foundation.NSObject) -M:UIKit.UIRotationGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UIRotationGestureRecognizer.#ctor(System.Action) M:UIKit.UIRotationGestureRecognizer.#ctor(System.Action{UIKit.UIRotationGestureRecognizer}) M:UIKit.UIScene.OpenUrlAsync(Foundation.NSUrl,UIKit.UISceneOpenExternalUrlOptions) @@ -51254,43 +46410,20 @@ M:UIKit.UISceneDelegate_Extensions.WillConnect(UIKit.IUISceneDelegate,UIKit.UISc M:UIKit.UISceneDelegate_Extensions.WillContinueUserActivity(UIKit.IUISceneDelegate,UIKit.UIScene,System.String) M:UIKit.UISceneDelegate_Extensions.WillEnterForeground(UIKit.IUISceneDelegate,UIKit.UIScene) M:UIKit.UISceneDelegate_Extensions.WillResignActive(UIKit.IUISceneDelegate,UIKit.UIScene) -M:UIKit.UISceneDelegate.ContinueUserActivity(UIKit.UIScene,Foundation.NSUserActivity) -M:UIKit.UISceneDelegate.DidBecomeActive(UIKit.UIScene) -M:UIKit.UISceneDelegate.DidDisconnect(UIKit.UIScene) -M:UIKit.UISceneDelegate.DidEnterBackground(UIKit.UIScene) -M:UIKit.UISceneDelegate.DidFailToContinueUserActivity(UIKit.UIScene,System.String,Foundation.NSError) -M:UIKit.UISceneDelegate.DidUpdateUserActivity(UIKit.UIScene,Foundation.NSUserActivity) -M:UIKit.UISceneDelegate.GetStateRestorationActivity(UIKit.UIScene) -M:UIKit.UISceneDelegate.OpenUrlContexts(UIKit.UIScene,Foundation.NSSet{UIKit.UIOpenUrlContext}) -M:UIKit.UISceneDelegate.RestoreInteractionState(UIKit.UIScene,Foundation.NSUserActivity) -M:UIKit.UISceneDelegate.WillConnect(UIKit.UIScene,UIKit.UISceneSession,UIKit.UISceneConnectionOptions) -M:UIKit.UISceneDelegate.WillContinueUserActivity(UIKit.UIScene,System.String) -M:UIKit.UISceneDelegate.WillEnterForeground(UIKit.UIScene) -M:UIKit.UISceneDelegate.WillResignActive(UIKit.UIScene) M:UIKit.UISceneSession.EncodeTo(Foundation.NSCoder) M:UIKit.UISceneSessionActivationRequest.Copy(Foundation.NSZone) M:UIKit.UIScreen.Capture M:UIKit.UIScreen.CreateDisplayLink(System.Action) M:UIKit.UIScreen.Dispose(System.Boolean) -M:UIKit.UIScreen.TraitCollectionDidChange(UIKit.UITraitCollection) -M:UIKit.UIScreenEdgePanGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UIScreenEdgePanGestureRecognizer.#ctor(System.Action) M:UIKit.UIScreenEdgePanGestureRecognizer.#ctor(System.Action{UIKit.UIScreenEdgePanGestureRecognizer}) M:UIKit.UIScreenshotService.Dispose(System.Boolean) M:UIKit.UIScreenshotServiceDelegate_Extensions.GeneratePdfRepresentation(UIKit.IUIScreenshotServiceDelegate,UIKit.UIScreenshotService,UIKit.UIScreenshotServiceDelegatePdfHandler) -M:UIKit.UIScreenshotServiceDelegate.GeneratePdfRepresentation(UIKit.UIScreenshotService,UIKit.UIScreenshotServiceDelegatePdfHandler) -M:UIKit.UIScribbleInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIScribbleInteraction.Dispose(System.Boolean) -M:UIKit.UIScribbleInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIScribbleInteractionDelegate_Extensions.DidFinishWriting(UIKit.IUIScribbleInteractionDelegate,UIKit.UIScribbleInteraction) M:UIKit.UIScribbleInteractionDelegate_Extensions.ShouldBegin(UIKit.IUIScribbleInteractionDelegate,UIKit.UIScribbleInteraction,CoreGraphics.CGPoint) M:UIKit.UIScribbleInteractionDelegate_Extensions.ShouldDelayFocus(UIKit.IUIScribbleInteractionDelegate,UIKit.UIScribbleInteraction) M:UIKit.UIScribbleInteractionDelegate_Extensions.WillBeginWriting(UIKit.IUIScribbleInteractionDelegate,UIKit.UIScribbleInteraction) -M:UIKit.UIScribbleInteractionDelegate.DidFinishWriting(UIKit.UIScribbleInteraction) -M:UIKit.UIScribbleInteractionDelegate.ShouldBegin(UIKit.UIScribbleInteraction,CoreGraphics.CGPoint) -M:UIKit.UIScribbleInteractionDelegate.ShouldDelayFocus(UIKit.UIScribbleInteraction) -M:UIKit.UIScribbleInteractionDelegate.WillBeginWriting(UIKit.UIScribbleInteraction) -M:UIKit.UIScrollView.#ctor(CoreGraphics.CGRect) M:UIKit.UIScrollView.add_DecelerationEnded(System.EventHandler) M:UIKit.UIScrollView.add_DecelerationStarted(System.EventHandler) M:UIKit.UIScrollView.add_DidChangeAdjustedContentInset(System.EventHandler) @@ -51304,7 +46437,6 @@ M:UIKit.UIScrollView.add_WillEndDragging(System.EventHandler{UIKit.WillEndDraggi M:UIKit.UIScrollView.add_ZoomingEnded(System.EventHandler{UIKit.ZoomingEndedEventArgs}) M:UIKit.UIScrollView.add_ZoomingStarted(System.EventHandler{UIKit.UIScrollViewZoomingEventArgs}) M:UIKit.UIScrollView.Dispose(System.Boolean) -M:UIKit.UIScrollView.GetFocusItems(CoreGraphics.CGRect) M:UIKit.UIScrollView.remove_DecelerationEnded(System.EventHandler) M:UIKit.UIScrollView.remove_DecelerationStarted(System.EventHandler) M:UIKit.UIScrollView.remove_DidChangeAdjustedContentInset(System.EventHandler) @@ -51320,8 +46452,6 @@ M:UIKit.UIScrollView.remove_ZoomingStarted(System.EventHandler{UIKit.UIScrollVie M:UIKit.UIScrollView.UIScrollViewAppearance.#ctor(System.IntPtr) M:UIKit.UIScrollViewAccessibilityDelegate_Extensions.GetAccessibilityAttributedScrollStatus(UIKit.IUIScrollViewAccessibilityDelegate,UIKit.UIScrollView) M:UIKit.UIScrollViewAccessibilityDelegate_Extensions.GetAccessibilityScrollStatus(UIKit.IUIScrollViewAccessibilityDelegate,UIKit.UIScrollView) -M:UIKit.UIScrollViewAccessibilityDelegate.GetAccessibilityAttributedScrollStatus(UIKit.UIScrollView) -M:UIKit.UIScrollViewAccessibilityDelegate.GetAccessibilityScrollStatus(UIKit.UIScrollView) M:UIKit.UIScrollViewDelegate_Extensions.DecelerationEnded(UIKit.IUIScrollViewDelegate,UIKit.UIScrollView) M:UIKit.UIScrollViewDelegate_Extensions.DecelerationStarted(UIKit.IUIScrollViewDelegate,UIKit.UIScrollView) M:UIKit.UIScrollViewDelegate_Extensions.DidChangeAdjustedContentInset(UIKit.IUIScrollViewDelegate,UIKit.UIScrollView) @@ -51336,20 +46466,6 @@ M:UIKit.UIScrollViewDelegate_Extensions.ViewForZoomingInScrollView(UIKit.IUIScro M:UIKit.UIScrollViewDelegate_Extensions.WillEndDragging(UIKit.IUIScrollViewDelegate,UIKit.UIScrollView,CoreGraphics.CGPoint,CoreGraphics.CGPoint@) M:UIKit.UIScrollViewDelegate_Extensions.ZoomingEnded(UIKit.IUIScrollViewDelegate,UIKit.UIScrollView,UIKit.UIView,System.Runtime.InteropServices.NFloat) M:UIKit.UIScrollViewDelegate_Extensions.ZoomingStarted(UIKit.IUIScrollViewDelegate,UIKit.UIScrollView,UIKit.UIView) -M:UIKit.UIScrollViewDelegate.DecelerationEnded(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.DecelerationStarted(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.DidChangeAdjustedContentInset(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.DidZoom(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.DraggingEnded(UIKit.UIScrollView,System.Boolean) -M:UIKit.UIScrollViewDelegate.DraggingStarted(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.ScrollAnimationEnded(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.Scrolled(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.ScrolledToTop(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.ShouldScrollToTop(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.ViewForZoomingInScrollView(UIKit.UIScrollView) -M:UIKit.UIScrollViewDelegate.WillEndDragging(UIKit.UIScrollView,CoreGraphics.CGPoint,CoreGraphics.CGPoint@) -M:UIKit.UIScrollViewDelegate.ZoomingEnded(UIKit.UIScrollView,UIKit.UIView,System.Runtime.InteropServices.NFloat) -M:UIKit.UIScrollViewDelegate.ZoomingStarted(UIKit.UIScrollView,UIKit.UIView) M:UIKit.UIScrollViewZoomingEventArgs.#ctor(UIKit.UIView) M:UIKit.UISearchBar.add_BookmarkButtonClicked(System.EventHandler) M:UIKit.UISearchBar.add_CancelButtonClicked(System.EventHandler) @@ -51398,31 +46514,9 @@ M:UIKit.UISearchBarDelegate_Extensions.ShouldBeginEditing(UIKit.IUISearchBarDele M:UIKit.UISearchBarDelegate_Extensions.ShouldChangeTextInRange(UIKit.IUISearchBarDelegate,UIKit.UISearchBar,Foundation.NSRange,System.String) M:UIKit.UISearchBarDelegate_Extensions.ShouldEndEditing(UIKit.IUISearchBarDelegate,UIKit.UISearchBar) M:UIKit.UISearchBarDelegate_Extensions.TextChanged(UIKit.IUISearchBarDelegate,UIKit.UISearchBar,System.String) -M:UIKit.UISearchBarDelegate.BookmarkButtonClicked(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.CancelButtonClicked(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.ListButtonClicked(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.OnEditingStarted(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.OnEditingStopped(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.SearchButtonClicked(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.SelectedScopeButtonIndexChanged(UIKit.UISearchBar,System.IntPtr) -M:UIKit.UISearchBarDelegate.ShouldBeginEditing(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.ShouldChangeTextInRange(UIKit.UISearchBar,Foundation.NSRange,System.String) -M:UIKit.UISearchBarDelegate.ShouldEndEditing(UIKit.UISearchBar) -M:UIKit.UISearchBarDelegate.TextChanged(UIKit.UISearchBar,System.String) M:UIKit.UISearchBarTextChangedEventArgs.#ctor(System.String) -M:UIKit.UISearchContainerViewController.#ctor(System.String,Foundation.NSBundle) -M:UIKit.UISearchController.#ctor -M:UIKit.UISearchController.AnimateTransition(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UISearchController.AnimationEnded(System.Boolean) M:UIKit.UISearchController.Dispose(System.Boolean) -M:UIKit.UISearchController.GetAnimationControllerForDismissedController(UIKit.UIViewController) -M:UIKit.UISearchController.GetAnimationControllerForPresentedController(UIKit.UIViewController,UIKit.UIViewController,UIKit.UIViewController) -M:UIKit.UISearchController.GetInteractionControllerForDismissal(UIKit.IUIViewControllerAnimatedTransitioning) -M:UIKit.UISearchController.GetInteractionControllerForPresentation(UIKit.IUIViewControllerAnimatedTransitioning) -M:UIKit.UISearchController.GetInterruptibleAnimator(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UISearchController.GetPresentationControllerForPresentedViewController(UIKit.UIViewController,UIKit.UIViewController,UIKit.UIViewController) M:UIKit.UISearchController.SetSearchResultsUpdater(System.Action{UIKit.UISearchController}) -M:UIKit.UISearchController.TransitionDuration(UIKit.IUIViewControllerContextTransitioning) M:UIKit.UISearchControllerDelegate_Extensions.DidChangeFromSearchBarPlacement(UIKit.IUISearchControllerDelegate,UIKit.UISearchController,UIKit.UINavigationItemSearchBarPlacement) M:UIKit.UISearchControllerDelegate_Extensions.DidDismissSearchController(UIKit.IUISearchControllerDelegate,UIKit.UISearchController) M:UIKit.UISearchControllerDelegate_Extensions.DidPresentSearchController(UIKit.IUISearchControllerDelegate,UIKit.UISearchController) @@ -51430,13 +46524,6 @@ M:UIKit.UISearchControllerDelegate_Extensions.PresentSearchController(UIKit.IUIS M:UIKit.UISearchControllerDelegate_Extensions.WillChangeToSearchBarPlacement(UIKit.IUISearchControllerDelegate,UIKit.UISearchController,UIKit.UINavigationItemSearchBarPlacement) M:UIKit.UISearchControllerDelegate_Extensions.WillDismissSearchController(UIKit.IUISearchControllerDelegate,UIKit.UISearchController) M:UIKit.UISearchControllerDelegate_Extensions.WillPresentSearchController(UIKit.IUISearchControllerDelegate,UIKit.UISearchController) -M:UIKit.UISearchControllerDelegate.DidChangeFromSearchBarPlacement(UIKit.UISearchController,UIKit.UINavigationItemSearchBarPlacement) -M:UIKit.UISearchControllerDelegate.DidDismissSearchController(UIKit.UISearchController) -M:UIKit.UISearchControllerDelegate.DidPresentSearchController(UIKit.UISearchController) -M:UIKit.UISearchControllerDelegate.PresentSearchController(UIKit.UISearchController) -M:UIKit.UISearchControllerDelegate.WillChangeToSearchBarPlacement(UIKit.UISearchController,UIKit.UINavigationItemSearchBarPlacement) -M:UIKit.UISearchControllerDelegate.WillDismissSearchController(UIKit.UISearchController) -M:UIKit.UISearchControllerDelegate.WillPresentSearchController(UIKit.UISearchController) M:UIKit.UISearchDisplayController.Dispose(System.Boolean) M:UIKit.UISearchDisplayDelegate_Extensions.DidBeginSearch(UIKit.IUISearchDisplayDelegate,UIKit.UISearchDisplayController) M:UIKit.UISearchDisplayDelegate_Extensions.DidEndSearch(UIKit.IUISearchDisplayDelegate,UIKit.UISearchDisplayController) @@ -51450,44 +46537,15 @@ M:UIKit.UISearchDisplayDelegate_Extensions.WillEndSearch(UIKit.IUISearchDisplayD M:UIKit.UISearchDisplayDelegate_Extensions.WillHideSearchResults(UIKit.IUISearchDisplayDelegate,UIKit.UISearchDisplayController,UIKit.UITableView) M:UIKit.UISearchDisplayDelegate_Extensions.WillShowSearchResults(UIKit.IUISearchDisplayDelegate,UIKit.UISearchDisplayController,UIKit.UITableView) M:UIKit.UISearchDisplayDelegate_Extensions.WillUnloadSearchResults(UIKit.IUISearchDisplayDelegate,UIKit.UISearchDisplayController,UIKit.UITableView) -M:UIKit.UISearchDisplayDelegate.DidBeginSearch(UIKit.UISearchDisplayController) -M:UIKit.UISearchDisplayDelegate.DidEndSearch(UIKit.UISearchDisplayController) -M:UIKit.UISearchDisplayDelegate.DidHideSearchResults(UIKit.UISearchDisplayController,UIKit.UITableView) -M:UIKit.UISearchDisplayDelegate.DidLoadSearchResults(UIKit.UISearchDisplayController,UIKit.UITableView) -M:UIKit.UISearchDisplayDelegate.DidShowSearchResults(UIKit.UISearchDisplayController,UIKit.UITableView) -M:UIKit.UISearchDisplayDelegate.ShouldReloadForSearchScope(UIKit.UISearchDisplayController,System.IntPtr) -M:UIKit.UISearchDisplayDelegate.ShouldReloadForSearchString(UIKit.UISearchDisplayController,System.String) -M:UIKit.UISearchDisplayDelegate.WillBeginSearch(UIKit.UISearchDisplayController) -M:UIKit.UISearchDisplayDelegate.WillEndSearch(UIKit.UISearchDisplayController) -M:UIKit.UISearchDisplayDelegate.WillHideSearchResults(UIKit.UISearchDisplayController,UIKit.UITableView) -M:UIKit.UISearchDisplayDelegate.WillShowSearchResults(UIKit.UISearchDisplayController,UIKit.UITableView) -M:UIKit.UISearchDisplayDelegate.WillUnloadSearchResults(UIKit.UISearchDisplayController,UIKit.UITableView) M:UIKit.UISearchResultsUpdating_Extensions.UpdateSearchResults(UIKit.IUISearchResultsUpdating,UIKit.UISearchController,UIKit.IUISearchSuggestion) -M:UIKit.UISearchResultsUpdating.UpdateSearchResults(UIKit.UISearchController,UIKit.IUISearchSuggestion) -M:UIKit.UISearchResultsUpdating.UpdateSearchResultsForSearchController(UIKit.UISearchController) M:UIKit.UISearchSuggestion_Extensions.GetIconImage(UIKit.IUISearchSuggestion) M:UIKit.UISearchSuggestion_Extensions.GetLocalizedAttributedSuggestion(UIKit.IUISearchSuggestion) M:UIKit.UISearchSuggestion_Extensions.GetLocalizedDescription(UIKit.IUISearchSuggestion) M:UIKit.UISearchSuggestion_Extensions.GetRepresentedObject(UIKit.IUISearchSuggestion) M:UIKit.UISearchSuggestion_Extensions.SetRepresentedObject(UIKit.IUISearchSuggestion,Foundation.NSObject) -M:UIKit.UISearchTextField.#ctor(CoreGraphics.CGRect) M:UIKit.UISearchTextField.UISearchTextFieldAppearance.#ctor(System.IntPtr) M:UIKit.UISearchTextFieldDelegate_Extensions.DidSelectSuggestion(UIKit.IUISearchTextFieldDelegate,UIKit.UISearchTextField,UIKit.IUISearchSuggestion) M:UIKit.UISearchTextFieldDelegate_Extensions.GetItemProvider(UIKit.IUISearchTextFieldDelegate,UIKit.UISearchTextField,UIKit.UISearchToken) -M:UIKit.UISearchTextFieldDelegate.DidChangeSelection(UIKit.UITextField) -M:UIKit.UISearchTextFieldDelegate.DidSelectSuggestion(UIKit.UISearchTextField,UIKit.IUISearchSuggestion) -M:UIKit.UISearchTextFieldDelegate.EditingEnded(UIKit.UITextField,UIKit.UITextFieldDidEndEditingReason) -M:UIKit.UISearchTextFieldDelegate.EditingEnded(UIKit.UITextField) -M:UIKit.UISearchTextFieldDelegate.EditingStarted(UIKit.UITextField) -M:UIKit.UISearchTextFieldDelegate.GetEditMenu(UIKit.UITextField,Foundation.NSRange,UIKit.UIMenuElement[]) -M:UIKit.UISearchTextFieldDelegate.GetItemProvider(UIKit.UISearchTextField,UIKit.UISearchToken) -M:UIKit.UISearchTextFieldDelegate.ShouldBeginEditing(UIKit.UITextField) -M:UIKit.UISearchTextFieldDelegate.ShouldChangeCharacters(UIKit.UITextField,Foundation.NSRange,System.String) -M:UIKit.UISearchTextFieldDelegate.ShouldClear(UIKit.UITextField) -M:UIKit.UISearchTextFieldDelegate.ShouldEndEditing(UIKit.UITextField) -M:UIKit.UISearchTextFieldDelegate.ShouldReturn(UIKit.UITextField) -M:UIKit.UISearchTextFieldDelegate.WillDismissEditMenu(UIKit.UITextField,UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UISearchTextFieldDelegate.WillPresentEditMenu(UIKit.UITextField,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UISegmentedControl.#ctor(Foundation.NSString[]) M:UIKit.UISegmentedControl.#ctor(System.Object[]) M:UIKit.UISegmentedControl.#ctor(System.String[]) @@ -51505,24 +46563,11 @@ M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetContentPositionAdjust M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetDividerImage(UIKit.UIImage,UIKit.UIControlState,UIKit.UIControlState,UIKit.UIBarMetrics) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetTitleTextAttributes(Foundation.NSDictionary,UIKit.UIControlState) M:UIKit.UISegmentedControl.UISegmentedControlAppearance.SetTitleTextAttributes(UIKit.UIStringAttributes,UIKit.UIControlState) -M:UIKit.UISelectionFeedbackGenerator.GetFeedbackGenerator(UIKit.UIView) M:UIKit.UIShadowProperties.Copy(Foundation.NSZone) M:UIKit.UIShadowProperties.EncodeTo(Foundation.NSCoder) M:UIKit.UIShape.Copy(Foundation.NSZone) -M:UIKit.UISheetPresentationController.#ctor(UIKit.UIViewController,UIKit.UIViewController) M:UIKit.UISheetPresentationController.Dispose(System.Boolean) M:UIKit.UISheetPresentationControllerDelegate_Extensions.DidChangeSelectedDetentIdentifier(UIKit.IUISheetPresentationControllerDelegate,UIKit.UISheetPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.DidAttemptToDismiss(UIKit.UIPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.DidChangeSelectedDetentIdentifier(UIKit.UISheetPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.DidDismiss(UIKit.UIPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.GetAdaptivePresentationStyle(UIKit.UIPresentationController,UIKit.UITraitCollection) -M:UIKit.UISheetPresentationControllerDelegate.GetAdaptivePresentationStyle(UIKit.UIPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.GetViewControllerForAdaptivePresentation(UIKit.UIPresentationController,UIKit.UIModalPresentationStyle) -M:UIKit.UISheetPresentationControllerDelegate.PrepareAdaptivePresentationController(UIKit.UIPresentationController,UIKit.UIPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.ShouldDismiss(UIKit.UIPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.WillDismiss(UIKit.UIPresentationController) -M:UIKit.UISheetPresentationControllerDelegate.WillPresent(UIKit.UIPresentationController,UIKit.UIModalPresentationStyle,UIKit.IUIViewControllerTransitionCoordinator) -M:UIKit.UISlider.#ctor(CoreGraphics.CGRect) M:UIKit.UISlider.UISliderAppearance.#ctor(System.IntPtr) M:UIKit.UISlider.UISliderAppearance.MaxTrackImage(UIKit.UIControlState) M:UIKit.UISlider.UISliderAppearance.MinTrackImage(UIKit.UIControlState) @@ -51576,58 +46621,24 @@ M:UIKit.UISplitViewControllerDelegate_Extensions.WillHideViewController(UIKit.IU M:UIKit.UISplitViewControllerDelegate_Extensions.WillPresentViewController(UIKit.IUISplitViewControllerDelegate,UIKit.UISplitViewController,UIKit.UIPopoverController,UIKit.UIViewController) M:UIKit.UISplitViewControllerDelegate_Extensions.WillShowColumn(UIKit.IUISplitViewControllerDelegate,UIKit.UISplitViewController,UIKit.UISplitViewControllerColumn) M:UIKit.UISplitViewControllerDelegate_Extensions.WillShowViewController(UIKit.IUISplitViewControllerDelegate,UIKit.UISplitViewController,UIKit.UIViewController,UIKit.UIBarButtonItem) -M:UIKit.UISplitViewControllerDelegate.CollapseSecondViewController(UIKit.UISplitViewController,UIKit.UIViewController,UIKit.UIViewController) -M:UIKit.UISplitViewControllerDelegate.DidCollapse(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.DidExpand(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.EventShowDetailViewController(UIKit.UISplitViewController,UIKit.UIViewController,Foundation.NSObject) -M:UIKit.UISplitViewControllerDelegate.EventShowViewController(UIKit.UISplitViewController,UIKit.UIViewController,Foundation.NSObject) -M:UIKit.UISplitViewControllerDelegate.GetDisplayModeForExpanding(UIKit.UISplitViewController,UIKit.UISplitViewControllerDisplayMode) -M:UIKit.UISplitViewControllerDelegate.GetPreferredInterfaceOrientationForPresentation(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.GetPrimaryViewControllerForCollapsingSplitViewController(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.GetPrimaryViewControllerForExpandingSplitViewController(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.GetTargetDisplayModeForAction(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.GetTopColumnForCollapsing(UIKit.UISplitViewController,UIKit.UISplitViewControllerColumn) -M:UIKit.UISplitViewControllerDelegate.InteractivePresentationGestureDidEnd(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.InteractivePresentationGestureWillBegin(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.SeparateSecondaryViewController(UIKit.UISplitViewController,UIKit.UIViewController) -M:UIKit.UISplitViewControllerDelegate.ShouldHideViewController(UIKit.UISplitViewController,UIKit.UIViewController,UIKit.UIInterfaceOrientation) -M:UIKit.UISplitViewControllerDelegate.SupportedInterfaceOrientations(UIKit.UISplitViewController) -M:UIKit.UISplitViewControllerDelegate.WillChangeDisplayMode(UIKit.UISplitViewController,UIKit.UISplitViewControllerDisplayMode) -M:UIKit.UISplitViewControllerDelegate.WillHideColumn(UIKit.UISplitViewController,UIKit.UISplitViewControllerColumn) -M:UIKit.UISplitViewControllerDelegate.WillHideViewController(UIKit.UISplitViewController,UIKit.UIViewController,UIKit.UIBarButtonItem,UIKit.UIPopoverController) -M:UIKit.UISplitViewControllerDelegate.WillPresentViewController(UIKit.UISplitViewController,UIKit.UIPopoverController,UIKit.UIViewController) -M:UIKit.UISplitViewControllerDelegate.WillShowColumn(UIKit.UISplitViewController,UIKit.UISplitViewControllerColumn) -M:UIKit.UISplitViewControllerDelegate.WillShowViewController(UIKit.UISplitViewController,UIKit.UIViewController,UIKit.UIBarButtonItem) M:UIKit.UISplitViewControllerDisplayModeEventArgs.#ctor(UIKit.UISplitViewControllerDisplayMode) M:UIKit.UISplitViewControllerWillShowHideColumnEventArgs.#ctor(UIKit.UISplitViewControllerColumn) M:UIKit.UISplitViewHideEventArgs.#ctor(UIKit.UIViewController,UIKit.UIBarButtonItem,UIKit.UIPopoverController) M:UIKit.UISplitViewPresentEventArgs.#ctor(UIKit.UIPopoverController,UIKit.UIViewController) M:UIKit.UISplitViewShowEventArgs.#ctor(UIKit.UIViewController,UIKit.UIBarButtonItem) -M:UIKit.UISpringLoadedInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UISpringLoadedInteraction.Dispose(System.Boolean) -M:UIKit.UISpringLoadedInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UISpringLoadedInteractionBehavior_Extensions.InteractionDidFinish(UIKit.IUISpringLoadedInteractionBehavior,UIKit.UISpringLoadedInteraction) M:UIKit.UISpringTimingParameters.Copy(Foundation.NSZone) M:UIKit.UISpringTimingParameters.EncodeTo(Foundation.NSCoder) M:UIKit.UIStackView.UIStackViewAppearance.#ctor(System.IntPtr) -M:UIKit.UIStandardTextCursorView.#ctor(CoreGraphics.CGRect) -M:UIKit.UIStandardTextCursorView.ConvertPointFromCoordinateSpace(CoreGraphics.CGPoint,UIKit.IUICoordinateSpace) -M:UIKit.UIStandardTextCursorView.ConvertPointToCoordinateSpace(CoreGraphics.CGPoint,UIKit.IUICoordinateSpace) -M:UIKit.UIStandardTextCursorView.ConvertRectFromCoordinateSpace(CoreGraphics.CGRect,UIKit.IUICoordinateSpace) -M:UIKit.UIStandardTextCursorView.ConvertRectToCoordinateSpace(CoreGraphics.CGRect,UIKit.IUICoordinateSpace) -M:UIKit.UIStandardTextCursorView.ResetBlinkAnimation M:UIKit.UIStandardTextCursorView.UIStandardTextCursorViewAppearance.#ctor(System.IntPtr) M:UIKit.UIStateRestoring_Extensions.ApplicationFinishedRestoringState(UIKit.IUIStateRestoring) M:UIKit.UIStateRestoring_Extensions.DecodeRestorableState(UIKit.IUIStateRestoring,Foundation.NSCoder) M:UIKit.UIStateRestoring_Extensions.EncodeRestorableState(UIKit.IUIStateRestoring,Foundation.NSCoder) M:UIKit.UIStateRestoring_Extensions.GetObjectRestorationClass(UIKit.IUIStateRestoring) M:UIKit.UIStateRestoring_Extensions.GetRestorationParent(UIKit.IUIStateRestoring) -M:UIKit.UIStateRestoring.ApplicationFinishedRestoringState -M:UIKit.UIStateRestoring.DecodeRestorableState(Foundation.NSCoder) -M:UIKit.UIStateRestoring.EncodeRestorableState(Foundation.NSCoder) M:UIKit.UIStatusBarFrameChangeEventArgs.#ctor(Foundation.NSNotification) M:UIKit.UIStatusBarOrientationChangeEventArgs.#ctor(Foundation.NSNotification) -M:UIKit.UIStepper.#ctor(CoreGraphics.CGRect) M:UIKit.UIStepper.UIStepperAppearance.#ctor(System.IntPtr) M:UIKit.UIStepper.UIStepperAppearance.BackgroundImage(UIKit.UIControlState) M:UIKit.UIStepper.UIStepperAppearance.GetDecrementImage(UIKit.UIControlState) @@ -51637,7 +46648,6 @@ M:UIKit.UIStepper.UIStepperAppearance.SetBackgroundImage(UIKit.UIImage,UIKit.UIC M:UIKit.UIStepper.UIStepperAppearance.SetDecrementImage(UIKit.UIImage,UIKit.UIControlState) M:UIKit.UIStepper.UIStepperAppearance.SetDividerImage(UIKit.UIImage,UIKit.UIControlState,UIKit.UIControlState) M:UIKit.UIStepper.UIStepperAppearance.SetIncrementImage(UIKit.UIImage,UIKit.UIControlState) -M:UIKit.UIStoryboardPopoverSegue.#ctor(System.String,UIKit.UIViewController,UIKit.UIViewController) M:UIKit.UIStringAttributes.#ctor M:UIKit.UIStringAttributes.#ctor(Foundation.NSDictionary) M:UIKit.UIStringDrawing.DrawString(Foundation.NSString,CoreGraphics.CGPoint,System.Runtime.InteropServices.NFloat,UIKit.UIFont,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat@,UIKit.UILineBreakMode,UIKit.UIBaselineAdjustment) @@ -51664,14 +46674,11 @@ M:UIKit.UIStringDrawing.StringSize(System.String,UIKit.UIFont,CoreGraphics.CGSiz M:UIKit.UIStringDrawing.StringSize(System.String,UIKit.UIFont,System.Runtime.InteropServices.NFloat,System.Runtime.InteropServices.NFloat@,System.Runtime.InteropServices.NFloat,UIKit.UILineBreakMode) M:UIKit.UIStringDrawing.StringSize(System.String,UIKit.UIFont,System.Runtime.InteropServices.NFloat,UIKit.UILineBreakMode) M:UIKit.UIStringDrawing.StringSize(System.String,UIKit.UIFont) -M:UIKit.UISwipeGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UISwipeGestureRecognizer.#ctor(System.Action) M:UIKit.UISwipeGestureRecognizer.#ctor(System.Action{UIKit.UISwipeGestureRecognizer}) M:UIKit.UISwitch.EncodeTo(Foundation.NSCoder) M:UIKit.UISwitch.UISwitchAppearance.#ctor(System.IntPtr) M:UIKit.UISymbolEffectCompletionContext.Dispose(System.Boolean) -M:UIKit.UITab.GetFrame(UIKit.UIView) -M:UIKit.UITabBar.#ctor(CoreGraphics.CGRect) M:UIKit.UITabBar.add_DidBeginCustomizingItems(System.EventHandler{UIKit.UITabBarItemsEventArgs}) M:UIKit.UITabBar.add_DidEndCustomizingItems(System.EventHandler{UIKit.UITabBarFinalItemsEventArgs}) M:UIKit.UITabBar.add_ItemSelected(System.EventHandler{UIKit.UITabBarItemEventArgs}) @@ -51685,9 +46692,6 @@ M:UIKit.UITabBar.remove_WillBeginCustomizingItems(System.EventHandler{UIKit.UITa M:UIKit.UITabBar.remove_WillEndCustomizingItems(System.EventHandler{UIKit.UITabBarFinalItemsEventArgs}) M:UIKit.UITabBar.UITabBarAppearance.#ctor(System.IntPtr) M:UIKit.UITabBarAcceptItemsEventArgs.#ctor(UIKit.UITab,UIKit.IUIDropSession) -M:UIKit.UITabBarAppearance.#ctor(UIKit.UIBarAppearance) -M:UIKit.UITabBarAppearance.#ctor(UIKit.UIUserInterfaceIdiom) -M:UIKit.UITabBarController.#ctor(System.String,Foundation.NSBundle) M:UIKit.UITabBarController.add_AcceptItemsFromDropSession(System.EventHandler{UIKit.UITabBarAcceptItemsEventArgs}) M:UIKit.UITabBarController.add_DidBeginEditing(System.EventHandler) M:UIKit.UITabBarController.add_DidSelectTab(System.EventHandler{UIKit.UITabBarTabSelectionEventArgs}) @@ -51698,10 +46702,7 @@ M:UIKit.UITabBarController.add_OnEndCustomizingViewControllers(System.EventHandl M:UIKit.UITabBarController.add_ViewControllerSelected(System.EventHandler{UIKit.UITabBarSelectionEventArgs}) M:UIKit.UITabBarController.add_VisibilityDidChangeForTabs(System.EventHandler{UIKit.UITabBarTabVisibilityChangeEventArgs}) M:UIKit.UITabBarController.add_WillBeginEditing(System.EventHandler) -M:UIKit.UITabBarController.DidBeginCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[]) -M:UIKit.UITabBarController.DidEndCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[],System.Boolean) M:UIKit.UITabBarController.Dispose(System.Boolean) -M:UIKit.UITabBarController.ItemSelected(UIKit.UITabBar,UIKit.UITabBarItem) M:UIKit.UITabBarController.remove_AcceptItemsFromDropSession(System.EventHandler{UIKit.UITabBarAcceptItemsEventArgs}) M:UIKit.UITabBarController.remove_DidBeginEditing(System.EventHandler) M:UIKit.UITabBarController.remove_DidSelectTab(System.EventHandler{UIKit.UITabBarTabSelectionEventArgs}) @@ -51712,8 +46713,6 @@ M:UIKit.UITabBarController.remove_OnEndCustomizingViewControllers(System.EventHa M:UIKit.UITabBarController.remove_ViewControllerSelected(System.EventHandler{UIKit.UITabBarSelectionEventArgs}) M:UIKit.UITabBarController.remove_VisibilityDidChangeForTabs(System.EventHandler{UIKit.UITabBarTabVisibilityChangeEventArgs}) M:UIKit.UITabBarController.remove_WillBeginEditing(System.EventHandler) -M:UIKit.UITabBarController.WillBeginCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[]) -M:UIKit.UITabBarController.WillEndCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[],System.Boolean) M:UIKit.UITabBarControllerDelegate_Extensions.AcceptItemsFromDropSession(UIKit.IUITabBarControllerDelegate,UIKit.UITabBarController,UIKit.UITab,UIKit.IUIDropSession) M:UIKit.UITabBarControllerDelegate_Extensions.DidBeginEditing(UIKit.IUITabBarControllerDelegate,UIKit.UITabBarController) M:UIKit.UITabBarControllerDelegate_Extensions.DidSelectTab(UIKit.IUITabBarControllerDelegate,UIKit.UITabBarController,UIKit.UITab,UIKit.UITab) @@ -51732,33 +46731,7 @@ M:UIKit.UITabBarControllerDelegate_Extensions.SupportedInterfaceOrientations(UIK M:UIKit.UITabBarControllerDelegate_Extensions.ViewControllerSelected(UIKit.IUITabBarControllerDelegate,UIKit.UITabBarController,UIKit.UIViewController) M:UIKit.UITabBarControllerDelegate_Extensions.VisibilityDidChangeForTabs(UIKit.IUITabBarControllerDelegate,UIKit.UITabBarController,UIKit.UITab[]) M:UIKit.UITabBarControllerDelegate_Extensions.WillBeginEditing(UIKit.IUITabBarControllerDelegate,UIKit.UITabBarController) -M:UIKit.UITabBarControllerDelegate.AcceptItemsFromDropSession(UIKit.UITabBarController,UIKit.UITab,UIKit.IUIDropSession) -M:UIKit.UITabBarControllerDelegate.DidBeginEditing(UIKit.UITabBarController) -M:UIKit.UITabBarControllerDelegate.DidSelectTab(UIKit.UITabBarController,UIKit.UITab,UIKit.UITab) -M:UIKit.UITabBarControllerDelegate.DisplayOrderDidChangeForGroup(UIKit.UITabBarController,UIKit.UITabGroup) -M:UIKit.UITabBarControllerDelegate.FinishedCustomizingViewControllers(UIKit.UITabBarController,UIKit.UIViewController[],System.Boolean) -M:UIKit.UITabBarControllerDelegate.GetAnimationControllerForTransition(UIKit.UITabBarController,UIKit.UIViewController,UIKit.UIViewController) -M:UIKit.UITabBarControllerDelegate.GetDisplayedViewControllers(UIKit.UITabBarController,UIKit.UITab,UIKit.UIViewController[]) -M:UIKit.UITabBarControllerDelegate.GetInteractionControllerForAnimationController(UIKit.UITabBarController,UIKit.IUIViewControllerAnimatedTransitioning) -M:UIKit.UITabBarControllerDelegate.GetOperationForAcceptingItemsFromDropSession(UIKit.UITabBarController,UIKit.UITab,UIKit.IUIDropSession) -M:UIKit.UITabBarControllerDelegate.GetPreferredInterfaceOrientation(UIKit.UITabBarController) -M:UIKit.UITabBarControllerDelegate.OnCustomizingViewControllers(UIKit.UITabBarController,UIKit.UIViewController[]) -M:UIKit.UITabBarControllerDelegate.OnEndCustomizingViewControllers(UIKit.UITabBarController,UIKit.UIViewController[],System.Boolean) -M:UIKit.UITabBarControllerDelegate.ShouldSelectTab(UIKit.UITabBarController,UIKit.UITab) -M:UIKit.UITabBarControllerDelegate.ShouldSelectViewController(UIKit.UITabBarController,UIKit.UIViewController) -M:UIKit.UITabBarControllerDelegate.SupportedInterfaceOrientations(UIKit.UITabBarController) -M:UIKit.UITabBarControllerDelegate.ViewControllerSelected(UIKit.UITabBarController,UIKit.UIViewController) -M:UIKit.UITabBarControllerDelegate.VisibilityDidChangeForTabs(UIKit.UITabBarController,UIKit.UITab[]) -M:UIKit.UITabBarControllerDelegate.WillBeginEditing(UIKit.UITabBarController) M:UIKit.UITabBarControllerSidebar.Dispose(System.Boolean) -M:UIKit.UITabBarControllerSidebarDelegate.DidEndDisplayingTab(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.UITab) -M:UIKit.UITabBarControllerSidebarDelegate.GetContextMenuConfigurationForTab(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.UITab) -M:UIKit.UITabBarControllerSidebarDelegate.GetItemForRequest(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.UITabSidebarItemRequest) -M:UIKit.UITabBarControllerSidebarDelegate.GetLeadingSwipeActionsConfigurationForTab(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.UITab) -M:UIKit.UITabBarControllerSidebarDelegate.GetTrailingSwipeActionsConfigurationForTab(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.UITab) -M:UIKit.UITabBarControllerSidebarDelegate.SidebarVisibilityWillChange(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.IUITabBarControllerSidebarAnimating) -M:UIKit.UITabBarControllerSidebarDelegate.UpdateItem(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.UITabSidebarItem) -M:UIKit.UITabBarControllerSidebarDelegate.WillBeginDisplayingTab(UIKit.UITabBarController,UIKit.UITabBarControllerSidebar,UIKit.UITab) M:UIKit.UITabBarCustomizeChangeEventArgs.#ctor(UIKit.UIViewController[],System.Boolean) M:UIKit.UITabBarCustomizeEventArgs.#ctor(UIKit.UIViewController[]) M:UIKit.UITabBarDelegate_Extensions.DidBeginCustomizingItems(UIKit.IUITabBarDelegate,UIKit.UITabBar,UIKit.UITabBarItem[]) @@ -51766,16 +46739,10 @@ M:UIKit.UITabBarDelegate_Extensions.DidEndCustomizingItems(UIKit.IUITabBarDelega M:UIKit.UITabBarDelegate_Extensions.ItemSelected(UIKit.IUITabBarDelegate,UIKit.UITabBar,UIKit.UITabBarItem) M:UIKit.UITabBarDelegate_Extensions.WillBeginCustomizingItems(UIKit.IUITabBarDelegate,UIKit.UITabBar,UIKit.UITabBarItem[]) M:UIKit.UITabBarDelegate_Extensions.WillEndCustomizingItems(UIKit.IUITabBarDelegate,UIKit.UITabBar,UIKit.UITabBarItem[],System.Boolean) -M:UIKit.UITabBarDelegate.DidBeginCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[]) -M:UIKit.UITabBarDelegate.DidEndCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[],System.Boolean) -M:UIKit.UITabBarDelegate.ItemSelected(UIKit.UITabBar,UIKit.UITabBarItem) -M:UIKit.UITabBarDelegate.WillBeginCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[]) -M:UIKit.UITabBarDelegate.WillEndCustomizingItems(UIKit.UITabBar,UIKit.UITabBarItem[],System.Boolean) M:UIKit.UITabBarDisplayOrderChangeEventArgs.#ctor(UIKit.UITabGroup) M:UIKit.UITabBarFinalItemsEventArgs.#ctor(UIKit.UITabBarItem[],System.Boolean) M:UIKit.UITabBarItem.EncodeTo(Foundation.NSCoder) M:UIKit.UITabBarItem.GetBadgeTextAttributes(UIKit.UIControlState) -M:UIKit.UITabBarItem.GetFrame(UIKit.UIView) M:UIKit.UITabBarItem.SetBadgeTextAttributes(UIKit.UIStringAttributes,UIKit.UIControlState) M:UIKit.UITabBarItem.UITabBarItemAppearance.#ctor(System.IntPtr) M:UIKit.UITabBarItemAppearance.Copy(Foundation.NSZone) @@ -51785,18 +46752,12 @@ M:UIKit.UITabBarItemsEventArgs.#ctor(UIKit.UITabBarItem[]) M:UIKit.UITabBarSelectionEventArgs.#ctor(UIKit.UIViewController) M:UIKit.UITabBarTabSelectionEventArgs.#ctor(UIKit.UITab,UIKit.UITab) M:UIKit.UITabBarTabVisibilityChangeEventArgs.#ctor(UIKit.UITab[]) -M:UIKit.UITableView.#ctor(CoreGraphics.CGRect) M:UIKit.UITableView.DequeueReusableCell(Foundation.NSString) M:UIKit.UITableView.DequeueReusableCell(System.String,Foundation.NSIndexPath) M:UIKit.UITableView.DequeueReusableHeaderFooterView(System.String) M:UIKit.UITableView.Dispose(System.Boolean) M:UIKit.UITableView.EncodeTo(Foundation.NSCoder) -M:UIKit.UITableView.GetDataSourceIndexPath(Foundation.NSIndexPath) -M:UIKit.UITableView.GetDataSourceSectionIndex(System.IntPtr) -M:UIKit.UITableView.GetPresentationIndexPath(Foundation.NSIndexPath) -M:UIKit.UITableView.GetPresentationSectionIndex(System.IntPtr) M:UIKit.UITableView.PerformBatchUpdatesAsync(System.Action) -M:UIKit.UITableView.PerformUsingPresentationValues(System.Action) M:UIKit.UITableView.RegisterClassForCellReuse(System.Type,Foundation.NSString) M:UIKit.UITableView.RegisterClassForCellReuse(System.Type,System.String) M:UIKit.UITableView.RegisterClassForHeaderFooterViewReuse(System.Type,Foundation.NSString) @@ -51804,80 +46765,9 @@ M:UIKit.UITableView.RegisterClassForHeaderFooterViewReuse(System.Type,System.Str M:UIKit.UITableView.RegisterNibForCellReuse(UIKit.UINib,System.String) M:UIKit.UITableView.RegisterNibForHeaderFooterViewReuse(UIKit.UINib,System.String) M:UIKit.UITableView.UITableViewAppearance.#ctor(System.IntPtr) -M:UIKit.UITableViewCell.#ctor(CoreGraphics.CGRect) M:UIKit.UITableViewCell.#ctor(UIKit.UITableViewCellStyle,System.String) M:UIKit.UITableViewCell.EncodeTo(Foundation.NSCoder) -M:UIKit.UITableViewCell.ShouldBegin(UIKit.UIGestureRecognizer) -M:UIKit.UITableViewCell.ShouldBeRequiredToFailBy(UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) -M:UIKit.UITableViewCell.ShouldReceiveEvent(UIKit.UIGestureRecognizer,UIKit.UIEvent) -M:UIKit.UITableViewCell.ShouldReceivePress(UIKit.UIGestureRecognizer,UIKit.UIPress) -M:UIKit.UITableViewCell.ShouldReceiveTouch(UIKit.UIGestureRecognizer,UIKit.UITouch) -M:UIKit.UITableViewCell.ShouldRecognizeSimultaneously(UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) -M:UIKit.UITableViewCell.ShouldRequireFailureOf(UIKit.UIGestureRecognizer,UIKit.UIGestureRecognizer) M:UIKit.UITableViewCell.UITableViewCellAppearance.#ctor(System.IntPtr) -M:UIKit.UITableViewController.AccessoryButtonTapped(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.CanEditRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.CanFocusRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.CanMoveRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.CanPerformAction(UIKit.UITableView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UITableViewController.CanPerformPrimaryAction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.CellDisplayingEnded(UIKit.UITableView,UIKit.UITableViewCell,Foundation.NSIndexPath) -M:UIKit.UITableViewController.CommitEditingStyle(UIKit.UITableView,UIKit.UITableViewCellEditingStyle,Foundation.NSIndexPath) -M:UIKit.UITableViewController.CustomizeMoveTarget(UIKit.UITableView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UITableViewController.DidBeginMultipleSelectionInteraction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.DidEndEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.DidEndMultipleSelectionInteraction(UIKit.UITableView) -M:UIKit.UITableViewController.DidUpdateFocus(UIKit.UITableView,UIKit.UITableViewFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) -M:UIKit.UITableViewController.EditActionsForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.EditingStyleForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.EstimatedHeight(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.EstimatedHeightForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.EstimatedHeightForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.FooterViewDisplayingEnded(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewController.GetCell(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.GetContextMenuConfiguration(UIKit.UITableView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UITableViewController.GetHeightForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.GetHeightForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.GetHeightForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.GetIndexPathForPreferredFocusedView(UIKit.UITableView) -M:UIKit.UITableViewController.GetLeadingSwipeActionsConfiguration(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.GetPreviewForDismissingContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration) -M:UIKit.UITableViewController.GetPreviewForHighlightingContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration) -M:UIKit.UITableViewController.GetSelectionFollowsFocusForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.GetTrailingSwipeActionsConfiguration(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.GetViewForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.GetViewForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.HeaderViewDisplayingEnded(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewController.IndentationLevel(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.MoveRow(UIKit.UITableView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UITableViewController.NumberOfSections(UIKit.UITableView) -M:UIKit.UITableViewController.PerformAction(UIKit.UITableView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UITableViewController.PerformPrimaryAction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.RowDeselected(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.RowHighlighted(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.RowSelected(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.RowsInSection(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.RowUnhighlighted(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.SectionFor(UIKit.UITableView,System.String,System.IntPtr) -M:UIKit.UITableViewController.SectionIndexTitles(UIKit.UITableView) -M:UIKit.UITableViewController.ShouldBeginMultipleSelectionInteraction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.ShouldHighlightRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.ShouldIndentWhileEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.ShouldShowMenu(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.ShouldSpringLoadRow(UIKit.UITableView,Foundation.NSIndexPath,UIKit.IUISpringLoadedInteractionContext) -M:UIKit.UITableViewController.ShouldUpdateFocus(UIKit.UITableView,UIKit.UITableViewFocusUpdateContext) -M:UIKit.UITableViewController.TitleForDeleteConfirmation(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.TitleForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.TitleForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewController.WillBeginEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.WillDeselectRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewController.WillDisplay(UIKit.UITableView,UIKit.UITableViewCell,Foundation.NSIndexPath) -M:UIKit.UITableViewController.WillDisplayContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITableViewController.WillDisplayFooterView(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewController.WillDisplayHeaderView(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewController.WillEndContextMenuInteraction(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITableViewController.WillPerformPreviewAction(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UITableViewController.WillSelectRow(UIKit.UITableView,Foundation.NSIndexPath) M:UIKit.UITableViewDataSource_Extensions.CanEditRow(UIKit.IUITableViewDataSource,UIKit.UITableView,Foundation.NSIndexPath) M:UIKit.UITableViewDataSource_Extensions.CanMoveRow(UIKit.IUITableViewDataSource,UIKit.UITableView,Foundation.NSIndexPath) M:UIKit.UITableViewDataSource_Extensions.CommitEditingStyle(UIKit.IUITableViewDataSource,UIKit.UITableView,UIKit.UITableViewCellEditingStyle,Foundation.NSIndexPath) @@ -51887,17 +46777,6 @@ M:UIKit.UITableViewDataSource_Extensions.SectionFor(UIKit.IUITableViewDataSource M:UIKit.UITableViewDataSource_Extensions.SectionIndexTitles(UIKit.IUITableViewDataSource,UIKit.UITableView) M:UIKit.UITableViewDataSource_Extensions.TitleForFooter(UIKit.IUITableViewDataSource,UIKit.UITableView,System.IntPtr) M:UIKit.UITableViewDataSource_Extensions.TitleForHeader(UIKit.IUITableViewDataSource,UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDataSource.CanEditRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDataSource.CanMoveRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDataSource.CommitEditingStyle(UIKit.UITableView,UIKit.UITableViewCellEditingStyle,Foundation.NSIndexPath) -M:UIKit.UITableViewDataSource.GetCell(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDataSource.MoveRow(UIKit.UITableView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UITableViewDataSource.NumberOfSections(UIKit.UITableView) -M:UIKit.UITableViewDataSource.RowsInSection(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDataSource.SectionFor(UIKit.UITableView,System.String,System.IntPtr) -M:UIKit.UITableViewDataSource.SectionIndexTitles(UIKit.UITableView) -M:UIKit.UITableViewDataSource.TitleForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDataSource.TitleForHeader(UIKit.UITableView,System.IntPtr) M:UIKit.UITableViewDataSourcePrefetching_Extensions.CancelPrefetching(UIKit.IUITableViewDataSourcePrefetching,UIKit.UITableView,Foundation.NSIndexPath[]) M:UIKit.UITableViewDelegate_Extensions.AccessoryButtonTapped(UIKit.IUITableViewDelegate,UIKit.UITableView,Foundation.NSIndexPath) M:UIKit.UITableViewDelegate_Extensions.CanFocusRow(UIKit.IUITableViewDelegate,UIKit.UITableView,Foundation.NSIndexPath) @@ -51951,194 +46830,37 @@ M:UIKit.UITableViewDelegate_Extensions.WillDisplayHeaderView(UIKit.IUITableViewD M:UIKit.UITableViewDelegate_Extensions.WillEndContextMenuInteraction(UIKit.IUITableViewDelegate,UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) M:UIKit.UITableViewDelegate_Extensions.WillPerformPreviewAction(UIKit.IUITableViewDelegate,UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) M:UIKit.UITableViewDelegate_Extensions.WillSelectRow(UIKit.IUITableViewDelegate,UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.AccessoryButtonTapped(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.CanFocusRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.CanPerformAction(UIKit.UITableView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UITableViewDelegate.CanPerformPrimaryAction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.CellDisplayingEnded(UIKit.UITableView,UIKit.UITableViewCell,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.CustomizeMoveTarget(UIKit.UITableView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.DidBeginMultipleSelectionInteraction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.DidEndEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.DidEndMultipleSelectionInteraction(UIKit.UITableView) -M:UIKit.UITableViewDelegate.DidUpdateFocus(UIKit.UITableView,UIKit.UITableViewFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) -M:UIKit.UITableViewDelegate.EditActionsForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.EditingStyleForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.EstimatedHeight(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.EstimatedHeightForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDelegate.EstimatedHeightForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDelegate.FooterViewDisplayingEnded(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewDelegate.GetContextMenuConfiguration(UIKit.UITableView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UITableViewDelegate.GetHeightForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDelegate.GetHeightForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDelegate.GetHeightForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.GetIndexPathForPreferredFocusedView(UIKit.UITableView) -M:UIKit.UITableViewDelegate.GetLeadingSwipeActionsConfiguration(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.GetPreviewForDismissingContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration) -M:UIKit.UITableViewDelegate.GetPreviewForHighlightingContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration) -M:UIKit.UITableViewDelegate.GetSelectionFollowsFocusForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.GetTrailingSwipeActionsConfiguration(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.GetViewForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDelegate.GetViewForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDelegate.HeaderViewDisplayingEnded(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewDelegate.IndentationLevel(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.PerformAction(UIKit.UITableView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UITableViewDelegate.PerformPrimaryAction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.RowDeselected(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.RowHighlighted(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.RowSelected(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.RowUnhighlighted(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.ShouldBeginMultipleSelectionInteraction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.ShouldHighlightRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.ShouldIndentWhileEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.ShouldShowMenu(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.ShouldSpringLoadRow(UIKit.UITableView,Foundation.NSIndexPath,UIKit.IUISpringLoadedInteractionContext) -M:UIKit.UITableViewDelegate.ShouldUpdateFocus(UIKit.UITableView,UIKit.UITableViewFocusUpdateContext) -M:UIKit.UITableViewDelegate.TitleForDeleteConfirmation(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.WillBeginEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.WillDeselectRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.WillDisplay(UIKit.UITableView,UIKit.UITableViewCell,Foundation.NSIndexPath) -M:UIKit.UITableViewDelegate.WillDisplayContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITableViewDelegate.WillDisplayFooterView(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewDelegate.WillDisplayHeaderView(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewDelegate.WillEndContextMenuInteraction(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITableViewDelegate.WillPerformPreviewAction(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UITableViewDelegate.WillSelectRow(UIKit.UITableView,Foundation.NSIndexPath) M:UIKit.UITableViewDiffableDataSource`2.ApplySnapshotAsync(UIKit.NSDiffableDataSourceSnapshot{`0,`1},System.Boolean) M:UIKit.UITableViewDiffableDataSource`2.ApplySnapshotUsingReloadDataAsync(UIKit.NSDiffableDataSourceSnapshot{`0,`1}) -M:UIKit.UITableViewDiffableDataSource`2.CanEditRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDiffableDataSource`2.CanMoveRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDiffableDataSource`2.CommitEditingStyle(UIKit.UITableView,UIKit.UITableViewCellEditingStyle,Foundation.NSIndexPath) -M:UIKit.UITableViewDiffableDataSource`2.GetCell(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDiffableDataSource`2.MoveRow(UIKit.UITableView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UITableViewDiffableDataSource`2.NumberOfSections(UIKit.UITableView) -M:UIKit.UITableViewDiffableDataSource`2.RowsInSection(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDiffableDataSource`2.SectionFor(UIKit.UITableView,System.String,System.IntPtr) -M:UIKit.UITableViewDiffableDataSource`2.SectionIndexTitles(UIKit.UITableView) -M:UIKit.UITableViewDiffableDataSource`2.TitleForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewDiffableDataSource`2.TitleForHeader(UIKit.UITableView,System.IntPtr) M:UIKit.UITableViewDragDelegate_Extensions.DragSessionAllowsMoveOperation(UIKit.IUITableViewDragDelegate,UIKit.UITableView,UIKit.IUIDragSession) M:UIKit.UITableViewDragDelegate_Extensions.DragSessionDidEnd(UIKit.IUITableViewDragDelegate,UIKit.UITableView,UIKit.IUIDragSession) M:UIKit.UITableViewDragDelegate_Extensions.DragSessionIsRestrictedToDraggingApplication(UIKit.IUITableViewDragDelegate,UIKit.UITableView,UIKit.IUIDragSession) M:UIKit.UITableViewDragDelegate_Extensions.DragSessionWillBegin(UIKit.IUITableViewDragDelegate,UIKit.UITableView,UIKit.IUIDragSession) M:UIKit.UITableViewDragDelegate_Extensions.GetDragPreviewParameters(UIKit.IUITableViewDragDelegate,UIKit.UITableView,Foundation.NSIndexPath) M:UIKit.UITableViewDragDelegate_Extensions.GetItemsForAddingToDragSession(UIKit.IUITableViewDragDelegate,UIKit.UITableView,UIKit.IUIDragSession,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UITableViewDragDelegate.DragSessionAllowsMoveOperation(UIKit.UITableView,UIKit.IUIDragSession) -M:UIKit.UITableViewDragDelegate.DragSessionDidEnd(UIKit.UITableView,UIKit.IUIDragSession) -M:UIKit.UITableViewDragDelegate.DragSessionIsRestrictedToDraggingApplication(UIKit.UITableView,UIKit.IUIDragSession) -M:UIKit.UITableViewDragDelegate.DragSessionWillBegin(UIKit.UITableView,UIKit.IUIDragSession) -M:UIKit.UITableViewDragDelegate.GetDragPreviewParameters(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDragDelegate.GetItemsForAddingToDragSession(UIKit.UITableView,UIKit.IUIDragSession,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UITableViewDragDelegate.GetItemsForBeginningDragSession(UIKit.UITableView,UIKit.IUIDragSession,Foundation.NSIndexPath) M:UIKit.UITableViewDropDelegate_Extensions.CanHandleDropSession(UIKit.IUITableViewDropDelegate,UIKit.UITableView,UIKit.IUIDropSession) M:UIKit.UITableViewDropDelegate_Extensions.DropSessionDidEnd(UIKit.IUITableViewDropDelegate,UIKit.UITableView,UIKit.IUIDropSession) M:UIKit.UITableViewDropDelegate_Extensions.DropSessionDidEnter(UIKit.IUITableViewDropDelegate,UIKit.UITableView,UIKit.IUIDropSession) M:UIKit.UITableViewDropDelegate_Extensions.DropSessionDidExit(UIKit.IUITableViewDropDelegate,UIKit.UITableView,UIKit.IUIDropSession) M:UIKit.UITableViewDropDelegate_Extensions.DropSessionDidUpdate(UIKit.IUITableViewDropDelegate,UIKit.UITableView,UIKit.IUIDropSession,Foundation.NSIndexPath) M:UIKit.UITableViewDropDelegate_Extensions.GetDropPreviewParameters(UIKit.IUITableViewDropDelegate,UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDropDelegate.CanHandleDropSession(UIKit.UITableView,UIKit.IUIDropSession) -M:UIKit.UITableViewDropDelegate.DropSessionDidEnd(UIKit.UITableView,UIKit.IUIDropSession) -M:UIKit.UITableViewDropDelegate.DropSessionDidEnter(UIKit.UITableView,UIKit.IUIDropSession) -M:UIKit.UITableViewDropDelegate.DropSessionDidExit(UIKit.UITableView,UIKit.IUIDropSession) -M:UIKit.UITableViewDropDelegate.DropSessionDidUpdate(UIKit.UITableView,UIKit.IUIDropSession,Foundation.NSIndexPath) -M:UIKit.UITableViewDropDelegate.GetDropPreviewParameters(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewDropDelegate.PerformDrop(UIKit.UITableView,UIKit.IUITableViewDropCoordinator) -M:UIKit.UITableViewDropPlaceholder.#ctor(Foundation.NSIndexPath,System.String,System.Runtime.InteropServices.NFloat) -M:UIKit.UITableViewDropProposal.#ctor(UIKit.UIDropOperation) -M:UIKit.UITableViewHeaderFooterView.#ctor(CoreGraphics.CGRect) M:UIKit.UITableViewHeaderFooterView.EncodeTo(Foundation.NSCoder) M:UIKit.UITableViewHeaderFooterView.UITableViewHeaderFooterViewAppearance.#ctor(System.IntPtr) M:UIKit.UITableViewRowAction.Copy(Foundation.NSZone) -M:UIKit.UITableViewSource.AccessoryButtonTapped(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.CanEditRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.CanFocusRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.CanMoveRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.CanPerformAction(UIKit.UITableView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UITableViewSource.CanPerformPrimaryAction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.CellDisplayingEnded(UIKit.UITableView,UIKit.UITableViewCell,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.CommitEditingStyle(UIKit.UITableView,UIKit.UITableViewCellEditingStyle,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.CustomizeMoveTarget(UIKit.UITableView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.DidBeginMultipleSelectionInteraction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.DidEndEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.DidEndMultipleSelectionInteraction(UIKit.UITableView) -M:UIKit.UITableViewSource.DidUpdateFocus(UIKit.UITableView,UIKit.UITableViewFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) -M:UIKit.UITableViewSource.EditActionsForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.EditingStyleForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.EstimatedHeight(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.EstimatedHeightForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.EstimatedHeightForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.FooterViewDisplayingEnded(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewSource.GetCell(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.GetContextMenuConfiguration(UIKit.UITableView,Foundation.NSIndexPath,CoreGraphics.CGPoint) -M:UIKit.UITableViewSource.GetHeightForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.GetHeightForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.GetHeightForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.GetIndexPathForPreferredFocusedView(UIKit.UITableView) -M:UIKit.UITableViewSource.GetLeadingSwipeActionsConfiguration(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.GetPreviewForDismissingContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration) -M:UIKit.UITableViewSource.GetPreviewForHighlightingContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration) -M:UIKit.UITableViewSource.GetSelectionFollowsFocusForRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.GetTrailingSwipeActionsConfiguration(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.GetViewForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.GetViewForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.HeaderViewDisplayingEnded(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewSource.IndentationLevel(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.MoveRow(UIKit.UITableView,Foundation.NSIndexPath,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.NumberOfSections(UIKit.UITableView) -M:UIKit.UITableViewSource.PerformAction(UIKit.UITableView,ObjCRuntime.Selector,Foundation.NSIndexPath,Foundation.NSObject) -M:UIKit.UITableViewSource.PerformPrimaryAction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.RowDeselected(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.RowHighlighted(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.RowSelected(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.RowsInSection(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.RowUnhighlighted(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.SectionFor(UIKit.UITableView,System.String,System.IntPtr) -M:UIKit.UITableViewSource.SectionIndexTitles(UIKit.UITableView) -M:UIKit.UITableViewSource.ShouldBeginMultipleSelectionInteraction(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.ShouldHighlightRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.ShouldIndentWhileEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.ShouldShowMenu(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.ShouldSpringLoadRow(UIKit.UITableView,Foundation.NSIndexPath,UIKit.IUISpringLoadedInteractionContext) -M:UIKit.UITableViewSource.ShouldUpdateFocus(UIKit.UITableView,UIKit.UITableViewFocusUpdateContext) -M:UIKit.UITableViewSource.TitleForDeleteConfirmation(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.TitleForFooter(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.TitleForHeader(UIKit.UITableView,System.IntPtr) -M:UIKit.UITableViewSource.WillBeginEditing(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.WillDeselectRow(UIKit.UITableView,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.WillDisplay(UIKit.UITableView,UIKit.UITableViewCell,Foundation.NSIndexPath) -M:UIKit.UITableViewSource.WillDisplayContextMenu(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITableViewSource.WillDisplayFooterView(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewSource.WillDisplayHeaderView(UIKit.UITableView,UIKit.UIView,System.IntPtr) -M:UIKit.UITableViewSource.WillEndContextMenuInteraction(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITableViewSource.WillPerformPreviewAction(UIKit.UITableView,UIKit.UIContextMenuConfiguration,UIKit.IUIContextMenuInteractionCommitAnimating) -M:UIKit.UITableViewSource.WillSelectRow(UIKit.UITableView,Foundation.NSIndexPath) M:UIKit.UITabSidebarItem.Copy(Foundation.NSZone) -M:UIKit.UITapGestureRecognizer.#ctor(Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UITapGestureRecognizer.#ctor(System.Action) M:UIKit.UITapGestureRecognizer.#ctor(System.Action{UIKit.UITapGestureRecognizer}) -M:UIKit.UITargetedDragPreview.#ctor(UIKit.UIView,UIKit.UIDragPreviewParameters,UIKit.UIDragPreviewTarget) -M:UIKit.UITargetedDragPreview.#ctor(UIKit.UIView,UIKit.UIDragPreviewParameters) -M:UIKit.UITargetedDragPreview.#ctor(UIKit.UIView) M:UIKit.UITargetedDragPreview.Copy(Foundation.NSZone) M:UIKit.UITargetedPreview.Copy(Foundation.NSZone) M:UIKit.UITextAlignmentExtensions.ToManaged(System.IntPtr) M:UIKit.UITextAlignmentExtensions.ToNative(UIKit.UITextAlignment) M:UIKit.UITextAttributes.#ctor M:UIKit.UITextCursorDropPositionAnimator.AnimateAlongsideChangesAsync(System.Action) -M:UIKit.UITextDocumentProxy.AdjustTextPositionByCharacterOffset(System.IntPtr) -M:UIKit.UITextDocumentProxy.DeleteBackward -M:UIKit.UITextDocumentProxy.InsertText(System.String) -M:UIKit.UITextDocumentProxy.SetMarkedText(System.String,Foundation.NSRange) -M:UIKit.UITextDocumentProxy.UnmarkText M:UIKit.UITextDragDelegate_Extensions.DragSessionDidEnd(UIKit.IUITextDragDelegate,UIKit.IUITextDraggable,UIKit.IUIDragSession,UIKit.UIDropOperation) M:UIKit.UITextDragDelegate_Extensions.DragSessionWillBegin(UIKit.IUITextDragDelegate,UIKit.IUITextDraggable,UIKit.IUIDragSession) M:UIKit.UITextDragDelegate_Extensions.GetItemsForDrag(UIKit.IUITextDragDelegate,UIKit.IUITextDraggable,UIKit.IUITextDragRequest) M:UIKit.UITextDragDelegate_Extensions.GetPreviewForLiftingItem(UIKit.IUITextDragDelegate,UIKit.IUITextDraggable,UIKit.UIDragItem,UIKit.IUIDragSession) M:UIKit.UITextDragDelegate_Extensions.WillAnimateLift(UIKit.IUITextDragDelegate,UIKit.IUITextDraggable,UIKit.IUIDragAnimating,UIKit.IUIDragSession) -M:UIKit.UITextDragDelegate.DragSessionDidEnd(UIKit.IUITextDraggable,UIKit.IUIDragSession,UIKit.UIDropOperation) -M:UIKit.UITextDragDelegate.DragSessionWillBegin(UIKit.IUITextDraggable,UIKit.IUIDragSession) -M:UIKit.UITextDragDelegate.GetItemsForDrag(UIKit.IUITextDraggable,UIKit.IUITextDragRequest) -M:UIKit.UITextDragDelegate.GetPreviewForLiftingItem(UIKit.IUITextDraggable,UIKit.UIDragItem,UIKit.IUIDragSession) -M:UIKit.UITextDragDelegate.WillAnimateLift(UIKit.IUITextDraggable,UIKit.IUIDragAnimating,UIKit.IUIDragSession) M:UIKit.UITextDropDelegate_Extensions.DropSessionDidEnd(UIKit.IUITextDropDelegate,UIKit.IUITextDroppable,UIKit.IUIDropSession) M:UIKit.UITextDropDelegate_Extensions.DropSessionDidEnter(UIKit.IUITextDropDelegate,UIKit.IUITextDroppable,UIKit.IUIDropSession) M:UIKit.UITextDropDelegate_Extensions.DropSessionDidExit(UIKit.IUITextDropDelegate,UIKit.IUITextDroppable,UIKit.IUIDropSession) @@ -52147,75 +46869,15 @@ M:UIKit.UITextDropDelegate_Extensions.GetPreviewForDroppingAllItems(UIKit.IUITex M:UIKit.UITextDropDelegate_Extensions.GetProposalForDrop(UIKit.IUITextDropDelegate,UIKit.IUITextDroppable,UIKit.IUITextDropRequest) M:UIKit.UITextDropDelegate_Extensions.WillBecomeEditable(UIKit.IUITextDropDelegate,UIKit.IUITextDroppable,UIKit.IUITextDropRequest) M:UIKit.UITextDropDelegate_Extensions.WillPerformDrop(UIKit.IUITextDropDelegate,UIKit.IUITextDroppable,UIKit.IUITextDropRequest) -M:UIKit.UITextDropDelegate.DropSessionDidEnd(UIKit.IUITextDroppable,UIKit.IUIDropSession) -M:UIKit.UITextDropDelegate.DropSessionDidEnter(UIKit.IUITextDroppable,UIKit.IUIDropSession) -M:UIKit.UITextDropDelegate.DropSessionDidExit(UIKit.IUITextDroppable,UIKit.IUIDropSession) -M:UIKit.UITextDropDelegate.DropSessionDidUpdate(UIKit.IUITextDroppable,UIKit.IUIDropSession) -M:UIKit.UITextDropDelegate.GetPreviewForDroppingAllItems(UIKit.IUITextDroppable,UIKit.UITargetedDragPreview) -M:UIKit.UITextDropDelegate.GetProposalForDrop(UIKit.IUITextDroppable,UIKit.IUITextDropRequest) -M:UIKit.UITextDropDelegate.WillBecomeEditable(UIKit.IUITextDroppable,UIKit.IUITextDropRequest) -M:UIKit.UITextDropDelegate.WillPerformDrop(UIKit.IUITextDroppable,UIKit.IUITextDropRequest) -M:UIKit.UITextDropProposal.#ctor(UIKit.UIDropOperation) M:UIKit.UITextDropProposal.Copy(Foundation.NSZone) -M:UIKit.UITextField.#ctor(CoreGraphics.CGRect) M:UIKit.UITextField.add_Ended(System.EventHandler) M:UIKit.UITextField.add_EndedWithReason(System.EventHandler{UIKit.UITextFieldEditingEndedEventArgs}) M:UIKit.UITextField.add_Started(System.EventHandler) -M:UIKit.UITextField.BeginFloatingCursor(CoreGraphics.CGPoint) -M:UIKit.UITextField.CanPaste(Foundation.NSItemProvider[]) -M:UIKit.UITextField.ComparePosition(UIKit.UITextPosition,UIKit.UITextPosition) -M:UIKit.UITextField.DeleteBackward -M:UIKit.UITextField.DictationRecognitionFailed -M:UIKit.UITextField.DictationRecordingDidEnd -M:UIKit.UITextField.DidDismissWritingTools M:UIKit.UITextField.Dispose(System.Boolean) -M:UIKit.UITextField.EndFloatingCursor -M:UIKit.UITextField.GetAttributedText(UIKit.UITextRange) -M:UIKit.UITextField.GetBaseWritingDirection(UIKit.UITextPosition,UIKit.UITextStorageDirection) -M:UIKit.UITextField.GetCaretRectForPosition(UIKit.UITextPosition) -M:UIKit.UITextField.GetCaretTransform(UIKit.UITextPosition) -M:UIKit.UITextField.GetCharacterOffsetOfPosition(UIKit.UITextPosition,UIKit.UITextRange) -M:UIKit.UITextField.GetCharacterRange(UIKit.UITextPosition,UIKit.UITextLayoutDirection) -M:UIKit.UITextField.GetCharacterRangeAtPoint(CoreGraphics.CGPoint) -M:UIKit.UITextField.GetClosestPositionToPoint(CoreGraphics.CGPoint,UIKit.UITextRange) -M:UIKit.UITextField.GetClosestPositionToPoint(CoreGraphics.CGPoint) -M:UIKit.UITextField.GetEditMenu(UIKit.UITextRange,UIKit.UIMenuElement[]) -M:UIKit.UITextField.GetFirstRectForRange(UIKit.UITextRange) -M:UIKit.UITextField.GetFrameForDictationResultPlaceholder(Foundation.NSObject) -M:UIKit.UITextField.GetOffsetFromPosition(UIKit.UITextPosition,UIKit.UITextPosition) -M:UIKit.UITextField.GetPosition(UIKit.UITextPosition,System.IntPtr) -M:UIKit.UITextField.GetPosition(UIKit.UITextPosition,UIKit.UITextLayoutDirection,System.IntPtr) -M:UIKit.UITextField.GetPosition(UIKit.UITextRange,System.IntPtr) -M:UIKit.UITextField.GetPositionWithinRange(UIKit.UITextRange,UIKit.UITextLayoutDirection) -M:UIKit.UITextField.GetSelectionRects(UIKit.UITextRange) -M:UIKit.UITextField.GetTextRange(UIKit.UITextPosition,UIKit.UITextPosition) -M:UIKit.UITextField.GetTextStyling(UIKit.UITextPosition,UIKit.UITextStorageDirection) -M:UIKit.UITextField.InsertAdaptiveImageGlyph(UIKit.NSAdaptiveImageGlyph,UIKit.UITextRange) -M:UIKit.UITextField.InsertAttributedText(Foundation.NSAttributedString) -M:UIKit.UITextField.InsertDictationResult(Foundation.NSArray) -M:UIKit.UITextField.InsertDictationResultPlaceholder -M:UIKit.UITextField.InsertText(System.String,System.String[],UIKit.UITextAlternativeStyle) -M:UIKit.UITextField.InsertText(System.String) -M:UIKit.UITextField.InsertTextPlaceholder(CoreGraphics.CGSize) -M:UIKit.UITextField.Paste(Foundation.NSItemProvider[]) M:UIKit.UITextField.remove_Ended(System.EventHandler) M:UIKit.UITextField.remove_EndedWithReason(System.EventHandler{UIKit.UITextFieldEditingEndedEventArgs}) M:UIKit.UITextField.remove_Started(System.EventHandler) -M:UIKit.UITextField.RemoveDictationResultPlaceholder(Foundation.NSObject,System.Boolean) -M:UIKit.UITextField.RemoveTextPlaceholder(UIKit.UITextPlaceholder) -M:UIKit.UITextField.ReplaceRange(UIKit.UITextRange,Foundation.NSAttributedString) -M:UIKit.UITextField.ReplaceText(UIKit.UITextRange,System.String) -M:UIKit.UITextField.SetAttributedMarkedText(Foundation.NSAttributedString,Foundation.NSRange) -M:UIKit.UITextField.SetBaseWritingDirectionforRange(Foundation.NSWritingDirection,UIKit.UITextRange) -M:UIKit.UITextField.SetMarkedText(System.String,Foundation.NSRange) -M:UIKit.UITextField.ShouldChangeTextInRange(UIKit.UITextRange,System.String) -M:UIKit.UITextField.TextInRange(UIKit.UITextRange) M:UIKit.UITextField.UITextFieldAppearance.#ctor(System.IntPtr) -M:UIKit.UITextField.UnmarkText -M:UIKit.UITextField.UpdateFloatingCursor(CoreGraphics.CGPoint) -M:UIKit.UITextField.WillDismissEditMenu(UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextField.WillPresentEditMenu(UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextField.WillPresentWritingTools M:UIKit.UITextFieldDelegate_Extensions.DidChangeSelection(UIKit.IUITextFieldDelegate,UIKit.UITextField) M:UIKit.UITextFieldDelegate_Extensions.EditingEnded(UIKit.IUITextFieldDelegate,UIKit.UITextField,UIKit.UITextFieldDidEndEditingReason) M:UIKit.UITextFieldDelegate_Extensions.EditingEnded(UIKit.IUITextFieldDelegate,UIKit.UITextField) @@ -52228,23 +46890,8 @@ M:UIKit.UITextFieldDelegate_Extensions.ShouldEndEditing(UIKit.IUITextFieldDelega M:UIKit.UITextFieldDelegate_Extensions.ShouldReturn(UIKit.IUITextFieldDelegate,UIKit.UITextField) M:UIKit.UITextFieldDelegate_Extensions.WillDismissEditMenu(UIKit.IUITextFieldDelegate,UIKit.UITextField,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UITextFieldDelegate_Extensions.WillPresentEditMenu(UIKit.IUITextFieldDelegate,UIKit.UITextField,UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextFieldDelegate.DidChangeSelection(UIKit.UITextField) -M:UIKit.UITextFieldDelegate.EditingEnded(UIKit.UITextField,UIKit.UITextFieldDidEndEditingReason) -M:UIKit.UITextFieldDelegate.EditingEnded(UIKit.UITextField) -M:UIKit.UITextFieldDelegate.EditingStarted(UIKit.UITextField) -M:UIKit.UITextFieldDelegate.GetEditMenu(UIKit.UITextField,Foundation.NSRange,UIKit.UIMenuElement[]) -M:UIKit.UITextFieldDelegate.ShouldBeginEditing(UIKit.UITextField) -M:UIKit.UITextFieldDelegate.ShouldChangeCharacters(UIKit.UITextField,Foundation.NSRange,System.String) -M:UIKit.UITextFieldDelegate.ShouldClear(UIKit.UITextField) -M:UIKit.UITextFieldDelegate.ShouldEndEditing(UIKit.UITextField) -M:UIKit.UITextFieldDelegate.ShouldReturn(UIKit.UITextField) -M:UIKit.UITextFieldDelegate.WillDismissEditMenu(UIKit.UITextField,UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextFieldDelegate.WillPresentEditMenu(UIKit.UITextField,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UITextFieldEditingEndedEventArgs.#ctor(UIKit.UITextFieldDidEndEditingReason) -M:UIKit.UITextFormattingCoordinator.DidCancel(UIKit.UIFontPickerViewController) -M:UIKit.UITextFormattingCoordinator.DidPickFont(UIKit.UIFontPickerViewController) M:UIKit.UITextFormattingCoordinator.Dispose(System.Boolean) -M:UIKit.UITextFormattingCoordinatorDelegate.UpdateTextAttributes(UIKit.UITextAttributesConversionHandler) M:UIKit.UITextFormattingViewController.Dispose(System.Boolean) M:UIKit.UITextFormattingViewControllerChangeValue.Copy(Foundation.NSZone) M:UIKit.UITextFormattingViewControllerChangeValue.EncodeTo(Foundation.NSCoder) @@ -52254,10 +46901,6 @@ M:UIKit.UITextFormattingViewControllerComponentGroup.Copy(Foundation.NSZone) M:UIKit.UITextFormattingViewControllerComponentGroup.EncodeTo(Foundation.NSCoder) M:UIKit.UITextFormattingViewControllerConfiguration.Copy(Foundation.NSZone) M:UIKit.UITextFormattingViewControllerConfiguration.EncodeTo(Foundation.NSCoder) -M:UIKit.UITextFormattingViewControllerDelegate.DidChangeValue(UIKit.UITextFormattingViewController,UIKit.UITextFormattingViewControllerChangeValue) -M:UIKit.UITextFormattingViewControllerDelegate.ShouldPresentColorPicker(UIKit.UITextFormattingViewController,UIKit.UIColorPickerViewController) -M:UIKit.UITextFormattingViewControllerDelegate.ShouldPresentFontPicker(UIKit.UITextFormattingViewController,UIKit.UIFontPickerViewController) -M:UIKit.UITextFormattingViewControllerDelegate.TextFormattingDidFinish(UIKit.UITextFormattingViewController) M:UIKit.UITextFormattingViewControllerFormattingDescriptor.#ctor(UIKit.UIStringAttributes) M:UIKit.UITextFormattingViewControllerFormattingDescriptor.Copy(Foundation.NSZone) M:UIKit.UITextFormattingViewControllerFormattingDescriptor.EncodeTo(Foundation.NSCoder) @@ -52300,21 +46943,9 @@ M:UIKit.UITextInput_Extensions.UpdateFloatingCursor(UIKit.IUITextInput,CoreGraph M:UIKit.UITextInput_Extensions.WillDismissEditMenu(UIKit.IUITextInput,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UITextInput_Extensions.WillPresentEditMenu(UIKit.IUITextInput,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UITextInput_Extensions.WillPresentWritingTools(UIKit.IUITextInput) -M:UIKit.UITextInputDelegate.SelectionDidChange(UIKit.IUITextInput) -M:UIKit.UITextInputDelegate.SelectionWillChange(UIKit.IUITextInput) -M:UIKit.UITextInputDelegate.TextDidChange(UIKit.IUITextInput) -M:UIKit.UITextInputDelegate.TextWillChange(UIKit.IUITextInput) M:UIKit.UITextInputMode.EncodeTo(Foundation.NSCoder) M:UIKit.UITextInputPasswordRules.Copy(Foundation.NSZone) M:UIKit.UITextInputPasswordRules.EncodeTo(Foundation.NSCoder) -M:UIKit.UITextInputStringTokenizer.GetPosition(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) -M:UIKit.UITextInputStringTokenizer.GetRangeEnclosingPosition(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) -M:UIKit.UITextInputStringTokenizer.ProbeDirection(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) -M:UIKit.UITextInputStringTokenizer.ProbeDirectionWithinTextUnit(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) -M:UIKit.UITextInputTokenizer.GetPosition(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) -M:UIKit.UITextInputTokenizer.GetRangeEnclosingPosition(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) -M:UIKit.UITextInputTokenizer.ProbeDirection(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) -M:UIKit.UITextInputTokenizer.ProbeDirectionWithinTextUnit(UIKit.UITextPosition,UIKit.UITextGranularity,UIKit.UITextDirection) M:UIKit.UITextInputTraits_Extensions.GetAllowedWritingToolsResultOptions(UIKit.IUITextInputTraits) M:UIKit.UITextInputTraits_Extensions.GetAutocapitalizationType(UIKit.IUITextInputTraits) M:UIKit.UITextInputTraits_Extensions.GetAutocorrectionType(UIKit.IUITextInputTraits) @@ -52349,23 +46980,14 @@ M:UIKit.UITextInputTraits_Extensions.SetSmartQuotesType(UIKit.IUITextInputTraits M:UIKit.UITextInputTraits_Extensions.SetSpellCheckingType(UIKit.IUITextInputTraits,UIKit.UITextSpellCheckingType) M:UIKit.UITextInputTraits_Extensions.SetTextContentType(UIKit.IUITextInputTraits,Foundation.NSString) M:UIKit.UITextInputTraits_Extensions.SetWritingToolsBehavior(UIKit.IUITextInputTraits,UIKit.UIWritingToolsBehavior) -M:UIKit.UITextInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UITextInteraction.Dispose(System.Boolean) -M:UIKit.UITextInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UITextInteractionDelegate_Extensions.DidEnd(UIKit.IUITextInteractionDelegate,UIKit.UITextInteraction) M:UIKit.UITextInteractionDelegate_Extensions.ShouldBegin(UIKit.IUITextInteractionDelegate,UIKit.UITextInteraction,CoreGraphics.CGPoint) M:UIKit.UITextInteractionDelegate_Extensions.WillBegin(UIKit.IUITextInteractionDelegate,UIKit.UITextInteraction) -M:UIKit.UITextInteractionDelegate.DidEnd(UIKit.UITextInteraction) -M:UIKit.UITextInteractionDelegate.ShouldBegin(UIKit.UITextInteraction,CoreGraphics.CGPoint) -M:UIKit.UITextInteractionDelegate.WillBegin(UIKit.UITextInteraction) M:UIKit.UITextPasteDelegate_Extensions.CombineItemAttributedStrings(UIKit.IUITextPasteDelegate,UIKit.IUITextPasteConfigurationSupporting,Foundation.NSAttributedString[],UIKit.UITextRange) M:UIKit.UITextPasteDelegate_Extensions.PerformPaste(UIKit.IUITextPasteDelegate,UIKit.IUITextPasteConfigurationSupporting,Foundation.NSAttributedString,UIKit.UITextRange) M:UIKit.UITextPasteDelegate_Extensions.ShouldAnimatePaste(UIKit.IUITextPasteDelegate,UIKit.IUITextPasteConfigurationSupporting,Foundation.NSAttributedString,UIKit.UITextRange) M:UIKit.UITextPasteDelegate_Extensions.TransformPasteItem(UIKit.IUITextPasteDelegate,UIKit.IUITextPasteConfigurationSupporting,UIKit.IUITextPasteItem) -M:UIKit.UITextPasteDelegate.CombineItemAttributedStrings(UIKit.IUITextPasteConfigurationSupporting,Foundation.NSAttributedString[],UIKit.UITextRange) -M:UIKit.UITextPasteDelegate.PerformPaste(UIKit.IUITextPasteConfigurationSupporting,Foundation.NSAttributedString,UIKit.UITextRange) -M:UIKit.UITextPasteDelegate.ShouldAnimatePaste(UIKit.IUITextPasteConfigurationSupporting,Foundation.NSAttributedString,UIKit.UITextRange) -M:UIKit.UITextPasteDelegate.TransformPasteItem(UIKit.IUITextPasteConfigurationSupporting,UIKit.IUITextPasteItem) M:UIKit.UITextSearching_Extensions.CompareOrder(UIKit.IUITextSearching,Foundation.INSCopying,Foundation.INSCopying) M:UIKit.UITextSearching_Extensions.GetSelectedTextSearchDocument(UIKit.IUITextSearching) M:UIKit.UITextSearching_Extensions.GetSupportsTextReplacement(UIKit.IUITextSearching) @@ -52375,12 +46997,8 @@ M:UIKit.UITextSearching_Extensions.ScrollRangeToVisible(UIKit.IUITextSearching,U M:UIKit.UITextSearching_Extensions.ShouldReplaceFoundText(UIKit.IUITextSearching,UIKit.UITextRange,Foundation.INSCopying,System.String) M:UIKit.UITextSearching_Extensions.WillHighlight(UIKit.IUITextSearching,UIKit.UITextRange,Foundation.INSCopying) M:UIKit.UITextSearchingFindSession.Dispose(System.Boolean) -M:UIKit.UITextSelectionDisplayInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UITextSelectionDisplayInteraction.Dispose(System.Boolean) -M:UIKit.UITextSelectionDisplayInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UITextSelectionDisplayInteractionDelegate_Extensions.GetSelectionContainerViewBelowText(UIKit.IUITextSelectionDisplayInteractionDelegate,UIKit.UITextSelectionDisplayInteraction) -M:UIKit.UITextSelectionDisplayInteractionDelegate.GetSelectionContainerViewBelowText(UIKit.UITextSelectionDisplayInteraction) -M:UIKit.UITextView.#ctor(CoreGraphics.CGRect) M:UIKit.UITextView.add_Changed(System.EventHandler) M:UIKit.UITextView.add_DidBeginFormatting(System.EventHandler{UIKit.UITextViewTextFormattingViewControllerEventArgs}) M:UIKit.UITextView.add_DidEndFormatting(System.EventHandler{UIKit.UITextViewTextFormattingViewControllerEventArgs}) @@ -52391,44 +47009,8 @@ M:UIKit.UITextView.add_WillBeginFormatting(System.EventHandler{UIKit.UITextViewT M:UIKit.UITextView.add_WillEndFormatting(System.EventHandler{UIKit.UITextViewTextFormattingViewControllerEventArgs}) M:UIKit.UITextView.add_WritingToolsDidEnd(System.EventHandler) M:UIKit.UITextView.add_WritingToolsWillBegin(System.EventHandler) -M:UIKit.UITextView.BeginFloatingCursor(CoreGraphics.CGPoint) -M:UIKit.UITextView.CanPaste(Foundation.NSItemProvider[]) -M:UIKit.UITextView.ComparePosition(UIKit.UITextPosition,UIKit.UITextPosition) -M:UIKit.UITextView.DeleteBackward -M:UIKit.UITextView.DictationRecognitionFailed -M:UIKit.UITextView.DictationRecordingDidEnd -M:UIKit.UITextView.DidDismissWritingTools M:UIKit.UITextView.Dispose(System.Boolean) M:UIKit.UITextView.EncodeTo(Foundation.NSCoder) -M:UIKit.UITextView.EndFloatingCursor -M:UIKit.UITextView.GetAttributedText(UIKit.UITextRange) -M:UIKit.UITextView.GetBaseWritingDirection(UIKit.UITextPosition,UIKit.UITextStorageDirection) -M:UIKit.UITextView.GetCaretRectForPosition(UIKit.UITextPosition) -M:UIKit.UITextView.GetCaretTransform(UIKit.UITextPosition) -M:UIKit.UITextView.GetCharacterOffsetOfPosition(UIKit.UITextPosition,UIKit.UITextRange) -M:UIKit.UITextView.GetCharacterRange(UIKit.UITextPosition,UIKit.UITextLayoutDirection) -M:UIKit.UITextView.GetCharacterRangeAtPoint(CoreGraphics.CGPoint) -M:UIKit.UITextView.GetClosestPositionToPoint(CoreGraphics.CGPoint,UIKit.UITextRange) -M:UIKit.UITextView.GetClosestPositionToPoint(CoreGraphics.CGPoint) -M:UIKit.UITextView.GetEditMenu(UIKit.UITextRange,UIKit.UIMenuElement[]) -M:UIKit.UITextView.GetFirstRectForRange(UIKit.UITextRange) -M:UIKit.UITextView.GetFrameForDictationResultPlaceholder(Foundation.NSObject) -M:UIKit.UITextView.GetOffsetFromPosition(UIKit.UITextPosition,UIKit.UITextPosition) -M:UIKit.UITextView.GetPosition(UIKit.UITextPosition,System.IntPtr) -M:UIKit.UITextView.GetPosition(UIKit.UITextPosition,UIKit.UITextLayoutDirection,System.IntPtr) -M:UIKit.UITextView.GetPosition(UIKit.UITextRange,System.IntPtr) -M:UIKit.UITextView.GetPositionWithinRange(UIKit.UITextRange,UIKit.UITextLayoutDirection) -M:UIKit.UITextView.GetSelectionRects(UIKit.UITextRange) -M:UIKit.UITextView.GetTextRange(UIKit.UITextPosition,UIKit.UITextPosition) -M:UIKit.UITextView.GetTextStyling(UIKit.UITextPosition,UIKit.UITextStorageDirection) -M:UIKit.UITextView.InsertAdaptiveImageGlyph(UIKit.NSAdaptiveImageGlyph,UIKit.UITextRange) -M:UIKit.UITextView.InsertAttributedText(Foundation.NSAttributedString) -M:UIKit.UITextView.InsertDictationResult(Foundation.NSArray) -M:UIKit.UITextView.InsertDictationResultPlaceholder -M:UIKit.UITextView.InsertText(System.String,System.String[],UIKit.UITextAlternativeStyle) -M:UIKit.UITextView.InsertText(System.String) -M:UIKit.UITextView.InsertTextPlaceholder(CoreGraphics.CGSize) -M:UIKit.UITextView.Paste(Foundation.NSItemProvider[]) M:UIKit.UITextView.remove_Changed(System.EventHandler) M:UIKit.UITextView.remove_DidBeginFormatting(System.EventHandler{UIKit.UITextViewTextFormattingViewControllerEventArgs}) M:UIKit.UITextView.remove_DidEndFormatting(System.EventHandler{UIKit.UITextViewTextFormattingViewControllerEventArgs}) @@ -52439,21 +47021,7 @@ M:UIKit.UITextView.remove_WillBeginFormatting(System.EventHandler{UIKit.UITextVi M:UIKit.UITextView.remove_WillEndFormatting(System.EventHandler{UIKit.UITextViewTextFormattingViewControllerEventArgs}) M:UIKit.UITextView.remove_WritingToolsDidEnd(System.EventHandler) M:UIKit.UITextView.remove_WritingToolsWillBegin(System.EventHandler) -M:UIKit.UITextView.RemoveDictationResultPlaceholder(Foundation.NSObject,System.Boolean) -M:UIKit.UITextView.RemoveTextPlaceholder(UIKit.UITextPlaceholder) -M:UIKit.UITextView.ReplaceRange(UIKit.UITextRange,Foundation.NSAttributedString) -M:UIKit.UITextView.ReplaceText(UIKit.UITextRange,System.String) -M:UIKit.UITextView.SetAttributedMarkedText(Foundation.NSAttributedString,Foundation.NSRange) -M:UIKit.UITextView.SetBaseWritingDirectionforRange(Foundation.NSWritingDirection,UIKit.UITextRange) -M:UIKit.UITextView.SetMarkedText(System.String,Foundation.NSRange) -M:UIKit.UITextView.ShouldChangeTextInRange(UIKit.UITextRange,System.String) -M:UIKit.UITextView.TextInRange(UIKit.UITextRange) M:UIKit.UITextView.UITextViewAppearance.#ctor(System.IntPtr) -M:UIKit.UITextView.UnmarkText -M:UIKit.UITextView.UpdateFloatingCursor(CoreGraphics.CGPoint) -M:UIKit.UITextView.WillDismissEditMenu(UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextView.WillPresentEditMenu(UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextView.WillPresentWritingTools M:UIKit.UITextViewDelegate_Extensions.Changed(UIKit.IUITextViewDelegate,UIKit.UITextView) M:UIKit.UITextViewDelegate_Extensions.DidBeginFormatting(UIKit.IUITextViewDelegate,UIKit.UITextView,UIKit.UITextFormattingViewController) M:UIKit.UITextViewDelegate_Extensions.DidEndFormatting(UIKit.IUITextViewDelegate,UIKit.UITextView,UIKit.UITextFormattingViewController) @@ -52479,46 +47047,15 @@ M:UIKit.UITextViewDelegate_Extensions.WillEndFormatting(UIKit.IUITextViewDelegat M:UIKit.UITextViewDelegate_Extensions.WillPresentEditMenu(UIKit.IUITextViewDelegate,UIKit.UITextView,UIKit.IUIEditMenuInteractionAnimating) M:UIKit.UITextViewDelegate_Extensions.WritingToolsDidEnd(UIKit.IUITextViewDelegate,UIKit.UITextView) M:UIKit.UITextViewDelegate_Extensions.WritingToolsWillBegin(UIKit.IUITextViewDelegate,UIKit.UITextView) -M:UIKit.UITextViewDelegate.Changed(UIKit.UITextView) -M:UIKit.UITextViewDelegate.DidBeginFormatting(UIKit.UITextView,UIKit.UITextFormattingViewController) -M:UIKit.UITextViewDelegate.DidEndFormatting(UIKit.UITextView,UIKit.UITextFormattingViewController) -M:UIKit.UITextViewDelegate.EditingEnded(UIKit.UITextView) -M:UIKit.UITextViewDelegate.EditingStarted(UIKit.UITextView) -M:UIKit.UITextViewDelegate.GetEditMenuForText(UIKit.UITextView,Foundation.NSRange,UIKit.UIMenuElement[]) -M:UIKit.UITextViewDelegate.GetMenuConfiguration(UIKit.UITextView,UIKit.UITextItem,UIKit.UIMenu) -M:UIKit.UITextViewDelegate.GetPrimaryAction(UIKit.UITextView,UIKit.UITextItem,UIKit.UIAction) -M:UIKit.UITextViewDelegate.GetWritingToolsIgnoredRangesInEnclosingRange(UIKit.UITextView,Foundation.NSRange) -M:UIKit.UITextViewDelegate.SelectionChanged(UIKit.UITextView) -M:UIKit.UITextViewDelegate.ShouldBeginEditing(UIKit.UITextView) -M:UIKit.UITextViewDelegate.ShouldChangeText(UIKit.UITextView,Foundation.NSRange,System.String) -M:UIKit.UITextViewDelegate.ShouldEndEditing(UIKit.UITextView) -M:UIKit.UITextViewDelegate.ShouldInteractWithTextAttachment(UIKit.UITextView,UIKit.NSTextAttachment,Foundation.NSRange,UIKit.UITextItemInteraction) -M:UIKit.UITextViewDelegate.ShouldInteractWithTextAttachment(UIKit.UITextView,UIKit.NSTextAttachment,Foundation.NSRange) -M:UIKit.UITextViewDelegate.ShouldInteractWithUrl(UIKit.UITextView,Foundation.NSUrl,Foundation.NSRange,UIKit.UITextItemInteraction) -M:UIKit.UITextViewDelegate.ShouldInteractWithUrl(UIKit.UITextView,Foundation.NSUrl,Foundation.NSRange) -M:UIKit.UITextViewDelegate.WillBeginFormatting(UIKit.UITextView,UIKit.UITextFormattingViewController) -M:UIKit.UITextViewDelegate.WillDismissEditMenu(UIKit.UITextView,UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextViewDelegate.WillDisplay(UIKit.UITextView,UIKit.UITextItem,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITextViewDelegate.WillEnd(UIKit.UITextView,UIKit.UITextItem,UIKit.IUIContextMenuInteractionAnimating) -M:UIKit.UITextViewDelegate.WillEndFormatting(UIKit.UITextView,UIKit.UITextFormattingViewController) -M:UIKit.UITextViewDelegate.WillPresentEditMenu(UIKit.UITextView,UIKit.IUIEditMenuInteractionAnimating) -M:UIKit.UITextViewDelegate.WritingToolsDidEnd(UIKit.UITextView) -M:UIKit.UITextViewDelegate.WritingToolsWillBegin(UIKit.UITextView) M:UIKit.UITextViewTextFormattingViewControllerEventArgs.#ctor(UIKit.UITextFormattingViewController) -M:UIKit.UIToolbar.#ctor(CoreGraphics.CGRect) M:UIKit.UIToolbar.Dispose(System.Boolean) M:UIKit.UIToolbar.UIToolbarAppearance.#ctor(System.IntPtr) M:UIKit.UIToolbar.UIToolbarAppearance.GetBackgroundImage(UIKit.UIToolbarPosition,UIKit.UIBarMetrics) M:UIKit.UIToolbar.UIToolbarAppearance.GetShadowImage(UIKit.UIToolbarPosition) M:UIKit.UIToolbar.UIToolbarAppearance.SetBackgroundImage(UIKit.UIImage,UIKit.UIToolbarPosition,UIKit.UIBarMetrics) M:UIKit.UIToolbar.UIToolbarAppearance.SetShadowImage(UIKit.UIImage,UIKit.UIToolbarPosition) -M:UIKit.UIToolbarAppearance.#ctor(UIKit.UIBarAppearance) -M:UIKit.UIToolbarAppearance.#ctor(UIKit.UIUserInterfaceIdiom) -M:UIKit.UIToolTipInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIToolTipInteraction.Dispose(System.Boolean) -M:UIKit.UIToolTipInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIToolTipInteractionDelegate_Extensions.GetConfiguration(UIKit.IUIToolTipInteractionDelegate,UIKit.UIToolTipInteraction,CoreGraphics.CGPoint) -M:UIKit.UIToolTipInteractionDelegate.GetConfiguration(UIKit.UIToolTipInteraction,CoreGraphics.CGPoint) M:UIKit.UITraitChangeObservable_Extensions.RegisterForTraitChanges(UIKit.IUITraitChangeObservable,ObjCRuntime.Class[],Foundation.NSObject,ObjCRuntime.Selector) M:UIKit.UITraitChangeObservable_Extensions.RegisterForTraitChanges(UIKit.IUITraitChangeObservable,ObjCRuntime.Class[],ObjCRuntime.Selector) M:UIKit.UITraitChangeObservable_Extensions.RegisterForTraitChanges(UIKit.IUITraitChangeObservable,ObjCRuntime.Class[],System.Action{UIKit.IUITraitEnvironment,UIKit.UITraitCollection}) @@ -52526,7 +47063,6 @@ M:UIKit.UITraitCollection.Copy(Foundation.NSZone) M:UIKit.UITraitCollection.Create(UIKit.UIContentSizeCategory) M:UIKit.UITraitCollection.EncodeTo(Foundation.NSCoder) M:UIKit.UITraitCollection.GetChangedTraits2(UIKit.UITraitCollection) -M:UIKit.UITraitEnvironment.TraitCollectionDidChange(UIKit.UITraitCollection) M:UIKit.UIUserNotificationAction.Copy(Foundation.NSZone) M:UIKit.UIUserNotificationAction.EncodeTo(Foundation.NSCoder) M:UIKit.UIUserNotificationAction.MutableCopy(Foundation.NSZone) @@ -52551,11 +47087,7 @@ M:UIKit.UIVideoEditorController.remove_UserCancelled(System.EventHandler) M:UIKit.UIVideoEditorControllerDelegate_Extensions.Failed(UIKit.IUIVideoEditorControllerDelegate,UIKit.UIVideoEditorController,Foundation.NSError) M:UIKit.UIVideoEditorControllerDelegate_Extensions.UserCancelled(UIKit.IUIVideoEditorControllerDelegate,UIKit.UIVideoEditorController) M:UIKit.UIVideoEditorControllerDelegate_Extensions.VideoSaved(UIKit.IUIVideoEditorControllerDelegate,UIKit.UIVideoEditorController,System.String) -M:UIKit.UIVideoEditorControllerDelegate.Failed(UIKit.UIVideoEditorController,Foundation.NSError) -M:UIKit.UIVideoEditorControllerDelegate.UserCancelled(UIKit.UIVideoEditorController) -M:UIKit.UIVideoEditorControllerDelegate.VideoSaved(UIKit.UIVideoEditorController,System.String) M:UIKit.UIView_UITextField.EndEditing(UIKit.UIView,System.Boolean) -M:UIKit.UIView.AccessibilityActivate M:UIKit.UIView.ActionForLayer(CoreAnimation.CALayer,System.String) M:UIKit.UIView.add_AnimationWillEnd(System.Action) M:UIKit.UIView.add_AnimationWillStart(System.Action) @@ -52571,183 +47103,76 @@ M:UIKit.UIView.AnimateNotifyAsync(System.Double,System.Double,System.Runtime.Int M:UIKit.UIView.AnimateNotifyAsync(System.Double,System.Double,UIKit.UIViewAnimationOptions,System.Action) M:UIKit.UIView.BeginAnimations(System.String) M:UIKit.UIView.Capture(System.Boolean) -M:UIKit.UIView.ConvertPointFromCoordinateSpace(CoreGraphics.CGPoint,UIKit.IUICoordinateSpace) -M:UIKit.UIView.ConvertPointToCoordinateSpace(CoreGraphics.CGPoint,UIKit.IUICoordinateSpace) -M:UIKit.UIView.ConvertRectFromCoordinateSpace(CoreGraphics.CGRect,UIKit.IUICoordinateSpace) -M:UIKit.UIView.ConvertRectToCoordinateSpace(CoreGraphics.CGRect,UIKit.IUICoordinateSpace) -M:UIKit.UIView.DidHintFocusMovement(UIKit.UIFocusMovementHint) -M:UIKit.UIView.DidUpdateFocus(UIKit.UIFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) M:UIKit.UIView.DisplayLayer(CoreAnimation.CALayer) M:UIKit.UIView.Dispose(System.Boolean) M:UIKit.UIView.DrawLayer(CoreAnimation.CALayer,CoreGraphics.CGContext) M:UIKit.UIView.EncodeTo(Foundation.NSCoder) M:UIKit.UIView.GetEnumerator -M:UIKit.UIView.GetFocusItems(CoreGraphics.CGRect) -M:UIKit.UIView.GetFrame(UIKit.UIView) -M:UIKit.UIView.GetSoundIdentifier(UIKit.UIFocusUpdateContext) M:UIKit.UIView.LayoutSublayersOfLayer(CoreAnimation.CALayer) M:UIKit.UIView.PerformSystemAnimationAsync(UIKit.UISystemAnimation,UIKit.UIView[],UIKit.UIViewAnimationOptions,System.Action) -M:UIKit.UIView.RegisterForTraitChanges(ObjCRuntime.Class[],Foundation.NSObject,ObjCRuntime.Selector) -M:UIKit.UIView.RegisterForTraitChanges(ObjCRuntime.Class[],ObjCRuntime.Selector) -M:UIKit.UIView.RegisterForTraitChanges(ObjCRuntime.Class[],System.Action{UIKit.IUITraitEnvironment,UIKit.UITraitCollection}) M:UIKit.UIView.remove_AnimationWillEnd(System.Action) M:UIKit.UIView.remove_AnimationWillStart(System.Action) -M:UIKit.UIView.SetNeedsFocusUpdate -M:UIKit.UIView.ShouldUpdateFocus(UIKit.UIFocusUpdateContext) -M:UIKit.UIView.TraitCollectionDidChange(UIKit.UITraitCollection) M:UIKit.UIView.Transition(UIKit.UIView,System.Double,UIKit.UIViewAnimationOptions,System.Action,System.Action) M:UIKit.UIView.Transition(UIKit.UIView,UIKit.UIView,System.Double,UIKit.UIViewAnimationOptions,System.Action) M:UIKit.UIView.TransitionNotifyAsync(UIKit.UIView,System.Double,UIKit.UIViewAnimationOptions,System.Action) M:UIKit.UIView.TransitionNotifyAsync(UIKit.UIView,UIKit.UIView,System.Double,UIKit.UIViewAnimationOptions) M:UIKit.UIView.UIViewAppearance.#ctor(System.IntPtr) -M:UIKit.UIView.UnregisterForTraitChanges(UIKit.IUITraitChangeRegistration) -M:UIKit.UIView.UpdateFocusIfNeeded M:UIKit.UIView.WillDrawLayer(CoreAnimation.CALayer) M:UIKit.UIViewConfigurationState.Copy(Foundation.NSZone) M:UIKit.UIViewConfigurationState.EncodeTo(Foundation.NSCoder) -M:UIKit.UIViewConfigurationState.GetCustomState(System.String) -M:UIKit.UIViewConfigurationState.GetObject(System.String) -M:UIKit.UIViewConfigurationState.SetCustomState(Foundation.NSObject,System.String) -M:UIKit.UIViewConfigurationState.SetObject(Foundation.NSObject,System.String) M:UIKit.UIViewController.Add(UIKit.UIView) M:UIKit.UIViewController.BeginRequestWithExtensionContext(Foundation.NSExtensionContext) -M:UIKit.UIViewController.DidUpdateFocus(UIKit.UIFocusUpdateContext,UIKit.UIFocusAnimationCoordinator) M:UIKit.UIViewController.DismissMoviePlayerViewController M:UIKit.UIViewController.DismissViewControllerAsync(System.Boolean) M:UIKit.UIViewController.Dispose(System.Boolean) M:UIKit.UIViewController.EncodeTo(Foundation.NSCoder) M:UIKit.UIViewController.GetEnumerator -M:UIKit.UIViewController.GetSizeForChildContentContainer(UIKit.IUIContentContainer,CoreGraphics.CGSize) -M:UIKit.UIViewController.GetSoundIdentifier(UIKit.UIFocusUpdateContext) -M:UIKit.UIViewController.PreferredContentSizeDidChangeForChildContentContainer(UIKit.IUIContentContainer) M:UIKit.UIViewController.PresentMoviePlayerViewController(MediaPlayer.MPMoviePlayerViewController) M:UIKit.UIViewController.PresentViewControllerAsync(UIKit.UIViewController,System.Boolean) -M:UIKit.UIViewController.RegisterForTraitChanges(ObjCRuntime.Class[],Foundation.NSObject,ObjCRuntime.Selector) -M:UIKit.UIViewController.RegisterForTraitChanges(ObjCRuntime.Class[],ObjCRuntime.Selector) -M:UIKit.UIViewController.RegisterForTraitChanges(ObjCRuntime.Class[],System.Action{UIKit.IUITraitEnvironment,UIKit.UITraitCollection}) -M:UIKit.UIViewController.SetNeedsFocusUpdate -M:UIKit.UIViewController.ShouldUpdateFocus(UIKit.UIFocusUpdateContext) -M:UIKit.UIViewController.SystemLayoutFittingSizeDidChangeForChildContentContainer(UIKit.IUIContentContainer) -M:UIKit.UIViewController.TraitCollectionDidChange(UIKit.UITraitCollection) M:UIKit.UIViewController.TransitionAsync(UIKit.UIViewController,UIKit.UIViewController,System.Double,UIKit.UIViewAnimationOptions,System.Action) -M:UIKit.UIViewController.UnregisterForTraitChanges(UIKit.IUITraitChangeRegistration) -M:UIKit.UIViewController.UpdateFocusIfNeeded -M:UIKit.UIViewController.ViewWillTransitionToSize(CoreGraphics.CGSize,UIKit.IUIViewControllerTransitionCoordinator) -M:UIKit.UIViewController.WillTransitionToTraitCollection(UIKit.UITraitCollection,UIKit.IUIViewControllerTransitionCoordinator) M:UIKit.UIViewControllerAnimatedTransitioning_Extensions.AnimationEnded(UIKit.IUIViewControllerAnimatedTransitioning,System.Boolean) M:UIKit.UIViewControllerAnimatedTransitioning_Extensions.GetInterruptibleAnimator(UIKit.IUIViewControllerAnimatedTransitioning,UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIViewControllerAnimatedTransitioning.AnimateTransition(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIViewControllerAnimatedTransitioning.AnimationEnded(System.Boolean) -M:UIKit.UIViewControllerAnimatedTransitioning.GetInterruptibleAnimator(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIViewControllerAnimatedTransitioning.TransitionDuration(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIViewControllerContextTransitioning.CancelInteractiveTransition -M:UIKit.UIViewControllerContextTransitioning.CompleteTransition(System.Boolean) -M:UIKit.UIViewControllerContextTransitioning.FinishInteractiveTransition -M:UIKit.UIViewControllerContextTransitioning.GetFinalFrameForViewController(UIKit.UIViewController) -M:UIKit.UIViewControllerContextTransitioning.GetInitialFrameForViewController(UIKit.UIViewController) -M:UIKit.UIViewControllerContextTransitioning.GetViewControllerForKey(Foundation.NSString) -M:UIKit.UIViewControllerContextTransitioning.GetViewFor(Foundation.NSString) -M:UIKit.UIViewControllerContextTransitioning.PauseInteractiveTransition -M:UIKit.UIViewControllerContextTransitioning.UpdateInteractiveTransition(System.Runtime.InteropServices.NFloat) M:UIKit.UIViewControllerInteractiveTransitioning_Extensions.GetCompletionCurve(UIKit.IUIViewControllerInteractiveTransitioning) M:UIKit.UIViewControllerInteractiveTransitioning_Extensions.GetCompletionSpeed(UIKit.IUIViewControllerInteractiveTransitioning) M:UIKit.UIViewControllerInteractiveTransitioning_Extensions.GetWantsInteractiveStart(UIKit.IUIViewControllerInteractiveTransitioning) -M:UIKit.UIViewControllerInteractiveTransitioning.StartInteractiveTransition(UIKit.IUIViewControllerContextTransitioning) -M:UIKit.UIViewControllerPreviewingDelegate.CommitViewController(UIKit.IUIViewControllerPreviewing,UIKit.UIViewController) -M:UIKit.UIViewControllerPreviewingDelegate.GetViewControllerForPreview(UIKit.IUIViewControllerPreviewing,CoreGraphics.CGPoint) M:UIKit.UIViewControllerTransitionCoordinatorContext_Extensions.GetTransitionViewController(UIKit.IUIViewControllerTransitionCoordinatorContext,UIKit.UITransitionViewControllerKind) M:UIKit.UIViewControllerTransitioningDelegate_Extensions.GetAnimationControllerForDismissedController(UIKit.IUIViewControllerTransitioningDelegate,UIKit.UIViewController) M:UIKit.UIViewControllerTransitioningDelegate_Extensions.GetAnimationControllerForPresentedController(UIKit.IUIViewControllerTransitioningDelegate,UIKit.UIViewController,UIKit.UIViewController,UIKit.UIViewController) M:UIKit.UIViewControllerTransitioningDelegate_Extensions.GetInteractionControllerForDismissal(UIKit.IUIViewControllerTransitioningDelegate,UIKit.IUIViewControllerAnimatedTransitioning) M:UIKit.UIViewControllerTransitioningDelegate_Extensions.GetInteractionControllerForPresentation(UIKit.IUIViewControllerTransitioningDelegate,UIKit.IUIViewControllerAnimatedTransitioning) M:UIKit.UIViewControllerTransitioningDelegate_Extensions.GetPresentationControllerForPresentedViewController(UIKit.IUIViewControllerTransitioningDelegate,UIKit.UIViewController,UIKit.UIViewController,UIKit.UIViewController) -M:UIKit.UIViewControllerTransitioningDelegate.GetAnimationControllerForDismissedController(UIKit.UIViewController) -M:UIKit.UIViewControllerTransitioningDelegate.GetAnimationControllerForPresentedController(UIKit.UIViewController,UIKit.UIViewController,UIKit.UIViewController) -M:UIKit.UIViewControllerTransitioningDelegate.GetInteractionControllerForDismissal(UIKit.IUIViewControllerAnimatedTransitioning) -M:UIKit.UIViewControllerTransitioningDelegate.GetInteractionControllerForPresentation(UIKit.IUIViewControllerAnimatedTransitioning) -M:UIKit.UIViewControllerTransitioningDelegate.GetPresentationControllerForPresentedViewController(UIKit.UIViewController,UIKit.UIViewController,UIKit.UIViewController) M:UIKit.UIViewImplicitlyAnimating_Extensions.AddAnimations(UIKit.IUIViewImplicitlyAnimating,System.Action,System.Runtime.InteropServices.NFloat) M:UIKit.UIViewImplicitlyAnimating_Extensions.AddAnimations(UIKit.IUIViewImplicitlyAnimating,System.Action) M:UIKit.UIViewImplicitlyAnimating_Extensions.AddCompletion(UIKit.IUIViewImplicitlyAnimating,System.Action{UIKit.UIViewAnimatingPosition}) M:UIKit.UIViewImplicitlyAnimating_Extensions.ContinueAnimation(UIKit.IUIViewImplicitlyAnimating,UIKit.IUITimingCurveProvider,System.Runtime.InteropServices.NFloat) M:UIKit.UIViewPropertyAnimator.Copy(Foundation.NSZone) -M:UIKit.UIViewPropertyAnimator.FinishAnimation(UIKit.UIViewAnimatingPosition) -M:UIKit.UIViewPropertyAnimator.PauseAnimation -M:UIKit.UIViewPropertyAnimator.StartAnimation -M:UIKit.UIViewPropertyAnimator.StartAnimation(System.Double) -M:UIKit.UIViewPropertyAnimator.StopAnimation(System.Boolean) M:UIKit.UIVisualEffect.Copy(Foundation.NSZone) M:UIKit.UIVisualEffect.EncodeTo(Foundation.NSCoder) M:UIKit.UIVisualEffectView.EncodeTo(Foundation.NSCoder) M:UIKit.UIVisualEffectView.UIVisualEffectViewAppearance.#ctor(System.IntPtr) M:UIKit.UIWebErrorArgs.#ctor(Foundation.NSError) -M:UIKit.UIWebView.#ctor(CoreGraphics.CGRect) M:UIKit.UIWebView.add_LoadError(System.EventHandler{UIKit.UIWebErrorArgs}) M:UIKit.UIWebView.add_LoadFinished(System.EventHandler) M:UIKit.UIWebView.add_LoadStarted(System.EventHandler) -M:UIKit.UIWebView.DecelerationEnded(UIKit.UIScrollView) -M:UIKit.UIWebView.DecelerationStarted(UIKit.UIScrollView) -M:UIKit.UIWebView.DidChangeAdjustedContentInset(UIKit.UIScrollView) -M:UIKit.UIWebView.DidZoom(UIKit.UIScrollView) M:UIKit.UIWebView.Dispose(System.Boolean) -M:UIKit.UIWebView.DraggingEnded(UIKit.UIScrollView,System.Boolean) -M:UIKit.UIWebView.DraggingStarted(UIKit.UIScrollView) M:UIKit.UIWebView.remove_LoadError(System.EventHandler{UIKit.UIWebErrorArgs}) M:UIKit.UIWebView.remove_LoadFinished(System.EventHandler) M:UIKit.UIWebView.remove_LoadStarted(System.EventHandler) -M:UIKit.UIWebView.ScrollAnimationEnded(UIKit.UIScrollView) -M:UIKit.UIWebView.Scrolled(UIKit.UIScrollView) -M:UIKit.UIWebView.ScrolledToTop(UIKit.UIScrollView) -M:UIKit.UIWebView.ShouldScrollToTop(UIKit.UIScrollView) M:UIKit.UIWebView.UIWebViewAppearance.#ctor(System.IntPtr) -M:UIKit.UIWebView.ViewForZoomingInScrollView(UIKit.UIScrollView) -M:UIKit.UIWebView.WillEndDragging(UIKit.UIScrollView,CoreGraphics.CGPoint,CoreGraphics.CGPoint@) -M:UIKit.UIWebView.ZoomingEnded(UIKit.UIScrollView,UIKit.UIView,System.Runtime.InteropServices.NFloat) -M:UIKit.UIWebView.ZoomingStarted(UIKit.UIScrollView,UIKit.UIView) M:UIKit.UIWebViewDelegate_Extensions.LoadFailed(UIKit.IUIWebViewDelegate,UIKit.UIWebView,Foundation.NSError) M:UIKit.UIWebViewDelegate_Extensions.LoadingFinished(UIKit.IUIWebViewDelegate,UIKit.UIWebView) M:UIKit.UIWebViewDelegate_Extensions.LoadStarted(UIKit.IUIWebViewDelegate,UIKit.UIWebView) M:UIKit.UIWebViewDelegate_Extensions.ShouldStartLoad(UIKit.IUIWebViewDelegate,UIKit.UIWebView,Foundation.NSUrlRequest,UIKit.UIWebViewNavigationType) -M:UIKit.UIWebViewDelegate.LoadFailed(UIKit.UIWebView,Foundation.NSError) -M:UIKit.UIWebViewDelegate.LoadingFinished(UIKit.UIWebView) -M:UIKit.UIWebViewDelegate.LoadStarted(UIKit.UIWebView) -M:UIKit.UIWebViewDelegate.ShouldStartLoad(UIKit.UIWebView,Foundation.NSUrlRequest,UIKit.UIWebViewNavigationType) -M:UIKit.UIWindow.#ctor(CoreGraphics.CGRect) M:UIKit.UIWindow.Dispose(System.Boolean) M:UIKit.UIWindow.UIWindowAppearance.#ctor(System.IntPtr) -M:UIKit.UIWindowScene.#ctor(UIKit.UISceneSession,UIKit.UISceneConnectionOptions) M:UIKit.UIWindowScene.Dispose(System.Boolean) -M:UIKit.UIWindowScene.RegisterForTraitChanges(ObjCRuntime.Class[],Foundation.NSObject,ObjCRuntime.Selector) -M:UIKit.UIWindowScene.RegisterForTraitChanges(ObjCRuntime.Class[],ObjCRuntime.Selector) -M:UIKit.UIWindowScene.RegisterForTraitChanges(ObjCRuntime.Class[],System.Action{UIKit.IUITraitEnvironment,UIKit.UITraitCollection}) -M:UIKit.UIWindowScene.UnregisterForTraitChanges(UIKit.IUITraitChangeRegistration) -M:UIKit.UIWindowSceneActivationInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIWindowSceneActivationInteraction.Dispose(System.Boolean) -M:UIKit.UIWindowSceneActivationInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIWindowSceneDelegate_Extensions.DidUpdateCoordinateSpace(UIKit.IUIWindowSceneDelegate,UIKit.UIWindowScene,UIKit.IUICoordinateSpace,UIKit.UIInterfaceOrientation,UIKit.UITraitCollection) M:UIKit.UIWindowSceneDelegate_Extensions.GetWindow(UIKit.IUIWindowSceneDelegate) M:UIKit.UIWindowSceneDelegate_Extensions.PerformAction(UIKit.IUIWindowSceneDelegate,UIKit.UIWindowScene,UIKit.UIApplicationShortcutItem,System.Action{System.Boolean}) M:UIKit.UIWindowSceneDelegate_Extensions.SetWindow(UIKit.IUIWindowSceneDelegate,UIKit.UIWindow) M:UIKit.UIWindowSceneDelegate_Extensions.UserDidAcceptCloudKitShare(UIKit.IUIWindowSceneDelegate,UIKit.UIWindowScene,CloudKit.CKShareMetadata) -M:UIKit.UIWindowSceneDelegate.ContinueUserActivity(UIKit.UIScene,Foundation.NSUserActivity) -M:UIKit.UIWindowSceneDelegate.DidBecomeActive(UIKit.UIScene) -M:UIKit.UIWindowSceneDelegate.DidDisconnect(UIKit.UIScene) -M:UIKit.UIWindowSceneDelegate.DidEnterBackground(UIKit.UIScene) -M:UIKit.UIWindowSceneDelegate.DidFailToContinueUserActivity(UIKit.UIScene,System.String,Foundation.NSError) -M:UIKit.UIWindowSceneDelegate.DidUpdateCoordinateSpace(UIKit.UIWindowScene,UIKit.IUICoordinateSpace,UIKit.UIInterfaceOrientation,UIKit.UITraitCollection) -M:UIKit.UIWindowSceneDelegate.DidUpdateUserActivity(UIKit.UIScene,Foundation.NSUserActivity) -M:UIKit.UIWindowSceneDelegate.GetStateRestorationActivity(UIKit.UIScene) -M:UIKit.UIWindowSceneDelegate.OpenUrlContexts(UIKit.UIScene,Foundation.NSSet{UIKit.UIOpenUrlContext}) -M:UIKit.UIWindowSceneDelegate.PerformAction(UIKit.UIWindowScene,UIKit.UIApplicationShortcutItem,System.Action{System.Boolean}) -M:UIKit.UIWindowSceneDelegate.RestoreInteractionState(UIKit.UIScene,Foundation.NSUserActivity) -M:UIKit.UIWindowSceneDelegate.UserDidAcceptCloudKitShare(UIKit.UIWindowScene,CloudKit.CKShareMetadata) -M:UIKit.UIWindowSceneDelegate.WillConnect(UIKit.UIScene,UIKit.UISceneSession,UIKit.UISceneConnectionOptions) -M:UIKit.UIWindowSceneDelegate.WillContinueUserActivity(UIKit.UIScene,System.String) -M:UIKit.UIWindowSceneDelegate.WillEnterForeground(UIKit.UIScene) -M:UIKit.UIWindowSceneDelegate.WillResignActive(UIKit.UIScene) -M:UIKit.UIWindowSceneDragInteraction.DidMoveToView(UIKit.UIView) M:UIKit.UIWindowSceneDragInteraction.Dispose(System.Boolean) -M:UIKit.UIWindowSceneDragInteraction.WillMoveToView(UIKit.UIView) M:UIKit.UIWindowSceneGeometry.Copy(Foundation.NSZone) M:UIKit.UIWindowScenePlacement.Copy(Foundation.NSZone) M:UIKit.UIZoomTransitionOptions.Copy(Foundation.NSZone) @@ -52992,412 +47417,152 @@ M:VideoToolbox.VTVideoEncoder.GetEncoderList M:VideoToolbox.VTVideoEncoder.GetSupportedEncoderProperties(System.Int32,System.Int32,CoreMedia.CMVideoCodecType,Foundation.NSDictionary) M:VideoToolbox.VTVideoEncoderSpecification.#ctor M:VideoToolbox.VTVideoEncoderSpecification.#ctor(Foundation.NSDictionary) -M:Vision.VNAnimalBodyPoseObservation.GetRecognizedPoint(Vision.VNAnimalBodyPoseObservationJointName,Foundation.NSError@) -M:Vision.VNAnimalBodyPoseObservation.GetRecognizedPoints(Vision.VNAnimalBodyPoseObservationJointsGroupName,Foundation.NSError@) -M:Vision.VNBarcodeObservation.FromBoundingBox(CoreGraphics.CGRect) -M:Vision.VNBarcodeObservation.FromBoundingBox(Vision.VNBarcodeObservationRequestRevision,CoreGraphics.CGRect) M:Vision.VNBarcodeSymbologyExtensions.GetConstants(Vision.VNBarcodeSymbology[]) M:Vision.VNBarcodeSymbologyExtensions.GetValues(Foundation.NSString[]) -M:Vision.VNCalculateImageAestheticsScoresRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNCircle.Contains(Vision.VNPoint,System.Double) -M:Vision.VNCircle.Contains(Vision.VNPoint) M:Vision.VNCircle.Copy(Foundation.NSZone) M:Vision.VNCircle.CreateUsingDiameter(Vision.VNPoint,System.Double) M:Vision.VNCircle.CreateUsingRadius(Vision.VNPoint,System.Double) M:Vision.VNCircle.EncodeTo(Foundation.NSCoder) -M:Vision.VNClassificationObservation.HasMinimumPrecision(System.Single,System.Single) -M:Vision.VNClassificationObservation.HasMinimumRecall(System.Single,System.Single) -M:Vision.VNClassifyImageRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNClassifyImageRequest.GetKnownClassifications(Vision.VNClassifyImageRequestRevision,Foundation.NSError@) -M:Vision.VNClassifyImageRequest.GetSupportedIdentifiers(Foundation.NSError@) M:Vision.VNContour.Copy(Foundation.NSZone) -M:Vision.VNContour.GetChildContour(System.UIntPtr,Foundation.NSError@) -M:Vision.VNContour.GetPolygonApproximation(System.Single,Foundation.NSError@) -M:Vision.VNContoursObservation.GetContour(Foundation.NSIndexPath,Foundation.NSError@) -M:Vision.VNContoursObservation.GetContour(System.IntPtr,Foundation.NSError@) -M:Vision.VNCoreMLModel.FromMLModel(CoreML.MLModel,Foundation.NSError@) -M:Vision.VNCoreMLRequest.#ctor(Vision.VNCoreMLModel,Vision.VNRequestCompletionHandler) -M:Vision.VNCoreMLRequest.#ctor(Vision.VNCoreMLModel) -M:Vision.VNCoreMLRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectAnimalBodyPoseRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectAnimalBodyPoseRequest.GetSupportedJointNames(Foundation.NSError@) -M:Vision.VNDetectAnimalBodyPoseRequest.GetSupportedJointsGroupNames(Foundation.NSError@) -M:Vision.VNDetectBarcodesRequest.#ctor(Vision.VNRequestCompletionHandler) M:Vision.VNDetectBarcodesRequest.GetSupportedSymbologies(Foundation.NSError@) -M:Vision.VNDetectBarcodesRequest.GetWeakSupportedSymbologies(Foundation.NSError@) -M:Vision.VNDetectContoursRequest.#ctor(Vision.VNRequestCompletionHandler) M:Vision.VNDetectContoursRequest.Dispose(System.Boolean) -M:Vision.VNDetectDocumentSegmentationRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectedObjectObservation.FromBoundingBox(CoreGraphics.CGRect) -M:Vision.VNDetectedObjectObservation.FromBoundingBox(Vision.VNDetectedObjectObservationRequestRevision,CoreGraphics.CGRect) -M:Vision.VNDetectFaceCaptureQualityRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectFaceLandmarksRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectFaceLandmarksRequest.SupportsConstellation(Vision.VNDetectFaceLandmarksRequestRevision,Vision.VNRequestFaceLandmarksConstellation) -M:Vision.VNDetectFaceRectanglesRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectHorizonRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectHumanBodyPose3DRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectHumanBodyPose3DRequest.GetSupportedJointNames(Foundation.NSError@) -M:Vision.VNDetectHumanBodyPose3DRequest.GetSupportedJointsGroupNames(Foundation.NSError@) -M:Vision.VNDetectHumanBodyPoseRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectHumanBodyPoseRequest.GetSupportedJointNames(Foundation.NSError@) -M:Vision.VNDetectHumanBodyPoseRequest.GetSupportedJointNames(Vision.VNDetectHumanBodyPoseRequestRevision,Foundation.NSError@) -M:Vision.VNDetectHumanBodyPoseRequest.GetSupportedJointsGroupNames(Foundation.NSError@) -M:Vision.VNDetectHumanBodyPoseRequest.GetSupportedJointsGroupNames(Vision.VNDetectHumanBodyPoseRequestRevision,Foundation.NSError@) -M:Vision.VNDetectHumanHandPoseRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectHumanHandPoseRequest.GetSupportedJointNames(Foundation.NSError@) -M:Vision.VNDetectHumanHandPoseRequest.GetSupportedJointNames(Vision.VNDetectHumanHandPoseRequestRevision,Foundation.NSError@) -M:Vision.VNDetectHumanHandPoseRequest.GetSupportedJointsGroupNames(Foundation.NSError@) -M:Vision.VNDetectHumanHandPoseRequest.GetSupportedJointsGroupNames(Vision.VNDetectHumanHandPoseRequestRevision,Foundation.NSError@) -M:Vision.VNDetectHumanRectanglesRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectRectanglesRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectTextRectanglesRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNDetectTrajectoriesRequest.#ctor(CoreMedia.CMTime,System.IntPtr,Vision.VNRequestCompletionHandler) M:Vision.VNFaceLandmarkRegion.Copy(Foundation.NSZone) M:Vision.VNFaceLandmarkRegion.EncodeTo(Foundation.NSCoder) M:Vision.VNFaceLandmarkRegion2D.GetPointsInImage(CoreGraphics.CGSize) M:Vision.VNFaceLandmarks.Copy(Foundation.NSZone) M:Vision.VNFaceLandmarks.EncodeTo(Foundation.NSCoder) -M:Vision.VNFaceObservation.FromBoundingBox(CoreGraphics.CGRect) -M:Vision.VNFaceObservation.FromBoundingBox(Vision.VNFaceObservationRequestRevision,CoreGraphics.CGRect,System.Nullable{System.Runtime.InteropServices.NFloat},System.Nullable{System.Runtime.InteropServices.NFloat},System.Nullable{System.Runtime.InteropServices.NFloat}) -M:Vision.VNFaceObservation.FromBoundingBox(Vision.VNFaceObservationRequestRevision,CoreGraphics.CGRect,System.Nullable{System.Runtime.InteropServices.NFloat},System.Nullable{System.Runtime.InteropServices.NFloat}) -M:Vision.VNFaceObservation.FromBoundingBox(Vision.VNFaceObservationRequestRevision,CoreGraphics.CGRect) M:Vision.VNFeaturePrintObservation.ComputeDistance(System.Single[]@,Vision.VNFeaturePrintObservation,Foundation.NSError@) -M:Vision.VNGenerateAttentionBasedSaliencyImageRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateForegroundInstanceMaskRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateImageFeaturePrintRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateObjectnessBasedSaliencyImageRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,Foundation.NSDictionary) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSData,Vision.VNImageOptions) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNGenerateOpticalFlowRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions) -M:Vision.VNGeneratePersonInstanceMaskRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNGeneratePersonSegmentationRequest.#ctor(CoreMedia.CMTime,Vision.VNRequestCompletionHandler) -M:Vision.VNGeneratePersonSegmentationRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNGeneratePersonSegmentationRequest.Create -M:Vision.VNGeneratePersonSegmentationRequest.GetSupportedOutputPixelFormats(Foundation.NSError@) -M:Vision.VNGeometryUtils.CalculateArea(System.Double@,Vision.VNContour,System.Boolean,Foundation.NSError@) -M:Vision.VNGeometryUtils.CalculatePerimeter(System.Double@,Vision.VNContour,Foundation.NSError@) M:Vision.VNGeometryUtils.CreateBoundingCircle(System.Numerics.Vector2[],Foundation.NSError@) -M:Vision.VNGeometryUtils.CreateBoundingCircle(Vision.VNContour,Foundation.NSError@) -M:Vision.VNGeometryUtils.CreateBoundingCircle(Vision.VNPoint[],Foundation.NSError@) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,Foundation.NSDictionary) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSData,Vision.VNImageOptions) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNHomographicImageRegistrationRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions) -M:Vision.VNHorizonObservation.CreateTransform(System.UIntPtr,System.UIntPtr) -M:Vision.VNHumanBodyPose3DObservation.GetCameraRelativePosition(CoreGraphics.NMatrix4@,Vision.VNHumanBodyPose3DObservationJointName,Foundation.NSError@) -M:Vision.VNHumanBodyPose3DObservation.GetParentJointName(Vision.VNHumanBodyPose3DObservationJointName) -M:Vision.VNHumanBodyPose3DObservation.GetPointInImage(Vision.VNHumanBodyPose3DObservationJointName,Foundation.NSError@) -M:Vision.VNHumanBodyPose3DObservation.GetRecognizedPoint(Vision.VNHumanBodyPose3DObservationJointName,Foundation.NSError@) -M:Vision.VNHumanBodyPose3DObservation.GetRecognizedPoints(Vision.VNHumanBodyPose3DObservationJointsGroupName,Foundation.NSError@) -M:Vision.VNHumanBodyPoseObservation.GetRecognizedPoint(Vision.VNHumanBodyPoseObservationJointName,Foundation.NSError@) -M:Vision.VNHumanBodyPoseObservation.GetRecognizedPoints(Vision.VNHumanBodyPoseObservationJointsGroupName,Foundation.NSError@) -M:Vision.VNHumanBodyRecognizedPoint3D.#ctor(CoreGraphics.NMatrix4) -M:Vision.VNHumanHandPoseObservation.GetRecognizedPoint(Vision.VNHumanHandPoseObservationJointName,Foundation.NSError@) -M:Vision.VNHumanHandPoseObservation.GetRecognizedPoints(Vision.VNHumanHandPoseObservationJointsGroupName,Foundation.NSError@) -M:Vision.VNImageBasedRequest.#ctor(Vision.VNRequestCompletionHandler) M:Vision.VNImageOptions.#ctor M:Vision.VNImageOptions.#ctor(Foundation.NSDictionary) -M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary) -M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions) -M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary) -M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions) -M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary) -M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,Foundation.NSDictionary) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSData,Vision.VNImageOptions) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNImageRegistrationRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions) -M:Vision.VNImageRequestHandler.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary) -M:Vision.VNImageRequestHandler.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRequestHandler.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRequestHandler.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions) -M:Vision.VNImageRequestHandler.#ctor(CoreImage.CIImage,Foundation.NSDictionary) -M:Vision.VNImageRequestHandler.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRequestHandler.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRequestHandler.#ctor(CoreImage.CIImage,Vision.VNImageOptions) -M:Vision.VNImageRequestHandler.#ctor(CoreMedia.CMSampleBuffer,AVFoundation.AVDepthData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:Vision.VNImageRequestHandler.#ctor(CoreMedia.CMSampleBuffer,Foundation.NSDictionary) -M:Vision.VNImageRequestHandler.#ctor(CoreMedia.CMSampleBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRequestHandler.#ctor(CoreMedia.CMSampleBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRequestHandler.#ctor(CoreMedia.CMSampleBuffer,Vision.VNImageOptions) -M:Vision.VNImageRequestHandler.#ctor(CoreVideo.CVPixelBuffer,AVFoundation.AVDepthData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) -M:Vision.VNImageRequestHandler.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary) -M:Vision.VNImageRequestHandler.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRequestHandler.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRequestHandler.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions) -M:Vision.VNImageRequestHandler.#ctor(Foundation.NSData,Foundation.NSDictionary) -M:Vision.VNImageRequestHandler.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRequestHandler.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRequestHandler.#ctor(Foundation.NSData,Vision.VNImageOptions) -M:Vision.VNImageRequestHandler.#ctor(Foundation.NSUrl,Foundation.NSDictionary) -M:Vision.VNImageRequestHandler.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNImageRequestHandler.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNImageRequestHandler.#ctor(Foundation.NSUrl,Vision.VNImageOptions) -M:Vision.VNImageRequestHandler.Perform(Vision.VNRequest[],Foundation.NSError@) -M:Vision.VNInstanceMaskObservation.GenerateMask(Foundation.NSIndexSet,Foundation.NSError@) -M:Vision.VNInstanceMaskObservation.GenerateMaskedImage(Foundation.NSIndexSet,Vision.VNImageRequestHandler,System.Boolean,Foundation.NSError@) -M:Vision.VNInstanceMaskObservation.GenerateScaledMask(Foundation.NSIndexSet,Vision.VNImageRequestHandler,Foundation.NSError@) M:Vision.VNObservation.Copy(Foundation.NSZone) M:Vision.VNObservation.EncodeTo(Foundation.NSCoder) -M:Vision.VNPoint.#ctor(CoreGraphics.CGPoint) -M:Vision.VNPoint.#ctor(System.Double,System.Double) M:Vision.VNPoint.Copy(Foundation.NSZone) -M:Vision.VNPoint.Create(Vision.VNVector,Vision.VNPoint) M:Vision.VNPoint.EncodeTo(Foundation.NSCoder) -M:Vision.VNPoint.GetDistanceToPoint(Vision.VNPoint) -M:Vision.VNPoint3D.#ctor(CoreGraphics.NMatrix4) M:Vision.VNPoint3D.Copy(Foundation.NSZone) M:Vision.VNPoint3D.EncodeTo(Foundation.NSCoder) -M:Vision.VNRecognizeAnimalsRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNRecognizeAnimalsRequest.GetKnownAnimalIdentifiers(Vision.VNRecognizeAnimalsRequestRevision,Foundation.NSError@) -M:Vision.VNRecognizeAnimalsRequest.GetSupportedIdentifiers(Foundation.NSError@) -M:Vision.VNRecognizedObjectObservation.FromBoundingBox(CoreGraphics.CGRect) -M:Vision.VNRecognizedObjectObservation.FromBoundingBox(Vision.VNRecognizedObjectObservationRequestRevision,CoreGraphics.CGRect) -M:Vision.VNRecognizedPoint3D.#ctor(CoreGraphics.NMatrix4) -M:Vision.VNRecognizedPoints3DObservation.GetRecognizedPoint(Foundation.NSString,Foundation.NSError@) -M:Vision.VNRecognizedPoints3DObservation.GetRecognizedPoints(Foundation.NSString,Foundation.NSError@) M:Vision.VNRecognizedPointsObservation.GetAvailableGroupKeys``1 M:Vision.VNRecognizedPointsObservation.GetAvailableKeys``1 -M:Vision.VNRecognizedPointsObservation.GetKeypoints(Foundation.NSError@) -M:Vision.VNRecognizedPointsObservation.GetRecognizedPoint(Foundation.NSString,Foundation.NSError@) M:Vision.VNRecognizedPointsObservation.GetRecognizedPoint(Vision.VNHumanBodyPoseObservationJointName,Foundation.NSError@) M:Vision.VNRecognizedPointsObservation.GetRecognizedPoint(Vision.VNHumanHandPoseObservationJointName,Foundation.NSError@) -M:Vision.VNRecognizedPointsObservation.GetRecognizedPoints(Foundation.NSString,Foundation.NSError@) M:Vision.VNRecognizedPointsObservation.GetRecognizedPoints(Vision.VNHumanBodyPoseObservationJointsGroupName,Foundation.NSError@) M:Vision.VNRecognizedPointsObservation.GetRecognizedPoints(Vision.VNHumanHandPoseObservationJointsGroupName,Foundation.NSError@) M:Vision.VNRecognizedText.Copy(Foundation.NSZone) M:Vision.VNRecognizedText.EncodeTo(Foundation.NSCoder) -M:Vision.VNRecognizedText.GetBoundingBox(Foundation.NSRange,Foundation.NSError@) -M:Vision.VNRecognizedTextObservation.Create(CoreGraphics.CGRect) -M:Vision.VNRecognizedTextObservation.TopCandidates(System.UIntPtr) -M:Vision.VNRecognizeTextRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNRecognizeTextRequest.GetSupportedRecognitionLanguages(Foundation.NSError@) -M:Vision.VNRecognizeTextRequest.GetSupportedRecognitionLanguages(Vision.VNRequestTextRecognitionLevel,Vision.VNRecognizeTextRequestRevision,Foundation.NSError@) -M:Vision.VNRectangleObservation.FromBoundingBox(CoreGraphics.CGRect) -M:Vision.VNRectangleObservation.FromBoundingBox(Vision.VNRectangleObservationRequestRevision,CoreGraphics.CGRect) -M:Vision.VNRectangleObservation.FromRectangleObservation(Vision.VNRectangleObservationRequestRevision,CoreGraphics.CGPoint,CoreGraphics.CGPoint,CoreGraphics.CGPoint,CoreGraphics.CGPoint) -M:Vision.VNRectangleObservation.GetRectangleObservation(Vision.VNRectangleObservationRequestRevision,CoreGraphics.CGPoint,CoreGraphics.CGPoint,CoreGraphics.CGPoint,CoreGraphics.CGPoint) -M:Vision.VNRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNRequest.Cancel M:Vision.VNRequest.Copy(Foundation.NSZone) -M:Vision.VNRequest.GetComputeDevice(System.String) M:Vision.VNRequest.GetResults``1 -M:Vision.VNRequest.GetSupportedComputeDevices(Foundation.NSError@) -M:Vision.VNRequest.SetComputeDevice(CoreML.IMLComputeDeviceProtocol,System.String) -M:Vision.VNSequenceRequestHandler.#ctor -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreGraphics.CGImage,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreImage.CIImage,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreMedia.CMSampleBuffer,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreMedia.CMSampleBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreVideo.CVPixelBuffer,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],Foundation.NSData,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],Foundation.NSUrl,Foundation.NSError@) -M:Vision.VNSequenceRequestHandler.Perform(Vision.VNRequest[],Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSError@) -M:Vision.VNStatefulRequest.#ctor(CoreMedia.CMTime,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary) -M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions) -M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary) -M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions) -M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,Foundation.NSDictionary) -M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreMedia.CMSampleBuffer,Vision.VNImageOptions) -M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary) -M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,Foundation.NSDictionary) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSData,Vision.VNImageOptions) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTargetedImageRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions) -M:Vision.VNTextObservation.FromBoundingBox(CoreGraphics.CGRect) -M:Vision.VNTextObservation.FromBoundingBox(Vision.VNTextObservationRequestRevision,CoreGraphics.CGRect) -M:Vision.VNTrackHomographicImageRegistrationRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNTrackingRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNTrackingRequest.GetSupportedNumberOfTrackers(Foundation.NSError@) -M:Vision.VNTrackObjectRequest.#ctor(Vision.VNDetectedObjectObservation,Vision.VNRequestCompletionHandler) -M:Vision.VNTrackObjectRequest.#ctor(Vision.VNDetectedObjectObservation) -M:Vision.VNTrackObjectRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNTrackOpticalFlowRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNTrackRectangleRequest.#ctor(Vision.VNRectangleObservation,Vision.VNRequestCompletionHandler) -M:Vision.VNTrackRectangleRequest.#ctor(Vision.VNRectangleObservation) -M:Vision.VNTrackRectangleRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNTrackTranslationalImageRegistrationRequest.#ctor(Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Foundation.NSDictionary) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreGraphics.CGImage,Vision.VNImageOptions) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,Foundation.NSDictionary) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreImage.CIImage,Vision.VNImageOptions) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Foundation.NSDictionary) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(CoreVideo.CVPixelBuffer,Vision.VNImageOptions) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,Foundation.NSDictionary) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSData,Vision.VNImageOptions) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSUrl,Foundation.NSDictionary) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary,Vision.VNRequestCompletionHandler) -M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Foundation.NSDictionary) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSUrl,ImageIO.CGImagePropertyOrientation,Vision.VNImageOptions) M:Vision.VNTranslationalImageRegistrationRequest.#ctor(Foundation.NSUrl,Vision.VNImageOptions,Vision.VNRequestCompletionHandler) @@ -53414,36 +47579,18 @@ M:Vision.VNUtils.GetNormalizedPoint(CoreGraphics.CGPoint,System.UIntPtr,System.U M:Vision.VNUtils.GetNormalizedRect(CoreGraphics.CGRect,System.UIntPtr,System.UIntPtr,CoreGraphics.CGRect) M:Vision.VNUtils.GetNormalizedRect(CoreGraphics.CGRect,System.UIntPtr,System.UIntPtr) M:Vision.VNUtils.IsIdentityRect(CoreGraphics.CGRect) -M:Vision.VNVector.#ctor(System.Double,System.Double) -M:Vision.VNVector.#ctor(Vision.VNPoint,Vision.VNPoint) M:Vision.VNVector.Copy(Foundation.NSZone) M:Vision.VNVector.Create(System.Double,System.Double) -M:Vision.VNVector.CreateByAddingVector(Vision.VNVector,Vision.VNVector) -M:Vision.VNVector.CreateByMultiplyingVector(Vision.VNVector,System.Double) -M:Vision.VNVector.CreateBySubtractingVector(Vision.VNVector,Vision.VNVector) -M:Vision.VNVector.CreateUnitVector(Vision.VNVector) M:Vision.VNVector.EncodeTo(Foundation.NSCoder) -M:Vision.VNVector.GetDotProduct(Vision.VNVector,Vision.VNVector) -M:Vision.VNVideoProcessor.#ctor(Foundation.NSUrl) -M:Vision.VNVideoProcessor.AddRequest(Vision.VNRequest,Vision.VNVideoProcessorRequestProcessingOptions,Foundation.NSError@) -M:Vision.VNVideoProcessor.Analyze(CoreMedia.CMTimeRange,Foundation.NSError@) -M:Vision.VNVideoProcessor.Cancel -M:Vision.VNVideoProcessor.RemoveRequest(Vision.VNRequest,Foundation.NSError@) M:Vision.VNVideoProcessorCadence.Copy(Foundation.NSZone) -M:Vision.VNVideoProcessorFrameRateCadence.#ctor(System.IntPtr) M:Vision.VNVideoProcessorRequestProcessingOptions.Copy(Foundation.NSZone) -M:Vision.VNVideoProcessorTimeIntervalCadence.#ctor(System.Double) M:VisionKit.IVNDocumentCameraViewControllerDelegate.DidCancel(VisionKit.VNDocumentCameraViewController) M:VisionKit.IVNDocumentCameraViewControllerDelegate.DidFail(VisionKit.VNDocumentCameraViewController,Foundation.NSError) M:VisionKit.IVNDocumentCameraViewControllerDelegate.DidFinish(VisionKit.VNDocumentCameraViewController,VisionKit.VNDocumentCameraScan) -M:VisionKit.VNDocumentCameraScan.GetImage(System.UIntPtr) M:VisionKit.VNDocumentCameraViewController.Dispose(System.Boolean) M:VisionKit.VNDocumentCameraViewControllerDelegate_Extensions.DidCancel(VisionKit.IVNDocumentCameraViewControllerDelegate,VisionKit.VNDocumentCameraViewController) M:VisionKit.VNDocumentCameraViewControllerDelegate_Extensions.DidFail(VisionKit.IVNDocumentCameraViewControllerDelegate,VisionKit.VNDocumentCameraViewController,Foundation.NSError) M:VisionKit.VNDocumentCameraViewControllerDelegate_Extensions.DidFinish(VisionKit.IVNDocumentCameraViewControllerDelegate,VisionKit.VNDocumentCameraViewController,VisionKit.VNDocumentCameraScan) -M:VisionKit.VNDocumentCameraViewControllerDelegate.DidCancel(VisionKit.VNDocumentCameraViewController) -M:VisionKit.VNDocumentCameraViewControllerDelegate.DidFail(VisionKit.VNDocumentCameraViewController,Foundation.NSError) -M:VisionKit.VNDocumentCameraViewControllerDelegate.DidFinish(VisionKit.VNDocumentCameraViewController,VisionKit.VNDocumentCameraScan) M:WatchConnectivity.IWCSessionDelegate.ActivationDidComplete(WatchConnectivity.WCSession,WatchConnectivity.WCSessionActivationState,Foundation.NSError) M:WatchConnectivity.IWCSessionDelegate.DidBecomeInactive(WatchConnectivity.WCSession) M:WatchConnectivity.IWCSessionDelegate.DidDeactivate(WatchConnectivity.WCSession) @@ -53496,26 +47643,14 @@ M:WatchConnectivity.WCSessionUserInfoTransfer.Cancel M:WatchConnectivity.WCSessionUserInfoTransfer.EncodeTo(Foundation.NSCoder) M:WebKit.DomCssRuleList.GetEnumerator M:WebKit.DomCssStyleDeclaration.GetEnumerator -M:WebKit.DomElement.Contains(WebKit.DomElement) M:WebKit.DomEventArgs.#ctor(WebKit.DomEvent) -M:WebKit.DomEventListener.HandleEvent(WebKit.DomEvent) -M:WebKit.DomEventTarget.AddEventListener(System.String,WebKit.IDomEventListener,System.Boolean) M:WebKit.DomEventTarget.Copy(Foundation.NSZone) -M:WebKit.DomEventTarget.DispatchEvent(WebKit.DomEvent) -M:WebKit.DomEventTarget.RemoveEventListener(System.String,WebKit.IDomEventListener,System.Boolean) M:WebKit.DomHtmlCollection.GetEnumerator -M:WebKit.DomHtmlDocument.HasFocus -M:WebKit.DomHtmlTextAreaElement.Blur -M:WebKit.DomHtmlTextAreaElement.Focus M:WebKit.DomMediaList.GetEnumerator M:WebKit.DomNamedNodeMap.GetEnumerator M:WebKit.DomNode.AddEventListener(System.String,System.Action{WebKit.DomEvent},System.Boolean) M:WebKit.DomNode.AddEventListener(System.String,WebKit.DomEventListenerHandler,System.Boolean) -M:WebKit.DomNode.AddEventListener(System.String,WebKit.IDomEventListener,System.Boolean) M:WebKit.DomNode.Copy(Foundation.NSZone) -M:WebKit.DomNode.DispatchEvent(WebKit.DomEvent) -M:WebKit.DomNode.RemoveEventListener(System.String,WebKit.IDomEventListener,System.Boolean) -M:WebKit.DomNodeFilter.AcceptNode(WebKit.DomNode) M:WebKit.DomNodeList.GetEnumerator M:WebKit.DomObject.Copy(Foundation.NSZone) M:WebKit.DomStyleSheetList.GetEnumerator @@ -53656,12 +47791,7 @@ M:WebKit.IWKUrlSchemeTask.DidReceiveData(Foundation.NSData) M:WebKit.IWKUrlSchemeTask.DidReceiveResponse(Foundation.NSUrlResponse) M:WebKit.WebArchive.Copy(Foundation.NSZone) M:WebKit.WebArchive.EncodeTo(Foundation.NSCoder) -M:WebKit.WebDocumentRepresentation.FinishedLoading(WebKit.WebDataSource) -M:WebKit.WebDocumentRepresentation.ReceivedData(Foundation.NSData,WebKit.WebDataSource) -M:WebKit.WebDocumentRepresentation.ReceivedError(Foundation.NSError,WebKit.WebDataSource) -M:WebKit.WebDocumentRepresentation.SetDataSource(WebKit.WebDataSource) M:WebKit.WebDownloadDelegate_Extensions.OnDownloadWindowForSheet(WebKit.IWebDownloadDelegate,WebKit.WebDownload) -M:WebKit.WebDownloadDelegate.OnDownloadWindowForSheet(WebKit.WebDownload) M:WebKit.WebFailureToImplementPolicyEventArgs.#ctor(Foundation.NSError,WebKit.WebFrame) M:WebKit.WebFrame.LoadHtmlString(System.String,Foundation.NSUrl) M:WebKit.WebFrameClientRedirectEventArgs.#ctor(Foundation.NSUrl,System.Double,Foundation.NSDate,WebKit.WebFrame) @@ -53684,21 +47814,6 @@ M:WebKit.WebFrameLoadDelegate_Extensions.StartedProvisionalLoad(WebKit.IWebFrame M:WebKit.WebFrameLoadDelegate_Extensions.WillCloseFrame(WebKit.IWebFrameLoadDelegate,WebKit.WebView,WebKit.WebFrame) M:WebKit.WebFrameLoadDelegate_Extensions.WillPerformClientRedirect(WebKit.IWebFrameLoadDelegate,WebKit.WebView,Foundation.NSUrl,System.Double,Foundation.NSDate,WebKit.WebFrame) M:WebKit.WebFrameLoadDelegate_Extensions.WindowScriptObjectAvailable(WebKit.IWebFrameLoadDelegate,WebKit.WebView,WebKit.WebScriptObject) -M:WebKit.WebFrameLoadDelegate.CanceledClientRedirect(WebKit.WebView,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.ChangedLocationWithinPage(WebKit.WebView,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.ClearedWindowObject(WebKit.WebView,WebKit.WebScriptObject,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.CommitedLoad(WebKit.WebView,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.DidCreateJavaScriptContext(WebKit.WebView,JavaScriptCore.JSContext,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.FailedLoadWithError(WebKit.WebView,Foundation.NSError,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.FailedProvisionalLoad(WebKit.WebView,Foundation.NSError,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.FinishedLoad(WebKit.WebView,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.ReceivedIcon(WebKit.WebView,AppKit.NSImage,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.ReceivedServerRedirectForProvisionalLoad(WebKit.WebView,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.ReceivedTitle(WebKit.WebView,System.String,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.StartedProvisionalLoad(WebKit.WebView,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.WillCloseFrame(WebKit.WebView,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.WillPerformClientRedirect(WebKit.WebView,Foundation.NSUrl,System.Double,Foundation.NSDate,WebKit.WebFrame) -M:WebKit.WebFrameLoadDelegate.WindowScriptObjectAvailable(WebKit.WebView,WebKit.WebScriptObject) M:WebKit.WebFrameScriptFrameEventArgs.#ctor(WebKit.WebScriptObject,WebKit.WebFrame) M:WebKit.WebFrameScriptObjectEventArgs.#ctor(WebKit.WebScriptObject) M:WebKit.WebFrameTitleEventArgs.#ctor(System.String,WebKit.WebFrame) @@ -53707,23 +47822,13 @@ M:WebKit.WebHistoryItem.Copy(Foundation.NSZone) M:WebKit.WebMimeTypePolicyEventArgs.#ctor(System.String,Foundation.NSUrlRequest,WebKit.WebFrame,Foundation.NSObject) M:WebKit.WebNavigationPolicyEventArgs.#ctor(Foundation.NSDictionary,Foundation.NSUrlRequest,WebKit.WebFrame,Foundation.NSObject) M:WebKit.WebNewWindowPolicyEventArgs.#ctor(Foundation.NSDictionary,Foundation.NSUrlRequest,System.String,Foundation.NSObject) -M:WebKit.WebOpenPanelResultListener.Cancel -M:WebKit.WebOpenPanelResultListener.ChooseFilename(System.String) -M:WebKit.WebOpenPanelResultListener.ChooseFilenames(System.String[]) -M:WebKit.WebPolicyDecisionListener.Download -M:WebKit.WebPolicyDecisionListener.Ignore -M:WebKit.WebPolicyDecisionListener.Use M:WebKit.WebPolicyDelegate_Extensions.DecidePolicyForMimeType(WebKit.IWebPolicyDelegate,WebKit.WebView,System.String,Foundation.NSUrlRequest,WebKit.WebFrame,Foundation.NSObject) M:WebKit.WebPolicyDelegate_Extensions.DecidePolicyForNavigation(WebKit.IWebPolicyDelegate,WebKit.WebView,Foundation.NSDictionary,Foundation.NSUrlRequest,WebKit.WebFrame,Foundation.NSObject) M:WebKit.WebPolicyDelegate_Extensions.DecidePolicyForNewWindow(WebKit.IWebPolicyDelegate,WebKit.WebView,Foundation.NSDictionary,Foundation.NSUrlRequest,System.String,Foundation.NSObject) M:WebKit.WebPolicyDelegate_Extensions.UnableToImplementPolicy(WebKit.IWebPolicyDelegate,WebKit.WebView,Foundation.NSError,WebKit.WebFrame) M:WebKit.WebPolicyDelegate.DecideDownload(Foundation.NSObject) M:WebKit.WebPolicyDelegate.DecideIgnore(Foundation.NSObject) -M:WebKit.WebPolicyDelegate.DecidePolicyForMimeType(WebKit.WebView,System.String,Foundation.NSUrlRequest,WebKit.WebFrame,Foundation.NSObject) -M:WebKit.WebPolicyDelegate.DecidePolicyForNavigation(WebKit.WebView,Foundation.NSDictionary,Foundation.NSUrlRequest,WebKit.WebFrame,Foundation.NSObject) -M:WebKit.WebPolicyDelegate.DecidePolicyForNewWindow(WebKit.WebView,Foundation.NSDictionary,Foundation.NSUrlRequest,System.String,Foundation.NSObject) M:WebKit.WebPolicyDelegate.DecideUse(Foundation.NSObject) -M:WebKit.WebPolicyDelegate.UnableToImplementPolicy(WebKit.WebView,Foundation.NSError,WebKit.WebFrame) M:WebKit.WebPreferences.EncodeTo(Foundation.NSCoder) M:WebKit.WebResource.Copy(Foundation.NSZone) M:WebKit.WebResource.EncodeTo(Foundation.NSCoder) @@ -53740,15 +47845,6 @@ M:WebKit.WebResourceLoadDelegate_Extensions.OnReceivedAuthenticationChallenge(We M:WebKit.WebResourceLoadDelegate_Extensions.OnReceivedContentLength(WebKit.IWebResourceLoadDelegate,WebKit.WebView,Foundation.NSObject,System.IntPtr,WebKit.WebDataSource) M:WebKit.WebResourceLoadDelegate_Extensions.OnReceivedResponse(WebKit.IWebResourceLoadDelegate,WebKit.WebView,Foundation.NSObject,Foundation.NSUrlResponse,WebKit.WebDataSource) M:WebKit.WebResourceLoadDelegate_Extensions.OnSendRequest(WebKit.IWebResourceLoadDelegate,WebKit.WebView,Foundation.NSObject,Foundation.NSUrlRequest,Foundation.NSUrlResponse,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnCancelledAuthenticationChallenge(WebKit.WebView,Foundation.NSObject,Foundation.NSUrlAuthenticationChallenge,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnFailedLoading(WebKit.WebView,Foundation.NSObject,Foundation.NSError,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnFinishedLoading(WebKit.WebView,Foundation.NSObject,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnIdentifierForInitialRequest(WebKit.WebView,Foundation.NSUrlRequest,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnPlugInFailed(WebKit.WebView,Foundation.NSError,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnReceivedAuthenticationChallenge(WebKit.WebView,Foundation.NSObject,Foundation.NSUrlAuthenticationChallenge,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnReceivedContentLength(WebKit.WebView,Foundation.NSObject,System.IntPtr,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnReceivedResponse(WebKit.WebView,Foundation.NSObject,Foundation.NSUrlResponse,WebKit.WebDataSource) -M:WebKit.WebResourceLoadDelegate.OnSendRequest(WebKit.WebView,Foundation.NSObject,Foundation.NSUrlRequest,Foundation.NSUrlResponse,WebKit.WebDataSource) M:WebKit.WebResourcePluginErrorEventArgs.#ctor(Foundation.NSError,WebKit.WebDataSource) M:WebKit.WebResourceReceivedContentLengthEventArgs.#ctor(Foundation.NSObject,System.IntPtr,WebKit.WebDataSource) M:WebKit.WebResourceReceivedResponseEventArgs.#ctor(Foundation.NSObject,Foundation.NSUrlResponse,WebKit.WebDataSource) @@ -53794,48 +47890,6 @@ M:WebKit.WebUIDelegate_Extensions.UIUnfocus(WebKit.IWebUIDelegate,WebKit.WebView M:WebKit.WebUIDelegate_Extensions.UIValidateUserInterfaceItem(WebKit.IWebUIDelegate,WebKit.WebView,Foundation.NSObject,System.Boolean) M:WebKit.WebUIDelegate_Extensions.UIWillPerformDragDestination(WebKit.IWebUIDelegate,WebKit.WebView,WebKit.WebDragDestinationAction,AppKit.INSDraggingInfo) M:WebKit.WebUIDelegate_Extensions.UIWillPerformDragSource(WebKit.IWebUIDelegate,WebKit.WebView,WebKit.WebDragSourceAction,CoreGraphics.CGPoint,AppKit.NSPasteboard) -M:WebKit.WebUIDelegate.UIAreToolbarsVisible(WebKit.WebView) -M:WebKit.WebUIDelegate.UIClose(WebKit.WebView) -M:WebKit.WebUIDelegate.UICreateModalDialog(WebKit.WebView,Foundation.NSUrlRequest) -M:WebKit.WebUIDelegate.UICreateWebView(WebKit.WebView,Foundation.NSUrlRequest) -M:WebKit.WebUIDelegate.UIDragSourceActionMask(WebKit.WebView,CoreGraphics.CGPoint) -M:WebKit.WebUIDelegate.UIDrawFooterInRect(WebKit.WebView,CoreGraphics.CGRect) -M:WebKit.WebUIDelegate.UIDrawHeaderInRect(WebKit.WebView,CoreGraphics.CGRect) -M:WebKit.WebUIDelegate.UIFocus(WebKit.WebView) -M:WebKit.WebUIDelegate.UIGetContentRect(WebKit.WebView) -M:WebKit.WebUIDelegate.UIGetContextMenuItems(WebKit.WebView,Foundation.NSDictionary,AppKit.NSMenuItem[]) -M:WebKit.WebUIDelegate.UIGetDragDestinationActionMask(WebKit.WebView,AppKit.INSDraggingInfo) -M:WebKit.WebUIDelegate.UIGetFirstResponder(WebKit.WebView) -M:WebKit.WebUIDelegate.UIGetFooterHeight(WebKit.WebView) -M:WebKit.WebUIDelegate.UIGetFrame(WebKit.WebView) -M:WebKit.WebUIDelegate.UIGetHeaderHeight(WebKit.WebView) -M:WebKit.WebUIDelegate.UIGetStatusText(WebKit.WebView) -M:WebKit.WebUIDelegate.UIIsResizable(WebKit.WebView) -M:WebKit.WebUIDelegate.UIIsStatusBarVisible(WebKit.WebView) -M:WebKit.WebUIDelegate.UIMakeFirstResponder(WebKit.WebView,AppKit.NSResponder) -M:WebKit.WebUIDelegate.UIMouseDidMoveOverElement(WebKit.WebView,Foundation.NSDictionary,AppKit.NSEventModifierMask) -M:WebKit.WebUIDelegate.UIPrintFrameView(WebKit.WebView,WebKit.WebFrameView) -M:WebKit.WebUIDelegate.UIRunBeforeUnload(WebKit.WebView,System.String,WebKit.WebFrame) -M:WebKit.WebUIDelegate.UIRunJavaScriptAlertPanel(WebKit.WebView,System.String) -M:WebKit.WebUIDelegate.UIRunJavaScriptAlertPanelMessage(WebKit.WebView,System.String,WebKit.WebFrame) -M:WebKit.WebUIDelegate.UIRunJavaScriptConfirmationPanel(WebKit.WebView,System.String,WebKit.WebFrame) -M:WebKit.WebUIDelegate.UIRunJavaScriptConfirmPanel(WebKit.WebView,System.String) -M:WebKit.WebUIDelegate.UIRunJavaScriptTextInputPanel(WebKit.WebView,System.String,System.String) -M:WebKit.WebUIDelegate.UIRunJavaScriptTextInputPanelWithFrame(WebKit.WebView,System.String,System.String,WebKit.WebFrame) -M:WebKit.WebUIDelegate.UIRunModal(WebKit.WebView) -M:WebKit.WebUIDelegate.UIRunOpenPanelForFileButton(WebKit.WebView,WebKit.IWebOpenPanelResultListener) -M:WebKit.WebUIDelegate.UISetContentRect(WebKit.WebView,CoreGraphics.CGRect) -M:WebKit.WebUIDelegate.UISetFrame(WebKit.WebView,CoreGraphics.CGRect) -M:WebKit.WebUIDelegate.UISetResizable(WebKit.WebView,System.Boolean) -M:WebKit.WebUIDelegate.UISetStatusBarVisible(WebKit.WebView,System.Boolean) -M:WebKit.WebUIDelegate.UISetStatusText(WebKit.WebView,System.String) -M:WebKit.WebUIDelegate.UISetToolbarsVisible(WebKit.WebView,System.Boolean) -M:WebKit.WebUIDelegate.UIShouldPerformAction(WebKit.WebView,ObjCRuntime.Selector,Foundation.NSObject) -M:WebKit.WebUIDelegate.UIShow(WebKit.WebView) -M:WebKit.WebUIDelegate.UIUnfocus(WebKit.WebView) -M:WebKit.WebUIDelegate.UIValidateUserInterfaceItem(WebKit.WebView,Foundation.NSObject,System.Boolean) -M:WebKit.WebUIDelegate.UIWillPerformDragDestination(WebKit.WebView,WebKit.WebDragDestinationAction,AppKit.INSDraggingInfo) -M:WebKit.WebUIDelegate.UIWillPerformDragSource(WebKit.WebView,WebKit.WebDragSourceAction,CoreGraphics.CGPoint,AppKit.NSPasteboard) M:WebKit.WebView.#ctor(CoreGraphics.CGRect) M:WebKit.WebView.add_CanceledClientRedirect(System.EventHandler{WebKit.WebFrameEventArgs}) M:WebKit.WebView.add_ChangedLocationWithinPage(System.EventHandler{WebKit.WebFrameEventArgs}) @@ -53962,11 +48016,6 @@ M:WebKit.WKDownloadDelegate_Extensions.DidFail(WebKit.IWKDownloadDelegate,WebKit M:WebKit.WKDownloadDelegate_Extensions.DidFinish(WebKit.IWKDownloadDelegate,WebKit.WKDownload) M:WebKit.WKDownloadDelegate_Extensions.DidReceiveAuthenticationChallenge(WebKit.IWKDownloadDelegate,WebKit.WKDownload,Foundation.NSUrlAuthenticationChallenge,System.Action{Foundation.NSUrlSessionAuthChallengeDisposition,Foundation.NSUrlCredential}) M:WebKit.WKDownloadDelegate_Extensions.WillPerformHttpRedirection(WebKit.IWKDownloadDelegate,WebKit.WKDownload,Foundation.NSHttpUrlResponse,Foundation.NSUrlRequest,System.Action{WebKit.WKDownloadRedirectPolicy}) -M:WebKit.WKDownloadDelegate.DecideDestination(WebKit.WKDownload,Foundation.NSUrlResponse,System.String,System.Action{Foundation.NSUrl}) -M:WebKit.WKDownloadDelegate.DidFail(WebKit.WKDownload,Foundation.NSError,Foundation.NSData) -M:WebKit.WKDownloadDelegate.DidFinish(WebKit.WKDownload) -M:WebKit.WKDownloadDelegate.DidReceiveAuthenticationChallenge(WebKit.WKDownload,Foundation.NSUrlAuthenticationChallenge,System.Action{Foundation.NSUrlSessionAuthChallengeDisposition,Foundation.NSUrlCredential}) -M:WebKit.WKDownloadDelegate.WillPerformHttpRedirection(WebKit.WKDownload,Foundation.NSHttpUrlResponse,Foundation.NSUrlRequest,System.Action{WebKit.WKDownloadRedirectPolicy}) M:WebKit.WKFindConfiguration.Copy(Foundation.NSZone) M:WebKit.WKFindResult.Copy(Foundation.NSZone) M:WebKit.WKFrameInfo.Copy(Foundation.NSZone) @@ -53991,26 +48040,11 @@ M:WebKit.WKNavigationDelegate_Extensions.DidStartProvisionalNavigation(WebKit.IW M:WebKit.WKNavigationDelegate_Extensions.NavigationActionDidBecomeDownload(WebKit.IWKNavigationDelegate,WebKit.WKWebView,WebKit.WKNavigationAction,WebKit.WKDownload) M:WebKit.WKNavigationDelegate_Extensions.NavigationResponseDidBecomeDownload(WebKit.IWKNavigationDelegate,WebKit.WKWebView,WebKit.WKNavigationResponse,WebKit.WKDownload) M:WebKit.WKNavigationDelegate_Extensions.ShouldAllowDeprecatedTls(WebKit.IWKNavigationDelegate,WebKit.WKWebView,Foundation.NSUrlAuthenticationChallenge,System.Action{System.Boolean}) -M:WebKit.WKNavigationDelegate.ContentProcessDidTerminate(WebKit.WKWebView) -M:WebKit.WKNavigationDelegate.DecidePolicy(WebKit.WKWebView,WebKit.WKNavigationAction,System.Action{WebKit.WKNavigationActionPolicy}) -M:WebKit.WKNavigationDelegate.DecidePolicy(WebKit.WKWebView,WebKit.WKNavigationAction,WebKit.WKWebpagePreferences,System.Action{WebKit.WKNavigationActionPolicy,WebKit.WKWebpagePreferences}) -M:WebKit.WKNavigationDelegate.DecidePolicy(WebKit.WKWebView,WebKit.WKNavigationResponse,System.Action{WebKit.WKNavigationResponsePolicy}) -M:WebKit.WKNavigationDelegate.DidCommitNavigation(WebKit.WKWebView,WebKit.WKNavigation) -M:WebKit.WKNavigationDelegate.DidFailNavigation(WebKit.WKWebView,WebKit.WKNavigation,Foundation.NSError) -M:WebKit.WKNavigationDelegate.DidFailProvisionalNavigation(WebKit.WKWebView,WebKit.WKNavigation,Foundation.NSError) -M:WebKit.WKNavigationDelegate.DidFinishNavigation(WebKit.WKWebView,WebKit.WKNavigation) -M:WebKit.WKNavigationDelegate.DidReceiveAuthenticationChallenge(WebKit.WKWebView,Foundation.NSUrlAuthenticationChallenge,System.Action{Foundation.NSUrlSessionAuthChallengeDisposition,Foundation.NSUrlCredential}) -M:WebKit.WKNavigationDelegate.DidReceiveServerRedirectForProvisionalNavigation(WebKit.WKWebView,WebKit.WKNavigation) -M:WebKit.WKNavigationDelegate.DidStartProvisionalNavigation(WebKit.WKWebView,WebKit.WKNavigation) -M:WebKit.WKNavigationDelegate.NavigationActionDidBecomeDownload(WebKit.WKWebView,WebKit.WKNavigationAction,WebKit.WKDownload) -M:WebKit.WKNavigationDelegate.NavigationResponseDidBecomeDownload(WebKit.WKWebView,WebKit.WKNavigationResponse,WebKit.WKDownload) -M:WebKit.WKNavigationDelegate.ShouldAllowDeprecatedTls(WebKit.WKWebView,Foundation.NSUrlAuthenticationChallenge,System.Action{System.Boolean}) M:WebKit.WKPdfConfiguration.Copy(Foundation.NSZone) M:WebKit.WKPreferences.EncodeTo(Foundation.NSCoder) M:WebKit.WKPreviewElementInfo.Copy(Foundation.NSZone) M:WebKit.WKProcessPool.EncodeTo(Foundation.NSCoder) M:WebKit.WKScriptMessage.Dispose(System.Boolean) -M:WebKit.WKScriptMessageHandler.DidReceiveScriptMessage(WebKit.WKUserContentController,WebKit.WKScriptMessage) M:WebKit.WKSnapshotConfiguration.Copy(Foundation.NSZone) M:WebKit.WKUIDelegate_Extensions.CommitPreviewingViewController(WebKit.IWKUIDelegate,WebKit.WKWebView,UIKit.UIViewController) M:WebKit.WKUIDelegate_Extensions.ContextMenuDidEnd(WebKit.IWKUIDelegate,WebKit.WKWebView,WebKit.WKContextMenuElementInfo) @@ -54033,24 +48067,6 @@ M:WebKit.WKUIDelegate_Extensions.ShowLockDownModeAsync(WebKit.IWKUIDelegate,WebK M:WebKit.WKUIDelegate_Extensions.WillCommitContextMenu(WebKit.IWKUIDelegate,WebKit.WKWebView,WebKit.WKContextMenuElementInfo,UIKit.IUIContextMenuInteractionCommitAnimating) M:WebKit.WKUIDelegate_Extensions.WillDismissEditMenu(WebKit.IWKUIDelegate,WebKit.WKWebView,UIKit.IUIEditMenuInteractionAnimating) M:WebKit.WKUIDelegate_Extensions.WillPresentEditMenu(WebKit.IWKUIDelegate,WebKit.WKWebView,UIKit.IUIEditMenuInteractionAnimating) -M:WebKit.WKUIDelegate.CommitPreviewingViewController(WebKit.WKWebView,UIKit.UIViewController) -M:WebKit.WKUIDelegate.ContextMenuDidEnd(WebKit.WKWebView,WebKit.WKContextMenuElementInfo) -M:WebKit.WKUIDelegate.ContextMenuWillPresent(WebKit.WKWebView,WebKit.WKContextMenuElementInfo) -M:WebKit.WKUIDelegate.CreateWebView(WebKit.WKWebView,WebKit.WKWebViewConfiguration,WebKit.WKNavigationAction,WebKit.WKWindowFeatures) -M:WebKit.WKUIDelegate.DidClose(WebKit.WKWebView) -M:WebKit.WKUIDelegate.GetPreviewingViewController(WebKit.WKWebView,WebKit.WKPreviewElementInfo,WebKit.IWKPreviewActionItem[]) -M:WebKit.WKUIDelegate.RequestDeviceOrientationAndMotionPermission(WebKit.WKWebView,WebKit.WKSecurityOrigin,WebKit.WKFrameInfo,System.Action{WebKit.WKPermissionDecision}) -M:WebKit.WKUIDelegate.RequestMediaCapturePermission(WebKit.WKWebView,WebKit.WKSecurityOrigin,WebKit.WKFrameInfo,WebKit.WKMediaCaptureType,System.Action{WebKit.WKPermissionDecision}) -M:WebKit.WKUIDelegate.RunJavaScriptAlertPanel(WebKit.WKWebView,System.String,WebKit.WKFrameInfo,System.Action) -M:WebKit.WKUIDelegate.RunJavaScriptConfirmPanel(WebKit.WKWebView,System.String,WebKit.WKFrameInfo,System.Action{System.Boolean}) -M:WebKit.WKUIDelegate.RunJavaScriptTextInputPanel(WebKit.WKWebView,System.String,System.String,WebKit.WKFrameInfo,System.Action{System.String}) -M:WebKit.WKUIDelegate.RunOpenPanel(WebKit.WKWebView,WebKit.WKOpenPanelParameters,WebKit.WKFrameInfo,System.Action{Foundation.NSUrl[]}) -M:WebKit.WKUIDelegate.SetContextMenuConfiguration(WebKit.WKWebView,WebKit.WKContextMenuElementInfo,System.Action{UIKit.UIContextMenuConfiguration}) -M:WebKit.WKUIDelegate.ShouldPreviewElement(WebKit.WKWebView,WebKit.WKPreviewElementInfo) -M:WebKit.WKUIDelegate.ShowLockDownMode(WebKit.WKWebView,System.String,System.Action{WebKit.WKDialogResult}) -M:WebKit.WKUIDelegate.WillCommitContextMenu(WebKit.WKWebView,WebKit.WKContextMenuElementInfo,UIKit.IUIContextMenuInteractionCommitAnimating) -M:WebKit.WKUIDelegate.WillDismissEditMenu(WebKit.WKWebView,UIKit.IUIEditMenuInteractionAnimating) -M:WebKit.WKUIDelegate.WillPresentEditMenu(WebKit.WKWebView,UIKit.IUIEditMenuInteractionAnimating) M:WebKit.WKUserContentController.EncodeTo(Foundation.NSCoder) M:WebKit.WKUserScript.Copy(Foundation.NSZone) M:WebKit.WKWebsiteDataStore.EncodeTo(Foundation.NSCoder) @@ -54087,48 +48103,10 @@ P:Accelerate.vImageBuffer.Height P:Accelerate.vImageBuffer.Width P:Accessibility.AXAnimatedImagesUtilities.AnimatedImagesEnabledDidChangeNotification P:Accessibility.AXAnimatedImagesUtilities.Enabled -P:Accessibility.AXBrailleMap.Dimensions -P:Accessibility.AXCategoricalDataAxisDescriptor.AttributedTitle -P:Accessibility.AXCategoricalDataAxisDescriptor.CategoryOrder -P:Accessibility.AXCategoricalDataAxisDescriptor.Title -P:Accessibility.AXChartDescriptor.AdditionalAxes -P:Accessibility.AXChartDescriptor.AttributedTitle -P:Accessibility.AXChartDescriptor.ContentDirection -P:Accessibility.AXChartDescriptor.ContentFrame -P:Accessibility.AXChartDescriptor.Series -P:Accessibility.AXChartDescriptor.Summary -P:Accessibility.AXChartDescriptor.Title -P:Accessibility.AXChartDescriptor.XAxis -P:Accessibility.AXChartDescriptor.YAxis -P:Accessibility.AXCustomContent.AttributedLabel -P:Accessibility.AXCustomContent.AttributedValue -P:Accessibility.AXCustomContent.Importance -P:Accessibility.AXCustomContent.Label -P:Accessibility.AXCustomContent.Value -P:Accessibility.AXDataPoint.AdditionalValues -P:Accessibility.AXDataPoint.AttributedLabel -P:Accessibility.AXDataPoint.Label -P:Accessibility.AXDataPoint.XValue -P:Accessibility.AXDataPoint.YValue -P:Accessibility.AXDataPointValue.Category -P:Accessibility.AXDataPointValue.Number -P:Accessibility.AXDataSeriesDescriptor.AttributedName -P:Accessibility.AXDataSeriesDescriptor.DataPoints -P:Accessibility.AXDataSeriesDescriptor.IsContinuous -P:Accessibility.AXDataSeriesDescriptor.Name P:Accessibility.AXHearingUtilities.PairedUUIDsDidChangeNotification P:Accessibility.AXHearingUtilities.StreamingEarDidChangeNotification -P:Accessibility.AXNumericDataAxisDescriptor.AttributedTitle -P:Accessibility.AXNumericDataAxisDescriptor.GridlinePositions -P:Accessibility.AXNumericDataAxisDescriptor.LowerBound -P:Accessibility.AXNumericDataAxisDescriptor.ScaleType -P:Accessibility.AXNumericDataAxisDescriptor.Title -P:Accessibility.AXNumericDataAxisDescriptor.UpperBound -P:Accessibility.AXNumericDataAxisDescriptor.ValueDescriptionProvider P:Accessibility.AXPrefers.HorizontalTextLayoutDidChangeNotification P:Accessibility.AXPrefers.NonBlinkingTextInsertionIndicatorDidChangeNotification -P:Accessibility.AXRequest.Current -P:Accessibility.AXRequest.Technology P:Accessibility.IAXBrailleMapRenderer.AccessibilityBrailleMapRenderer P:Accessibility.IAXBrailleMapRenderer.AccessibilityBrailleMapRenderRegion P:Accessibility.IAXChart.AccessibilityChartDescriptor @@ -54136,50 +48114,8 @@ P:Accessibility.IAXCustomContentProvider.AccessibilityCustomContent P:Accessibility.IAXCustomContentProvider.AccessibilityCustomContentHandler P:Accessibility.IAXDataAxisDescriptor.AttributedTitle P:Accessibility.IAXDataAxisDescriptor.Title -P:AccessorySetupKit.ASAccessory.BluetoothIdentifier -P:AccessorySetupKit.ASAccessory.BluetoothTransportBridgingIdentifier -P:AccessorySetupKit.ASAccessory.Descriptor -P:AccessorySetupKit.ASAccessory.DisplayName -P:AccessorySetupKit.ASAccessory.Ssid -P:AccessorySetupKit.ASAccessory.State -P:AccessorySetupKit.ASAccessoryEvent.Accessory -P:AccessorySetupKit.ASAccessoryEvent.Error -P:AccessorySetupKit.ASAccessoryEvent.EventType -P:AccessorySetupKit.ASAccessorySession.Accessories -P:AccessorySetupKit.ASAccessorySettings.BluetoothTransportBridgingIdentifier -P:AccessorySetupKit.ASAccessorySettings.DefaultSettings -P:AccessorySetupKit.ASAccessorySettings.Ssid -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothCompanyIdentifier -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothManufacturerDataBlob -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothManufacturerDataMask -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothNameSubstring -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothRange -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothServiceDataBlob -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothServiceDataMask -P:AccessorySetupKit.ASDiscoveryDescriptor.BluetoothServiceUuid -P:AccessorySetupKit.ASDiscoveryDescriptor.Ssid -P:AccessorySetupKit.ASDiscoveryDescriptor.SsidPrefix -P:AccessorySetupKit.ASDiscoveryDescriptor.SupportedOptions -P:AccessorySetupKit.ASMigrationDisplayItem.HotspotSsid -P:AccessorySetupKit.ASMigrationDisplayItem.PeripheralIdentifier -P:AccessorySetupKit.ASPickerDisplayItem.Descriptor -P:AccessorySetupKit.ASPickerDisplayItem.Name -P:AccessorySetupKit.ASPickerDisplayItem.ProductImage -P:AccessorySetupKit.ASPickerDisplayItem.RenameOptions -P:AccessorySetupKit.ASPickerDisplayItem.SetupOptions -P:Accounts.ACAccount.AccountDescription -P:Accounts.ACAccount.AccountType -P:Accounts.ACAccount.Credential -P:Accounts.ACAccount.Identifier -P:Accounts.ACAccount.UserFullName -P:Accounts.ACAccount.Username -P:Accounts.ACAccountCredential.OAuthToken -P:Accounts.ACAccountStore.Accounts P:Accounts.ACAccountStore.ChangeNotification -P:Accounts.ACAccountType.AccessGranted -P:Accounts.ACAccountType.Description P:Accounts.ACAccountType.Facebook -P:Accounts.ACAccountType.Identifier P:Accounts.ACAccountType.LinkedIn P:Accounts.ACAccountType.SinaWeibo P:Accounts.ACAccountType.TencentWeibo @@ -54356,9 +48292,7 @@ P:AddressBookUI.ABUnknownPersonViewController.DisplayedPerson P:AddressBookUI.ABUnknownPersonViewController.Message P:AddressBookUI.ABUnknownPersonViewController.WeakDelegate P:AddressBookUI.DisplayedPropertiesCollection.Count -P:AdSupport.ASIdentifierManager.AdvertisingIdentifier P:AdSupport.ASIdentifierManager.IsAdvertisingTrackingEnabled -P:AdSupport.ASIdentifierManager.SharedManager P:AppClip.APActivationPayload.Url P:AppKit.INSAccessibility.AccessibilityActivationPoint P:AppKit.INSAccessibility.AccessibilityAllowedValues @@ -54784,126 +48718,20 @@ P:AppKit.NSAccessibilityAttributes.WarningValueAttribute P:AppKit.NSAccessibilityAttributes.WindowAttribute P:AppKit.NSAccessibilityAttributes.WindowsAttribute P:AppKit.NSAccessibilityAttributes.ZoomButtonAttribute -P:AppKit.NSAccessibilityElement.AccessibilityActivationPoint -P:AppKit.NSAccessibilityElement.AccessibilityAllowedValues -P:AppKit.NSAccessibilityElement.AccessibilityAlternateUIVisible -P:AppKit.NSAccessibilityElement.AccessibilityApplicationFocusedUIElement -P:AppKit.NSAccessibilityElement.AccessibilityAttributedUserInputLabels -P:AppKit.NSAccessibilityElement.AccessibilityCancelButton -P:AppKit.NSAccessibilityElement.AccessibilityChildren -P:AppKit.NSAccessibilityElement.AccessibilityChildrenInNavigationOrder -P:AppKit.NSAccessibilityElement.AccessibilityClearButton -P:AppKit.NSAccessibilityElement.AccessibilityCloseButton -P:AppKit.NSAccessibilityElement.AccessibilityColumnCount -P:AppKit.NSAccessibilityElement.AccessibilityColumnHeaderUIElements -P:AppKit.NSAccessibilityElement.AccessibilityColumnIndexRange -P:AppKit.NSAccessibilityElement.AccessibilityColumns -P:AppKit.NSAccessibilityElement.AccessibilityColumnTitles -P:AppKit.NSAccessibilityElement.AccessibilityContents -P:AppKit.NSAccessibilityElement.AccessibilityCriticalValue -P:AppKit.NSAccessibilityElement.AccessibilityCustomActions -P:AppKit.NSAccessibilityElement.AccessibilityCustomRotors -P:AppKit.NSAccessibilityElement.AccessibilityDecrementButton -P:AppKit.NSAccessibilityElement.AccessibilityDefaultButton P:AppKit.NSAccessibilityElement.AccessibilityDisclosed -P:AppKit.NSAccessibilityElement.AccessibilityDisclosedByRow -P:AppKit.NSAccessibilityElement.AccessibilityDisclosedRows -P:AppKit.NSAccessibilityElement.AccessibilityDisclosureLevel -P:AppKit.NSAccessibilityElement.AccessibilityDocument P:AppKit.NSAccessibilityElement.AccessibilityEdited P:AppKit.NSAccessibilityElement.AccessibilityElement P:AppKit.NSAccessibilityElement.AccessibilityEnabled P:AppKit.NSAccessibilityElement.AccessibilityExpanded -P:AppKit.NSAccessibilityElement.AccessibilityExtrasMenuBar -P:AppKit.NSAccessibilityElement.AccessibilityFilename -P:AppKit.NSAccessibilityElement.AccessibilityFocusedWindow P:AppKit.NSAccessibilityElement.AccessibilityFrontmost -P:AppKit.NSAccessibilityElement.AccessibilityFullScreenButton -P:AppKit.NSAccessibilityElement.AccessibilityGrowArea -P:AppKit.NSAccessibilityElement.AccessibilityHandles -P:AppKit.NSAccessibilityElement.AccessibilityHeader -P:AppKit.NSAccessibilityElement.AccessibilityHelp P:AppKit.NSAccessibilityElement.AccessibilityHidden -P:AppKit.NSAccessibilityElement.AccessibilityHorizontalScrollBar -P:AppKit.NSAccessibilityElement.AccessibilityHorizontalUnitDescription -P:AppKit.NSAccessibilityElement.AccessibilityHorizontalUnits -P:AppKit.NSAccessibilityElement.AccessibilityIncrementButton -P:AppKit.NSAccessibilityElement.AccessibilityIndex -P:AppKit.NSAccessibilityElement.AccessibilityInsertionPointLineNumber -P:AppKit.NSAccessibilityElement.AccessibilityLabel -P:AppKit.NSAccessibilityElement.AccessibilityLabelUIElements -P:AppKit.NSAccessibilityElement.AccessibilityLabelValue -P:AppKit.NSAccessibilityElement.AccessibilityLinkedUIElements P:AppKit.NSAccessibilityElement.AccessibilityMain -P:AppKit.NSAccessibilityElement.AccessibilityMainWindow -P:AppKit.NSAccessibilityElement.AccessibilityMarkerGroupUIElement -P:AppKit.NSAccessibilityElement.AccessibilityMarkerTypeDescription -P:AppKit.NSAccessibilityElement.AccessibilityMarkerUIElements -P:AppKit.NSAccessibilityElement.AccessibilityMarkerValues -P:AppKit.NSAccessibilityElement.AccessibilityMaxValue -P:AppKit.NSAccessibilityElement.AccessibilityMenuBar -P:AppKit.NSAccessibilityElement.AccessibilityMinimizeButton P:AppKit.NSAccessibilityElement.AccessibilityMinimized -P:AppKit.NSAccessibilityElement.AccessibilityMinValue P:AppKit.NSAccessibilityElement.AccessibilityModal -P:AppKit.NSAccessibilityElement.AccessibilityNextContents -P:AppKit.NSAccessibilityElement.AccessibilityNumberOfCharacters P:AppKit.NSAccessibilityElement.AccessibilityOrderedByRow -P:AppKit.NSAccessibilityElement.AccessibilityOrientation -P:AppKit.NSAccessibilityElement.AccessibilityOverflowButton -P:AppKit.NSAccessibilityElement.AccessibilityPlaceholderValue -P:AppKit.NSAccessibilityElement.AccessibilityPreviousContents P:AppKit.NSAccessibilityElement.AccessibilityProtectedContent -P:AppKit.NSAccessibilityElement.AccessibilityProxy P:AppKit.NSAccessibilityElement.AccessibilityRequired -P:AppKit.NSAccessibilityElement.AccessibilityRole -P:AppKit.NSAccessibilityElement.AccessibilityRoleDescription -P:AppKit.NSAccessibilityElement.AccessibilityRowCount -P:AppKit.NSAccessibilityElement.AccessibilityRowHeaderUIElements -P:AppKit.NSAccessibilityElement.AccessibilityRowIndexRange -P:AppKit.NSAccessibilityElement.AccessibilityRows -P:AppKit.NSAccessibilityElement.AccessibilityRulerMarkerType -P:AppKit.NSAccessibilityElement.AccessibilitySearchButton -P:AppKit.NSAccessibilityElement.AccessibilitySearchMenu P:AppKit.NSAccessibilityElement.AccessibilitySelected -P:AppKit.NSAccessibilityElement.AccessibilitySelectedCells -P:AppKit.NSAccessibilityElement.AccessibilitySelectedChildren -P:AppKit.NSAccessibilityElement.AccessibilitySelectedColumns -P:AppKit.NSAccessibilityElement.AccessibilitySelectedRows -P:AppKit.NSAccessibilityElement.AccessibilitySelectedText -P:AppKit.NSAccessibilityElement.AccessibilitySelectedTextRange -P:AppKit.NSAccessibilityElement.AccessibilitySelectedTextRanges -P:AppKit.NSAccessibilityElement.AccessibilityServesAsTitleForUIElements -P:AppKit.NSAccessibilityElement.AccessibilitySharedCharacterRange -P:AppKit.NSAccessibilityElement.AccessibilitySharedFocusElements -P:AppKit.NSAccessibilityElement.AccessibilitySharedTextUIElements -P:AppKit.NSAccessibilityElement.AccessibilityShownMenu -P:AppKit.NSAccessibilityElement.AccessibilitySortDirection -P:AppKit.NSAccessibilityElement.AccessibilitySplitters -P:AppKit.NSAccessibilityElement.AccessibilitySubrole -P:AppKit.NSAccessibilityElement.AccessibilityTabs -P:AppKit.NSAccessibilityElement.AccessibilityTitle -P:AppKit.NSAccessibilityElement.AccessibilityTitleUIElement -P:AppKit.NSAccessibilityElement.AccessibilityToolbarButton -P:AppKit.NSAccessibilityElement.AccessibilityTopLevelUIElement -P:AppKit.NSAccessibilityElement.AccessibilityUnitDescription -P:AppKit.NSAccessibilityElement.AccessibilityUnits -P:AppKit.NSAccessibilityElement.AccessibilityUrl -P:AppKit.NSAccessibilityElement.AccessibilityUserInputLabels -P:AppKit.NSAccessibilityElement.AccessibilityValue -P:AppKit.NSAccessibilityElement.AccessibilityValueDescription -P:AppKit.NSAccessibilityElement.AccessibilityVerticalScrollBar -P:AppKit.NSAccessibilityElement.AccessibilityVerticalUnitDescription -P:AppKit.NSAccessibilityElement.AccessibilityVerticalUnits -P:AppKit.NSAccessibilityElement.AccessibilityVisibleCells -P:AppKit.NSAccessibilityElement.AccessibilityVisibleCharacterRange -P:AppKit.NSAccessibilityElement.AccessibilityVisibleChildren -P:AppKit.NSAccessibilityElement.AccessibilityVisibleColumns -P:AppKit.NSAccessibilityElement.AccessibilityVisibleRows -P:AppKit.NSAccessibilityElement.AccessibilityWarningValue -P:AppKit.NSAccessibilityElement.AccessibilityWindow -P:AppKit.NSAccessibilityElement.AccessibilityWindows -P:AppKit.NSAccessibilityElement.AccessibilityZoomButton P:AppKit.NSAccessibilityElement.AnnouncementRequestedNotification P:AppKit.NSAccessibilityElement.ApplicationActivatedNotification P:AppKit.NSAccessibilityElement.ApplicationDeactivatedNotification @@ -55033,7 +48861,6 @@ P:AppKit.NSAccessibilitySubroles.UnknownSubrole P:AppKit.NSAccessibilitySubroles.ZoomButtonSubrole P:AppKit.NSAdaptiveImageGlyph.ContentDescription P:AppKit.NSAdaptiveImageGlyph.ContentIdentifier -P:AppKit.NSAdaptiveImageGlyph.ContentType P:AppKit.NSAdaptiveImageGlyph.ImageContent P:AppKit.NSAlert.Delegate P:AppKit.NSAlert.ShowHelp @@ -55055,132 +48882,20 @@ P:AppKit.NSAppearance.NameDarkAqua P:AppKit.NSAppearance.NameLightContent P:AppKit.NSAppearance.NameVibrantDark P:AppKit.NSAppearance.NameVibrantLight -P:AppKit.NSAppearanceCustomization.Appearance -P:AppKit.NSAppearanceCustomization.EffectiveAppearance -P:AppKit.NSApplication.AccessibilityActivationPoint -P:AppKit.NSApplication.AccessibilityAllowedValues -P:AppKit.NSApplication.AccessibilityAlternateUIVisible -P:AppKit.NSApplication.AccessibilityApplicationFocusedUIElement -P:AppKit.NSApplication.AccessibilityAttributedUserInputLabels -P:AppKit.NSApplication.AccessibilityCancelButton -P:AppKit.NSApplication.AccessibilityChildren -P:AppKit.NSApplication.AccessibilityChildrenInNavigationOrder -P:AppKit.NSApplication.AccessibilityClearButton -P:AppKit.NSApplication.AccessibilityCloseButton -P:AppKit.NSApplication.AccessibilityColumnCount -P:AppKit.NSApplication.AccessibilityColumnHeaderUIElements -P:AppKit.NSApplication.AccessibilityColumnIndexRange -P:AppKit.NSApplication.AccessibilityColumns -P:AppKit.NSApplication.AccessibilityColumnTitles -P:AppKit.NSApplication.AccessibilityContents -P:AppKit.NSApplication.AccessibilityCriticalValue -P:AppKit.NSApplication.AccessibilityCustomActions -P:AppKit.NSApplication.AccessibilityCustomRotors -P:AppKit.NSApplication.AccessibilityDecrementButton -P:AppKit.NSApplication.AccessibilityDefaultButton P:AppKit.NSApplication.AccessibilityDisclosed -P:AppKit.NSApplication.AccessibilityDisclosedByRow -P:AppKit.NSApplication.AccessibilityDisclosedRows -P:AppKit.NSApplication.AccessibilityDisclosureLevel -P:AppKit.NSApplication.AccessibilityDocument P:AppKit.NSApplication.AccessibilityEdited P:AppKit.NSApplication.AccessibilityElement P:AppKit.NSApplication.AccessibilityEnabled P:AppKit.NSApplication.AccessibilityExpanded -P:AppKit.NSApplication.AccessibilityExtrasMenuBar -P:AppKit.NSApplication.AccessibilityFilename -P:AppKit.NSApplication.AccessibilityFocused -P:AppKit.NSApplication.AccessibilityFocusedWindow -P:AppKit.NSApplication.AccessibilityFrame P:AppKit.NSApplication.AccessibilityFrontmost -P:AppKit.NSApplication.AccessibilityFullScreenButton -P:AppKit.NSApplication.AccessibilityGrowArea -P:AppKit.NSApplication.AccessibilityHandles -P:AppKit.NSApplication.AccessibilityHeader -P:AppKit.NSApplication.AccessibilityHelp P:AppKit.NSApplication.AccessibilityHidden -P:AppKit.NSApplication.AccessibilityHorizontalScrollBar -P:AppKit.NSApplication.AccessibilityHorizontalUnitDescription -P:AppKit.NSApplication.AccessibilityHorizontalUnits -P:AppKit.NSApplication.AccessibilityIdentifier -P:AppKit.NSApplication.AccessibilityIncrementButton -P:AppKit.NSApplication.AccessibilityIndex -P:AppKit.NSApplication.AccessibilityInsertionPointLineNumber -P:AppKit.NSApplication.AccessibilityLabel -P:AppKit.NSApplication.AccessibilityLabelUIElements -P:AppKit.NSApplication.AccessibilityLabelValue -P:AppKit.NSApplication.AccessibilityLinkedUIElements P:AppKit.NSApplication.AccessibilityMain -P:AppKit.NSApplication.AccessibilityMainWindow -P:AppKit.NSApplication.AccessibilityMarkerGroupUIElement -P:AppKit.NSApplication.AccessibilityMarkerTypeDescription -P:AppKit.NSApplication.AccessibilityMarkerUIElements -P:AppKit.NSApplication.AccessibilityMarkerValues -P:AppKit.NSApplication.AccessibilityMaxValue -P:AppKit.NSApplication.AccessibilityMenuBar -P:AppKit.NSApplication.AccessibilityMinimizeButton P:AppKit.NSApplication.AccessibilityMinimized -P:AppKit.NSApplication.AccessibilityMinValue P:AppKit.NSApplication.AccessibilityModal -P:AppKit.NSApplication.AccessibilityNextContents -P:AppKit.NSApplication.AccessibilityNumberOfCharacters P:AppKit.NSApplication.AccessibilityOrderedByRow -P:AppKit.NSApplication.AccessibilityOrientation -P:AppKit.NSApplication.AccessibilityOverflowButton -P:AppKit.NSApplication.AccessibilityParent -P:AppKit.NSApplication.AccessibilityPlaceholderValue -P:AppKit.NSApplication.AccessibilityPreviousContents P:AppKit.NSApplication.AccessibilityProtectedContent -P:AppKit.NSApplication.AccessibilityProxy P:AppKit.NSApplication.AccessibilityRequired -P:AppKit.NSApplication.AccessibilityRole -P:AppKit.NSApplication.AccessibilityRoleDescription -P:AppKit.NSApplication.AccessibilityRowCount -P:AppKit.NSApplication.AccessibilityRowHeaderUIElements -P:AppKit.NSApplication.AccessibilityRowIndexRange -P:AppKit.NSApplication.AccessibilityRows -P:AppKit.NSApplication.AccessibilityRulerMarkerType -P:AppKit.NSApplication.AccessibilitySearchButton -P:AppKit.NSApplication.AccessibilitySearchMenu P:AppKit.NSApplication.AccessibilitySelected -P:AppKit.NSApplication.AccessibilitySelectedCells -P:AppKit.NSApplication.AccessibilitySelectedChildren -P:AppKit.NSApplication.AccessibilitySelectedColumns -P:AppKit.NSApplication.AccessibilitySelectedRows -P:AppKit.NSApplication.AccessibilitySelectedText -P:AppKit.NSApplication.AccessibilitySelectedTextRange -P:AppKit.NSApplication.AccessibilitySelectedTextRanges -P:AppKit.NSApplication.AccessibilityServesAsTitleForUIElements -P:AppKit.NSApplication.AccessibilitySharedCharacterRange -P:AppKit.NSApplication.AccessibilitySharedFocusElements -P:AppKit.NSApplication.AccessibilitySharedTextUIElements -P:AppKit.NSApplication.AccessibilityShownMenu -P:AppKit.NSApplication.AccessibilitySortDirection -P:AppKit.NSApplication.AccessibilitySplitters -P:AppKit.NSApplication.AccessibilitySubrole -P:AppKit.NSApplication.AccessibilityTabs -P:AppKit.NSApplication.AccessibilityTitle -P:AppKit.NSApplication.AccessibilityTitleUIElement -P:AppKit.NSApplication.AccessibilityToolbarButton -P:AppKit.NSApplication.AccessibilityTopLevelUIElement -P:AppKit.NSApplication.AccessibilityUnitDescription -P:AppKit.NSApplication.AccessibilityUnits -P:AppKit.NSApplication.AccessibilityUrl -P:AppKit.NSApplication.AccessibilityUserInputLabels -P:AppKit.NSApplication.AccessibilityValue -P:AppKit.NSApplication.AccessibilityValueDescription -P:AppKit.NSApplication.AccessibilityVerticalScrollBar -P:AppKit.NSApplication.AccessibilityVerticalUnitDescription -P:AppKit.NSApplication.AccessibilityVerticalUnits -P:AppKit.NSApplication.AccessibilityVisibleCells -P:AppKit.NSApplication.AccessibilityVisibleCharacterRange -P:AppKit.NSApplication.AccessibilityVisibleChildren -P:AppKit.NSApplication.AccessibilityVisibleColumns -P:AppKit.NSApplication.AccessibilityVisibleRows -P:AppKit.NSApplication.AccessibilityWarningValue -P:AppKit.NSApplication.AccessibilityWindow -P:AppKit.NSApplication.AccessibilityWindows -P:AppKit.NSApplication.AccessibilityZoomButton P:AppKit.NSApplication.ActivationPolicy P:AppKit.NSApplication.Active P:AppKit.NSApplication.AnnouncementRequestedNotification @@ -55305,12 +49020,6 @@ P:AppKit.NSBrowser.Path P:AppKit.NSBrowser.Titled P:AppKit.NSBrowserCell.Leaf P:AppKit.NSBrowserCell.Loaded -P:AppKit.NSButton.AccessibilityFocused -P:AppKit.NSButton.AccessibilityFrame -P:AppKit.NSButton.AccessibilityIdentifier -P:AppKit.NSButton.AccessibilityLabel -P:AppKit.NSButton.AccessibilityParent -P:AppKit.NSButton.Bordered P:AppKit.NSButton.Cell P:AppKit.NSButton.IsSpringLoaded P:AppKit.NSButton.Transparent @@ -55319,142 +49028,25 @@ P:AppKit.NSButtonCell.Transparent P:AppKit.NSButtonTouchBarItem.Enabled P:AppKit.NSCandidateListTouchBarItem.CandidateListVisible P:AppKit.NSCandidateListTouchBarItem.Collapsed -P:AppKit.NSCell.AccessibilityActionNames -P:AppKit.NSCell.AccessibilityActivationPoint -P:AppKit.NSCell.AccessibilityAllowedValues -P:AppKit.NSCell.AccessibilityAlternateUIVisible -P:AppKit.NSCell.AccessibilityApplicationFocusedUIElement -P:AppKit.NSCell.AccessibilityAttributedUserInputLabels -P:AppKit.NSCell.AccessibilityAttributeNames -P:AppKit.NSCell.AccessibilityCancelButton -P:AppKit.NSCell.AccessibilityChildren -P:AppKit.NSCell.AccessibilityChildrenInNavigationOrder -P:AppKit.NSCell.AccessibilityClearButton -P:AppKit.NSCell.AccessibilityCloseButton -P:AppKit.NSCell.AccessibilityColumnCount -P:AppKit.NSCell.AccessibilityColumnHeaderUIElements -P:AppKit.NSCell.AccessibilityColumnIndexRange -P:AppKit.NSCell.AccessibilityColumns -P:AppKit.NSCell.AccessibilityColumnTitles -P:AppKit.NSCell.AccessibilityContents -P:AppKit.NSCell.AccessibilityCriticalValue -P:AppKit.NSCell.AccessibilityCustomActions -P:AppKit.NSCell.AccessibilityCustomRotors -P:AppKit.NSCell.AccessibilityDecrementButton -P:AppKit.NSCell.AccessibilityDefaultButton P:AppKit.NSCell.AccessibilityDisclosed -P:AppKit.NSCell.AccessibilityDisclosedByRow -P:AppKit.NSCell.AccessibilityDisclosedRows -P:AppKit.NSCell.AccessibilityDisclosureLevel -P:AppKit.NSCell.AccessibilityDocument P:AppKit.NSCell.AccessibilityEdited P:AppKit.NSCell.AccessibilityElement P:AppKit.NSCell.AccessibilityEnabled P:AppKit.NSCell.AccessibilityExpanded -P:AppKit.NSCell.AccessibilityExtrasMenuBar -P:AppKit.NSCell.AccessibilityFilename -P:AppKit.NSCell.AccessibilityFocused -P:AppKit.NSCell.AccessibilityFocusedWindow -P:AppKit.NSCell.AccessibilityFrame P:AppKit.NSCell.AccessibilityFrontmost -P:AppKit.NSCell.AccessibilityFullScreenButton -P:AppKit.NSCell.AccessibilityGrowArea -P:AppKit.NSCell.AccessibilityHandles -P:AppKit.NSCell.AccessibilityHeader -P:AppKit.NSCell.AccessibilityHelp P:AppKit.NSCell.AccessibilityHidden -P:AppKit.NSCell.AccessibilityHorizontalScrollBar -P:AppKit.NSCell.AccessibilityHorizontalUnitDescription -P:AppKit.NSCell.AccessibilityHorizontalUnits -P:AppKit.NSCell.AccessibilityIdentifier -P:AppKit.NSCell.AccessibilityIncrementButton -P:AppKit.NSCell.AccessibilityIndex -P:AppKit.NSCell.AccessibilityInsertionPointLineNumber -P:AppKit.NSCell.AccessibilityIsIgnored -P:AppKit.NSCell.AccessibilityLabel -P:AppKit.NSCell.AccessibilityLabelUIElements -P:AppKit.NSCell.AccessibilityLabelValue -P:AppKit.NSCell.AccessibilityLinkedUIElements P:AppKit.NSCell.AccessibilityMain -P:AppKit.NSCell.AccessibilityMainWindow -P:AppKit.NSCell.AccessibilityMarkerGroupUIElement -P:AppKit.NSCell.AccessibilityMarkerTypeDescription -P:AppKit.NSCell.AccessibilityMarkerUIElements -P:AppKit.NSCell.AccessibilityMarkerValues -P:AppKit.NSCell.AccessibilityMaxValue -P:AppKit.NSCell.AccessibilityMenuBar -P:AppKit.NSCell.AccessibilityMinimizeButton P:AppKit.NSCell.AccessibilityMinimized -P:AppKit.NSCell.AccessibilityMinValue P:AppKit.NSCell.AccessibilityModal -P:AppKit.NSCell.AccessibilityNextContents -P:AppKit.NSCell.AccessibilityNotifiesWhenDestroyed -P:AppKit.NSCell.AccessibilityNumberOfCharacters P:AppKit.NSCell.AccessibilityOrderedByRow -P:AppKit.NSCell.AccessibilityOrientation -P:AppKit.NSCell.AccessibilityOverflowButton -P:AppKit.NSCell.AccessibilityParameterizedAttributeNames -P:AppKit.NSCell.AccessibilityParent -P:AppKit.NSCell.AccessibilityPlaceholderValue -P:AppKit.NSCell.AccessibilityPreviousContents P:AppKit.NSCell.AccessibilityProtectedContent -P:AppKit.NSCell.AccessibilityProxy P:AppKit.NSCell.AccessibilityRequired -P:AppKit.NSCell.AccessibilityRole -P:AppKit.NSCell.AccessibilityRoleDescription -P:AppKit.NSCell.AccessibilityRowCount -P:AppKit.NSCell.AccessibilityRowHeaderUIElements -P:AppKit.NSCell.AccessibilityRowIndexRange -P:AppKit.NSCell.AccessibilityRows -P:AppKit.NSCell.AccessibilityRulerMarkerType -P:AppKit.NSCell.AccessibilitySearchButton -P:AppKit.NSCell.AccessibilitySearchMenu P:AppKit.NSCell.AccessibilitySelected -P:AppKit.NSCell.AccessibilitySelectedCells -P:AppKit.NSCell.AccessibilitySelectedChildren -P:AppKit.NSCell.AccessibilitySelectedColumns -P:AppKit.NSCell.AccessibilitySelectedRows -P:AppKit.NSCell.AccessibilitySelectedText -P:AppKit.NSCell.AccessibilitySelectedTextRange -P:AppKit.NSCell.AccessibilitySelectedTextRanges -P:AppKit.NSCell.AccessibilityServesAsTitleForUIElements -P:AppKit.NSCell.AccessibilitySharedCharacterRange -P:AppKit.NSCell.AccessibilitySharedFocusElements -P:AppKit.NSCell.AccessibilitySharedTextUIElements -P:AppKit.NSCell.AccessibilityShownMenu -P:AppKit.NSCell.AccessibilitySortDirection -P:AppKit.NSCell.AccessibilitySplitters -P:AppKit.NSCell.AccessibilitySubrole -P:AppKit.NSCell.AccessibilityTabs -P:AppKit.NSCell.AccessibilityTitle -P:AppKit.NSCell.AccessibilityTitleUIElement -P:AppKit.NSCell.AccessibilityToolbarButton -P:AppKit.NSCell.AccessibilityTopLevelUIElement -P:AppKit.NSCell.AccessibilityUnitDescription -P:AppKit.NSCell.AccessibilityUnits -P:AppKit.NSCell.AccessibilityUrl -P:AppKit.NSCell.AccessibilityUserInputLabels -P:AppKit.NSCell.AccessibilityValue -P:AppKit.NSCell.AccessibilityValueDescription -P:AppKit.NSCell.AccessibilityVerticalScrollBar -P:AppKit.NSCell.AccessibilityVerticalUnitDescription -P:AppKit.NSCell.AccessibilityVerticalUnits -P:AppKit.NSCell.AccessibilityVisibleCells -P:AppKit.NSCell.AccessibilityVisibleCharacterRange -P:AppKit.NSCell.AccessibilityVisibleChildren -P:AppKit.NSCell.AccessibilityVisibleColumns -P:AppKit.NSCell.AccessibilityVisibleRows -P:AppKit.NSCell.AccessibilityWarningValue -P:AppKit.NSCell.AccessibilityWindow -P:AppKit.NSCell.AccessibilityWindows -P:AppKit.NSCell.AccessibilityZoomButton P:AppKit.NSCell.AnnouncementRequestedNotification P:AppKit.NSCell.ApplicationActivatedNotification P:AppKit.NSCell.ApplicationDeactivatedNotification P:AppKit.NSCell.ApplicationHiddenNotification P:AppKit.NSCell.ApplicationShownNotification -P:AppKit.NSCell.Bezeled -P:AppKit.NSCell.Bordered P:AppKit.NSCell.ControlTintChangedNotification P:AppKit.NSCell.CreatedNotification P:AppKit.NSCell.DrawerCreatedNotification @@ -55463,7 +49055,6 @@ P:AppKit.NSCell.Enabled P:AppKit.NSCell.FocusedWindowChangedNotification P:AppKit.NSCell.HelpTagCreatedNotification P:AppKit.NSCell.Highlighted -P:AppKit.NSCell.Identifier P:AppKit.NSCell.IsContinuous P:AppKit.NSCell.IsOpaque P:AppKit.NSCell.LayoutChangedNotification @@ -55473,7 +49064,6 @@ P:AppKit.NSCell.ResizedNotification P:AppKit.NSCell.RowCollapsedNotification P:AppKit.NSCell.RowCountChangedNotification P:AppKit.NSCell.RowExpandedNotification -P:AppKit.NSCell.Scrollable P:AppKit.NSCell.Selectable P:AppKit.NSCell.SelectedCellsChangedNotification P:AppKit.NSCell.SelectedChildrenChangedNotification @@ -55500,33 +49090,23 @@ P:AppKit.NSCollectionLayoutAnchor.Edges P:AppKit.NSCollectionLayoutAnchor.IsAbsoluteOffset P:AppKit.NSCollectionLayoutAnchor.IsFractionalOffset P:AppKit.NSCollectionLayoutAnchor.Offset -P:AppKit.NSCollectionLayoutBoundarySupplementaryItem.Alignment P:AppKit.NSCollectionLayoutBoundarySupplementaryItem.ExtendsBoundary P:AppKit.NSCollectionLayoutBoundarySupplementaryItem.Offset P:AppKit.NSCollectionLayoutBoundarySupplementaryItem.PinToVisibleBounds P:AppKit.NSCollectionLayoutDecorationItem.ElementKind -P:AppKit.NSCollectionLayoutDecorationItem.ZIndex P:AppKit.NSCollectionLayoutDimension.Dimension P:AppKit.NSCollectionLayoutDimension.IsAbsolute P:AppKit.NSCollectionLayoutDimension.IsEstimated P:AppKit.NSCollectionLayoutDimension.IsFractionalHeight P:AppKit.NSCollectionLayoutDimension.IsFractionalWidth P:AppKit.NSCollectionLayoutEdgeSpacing.Bottom -P:AppKit.NSCollectionLayoutEdgeSpacing.Leading -P:AppKit.NSCollectionLayoutEdgeSpacing.Top P:AppKit.NSCollectionLayoutEdgeSpacing.Trailing P:AppKit.NSCollectionLayoutGroup.InterItemSpacing -P:AppKit.NSCollectionLayoutGroup.Subitems P:AppKit.NSCollectionLayoutGroup.SupplementaryItems P:AppKit.NSCollectionLayoutGroup.VisualDescription -P:AppKit.NSCollectionLayoutGroupCustomItem.Frame -P:AppKit.NSCollectionLayoutGroupCustomItem.ZIndex -P:AppKit.NSCollectionLayoutItem.ContentInsets P:AppKit.NSCollectionLayoutItem.EdgeSpacing P:AppKit.NSCollectionLayoutItem.LayoutSize P:AppKit.NSCollectionLayoutItem.SupplementaryItems -P:AppKit.NSCollectionLayoutSection.BoundarySupplementaryItems -P:AppKit.NSCollectionLayoutSection.ContentInsets P:AppKit.NSCollectionLayoutSection.DecorationItems P:AppKit.NSCollectionLayoutSection.InterGroupSpacing P:AppKit.NSCollectionLayoutSection.OrthogonalScrollingBehavior @@ -55536,20 +49116,14 @@ P:AppKit.NSCollectionLayoutSize.HeightDimension P:AppKit.NSCollectionLayoutSize.WidthDimension P:AppKit.NSCollectionLayoutSpacing.IsFixedSpacing P:AppKit.NSCollectionLayoutSpacing.IsFlexibleSpacing -P:AppKit.NSCollectionLayoutSpacing.Spacing P:AppKit.NSCollectionLayoutSupplementaryItem.ContainerAnchor P:AppKit.NSCollectionLayoutSupplementaryItem.ElementKind P:AppKit.NSCollectionLayoutSupplementaryItem.ItemAnchor -P:AppKit.NSCollectionLayoutSupplementaryItem.ZIndex P:AppKit.NSCollectionView.Delegate -P:AppKit.NSCollectionView.IgnoreModifierKeysWhileDragging P:AppKit.NSCollectionView.IsFirstResponder P:AppKit.NSCollectionView.Selectable -P:AppKit.NSCollectionView.WantsPeriodicDraggingUpdates -P:AppKit.NSCollectionViewElement.Identifier P:AppKit.NSCollectionViewItem.Selected P:AppKit.NSCollectionViewLayoutAttributes.Hidden -P:AppKit.NSColor.AccessibilityName P:AppKit.NSColor.SystemColorsChanged P:AppKit.NSColorList.IsEditable P:AppKit.NSColorPanel.ColorChangedNotification @@ -55565,7 +49139,6 @@ P:AppKit.NSColorSpace.DeviceRGB P:AppKit.NSColorSpace.DeviceWhite P:AppKit.NSColorSpace.Named P:AppKit.NSColorSpace.Pattern -P:AppKit.NSColorWell.Bordered P:AppKit.NSColorWell.IsActive P:AppKit.NSComboBox.ButtonBordered P:AppKit.NSComboBox.Delegate @@ -55586,21 +49159,14 @@ P:AppKit.NSControlTextEditingEventArgs.FieldEditor P:AppKit.NSControlTextErrorEventArgs.Error P:AppKit.NSControlTextErrorEventArgs.Str P:AppKit.NSDataAsset.Data -P:AppKit.NSDataAsset.Name P:AppKit.NSDataAsset.TypeIdentifier P:AppKit.NSDataEventArgs.DeviceToken -P:AppKit.NSDatePicker.Bezeled -P:AppKit.NSDatePicker.Bordered -P:AppKit.NSDatePicker.Cell P:AppKit.NSDatePicker.Delegate P:AppKit.NSDatePickerCell.Delegate P:AppKit.NSDatePickerValidatorEventArgs.ProposedDateValue P:AppKit.NSDatePickerValidatorEventArgs.ProposedTimeInterval P:AppKit.NSDictionaryControllerKeyValuePair.ExplicitlyIncluded P:AppKit.NSDictionaryEventArgs.UserInfo -P:AppKit.NSDiffableDataSourceSnapshot`2.ItemIdentifiers -P:AppKit.NSDiffableDataSourceSnapshot`2.NumberOfItems -P:AppKit.NSDiffableDataSourceSnapshot`2.NumberOfSections P:AppKit.NSDiffableDataSourceSnapshot`2.ReconfiguredItemIdentifiers P:AppKit.NSDiffableDataSourceSnapshot`2.ReloadedItemIdentifiers P:AppKit.NSDiffableDataSourceSnapshot`2.ReloadedSectionIdentifiers @@ -55613,134 +49179,22 @@ P:AppKit.NSDocument.IsInViewingMode P:AppKit.NSDocument.IsLocked P:AppKit.NSDocument.PresentedItemOperationQueue P:AppKit.NSDocument.PrimaryPresentedItemUrl -P:AppKit.NSDraggingDestination.WantsPeriodicDraggingUpdates P:AppKit.NSDraggingImageComponent.IconKey P:AppKit.NSDraggingImageComponent.LabelKey -P:AppKit.NSDraggingSource.IgnoreModifierKeysWhileDragging -P:AppKit.NSDrawer.AccessibilityActivationPoint -P:AppKit.NSDrawer.AccessibilityAllowedValues -P:AppKit.NSDrawer.AccessibilityAlternateUIVisible -P:AppKit.NSDrawer.AccessibilityApplicationFocusedUIElement -P:AppKit.NSDrawer.AccessibilityAttributedUserInputLabels -P:AppKit.NSDrawer.AccessibilityCancelButton -P:AppKit.NSDrawer.AccessibilityChildren -P:AppKit.NSDrawer.AccessibilityChildrenInNavigationOrder -P:AppKit.NSDrawer.AccessibilityClearButton -P:AppKit.NSDrawer.AccessibilityCloseButton -P:AppKit.NSDrawer.AccessibilityColumnCount -P:AppKit.NSDrawer.AccessibilityColumnHeaderUIElements -P:AppKit.NSDrawer.AccessibilityColumnIndexRange -P:AppKit.NSDrawer.AccessibilityColumns -P:AppKit.NSDrawer.AccessibilityColumnTitles -P:AppKit.NSDrawer.AccessibilityContents -P:AppKit.NSDrawer.AccessibilityCriticalValue -P:AppKit.NSDrawer.AccessibilityCustomActions -P:AppKit.NSDrawer.AccessibilityCustomRotors -P:AppKit.NSDrawer.AccessibilityDecrementButton -P:AppKit.NSDrawer.AccessibilityDefaultButton P:AppKit.NSDrawer.AccessibilityDisclosed -P:AppKit.NSDrawer.AccessibilityDisclosedByRow -P:AppKit.NSDrawer.AccessibilityDisclosedRows -P:AppKit.NSDrawer.AccessibilityDisclosureLevel -P:AppKit.NSDrawer.AccessibilityDocument P:AppKit.NSDrawer.AccessibilityEdited P:AppKit.NSDrawer.AccessibilityElement P:AppKit.NSDrawer.AccessibilityEnabled P:AppKit.NSDrawer.AccessibilityExpanded -P:AppKit.NSDrawer.AccessibilityExtrasMenuBar -P:AppKit.NSDrawer.AccessibilityFilename -P:AppKit.NSDrawer.AccessibilityFocused -P:AppKit.NSDrawer.AccessibilityFocusedWindow -P:AppKit.NSDrawer.AccessibilityFrame P:AppKit.NSDrawer.AccessibilityFrontmost -P:AppKit.NSDrawer.AccessibilityFullScreenButton -P:AppKit.NSDrawer.AccessibilityGrowArea -P:AppKit.NSDrawer.AccessibilityHandles -P:AppKit.NSDrawer.AccessibilityHeader -P:AppKit.NSDrawer.AccessibilityHelp P:AppKit.NSDrawer.AccessibilityHidden -P:AppKit.NSDrawer.AccessibilityHorizontalScrollBar -P:AppKit.NSDrawer.AccessibilityHorizontalUnitDescription -P:AppKit.NSDrawer.AccessibilityHorizontalUnits -P:AppKit.NSDrawer.AccessibilityIdentifier -P:AppKit.NSDrawer.AccessibilityIncrementButton -P:AppKit.NSDrawer.AccessibilityIndex -P:AppKit.NSDrawer.AccessibilityInsertionPointLineNumber -P:AppKit.NSDrawer.AccessibilityLabel -P:AppKit.NSDrawer.AccessibilityLabelUIElements -P:AppKit.NSDrawer.AccessibilityLabelValue -P:AppKit.NSDrawer.AccessibilityLinkedUIElements P:AppKit.NSDrawer.AccessibilityMain -P:AppKit.NSDrawer.AccessibilityMainWindow -P:AppKit.NSDrawer.AccessibilityMarkerGroupUIElement -P:AppKit.NSDrawer.AccessibilityMarkerTypeDescription -P:AppKit.NSDrawer.AccessibilityMarkerUIElements -P:AppKit.NSDrawer.AccessibilityMarkerValues -P:AppKit.NSDrawer.AccessibilityMaxValue -P:AppKit.NSDrawer.AccessibilityMenuBar -P:AppKit.NSDrawer.AccessibilityMinimizeButton P:AppKit.NSDrawer.AccessibilityMinimized -P:AppKit.NSDrawer.AccessibilityMinValue P:AppKit.NSDrawer.AccessibilityModal -P:AppKit.NSDrawer.AccessibilityNextContents -P:AppKit.NSDrawer.AccessibilityNumberOfCharacters P:AppKit.NSDrawer.AccessibilityOrderedByRow -P:AppKit.NSDrawer.AccessibilityOrientation -P:AppKit.NSDrawer.AccessibilityOverflowButton -P:AppKit.NSDrawer.AccessibilityParent -P:AppKit.NSDrawer.AccessibilityPlaceholderValue -P:AppKit.NSDrawer.AccessibilityPreviousContents P:AppKit.NSDrawer.AccessibilityProtectedContent -P:AppKit.NSDrawer.AccessibilityProxy P:AppKit.NSDrawer.AccessibilityRequired -P:AppKit.NSDrawer.AccessibilityRole -P:AppKit.NSDrawer.AccessibilityRoleDescription -P:AppKit.NSDrawer.AccessibilityRowCount -P:AppKit.NSDrawer.AccessibilityRowHeaderUIElements -P:AppKit.NSDrawer.AccessibilityRowIndexRange -P:AppKit.NSDrawer.AccessibilityRows -P:AppKit.NSDrawer.AccessibilityRulerMarkerType -P:AppKit.NSDrawer.AccessibilitySearchButton -P:AppKit.NSDrawer.AccessibilitySearchMenu P:AppKit.NSDrawer.AccessibilitySelected -P:AppKit.NSDrawer.AccessibilitySelectedCells -P:AppKit.NSDrawer.AccessibilitySelectedChildren -P:AppKit.NSDrawer.AccessibilitySelectedColumns -P:AppKit.NSDrawer.AccessibilitySelectedRows -P:AppKit.NSDrawer.AccessibilitySelectedText -P:AppKit.NSDrawer.AccessibilitySelectedTextRange -P:AppKit.NSDrawer.AccessibilitySelectedTextRanges -P:AppKit.NSDrawer.AccessibilityServesAsTitleForUIElements -P:AppKit.NSDrawer.AccessibilitySharedCharacterRange -P:AppKit.NSDrawer.AccessibilitySharedFocusElements -P:AppKit.NSDrawer.AccessibilitySharedTextUIElements -P:AppKit.NSDrawer.AccessibilityShownMenu -P:AppKit.NSDrawer.AccessibilitySortDirection -P:AppKit.NSDrawer.AccessibilitySplitters -P:AppKit.NSDrawer.AccessibilitySubrole -P:AppKit.NSDrawer.AccessibilityTabs -P:AppKit.NSDrawer.AccessibilityTitle -P:AppKit.NSDrawer.AccessibilityTitleUIElement -P:AppKit.NSDrawer.AccessibilityToolbarButton -P:AppKit.NSDrawer.AccessibilityTopLevelUIElement -P:AppKit.NSDrawer.AccessibilityUnitDescription -P:AppKit.NSDrawer.AccessibilityUnits -P:AppKit.NSDrawer.AccessibilityUrl -P:AppKit.NSDrawer.AccessibilityUserInputLabels -P:AppKit.NSDrawer.AccessibilityValue -P:AppKit.NSDrawer.AccessibilityValueDescription -P:AppKit.NSDrawer.AccessibilityVerticalScrollBar -P:AppKit.NSDrawer.AccessibilityVerticalUnitDescription -P:AppKit.NSDrawer.AccessibilityVerticalUnits -P:AppKit.NSDrawer.AccessibilityVisibleCells -P:AppKit.NSDrawer.AccessibilityVisibleCharacterRange -P:AppKit.NSDrawer.AccessibilityVisibleChildren -P:AppKit.NSDrawer.AccessibilityVisibleColumns -P:AppKit.NSDrawer.AccessibilityVisibleRows -P:AppKit.NSDrawer.AccessibilityWarningValue -P:AppKit.NSDrawer.AccessibilityWindow -P:AppKit.NSDrawer.AccessibilityWindows -P:AppKit.NSDrawer.AccessibilityZoomButton P:AppKit.NSDrawer.AnnouncementRequestedNotification P:AppKit.NSDrawer.ApplicationActivatedNotification P:AppKit.NSDrawer.ApplicationDeactivatedNotification @@ -55798,7 +49252,6 @@ P:AppKit.NSFont.FeatureTypeIdentifierKey P:AppKit.NSFont.FixedAdvanceAttribute P:AppKit.NSFont.FontSetChangedNotification P:AppKit.NSFont.IsFixedPitch -P:AppKit.NSFont.IsVertical P:AppKit.NSFont.MatrixAttribute P:AppKit.NSFont.NameAttribute P:AppKit.NSFont.PrinterFont @@ -55863,7 +49316,6 @@ P:AppKit.NSGestureRecognizer.ShouldRequireFailure P:AppKit.NSGraphics.AvailableWindowDepths P:AppKit.NSGraphicsContext.GraphicsPort P:AppKit.NSGraphicsContext.IsDrawingToScreen -P:AppKit.NSGraphicsContext.IsFlipped P:AppKit.NSGridColumn.Hidden P:AppKit.NSGridRow.Hidden P:AppKit.NSGridView.SizeForContent @@ -55888,19 +49340,11 @@ P:AppKit.NSImageRep.CGImage P:AppKit.NSImageRep.HasAlpha P:AppKit.NSImageRep.Opaque P:AppKit.NSImageRep.RegistryDidChangeNotification -P:AppKit.NSImageView.AccessibilityFocused -P:AppKit.NSImageView.AccessibilityFrame -P:AppKit.NSImageView.AccessibilityIdentifier -P:AppKit.NSImageView.AccessibilityLabel -P:AppKit.NSImageView.AccessibilityParent P:AppKit.NSImageView.Editable P:AppKit.NSLayoutConstraint.Active -P:AppKit.NSLayoutConstraint.Animations -P:AppKit.NSLayoutConstraint.Animator P:AppKit.NSLayoutConstraint.Constant P:AppKit.NSLayoutConstraint.FirstAttribute P:AppKit.NSLayoutConstraint.FirstItem -P:AppKit.NSLayoutConstraint.Identifier P:AppKit.NSLayoutConstraint.Multiplier P:AppKit.NSLayoutConstraint.Priority P:AppKit.NSLayoutConstraint.Relation @@ -55915,149 +49359,31 @@ P:AppKit.NSLayoutManager.ExtraLineFragmentUsedRect P:AppKit.NSLayoutManager.FirstUnlaidCharacterIndex P:AppKit.NSLayoutManager.FirstUnlaidGlyphIndex P:AppKit.NSLayoutManager.HasNonContiguousLayout -P:AppKit.NSLayoutManager.HyphenationFactor P:AppKit.NSLayoutManager.LimitsLayoutForSuspiciousContents -P:AppKit.NSLayoutManager.NumberOfGlyphs P:AppKit.NSLayoutManager.ShowsControlCharacters P:AppKit.NSLayoutManager.ShowsInvisibleCharacters -P:AppKit.NSLayoutManager.TextContainers -P:AppKit.NSLayoutManager.TextStorage P:AppKit.NSLayoutManager.UsesDefaultHyphenation -P:AppKit.NSLayoutManager.UsesFontLeading -P:AppKit.NSLayoutManager.WeakDelegate P:AppKit.NSLevelIndicator.Cell P:AppKit.NSLevelIndicator.Editable P:AppKit.NSMatrix.Autoscroll P:AppKit.NSMatrix.Delegate P:AppKit.NSMatrix.Item(System.IntPtr,System.IntPtr) P:AppKit.NSMatrix.SelectionByRect -P:AppKit.NSMenu.AccessibilityActivationPoint -P:AppKit.NSMenu.AccessibilityAllowedValues -P:AppKit.NSMenu.AccessibilityAlternateUIVisible -P:AppKit.NSMenu.AccessibilityApplicationFocusedUIElement -P:AppKit.NSMenu.AccessibilityAttributedUserInputLabels -P:AppKit.NSMenu.AccessibilityCancelButton -P:AppKit.NSMenu.AccessibilityChildren -P:AppKit.NSMenu.AccessibilityChildrenInNavigationOrder -P:AppKit.NSMenu.AccessibilityClearButton -P:AppKit.NSMenu.AccessibilityCloseButton -P:AppKit.NSMenu.AccessibilityColumnCount -P:AppKit.NSMenu.AccessibilityColumnHeaderUIElements -P:AppKit.NSMenu.AccessibilityColumnIndexRange -P:AppKit.NSMenu.AccessibilityColumns -P:AppKit.NSMenu.AccessibilityColumnTitles -P:AppKit.NSMenu.AccessibilityContents -P:AppKit.NSMenu.AccessibilityCriticalValue -P:AppKit.NSMenu.AccessibilityCustomActions -P:AppKit.NSMenu.AccessibilityCustomRotors -P:AppKit.NSMenu.AccessibilityDecrementButton -P:AppKit.NSMenu.AccessibilityDefaultButton P:AppKit.NSMenu.AccessibilityDisclosed -P:AppKit.NSMenu.AccessibilityDisclosedByRow -P:AppKit.NSMenu.AccessibilityDisclosedRows -P:AppKit.NSMenu.AccessibilityDisclosureLevel -P:AppKit.NSMenu.AccessibilityDocument P:AppKit.NSMenu.AccessibilityEdited P:AppKit.NSMenu.AccessibilityElement P:AppKit.NSMenu.AccessibilityEnabled P:AppKit.NSMenu.AccessibilityExpanded -P:AppKit.NSMenu.AccessibilityExtrasMenuBar -P:AppKit.NSMenu.AccessibilityFilename -P:AppKit.NSMenu.AccessibilityFocused -P:AppKit.NSMenu.AccessibilityFocusedWindow -P:AppKit.NSMenu.AccessibilityFrame -P:AppKit.NSMenu.AccessibilityFrameInParentSpace P:AppKit.NSMenu.AccessibilityFrontmost -P:AppKit.NSMenu.AccessibilityFullScreenButton -P:AppKit.NSMenu.AccessibilityGrowArea -P:AppKit.NSMenu.AccessibilityHandles -P:AppKit.NSMenu.AccessibilityHeader -P:AppKit.NSMenu.AccessibilityHelp P:AppKit.NSMenu.AccessibilityHidden -P:AppKit.NSMenu.AccessibilityHorizontalScrollBar -P:AppKit.NSMenu.AccessibilityHorizontalUnitDescription -P:AppKit.NSMenu.AccessibilityHorizontalUnits -P:AppKit.NSMenu.AccessibilityIdentifier -P:AppKit.NSMenu.AccessibilityIncrementButton -P:AppKit.NSMenu.AccessibilityIndex -P:AppKit.NSMenu.AccessibilityInsertionPointLineNumber -P:AppKit.NSMenu.AccessibilityLabel -P:AppKit.NSMenu.AccessibilityLabelUIElements -P:AppKit.NSMenu.AccessibilityLabelValue -P:AppKit.NSMenu.AccessibilityLinkedUIElements P:AppKit.NSMenu.AccessibilityMain -P:AppKit.NSMenu.AccessibilityMainWindow -P:AppKit.NSMenu.AccessibilityMarkerGroupUIElement -P:AppKit.NSMenu.AccessibilityMarkerTypeDescription -P:AppKit.NSMenu.AccessibilityMarkerUIElements -P:AppKit.NSMenu.AccessibilityMarkerValues -P:AppKit.NSMenu.AccessibilityMaxValue -P:AppKit.NSMenu.AccessibilityMenuBar -P:AppKit.NSMenu.AccessibilityMinimizeButton P:AppKit.NSMenu.AccessibilityMinimized -P:AppKit.NSMenu.AccessibilityMinValue P:AppKit.NSMenu.AccessibilityModal -P:AppKit.NSMenu.AccessibilityNextContents -P:AppKit.NSMenu.AccessibilityNumberOfCharacters P:AppKit.NSMenu.AccessibilityOrderedByRow -P:AppKit.NSMenu.AccessibilityOrientation -P:AppKit.NSMenu.AccessibilityOverflowButton -P:AppKit.NSMenu.AccessibilityParent -P:AppKit.NSMenu.AccessibilityPlaceholderValue -P:AppKit.NSMenu.AccessibilityPreviousContents P:AppKit.NSMenu.AccessibilityProtectedContent -P:AppKit.NSMenu.AccessibilityProxy P:AppKit.NSMenu.AccessibilityRequired -P:AppKit.NSMenu.AccessibilityRole -P:AppKit.NSMenu.AccessibilityRoleDescription -P:AppKit.NSMenu.AccessibilityRowCount -P:AppKit.NSMenu.AccessibilityRowHeaderUIElements -P:AppKit.NSMenu.AccessibilityRowIndexRange -P:AppKit.NSMenu.AccessibilityRows -P:AppKit.NSMenu.AccessibilityRulerMarkerType -P:AppKit.NSMenu.AccessibilitySearchButton -P:AppKit.NSMenu.AccessibilitySearchMenu P:AppKit.NSMenu.AccessibilitySelected -P:AppKit.NSMenu.AccessibilitySelectedCells -P:AppKit.NSMenu.AccessibilitySelectedChildren -P:AppKit.NSMenu.AccessibilitySelectedColumns -P:AppKit.NSMenu.AccessibilitySelectedRows -P:AppKit.NSMenu.AccessibilitySelectedText -P:AppKit.NSMenu.AccessibilitySelectedTextRange -P:AppKit.NSMenu.AccessibilitySelectedTextRanges -P:AppKit.NSMenu.AccessibilityServesAsTitleForUIElements -P:AppKit.NSMenu.AccessibilitySharedCharacterRange -P:AppKit.NSMenu.AccessibilitySharedFocusElements -P:AppKit.NSMenu.AccessibilitySharedTextUIElements -P:AppKit.NSMenu.AccessibilityShownMenu -P:AppKit.NSMenu.AccessibilitySortDirection -P:AppKit.NSMenu.AccessibilitySplitters -P:AppKit.NSMenu.AccessibilitySubrole -P:AppKit.NSMenu.AccessibilityTabs -P:AppKit.NSMenu.AccessibilityTitle -P:AppKit.NSMenu.AccessibilityTitleUIElement -P:AppKit.NSMenu.AccessibilityToolbarButton -P:AppKit.NSMenu.AccessibilityTopLevelUIElement -P:AppKit.NSMenu.AccessibilityUnitDescription -P:AppKit.NSMenu.AccessibilityUnits -P:AppKit.NSMenu.AccessibilityUrl -P:AppKit.NSMenu.AccessibilityUserInputLabels -P:AppKit.NSMenu.AccessibilityValue -P:AppKit.NSMenu.AccessibilityValueDescription -P:AppKit.NSMenu.AccessibilityVerticalScrollBar -P:AppKit.NSMenu.AccessibilityVerticalUnitDescription -P:AppKit.NSMenu.AccessibilityVerticalUnits -P:AppKit.NSMenu.AccessibilityVisibleCells -P:AppKit.NSMenu.AccessibilityVisibleCharacterRange -P:AppKit.NSMenu.AccessibilityVisibleChildren -P:AppKit.NSMenu.AccessibilityVisibleColumns -P:AppKit.NSMenu.AccessibilityVisibleRows -P:AppKit.NSMenu.AccessibilityWarningValue -P:AppKit.NSMenu.AccessibilityWindow -P:AppKit.NSMenu.AccessibilityWindows -P:AppKit.NSMenu.AccessibilityZoomButton P:AppKit.NSMenu.AnnouncementRequestedNotification -P:AppKit.NSMenu.Appearance P:AppKit.NSMenu.ApplicationActivatedNotification P:AppKit.NSMenu.ApplicationDeactivatedNotification P:AppKit.NSMenu.ApplicationHiddenNotification @@ -56071,10 +49397,8 @@ P:AppKit.NSMenu.DidEndTrackingNotification P:AppKit.NSMenu.DidRemoveItemNotification P:AppKit.NSMenu.DidSendActionNotification P:AppKit.NSMenu.DrawerCreatedNotification -P:AppKit.NSMenu.EffectiveAppearance P:AppKit.NSMenu.FocusedWindowChangedNotification P:AppKit.NSMenu.HelpTagCreatedNotification -P:AppKit.NSMenu.Identifier P:AppKit.NSMenu.IsTornOff P:AppKit.NSMenu.LayoutChangedNotification P:AppKit.NSMenu.MainWindowChangedNotification @@ -56101,131 +49425,20 @@ P:AppKit.NSMenu.WindowDeminiaturizedNotification P:AppKit.NSMenu.WindowMiniaturizedNotification P:AppKit.NSMenu.WindowMovedNotification P:AppKit.NSMenu.WindowResizedNotification -P:AppKit.NSMenuItem.AccessibilityActivationPoint -P:AppKit.NSMenuItem.AccessibilityAllowedValues -P:AppKit.NSMenuItem.AccessibilityAlternateUIVisible -P:AppKit.NSMenuItem.AccessibilityApplicationFocusedUIElement -P:AppKit.NSMenuItem.AccessibilityAttributedUserInputLabels -P:AppKit.NSMenuItem.AccessibilityCancelButton -P:AppKit.NSMenuItem.AccessibilityChildren -P:AppKit.NSMenuItem.AccessibilityChildrenInNavigationOrder -P:AppKit.NSMenuItem.AccessibilityClearButton -P:AppKit.NSMenuItem.AccessibilityCloseButton -P:AppKit.NSMenuItem.AccessibilityColumnCount -P:AppKit.NSMenuItem.AccessibilityColumnHeaderUIElements -P:AppKit.NSMenuItem.AccessibilityColumnIndexRange -P:AppKit.NSMenuItem.AccessibilityColumns -P:AppKit.NSMenuItem.AccessibilityColumnTitles -P:AppKit.NSMenuItem.AccessibilityContents -P:AppKit.NSMenuItem.AccessibilityCriticalValue -P:AppKit.NSMenuItem.AccessibilityCustomActions -P:AppKit.NSMenuItem.AccessibilityCustomRotors -P:AppKit.NSMenuItem.AccessibilityDecrementButton -P:AppKit.NSMenuItem.AccessibilityDefaultButton P:AppKit.NSMenuItem.AccessibilityDisclosed -P:AppKit.NSMenuItem.AccessibilityDisclosedByRow -P:AppKit.NSMenuItem.AccessibilityDisclosedRows -P:AppKit.NSMenuItem.AccessibilityDisclosureLevel -P:AppKit.NSMenuItem.AccessibilityDocument P:AppKit.NSMenuItem.AccessibilityEdited P:AppKit.NSMenuItem.AccessibilityElement P:AppKit.NSMenuItem.AccessibilityEnabled P:AppKit.NSMenuItem.AccessibilityExpanded -P:AppKit.NSMenuItem.AccessibilityExtrasMenuBar -P:AppKit.NSMenuItem.AccessibilityFilename -P:AppKit.NSMenuItem.AccessibilityFocused -P:AppKit.NSMenuItem.AccessibilityFocusedWindow -P:AppKit.NSMenuItem.AccessibilityFrame -P:AppKit.NSMenuItem.AccessibilityFrameInParentSpace P:AppKit.NSMenuItem.AccessibilityFrontmost -P:AppKit.NSMenuItem.AccessibilityFullScreenButton -P:AppKit.NSMenuItem.AccessibilityGrowArea -P:AppKit.NSMenuItem.AccessibilityHandles -P:AppKit.NSMenuItem.AccessibilityHeader -P:AppKit.NSMenuItem.AccessibilityHelp P:AppKit.NSMenuItem.AccessibilityHidden -P:AppKit.NSMenuItem.AccessibilityHorizontalScrollBar -P:AppKit.NSMenuItem.AccessibilityHorizontalUnitDescription -P:AppKit.NSMenuItem.AccessibilityHorizontalUnits -P:AppKit.NSMenuItem.AccessibilityIdentifier -P:AppKit.NSMenuItem.AccessibilityIncrementButton -P:AppKit.NSMenuItem.AccessibilityIndex -P:AppKit.NSMenuItem.AccessibilityInsertionPointLineNumber -P:AppKit.NSMenuItem.AccessibilityLabel -P:AppKit.NSMenuItem.AccessibilityLabelUIElements -P:AppKit.NSMenuItem.AccessibilityLabelValue -P:AppKit.NSMenuItem.AccessibilityLinkedUIElements P:AppKit.NSMenuItem.AccessibilityMain -P:AppKit.NSMenuItem.AccessibilityMainWindow -P:AppKit.NSMenuItem.AccessibilityMarkerGroupUIElement -P:AppKit.NSMenuItem.AccessibilityMarkerTypeDescription -P:AppKit.NSMenuItem.AccessibilityMarkerUIElements -P:AppKit.NSMenuItem.AccessibilityMarkerValues -P:AppKit.NSMenuItem.AccessibilityMaxValue -P:AppKit.NSMenuItem.AccessibilityMenuBar -P:AppKit.NSMenuItem.AccessibilityMinimizeButton P:AppKit.NSMenuItem.AccessibilityMinimized -P:AppKit.NSMenuItem.AccessibilityMinValue P:AppKit.NSMenuItem.AccessibilityModal -P:AppKit.NSMenuItem.AccessibilityNextContents -P:AppKit.NSMenuItem.AccessibilityNumberOfCharacters P:AppKit.NSMenuItem.AccessibilityOrderedByRow -P:AppKit.NSMenuItem.AccessibilityOrientation -P:AppKit.NSMenuItem.AccessibilityOverflowButton -P:AppKit.NSMenuItem.AccessibilityParent -P:AppKit.NSMenuItem.AccessibilityPlaceholderValue -P:AppKit.NSMenuItem.AccessibilityPreviousContents P:AppKit.NSMenuItem.AccessibilityProtectedContent -P:AppKit.NSMenuItem.AccessibilityProxy P:AppKit.NSMenuItem.AccessibilityRequired -P:AppKit.NSMenuItem.AccessibilityRole -P:AppKit.NSMenuItem.AccessibilityRoleDescription -P:AppKit.NSMenuItem.AccessibilityRowCount -P:AppKit.NSMenuItem.AccessibilityRowHeaderUIElements -P:AppKit.NSMenuItem.AccessibilityRowIndexRange -P:AppKit.NSMenuItem.AccessibilityRows -P:AppKit.NSMenuItem.AccessibilityRulerMarkerType -P:AppKit.NSMenuItem.AccessibilitySearchButton -P:AppKit.NSMenuItem.AccessibilitySearchMenu P:AppKit.NSMenuItem.AccessibilitySelected -P:AppKit.NSMenuItem.AccessibilitySelectedCells -P:AppKit.NSMenuItem.AccessibilitySelectedChildren -P:AppKit.NSMenuItem.AccessibilitySelectedColumns -P:AppKit.NSMenuItem.AccessibilitySelectedRows -P:AppKit.NSMenuItem.AccessibilitySelectedText -P:AppKit.NSMenuItem.AccessibilitySelectedTextRange -P:AppKit.NSMenuItem.AccessibilitySelectedTextRanges -P:AppKit.NSMenuItem.AccessibilityServesAsTitleForUIElements -P:AppKit.NSMenuItem.AccessibilitySharedCharacterRange -P:AppKit.NSMenuItem.AccessibilitySharedFocusElements -P:AppKit.NSMenuItem.AccessibilitySharedTextUIElements -P:AppKit.NSMenuItem.AccessibilityShownMenu -P:AppKit.NSMenuItem.AccessibilitySortDirection -P:AppKit.NSMenuItem.AccessibilitySplitters -P:AppKit.NSMenuItem.AccessibilitySubrole -P:AppKit.NSMenuItem.AccessibilityTabs -P:AppKit.NSMenuItem.AccessibilityTitle -P:AppKit.NSMenuItem.AccessibilityTitleUIElement -P:AppKit.NSMenuItem.AccessibilityToolbarButton -P:AppKit.NSMenuItem.AccessibilityTopLevelUIElement -P:AppKit.NSMenuItem.AccessibilityUnitDescription -P:AppKit.NSMenuItem.AccessibilityUnits -P:AppKit.NSMenuItem.AccessibilityUrl -P:AppKit.NSMenuItem.AccessibilityUserInputLabels -P:AppKit.NSMenuItem.AccessibilityValue -P:AppKit.NSMenuItem.AccessibilityValueDescription -P:AppKit.NSMenuItem.AccessibilityVerticalScrollBar -P:AppKit.NSMenuItem.AccessibilityVerticalUnitDescription -P:AppKit.NSMenuItem.AccessibilityVerticalUnits -P:AppKit.NSMenuItem.AccessibilityVisibleCells -P:AppKit.NSMenuItem.AccessibilityVisibleCharacterRange -P:AppKit.NSMenuItem.AccessibilityVisibleChildren -P:AppKit.NSMenuItem.AccessibilityVisibleColumns -P:AppKit.NSMenuItem.AccessibilityVisibleRows -P:AppKit.NSMenuItem.AccessibilityWarningValue -P:AppKit.NSMenuItem.AccessibilityWindow -P:AppKit.NSMenuItem.AccessibilityWindows -P:AppKit.NSMenuItem.AccessibilityZoomButton P:AppKit.NSMenuItem.Alternate P:AppKit.NSMenuItem.AnnouncementRequestedNotification P:AppKit.NSMenuItem.ApplicationActivatedNotification @@ -56239,7 +49452,6 @@ P:AppKit.NSMenuItem.FocusedWindowChangedNotification P:AppKit.NSMenuItem.HelpTagCreatedNotification P:AppKit.NSMenuItem.Hidden P:AppKit.NSMenuItem.Highlighted -P:AppKit.NSMenuItem.Identifier P:AppKit.NSMenuItem.IsHiddenOrHasHiddenAncestor P:AppKit.NSMenuItem.IsSectionHeader P:AppKit.NSMenuItem.IsSeparatorItem @@ -56271,15 +49483,9 @@ P:AppKit.NSMenuItem.WindowResizedNotification P:AppKit.NSMenuItemEventArgs.MenuItem P:AppKit.NSMenuItemIndexEventArgs.MenuItemIndex P:AppKit.NSMenuToolbarItem.ItemMenu -P:AppKit.NSMutableParagraphStyle.Alignment -P:AppKit.NSMutableParagraphStyle.AllowsDefaultTighteningForTruncation -P:AppKit.NSMutableParagraphStyle.BaseWritingDirection P:AppKit.NSMutableParagraphStyle.DefaultTabInterval P:AppKit.NSMutableParagraphStyle.FirstLineHeadIndent P:AppKit.NSMutableParagraphStyle.HeadIndent -P:AppKit.NSMutableParagraphStyle.HyphenationFactor -P:AppKit.NSMutableParagraphStyle.LineBreakMode -P:AppKit.NSMutableParagraphStyle.LineBreakStrategy P:AppKit.NSMutableParagraphStyle.LineHeightMultiple P:AppKit.NSMutableParagraphStyle.LineSpacing P:AppKit.NSMutableParagraphStyle.MaximumLineHeight @@ -56302,22 +49508,6 @@ P:AppKit.NSOpenSaveExpandingEventArgs.Expanding P:AppKit.NSOpenSaveFilenameEventArgs.Path P:AppKit.NSOpenSavePanelUrlEventArgs.NewDirectoryUrl P:AppKit.NSopenSavePanelUTTypeEventArgs.Type -P:AppKit.NSOutlineView.AccessibilityColumnHeaderUIElements -P:AppKit.NSOutlineView.AccessibilityColumns -P:AppKit.NSOutlineView.AccessibilityFocused -P:AppKit.NSOutlineView.AccessibilityFrame -P:AppKit.NSOutlineView.AccessibilityHeaderGroup -P:AppKit.NSOutlineView.AccessibilityIdentifier -P:AppKit.NSOutlineView.AccessibilityLabel -P:AppKit.NSOutlineView.AccessibilityParent -P:AppKit.NSOutlineView.AccessibilityRowHeaderUIElements -P:AppKit.NSOutlineView.AccessibilityRows -P:AppKit.NSOutlineView.AccessibilitySelectedCells -P:AppKit.NSOutlineView.AccessibilitySelectedColumns -P:AppKit.NSOutlineView.AccessibilitySelectedRows -P:AppKit.NSOutlineView.AccessibilityVisibleCells -P:AppKit.NSOutlineView.AccessibilityVisibleColumns -P:AppKit.NSOutlineView.AccessibilityVisibleRows P:AppKit.NSOutlineView.ColumnDidMoveNotification P:AppKit.NSOutlineView.ColumnDidResizeNotification P:AppKit.NSOutlineView.DataSource @@ -56329,8 +49519,6 @@ P:AppKit.NSOutlineView.ItemWillExpandNotification P:AppKit.NSOutlineView.SelectionDidChangeNotification P:AppKit.NSOutlineView.SelectionIsChangingNotification P:AppKit.NSOutlineViewItemEventArgs.Item -P:AppKit.NSPageController.Animations -P:AppKit.NSPageController.Animator P:AppKit.NSPageController.Delegate P:AppKit.NSPageController.GetFrame P:AppKit.NSPageController.GetIdentifier @@ -56339,16 +49527,9 @@ P:AppKit.NSPageControllerPrepareViewControllerEventArgs.TargetObject P:AppKit.NSPageControllerPrepareViewControllerEventArgs.ViewController P:AppKit.NSPageControllerTransitionEventArgs.TargetObject P:AppKit.NSPanel.FloatingPanel -P:AppKit.NSParagraphStyle.Alignment -P:AppKit.NSParagraphStyle.AllowsDefaultTighteningForTruncation -P:AppKit.NSParagraphStyle.BaseWritingDirection -P:AppKit.NSParagraphStyle.Default P:AppKit.NSParagraphStyle.DefaultTabInterval P:AppKit.NSParagraphStyle.FirstLineHeadIndent P:AppKit.NSParagraphStyle.HeadIndent -P:AppKit.NSParagraphStyle.HyphenationFactor -P:AppKit.NSParagraphStyle.LineBreakMode -P:AppKit.NSParagraphStyle.LineBreakStrategy P:AppKit.NSParagraphStyle.LineHeightMultiple P:AppKit.NSParagraphStyle.LineSpacing P:AppKit.NSParagraphStyle.MaximumLineHeight @@ -56389,130 +49570,20 @@ P:AppKit.NSPathCellMenuEventArgs.Menu P:AppKit.NSPathControl.Delegate P:AppKit.NSPathControl.Editable P:AppKit.NSPickerTouchBarItem.Enabled -P:AppKit.NSPopover.AccessibilityActivationPoint -P:AppKit.NSPopover.AccessibilityAllowedValues -P:AppKit.NSPopover.AccessibilityAlternateUIVisible -P:AppKit.NSPopover.AccessibilityApplicationFocusedUIElement -P:AppKit.NSPopover.AccessibilityAttributedUserInputLabels -P:AppKit.NSPopover.AccessibilityCancelButton -P:AppKit.NSPopover.AccessibilityChildren -P:AppKit.NSPopover.AccessibilityChildrenInNavigationOrder -P:AppKit.NSPopover.AccessibilityClearButton -P:AppKit.NSPopover.AccessibilityCloseButton -P:AppKit.NSPopover.AccessibilityColumnCount -P:AppKit.NSPopover.AccessibilityColumnHeaderUIElements -P:AppKit.NSPopover.AccessibilityColumnIndexRange -P:AppKit.NSPopover.AccessibilityColumns -P:AppKit.NSPopover.AccessibilityColumnTitles -P:AppKit.NSPopover.AccessibilityContents -P:AppKit.NSPopover.AccessibilityCriticalValue -P:AppKit.NSPopover.AccessibilityCustomActions -P:AppKit.NSPopover.AccessibilityCustomRotors -P:AppKit.NSPopover.AccessibilityDecrementButton -P:AppKit.NSPopover.AccessibilityDefaultButton P:AppKit.NSPopover.AccessibilityDisclosed -P:AppKit.NSPopover.AccessibilityDisclosedByRow -P:AppKit.NSPopover.AccessibilityDisclosedRows -P:AppKit.NSPopover.AccessibilityDisclosureLevel -P:AppKit.NSPopover.AccessibilityDocument P:AppKit.NSPopover.AccessibilityEdited P:AppKit.NSPopover.AccessibilityElement P:AppKit.NSPopover.AccessibilityEnabled P:AppKit.NSPopover.AccessibilityExpanded -P:AppKit.NSPopover.AccessibilityExtrasMenuBar -P:AppKit.NSPopover.AccessibilityFilename -P:AppKit.NSPopover.AccessibilityFocused -P:AppKit.NSPopover.AccessibilityFocusedWindow -P:AppKit.NSPopover.AccessibilityFrame P:AppKit.NSPopover.AccessibilityFrontmost -P:AppKit.NSPopover.AccessibilityFullScreenButton -P:AppKit.NSPopover.AccessibilityGrowArea -P:AppKit.NSPopover.AccessibilityHandles -P:AppKit.NSPopover.AccessibilityHeader -P:AppKit.NSPopover.AccessibilityHelp P:AppKit.NSPopover.AccessibilityHidden -P:AppKit.NSPopover.AccessibilityHorizontalScrollBar -P:AppKit.NSPopover.AccessibilityHorizontalUnitDescription -P:AppKit.NSPopover.AccessibilityHorizontalUnits -P:AppKit.NSPopover.AccessibilityIdentifier -P:AppKit.NSPopover.AccessibilityIncrementButton -P:AppKit.NSPopover.AccessibilityIndex -P:AppKit.NSPopover.AccessibilityInsertionPointLineNumber -P:AppKit.NSPopover.AccessibilityLabel -P:AppKit.NSPopover.AccessibilityLabelUIElements -P:AppKit.NSPopover.AccessibilityLabelValue -P:AppKit.NSPopover.AccessibilityLinkedUIElements P:AppKit.NSPopover.AccessibilityMain -P:AppKit.NSPopover.AccessibilityMainWindow -P:AppKit.NSPopover.AccessibilityMarkerGroupUIElement -P:AppKit.NSPopover.AccessibilityMarkerTypeDescription -P:AppKit.NSPopover.AccessibilityMarkerUIElements -P:AppKit.NSPopover.AccessibilityMarkerValues -P:AppKit.NSPopover.AccessibilityMaxValue -P:AppKit.NSPopover.AccessibilityMenuBar -P:AppKit.NSPopover.AccessibilityMinimizeButton P:AppKit.NSPopover.AccessibilityMinimized -P:AppKit.NSPopover.AccessibilityMinValue P:AppKit.NSPopover.AccessibilityModal -P:AppKit.NSPopover.AccessibilityNextContents -P:AppKit.NSPopover.AccessibilityNumberOfCharacters P:AppKit.NSPopover.AccessibilityOrderedByRow -P:AppKit.NSPopover.AccessibilityOrientation -P:AppKit.NSPopover.AccessibilityOverflowButton -P:AppKit.NSPopover.AccessibilityParent -P:AppKit.NSPopover.AccessibilityPlaceholderValue -P:AppKit.NSPopover.AccessibilityPreviousContents P:AppKit.NSPopover.AccessibilityProtectedContent -P:AppKit.NSPopover.AccessibilityProxy P:AppKit.NSPopover.AccessibilityRequired -P:AppKit.NSPopover.AccessibilityRole -P:AppKit.NSPopover.AccessibilityRoleDescription -P:AppKit.NSPopover.AccessibilityRowCount -P:AppKit.NSPopover.AccessibilityRowHeaderUIElements -P:AppKit.NSPopover.AccessibilityRowIndexRange -P:AppKit.NSPopover.AccessibilityRows -P:AppKit.NSPopover.AccessibilityRulerMarkerType -P:AppKit.NSPopover.AccessibilitySearchButton -P:AppKit.NSPopover.AccessibilitySearchMenu P:AppKit.NSPopover.AccessibilitySelected -P:AppKit.NSPopover.AccessibilitySelectedCells -P:AppKit.NSPopover.AccessibilitySelectedChildren -P:AppKit.NSPopover.AccessibilitySelectedColumns -P:AppKit.NSPopover.AccessibilitySelectedRows -P:AppKit.NSPopover.AccessibilitySelectedText -P:AppKit.NSPopover.AccessibilitySelectedTextRange -P:AppKit.NSPopover.AccessibilitySelectedTextRanges -P:AppKit.NSPopover.AccessibilityServesAsTitleForUIElements -P:AppKit.NSPopover.AccessibilitySharedCharacterRange -P:AppKit.NSPopover.AccessibilitySharedFocusElements -P:AppKit.NSPopover.AccessibilitySharedTextUIElements -P:AppKit.NSPopover.AccessibilityShownMenu -P:AppKit.NSPopover.AccessibilitySortDirection -P:AppKit.NSPopover.AccessibilitySplitters -P:AppKit.NSPopover.AccessibilitySubrole -P:AppKit.NSPopover.AccessibilityTabs -P:AppKit.NSPopover.AccessibilityTitle -P:AppKit.NSPopover.AccessibilityTitleUIElement -P:AppKit.NSPopover.AccessibilityToolbarButton -P:AppKit.NSPopover.AccessibilityTopLevelUIElement -P:AppKit.NSPopover.AccessibilityUnitDescription -P:AppKit.NSPopover.AccessibilityUnits -P:AppKit.NSPopover.AccessibilityUrl -P:AppKit.NSPopover.AccessibilityUserInputLabels -P:AppKit.NSPopover.AccessibilityValue -P:AppKit.NSPopover.AccessibilityValueDescription -P:AppKit.NSPopover.AccessibilityVerticalScrollBar -P:AppKit.NSPopover.AccessibilityVerticalUnitDescription -P:AppKit.NSPopover.AccessibilityVerticalUnits -P:AppKit.NSPopover.AccessibilityVisibleCells -P:AppKit.NSPopover.AccessibilityVisibleCharacterRange -P:AppKit.NSPopover.AccessibilityVisibleChildren -P:AppKit.NSPopover.AccessibilityVisibleColumns -P:AppKit.NSPopover.AccessibilityVisibleRows -P:AppKit.NSPopover.AccessibilityWarningValue -P:AppKit.NSPopover.AccessibilityWindow -P:AppKit.NSPopover.AccessibilityWindows -P:AppKit.NSPopover.AccessibilityZoomButton P:AppKit.NSPopover.AnnouncementRequestedNotification P:AppKit.NSPopover.ApplicationActivatedNotification P:AppKit.NSPopover.ApplicationDeactivatedNotification @@ -56561,22 +49632,11 @@ P:AppKit.NSPopUpButton.Cell P:AppKit.NSPopUpButton.WillPopUpNotification P:AppKit.NSPopUpButtonCell.Item(System.IntPtr) P:AppKit.NSPopUpButtonCell.Item(System.String) -P:AppKit.NSPopUpButtonCell.ObjectValue P:AppKit.NSPopUpButtonCell.WillPopUpNotification -P:AppKit.NSPreviewRepresentingActivityItem.IconProvider -P:AppKit.NSPreviewRepresentingActivityItem.ImageProvider -P:AppKit.NSPreviewRepresentingActivityItem.Item -P:AppKit.NSPreviewRepresentingActivityItem.Title P:AppKit.NSPrintInfo.HorizontallyCentered P:AppKit.NSPrintInfo.SelectionOnly P:AppKit.NSPrintInfo.VerticallyCentered P:AppKit.NSPrintOperation.IsCopyingOperation -P:AppKit.NSProgressIndicator.AccessibilityFocused -P:AppKit.NSProgressIndicator.AccessibilityFrame -P:AppKit.NSProgressIndicator.AccessibilityIdentifier -P:AppKit.NSProgressIndicator.AccessibilityParent -P:AppKit.NSProgressIndicator.AccessibilityValue -P:AppKit.NSProgressIndicator.Bezeled P:AppKit.NSProgressIndicator.Indeterminate P:AppKit.NSProgressIndicator.IsDisplayedWhenStopped P:AppKit.NSRuleEditor.ChildForCriterion @@ -56589,7 +49649,6 @@ P:AppKit.NSRuleEditor.RowsDidChangeNotification P:AppKit.NSRulerMarker.IsDragging P:AppKit.NSRulerMarker.Movable P:AppKit.NSRulerMarker.Removable -P:AppKit.NSRulerView.IsFlipped P:AppKit.NSRulerView.WeakMeasurementUnits P:AppKit.NSRunningApplication.Active P:AppKit.NSRunningApplication.FinishedLaunching @@ -56612,14 +49671,12 @@ P:AppKit.NSScroller.PreferredStyleChangedNotification P:AppKit.NSScrollView.DidEndLiveMagnifyNotification P:AppKit.NSScrollView.DidEndLiveScrollNotification P:AppKit.NSScrollView.DidLiveScrollNotification -P:AppKit.NSScrollView.FindBarView P:AppKit.NSScrollView.FindBarVisible P:AppKit.NSScrollView.WillStartLiveMagnifyNotification P:AppKit.NSScrollView.WillStartLiveScrollNotification P:AppKit.NSScrubber.Continuous P:AppKit.NSScrubberArrangedView.Highlighted P:AppKit.NSScrubberArrangedView.Selected -P:AppKit.NSSearchField.Cell P:AppKit.NSSearchField.Delegate P:AppKit.NSSegmentBackgroundStyle_NSSegmentedCell.SharingServiceNameAddToAperture P:AppKit.NSSegmentBackgroundStyle_NSSegmentedCell.SharingServiceNameAddToIPhoto @@ -56639,7 +49696,6 @@ P:AppKit.NSSegmentBackgroundStyle_NSSegmentedCell.SharingServiceNameUseAsTwitter P:AppKit.NSSegmentedControl.Cell P:AppKit.NSSegmentedControl.IsSpringLoaded P:AppKit.NSShadow.ShadowBlurRadius -P:AppKit.NSShadow.ShadowColor P:AppKit.NSShadow.ShadowOffset P:AppKit.NSSharingService.CreateAnchoringView P:AppKit.NSSharingService.Delegate @@ -56658,137 +49714,20 @@ P:AppKit.NSSharingServicePickerToolbarItem.ActivityItemsConfiguration P:AppKit.NSSharingServicePickerToolbarItem.Delegate P:AppKit.NSSharingServicePickerTouchBarItem.ActivityItemsConfiguration P:AppKit.NSSharingServicePickerTouchBarItem.Enabled -P:AppKit.NSSlider.AccessibilityFocused -P:AppKit.NSSlider.AccessibilityFrame -P:AppKit.NSSlider.AccessibilityIdentifier -P:AppKit.NSSlider.AccessibilityLabel -P:AppKit.NSSlider.AccessibilityParent -P:AppKit.NSSlider.AccessibilityValue -P:AppKit.NSSlider.IsVertical -P:AppKit.NSSliderAccessory.AccessibilityActivationPoint -P:AppKit.NSSliderAccessory.AccessibilityAllowedValues -P:AppKit.NSSliderAccessory.AccessibilityAlternateUIVisible -P:AppKit.NSSliderAccessory.AccessibilityApplicationFocusedUIElement -P:AppKit.NSSliderAccessory.AccessibilityAttributedUserInputLabels -P:AppKit.NSSliderAccessory.AccessibilityCancelButton -P:AppKit.NSSliderAccessory.AccessibilityChildren -P:AppKit.NSSliderAccessory.AccessibilityChildrenInNavigationOrder -P:AppKit.NSSliderAccessory.AccessibilityClearButton -P:AppKit.NSSliderAccessory.AccessibilityCloseButton -P:AppKit.NSSliderAccessory.AccessibilityColumnCount -P:AppKit.NSSliderAccessory.AccessibilityColumnHeaderUIElements -P:AppKit.NSSliderAccessory.AccessibilityColumnIndexRange -P:AppKit.NSSliderAccessory.AccessibilityColumns -P:AppKit.NSSliderAccessory.AccessibilityColumnTitles -P:AppKit.NSSliderAccessory.AccessibilityContents -P:AppKit.NSSliderAccessory.AccessibilityCriticalValue -P:AppKit.NSSliderAccessory.AccessibilityCustomActions -P:AppKit.NSSliderAccessory.AccessibilityCustomRotors -P:AppKit.NSSliderAccessory.AccessibilityDecrementButton -P:AppKit.NSSliderAccessory.AccessibilityDefaultButton P:AppKit.NSSliderAccessory.AccessibilityDisclosed -P:AppKit.NSSliderAccessory.AccessibilityDisclosedByRow -P:AppKit.NSSliderAccessory.AccessibilityDisclosedRows -P:AppKit.NSSliderAccessory.AccessibilityDisclosureLevel -P:AppKit.NSSliderAccessory.AccessibilityDocument P:AppKit.NSSliderAccessory.AccessibilityEdited P:AppKit.NSSliderAccessory.AccessibilityElement P:AppKit.NSSliderAccessory.AccessibilityEnabled P:AppKit.NSSliderAccessory.AccessibilityExpanded -P:AppKit.NSSliderAccessory.AccessibilityExtrasMenuBar -P:AppKit.NSSliderAccessory.AccessibilityFilename -P:AppKit.NSSliderAccessory.AccessibilityFocused -P:AppKit.NSSliderAccessory.AccessibilityFocusedWindow -P:AppKit.NSSliderAccessory.AccessibilityFrame P:AppKit.NSSliderAccessory.AccessibilityFrontmost -P:AppKit.NSSliderAccessory.AccessibilityFullScreenButton -P:AppKit.NSSliderAccessory.AccessibilityGrowArea -P:AppKit.NSSliderAccessory.AccessibilityHandles -P:AppKit.NSSliderAccessory.AccessibilityHeader -P:AppKit.NSSliderAccessory.AccessibilityHelp P:AppKit.NSSliderAccessory.AccessibilityHidden -P:AppKit.NSSliderAccessory.AccessibilityHorizontalScrollBar -P:AppKit.NSSliderAccessory.AccessibilityHorizontalUnitDescription -P:AppKit.NSSliderAccessory.AccessibilityHorizontalUnits -P:AppKit.NSSliderAccessory.AccessibilityIdentifier -P:AppKit.NSSliderAccessory.AccessibilityIncrementButton -P:AppKit.NSSliderAccessory.AccessibilityIndex -P:AppKit.NSSliderAccessory.AccessibilityInsertionPointLineNumber -P:AppKit.NSSliderAccessory.AccessibilityLabel -P:AppKit.NSSliderAccessory.AccessibilityLabelUIElements -P:AppKit.NSSliderAccessory.AccessibilityLabelValue -P:AppKit.NSSliderAccessory.AccessibilityLinkedUIElements P:AppKit.NSSliderAccessory.AccessibilityMain -P:AppKit.NSSliderAccessory.AccessibilityMainWindow -P:AppKit.NSSliderAccessory.AccessibilityMarkerGroupUIElement -P:AppKit.NSSliderAccessory.AccessibilityMarkerTypeDescription -P:AppKit.NSSliderAccessory.AccessibilityMarkerUIElements -P:AppKit.NSSliderAccessory.AccessibilityMarkerValues -P:AppKit.NSSliderAccessory.AccessibilityMaxValue -P:AppKit.NSSliderAccessory.AccessibilityMenuBar -P:AppKit.NSSliderAccessory.AccessibilityMinimizeButton P:AppKit.NSSliderAccessory.AccessibilityMinimized -P:AppKit.NSSliderAccessory.AccessibilityMinValue P:AppKit.NSSliderAccessory.AccessibilityModal -P:AppKit.NSSliderAccessory.AccessibilityNextContents -P:AppKit.NSSliderAccessory.AccessibilityNumberOfCharacters P:AppKit.NSSliderAccessory.AccessibilityOrderedByRow -P:AppKit.NSSliderAccessory.AccessibilityOrientation -P:AppKit.NSSliderAccessory.AccessibilityOverflowButton -P:AppKit.NSSliderAccessory.AccessibilityParent -P:AppKit.NSSliderAccessory.AccessibilityPlaceholderValue -P:AppKit.NSSliderAccessory.AccessibilityPreviousContents P:AppKit.NSSliderAccessory.AccessibilityProtectedContent -P:AppKit.NSSliderAccessory.AccessibilityProxy P:AppKit.NSSliderAccessory.AccessibilityRequired -P:AppKit.NSSliderAccessory.AccessibilityRole -P:AppKit.NSSliderAccessory.AccessibilityRoleDescription -P:AppKit.NSSliderAccessory.AccessibilityRowCount -P:AppKit.NSSliderAccessory.AccessibilityRowHeaderUIElements -P:AppKit.NSSliderAccessory.AccessibilityRowIndexRange -P:AppKit.NSSliderAccessory.AccessibilityRows -P:AppKit.NSSliderAccessory.AccessibilityRulerMarkerType -P:AppKit.NSSliderAccessory.AccessibilitySearchButton -P:AppKit.NSSliderAccessory.AccessibilitySearchMenu P:AppKit.NSSliderAccessory.AccessibilitySelected -P:AppKit.NSSliderAccessory.AccessibilitySelectedCells -P:AppKit.NSSliderAccessory.AccessibilitySelectedChildren -P:AppKit.NSSliderAccessory.AccessibilitySelectedColumns -P:AppKit.NSSliderAccessory.AccessibilitySelectedRows -P:AppKit.NSSliderAccessory.AccessibilitySelectedText -P:AppKit.NSSliderAccessory.AccessibilitySelectedTextRange -P:AppKit.NSSliderAccessory.AccessibilitySelectedTextRanges -P:AppKit.NSSliderAccessory.AccessibilityServesAsTitleForUIElements -P:AppKit.NSSliderAccessory.AccessibilitySharedCharacterRange -P:AppKit.NSSliderAccessory.AccessibilitySharedFocusElements -P:AppKit.NSSliderAccessory.AccessibilitySharedTextUIElements -P:AppKit.NSSliderAccessory.AccessibilityShownMenu -P:AppKit.NSSliderAccessory.AccessibilitySortDirection -P:AppKit.NSSliderAccessory.AccessibilitySplitters -P:AppKit.NSSliderAccessory.AccessibilitySubrole -P:AppKit.NSSliderAccessory.AccessibilityTabs -P:AppKit.NSSliderAccessory.AccessibilityTitle -P:AppKit.NSSliderAccessory.AccessibilityTitleUIElement -P:AppKit.NSSliderAccessory.AccessibilityToolbarButton -P:AppKit.NSSliderAccessory.AccessibilityTopLevelUIElement -P:AppKit.NSSliderAccessory.AccessibilityUnitDescription -P:AppKit.NSSliderAccessory.AccessibilityUnits -P:AppKit.NSSliderAccessory.AccessibilityUrl -P:AppKit.NSSliderAccessory.AccessibilityUserInputLabels -P:AppKit.NSSliderAccessory.AccessibilityValue -P:AppKit.NSSliderAccessory.AccessibilityValueDescription -P:AppKit.NSSliderAccessory.AccessibilityVerticalScrollBar -P:AppKit.NSSliderAccessory.AccessibilityVerticalUnitDescription -P:AppKit.NSSliderAccessory.AccessibilityVerticalUnits -P:AppKit.NSSliderAccessory.AccessibilityVisibleCells -P:AppKit.NSSliderAccessory.AccessibilityVisibleCharacterRange -P:AppKit.NSSliderAccessory.AccessibilityVisibleChildren -P:AppKit.NSSliderAccessory.AccessibilityVisibleColumns -P:AppKit.NSSliderAccessory.AccessibilityVisibleRows -P:AppKit.NSSliderAccessory.AccessibilityWarningValue -P:AppKit.NSSliderAccessory.AccessibilityWindow -P:AppKit.NSSliderAccessory.AccessibilityWindows -P:AppKit.NSSliderAccessory.AccessibilityZoomButton P:AppKit.NSSliderAccessory.AnnouncementRequestedNotification P:AppKit.NSSliderAccessory.ApplicationActivatedNotification P:AppKit.NSSliderAccessory.ApplicationDeactivatedNotification @@ -56825,7 +49764,6 @@ P:AppKit.NSSliderAccessory.WindowDeminiaturizedNotification P:AppKit.NSSliderAccessory.WindowMiniaturizedNotification P:AppKit.NSSliderAccessory.WindowMovedNotification P:AppKit.NSSliderAccessory.WindowResizedNotification -P:AppKit.NSSliderCell.IsVertical P:AppKit.NSSound.Delegate P:AppKit.NSSound.Name P:AppKit.NSSoundFinishedEventArgs.Finished @@ -56861,25 +49799,15 @@ P:AppKit.NSSpellChecker.TextCheckingSelectedRangeKey P:AppKit.NSSpellCheckerCandidates.Arg1 P:AppKit.NSSpellCheckerCandidates.Arg2 P:AppKit.NSSplitView.Delegate -P:AppKit.NSSplitView.IsVertical P:AppKit.NSSplitView.NSSplitViewDidResizeSubviewsNotification P:AppKit.NSSplitView.NSSplitViewWillResizeSubviewsNotification P:AppKit.NSSplitViewController.AutomaticDimension -P:AppKit.NSSplitViewItem.Animations -P:AppKit.NSSplitViewItem.Animator P:AppKit.NSSplitViewItem.Collapsed P:AppKit.NSSplitViewItem.SpringLoaded P:AppKit.NSSplitViewItem.UnspecifiedDimension P:AppKit.NSStackView.Delegate -P:AppKit.NSStatusBar.IsVertical P:AppKit.NSStatusItem.Enabled P:AppKit.NSStatusItem.Visible -P:AppKit.NSStepper.AccessibilityFocused -P:AppKit.NSStepper.AccessibilityFrame -P:AppKit.NSStepper.AccessibilityIdentifier -P:AppKit.NSStepper.AccessibilityLabel -P:AppKit.NSStepper.AccessibilityParent -P:AppKit.NSStepper.AccessibilityValue P:AppKit.NSStringAttributeKey.AdaptiveImageGlyph P:AppKit.NSStringAttributeKey.Attachment P:AppKit.NSStringAttributeKey.BackgroundColor @@ -56945,20 +49873,8 @@ P:AppKit.NSStringAttributes.WritingDirection P:AppKit.NSStringDrawingContext.ActualScaleFactor P:AppKit.NSStringDrawingContext.MinimumScaleFactor P:AppKit.NSStringDrawingContext.TotalBounds -P:AppKit.NSSwitch.AccessibilityFocused -P:AppKit.NSSwitch.AccessibilityFrame -P:AppKit.NSSwitch.AccessibilityIdentifier -P:AppKit.NSSwitch.AccessibilityLabel -P:AppKit.NSSwitch.AccessibilityParent -P:AppKit.NSSwitch.AccessibilityValue P:AppKit.NSTableColumn.Editable P:AppKit.NSTableColumn.Hidden -P:AppKit.NSTableRowView.AccessibilityDisclosureLevel -P:AppKit.NSTableRowView.AccessibilityFocused -P:AppKit.NSTableRowView.AccessibilityFrame -P:AppKit.NSTableRowView.AccessibilityIdentifier -P:AppKit.NSTableRowView.AccessibilityIndex -P:AppKit.NSTableRowView.AccessibilityParent P:AppKit.NSTableRowView.Emphasized P:AppKit.NSTableRowView.Floating P:AppKit.NSTableRowView.GroupRowStyle @@ -56966,22 +49882,6 @@ P:AppKit.NSTableRowView.NextRowSelected P:AppKit.NSTableRowView.PreviousRowSelected P:AppKit.NSTableRowView.Selected P:AppKit.NSTableRowView.TargetForDropOperation -P:AppKit.NSTableView.AccessibilityColumnHeaderUIElements -P:AppKit.NSTableView.AccessibilityColumns -P:AppKit.NSTableView.AccessibilityFocused -P:AppKit.NSTableView.AccessibilityFrame -P:AppKit.NSTableView.AccessibilityHeaderGroup -P:AppKit.NSTableView.AccessibilityIdentifier -P:AppKit.NSTableView.AccessibilityLabel -P:AppKit.NSTableView.AccessibilityParent -P:AppKit.NSTableView.AccessibilityRowHeaderUIElements -P:AppKit.NSTableView.AccessibilityRows -P:AppKit.NSTableView.AccessibilitySelectedCells -P:AppKit.NSTableView.AccessibilitySelectedColumns -P:AppKit.NSTableView.AccessibilitySelectedRows -P:AppKit.NSTableView.AccessibilityVisibleCells -P:AppKit.NSTableView.AccessibilityVisibleColumns -P:AppKit.NSTableView.AccessibilityVisibleRows P:AppKit.NSTableView.ColumnDidMoveNotification P:AppKit.NSTableView.ColumnDidResizeNotification P:AppKit.NSTableView.CoreGetRowView @@ -56995,7 +49895,6 @@ P:AppKit.NSTableView.GetSelectString P:AppKit.NSTableView.GetSizeToFitColumnWidth P:AppKit.NSTableView.GetToolTip P:AppKit.NSTableView.GetViewForItem -P:AppKit.NSTableView.IgnoreModifierKeysWhileDragging P:AppKit.NSTableView.IsGroupRow P:AppKit.NSTableView.RowActions P:AppKit.NSTableView.RowViewKey @@ -57038,18 +49937,12 @@ P:AppKit.NSText.VerticallyResizable P:AppKit.NSTextAlternatives.SelectedAlternativeStringNotification P:AppKit.NSTextAlternativesSelectedAlternativeStringEventArgs.AlternativeString P:AppKit.NSTextAttachment.AllowsTextAttachmentView -P:AppKit.NSTextAttachment.Bounds -P:AppKit.NSTextAttachment.Contents -P:AppKit.NSTextAttachment.FileType P:AppKit.NSTextAttachment.FileWrapper -P:AppKit.NSTextAttachment.Image P:AppKit.NSTextAttachment.LineLayoutPadding P:AppKit.NSTextAttachment.UsesTextAttachmentView P:AppKit.NSTextAttachmentViewProvider.Location P:AppKit.NSTextAttachmentViewProvider.TextAttachment -P:AppKit.NSTextAttachmentViewProvider.TextLayoutManager P:AppKit.NSTextAttachmentViewProvider.TracksTextAttachmentViewBounds -P:AppKit.NSTextAttachmentViewProvider.View P:AppKit.NSTextCheckingOptions.DocumentAuthor P:AppKit.NSTextCheckingOptions.DocumentTitle P:AppKit.NSTextCheckingOptions.DocumentUrl @@ -57061,13 +49954,7 @@ P:AppKit.NSTextCheckingOptions.Replacements P:AppKit.NSTextContainer.ExclusionPaths P:AppKit.NSTextContainer.HeightTracksTextView P:AppKit.NSTextContainer.IsSimpleRectangularTextContainer -P:AppKit.NSTextContainer.LayoutManager P:AppKit.NSTextContainer.LayoutOrientation -P:AppKit.NSTextContainer.LineBreakMode -P:AppKit.NSTextContainer.LineFragmentPadding -P:AppKit.NSTextContainer.MaximumNumberOfLines -P:AppKit.NSTextContainer.Size -P:AppKit.NSTextContainer.TextLayoutManager P:AppKit.NSTextContainer.WidthTracksTextView P:AppKit.NSTextContentManager.AutomaticallySynchronizesTextLayoutManagers P:AppKit.NSTextContentManager.AutomaticallySynchronizesToBackingStore @@ -57077,25 +49964,13 @@ P:AppKit.NSTextContentManager.HasEditingTransaction P:AppKit.NSTextContentManager.PrimaryTextLayoutManager P:AppKit.NSTextContentManager.StorageUnsupportedAttributeAddedNotification P:AppKit.NSTextContentManager.TextLayoutManagers -P:AppKit.NSTextContentManager.WeakDelegate -P:AppKit.NSTextContentStorage.AttributedString P:AppKit.NSTextContentStorage.Delegate -P:AppKit.NSTextContentStorage.TextStorage -P:AppKit.NSTextContentStorage.WeakDelegate P:AppKit.NSTextDidEndEditingEventArgs.Movement P:AppKit.NSTextElement.ChildElements P:AppKit.NSTextElement.ElementRange P:AppKit.NSTextElement.IsRepresentedElement P:AppKit.NSTextElement.ParentElement P:AppKit.NSTextElement.TextContentManager -P:AppKit.NSTextField.AccessibilityFocused -P:AppKit.NSTextField.AccessibilityFrame -P:AppKit.NSTextField.AccessibilityIdentifier -P:AppKit.NSTextField.AccessibilityParent -P:AppKit.NSTextField.AccessibilityValue -P:AppKit.NSTextField.AccessibilityVisibleCharacterRange -P:AppKit.NSTextField.Bezeled -P:AppKit.NSTextField.Bordered P:AppKit.NSTextField.Cell P:AppKit.NSTextField.ContentType P:AppKit.NSTextField.Delegate @@ -57113,49 +49988,27 @@ P:AppKit.NSTextField.TextShouldEndEditing P:AppKit.NSTextFinder.Client P:AppKit.NSTextFinder.FindBarContainer P:AppKit.NSTextFinder.IncrementalSearchingEnabled -P:AppKit.NSTextFinderBarContainer.ContentView -P:AppKit.NSTextFinderBarContainer.FindBarView P:AppKit.NSTextFinderBarContainer.FindBarVisible -P:AppKit.NSTextInputClient.AttributedString -P:AppKit.NSTextInputClient.DocumentVisibleRect -P:AppKit.NSTextInputClient.HasMarkedText -P:AppKit.NSTextInputClient.MarkedRange -P:AppKit.NSTextInputClient.PreferredTextAccessoryPlacement -P:AppKit.NSTextInputClient.SelectedRange -P:AppKit.NSTextInputClient.SupportsAdaptiveImageGlyph -P:AppKit.NSTextInputClient.UnionRectInVisibleSelectedRange -P:AppKit.NSTextInputClient.ValidAttributesForMarkedText -P:AppKit.NSTextInputClient.WindowLevel P:AppKit.NSTextInputContext.KeyboardSelectionDidChangeNotification -P:AppKit.NSTextLayoutFragment.BottomMargin P:AppKit.NSTextLayoutFragment.LayoutFragmentFrame P:AppKit.NSTextLayoutFragment.LayoutQueue -P:AppKit.NSTextLayoutFragment.LeadingPadding P:AppKit.NSTextLayoutFragment.RangeInElement P:AppKit.NSTextLayoutFragment.RenderingSurfaceBounds -P:AppKit.NSTextLayoutFragment.State P:AppKit.NSTextLayoutFragment.TextAttachmentViewProviders P:AppKit.NSTextLayoutFragment.TextElement -P:AppKit.NSTextLayoutFragment.TextLayoutManager P:AppKit.NSTextLayoutFragment.TextLineFragments -P:AppKit.NSTextLayoutFragment.TopMargin -P:AppKit.NSTextLayoutFragment.TrailingPadding P:AppKit.NSTextLayoutManager.Delegate P:AppKit.NSTextLayoutManager.DocumentRange P:AppKit.NSTextLayoutManager.LayoutQueue P:AppKit.NSTextLayoutManager.LimitsLayoutForSuspiciousContents P:AppKit.NSTextLayoutManager.LinkRenderingAttributes P:AppKit.NSTextLayoutManager.RenderingAttributesValidator -P:AppKit.NSTextLayoutManager.TextContainer P:AppKit.NSTextLayoutManager.TextContentManager P:AppKit.NSTextLayoutManager.TextSelectionNavigation P:AppKit.NSTextLayoutManager.TextSelections P:AppKit.NSTextLayoutManager.TextViewportLayoutController P:AppKit.NSTextLayoutManager.UsageBoundsForTextContainer -P:AppKit.NSTextLayoutManager.UsesFontLeading P:AppKit.NSTextLayoutManager.UsesHyphenation -P:AppKit.NSTextLayoutManager.WeakDelegate -P:AppKit.NSTextLineFragment.AttributedString P:AppKit.NSTextLineFragment.CharacterRange P:AppKit.NSTextLineFragment.GlyphOrigin P:AppKit.NSTextLineFragment.TypographicBounds @@ -57164,13 +50017,10 @@ P:AppKit.NSTextList.ListOptions P:AppKit.NSTextList.MarkerFormat P:AppKit.NSTextList.Ordered P:AppKit.NSTextList.StartingItemNumber -P:AppKit.NSTextListElement.AttributedString P:AppKit.NSTextListElement.ChildElements -P:AppKit.NSTextListElement.Contents P:AppKit.NSTextListElement.ParentElement P:AppKit.NSTextListElement.TextList P:AppKit.NSTextListElement.WeakMarkerAttributes -P:AppKit.NSTextParagraph.AttributedString P:AppKit.NSTextParagraph.ParagraphContentRange P:AppKit.NSTextParagraph.ParagraphSeparatorRange P:AppKit.NSTextRange.Empty @@ -57183,7 +50033,6 @@ P:AppKit.NSTextSelection.Logical P:AppKit.NSTextSelection.SecondarySelectionLocation P:AppKit.NSTextSelection.TextRanges P:AppKit.NSTextSelection.Transient -P:AppKit.NSTextSelection.TypingAttributes P:AppKit.NSTextSelectionDataSource.DocumentRange P:AppKit.NSTextSelectionNavigation.AllowsNonContiguousRanges P:AppKit.NSTextSelectionNavigation.RotatesCoordinateSystemForLayoutOrientation @@ -57196,21 +50045,11 @@ P:AppKit.NSTextStorage.EditedRange P:AppKit.NSTextStorage.FixesAttributesLazily P:AppKit.NSTextStorage.LayoutManagers P:AppKit.NSTextStorage.TextStorageObserver -P:AppKit.NSTextStorage.WeakDelegate P:AppKit.NSTextStorageEventArgs.Delta P:AppKit.NSTextStorageEventArgs.EditedMask P:AppKit.NSTextStorageEventArgs.EditedRange -P:AppKit.NSTextTab.Alignment P:AppKit.NSTextTab.ColumnTerminatorsAttributeName P:AppKit.NSTextTab.Location -P:AppKit.NSTextTab.Options -P:AppKit.NSTextView.AccessibilityFocused -P:AppKit.NSTextView.AccessibilityFrame -P:AppKit.NSTextView.AccessibilityIdentifier -P:AppKit.NSTextView.AccessibilityParent -P:AppKit.NSTextView.AccessibilityValue -P:AppKit.NSTextView.AccessibilityVisibleCharacterRange -P:AppKit.NSTextView.AttributedString P:AppKit.NSTextView.AutomaticDashSubstitutionEnabled P:AppKit.NSTextView.AutomaticDataDetectionEnabled P:AppKit.NSTextView.AutomaticLinkDetectionEnabled @@ -57220,14 +50059,12 @@ P:AppKit.NSTextView.AutomaticTextCompletionEnabled P:AppKit.NSTextView.AutomaticTextReplacementEnabled P:AppKit.NSTextView.ContentType P:AppKit.NSTextView.ContinuousSpellCheckingEnabled -P:AppKit.NSTextView.ConversationIdentifier P:AppKit.NSTextView.Delegate P:AppKit.NSTextView.DidChangeSelectionNotification P:AppKit.NSTextView.DidChangeTypingAttributesNotification P:AppKit.NSTextView.DidCheckText P:AppKit.NSTextView.DidSwitchToNSLayoutManagerNotification P:AppKit.NSTextView.DoCommandBySelector -P:AppKit.NSTextView.DocumentVisibleRect P:AppKit.NSTextView.Editable P:AppKit.NSTextView.FieldEditor P:AppKit.NSTextView.GetCandidates @@ -57237,14 +50074,10 @@ P:AppKit.NSTextView.GetUndoManager P:AppKit.NSTextView.GetWritablePasteboardTypes P:AppKit.NSTextView.GetWritingToolsIgnoredRangesInEnclosingRange P:AppKit.NSTextView.GrammarCheckingEnabled -P:AppKit.NSTextView.HasMarkedText -P:AppKit.NSTextView.IgnoreModifierKeysWhileDragging P:AppKit.NSTextView.IsIncrementalSearchingEnabled P:AppKit.NSTextView.LayoutOrientation P:AppKit.NSTextView.LinkClicked -P:AppKit.NSTextView.MarkedRange P:AppKit.NSTextView.MenuForEvent -P:AppKit.NSTextView.PreferredTextAccessoryPlacement P:AppKit.NSTextView.RichText P:AppKit.NSTextView.RulerVisible P:AppKit.NSTextView.Selectable @@ -57254,16 +50087,12 @@ P:AppKit.NSTextView.ShouldChangeTypingAttributes P:AppKit.NSTextView.ShouldSelectCandidates P:AppKit.NSTextView.ShouldSetSpellingState P:AppKit.NSTextView.ShouldUpdateTouchBarItemIdentifiers -P:AppKit.NSTextView.SupportsAdaptiveImageGlyph -P:AppKit.NSTextView.UnionRectInVisibleSelectedRange -P:AppKit.NSTextView.ValidAttributesForMarkedText P:AppKit.NSTextView.WillChangeNotifyingTextViewNotification P:AppKit.NSTextView.WillChangeSelection P:AppKit.NSTextView.WillChangeSelectionFromRanges P:AppKit.NSTextView.WillCheckText P:AppKit.NSTextView.WillDisplayToolTip P:AppKit.NSTextView.WillSwitchToNSLayoutManagerNotification -P:AppKit.NSTextView.WindowLevel P:AppKit.NSTextView.WriteCell P:AppKit.NSTextView.WritingToolsActive P:AppKit.NSTextViewClickedEventArgs.Cell @@ -57278,14 +50107,10 @@ P:AppKit.NSTextViewDraggedCellEventArgs.CharIndex P:AppKit.NSTextViewDraggedCellEventArgs.Rect P:AppKit.NSTextViewDraggedCellEventArgs.TheEvent P:AppKit.NSTextViewportLayoutController.Delegate -P:AppKit.NSTextViewportLayoutController.TextLayoutManager P:AppKit.NSTextViewportLayoutController.ViewportBounds P:AppKit.NSTextViewportLayoutController.ViewportRange -P:AppKit.NSTextViewportLayoutController.WeakDelegate P:AppKit.NSTextViewWillChangeNotifyingTextViewEventArgs.NewView P:AppKit.NSTextViewWillChangeNotifyingTextViewEventArgs.OldView -P:AppKit.NSTitlebarAccessoryViewController.Animations -P:AppKit.NSTitlebarAccessoryViewController.Animator P:AppKit.NSTitlebarAccessoryViewController.IsHidden P:AppKit.NSTokenField.Delegate P:AppKit.NSTokenFieldCell.Delegate @@ -57315,7 +50140,6 @@ P:AppKit.NSToolbar.SelectableItemIdentifiers P:AppKit.NSToolbar.SupplementarySidebarTrackingSeparatorItemIdentifier P:AppKit.NSToolbar.Visible P:AppKit.NSToolbar.WillInsertItem -P:AppKit.NSToolbarItem.Bordered P:AppKit.NSToolbarItem.Enabled P:AppKit.NSToolbarItem.Hidden P:AppKit.NSToolbarItem.ItemMenuFormRepresentation @@ -57332,139 +50156,21 @@ P:AppKit.NSTreeController.SelectionIndexPath P:AppKit.NSTreeController.SelectionIndexPaths P:AppKit.NSTreeNode.IsLeaf P:AppKit.NSUserInterfaceCompressionOptions.Empty -P:AppKit.NSView.AccessibilityActionNames -P:AppKit.NSView.AccessibilityActivationPoint -P:AppKit.NSView.AccessibilityAllowedValues -P:AppKit.NSView.AccessibilityAlternateUIVisible -P:AppKit.NSView.AccessibilityApplicationFocusedUIElement -P:AppKit.NSView.AccessibilityAttributedUserInputLabels -P:AppKit.NSView.AccessibilityAttributeNames -P:AppKit.NSView.AccessibilityCancelButton -P:AppKit.NSView.AccessibilityChildren -P:AppKit.NSView.AccessibilityChildrenInNavigationOrder -P:AppKit.NSView.AccessibilityClearButton -P:AppKit.NSView.AccessibilityCloseButton -P:AppKit.NSView.AccessibilityColumnCount -P:AppKit.NSView.AccessibilityColumnHeaderUIElements -P:AppKit.NSView.AccessibilityColumnIndexRange -P:AppKit.NSView.AccessibilityColumns -P:AppKit.NSView.AccessibilityColumnTitles -P:AppKit.NSView.AccessibilityContents -P:AppKit.NSView.AccessibilityCriticalValue -P:AppKit.NSView.AccessibilityCustomActions -P:AppKit.NSView.AccessibilityCustomRotors -P:AppKit.NSView.AccessibilityDecrementButton -P:AppKit.NSView.AccessibilityDefaultButton P:AppKit.NSView.AccessibilityDisclosed -P:AppKit.NSView.AccessibilityDisclosedByRow -P:AppKit.NSView.AccessibilityDisclosedRows -P:AppKit.NSView.AccessibilityDisclosureLevel -P:AppKit.NSView.AccessibilityDocument P:AppKit.NSView.AccessibilityEdited P:AppKit.NSView.AccessibilityElement P:AppKit.NSView.AccessibilityEnabled P:AppKit.NSView.AccessibilityExpanded -P:AppKit.NSView.AccessibilityExtrasMenuBar -P:AppKit.NSView.AccessibilityFilename -P:AppKit.NSView.AccessibilityFocused -P:AppKit.NSView.AccessibilityFocusedWindow -P:AppKit.NSView.AccessibilityFrame P:AppKit.NSView.AccessibilityFrontmost -P:AppKit.NSView.AccessibilityFullScreenButton -P:AppKit.NSView.AccessibilityGrowArea -P:AppKit.NSView.AccessibilityHandles -P:AppKit.NSView.AccessibilityHeader -P:AppKit.NSView.AccessibilityHelp P:AppKit.NSView.AccessibilityHidden -P:AppKit.NSView.AccessibilityHorizontalScrollBar -P:AppKit.NSView.AccessibilityHorizontalUnitDescription -P:AppKit.NSView.AccessibilityHorizontalUnits -P:AppKit.NSView.AccessibilityIdentifier -P:AppKit.NSView.AccessibilityIncrementButton -P:AppKit.NSView.AccessibilityIndex -P:AppKit.NSView.AccessibilityInsertionPointLineNumber -P:AppKit.NSView.AccessibilityIsIgnored -P:AppKit.NSView.AccessibilityLabel -P:AppKit.NSView.AccessibilityLabelUIElements -P:AppKit.NSView.AccessibilityLabelValue -P:AppKit.NSView.AccessibilityLinkedUIElements P:AppKit.NSView.AccessibilityMain -P:AppKit.NSView.AccessibilityMainWindow -P:AppKit.NSView.AccessibilityMarkerGroupUIElement -P:AppKit.NSView.AccessibilityMarkerTypeDescription -P:AppKit.NSView.AccessibilityMarkerUIElements -P:AppKit.NSView.AccessibilityMarkerValues -P:AppKit.NSView.AccessibilityMaxValue -P:AppKit.NSView.AccessibilityMenuBar -P:AppKit.NSView.AccessibilityMinimizeButton P:AppKit.NSView.AccessibilityMinimized -P:AppKit.NSView.AccessibilityMinValue P:AppKit.NSView.AccessibilityModal -P:AppKit.NSView.AccessibilityNextContents -P:AppKit.NSView.AccessibilityNotifiesWhenDestroyed -P:AppKit.NSView.AccessibilityNumberOfCharacters P:AppKit.NSView.AccessibilityOrderedByRow -P:AppKit.NSView.AccessibilityOrientation -P:AppKit.NSView.AccessibilityOverflowButton -P:AppKit.NSView.AccessibilityParameterizedAttributeNames -P:AppKit.NSView.AccessibilityParent -P:AppKit.NSView.AccessibilityPlaceholderValue -P:AppKit.NSView.AccessibilityPreviousContents P:AppKit.NSView.AccessibilityProtectedContent -P:AppKit.NSView.AccessibilityProxy P:AppKit.NSView.AccessibilityRequired -P:AppKit.NSView.AccessibilityRole -P:AppKit.NSView.AccessibilityRoleDescription -P:AppKit.NSView.AccessibilityRowCount -P:AppKit.NSView.AccessibilityRowHeaderUIElements -P:AppKit.NSView.AccessibilityRowIndexRange -P:AppKit.NSView.AccessibilityRows -P:AppKit.NSView.AccessibilityRulerMarkerType -P:AppKit.NSView.AccessibilitySearchButton -P:AppKit.NSView.AccessibilitySearchMenu P:AppKit.NSView.AccessibilitySelected -P:AppKit.NSView.AccessibilitySelectedCells -P:AppKit.NSView.AccessibilitySelectedChildren -P:AppKit.NSView.AccessibilitySelectedColumns -P:AppKit.NSView.AccessibilitySelectedRows -P:AppKit.NSView.AccessibilitySelectedText -P:AppKit.NSView.AccessibilitySelectedTextRange -P:AppKit.NSView.AccessibilitySelectedTextRanges -P:AppKit.NSView.AccessibilityServesAsTitleForUIElements -P:AppKit.NSView.AccessibilitySharedCharacterRange -P:AppKit.NSView.AccessibilitySharedFocusElements -P:AppKit.NSView.AccessibilitySharedTextUIElements -P:AppKit.NSView.AccessibilityShownMenu -P:AppKit.NSView.AccessibilitySortDirection -P:AppKit.NSView.AccessibilitySplitters -P:AppKit.NSView.AccessibilitySubrole -P:AppKit.NSView.AccessibilityTabs -P:AppKit.NSView.AccessibilityTitle -P:AppKit.NSView.AccessibilityTitleUIElement -P:AppKit.NSView.AccessibilityToolbarButton -P:AppKit.NSView.AccessibilityTopLevelUIElement -P:AppKit.NSView.AccessibilityUnitDescription -P:AppKit.NSView.AccessibilityUnits -P:AppKit.NSView.AccessibilityUrl -P:AppKit.NSView.AccessibilityUserInputLabels -P:AppKit.NSView.AccessibilityValue -P:AppKit.NSView.AccessibilityValueDescription -P:AppKit.NSView.AccessibilityVerticalScrollBar -P:AppKit.NSView.AccessibilityVerticalUnitDescription -P:AppKit.NSView.AccessibilityVerticalUnits -P:AppKit.NSView.AccessibilityVisibleCells -P:AppKit.NSView.AccessibilityVisibleCharacterRange -P:AppKit.NSView.AccessibilityVisibleChildren -P:AppKit.NSView.AccessibilityVisibleColumns -P:AppKit.NSView.AccessibilityVisibleRows -P:AppKit.NSView.AccessibilityWarningValue -P:AppKit.NSView.AccessibilityWindow -P:AppKit.NSView.AccessibilityWindows -P:AppKit.NSView.AccessibilityZoomButton -P:AppKit.NSView.Animations -P:AppKit.NSView.Animator P:AppKit.NSView.AnnouncementRequestedNotification -P:AppKit.NSView.Appearance P:AppKit.NSView.ApplicationActivatedNotification P:AppKit.NSView.ApplicationDeactivatedNotification P:AppKit.NSView.ApplicationHiddenNotification @@ -57472,7 +50178,6 @@ P:AppKit.NSView.ApplicationShownNotification P:AppKit.NSView.BoundsChangedNotification P:AppKit.NSView.CreatedNotification P:AppKit.NSView.DrawerCreatedNotification -P:AppKit.NSView.EffectiveAppearance P:AppKit.NSView.FocusChangedNotification P:AppKit.NSView.FocusedWindowChangedNotification P:AppKit.NSView.FrameChangedNotification @@ -57480,10 +50185,8 @@ P:AppKit.NSView.GlobalFrameChangedNotification P:AppKit.NSView.HelpTagCreatedNotification P:AppKit.NSView.Hidden P:AppKit.NSView.HorizontalContentSizeConstraintActive -P:AppKit.NSView.Identifier P:AppKit.NSView.IsCompatibleWithResponsiveScrolling P:AppKit.NSView.IsDrawingFindIndicator -P:AppKit.NSView.IsFlipped P:AppKit.NSView.IsHiddenOrHasHiddenAncestor P:AppKit.NSView.IsInFullscreenMode P:AppKit.NSView.IsOpaque @@ -57515,14 +50218,11 @@ P:AppKit.NSView.UnitsChangedNotification P:AppKit.NSView.UpdatedTrackingAreasNotification P:AppKit.NSView.ValueChangedNotification P:AppKit.NSView.VerticalContentSizeConstraintActive -P:AppKit.NSView.WantsPeriodicDraggingUpdates P:AppKit.NSView.WindowCreatedNotification P:AppKit.NSView.WindowDeminiaturizedNotification P:AppKit.NSView.WindowMiniaturizedNotification P:AppKit.NSView.WindowMovedNotification P:AppKit.NSView.WindowResizedNotification -P:AppKit.NSViewAnimation.Animations -P:AppKit.NSViewAnimation.Animator P:AppKit.NSViewAnimation.EffectKey P:AppKit.NSViewAnimation.EndFrameKey P:AppKit.NSViewAnimation.FadeInEffect @@ -57533,141 +50233,23 @@ P:AppKit.NSViewColumnMoveEventArgs.NewColumn P:AppKit.NSViewColumnMoveEventArgs.OldColumn P:AppKit.NSViewColumnResizeEventArgs.Column P:AppKit.NSViewColumnResizeEventArgs.OldWidth -P:AppKit.NSViewController.Identifier -P:AppKit.NSViewController.Menu -P:AppKit.NSViewController.NextResponder -P:AppKit.NSViewController.TouchBar -P:AppKit.NSViewController.UserActivity P:AppKit.NSViewController.ViewLoaded P:AppKit.NSVisualEffectView.Emphasized -P:AppKit.NSWindow.AccessibilityActivationPoint -P:AppKit.NSWindow.AccessibilityAllowedValues -P:AppKit.NSWindow.AccessibilityAlternateUIVisible -P:AppKit.NSWindow.AccessibilityApplicationFocusedUIElement -P:AppKit.NSWindow.AccessibilityAttributedUserInputLabels -P:AppKit.NSWindow.AccessibilityCancelButton -P:AppKit.NSWindow.AccessibilityChildren -P:AppKit.NSWindow.AccessibilityChildrenInNavigationOrder -P:AppKit.NSWindow.AccessibilityClearButton -P:AppKit.NSWindow.AccessibilityCloseButton -P:AppKit.NSWindow.AccessibilityColumnCount -P:AppKit.NSWindow.AccessibilityColumnHeaderUIElements -P:AppKit.NSWindow.AccessibilityColumnIndexRange -P:AppKit.NSWindow.AccessibilityColumns -P:AppKit.NSWindow.AccessibilityColumnTitles -P:AppKit.NSWindow.AccessibilityContents -P:AppKit.NSWindow.AccessibilityCriticalValue -P:AppKit.NSWindow.AccessibilityCustomActions -P:AppKit.NSWindow.AccessibilityCustomRotors -P:AppKit.NSWindow.AccessibilityDecrementButton -P:AppKit.NSWindow.AccessibilityDefaultButton P:AppKit.NSWindow.AccessibilityDisclosed -P:AppKit.NSWindow.AccessibilityDisclosedByRow -P:AppKit.NSWindow.AccessibilityDisclosedRows -P:AppKit.NSWindow.AccessibilityDisclosureLevel -P:AppKit.NSWindow.AccessibilityDocument P:AppKit.NSWindow.AccessibilityEdited P:AppKit.NSWindow.AccessibilityElement P:AppKit.NSWindow.AccessibilityEnabled P:AppKit.NSWindow.AccessibilityExpanded -P:AppKit.NSWindow.AccessibilityExtrasMenuBar -P:AppKit.NSWindow.AccessibilityFilename -P:AppKit.NSWindow.AccessibilityFocused -P:AppKit.NSWindow.AccessibilityFocusedWindow -P:AppKit.NSWindow.AccessibilityFrame P:AppKit.NSWindow.AccessibilityFrontmost -P:AppKit.NSWindow.AccessibilityFullScreenButton -P:AppKit.NSWindow.AccessibilityGrowArea -P:AppKit.NSWindow.AccessibilityHandles -P:AppKit.NSWindow.AccessibilityHeader -P:AppKit.NSWindow.AccessibilityHelp P:AppKit.NSWindow.AccessibilityHidden -P:AppKit.NSWindow.AccessibilityHorizontalScrollBar -P:AppKit.NSWindow.AccessibilityHorizontalUnitDescription -P:AppKit.NSWindow.AccessibilityHorizontalUnits -P:AppKit.NSWindow.AccessibilityIdentifier -P:AppKit.NSWindow.AccessibilityIncrementButton -P:AppKit.NSWindow.AccessibilityIndex -P:AppKit.NSWindow.AccessibilityInsertionPointLineNumber -P:AppKit.NSWindow.AccessibilityLabel -P:AppKit.NSWindow.AccessibilityLabelUIElements -P:AppKit.NSWindow.AccessibilityLabelValue -P:AppKit.NSWindow.AccessibilityLinkedUIElements P:AppKit.NSWindow.AccessibilityMain -P:AppKit.NSWindow.AccessibilityMainWindow -P:AppKit.NSWindow.AccessibilityMarkerGroupUIElement -P:AppKit.NSWindow.AccessibilityMarkerTypeDescription -P:AppKit.NSWindow.AccessibilityMarkerUIElements -P:AppKit.NSWindow.AccessibilityMarkerValues -P:AppKit.NSWindow.AccessibilityMaxValue -P:AppKit.NSWindow.AccessibilityMenuBar -P:AppKit.NSWindow.AccessibilityMinimizeButton P:AppKit.NSWindow.AccessibilityMinimized -P:AppKit.NSWindow.AccessibilityMinValue P:AppKit.NSWindow.AccessibilityModal -P:AppKit.NSWindow.AccessibilityNextContents -P:AppKit.NSWindow.AccessibilityNumberOfCharacters P:AppKit.NSWindow.AccessibilityOrderedByRow -P:AppKit.NSWindow.AccessibilityOrientation -P:AppKit.NSWindow.AccessibilityOverflowButton -P:AppKit.NSWindow.AccessibilityParent -P:AppKit.NSWindow.AccessibilityPlaceholderValue -P:AppKit.NSWindow.AccessibilityPreviousContents P:AppKit.NSWindow.AccessibilityProtectedContent -P:AppKit.NSWindow.AccessibilityProxy P:AppKit.NSWindow.AccessibilityRequired -P:AppKit.NSWindow.AccessibilityRole -P:AppKit.NSWindow.AccessibilityRoleDescription -P:AppKit.NSWindow.AccessibilityRowCount -P:AppKit.NSWindow.AccessibilityRowHeaderUIElements -P:AppKit.NSWindow.AccessibilityRowIndexRange -P:AppKit.NSWindow.AccessibilityRows -P:AppKit.NSWindow.AccessibilityRulerMarkerType -P:AppKit.NSWindow.AccessibilitySearchButton -P:AppKit.NSWindow.AccessibilitySearchMenu P:AppKit.NSWindow.AccessibilitySelected -P:AppKit.NSWindow.AccessibilitySelectedCells -P:AppKit.NSWindow.AccessibilitySelectedChildren -P:AppKit.NSWindow.AccessibilitySelectedColumns -P:AppKit.NSWindow.AccessibilitySelectedRows -P:AppKit.NSWindow.AccessibilitySelectedText -P:AppKit.NSWindow.AccessibilitySelectedTextRange -P:AppKit.NSWindow.AccessibilitySelectedTextRanges -P:AppKit.NSWindow.AccessibilityServesAsTitleForUIElements -P:AppKit.NSWindow.AccessibilitySharedCharacterRange -P:AppKit.NSWindow.AccessibilitySharedFocusElements -P:AppKit.NSWindow.AccessibilitySharedTextUIElements -P:AppKit.NSWindow.AccessibilityShownMenu -P:AppKit.NSWindow.AccessibilitySortDirection -P:AppKit.NSWindow.AccessibilitySplitters -P:AppKit.NSWindow.AccessibilitySubrole -P:AppKit.NSWindow.AccessibilityTabs -P:AppKit.NSWindow.AccessibilityTitle -P:AppKit.NSWindow.AccessibilityTitleUIElement -P:AppKit.NSWindow.AccessibilityToolbarButton -P:AppKit.NSWindow.AccessibilityTopLevelUIElement -P:AppKit.NSWindow.AccessibilityUnitDescription -P:AppKit.NSWindow.AccessibilityUnits -P:AppKit.NSWindow.AccessibilityUrl -P:AppKit.NSWindow.AccessibilityUserInputLabels -P:AppKit.NSWindow.AccessibilityValue -P:AppKit.NSWindow.AccessibilityValueDescription -P:AppKit.NSWindow.AccessibilityVerticalScrollBar -P:AppKit.NSWindow.AccessibilityVerticalUnitDescription -P:AppKit.NSWindow.AccessibilityVerticalUnits -P:AppKit.NSWindow.AccessibilityVisibleCells -P:AppKit.NSWindow.AccessibilityVisibleCharacterRange -P:AppKit.NSWindow.AccessibilityVisibleChildren -P:AppKit.NSWindow.AccessibilityVisibleColumns -P:AppKit.NSWindow.AccessibilityVisibleRows -P:AppKit.NSWindow.AccessibilityWarningValue -P:AppKit.NSWindow.AccessibilityWindow -P:AppKit.NSWindow.AccessibilityWindows -P:AppKit.NSWindow.AccessibilityZoomButton -P:AppKit.NSWindow.Animations -P:AppKit.NSWindow.Animator P:AppKit.NSWindow.AnnouncementRequestedNotification -P:AppKit.NSWindow.Appearance P:AppKit.NSWindow.ApplicationActivatedNotification P:AppKit.NSWindow.ApplicationDeactivatedNotification P:AppKit.NSWindow.ApplicationHiddenNotification @@ -57697,16 +50279,13 @@ P:AppKit.NSWindow.DidResignKeyNotification P:AppKit.NSWindow.DidResignMainNotification P:AppKit.NSWindow.DidResizeNotification P:AppKit.NSWindow.DidUpdateNotification -P:AppKit.NSWindow.DocumentEdited P:AppKit.NSWindow.DrawerCreatedNotification -P:AppKit.NSWindow.EffectiveAppearance P:AppKit.NSWindow.ExcludedFromWindowsMenu P:AppKit.NSWindow.FlushWindowDisabled P:AppKit.NSWindow.FocusedWindowChangedNotification P:AppKit.NSWindow.FrameAutosaveName P:AppKit.NSWindow.GetWindowForSharingRequest P:AppKit.NSWindow.HelpTagCreatedNotification -P:AppKit.NSWindow.Identifier P:AppKit.NSWindow.IsKeyWindow P:AppKit.NSWindow.IsMainWindow P:AppKit.NSWindow.IsMovable @@ -57815,7 +50394,6 @@ P:AppKit.NSWorkspaceRenamedEventArgs.OldVolumeUrl P:AppKit.NSWorkspaceRenamedEventArgs.VolumeLocalizedName P:AppKit.NSWorkspaceRenamedEventArgs.VolumeUrl P:AppTrackingTransparency.ATTrackingManager.TrackingAuthorizationStatus -P:ARKit.ARAppClipCodeAnchor.IsTracked P:ARKit.ARBlendShapeLocationOptions.BrowDownLeft P:ARKit.ARBlendShapeLocationOptions.BrowDownRight P:ARKit.ARBlendShapeLocationOptions.BrowInnerUp @@ -57868,15 +50446,11 @@ P:ARKit.ARBlendShapeLocationOptions.MouthUpperUpRight P:ARKit.ARBlendShapeLocationOptions.NoseSneerLeft P:ARKit.ARBlendShapeLocationOptions.NoseSneerRight P:ARKit.ARBlendShapeLocationOptions.TongueOut -P:ARKit.ARBodyAnchor.IsTracked P:ARKit.ARBodyTrackingConfiguration.AutoFocusEnabled P:ARKit.ARCoachingOverlayView.Delegate P:ARKit.ARConfiguration.LightEstimationEnabled P:ARKit.ARFaceAnchor.BlendShapes -P:ARKit.ARFaceAnchor.IsTracked P:ARKit.ARFaceTrackingConfiguration.WorldTrackingEnabled -P:ARKit.ARGeoAnchor.IsTracked -P:ARKit.ARImageAnchor.IsTracked P:ARKit.ARImageTrackingConfiguration.AutoFocusEnabled P:ARKit.ARObjectScanningConfiguration.AutoFocusEnabled P:ARKit.AROrientationTrackingConfiguration.AutoFocusEnabled @@ -58749,20 +51323,15 @@ P:AVFoundation.AVAssetWriterInputPixelBufferAdaptor.Attributes P:AVFoundation.AVAudio3DMixing.Obstruction P:AVFoundation.AVAudio3DMixing.Occlusion P:AVFoundation.AVAudio3DMixing.PointSourceInHeadMode -P:AVFoundation.AVAudio3DMixing.Position -P:AVFoundation.AVAudio3DMixing.Rate P:AVFoundation.AVAudio3DMixing.RenderingAlgorithm P:AVFoundation.AVAudio3DMixing.ReverbBlend P:AVFoundation.AVAudio3DMixing.SourceMode P:AVFoundation.AVAudioBuffer.AudioBufferList -P:AVFoundation.AVAudioBuffer.Format P:AVFoundation.AVAudioBuffer.MutableAudioBufferList -P:AVFoundation.AVAudioChannelLayout.ChannelCount P:AVFoundation.AVAudioChannelLayout.Layout P:AVFoundation.AVAudioChannelLayout.LayoutTag P:AVFoundation.AVAudioCompressedBuffer.ByteCapacity P:AVFoundation.AVAudioCompressedBuffer.ByteLength -P:AVFoundation.AVAudioCompressedBuffer.Data P:AVFoundation.AVAudioCompressedBuffer.MaximumPacketSize P:AVFoundation.AVAudioCompressedBuffer.PacketCapacity P:AVFoundation.AVAudioCompressedBuffer.PacketCount @@ -58778,7 +51347,6 @@ P:AVFoundation.AVAudioConverter.BitRate P:AVFoundation.AVAudioConverter.BitRateStrategy P:AVFoundation.AVAudioConverter.ChannelMap P:AVFoundation.AVAudioConverter.Dither -P:AVFoundation.AVAudioConverter.Downmix P:AVFoundation.AVAudioConverter.InputFormat P:AVFoundation.AVAudioConverter.MagicCookie P:AVFoundation.AVAudioConverter.MaximumOutputPacketSize @@ -58818,26 +51386,18 @@ P:AVFoundation.AVAudioEnvironmentNode.OutputType P:AVFoundation.AVAudioEnvironmentNode.OutputVolume P:AVFoundation.AVAudioEnvironmentNode.Pan P:AVFoundation.AVAudioEnvironmentNode.PointSourceInHeadMode -P:AVFoundation.AVAudioEnvironmentNode.Position -P:AVFoundation.AVAudioEnvironmentNode.Rate P:AVFoundation.AVAudioEnvironmentNode.RenderingAlgorithm P:AVFoundation.AVAudioEnvironmentNode.ReverbBlend P:AVFoundation.AVAudioEnvironmentNode.ReverbParameters P:AVFoundation.AVAudioEnvironmentNode.SourceMode -P:AVFoundation.AVAudioEnvironmentNode.Volume P:AVFoundation.AVAudioEnvironmentReverbParameters.Enable P:AVFoundation.AVAudioEnvironmentReverbParameters.FilterParameters -P:AVFoundation.AVAudioEnvironmentReverbParameters.Level P:AVFoundation.AVAudioFile.FileFormat P:AVFoundation.AVAudioFile.FramePosition P:AVFoundation.AVAudioFile.IsOpen -P:AVFoundation.AVAudioFile.Length P:AVFoundation.AVAudioFile.ProcessingFormat -P:AVFoundation.AVAudioFile.Url -P:AVFoundation.AVAudioFormat.ChannelCount P:AVFoundation.AVAudioFormat.ChannelLayout P:AVFoundation.AVAudioFormat.CommonFormat -P:AVFoundation.AVAudioFormat.FormatDescription P:AVFoundation.AVAudioFormat.Interleaved P:AVFoundation.AVAudioFormat.MagicCookie P:AVFoundation.AVAudioFormat.SampleRate @@ -58849,15 +51409,12 @@ P:AVFoundation.AVAudioInputNode.Obstruction P:AVFoundation.AVAudioInputNode.Occlusion P:AVFoundation.AVAudioInputNode.Pan P:AVFoundation.AVAudioInputNode.PointSourceInHeadMode -P:AVFoundation.AVAudioInputNode.Position -P:AVFoundation.AVAudioInputNode.Rate P:AVFoundation.AVAudioInputNode.RenderingAlgorithm P:AVFoundation.AVAudioInputNode.ReverbBlend P:AVFoundation.AVAudioInputNode.SourceMode P:AVFoundation.AVAudioInputNode.VoiceProcessingAgcEnabled P:AVFoundation.AVAudioInputNode.VoiceProcessingBypassed P:AVFoundation.AVAudioInputNode.VoiceProcessingInputMuted -P:AVFoundation.AVAudioInputNode.Volume P:AVFoundation.AVAudioIONode.AudioUnit P:AVFoundation.AVAudioIONode.PresentationLatency P:AVFoundation.AVAudioIONode.VoiceProcessingEnabled @@ -58867,23 +51424,17 @@ P:AVFoundation.AVAudioMixerNode.Occlusion P:AVFoundation.AVAudioMixerNode.OutputVolume P:AVFoundation.AVAudioMixerNode.Pan P:AVFoundation.AVAudioMixerNode.PointSourceInHeadMode -P:AVFoundation.AVAudioMixerNode.Position -P:AVFoundation.AVAudioMixerNode.Rate P:AVFoundation.AVAudioMixerNode.RenderingAlgorithm P:AVFoundation.AVAudioMixerNode.ReverbBlend P:AVFoundation.AVAudioMixerNode.SourceMode -P:AVFoundation.AVAudioMixerNode.Volume P:AVFoundation.AVAudioMixingDestination.ConnectionPoint P:AVFoundation.AVAudioMixingDestination.Obstruction P:AVFoundation.AVAudioMixingDestination.Occlusion P:AVFoundation.AVAudioMixingDestination.Pan P:AVFoundation.AVAudioMixingDestination.PointSourceInHeadMode -P:AVFoundation.AVAudioMixingDestination.Position -P:AVFoundation.AVAudioMixingDestination.Rate P:AVFoundation.AVAudioMixingDestination.RenderingAlgorithm P:AVFoundation.AVAudioMixingDestination.ReverbBlend P:AVFoundation.AVAudioMixingDestination.SourceMode -P:AVFoundation.AVAudioMixingDestination.Volume P:AVFoundation.AVAudioNode.AUAudioUnit P:AVFoundation.AVAudioNode.Engine P:AVFoundation.AVAudioNode.LastRenderTime @@ -58899,53 +51450,36 @@ P:AVFoundation.AVAudioPcmBuffer.Int32ChannelData P:AVFoundation.AVAudioPcmBuffer.Stride P:AVFoundation.AVAudioPlayer.ChannelAssignments P:AVFoundation.AVAudioPlayer.CurrentDevice -P:AVFoundation.AVAudioPlayer.CurrentTime -P:AVFoundation.AVAudioPlayer.Data P:AVFoundation.AVAudioPlayer.Delegate P:AVFoundation.AVAudioPlayer.DeviceCurrentTime -P:AVFoundation.AVAudioPlayer.Duration P:AVFoundation.AVAudioPlayer.EnableRate -P:AVFoundation.AVAudioPlayer.Format P:AVFoundation.AVAudioPlayer.MeteringEnabled P:AVFoundation.AVAudioPlayer.NumberOfChannels P:AVFoundation.AVAudioPlayer.NumberOfLoops P:AVFoundation.AVAudioPlayer.Pan P:AVFoundation.AVAudioPlayer.Playing -P:AVFoundation.AVAudioPlayer.Rate P:AVFoundation.AVAudioPlayer.SoundSetting -P:AVFoundation.AVAudioPlayer.Url -P:AVFoundation.AVAudioPlayer.Volume -P:AVFoundation.AVAudioPlayer.WeakDelegate P:AVFoundation.AVAudioPlayer.WeakSettings P:AVFoundation.AVAudioPlayerNode.Obstruction P:AVFoundation.AVAudioPlayerNode.Occlusion P:AVFoundation.AVAudioPlayerNode.Pan P:AVFoundation.AVAudioPlayerNode.Playing P:AVFoundation.AVAudioPlayerNode.PointSourceInHeadMode -P:AVFoundation.AVAudioPlayerNode.Position -P:AVFoundation.AVAudioPlayerNode.Rate P:AVFoundation.AVAudioPlayerNode.RenderingAlgorithm P:AVFoundation.AVAudioPlayerNode.ReverbBlend P:AVFoundation.AVAudioPlayerNode.SourceMode -P:AVFoundation.AVAudioPlayerNode.Volume P:AVFoundation.AVAudioRecorder.ChannelAssignments -P:AVFoundation.AVAudioRecorder.CurrentTime P:AVFoundation.AVAudioRecorder.Delegate P:AVFoundation.AVAudioRecorder.DeviceCurrentTime -P:AVFoundation.AVAudioRecorder.Format P:AVFoundation.AVAudioRecorder.MeteringEnabled P:AVFoundation.AVAudioRecorder.Recording P:AVFoundation.AVAudioRecorder.Settings -P:AVFoundation.AVAudioRecorder.Url -P:AVFoundation.AVAudioRecorder.WeakDelegate P:AVFoundation.AVAudioRecorder.WeakSettings P:AVFoundation.AVAudioRoutingArbiter.SharedRoutingArbiter P:AVFoundation.AVAudioSequencer.CurrentPositionInBeats P:AVFoundation.AVAudioSequencer.CurrentPositionInSeconds P:AVFoundation.AVAudioSequencer.Playing -P:AVFoundation.AVAudioSequencer.Rate P:AVFoundation.AVAudioSequencer.TempoTrack -P:AVFoundation.AVAudioSequencer.Tracks P:AVFoundation.AVAudioSequencer.UserInfo P:AVFoundation.AVAudioSession.AllowHapticsAndSystemSoundsDuringRecording P:AVFoundation.AVAudioSession.AvailableCategories @@ -58973,7 +51507,6 @@ P:AVFoundation.AVAudioSession.MaximumInputNumberOfChannels P:AVFoundation.AVAudioSession.MaximumOutputNumberOfChannels P:AVFoundation.AVAudioSession.MediaServicesWereLostNotification P:AVFoundation.AVAudioSession.MediaServicesWereResetNotification -P:AVFoundation.AVAudioSession.Mode P:AVFoundation.AVAudioSession.OrientationLeft P:AVFoundation.AVAudioSession.OrientationRight P:AVFoundation.AVAudioSession.OtherAudioPlaying @@ -59022,7 +51555,6 @@ P:AVFoundation.AVAudioSession.SilenceSecondaryAudioHintNotification P:AVFoundation.AVAudioSession.SpatialPlaybackCapabilitiesChangedNotification P:AVFoundation.AVAudioSession.SupportedOutputChannelLayouts P:AVFoundation.AVAudioSession.SupportsMultichannelContent -P:AVFoundation.AVAudioSession.WeakDelegate P:AVFoundation.AVAudioSessionChannelDescription.ChannelLabel P:AVFoundation.AVAudioSessionChannelDescription.ChannelName P:AVFoundation.AVAudioSessionChannelDescription.ChannelNumber @@ -59042,15 +51574,12 @@ P:AVFoundation.AVAudioSessionPortDescription.Channels P:AVFoundation.AVAudioSessionPortDescription.DataSources P:AVFoundation.AVAudioSessionPortDescription.HasHardwareVoiceCallProcessing P:AVFoundation.AVAudioSessionPortDescription.PortName -P:AVFoundation.AVAudioSessionPortDescription.PortType P:AVFoundation.AVAudioSessionPortDescription.PreferredDataSource P:AVFoundation.AVAudioSessionPortDescription.SelectedDataSource P:AVFoundation.AVAudioSessionPortDescription.SpatialAudioEnabled P:AVFoundation.AVAudioSessionPortDescription.UID P:AVFoundation.AVAudioSessionRouteChangeEventArgs.PreviousRoute P:AVFoundation.AVAudioSessionRouteChangeEventArgs.Reason -P:AVFoundation.AVAudioSessionRouteDescription.Inputs -P:AVFoundation.AVAudioSessionRouteDescription.Outputs P:AVFoundation.AVAudioSessionSecondaryAudioHintEventArgs.Hint P:AVFoundation.AVAudioSessionSecondaryAudioHintEventArgs.HintType P:AVFoundation.AVAudioSettings.AVChannelLayoutKey @@ -59072,12 +51601,9 @@ P:AVFoundation.AVAudioSourceNode.Obstruction P:AVFoundation.AVAudioSourceNode.Occlusion P:AVFoundation.AVAudioSourceNode.Pan P:AVFoundation.AVAudioSourceNode.PointSourceInHeadMode -P:AVFoundation.AVAudioSourceNode.Position -P:AVFoundation.AVAudioSourceNode.Rate P:AVFoundation.AVAudioSourceNode.RenderingAlgorithm P:AVFoundation.AVAudioSourceNode.ReverbBlend P:AVFoundation.AVAudioSourceNode.SourceMode -P:AVFoundation.AVAudioSourceNode.Volume P:AVFoundation.AVAudioStereoMixing.Pan P:AVFoundation.AVAudioTime.AudioTimeStamp P:AVFoundation.AVAudioTime.HostTime @@ -59092,7 +51618,6 @@ P:AVFoundation.AVAudioTimePitchAlgorithm.Varispeed P:AVFoundation.AVAudioUnit.AUAudioUnit P:AVFoundation.AVAudioUnit.AudioUnit P:AVFoundation.AVAudioUnit.ManufacturerName -P:AVFoundation.AVAudioUnit.Name P:AVFoundation.AVAudioUnit.Version P:AVFoundation.AVAudioUnitComponent.AllTagNames P:AVFoundation.AVAudioUnitComponent.AudioComponent @@ -59105,7 +51630,6 @@ P:AVFoundation.AVAudioUnitComponent.Icon P:AVFoundation.AVAudioUnitComponent.IconUrl P:AVFoundation.AVAudioUnitComponent.LocalizedTypeName P:AVFoundation.AVAudioUnitComponent.ManufacturerName -P:AVFoundation.AVAudioUnitComponent.Name P:AVFoundation.AVAudioUnitComponent.PassesAUVal P:AVFoundation.AVAudioUnitComponent.SandboxSafe P:AVFoundation.AVAudioUnitComponent.TagsDidChangeNotification @@ -59137,23 +51661,17 @@ P:AVFoundation.AVAudioUnitGenerator.Obstruction P:AVFoundation.AVAudioUnitGenerator.Occlusion P:AVFoundation.AVAudioUnitGenerator.Pan P:AVFoundation.AVAudioUnitGenerator.PointSourceInHeadMode -P:AVFoundation.AVAudioUnitGenerator.Position -P:AVFoundation.AVAudioUnitGenerator.Rate P:AVFoundation.AVAudioUnitGenerator.RenderingAlgorithm P:AVFoundation.AVAudioUnitGenerator.ReverbBlend P:AVFoundation.AVAudioUnitGenerator.SourceMode -P:AVFoundation.AVAudioUnitGenerator.Volume P:AVFoundation.AVAudioUnitManufacturerName.Apple P:AVFoundation.AVAudioUnitMidiInstrument.Obstruction P:AVFoundation.AVAudioUnitMidiInstrument.Occlusion P:AVFoundation.AVAudioUnitMidiInstrument.Pan P:AVFoundation.AVAudioUnitMidiInstrument.PointSourceInHeadMode -P:AVFoundation.AVAudioUnitMidiInstrument.Position -P:AVFoundation.AVAudioUnitMidiInstrument.Rate P:AVFoundation.AVAudioUnitMidiInstrument.RenderingAlgorithm P:AVFoundation.AVAudioUnitMidiInstrument.ReverbBlend P:AVFoundation.AVAudioUnitMidiInstrument.SourceMode -P:AVFoundation.AVAudioUnitMidiInstrument.Volume P:AVFoundation.AVAudioUnitReverb.WetDryMix P:AVFoundation.AVAudioUnitSampler.GlobalTuning P:AVFoundation.AVAudioUnitSampler.MasterGain @@ -59162,7 +51680,6 @@ P:AVFoundation.AVAudioUnitSampler.StereoPan P:AVFoundation.AVAudioUnitTimeEffect.Bypass P:AVFoundation.AVAudioUnitTimePitch.Overlap P:AVFoundation.AVAudioUnitTimePitch.Pitch -P:AVFoundation.AVAudioUnitTimePitch.Rate P:AVFoundation.AVAudioUnitType.Effect P:AVFoundation.AVAudioUnitType.FormatConverter P:AVFoundation.AVAudioUnitType.Generator @@ -59173,7 +51690,6 @@ P:AVFoundation.AVAudioUnitType.MusicEffect P:AVFoundation.AVAudioUnitType.OfflineEffect P:AVFoundation.AVAudioUnitType.Output P:AVFoundation.AVAudioUnitType.Panner -P:AVFoundation.AVAudioUnitVarispeed.Rate P:AVFoundation.AVCaptionDimension.Units P:AVFoundation.AVCaptionSettings.MediaSubType P:AVFoundation.AVCaptionSettings.MediaType @@ -59374,10 +51890,7 @@ P:AVFoundation.AVContentKeySessionServerPlaybackContextOptions.ProtocolVersions P:AVFoundation.AVContentKeySessionServerPlaybackContextOptions.ServerChallenge P:AVFoundation.AVContentProposal.AutomaticAcceptanceInterval P:AVFoundation.AVContentProposal.ContentTimeForTransition -P:AVFoundation.AVContentProposal.Metadata P:AVFoundation.AVContentProposal.PreviewImage -P:AVFoundation.AVContentProposal.Title -P:AVFoundation.AVContentProposal.Url P:AVFoundation.AVCoordinatedPlaybackParticipant.ReadyToPlay P:AVFoundation.AVDelegatingPlaybackCoordinator.PlaybackControlDelegate P:AVFoundation.AVDepthData.AvailableDepthDataTypes @@ -59967,9 +52480,7 @@ P:AVFoundation.AVMetadataIdentifiers.ThreeGP.UserDataUserRating P:AVFoundation.AVMetadataMachineReadableCodeObject.Corners P:AVFoundation.AVMetadataObject.Type P:AVFoundation.AVMidiPlayer.CurrentPosition -P:AVFoundation.AVMidiPlayer.Duration P:AVFoundation.AVMidiPlayer.Playing -P:AVFoundation.AVMidiPlayer.Rate P:AVFoundation.AVMovie.ReferenceRestrictionsKey P:AVFoundation.AVMovie.ShouldSupportAliasDataReferencesKey P:AVFoundation.AVMusicTrack.DestinationAudioUnit @@ -60061,10 +52572,8 @@ P:AVFoundation.AVRouteDetector.MultipleRoutesDetectedDidChange P:AVFoundation.AVRouteDetector.RouteDetectionEnabled P:AVFoundation.AVSampleBufferAudioRenderer.AudioRendererWasFlushedAutomaticallyNotification P:AVFoundation.AVSampleBufferAudioRenderer.ConfigurationDidChangeNotification -P:AVFoundation.AVSampleBufferAudioRenderer.HasSufficientMediaDataForReliablePlaybackStart P:AVFoundation.AVSampleBufferAudioRenderer.Muted P:AVFoundation.AVSampleBufferAudioRenderer.ReadyForMoreMediaData -P:AVFoundation.AVSampleBufferAudioRenderer.Timebase P:AVFoundation.AVSampleBufferDisplayLayer.FailedToDecodeNotification P:AVFoundation.AVSampleBufferDisplayLayer.FailedToDecodeNotificationErrorKey P:AVFoundation.AVSampleBufferDisplayLayer.OutputObscuredDueToInsufficientExternalProtectionDidChangeNotification @@ -60079,19 +52588,15 @@ P:AVFoundation.AVSampleRateEventArgs.SampleRate P:AVFoundation.AVSpeechSynthesisVoice.AudioFileSettings P:AVFoundation.AVSpeechSynthesisVoice.CurrentLanguageCode P:AVFoundation.AVSpeechSynthesisVoice.Gender -P:AVFoundation.AVSpeechSynthesisVoice.Identifier P:AVFoundation.AVSpeechSynthesisVoice.IdentifierAlex P:AVFoundation.AVSpeechSynthesisVoice.IpaNotationAttribute P:AVFoundation.AVSpeechSynthesisVoice.Language -P:AVFoundation.AVSpeechSynthesisVoice.Name P:AVFoundation.AVSpeechSynthesisVoice.Quality P:AVFoundation.AVSpeechSynthesizer.Delegate P:AVFoundation.AVSpeechSynthesizer.MixToTelephonyUplink P:AVFoundation.AVSpeechSynthesizer.OutputChannels P:AVFoundation.AVSpeechSynthesizer.Paused P:AVFoundation.AVSpeechSynthesizer.Speaking -P:AVFoundation.AVSpeechSynthesizer.UsesApplicationAudioSession -P:AVFoundation.AVSpeechSynthesizer.WeakDelegate P:AVFoundation.AVSpeechSynthesizerUteranceEventArgs.Utterance P:AVFoundation.AVSpeechSynthesizerWillSpeakEventArgs.CharacterRange P:AVFoundation.AVSpeechSynthesizerWillSpeakEventArgs.Utterance @@ -60103,10 +52608,8 @@ P:AVFoundation.AVSpeechUtterance.PitchMultiplier P:AVFoundation.AVSpeechUtterance.PostUtteranceDelay P:AVFoundation.AVSpeechUtterance.PrefersAssistiveTechnologySettings P:AVFoundation.AVSpeechUtterance.PreUtteranceDelay -P:AVFoundation.AVSpeechUtterance.Rate P:AVFoundation.AVSpeechUtterance.SpeechString P:AVFoundation.AVSpeechUtterance.Voice -P:AVFoundation.AVSpeechUtterance.Volume P:AVFoundation.AVStatusEventArgs.Status P:AVFoundation.AVStreamingKeyDelivery.ContentKeyType P:AVFoundation.AVStreamingKeyDelivery.PersistentContentKeyType @@ -60178,9 +52681,6 @@ P:AVFoundation.AVVideoColorPrimaries.Itu_R_2020 P:AVFoundation.AVVideoColorPrimaries.Itu_R_709_2 P:AVFoundation.AVVideoColorPrimaries.P3_D65 P:AVFoundation.AVVideoColorPrimaries.Smpte_C -P:AVFoundation.AVVideoCompositing.CanConformColorOfSourceFrames -P:AVFoundation.AVVideoCompositing.SupportsHdrSourceFrames -P:AVFoundation.AVVideoCompositing.SupportsWideColorSourceFrames P:AVFoundation.AVVideoPixelAspectRatioSettings.HorizontalSpacing P:AVFoundation.AVVideoPixelAspectRatioSettings.VerticalSpacing P:AVFoundation.AVVideoScalingModeKey.Fit @@ -60223,26 +52723,13 @@ P:AVFoundation.IAVVideoCompositing.SupportsHdrSourceFrames P:AVFoundation.IAVVideoCompositing.SupportsWideColorSourceFrames P:AVFoundation.RenderingModeChangeNotificationEventArgs.NewRenderingMode P:AVFoundation.SpatialPlaybackCapabilitiesChangedEventArgs.SpatialAudioEnabledKey -P:AVKit.AVCaptureEvent.Phase P:AVKit.AVCaptureEventInteraction.Enabled P:AVKit.AVCaptureEventInteraction.View -P:AVKit.AVCaptureView.ControlsStyle -P:AVKit.AVCaptureView.Delegate -P:AVKit.AVCaptureView.FileOutput -P:AVKit.AVCaptureView.Session -P:AVKit.AVCaptureView.WeakVideoGravity -P:AVKit.AVContentProposalViewController.ContentProposal -P:AVKit.AVContentProposalViewController.DateOfAutomaticAcceptance -P:AVKit.AVContentProposalViewController.PlayerLayoutGuide -P:AVKit.AVContentProposalViewController.PlayerViewController -P:AVKit.AVContentProposalViewController.PreferredPlayerViewFrame P:AVKit.AVDisplayManager.DisplayCriteriaMatchingEnabled P:AVKit.AVDisplayManager.DisplayModeSwitchInProgress P:AVKit.AVDisplayManager.ModeSwitchEndNotification P:AVKit.AVDisplayManager.ModeSwitchSettingsChangedNotification P:AVKit.AVDisplayManager.ModeSwitchStartNotification -P:AVKit.AVDisplayManager.PreferredDisplayCriteria -P:AVKit.AVInterstitialTimeRange.TimeRange P:AVKit.AVKitMetadataIdentifier.ApproximateEndDate P:AVKit.AVKitMetadataIdentifier.ApproximateStartDate P:AVKit.AVKitMetadataIdentifier.ExactEndDate @@ -60251,118 +52738,26 @@ P:AVKit.AVKitMetadataIdentifier.ExternalContentIdentifier P:AVKit.AVKitMetadataIdentifier.ExternalUserProfileIdentifier P:AVKit.AVKitMetadataIdentifier.PlaybackProgress P:AVKit.AVKitMetadataIdentifier.ServiceIdentifier -P:AVKit.AVNavigationMarkersGroup.DateRangeNavigationMarkers -P:AVKit.AVNavigationMarkersGroup.TimedNavigationMarkers -P:AVKit.AVNavigationMarkersGroup.Title -P:AVKit.AVPictureInPictureController.CanStartPictureInPictureAutomaticallyFromInline -P:AVKit.AVPictureInPictureController.CanStopPictureInPicture -P:AVKit.AVPictureInPictureController.ContentSource P:AVKit.AVPictureInPictureController.Delegate -P:AVKit.AVPictureInPictureController.IsPictureInPictureSupported P:AVKit.AVPictureInPictureController.PictureInPictureActive -P:AVKit.AVPictureInPictureController.PictureInPictureButtonStartImage -P:AVKit.AVPictureInPictureController.PictureInPictureButtonStopImage P:AVKit.AVPictureInPictureController.PictureInPicturePossible P:AVKit.AVPictureInPictureController.PictureInPictureSuspended -P:AVKit.AVPictureInPictureController.PlayerLayer -P:AVKit.AVPictureInPictureController.RequiresLinearPlayback -P:AVKit.AVPictureInPictureController.WeakDelegate -P:AVKit.AVPictureInPictureControllerContentSource.ActiveVideoCallContentViewController -P:AVKit.AVPictureInPictureControllerContentSource.ActiveVideoCallSourceView -P:AVKit.AVPictureInPictureControllerContentSource.PlayerLayer -P:AVKit.AVPictureInPictureControllerContentSource.SampleBufferDisplayLayer P:AVKit.AVPictureInPictureControllerContentSource.SampleBufferPlaybackDelegate -P:AVKit.AVPictureInPictureControllerContentSource.WeakSampleBufferPlaybackDelegate -P:AVKit.AVPlaybackSpeed.LocalizedName -P:AVKit.AVPlaybackSpeed.LocalizedNumericName -P:AVKit.AVPlaybackSpeed.Rate -P:AVKit.AVPlaybackSpeed.SystemDefaultSpeeds -P:AVKit.AVPlayerView.ActionPopUpButtonMenu -P:AVKit.AVPlayerView.AllowsMagnification -P:AVKit.AVPlayerView.AllowsPictureInPicturePlayback -P:AVKit.AVPlayerView.AllowsVideoFrameAnalysis -P:AVKit.AVPlayerView.CanBeginTrimming -P:AVKit.AVPlayerView.ContentOverlayView -P:AVKit.AVPlayerView.ControlsStyle P:AVKit.AVPlayerView.Delegate -P:AVKit.AVPlayerView.Magnification P:AVKit.AVPlayerView.PictureInPictureDelegate -P:AVKit.AVPlayerView.Player P:AVKit.AVPlayerView.ReadyForDisplay -P:AVKit.AVPlayerView.SelectedSpeed -P:AVKit.AVPlayerView.ShowsFrameSteppingButtons -P:AVKit.AVPlayerView.ShowsFullScreenToggleButton -P:AVKit.AVPlayerView.ShowsSharingServiceButton -P:AVKit.AVPlayerView.ShowsTimecodes -P:AVKit.AVPlayerView.Speeds -P:AVKit.AVPlayerView.UpdatesNowPlayingInfoCenter -P:AVKit.AVPlayerView.VideoBounds -P:AVKit.AVPlayerView.VideoGravity -P:AVKit.AVPlayerView.WeakDelegate -P:AVKit.AVPlayerView.WeakPictureInPictureDelegate -P:AVKit.AVPlayerViewController.AllowedSubtitleOptionLanguages -P:AVKit.AVPlayerViewController.AllowsPictureInPicturePlayback -P:AVKit.AVPlayerViewController.AllowsVideoFrameAnalysis -P:AVKit.AVPlayerViewController.AppliesPreferredDisplayCriteriaAutomatically -P:AVKit.AVPlayerViewController.CanStartPictureInPictureAutomaticallyFromInline -P:AVKit.AVPlayerViewController.ContentOverlayView -P:AVKit.AVPlayerViewController.ContentProposalViewController -P:AVKit.AVPlayerViewController.ContextualActions -P:AVKit.AVPlayerViewController.CustomInfoViewController -P:AVKit.AVPlayerViewController.CustomInfoViewControllers -P:AVKit.AVPlayerViewController.CustomOverlayViewController P:AVKit.AVPlayerViewController.Delegate -P:AVKit.AVPlayerViewController.EntersFullScreenWhenPlaybackBegins -P:AVKit.AVPlayerViewController.ExitsFullScreenWhenPlaybackEnds -P:AVKit.AVPlayerViewController.InfoViewActions -P:AVKit.AVPlayerViewController.PixelBufferAttributes -P:AVKit.AVPlayerViewController.PlaybackControlsIncludeInfoViews -P:AVKit.AVPlayerViewController.PlaybackControlsIncludeTransportBar -P:AVKit.AVPlayerViewController.Player P:AVKit.AVPlayerViewController.ReadyForDisplay -P:AVKit.AVPlayerViewController.RequiresFullSubtitles -P:AVKit.AVPlayerViewController.RequiresLinearPlayback -P:AVKit.AVPlayerViewController.SelectedSpeed -P:AVKit.AVPlayerViewController.ShowsPlaybackControls -P:AVKit.AVPlayerViewController.ShowsTimecodes P:AVKit.AVPlayerViewController.SkipBackwardEnabled P:AVKit.AVPlayerViewController.SkipForwardEnabled -P:AVKit.AVPlayerViewController.SkippingBehavior -P:AVKit.AVPlayerViewController.Speeds -P:AVKit.AVPlayerViewController.ToggleLookupAction -P:AVKit.AVPlayerViewController.TransportBarCustomMenuItems -P:AVKit.AVPlayerViewController.TransportBarIncludesTitleView -P:AVKit.AVPlayerViewController.UnobscuredContentGuide -P:AVKit.AVPlayerViewController.UpdatesNowPlayingInfoCenter -P:AVKit.AVPlayerViewController.VideoBounds -P:AVKit.AVPlayerViewController.VideoFrameAnalysisTypes P:AVKit.AVPlayerViewController.VideoGravity -P:AVKit.AVPlayerViewController.WeakDelegate -P:AVKit.AVPlayerViewController.WeakVideoGravity -P:AVKit.AVRoutePickerView.ActiveTintColor -P:AVKit.AVRoutePickerView.CustomRoutingController P:AVKit.AVRoutePickerView.Delegate -P:AVKit.AVRoutePickerView.Player -P:AVKit.AVRoutePickerView.PrioritizesVideoDevices P:AVKit.AVRoutePickerView.RoutePickerButtonBordered -P:AVKit.AVRoutePickerView.RoutePickerButtonStyle -P:AVKit.AVRoutePickerView.WeakDelegate P:AVKit.PreparingRouteSelectionForPlayback.Arg1 P:AVKit.PreparingRouteSelectionForPlayback.Arg2 -P:AVRouting.AVCustomDeviceRoute.BluetoothIdentifier P:AVRouting.AVCustomDeviceRoute.NetworkEndpoint -P:AVRouting.AVCustomRoutingActionItem.OverrideTitle -P:AVRouting.AVCustomRoutingActionItem.Type -P:AVRouting.AVCustomRoutingController.AuthorizedRoutes P:AVRouting.AVCustomRoutingController.AuthorizedRoutesDidChangeNotification -P:AVRouting.AVCustomRoutingController.CustomActionItems P:AVRouting.AVCustomRoutingController.Delegate -P:AVRouting.AVCustomRoutingController.KnownRouteIPs -P:AVRouting.AVCustomRoutingController.WeakDelegate -P:AVRouting.AVCustomRoutingEvent.Reason -P:AVRouting.AVCustomRoutingEvent.Route -P:AVRouting.AVCustomRoutingPartialIP.Address -P:AVRouting.AVCustomRoutingPartialIP.Mask P:BackgroundAssets.BAAppExtensionInfo.RestrictedDownloadSizeRemaining P:BackgroundAssets.BAAppExtensionInfo.RestrictedEssentialDownloadSizeRemaining P:BackgroundAssets.BADownload.Identifier @@ -60384,40 +52779,13 @@ P:BackgroundTasks.BGTask.Identifier P:BackgroundTasks.BGTaskRequest.EarliestBeginDate P:BackgroundTasks.BGTaskRequest.Identifier P:BackgroundTasks.BGTaskScheduler.Shared -P:BrowserEngineKit.BEAutoFillTextSuggestion.Contents P:BrowserEngineKit.BEDragInteraction.Delegate -P:BrowserEngineKit.BEDragInteraction.WeakDelegate -P:BrowserEngineKit.BEKeyEntry.Key P:BrowserEngineKit.BEKeyEntry.KeyRepeating -P:BrowserEngineKit.BEKeyEntry.State -P:BrowserEngineKit.BEKeyEntry.Timestamp P:BrowserEngineKit.BEKeyEntryContext.DocumentEditable -P:BrowserEngineKit.BEKeyEntryContext.KeyEntry -P:BrowserEngineKit.BEKeyEntryContext.ShouldEvaluateForInputSystemHandling -P:BrowserEngineKit.BEKeyEntryContext.ShouldInsertCharacter -P:BrowserEngineKit.BELayerHierarchy.Layer -P:BrowserEngineKit.BELayerHierarchy.LayerHierarchyHandle -P:BrowserEngineKit.BELayerHierarchyHostingView.LayerHierarchyHandle P:BrowserEngineKit.BEScrollView.Delegate -P:BrowserEngineKit.BEScrollView.WeakDelegate -P:BrowserEngineKit.BEScrollViewScrollUpdate.Phase -P:BrowserEngineKit.BEScrollViewScrollUpdate.Timestamp -P:BrowserEngineKit.BETextAlternatives.AlternativeStrings -P:BrowserEngineKit.BETextAlternatives.PrimaryString -P:BrowserEngineKit.BETextDocumentContext.AutocorrectedRanges -P:BrowserEngineKit.BETextDocumentRequest.GranularityCount -P:BrowserEngineKit.BETextDocumentRequest.Options -P:BrowserEngineKit.BETextDocumentRequest.SurroundingGranularity -P:BrowserEngineKit.BETextInteraction.ContextMenuInteraction P:BrowserEngineKit.BETextInteraction.ContextMenuInteractionDelegate P:BrowserEngineKit.BETextInteraction.Delegate -P:BrowserEngineKit.BETextInteraction.TextSelectionDisplayInteraction P:BrowserEngineKit.BETextInteraction.View -P:BrowserEngineKit.BETextInteraction.WeakContextMenuInteractionDelegate -P:BrowserEngineKit.BETextInteraction.WeakDelegate -P:BrowserEngineKit.BETextSuggestion.InputText -P:BrowserEngineKit.BEWebAppManifest.JsonData -P:BrowserEngineKit.BEWebAppManifest.ManifestUrl P:BrowserEngineKit.IBEExtendedTextInputTraits.InsertionPointColor P:BrowserEngineKit.IBEExtendedTextInputTraits.SelectionHandleColor P:BrowserEngineKit.IBEExtendedTextInputTraits.SelectionHighlightColor @@ -60443,334 +52811,50 @@ P:BrowserEngineKit.IBETextInput.UnobscuredContentRect P:BrowserEngineKit.IBETextInput.UnscaledView P:BrowserEngineKit.IBETextInput.WeakAsyncInputDelegate P:CallKit.CXAction.Complete -P:CallKit.CXAction.TimeoutDate -P:CallKit.CXAction.Uuid -P:CallKit.CXCall.HasConnected -P:CallKit.CXCall.HasEnded P:CallKit.CXCall.OnHold P:CallKit.CXCall.Outgoing -P:CallKit.CXCall.Uuid -P:CallKit.CXCallAction.CallUuid -P:CallKit.CXCallController.CallObserver -P:CallKit.CXCallDirectoryExtensionContext.Delegate P:CallKit.CXCallDirectoryExtensionContext.Incremental -P:CallKit.CXCallDirectoryManager.SharedInstance -P:CallKit.CXCallObserver.Calls -P:CallKit.CXCallUpdate.HasVideo -P:CallKit.CXCallUpdate.LocalizedCallerName -P:CallKit.CXCallUpdate.RemoteHandle -P:CallKit.CXCallUpdate.SupportsDtmf -P:CallKit.CXCallUpdate.SupportsGrouping -P:CallKit.CXCallUpdate.SupportsHolding -P:CallKit.CXCallUpdate.SupportsUngrouping -P:CallKit.CXHandle.Type -P:CallKit.CXHandle.Value -P:CallKit.CXPlayDtmfCallAction.Digits -P:CallKit.CXPlayDtmfCallAction.Type -P:CallKit.CXProvider.Configuration -P:CallKit.CXProvider.PendingTransactions -P:CallKit.CXProviderConfiguration.IconTemplateImageData -P:CallKit.CXProviderConfiguration.IncludesCallsInRecents -P:CallKit.CXProviderConfiguration.LocalizedName -P:CallKit.CXProviderConfiguration.MaximumCallGroups -P:CallKit.CXProviderConfiguration.MaximumCallsPerCallGroup -P:CallKit.CXProviderConfiguration.RingtoneSound -P:CallKit.CXProviderConfiguration.SupportedHandleTypes -P:CallKit.CXProviderConfiguration.SupportsVideo -P:CallKit.CXSetGroupCallAction.CallUuidToGroupWith P:CallKit.CXSetHeldCallAction.OnHold P:CallKit.CXSetMutedCallAction.Muted -P:CallKit.CXStartCallAction.CallHandle -P:CallKit.CXStartCallAction.ContactIdentifier P:CallKit.CXStartCallAction.Video -P:CallKit.CXTransaction.Actions P:CallKit.CXTransaction.Complete -P:CallKit.CXTransaction.Uuid -P:CarPlay.CPActionSheetTemplate.Actions -P:CarPlay.CPActionSheetTemplate.Message -P:CarPlay.CPActionSheetTemplate.Title -P:CarPlay.CPAlertAction.Color -P:CarPlay.CPAlertAction.Handler -P:CarPlay.CPAlertAction.Style -P:CarPlay.CPAlertAction.Title -P:CarPlay.CPAlertTemplate.Actions -P:CarPlay.CPAlertTemplate.MaximumActionCount -P:CarPlay.CPAlertTemplate.TitleVariants P:CarPlay.CPApplicationDelegate.Window -P:CarPlay.CPAssistantCellConfiguration.AssistantAction -P:CarPlay.CPAssistantCellConfiguration.Position -P:CarPlay.CPAssistantCellConfiguration.Visibility -P:CarPlay.CPBarButton.ButtonStyle -P:CarPlay.CPBarButton.ButtonType P:CarPlay.CPBarButton.Enabled -P:CarPlay.CPBarButton.Image -P:CarPlay.CPBarButton.Title P:CarPlay.CPButton.Enabled -P:CarPlay.CPButton.Image P:CarPlay.CPButton.MaximumImageSize -P:CarPlay.CPButton.Title -P:CarPlay.CPContact.Actions -P:CarPlay.CPContact.Image -P:CarPlay.CPContact.InformativeText -P:CarPlay.CPContact.Name -P:CarPlay.CPContact.Subtitle -P:CarPlay.CPContactMessageButton.PhoneOrEmail -P:CarPlay.CPContactTemplate.BackButton -P:CarPlay.CPContactTemplate.Contact -P:CarPlay.CPContactTemplate.LeadingNavigationBarButtons -P:CarPlay.CPContactTemplate.TrailingNavigationBarButtons -P:CarPlay.CPDashboardButton.Image -P:CarPlay.CPDashboardButton.SubtitleVariants -P:CarPlay.CPDashboardButton.TitleVariants -P:CarPlay.CPDashboardController.ShortcutButtons P:CarPlay.CPGridButton.Enabled -P:CarPlay.CPGridButton.Image -P:CarPlay.CPGridButton.TitleVariants -P:CarPlay.CPGridTemplate.BackButton -P:CarPlay.CPGridTemplate.GridButtons -P:CarPlay.CPGridTemplate.LeadingNavigationBarButtons P:CarPlay.CPGridTemplate.MaximumItems -P:CarPlay.CPGridTemplate.Title -P:CarPlay.CPGridTemplate.TrailingNavigationBarButtons -P:CarPlay.CPImageSet.DarkContentImage -P:CarPlay.CPImageSet.LightContentImage -P:CarPlay.CPInformationItem.Detail -P:CarPlay.CPInformationItem.Title -P:CarPlay.CPInformationRatingItem.MaximumRating -P:CarPlay.CPInformationRatingItem.Rating -P:CarPlay.CPInformationTemplate.Actions -P:CarPlay.CPInformationTemplate.BackButton -P:CarPlay.CPInformationTemplate.Items -P:CarPlay.CPInformationTemplate.Layout -P:CarPlay.CPInformationTemplate.LeadingNavigationBarButtons -P:CarPlay.CPInformationTemplate.Title -P:CarPlay.CPInformationTemplate.TrailingNavigationBarButtons -P:CarPlay.CPInstrumentClusterController.AttributedInactiveDescriptionVariants -P:CarPlay.CPInstrumentClusterController.CompassSetting P:CarPlay.CPInstrumentClusterController.Delegate -P:CarPlay.CPInstrumentClusterController.InactiveDescriptionVariants -P:CarPlay.CPInstrumentClusterController.InstrumentClusterWindow -P:CarPlay.CPInstrumentClusterController.SpeedLimitSetting -P:CarPlay.CPInstrumentClusterController.WeakDelegate -P:CarPlay.CPInterfaceController.CarTraitCollection P:CarPlay.CPInterfaceController.Delegate -P:CarPlay.CPInterfaceController.PrefersDarkUserInterfaceStyle -P:CarPlay.CPInterfaceController.PresentedTemplate -P:CarPlay.CPInterfaceController.RootTemplate -P:CarPlay.CPInterfaceController.Templates -P:CarPlay.CPInterfaceController.TopTemplate -P:CarPlay.CPInterfaceController.WeakDelegate -P:CarPlay.CPLane.Angles -P:CarPlay.CPLane.HighlightedAngle -P:CarPlay.CPLane.PrimaryAngle -P:CarPlay.CPLane.SecondaryAngles -P:CarPlay.CPLane.Status -P:CarPlay.CPLaneGuidance.InstructionVariants -P:CarPlay.CPLaneGuidance.Lanes P:CarPlay.CPListImageRowItem.Enabled -P:CarPlay.CPListImageRowItem.GridImages -P:CarPlay.CPListImageRowItem.Handler -P:CarPlay.CPListImageRowItem.ImageTitles -P:CarPlay.CPListImageRowItem.ListImageRowHandler -P:CarPlay.CPListImageRowItem.MaximumImageSize P:CarPlay.CPListImageRowItem.MaximumNumberOfGridImages -P:CarPlay.CPListImageRowItem.Text -P:CarPlay.CPListImageRowItem.UserInfo -P:CarPlay.CPListItem.AccessoryImage -P:CarPlay.CPListItem.AccessoryType -P:CarPlay.CPListItem.DetailText P:CarPlay.CPListItem.Enabled -P:CarPlay.CPListItem.Handler -P:CarPlay.CPListItem.Image P:CarPlay.CPListItem.IsExplicitContent P:CarPlay.CPListItem.IsPlaying -P:CarPlay.CPListItem.MaximumImageSize -P:CarPlay.CPListItem.PlaybackProgress -P:CarPlay.CPListItem.PlayingIndicatorLocation -P:CarPlay.CPListItem.ShowsDisclosureIndicator -P:CarPlay.CPListItem.Text -P:CarPlay.CPListItem.UserInfo -P:CarPlay.CPListSection.Header -P:CarPlay.CPListSection.HeaderButton -P:CarPlay.CPListSection.HeaderImage -P:CarPlay.CPListSection.HeaderSubtitle -P:CarPlay.CPListSection.Items2 P:CarPlay.CPListSection.MaximumImageSize -P:CarPlay.CPListSection.SectionIndexTitle -P:CarPlay.CPListTemplate.AssistantCellConfiguration -P:CarPlay.CPListTemplate.BackButton P:CarPlay.CPListTemplate.Delegate -P:CarPlay.CPListTemplate.EmptyViewSubtitleVariants -P:CarPlay.CPListTemplate.EmptyViewTitleVariants -P:CarPlay.CPListTemplate.ItemCount -P:CarPlay.CPListTemplate.LeadingNavigationBarButtons -P:CarPlay.CPListTemplate.MaximumItemCount -P:CarPlay.CPListTemplate.MaximumSectionCount -P:CarPlay.CPListTemplate.SectionCount -P:CarPlay.CPListTemplate.Sections -P:CarPlay.CPListTemplate.Title -P:CarPlay.CPListTemplate.TrailingNavigationBarButtons -P:CarPlay.CPListTemplate.WeakDelegate -P:CarPlay.CPManeuver.AttributedInstructionVariants -P:CarPlay.CPManeuver.CardBackgroundColor -P:CarPlay.CPManeuver.DashboardAttributedInstructionVariants -P:CarPlay.CPManeuver.DashboardInstructionVariants -P:CarPlay.CPManeuver.DashboardJunctionImage -P:CarPlay.CPManeuver.DashboardSymbolImage -P:CarPlay.CPManeuver.HighwayExitLabel -P:CarPlay.CPManeuver.InitialTravelEstimates -P:CarPlay.CPManeuver.InstructionVariants -P:CarPlay.CPManeuver.JunctionElementAngles -P:CarPlay.CPManeuver.JunctionExitAngle -P:CarPlay.CPManeuver.JunctionImage -P:CarPlay.CPManeuver.JunctionType -P:CarPlay.CPManeuver.LinkedLaneGuidance -P:CarPlay.CPManeuver.ManeuverType -P:CarPlay.CPManeuver.NotificationAttributedInstructionVariants -P:CarPlay.CPManeuver.NotificationInstructionVariants -P:CarPlay.CPManeuver.NotificationSymbolImage -P:CarPlay.CPManeuver.RoadFollowingManeuverVariants -P:CarPlay.CPManeuver.SymbolImage -P:CarPlay.CPManeuver.SymbolSet -P:CarPlay.CPManeuver.TrafficSide -P:CarPlay.CPManeuver.UserInfo P:CarPlay.CPMapButton.Enabled -P:CarPlay.CPMapButton.FocusedImage P:CarPlay.CPMapButton.Hidden -P:CarPlay.CPMapButton.Image -P:CarPlay.CPMapTemplate.AutomaticallyHidesNavigationBar -P:CarPlay.CPMapTemplate.BackButton -P:CarPlay.CPMapTemplate.CurrentNavigationAlert -P:CarPlay.CPMapTemplate.GuidanceBackgroundColor -P:CarPlay.CPMapTemplate.HidesButtonsWithNavigationBar -P:CarPlay.CPMapTemplate.LeadingNavigationBarButtons -P:CarPlay.CPMapTemplate.MapButtons P:CarPlay.CPMapTemplate.MapDelegate P:CarPlay.CPMapTemplate.PanningInterfaceVisible -P:CarPlay.CPMapTemplate.TrailingNavigationBarButtons -P:CarPlay.CPMapTemplate.TripEstimateStyle -P:CarPlay.CPMapTemplate.WeakMapDelegate -P:CarPlay.CPMessageListItem.ConversationIdentifier -P:CarPlay.CPMessageListItem.DetailText P:CarPlay.CPMessageListItem.Enabled -P:CarPlay.CPMessageListItem.LeadingConfiguration P:CarPlay.CPMessageListItem.MaximumMessageItemImageSize -P:CarPlay.CPMessageListItem.PhoneOrEmailAddress -P:CarPlay.CPMessageListItem.Text -P:CarPlay.CPMessageListItem.TrailingConfiguration -P:CarPlay.CPMessageListItem.TrailingText -P:CarPlay.CPMessageListItem.UserInfo -P:CarPlay.CPMessageListItemLeadingConfiguration.LeadingImage -P:CarPlay.CPMessageListItemLeadingConfiguration.LeadingItem P:CarPlay.CPMessageListItemLeadingConfiguration.Unread -P:CarPlay.CPMessageListItemTrailingConfiguration.TrailingImage -P:CarPlay.CPMessageListItemTrailingConfiguration.TrailingItem -P:CarPlay.CPNavigationAlert.Duration -P:CarPlay.CPNavigationAlert.Image -P:CarPlay.CPNavigationAlert.ImageSet -P:CarPlay.CPNavigationAlert.PrimaryAction -P:CarPlay.CPNavigationAlert.SecondaryAction -P:CarPlay.CPNavigationAlert.SubtitleVariants -P:CarPlay.CPNavigationAlert.TitleVariants -P:CarPlay.CPNavigationSession.CurrentLaneGuidance -P:CarPlay.CPNavigationSession.CurrentRoadNameVariants -P:CarPlay.CPNavigationSession.ManeuverState -P:CarPlay.CPNavigationSession.Trip -P:CarPlay.CPNavigationSession.UpcomingManeuvers P:CarPlay.CPNowPlayingButton.Enabled P:CarPlay.CPNowPlayingButton.MaximumImageSize P:CarPlay.CPNowPlayingButton.Selected -P:CarPlay.CPNowPlayingImageButton.Image P:CarPlay.CPNowPlayingTemplate.IsAlbumArtistButtonEnabled P:CarPlay.CPNowPlayingTemplate.IsUpNextButtonEnabled -P:CarPlay.CPNowPlayingTemplate.NowPlayingButtons -P:CarPlay.CPNowPlayingTemplate.SharedTemplate -P:CarPlay.CPNowPlayingTemplate.UpNextTitle -P:CarPlay.CPPointOfInterest.DetailSubtitle -P:CarPlay.CPPointOfInterest.DetailSummary -P:CarPlay.CPPointOfInterest.DetailTitle -P:CarPlay.CPPointOfInterest.Location -P:CarPlay.CPPointOfInterest.PinImage -P:CarPlay.CPPointOfInterest.PinImageSize -P:CarPlay.CPPointOfInterest.PrimaryButton -P:CarPlay.CPPointOfInterest.SecondaryButton -P:CarPlay.CPPointOfInterest.SelectedPinImage -P:CarPlay.CPPointOfInterest.SelectedPinImageSize -P:CarPlay.CPPointOfInterest.Subtitle -P:CarPlay.CPPointOfInterest.Summary -P:CarPlay.CPPointOfInterest.Title -P:CarPlay.CPPointOfInterest.UserInfo -P:CarPlay.CPPointOfInterestTemplate.BackButton -P:CarPlay.CPPointOfInterestTemplate.LeadingNavigationBarButtons P:CarPlay.CPPointOfInterestTemplate.PointOfInterestDelegate -P:CarPlay.CPPointOfInterestTemplate.PointsOfInterest -P:CarPlay.CPPointOfInterestTemplate.SelectedIndex -P:CarPlay.CPPointOfInterestTemplate.Title -P:CarPlay.CPPointOfInterestTemplate.TrailingNavigationBarButtons -P:CarPlay.CPPointOfInterestTemplate.WeakPointOfInterestDelegate -P:CarPlay.CPRouteChoice.AdditionalInformationVariants -P:CarPlay.CPRouteChoice.SelectionSummaryVariants -P:CarPlay.CPRouteChoice.SummaryVariants -P:CarPlay.CPRouteChoice.UserInfo -P:CarPlay.CPRouteInformation.CurrentLaneGuidance -P:CarPlay.CPRouteInformation.CurrentManeuvers -P:CarPlay.CPRouteInformation.LaneGuidances -P:CarPlay.CPRouteInformation.Maneuvers -P:CarPlay.CPRouteInformation.ManeuverTravelEstimates -P:CarPlay.CPRouteInformation.TripTravelEstimates P:CarPlay.CPSearchTemplate.Delegate -P:CarPlay.CPSearchTemplate.WeakDelegate -P:CarPlay.CPSessionConfiguration.ContentStyle P:CarPlay.CPSessionConfiguration.Delegate -P:CarPlay.CPSessionConfiguration.LimitedUserInterfaces -P:CarPlay.CPSessionConfiguration.WeakDelegate P:CarPlay.CPTabBarTemplate.Delegate -P:CarPlay.CPTabBarTemplate.MaximumTabCount -P:CarPlay.CPTabBarTemplate.SelectedTemplate -P:CarPlay.CPTabBarTemplate.Templates -P:CarPlay.CPTabBarTemplate.WeakDelegate -P:CarPlay.CPTemplate.ShowsTabBadge -P:CarPlay.CPTemplate.TabImage -P:CarPlay.CPTemplate.TabSystemItem -P:CarPlay.CPTemplate.TabTitle -P:CarPlay.CPTemplate.UserInfo -P:CarPlay.CPTemplateApplicationDashboardScene.DashboardController -P:CarPlay.CPTemplateApplicationDashboardScene.DashboardWindow P:CarPlay.CPTemplateApplicationDashboardScene.Delegate P:CarPlay.CPTemplateApplicationDashboardScene.SessionRoleApplication -P:CarPlay.CPTemplateApplicationDashboardScene.WeakDelegate -P:CarPlay.CPTemplateApplicationInstrumentClusterScene.ContentStyle P:CarPlay.CPTemplateApplicationInstrumentClusterScene.Delegate -P:CarPlay.CPTemplateApplicationInstrumentClusterScene.InstrumentClusterController P:CarPlay.CPTemplateApplicationInstrumentClusterScene.SessionRoleApplication -P:CarPlay.CPTemplateApplicationInstrumentClusterScene.WeakDelegate -P:CarPlay.CPTemplateApplicationScene.CarWindow -P:CarPlay.CPTemplateApplicationScene.ContentStyle P:CarPlay.CPTemplateApplicationScene.Delegate -P:CarPlay.CPTemplateApplicationScene.InterfaceController P:CarPlay.CPTemplateApplicationScene.SessionRoleApplication -P:CarPlay.CPTemplateApplicationScene.WeakDelegate -P:CarPlay.CPTextButton.TextStyle -P:CarPlay.CPTextButton.Title -P:CarPlay.CPTravelEstimates.DistanceRemaining -P:CarPlay.CPTravelEstimates.DistanceRemainingToDisplay -P:CarPlay.CPTravelEstimates.TimeRemaining -P:CarPlay.CPTrip.Destination -P:CarPlay.CPTrip.DestinationNameVariants -P:CarPlay.CPTrip.Origin -P:CarPlay.CPTrip.RouteChoices -P:CarPlay.CPTrip.UserInfo -P:CarPlay.CPTripPreviewTextConfiguration.AdditionalRoutesButtonTitle -P:CarPlay.CPTripPreviewTextConfiguration.OverviewButtonTitle -P:CarPlay.CPTripPreviewTextConfiguration.StartButtonTitle -P:CarPlay.CPVoiceControlState.Identifier -P:CarPlay.CPVoiceControlState.Image -P:CarPlay.CPVoiceControlState.Repeats -P:CarPlay.CPVoiceControlState.TitleVariants -P:CarPlay.CPVoiceControlTemplate.ActiveStateIdentifier -P:CarPlay.CPVoiceControlTemplate.VoiceControlStates -P:CarPlay.CPWindow.MapButtonSafeAreaLayoutGuide -P:CarPlay.CPWindow.TemplateApplicationScene P:CarPlay.ICPBarButtonProviding.BackButton P:CarPlay.ICPBarButtonProviding.LeadingNavigationBarButtons P:CarPlay.ICPBarButtonProviding.TrailingNavigationBarButtons @@ -60796,56 +52880,20 @@ P:Cinematic.CNDecision.StrongDecision P:Cinematic.CNDecision.UserDecision P:Cinematic.CNDetectionTrack.Discrete P:Cinematic.CNDetectionTrack.UserCreated -P:ClassKit.CLSActivity.AdditionalActivityItems -P:ClassKit.CLSActivity.Duration -P:ClassKit.CLSActivity.PrimaryActivityItem -P:ClassKit.CLSActivity.Progress P:ClassKit.CLSActivity.Started -P:ClassKit.CLSActivityItem.Identifier -P:ClassKit.CLSActivityItem.Title -P:ClassKit.CLSBinaryItem.Value -P:ClassKit.CLSBinaryItem.ValueType P:ClassKit.CLSContext.Active P:ClassKit.CLSContext.Assignable -P:ClassKit.CLSContext.CurrentActivity -P:ClassKit.CLSContext.CustomTypeName -P:ClassKit.CLSContext.DisplayOrder -P:ClassKit.CLSContext.Identifier -P:ClassKit.CLSContext.IdentifierPath -P:ClassKit.CLSContext.NavigationChildContexts -P:ClassKit.CLSContext.Parent -P:ClassKit.CLSContext.ProgressReportingCapabilities -P:ClassKit.CLSContext.SuggestedAge -P:ClassKit.CLSContext.SuggestedCompletionTime -P:ClassKit.CLSContext.Summary -P:ClassKit.CLSContext.Thumbnail -P:ClassKit.CLSContext.Title P:ClassKit.CLSContext.Topic -P:ClassKit.CLSContext.Type -P:ClassKit.CLSContext.UniversalLinkUrl -P:ClassKit.CLSContext.WeakTopic -P:ClassKit.CLSDataStore.ActiveContext P:ClassKit.CLSDataStore.Delegate -P:ClassKit.CLSDataStore.MainAppContext -P:ClassKit.CLSDataStore.RunningActivity -P:ClassKit.CLSDataStore.Shared -P:ClassKit.CLSDataStore.WeakDelegate P:ClassKit.CLSErrorUserInfoKeys.ObjectKey P:ClassKit.CLSErrorUserInfoKeys.SuccessfulObjectsKey P:ClassKit.CLSErrorUserInfoKeys.UnderlyingErrorsKey -P:ClassKit.CLSObject.DateCreated -P:ClassKit.CLSObject.DateLastModified P:ClassKit.CLSPredicateKeyPath.DateCreated P:ClassKit.CLSPredicateKeyPath.Identifier P:ClassKit.CLSPredicateKeyPath.Parent P:ClassKit.CLSPredicateKeyPath.Title P:ClassKit.CLSPredicateKeyPath.Topic P:ClassKit.CLSPredicateKeyPath.UniversalLinkUrl -P:ClassKit.CLSProgressReportingCapability.Details -P:ClassKit.CLSProgressReportingCapability.Kind -P:ClassKit.CLSQuantityItem.Quantity -P:ClassKit.CLSScoreItem.MaxScore -P:ClassKit.CLSScoreItem.Score P:CloudKit.CKContainer.AccountChangedNotification P:CloudKit.CKContainer.CurrentUserDefaultName P:CloudKit.CKContainer.OwnerDefaultName @@ -60885,9 +52933,6 @@ P:CloudKit.CKRecordZone.DefaultName P:CloudKit.CKShareKeys.ThumbnailImageData P:CloudKit.CKShareKeys.Title P:CloudKit.CKShareKeys.Type -P:CloudKit.CKSubscription.Predicate -P:CloudKit.CKSubscription.RecordType -P:CloudKit.CKSubscription.ZoneID P:CloudKit.CKSyncEngineConfiguration.Delegate P:Compression.CompressionStream.BaseStream P:Compression.CompressionStream.CanRead @@ -60895,71 +52940,11 @@ P:Compression.CompressionStream.CanSeek P:Compression.CompressionStream.CanWrite P:Compression.CompressionStream.Length P:Compression.CompressionStream.Position -P:Contacts.CNChangeHistoryAddContactEvent.Contact -P:Contacts.CNChangeHistoryAddContactEvent.ContainerIdentifier -P:Contacts.CNChangeHistoryAddGroupEvent.ContainerIdentifier -P:Contacts.CNChangeHistoryAddGroupEvent.Group -P:Contacts.CNChangeHistoryAddMemberToGroupEvent.Group -P:Contacts.CNChangeHistoryAddMemberToGroupEvent.Member -P:Contacts.CNChangeHistoryAddSubgroupToGroupEvent.Group -P:Contacts.CNChangeHistoryAddSubgroupToGroupEvent.Subgroup -P:Contacts.CNChangeHistoryDeleteContactEvent.ContactIdentifier -P:Contacts.CNChangeHistoryDeleteGroupEvent.GroupIdentifier -P:Contacts.CNChangeHistoryFetchRequest.AdditionalContactKeyDescriptors -P:Contacts.CNChangeHistoryFetchRequest.ExcludedTransactionAuthors -P:Contacts.CNChangeHistoryFetchRequest.IncludeGroupChanges -P:Contacts.CNChangeHistoryFetchRequest.MutableObjects -P:Contacts.CNChangeHistoryFetchRequest.ShouldUnifyResults -P:Contacts.CNChangeHistoryFetchRequest.StartingToken -P:Contacts.CNChangeHistoryRemoveMemberFromGroupEvent.Group -P:Contacts.CNChangeHistoryRemoveMemberFromGroupEvent.Member -P:Contacts.CNChangeHistoryRemoveSubgroupFromGroupEvent.Group -P:Contacts.CNChangeHistoryRemoveSubgroupFromGroupEvent.Subgroup -P:Contacts.CNChangeHistoryUpdateContactEvent.Contact -P:Contacts.CNChangeHistoryUpdateGroupEvent.Group -P:Contacts.CNContact.Birthday -P:Contacts.CNContact.ContactRelations -P:Contacts.CNContact.ContactType -P:Contacts.CNContact.Dates -P:Contacts.CNContact.DepartmentName -P:Contacts.CNContact.EmailAddresses -P:Contacts.CNContact.FamilyName -P:Contacts.CNContact.GivenName -P:Contacts.CNContact.Identifier -P:Contacts.CNContact.ImageData -P:Contacts.CNContact.ImageDataAvailable -P:Contacts.CNContact.InstantMessageAddresses -P:Contacts.CNContact.JobTitle -P:Contacts.CNContact.MiddleName -P:Contacts.CNContact.NamePrefix -P:Contacts.CNContact.NameSuffix -P:Contacts.CNContact.Nickname -P:Contacts.CNContact.NonGregorianBirthday -P:Contacts.CNContact.Note -P:Contacts.CNContact.OrganizationName -P:Contacts.CNContact.PhoneNumbers -P:Contacts.CNContact.PhoneticFamilyName -P:Contacts.CNContact.PhoneticGivenName -P:Contacts.CNContact.PhoneticMiddleName -P:Contacts.CNContact.PhoneticOrganizationName -P:Contacts.CNContact.PostalAddresses -P:Contacts.CNContact.PreviousFamilyName P:Contacts.CNContact.PropertyNotFetchedExceptionName P:Contacts.CNContact.ReadableTypeIdentifiers -P:Contacts.CNContact.SocialProfiles -P:Contacts.CNContact.ThumbnailImageData -P:Contacts.CNContact.UrlAddresses P:Contacts.CNContact.WritableTypeIdentifiers P:Contacts.CNContact.WritableTypeIdentifiersForItemProvider -P:Contacts.CNContactFetchRequest.KeysToFetch -P:Contacts.CNContactFetchRequest.MutableObjects -P:Contacts.CNContactFetchRequest.Predicate -P:Contacts.CNContactFetchRequest.SortOrder -P:Contacts.CNContactFetchRequest.UnifyResults P:Contacts.CNContactFormatter.ContactPropertyAttribute -P:Contacts.CNContactFormatter.RequiredKeysForDelimiter -P:Contacts.CNContactFormatter.RequiredKeysForNameOrder -P:Contacts.CNContactFormatter.Style P:Contacts.CNContactKey.Birthday P:Contacts.CNContactKey.Dates P:Contacts.CNContactKey.DepartmentName @@ -60990,20 +52975,7 @@ P:Contacts.CNContactKey.SocialProfiles P:Contacts.CNContactKey.ThumbnailImageData P:Contacts.CNContactKey.Type P:Contacts.CNContactKey.UrlAddresses -P:Contacts.CNContactProperty.Contact -P:Contacts.CNContactProperty.Identifier -P:Contacts.CNContactProperty.Key -P:Contacts.CNContactProperty.Label -P:Contacts.CNContactProperty.Value -P:Contacts.CNContactRelation.Name -P:Contacts.CNContactStore.CurrentHistoryToken -P:Contacts.CNContactStore.DefaultContainerIdentifier P:Contacts.CNContactStore.NotificationDidChange -P:Contacts.CNContactsUserDefaults.CountryCode -P:Contacts.CNContactsUserDefaults.SortOrder -P:Contacts.CNContainer.ContainerType -P:Contacts.CNContainer.Identifier -P:Contacts.CNContainer.Name P:Contacts.CNContainerKey.Identifier P:Contacts.CNContainerKey.Name P:Contacts.CNContainerKey.Type @@ -61011,14 +52983,8 @@ P:Contacts.CNErrorUserInfoKey.AffectedRecordIdentifiers P:Contacts.CNErrorUserInfoKey.AffectedRecords P:Contacts.CNErrorUserInfoKey.KeyPaths P:Contacts.CNErrorUserInfoKey.ValidationErrors -P:Contacts.CNFetchResult`1.CurrentHistoryToken -P:Contacts.CNFetchResult`1.Value -P:Contacts.CNGroup.Identifier -P:Contacts.CNGroup.Name P:Contacts.CNGroupKey.Identifier P:Contacts.CNGroupKey.Name -P:Contacts.CNInstantMessageAddress.Service -P:Contacts.CNInstantMessageAddress.Username P:Contacts.CNInstantMessageAddressKey.Service P:Contacts.CNInstantMessageAddressKey.Username P:Contacts.CNInstantMessageServiceKey.Aim @@ -61247,9 +53213,6 @@ P:Contacts.CNLabelContactRelationKey.YoungerSister P:Contacts.CNLabelContactRelationKey.YoungerSisterInLaw P:Contacts.CNLabelContactRelationKey.YoungestBrother P:Contacts.CNLabelContactRelationKey.YoungestSister -P:Contacts.CNLabeledValue`1.Identifier -P:Contacts.CNLabeledValue`1.Label -P:Contacts.CNLabeledValue`1.Value P:Contacts.CNLabelKey.DateAnniversary P:Contacts.CNLabelKey.EmailiCloud P:Contacts.CNLabelKey.Home @@ -61265,60 +53228,8 @@ P:Contacts.CNLabelPhoneNumberKey.Mobile P:Contacts.CNLabelPhoneNumberKey.OtherFax P:Contacts.CNLabelPhoneNumberKey.Pager P:Contacts.CNLabelPhoneNumberKey.WorkFax -P:Contacts.CNMutableContact.Birthday -P:Contacts.CNMutableContact.ContactRelations -P:Contacts.CNMutableContact.ContactType -P:Contacts.CNMutableContact.Dates -P:Contacts.CNMutableContact.DepartmentName -P:Contacts.CNMutableContact.EmailAddresses -P:Contacts.CNMutableContact.FamilyName -P:Contacts.CNMutableContact.GivenName -P:Contacts.CNMutableContact.ImageData -P:Contacts.CNMutableContact.InstantMessageAddresses -P:Contacts.CNMutableContact.JobTitle -P:Contacts.CNMutableContact.MiddleName -P:Contacts.CNMutableContact.NamePrefix -P:Contacts.CNMutableContact.NameSuffix -P:Contacts.CNMutableContact.Nickname -P:Contacts.CNMutableContact.NonGregorianBirthday -P:Contacts.CNMutableContact.Note -P:Contacts.CNMutableContact.OrganizationName -P:Contacts.CNMutableContact.PhoneNumbers -P:Contacts.CNMutableContact.PhoneticFamilyName -P:Contacts.CNMutableContact.PhoneticGivenName -P:Contacts.CNMutableContact.PhoneticMiddleName -P:Contacts.CNMutableContact.PhoneticOrganizationName -P:Contacts.CNMutableContact.PostalAddresses -P:Contacts.CNMutableContact.PreviousFamilyName -P:Contacts.CNMutableContact.SocialProfiles -P:Contacts.CNMutableContact.UrlAddresses -P:Contacts.CNMutableGroup.Name -P:Contacts.CNMutablePostalAddress.City -P:Contacts.CNMutablePostalAddress.Country -P:Contacts.CNMutablePostalAddress.IsoCountryCode -P:Contacts.CNMutablePostalAddress.PostalCode -P:Contacts.CNMutablePostalAddress.State -P:Contacts.CNMutablePostalAddress.Street -P:Contacts.CNMutablePostalAddress.SubAdministrativeArea -P:Contacts.CNMutablePostalAddress.SubLocality -P:Contacts.CNPhoneNumber.StringValue -P:Contacts.CNPostalAddress.City -P:Contacts.CNPostalAddress.Country -P:Contacts.CNPostalAddress.IsoCountryCode -P:Contacts.CNPostalAddress.PostalCode -P:Contacts.CNPostalAddress.State -P:Contacts.CNPostalAddress.Street -P:Contacts.CNPostalAddress.SubAdministrativeArea -P:Contacts.CNPostalAddress.SubLocality P:Contacts.CNPostalAddressFormatter.LocalizedPropertyNameAttribute P:Contacts.CNPostalAddressFormatter.PropertyAttribute -P:Contacts.CNPostalAddressFormatter.Style -P:Contacts.CNSaveRequest.ShouldRefetchContacts -P:Contacts.CNSaveRequest.TransactionAuthor -P:Contacts.CNSocialProfile.Service -P:Contacts.CNSocialProfile.UrlString -P:Contacts.CNSocialProfile.UserIdentifier -P:Contacts.CNSocialProfile.Username P:Contacts.CNSocialProfileKey.Service P:Contacts.CNSocialProfileKey.UrlString P:Contacts.CNSocialProfileKey.UserIdentifier @@ -61722,7 +53633,6 @@ P:CoreAnimation.ICAMediaTiming.Speed P:CoreAnimation.ICAMediaTiming.TimeOffset P:CoreAnimation.ICAMetalDrawable.Layer P:CoreAnimation.ICAMetalDrawable.Texture -P:CoreAudioKit.AUGenericView.CustomViewPersistentData P:CoreAudioKit.CAInterAppAudioSwitcherView.ShowingAppNames P:CoreAudioKit.CAInterAppAudioTransportView.Connected P:CoreAudioKit.CAInterAppAudioTransportView.Enabled @@ -64938,10 +56848,6 @@ P:CoreLocation.CLVisit.Coordinate P:CoreLocation.CLVisit.DepartureDate P:CoreLocation.CLVisit.HorizontalAccuracy P:CoreLocation.CLVisitedEventArgs.Visit -P:CoreLocationUI.CLLocationButton.CornerRadius -P:CoreLocationUI.CLLocationButton.FontSize -P:CoreLocationUI.CLLocationButton.Icon -P:CoreLocationUI.CLLocationButton.Label P:CoreMedia.CMBlockBuffer.DataLength P:CoreMedia.CMBlockBuffer.IsEmpty P:CoreMedia.CMBufferQueue.BufferCount @@ -66562,9 +58468,7 @@ P:Darwin.Message.Sender P:Darwin.Message.Time P:Darwin.Message.UID P:Darwin.SystemLog.Default -P:DeviceCheck.DCAppAttestService.SharedService P:DeviceCheck.DCAppAttestService.Supported -P:DeviceCheck.DCDevice.CurrentDevice P:DeviceCheck.DCDevice.Supported P:DeviceDiscoveryExtension.DDDevice.NetworkEndpoint P:DeviceDiscoveryExtension.DDDeviceProtocolStrings.Dial @@ -66597,8 +58501,6 @@ P:EventKitUI.EKEventViewEventArgs.Action P:EventKitUI.EKUIBundle.UIBundle P:ExecutionPolicy.EPDeveloperTool.AuthorizationStatus P:ExtensionKit.EXHostViewController.Delegate -P:ExtensionKit.EXHostViewController.PlaceholderView -P:ExtensionKit.EXHostViewController.WeakDelegate P:ExternalAccessory.EAAccessory.Connected P:ExternalAccessory.EAAccessory.ConnectionID P:ExternalAccessory.EAAccessory.Delegate @@ -66773,7 +58675,6 @@ P:Foundation.NSArchiveReplaceEventArgs.OldObject P:Foundation.NSArray`1.Item(System.IntPtr) P:Foundation.NSAttributedString.CocoaVersionDocumentAttribute P:Foundation.NSAttributedString.ContainsAttachments -P:Foundation.NSAttributedString.ReadableTypeIdentifiers P:Foundation.NSAttributedString.Size P:Foundation.NSAttributedString.SourceTextScalingDocumentAttribute P:Foundation.NSAttributedString.TextLayoutSectionOrientation @@ -66782,8 +58683,6 @@ P:Foundation.NSAttributedString.TextLayoutSectionsAttribute P:Foundation.NSAttributedString.TextScalingDocumentAttribute P:Foundation.NSAttributedString.UnderlineByWordMaskAttributeName P:Foundation.NSAttributedString.Value -P:Foundation.NSAttributedString.WritableTypeIdentifiers -P:Foundation.NSAttributedString.WritableTypeIdentifiersForItemProvider P:Foundation.NSAttributedStringDocumentAttributes.Appearance P:Foundation.NSAttributedStringDocumentAttributes.Author P:Foundation.NSAttributedStringDocumentAttributes.BackgroundColor @@ -66965,10 +58864,6 @@ P:Foundation.NSFileManager.TypeSymbolicLink P:Foundation.NSFileManager.TypeUnknown P:Foundation.NSFileManager.UbiquityIdentityDidChangeNotification P:Foundation.NSFileManager.UserName -P:Foundation.NSFilePresenter.PresentedItemObservedUbiquityAttributes -P:Foundation.NSFilePresenter.PresentedItemOperationQueue -P:Foundation.NSFilePresenter.PresentedItemUrl -P:Foundation.NSFilePresenter.PrimaryPresentedItemUrl P:Foundation.NSFileSystemAttributes.FreeNodes P:Foundation.NSFileSystemAttributes.FreeSize P:Foundation.NSFileSystemAttributes.Nodes @@ -67006,7 +58901,6 @@ P:Foundation.NSHttpCookie.KeyVersion P:Foundation.NSHttpCookieStorage.AcceptPolicyChangedNotification P:Foundation.NSHttpCookieStorage.CookiesChangedNotification P:Foundation.NSIndexPath.Item -P:Foundation.NSIndexPath.LongRow P:Foundation.NSIndexPath.LongSection P:Foundation.NSIndexPath.Row P:Foundation.NSIndexPath.Section @@ -67455,8 +59349,6 @@ P:Foundation.NSObject.ChangeKindKey P:Foundation.NSObject.ChangeNewKey P:Foundation.NSObject.ChangeNotificationIsPriorKey P:Foundation.NSObject.ChangeOldKey -P:Foundation.NSObject.DebugDescription -P:Foundation.NSObject.Description P:Foundation.NSObject.ExposedBindings P:Foundation.NSObject.RetainCount P:Foundation.NSObjectEventArgs.Obj @@ -67519,7 +59411,6 @@ P:Foundation.NSProgress.Pausable P:Foundation.NSProgress.Paused P:Foundation.NSProgress.Throughput P:Foundation.NSProgress.ThroughputKey -P:Foundation.NSPurgeableData.IsContentDiscarded P:Foundation.NSRunLoop.CurrentRunLoopMode P:Foundation.NSScriptCommandArgumentDescription.AppleEventCode P:Foundation.NSScriptCommandArgumentDescription.IsOptional @@ -67581,9 +59472,6 @@ P:Foundation.NSStream.SocksProxyVersionKey P:Foundation.NSStreamEventArgs.StreamEvent P:Foundation.NSString.IsAbsolutePath P:Foundation.NSString.Item(System.IntPtr) -P:Foundation.NSString.ReadableTypeIdentifiers -P:Foundation.NSString.WritableTypeIdentifiers -P:Foundation.NSString.WritableTypeIdentifiersForItemProvider P:Foundation.NSStringDrawingContext.ActualScaleFactor P:Foundation.NSStringDrawingContext.ActualTrackingAdjustment P:Foundation.NSStringDrawingContext.MinimumScaleFactor @@ -67645,27 +59533,6 @@ P:Foundation.NSUndoManager.WillCloseUndoGroupNotification P:Foundation.NSUndoManager.WillRedoChangeNotification P:Foundation.NSUndoManager.WillUndoChangeNotification P:Foundation.NSUndoManagerCloseUndoGroupEventArgs.Discardable -P:Foundation.NSUnitAcceleration.BaseUnit -P:Foundation.NSUnitAngle.BaseUnit -P:Foundation.NSUnitArea.BaseUnit -P:Foundation.NSUnitConcentrationMass.BaseUnit -P:Foundation.NSUnitDispersion.BaseUnit -P:Foundation.NSUnitDuration.BaseUnit -P:Foundation.NSUnitElectricCharge.BaseUnit -P:Foundation.NSUnitElectricCurrent.BaseUnit -P:Foundation.NSUnitElectricPotentialDifference.BaseUnit -P:Foundation.NSUnitElectricResistance.BaseUnit -P:Foundation.NSUnitEnergy.BaseUnit -P:Foundation.NSUnitFrequency.BaseUnit -P:Foundation.NSUnitFuelEfficiency.BaseUnit -P:Foundation.NSUnitIlluminance.BaseUnit -P:Foundation.NSUnitLength.BaseUnit -P:Foundation.NSUnitMass.BaseUnit -P:Foundation.NSUnitPower.BaseUnit -P:Foundation.NSUnitPressure.BaseUnit -P:Foundation.NSUnitSpeed.BaseUnit -P:Foundation.NSUnitTemperature.BaseUnit -P:Foundation.NSUnitVolume.BaseUnit P:Foundation.NSUrl.AddedToDirectoryDateKey P:Foundation.NSUrl.AttributeModificationDateKey P:Foundation.NSUrl.ContentAccessDateKey @@ -67735,7 +59602,6 @@ P:Foundation.NSUrl.PreferredIOBlockSizeKey P:Foundation.NSUrl.PreviewItemDisplayState P:Foundation.NSUrl.PreviewItemTitle P:Foundation.NSUrl.PreviewItemUrl -P:Foundation.NSUrl.ReadableTypeIdentifiers P:Foundation.NSUrl.ThumbnailDictionaryKey P:Foundation.NSUrl.TotalFileAllocatedSizeKey P:Foundation.NSUrl.TotalFileSizeKey @@ -67812,8 +59678,6 @@ P:Foundation.NSUrl.VolumeTypeNameKey P:Foundation.NSUrl.VolumeURLForRemountingKey P:Foundation.NSUrl.VolumeURLKey P:Foundation.NSUrl.VolumeUUIDStringKey -P:Foundation.NSUrl.WritableTypeIdentifiers -P:Foundation.NSUrl.WritableTypeIdentifiersForItemProvider P:Foundation.NSUrlAsyncResult.Data P:Foundation.NSUrlAsyncResult.Response P:Foundation.NSUrlCredential.SecIdentity @@ -67899,10 +59763,7 @@ P:Foundation.NSUserActivity.EligibleForPrediction P:Foundation.NSUserActivity.EligibleForPublicIndexing P:Foundation.NSUserActivity.EligibleForSearch P:Foundation.NSUserActivity.IsClassKitDeepLink -P:Foundation.NSUserActivity.ReadableTypeIdentifiers P:Foundation.NSUserActivity.SuggestedInvocationPhrase -P:Foundation.NSUserActivity.WritableTypeIdentifiers -P:Foundation.NSUserActivity.WritableTypeIdentifiersForItemProvider P:Foundation.NSUserActivityContinuation.Arg1 P:Foundation.NSUserActivityContinuation.Arg2 P:Foundation.NSUserActivityType.BrowsingWeb @@ -68674,204 +60535,28 @@ P:GameKit.GKVoiceChat.Active P:GameKit.GKVoiceChatService.InputMeteringEnabled P:GameKit.GKVoiceChatService.MicrophoneMuted P:GameKit.GKVoiceChatService.OutputMeteringEnabled -P:GameplayKit.GKAgent.Behavior -P:GameplayKit.GKAgent.Delegate -P:GameplayKit.GKAgent.Mass -P:GameplayKit.GKAgent.MaxAcceleration -P:GameplayKit.GKAgent.MaxSpeed -P:GameplayKit.GKAgent.Radius -P:GameplayKit.GKAgent.Speed -P:GameplayKit.GKAgent2D.Position -P:GameplayKit.GKAgent2D.Rotation -P:GameplayKit.GKAgent2D.Velocity -P:GameplayKit.GKAgent3D.Position -P:GameplayKit.GKAgent3D.RightHanded -P:GameplayKit.GKAgent3D.Rotation -P:GameplayKit.GKAgent3D.Velocity -P:GameplayKit.GKARC4RandomSource.Seed -P:GameplayKit.GKBehavior.GoalCount P:GameplayKit.GKBehavior.Item(GameplayKit.GKGoal) P:GameplayKit.GKBehavior.Item(System.UIntPtr) -P:GameplayKit.GKBillowNoiseSource.Persistence -P:GameplayKit.GKCheckerboardNoiseSource.SquareSize -P:GameplayKit.GKCircleObstacle.Position -P:GameplayKit.GKCircleObstacle.Radius -P:GameplayKit.GKCoherentNoiseSource.Frequency -P:GameplayKit.GKCoherentNoiseSource.Lacunarity -P:GameplayKit.GKCoherentNoiseSource.OctaveCount -P:GameplayKit.GKCoherentNoiseSource.Seed -P:GameplayKit.GKComponent.Entity -P:GameplayKit.GKComponentSystem`1.ComponentClass -P:GameplayKit.GKComponentSystem`1.Components P:GameplayKit.GKComponentSystem`1.ComponentType P:GameplayKit.GKComponentSystem`1.Item(System.UIntPtr) -P:GameplayKit.GKCompositeBehavior.BehaviorCount P:GameplayKit.GKCompositeBehavior.Item(GameplayKit.GKBehavior) P:GameplayKit.GKCompositeBehavior.Item(System.UIntPtr) -P:GameplayKit.GKConstantNoiseSource.Value -P:GameplayKit.GKCylindersNoiseSource.Frequency -P:GameplayKit.GKDecisionTree.RandomSource -P:GameplayKit.GKDecisionTree.RootNode -P:GameplayKit.GKEntity.Components -P:GameplayKit.GKGaussianDistribution.Deviation -P:GameplayKit.GKGaussianDistribution.Mean -P:GameplayKit.GKGraph.Nodes -P:GameplayKit.GKGraphNode.ConnectedNodes -P:GameplayKit.GKGraphNode2D.Position -P:GameplayKit.GKGraphNode3D.Position -P:GameplayKit.GKGridGraph.DiagonalsAllowed -P:GameplayKit.GKGridGraph.GridHeight -P:GameplayKit.GKGridGraph.GridOrigin -P:GameplayKit.GKGridGraph.GridWidth -P:GameplayKit.GKGridGraphNode.GridPosition P:GameplayKit.GKHybridStrategist.Budget P:GameplayKit.GKHybridStrategist.ExplorationParameter P:GameplayKit.GKHybridStrategist.GameModel P:GameplayKit.GKHybridStrategist.MaxLookAheadDepth P:GameplayKit.GKHybridStrategist.RandomSource -P:GameplayKit.GKLinearCongruentialRandomSource.Seed -P:GameplayKit.GKMersenneTwisterRandomSource.Seed -P:GameplayKit.GKMeshGraph`1.BufferRadius -P:GameplayKit.GKMeshGraph`1.Obstacles -P:GameplayKit.GKMeshGraph`1.TriangleCount -P:GameplayKit.GKMeshGraph`1.TriangulationMode -P:GameplayKit.GKMinMaxStrategist.GameModel -P:GameplayKit.GKMinMaxStrategist.MaxLookAheadDepth -P:GameplayKit.GKMinMaxStrategist.RandomSource -P:GameplayKit.GKMonteCarloStrategist.Budget -P:GameplayKit.GKMonteCarloStrategist.ExplorationParameter -P:GameplayKit.GKMonteCarloStrategist.GameModel -P:GameplayKit.GKMonteCarloStrategist.RandomSource -P:GameplayKit.GKNoise.GradientColors -P:GameplayKit.GKNoiseMap.Origin -P:GameplayKit.GKNoiseMap.SampleCount P:GameplayKit.GKNoiseMap.Seamless -P:GameplayKit.GKNoiseMap.Size -P:GameplayKit.GKNSPredicateRule.Predicate -P:GameplayKit.GKObstacleGraph.BufferRadius -P:GameplayKit.GKObstacleGraph.Obstacles -P:GameplayKit.GKOctreeNode.Box P:GameplayKit.GKPath.Cyclical -P:GameplayKit.GKPath.NumPoints -P:GameplayKit.GKPath.Radius -P:GameplayKit.GKPerlinNoiseSource.Persistence -P:GameplayKit.GKPolygonObstacle.VertexCount -P:GameplayKit.GKQuadTreeNode.Quad -P:GameplayKit.GKRandomDistribution.HighestValue -P:GameplayKit.GKRandomDistribution.LowestValue -P:GameplayKit.GKRandomDistribution.NumberOfPossibleOutcomes -P:GameplayKit.GKRandomSource.SharedRandom -P:GameplayKit.GKRTree`1.QueryReserve -P:GameplayKit.GKRule.Salience -P:GameplayKit.GKRuleSystem.Agenda -P:GameplayKit.GKRuleSystem.Executed -P:GameplayKit.GKRuleSystem.Facts -P:GameplayKit.GKRuleSystem.Rules -P:GameplayKit.GKRuleSystem.State -P:GameplayKit.GKScene.Entities -P:GameplayKit.GKScene.Graphs -P:GameplayKit.GKScene.RootNode -P:GameplayKit.GKSCNNodeComponent.Node -P:GameplayKit.GKSKNodeComponent.Node -P:GameplayKit.GKSphereObstacle.Position -P:GameplayKit.GKSphereObstacle.Radius -P:GameplayKit.GKSpheresNoiseSource.Frequency -P:GameplayKit.GKState.StateMachine -P:GameplayKit.GKStateMachine.CurrentState P:GameplayKit.GKTriangle.Points -P:GameplayKit.GKVoronoiNoiseSource.Displacement P:GameplayKit.GKVoronoiNoiseSource.DistanceEnabled -P:GameplayKit.GKVoronoiNoiseSource.Frequency -P:GameplayKit.GKVoronoiNoiseSource.Seed P:GameplayKit.IGKGameModelPlayer.PlayerId P:GameplayKit.IGKGameModelUpdate.Value P:GameplayKit.IGKStrategist.GameModel P:GameplayKit.IGKStrategist.RandomSource -P:GLKit.GLKBaseEffect.ColorMaterialEnabled -P:GLKit.GLKBaseEffect.ConstantColor -P:GLKit.GLKBaseEffect.Fog -P:GLKit.GLKBaseEffect.Label -P:GLKit.GLKBaseEffect.Light0 -P:GLKit.GLKBaseEffect.Light1 -P:GLKit.GLKBaseEffect.Light2 -P:GLKit.GLKBaseEffect.LightingType -P:GLKit.GLKBaseEffect.LightModelAmbientColor -P:GLKit.GLKBaseEffect.LightModelTwoSided -P:GLKit.GLKBaseEffect.Material -P:GLKit.GLKBaseEffect.Texture2d0 -P:GLKit.GLKBaseEffect.Texture2d1 -P:GLKit.GLKBaseEffect.TextureOrder -P:GLKit.GLKBaseEffect.Transform -P:GLKit.GLKBaseEffect.UseConstantColor -P:GLKit.GLKEffectPropertyFog.Color -P:GLKit.GLKEffectPropertyFog.Density -P:GLKit.GLKEffectPropertyFog.Enabled -P:GLKit.GLKEffectPropertyFog.End -P:GLKit.GLKEffectPropertyFog.Mode -P:GLKit.GLKEffectPropertyFog.Start -P:GLKit.GLKEffectPropertyLight.AmbientColor -P:GLKit.GLKEffectPropertyLight.ConstantAttenuation -P:GLKit.GLKEffectPropertyLight.DiffuseColor -P:GLKit.GLKEffectPropertyLight.Enabled -P:GLKit.GLKEffectPropertyLight.LinearAttenuation -P:GLKit.GLKEffectPropertyLight.Position -P:GLKit.GLKEffectPropertyLight.QuadraticAttenuation -P:GLKit.GLKEffectPropertyLight.SpecularColor -P:GLKit.GLKEffectPropertyLight.SpotCutoff -P:GLKit.GLKEffectPropertyLight.SpotDirection -P:GLKit.GLKEffectPropertyLight.SpotExponent -P:GLKit.GLKEffectPropertyLight.Transform -P:GLKit.GLKEffectPropertyMaterial.AmbientColor -P:GLKit.GLKEffectPropertyMaterial.DiffuseColor -P:GLKit.GLKEffectPropertyMaterial.EmissiveColor -P:GLKit.GLKEffectPropertyMaterial.Shininess -P:GLKit.GLKEffectPropertyMaterial.SpecularColor -P:GLKit.GLKEffectPropertyTexture.Enabled -P:GLKit.GLKEffectPropertyTexture.EnvMode -P:GLKit.GLKEffectPropertyTexture.GLName -P:GLKit.GLKEffectPropertyTexture.Target -P:GLKit.GLKEffectPropertyTransform.ModelViewMatrix -P:GLKit.GLKEffectPropertyTransform.NormalMatrix -P:GLKit.GLKEffectPropertyTransform.ProjectionMatrix -P:GLKit.GLKMesh.Name -P:GLKit.GLKMesh.Submeshes -P:GLKit.GLKMesh.VertexBuffers -P:GLKit.GLKMesh.VertexCount -P:GLKit.GLKMesh.VertexDescriptor -P:GLKit.GLKMeshBuffer.Allocator -P:GLKit.GLKMeshBuffer.GlBufferName -P:GLKit.GLKMeshBuffer.Length P:GLKit.GLKMeshBuffer.Map -P:GLKit.GLKMeshBuffer.Offset -P:GLKit.GLKMeshBuffer.Type -P:GLKit.GLKMeshBuffer.Zone P:GLKit.GLKModelError.Domain P:GLKit.GLKModelError.Key -P:GLKit.GLKReflectionMapEffect.Matrix -P:GLKit.GLKReflectionMapEffect.TextureCubeMap -P:GLKit.GLKSkyboxEffect.Center -P:GLKit.GLKSkyboxEffect.Label -P:GLKit.GLKSkyboxEffect.TextureCubeMap -P:GLKit.GLKSkyboxEffect.Transform -P:GLKit.GLKSkyboxEffect.XSize -P:GLKit.GLKSkyboxEffect.YSize -P:GLKit.GLKSkyboxEffect.ZSize -P:GLKit.GLKSubmesh.ElementBuffer -P:GLKit.GLKSubmesh.ElementCount -P:GLKit.GLKSubmesh.Mesh -P:GLKit.GLKSubmesh.Mode -P:GLKit.GLKSubmesh.Name -P:GLKit.GLKSubmesh.Type -P:GLKit.GLKTextureInfo.AlphaState -P:GLKit.GLKTextureInfo.ArrayLength -P:GLKit.GLKTextureInfo.ContainsMipmaps -P:GLKit.GLKTextureInfo.Depth -P:GLKit.GLKTextureInfo.Height -P:GLKit.GLKTextureInfo.MimapLevelCount -P:GLKit.GLKTextureInfo.Name -P:GLKit.GLKTextureInfo.Target -P:GLKit.GLKTextureInfo.TextureOrigin -P:GLKit.GLKTextureInfo.Width P:GLKit.GLKTextureLoader.ApplyPremultiplication P:GLKit.GLKTextureLoader.ErrorDomain P:GLKit.GLKTextureLoader.ErrorKey @@ -68885,28 +60570,9 @@ P:GLKit.GLKTextureOperations.GenerateMipmaps P:GLKit.GLKTextureOperations.GrayscaleAsAlpha P:GLKit.GLKTextureOperations.OriginBottomLeft P:GLKit.GLKTextureOperations.SRGB -P:GLKit.GLKView.Context P:GLKit.GLKView.Delegate -P:GLKit.GLKView.DrawableColorFormat -P:GLKit.GLKView.DrawableDepthFormat -P:GLKit.GLKView.DrawableHeight -P:GLKit.GLKView.DrawableMultisample -P:GLKit.GLKView.DrawableStencilFormat -P:GLKit.GLKView.DrawableWidth -P:GLKit.GLKView.EnableSetNeedsDisplay -P:GLKit.GLKView.WeakDelegate P:GLKit.GLKViewController.Delegate -P:GLKit.GLKViewController.FramesDisplayed -P:GLKit.GLKViewController.FramesPerSecond P:GLKit.GLKViewController.Paused -P:GLKit.GLKViewController.PauseOnWillResignActive -P:GLKit.GLKViewController.PreferredFramesPerSecond -P:GLKit.GLKViewController.ResumeOnDidBecomeActive -P:GLKit.GLKViewController.TimeSinceFirstResume -P:GLKit.GLKViewController.TimeSinceLastDraw -P:GLKit.GLKViewController.TimeSinceLastResume -P:GLKit.GLKViewController.TimeSinceLastUpdate -P:GLKit.GLKViewController.WeakDelegate P:GLKit.GLKViewDrawEventArgs.Rect P:HealthKit.HKActivitySummary.Paused P:HealthKit.HKDeletedObject.Metadata @@ -69103,152 +60769,44 @@ P:HealthKit.HKWorkoutSession.Delegate P:HealthKit.HKWorkoutType.Identifier P:HomeKit.HMAccessory.Blocked P:HomeKit.HMAccessory.Bridged -P:HomeKit.HMAccessory.CameraProfiles -P:HomeKit.HMAccessory.Category P:HomeKit.HMAccessory.Delegate -P:HomeKit.HMAccessory.FirmwareVersion -P:HomeKit.HMAccessory.Identifier -P:HomeKit.HMAccessory.IdentifiersForBridgedAccessories -P:HomeKit.HMAccessory.Manufacturer -P:HomeKit.HMAccessory.MatterNodeId -P:HomeKit.HMAccessory.Model -P:HomeKit.HMAccessory.Name -P:HomeKit.HMAccessory.Profiles P:HomeKit.HMAccessory.Reachable -P:HomeKit.HMAccessory.Room -P:HomeKit.HMAccessory.Services -P:HomeKit.HMAccessory.SupportsIdentify -P:HomeKit.HMAccessory.UniqueIdentifier -P:HomeKit.HMAccessory.UniqueIdentifiersForBridgedAccessories -P:HomeKit.HMAccessory.WeakDelegate P:HomeKit.HMAccessoryBrowser.Delegate -P:HomeKit.HMAccessoryBrowser.DiscoveredAccessories -P:HomeKit.HMAccessoryBrowser.WeakDelegate P:HomeKit.HMAccessoryBrowserEventArgs.Accessory P:HomeKit.HMAccessoryCategory.CategoryType -P:HomeKit.HMAccessoryCategory.LocalizedDescription P:HomeKit.HMAccessoryFirmwareVersionEventArgs.FirmwareVersion -P:HomeKit.HMAccessoryProfile.Accessory -P:HomeKit.HMAccessoryProfile.Services -P:HomeKit.HMAccessoryProfile.UniqueIdentifier P:HomeKit.HMAccessoryProfileEventArgs.Profile P:HomeKit.HMAccessoryServiceUpdateCharacteristicEventArgs.Characteristic P:HomeKit.HMAccessoryServiceUpdateCharacteristicEventArgs.Service -P:HomeKit.HMAccessorySetupRequest.HomeUniqueIdentifier -P:HomeKit.HMAccessorySetupRequest.Payload -P:HomeKit.HMAccessorySetupRequest.SuggestedAccessoryName -P:HomeKit.HMAccessorySetupRequest.SuggestedRoomUniqueIdentifier -P:HomeKit.HMAccessorySetupResult.AccessoryUniqueIdentifiers -P:HomeKit.HMAccessorySetupResult.HomeUniqueIdentifier P:HomeKit.HMAccessoryUpdateEventArgs.Service -P:HomeKit.HMAction.UniqueIdentifier -P:HomeKit.HMActionSet.Actions P:HomeKit.HMActionSet.ActionSetType P:HomeKit.HMActionSet.Executing -P:HomeKit.HMActionSet.LastExecutionDate -P:HomeKit.HMActionSet.Name -P:HomeKit.HMActionSet.UniqueIdentifier -P:HomeKit.HMAddAccessoryRequest.AccessoryCategory -P:HomeKit.HMAddAccessoryRequest.AccessoryName -P:HomeKit.HMAddAccessoryRequest.Home -P:HomeKit.HMAddAccessoryRequest.RequiresSetupPayloadUrl -P:HomeKit.HMCalendarEvent.FireDateComponents -P:HomeKit.HMCameraAudioControl.Mute -P:HomeKit.HMCameraAudioControl.Volume -P:HomeKit.HMCameraProfile.MicrophoneControl -P:HomeKit.HMCameraProfile.SettingsControl -P:HomeKit.HMCameraProfile.SnapshotControl -P:HomeKit.HMCameraProfile.SpeakerControl -P:HomeKit.HMCameraProfile.StreamControl -P:HomeKit.HMCameraSettingsControl.CurrentHorizontalTilt -P:HomeKit.HMCameraSettingsControl.CurrentVerticalTilt -P:HomeKit.HMCameraSettingsControl.DigitalZoom -P:HomeKit.HMCameraSettingsControl.ImageMirroring -P:HomeKit.HMCameraSettingsControl.ImageRotation -P:HomeKit.HMCameraSettingsControl.NightVision -P:HomeKit.HMCameraSettingsControl.OpticalZoom -P:HomeKit.HMCameraSettingsControl.TargetHorizontalTilt -P:HomeKit.HMCameraSettingsControl.TargetVerticalTilt -P:HomeKit.HMCameraSnapshot.CaptureDate -P:HomeKit.HMCameraSnapshotControl.Delegate -P:HomeKit.HMCameraSnapshotControl.MostRecentSnapshot -P:HomeKit.HMCameraSource.AspectRatio -P:HomeKit.HMCameraStream.AudioStreamSetting -P:HomeKit.HMCameraStreamControl.CameraStream -P:HomeKit.HMCameraStreamControl.Delegate -P:HomeKit.HMCameraStreamControl.StreamState -P:HomeKit.HMCameraView.CameraSource P:HomeKit.HMCharacteristic.CharacteristicType P:HomeKit.HMCharacteristic.Hidden P:HomeKit.HMCharacteristic.KeyPath -P:HomeKit.HMCharacteristic.LocalizedDescription -P:HomeKit.HMCharacteristic.Metadata P:HomeKit.HMCharacteristic.NotificationEnabled -P:HomeKit.HMCharacteristic.Properties P:HomeKit.HMCharacteristic.Readable -P:HomeKit.HMCharacteristic.Service P:HomeKit.HMCharacteristic.SupportsEventNotification -P:HomeKit.HMCharacteristic.UniqueIdentifier -P:HomeKit.HMCharacteristic.Value P:HomeKit.HMCharacteristic.ValueKeyPath P:HomeKit.HMCharacteristic.Writable -P:HomeKit.HMCharacteristicEvent.Characteristic -P:HomeKit.HMCharacteristicEvent.TriggerValue P:HomeKit.HMCharacteristicMetadata.Format -P:HomeKit.HMCharacteristicMetadata.ManufacturerDescription -P:HomeKit.HMCharacteristicMetadata.MaximumValue -P:HomeKit.HMCharacteristicMetadata.MaxLength -P:HomeKit.HMCharacteristicMetadata.MinimumValue -P:HomeKit.HMCharacteristicMetadata.StepValue P:HomeKit.HMCharacteristicMetadata.Units -P:HomeKit.HMCharacteristicMetadata.ValidValues P:HomeKit.HMCharacteristicProperties.Readable P:HomeKit.HMCharacteristicProperties.SupportsBonjourNotification P:HomeKit.HMCharacteristicProperties.SupportsChangeNumber P:HomeKit.HMCharacteristicProperties.SupportsEventNotification P:HomeKit.HMCharacteristicProperties.Writable -P:HomeKit.HMCharacteristicThresholdRangeEvent.Characteristic -P:HomeKit.HMCharacteristicThresholdRangeEvent.ThresholdRange -P:HomeKit.HMCharacteristicWriteAction.Characteristic -P:HomeKit.HMCharacteristicWriteAction.TargetValue -P:HomeKit.HMDurationEvent.Duration P:HomeKit.HMErrors.HMErrorDomain -P:HomeKit.HMEvent.UniqueIdentifier -P:HomeKit.HMEventTrigger.EndEvents -P:HomeKit.HMEventTrigger.Events -P:HomeKit.HMEventTrigger.ExecuteOnce -P:HomeKit.HMEventTrigger.Predicate -P:HomeKit.HMEventTrigger.Recurrences -P:HomeKit.HMEventTrigger.TriggerActivationState -P:HomeKit.HMHome.Accessories -P:HomeKit.HMHome.ActionSets -P:HomeKit.HMHome.CurrentUser P:HomeKit.HMHome.Delegate -P:HomeKit.HMHome.HomeHubState -P:HomeKit.HMHome.MatterControllerId -P:HomeKit.HMHome.MatterControllerXPCConnectBlock -P:HomeKit.HMHome.Name P:HomeKit.HMHome.Primary -P:HomeKit.HMHome.Rooms -P:HomeKit.HMHome.ServiceGroups -P:HomeKit.HMHome.SupportsAddingNetworkRouter -P:HomeKit.HMHome.Triggers -P:HomeKit.HMHome.UniqueIdentifier P:HomeKit.HMHome.UserFailedAccessoriesKey -P:HomeKit.HMHome.Users -P:HomeKit.HMHome.WeakDelegate -P:HomeKit.HMHome.Zones P:HomeKit.HMHomeAccessControl.Administrator P:HomeKit.HMHomeAccessoryEventArgs.Accessory P:HomeKit.HMHomeActionSetEventArgs.ActionSet P:HomeKit.HMHomeErrorAccessoryEventArgs.Accessory P:HomeKit.HMHomeErrorAccessoryEventArgs.Error P:HomeKit.HMHomeHubStateEventArgs.HomeHubState -P:HomeKit.HMHomeManager.AuthorizationStatus P:HomeKit.HMHomeManager.Delegate -P:HomeKit.HMHomeManager.Homes -P:HomeKit.HMHomeManager.PrimaryHome -P:HomeKit.HMHomeManager.WeakDelegate P:HomeKit.HMHomeManagerAddAccessoryRequestEventArgs.Request P:HomeKit.HMHomeManagerAuthorizationStatusEventArgs.Status P:HomeKit.HMHomeManagerEventArgs.Home @@ -69263,7 +60821,6 @@ P:HomeKit.HMHomeServiceServiceGroupEventArgs.Service P:HomeKit.HMHomeTriggerEventArgs.Trigger P:HomeKit.HMHomeUserEventArgs.User P:HomeKit.HMHomeZoneEventArgs.Zone -P:HomeKit.HMLocationEvent.Region P:HomeKit.HMMatterHome.ClassHandle P:HomeKit.HMMatterHome.Name P:HomeKit.HMMatterHome.Uuid @@ -69273,58 +60830,15 @@ P:HomeKit.HMMatterRoom.Name P:HomeKit.HMMatterRoom.Uuid P:HomeKit.HMMatterTopology.ClassHandle P:HomeKit.HMMatterTopology.Homes -P:HomeKit.HMMutableCalendarEvent.FireDateComponents -P:HomeKit.HMMutableCharacteristicEvent.Characteristic -P:HomeKit.HMMutableCharacteristicEvent.TriggerValue -P:HomeKit.HMMutableCharacteristicThresholdRangeEvent.Characteristic -P:HomeKit.HMMutableCharacteristicThresholdRangeEvent.ThresholdRange -P:HomeKit.HMMutableDurationEvent.Duration -P:HomeKit.HMMutableLocationEvent.Region -P:HomeKit.HMMutablePresenceEvent.PresenceEventType -P:HomeKit.HMMutablePresenceEvent.PresenceUserType -P:HomeKit.HMMutableSignificantTimeEvent.Offset P:HomeKit.HMMutableSignificantTimeEvent.SignificantEvent P:HomeKit.HMNetworkConfigurationProfile.Delegate P:HomeKit.HMNetworkConfigurationProfile.NetworkAccessRestricted -P:HomeKit.HMNetworkConfigurationProfile.WeakDelegate -P:HomeKit.HMNumberRange.Max -P:HomeKit.HMNumberRange.Min P:HomeKit.HMPresenceEvent.KeyPath -P:HomeKit.HMPresenceEvent.PresenceEventType -P:HomeKit.HMPresenceEvent.PresenceUserType -P:HomeKit.HMRoom.Accessories -P:HomeKit.HMRoom.Name -P:HomeKit.HMRoom.UniqueIdentifier -P:HomeKit.HMService.Accessory -P:HomeKit.HMService.AssociatedServiceType -P:HomeKit.HMService.Characteristics -P:HomeKit.HMService.LinkedServices -P:HomeKit.HMService.LocalizedDescription -P:HomeKit.HMService.MatterEndpointId -P:HomeKit.HMService.Name P:HomeKit.HMService.PrimaryService P:HomeKit.HMService.ServiceType -P:HomeKit.HMService.UniqueIdentifier P:HomeKit.HMService.UserInteractive -P:HomeKit.HMServiceGroup.Name -P:HomeKit.HMServiceGroup.Services -P:HomeKit.HMServiceGroup.UniqueIdentifier -P:HomeKit.HMSignificantTimeEvent.Offset P:HomeKit.HMSignificantTimeEvent.SignificantEvent -P:HomeKit.HMTimerTrigger.FireDate -P:HomeKit.HMTimerTrigger.Recurrence -P:HomeKit.HMTimerTrigger.RecurrenceCalendar -P:HomeKit.HMTimerTrigger.TimeZone -P:HomeKit.HMTrigger.ActionSets P:HomeKit.HMTrigger.Enabled -P:HomeKit.HMTrigger.LastFireDate -P:HomeKit.HMTrigger.Name -P:HomeKit.HMTrigger.UniqueIdentifier -P:HomeKit.HMUser.Name -P:HomeKit.HMUser.UniqueIdentifier -P:HomeKit.HMZone.Name -P:HomeKit.HMZone.Rooms -P:HomeKit.HMZone.UniqueIdentifier P:IdentityLookupUI.ILClassificationUIExtensionContext.ReadyForClassificationResponse P:ImageCaptureCore.ICButtonType.Copy P:ImageCaptureCore.ICButtonType.Mail @@ -70366,327 +61880,36 @@ P:Intents.IINSpeakable.Identifier P:Intents.IINSpeakable.PronunciationHint P:Intents.IINSpeakable.SpokenPhrase P:Intents.IINSpeakable.VocabularyIdentifier -P:Intents.INAccountTypeResolutionResult.NeedsValue -P:Intents.INAccountTypeResolutionResult.NotRequired -P:Intents.INAccountTypeResolutionResult.Unsupported -P:Intents.INAddMediaMediaDestinationResolutionResult.NeedsValue -P:Intents.INAddMediaMediaDestinationResolutionResult.NotRequired -P:Intents.INAddMediaMediaDestinationResolutionResult.Unsupported -P:Intents.INAddMediaMediaItemResolutionResult.NeedsValue -P:Intents.INAddMediaMediaItemResolutionResult.NotRequired -P:Intents.INAddMediaMediaItemResolutionResult.Unsupported -P:Intents.INAddTasksTargetTaskListResolutionResult.NeedsValue -P:Intents.INAddTasksTargetTaskListResolutionResult.NotRequired -P:Intents.INAddTasksTargetTaskListResolutionResult.Unsupported -P:Intents.INAddTasksTemporalEventTriggerResolutionResult.NeedsValue -P:Intents.INAddTasksTemporalEventTriggerResolutionResult.NotRequired -P:Intents.INAddTasksTemporalEventTriggerResolutionResult.Unsupported -P:Intents.INBalanceTypeResolutionResult.NeedsValue -P:Intents.INBalanceTypeResolutionResult.NotRequired -P:Intents.INBalanceTypeResolutionResult.Unsupported -P:Intents.INBillPayeeResolutionResult.NeedsValue -P:Intents.INBillPayeeResolutionResult.NotRequired -P:Intents.INBillPayeeResolutionResult.Unsupported -P:Intents.INBillTypeResolutionResult.NeedsValue -P:Intents.INBillTypeResolutionResult.NotRequired -P:Intents.INBillTypeResolutionResult.Unsupported -P:Intents.INBooleanResolutionResult.NeedsValue -P:Intents.INBooleanResolutionResult.NotRequired -P:Intents.INBooleanResolutionResult.Unsupported -P:Intents.INCallCapabilityResolutionResult.NeedsValue -P:Intents.INCallCapabilityResolutionResult.NotRequired -P:Intents.INCallCapabilityResolutionResult.Unsupported -P:Intents.INCallDestinationTypeResolutionResult.NeedsValue -P:Intents.INCallDestinationTypeResolutionResult.NotRequired -P:Intents.INCallDestinationTypeResolutionResult.Unsupported P:Intents.INCallRecord.CallDuration P:Intents.INCallRecord.Unseen -P:Intents.INCallRecordResolutionResult.NeedsValue -P:Intents.INCallRecordResolutionResult.NotRequired -P:Intents.INCallRecordResolutionResult.Unsupported -P:Intents.INCallRecordTypeOptionsResolutionResult.NeedsValue -P:Intents.INCallRecordTypeOptionsResolutionResult.NotRequired -P:Intents.INCallRecordTypeOptionsResolutionResult.Unsupported -P:Intents.INCallRecordTypeResolutionResult.NeedsValue -P:Intents.INCallRecordTypeResolutionResult.NotRequired -P:Intents.INCallRecordTypeResolutionResult.Unsupported -P:Intents.INCarAirCirculationModeResolutionResult.NeedsValue -P:Intents.INCarAirCirculationModeResolutionResult.NotRequired -P:Intents.INCarAirCirculationModeResolutionResult.Unsupported -P:Intents.INCarAudioSourceResolutionResult.NeedsValue -P:Intents.INCarAudioSourceResolutionResult.NotRequired -P:Intents.INCarAudioSourceResolutionResult.Unsupported -P:Intents.INCarDefrosterResolutionResult.NeedsValue -P:Intents.INCarDefrosterResolutionResult.NotRequired -P:Intents.INCarDefrosterResolutionResult.Unsupported -P:Intents.INCarSeatResolutionResult.NeedsValue -P:Intents.INCarSeatResolutionResult.NotRequired -P:Intents.INCarSeatResolutionResult.Unsupported -P:Intents.INCarSignalOptionsResolutionResult.NeedsValue -P:Intents.INCarSignalOptionsResolutionResult.NotRequired -P:Intents.INCarSignalOptionsResolutionResult.Unsupported -P:Intents.INCurrencyAmountResolutionResult.NeedsValue -P:Intents.INCurrencyAmountResolutionResult.NotRequired -P:Intents.INCurrencyAmountResolutionResult.Unsupported -P:Intents.INDateComponentsRangeResolutionResult.NeedsValue -P:Intents.INDateComponentsRangeResolutionResult.NotRequired -P:Intents.INDateComponentsRangeResolutionResult.Unsupported -P:Intents.INDateComponentsResolutionResult.NeedsValue -P:Intents.INDateComponentsResolutionResult.NotRequired -P:Intents.INDateComponentsResolutionResult.Unsupported -P:Intents.INDateSearchTypeResolutionResult.NeedsValue -P:Intents.INDateSearchTypeResolutionResult.NotRequired -P:Intents.INDateSearchTypeResolutionResult.Unsupported -P:Intents.INDeleteTasksTaskListResolutionResult.NeedsValue -P:Intents.INDeleteTasksTaskListResolutionResult.NotRequired -P:Intents.INDeleteTasksTaskListResolutionResult.Unsupported -P:Intents.INDeleteTasksTaskResolutionResult.NeedsValue -P:Intents.INDeleteTasksTaskResolutionResult.NotRequired -P:Intents.INDeleteTasksTaskResolutionResult.Unsupported -P:Intents.INDoubleResolutionResult.NeedsValue -P:Intents.INDoubleResolutionResult.NotRequired -P:Intents.INDoubleResolutionResult.Unsupported -P:Intents.INEnergyResolutionResult.NeedsValue -P:Intents.INEnergyResolutionResult.NotRequired -P:Intents.INEnergyResolutionResult.Unsupported -P:Intents.INEnumResolutionResult.NeedsValue -P:Intents.INEnumResolutionResult.NotRequired -P:Intents.INEnumResolutionResult.Unsupported -P:Intents.INFileResolutionResult.NeedsValue -P:Intents.INFileResolutionResult.NotRequired -P:Intents.INFileResolutionResult.Unsupported P:Intents.INGetCarLockStatusIntentResponse.Locked P:Intents.INGetCarPowerLevelStatusIntentResponse.ChargePercentRemaining P:Intents.INGetCarPowerLevelStatusIntentResponse.FuelPercentRemaining -P:Intents.INIntegerResolutionResult.NeedsValue -P:Intents.INIntegerResolutionResult.NotRequired -P:Intents.INIntegerResolutionResult.Unsupported P:Intents.INIntent.Identifier P:Intents.INIntentResolutionResult.NeedsValue P:Intents.INIntentResolutionResult.NotRequired P:Intents.INIntentResolutionResult.Unsupported -P:Intents.INLengthResolutionResult.NeedsValue -P:Intents.INLengthResolutionResult.NotRequired -P:Intents.INLengthResolutionResult.Unsupported -P:Intents.INLocationSearchTypeResolutionResult.NeedsValue -P:Intents.INLocationSearchTypeResolutionResult.NotRequired -P:Intents.INLocationSearchTypeResolutionResult.Unsupported -P:Intents.INMassResolutionResult.NeedsValue -P:Intents.INMassResolutionResult.NotRequired -P:Intents.INMassResolutionResult.Unsupported -P:Intents.INMediaAffinityTypeResolutionResult.NeedsValue -P:Intents.INMediaAffinityTypeResolutionResult.NotRequired -P:Intents.INMediaAffinityTypeResolutionResult.Unsupported -P:Intents.INMediaDestinationResolutionResult.NeedsValue -P:Intents.INMediaDestinationResolutionResult.NotRequired -P:Intents.INMediaDestinationResolutionResult.Unsupported -P:Intents.INMediaItemResolutionResult.NeedsValue -P:Intents.INMediaItemResolutionResult.NotRequired -P:Intents.INMediaItemResolutionResult.Unsupported -P:Intents.INMessageAttributeOptionsResolutionResult.NeedsValue -P:Intents.INMessageAttributeOptionsResolutionResult.NotRequired -P:Intents.INMessageAttributeOptionsResolutionResult.Unsupported -P:Intents.INMessageAttributeResolutionResult.NeedsValue -P:Intents.INMessageAttributeResolutionResult.NotRequired -P:Intents.INMessageAttributeResolutionResult.Unsupported -P:Intents.INNotebookItemTypeResolutionResult.NeedsValue -P:Intents.INNotebookItemTypeResolutionResult.NotRequired -P:Intents.INNotebookItemTypeResolutionResult.Unsupported -P:Intents.INNoteContentResolutionResult.NeedsValue -P:Intents.INNoteContentResolutionResult.NotRequired -P:Intents.INNoteContentResolutionResult.Unsupported -P:Intents.INNoteContentTypeResolutionResult.NeedsValue -P:Intents.INNoteContentTypeResolutionResult.NotRequired -P:Intents.INNoteContentTypeResolutionResult.Unsupported -P:Intents.INNoteResolutionResult.NeedsValue -P:Intents.INNoteResolutionResult.NotRequired -P:Intents.INNoteResolutionResult.Unsupported -P:Intents.INObject.SpokenPhrase -P:Intents.INObject.VocabularyIdentifier -P:Intents.INObjectResolutionResult.NeedsValue -P:Intents.INObjectResolutionResult.NotRequired -P:Intents.INObjectResolutionResult.Unsupported -P:Intents.INOutgoingMessageTypeResolutionResult.NeedsValue -P:Intents.INOutgoingMessageTypeResolutionResult.NotRequired -P:Intents.INOutgoingMessageTypeResolutionResult.Unsupported P:Intents.INParameter.ParameterType -P:Intents.INPaymentAccountResolutionResult.NeedsValue -P:Intents.INPaymentAccountResolutionResult.NotRequired -P:Intents.INPaymentAccountResolutionResult.Unsupported -P:Intents.INPaymentAmountResolutionResult.NeedsValue -P:Intents.INPaymentAmountResolutionResult.NotRequired -P:Intents.INPaymentAmountResolutionResult.Unsupported -P:Intents.INPaymentMethodResolutionResult.NeedsValue -P:Intents.INPaymentMethodResolutionResult.NotRequired -P:Intents.INPaymentMethodResolutionResult.Unsupported -P:Intents.INPaymentStatusResolutionResult.NeedsValue -P:Intents.INPaymentStatusResolutionResult.NotRequired -P:Intents.INPaymentStatusResolutionResult.Unsupported -P:Intents.INPerson.AlternativeSpeakableMatches P:Intents.INPerson.ContactSuggestion -P:Intents.INPerson.Identifier -P:Intents.INPerson.PronunciationHint P:Intents.INPerson.Relationship -P:Intents.INPerson.SpokenPhrase -P:Intents.INPerson.VocabularyIdentifier P:Intents.INPersonHandle.Label -P:Intents.INPersonResolutionResult.NeedsValue -P:Intents.INPersonResolutionResult.NotRequired -P:Intents.INPersonResolutionResult.Unsupported -P:Intents.INPlacemarkResolutionResult.NeedsValue -P:Intents.INPlacemarkResolutionResult.NotRequired -P:Intents.INPlacemarkResolutionResult.Unsupported -P:Intents.INPlaybackQueueLocationResolutionResult.NeedsValue -P:Intents.INPlaybackQueueLocationResolutionResult.NotRequired -P:Intents.INPlaybackQueueLocationResolutionResult.Unsupported -P:Intents.INPlaybackRepeatModeResolutionResult.NeedsValue -P:Intents.INPlaybackRepeatModeResolutionResult.NotRequired -P:Intents.INPlaybackRepeatModeResolutionResult.Unsupported -P:Intents.INPlayMediaMediaItemResolutionResult.NeedsValue -P:Intents.INPlayMediaMediaItemResolutionResult.NotRequired -P:Intents.INPlayMediaMediaItemResolutionResult.Unsupported -P:Intents.INPlayMediaPlaybackSpeedResolutionResult.NeedsValue -P:Intents.INPlayMediaPlaybackSpeedResolutionResult.NotRequired -P:Intents.INPlayMediaPlaybackSpeedResolutionResult.Unsupported -P:Intents.INRadioTypeResolutionResult.NeedsValue -P:Intents.INRadioTypeResolutionResult.NotRequired -P:Intents.INRadioTypeResolutionResult.Unsupported -P:Intents.INRelativeReferenceResolutionResult.NeedsValue -P:Intents.INRelativeReferenceResolutionResult.NotRequired -P:Intents.INRelativeReferenceResolutionResult.Unsupported -P:Intents.INRelativeSettingResolutionResult.NeedsValue -P:Intents.INRelativeSettingResolutionResult.NotRequired -P:Intents.INRelativeSettingResolutionResult.Unsupported -P:Intents.INRequestPaymentCurrencyAmountResolutionResult.NeedsValue -P:Intents.INRequestPaymentCurrencyAmountResolutionResult.NotRequired -P:Intents.INRequestPaymentCurrencyAmountResolutionResult.Unsupported -P:Intents.INRequestPaymentPayerResolutionResult.NeedsValue -P:Intents.INRequestPaymentPayerResolutionResult.NotRequired -P:Intents.INRequestPaymentPayerResolutionResult.Unsupported -P:Intents.INRestaurantGuestResolutionResult.NeedsValue -P:Intents.INRestaurantGuestResolutionResult.NotRequired -P:Intents.INRestaurantGuestResolutionResult.Unsupported P:Intents.INRestaurantReservationBooking.BookingAvailable -P:Intents.INRestaurantResolutionResult.NeedsValue -P:Intents.INRestaurantResolutionResult.NotRequired -P:Intents.INRestaurantResolutionResult.Unsupported P:Intents.INRideCompletionStatus.Canceled P:Intents.INRideCompletionStatus.Completed P:Intents.INRideCompletionStatus.MissedPickup P:Intents.INRideCompletionStatus.Outstanding P:Intents.INRideOption.UsesMeteredFare P:Intents.INSearchCallHistoryIntent.Unseen -P:Intents.INSearchForMediaMediaItemResolutionResult.NeedsValue -P:Intents.INSearchForMediaMediaItemResolutionResult.NotRequired -P:Intents.INSearchForMediaMediaItemResolutionResult.Unsupported P:Intents.INSendMessageIntentDonationMetadata.ReplyToCurrentUser -P:Intents.INSendMessageRecipientResolutionResult.NeedsValue -P:Intents.INSendMessageRecipientResolutionResult.NotRequired -P:Intents.INSendMessageRecipientResolutionResult.Unsupported -P:Intents.INSendPaymentCurrencyAmountResolutionResult.NeedsValue -P:Intents.INSendPaymentCurrencyAmountResolutionResult.NotRequired -P:Intents.INSendPaymentCurrencyAmountResolutionResult.Unsupported -P:Intents.INSendPaymentPayeeResolutionResult.NeedsValue -P:Intents.INSendPaymentPayeeResolutionResult.NotRequired -P:Intents.INSendPaymentPayeeResolutionResult.Unsupported P:Intents.INSetCarLockStatusIntent.Locked -P:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.NeedsValue -P:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.NotRequired -P:Intents.INSetTaskAttributeTemporalEventTriggerResolutionResult.Unsupported -P:Intents.INSnoozeTasksTaskResolutionResult.NeedsValue -P:Intents.INSnoozeTasksTaskResolutionResult.NotRequired -P:Intents.INSnoozeTasksTaskResolutionResult.Unsupported -P:Intents.INSpatialEventTriggerResolutionResult.NeedsValue -P:Intents.INSpatialEventTriggerResolutionResult.NotRequired -P:Intents.INSpatialEventTriggerResolutionResult.Unsupported -P:Intents.INSpeakableString.AlternativeSpeakableMatches -P:Intents.INSpeakableString.Identifier -P:Intents.INSpeakableString.PronunciationHint -P:Intents.INSpeakableString.SpokenPhrase -P:Intents.INSpeakableString.VocabularyIdentifier -P:Intents.INSpeakableStringResolutionResult.NeedsValue -P:Intents.INSpeakableStringResolutionResult.NotRequired -P:Intents.INSpeakableStringResolutionResult.Unsupported -P:Intents.INSpeedResolutionResult.NeedsValue -P:Intents.INSpeedResolutionResult.NotRequired -P:Intents.INSpeedResolutionResult.Unsupported -P:Intents.INStartCallCallCapabilityResolutionResult.NeedsValue -P:Intents.INStartCallCallCapabilityResolutionResult.NotRequired -P:Intents.INStartCallCallCapabilityResolutionResult.Unsupported -P:Intents.INStartCallCallRecordToCallBackResolutionResult.NeedsValue -P:Intents.INStartCallCallRecordToCallBackResolutionResult.NotRequired -P:Intents.INStartCallCallRecordToCallBackResolutionResult.Unsupported -P:Intents.INStartCallContactResolutionResult.NeedsValue -P:Intents.INStartCallContactResolutionResult.NotRequired -P:Intents.INStartCallContactResolutionResult.Unsupported P:Intents.INStartWorkoutIntent.IsOpenEnded -P:Intents.INStringResolutionResult.NeedsValue -P:Intents.INStringResolutionResult.NotRequired -P:Intents.INStringResolutionResult.Unsupported -P:Intents.INTaskListResolutionResult.NeedsValue -P:Intents.INTaskListResolutionResult.NotRequired -P:Intents.INTaskListResolutionResult.Unsupported -P:Intents.INTaskPriorityResolutionResult.NeedsValue -P:Intents.INTaskPriorityResolutionResult.NotRequired -P:Intents.INTaskPriorityResolutionResult.Unsupported -P:Intents.INTaskResolutionResult.NeedsValue -P:Intents.INTaskResolutionResult.NotRequired -P:Intents.INTaskResolutionResult.Unsupported -P:Intents.INTaskStatusResolutionResult.NeedsValue -P:Intents.INTaskStatusResolutionResult.NotRequired -P:Intents.INTaskStatusResolutionResult.Unsupported -P:Intents.INTemperatureResolutionResult.NeedsValue -P:Intents.INTemperatureResolutionResult.NotRequired -P:Intents.INTemperatureResolutionResult.Unsupported -P:Intents.INTemporalEventTriggerResolutionResult.NeedsValue -P:Intents.INTemporalEventTriggerResolutionResult.NotRequired -P:Intents.INTemporalEventTriggerResolutionResult.Unsupported -P:Intents.INTemporalEventTriggerTypeOptionsResolutionResult.NeedsValue -P:Intents.INTemporalEventTriggerTypeOptionsResolutionResult.NotRequired -P:Intents.INTemporalEventTriggerTypeOptionsResolutionResult.Unsupported -P:Intents.INTimeIntervalResolutionResult.NeedsValue -P:Intents.INTimeIntervalResolutionResult.NotRequired -P:Intents.INTimeIntervalResolutionResult.Unsupported -P:Intents.INUpdateMediaAffinityMediaItemResolutionResult.NeedsValue -P:Intents.INUpdateMediaAffinityMediaItemResolutionResult.NotRequired -P:Intents.INUpdateMediaAffinityMediaItemResolutionResult.Unsupported -P:Intents.INUrlResolutionResult.NeedsValue -P:Intents.INUrlResolutionResult.NotRequired -P:Intents.INUrlResolutionResult.Unsupported -P:Intents.INVisualCodeTypeResolutionResult.NeedsValue -P:Intents.INVisualCodeTypeResolutionResult.NotRequired -P:Intents.INVisualCodeTypeResolutionResult.Unsupported -P:Intents.INVolumeResolutionResult.NeedsValue -P:Intents.INVolumeResolutionResult.NotRequired -P:Intents.INVolumeResolutionResult.Unsupported -P:Intents.INWorkoutGoalUnitTypeResolutionResult.NeedsValue -P:Intents.INWorkoutGoalUnitTypeResolutionResult.NotRequired -P:Intents.INWorkoutGoalUnitTypeResolutionResult.Unsupported -P:Intents.INWorkoutLocationTypeResolutionResult.NeedsValue -P:Intents.INWorkoutLocationTypeResolutionResult.NotRequired -P:Intents.INWorkoutLocationTypeResolutionResult.Unsupported P:IntentsUI.IINUIHostedViewSiriProviding.DisplaysMap P:IntentsUI.IINUIHostedViewSiriProviding.DisplaysMessage P:IntentsUI.IINUIHostedViewSiriProviding.DisplaysPaymentTransaction P:IntentsUI.INUIAddVoiceShortcutButton.Delegate P:IntentsUI.INUIAddVoiceShortcutViewController.Delegate P:IntentsUI.INUIEditVoiceShortcutViewController.Delegate -P:IOSurface.IOSurface.AllAttachments -P:IOSurface.IOSurface.AllocationSize -P:IOSurface.IOSurface.AllowsPixelSizeCasting -P:IOSurface.IOSurface.BaseAddress -P:IOSurface.IOSurface.BytesPerElement -P:IOSurface.IOSurface.BytesPerRow -P:IOSurface.IOSurface.ElementHeight -P:IOSurface.IOSurface.ElementWidth -P:IOSurface.IOSurface.Height P:IOSurface.IOSurface.InUse -P:IOSurface.IOSurface.LocalUseCount -P:IOSurface.IOSurface.PixelFormat -P:IOSurface.IOSurface.PlaneCount -P:IOSurface.IOSurface.Seed -P:IOSurface.IOSurface.SurfaceId -P:IOSurface.IOSurface.Width P:IOSurface.IOSurfaceOptions.AllocSize P:IOSurface.IOSurfaceOptions.BytesPerElement P:IOSurface.IOSurfaceOptions.BytesPerRow @@ -70805,39 +62028,16 @@ P:iTunesLibrary.ITLibrary.MediaFolderLocation P:iTunesLibrary.ITLibrary.MusicFolderLocation P:iTunesLibrary.ITLibrary.ShowContentRating P:iTunesLibrary.ITLibraryNotifications.DidChangeNotification -P:JavaScriptCore.JSContext.CurrentArguments -P:JavaScriptCore.JSContext.CurrentCallee -P:JavaScriptCore.JSContext.CurrentContext -P:JavaScriptCore.JSContext.CurrentThis -P:JavaScriptCore.JSContext.Exception -P:JavaScriptCore.JSContext.ExceptionHandler -P:JavaScriptCore.JSContext.GlobalObject P:JavaScriptCore.JSContext.Inspectable P:JavaScriptCore.JSContext.Item(Foundation.NSObject) -P:JavaScriptCore.JSContext.JSGlobalContextRefPtr -P:JavaScriptCore.JSContext.Name -P:JavaScriptCore.JSContext.VirtualMachine -P:JavaScriptCore.JSManagedValue.Value P:JavaScriptCore.JSPropertyDescriptorKeys.Configurable P:JavaScriptCore.JSPropertyDescriptorKeys.Enumerable P:JavaScriptCore.JSPropertyDescriptorKeys.Get P:JavaScriptCore.JSPropertyDescriptorKeys.Set P:JavaScriptCore.JSPropertyDescriptorKeys.Value P:JavaScriptCore.JSPropertyDescriptorKeys.Writable -P:JavaScriptCore.JSValue.Context -P:JavaScriptCore.JSValue.IsArray -P:JavaScriptCore.JSValue.IsBigInt -P:JavaScriptCore.JSValue.IsBoolean -P:JavaScriptCore.JSValue.IsDate -P:JavaScriptCore.JSValue.IsNull -P:JavaScriptCore.JSValue.IsNumber -P:JavaScriptCore.JSValue.IsObject -P:JavaScriptCore.JSValue.IsString -P:JavaScriptCore.JSValue.IsSymbol -P:JavaScriptCore.JSValue.IsUndefined P:JavaScriptCore.JSValue.Item(Foundation.NSObject) P:JavaScriptCore.JSValue.Item(System.UIntPtr) -P:JavaScriptCore.JSValue.JSValueRefPtr P:LinkPresentation.LPLinkMetadata.IconProvider P:LinkPresentation.LPLinkMetadata.ImageProvider P:LinkPresentation.LPLinkMetadata.OriginalUrl @@ -70900,81 +62100,20 @@ P:MailKit.IMEExtension.HandlerForContentBlocker P:MailKit.IMEExtension.HandlerForMessageActions P:MailKit.IMEExtension.HandlerForMessageSecurity P:MailKit.IMEMessageActionHandler.RequiredHeaders -P:MailKit.MEComposeContext.Action -P:MailKit.MEComposeContext.ContextId -P:MailKit.MEComposeContext.IsEncrypted -P:MailKit.MEComposeContext.IsSigned -P:MailKit.MEComposeContext.OriginalMessage -P:MailKit.MEComposeContext.ShouldEncrypt -P:MailKit.MEComposeContext.ShouldSign -P:MailKit.MEComposeSession.ComposeContext -P:MailKit.MEComposeSession.MailMessage -P:MailKit.MEComposeSession.SessionId -P:MailKit.MEDecodedMessage.Banner -P:MailKit.MEDecodedMessage.Context -P:MailKit.MEDecodedMessage.RawData -P:MailKit.MEDecodedMessage.SecurityInformation P:MailKit.MEDecodedMessageBanner.Dismissable -P:MailKit.MEDecodedMessageBanner.PrimaryActionTitle -P:MailKit.MEDecodedMessageBanner.Title -P:MailKit.MEEmailAddress.AddressString -P:MailKit.MEEmailAddress.RawString -P:MailKit.MEEncodedOutgoingMessage.IsEncrypted -P:MailKit.MEEncodedOutgoingMessage.IsSigned -P:MailKit.MEEncodedOutgoingMessage.RawData -P:MailKit.MEMessage.AllRecipientAddresses -P:MailKit.MEMessage.BccAddresses -P:MailKit.MEMessage.CcAddresses -P:MailKit.MEMessage.DateReceived -P:MailKit.MEMessage.DateSent -P:MailKit.MEMessage.EncryptionState -P:MailKit.MEMessage.FromAddress -P:MailKit.MEMessage.Headers -P:MailKit.MEMessage.RawData -P:MailKit.MEMessage.ReplyToAddresses -P:MailKit.MEMessage.State -P:MailKit.MEMessage.Subject -P:MailKit.MEMessage.ToAddresses -P:MailKit.MEMessageAction.MarkAsRead -P:MailKit.MEMessageAction.MarkAsUnread -P:MailKit.MEMessageAction.MoveToArchive -P:MailKit.MEMessageAction.MoveToJunk -P:MailKit.MEMessageAction.MoveToTrash -P:MailKit.MEMessageActionDecision.InvokeAgainWithBody -P:MailKit.MEMessageEncodingResult.EncodedMessage -P:MailKit.MEMessageEncodingResult.EncryptionError -P:MailKit.MEMessageEncodingResult.SigningError -P:MailKit.MEMessageSecurityInformation.EncryptionError -P:MailKit.MEMessageSecurityInformation.IsEncrypted -P:MailKit.MEMessageSecurityInformation.LocalizedRemoteContentBlockingReason -P:MailKit.MEMessageSecurityInformation.ShouldBlockRemoteContent -P:MailKit.MEMessageSecurityInformation.Signers -P:MailKit.MEMessageSecurityInformation.SigningError -P:MailKit.MEMessageSigner.Context -P:MailKit.MEMessageSigner.EmailAddresses -P:MailKit.MEMessageSigner.Label -P:MailKit.MEOutgoingMessageEncodingStatus.AddressesFailingEncryption -P:MailKit.MEOutgoingMessageEncodingStatus.CanEncrypt -P:MailKit.MEOutgoingMessageEncodingStatus.CanSign -P:MailKit.MEOutgoingMessageEncodingStatus.SecurityError P:MapKit.IMKAnnotation.Coordinate P:MapKit.IMKAnnotation.Subtitle P:MapKit.IMKAnnotation.Title P:MapKit.IMKOverlay.BoundingMapRect P:MapKit.IMKOverlay.CanReplaceMapContent P:MapKit.MKAnnotation.CalloutInfoDidChangeNotification -P:MapKit.MKAnnotation.Coordinate -P:MapKit.MKAnnotation.Subtitle -P:MapKit.MKAnnotation.Title P:MapKit.MKAnnotationEventArgs.Annotation P:MapKit.MKAnnotationView.Draggable P:MapKit.MKAnnotationView.Enabled P:MapKit.MKAnnotationView.Highlighted P:MapKit.MKAnnotationView.Selected P:MapKit.MKAnnotationViewEventArgs.View -P:MapKit.MKCircle.CanReplaceMapContent P:MapKit.MKClusterAnnotation.CalloutInfoDidChangeNotification -P:MapKit.MKClusterAnnotation.Coordinate P:MapKit.MKDidAddOverlayRenderersEventArgs.Renderers P:MapKit.MKDidFinishRenderingMapEventArgs.FullyRendered P:MapKit.MKDirections.Calculating @@ -70995,17 +62134,11 @@ P:MapKit.MKLookAroundViewController.Delegate P:MapKit.MKLookAroundViewController.NavigationEnabled P:MapKit.MKMapCameraZoomRange.ZoomDefault P:MapKit.MKMapFeatureAnnotation.CalloutInfoDidChangeNotification -P:MapKit.MKMapFeatureAnnotation.Coordinate -P:MapKit.MKMapFeatureAnnotation.Subtitle -P:MapKit.MKMapFeatureAnnotation.Title P:MapKit.MKMapItem.ReadableTypeIdentifiers P:MapKit.MKMapItem.TypeIdentifier P:MapKit.MKMapItem.WritableTypeIdentifiers P:MapKit.MKMapItem.WritableTypeIdentifiersForItemProvider P:MapKit.MKMapItemAnnotation.CalloutInfoDidChangeNotification -P:MapKit.MKMapItemAnnotation.Coordinate -P:MapKit.MKMapItemAnnotation.Subtitle -P:MapKit.MKMapItemAnnotation.Title P:MapKit.MKMapItemDetailViewController.Delegate P:MapKit.MKMapItemRequest.IsCancelled P:MapKit.MKMapItemRequest.IsLoading @@ -71049,38 +62182,19 @@ P:MapKit.MKMarkerAnnotationView.MKMarkerAnnotationViewAppearance.GlyphTintColor P:MapKit.MKMarkerAnnotationView.MKMarkerAnnotationViewAppearance.MarkerTintColor P:MapKit.MKMarkerAnnotationView.MKMarkerAnnotationViewAppearance.SelectedGlyphImage P:MapKit.MKMultiPoint.Points -P:MapKit.MKMultiPolygon.BoundingMapRect -P:MapKit.MKMultiPolygon.CanReplaceMapContent -P:MapKit.MKMultiPolyline.BoundingMapRect -P:MapKit.MKMultiPolyline.CanReplaceMapContent -P:MapKit.MKOverlay.BoundingMapRect -P:MapKit.MKOverlay.CanReplaceMapContent P:MapKit.MKOverlayViewsEventArgs.OverlayViews P:MapKit.MKPinAnnotationView.MKPinAnnotationViewAppearance.PinTintColor P:MapKit.MKPlacemark.CalloutInfoDidChangeNotification -P:MapKit.MKPlacemark.Coordinate -P:MapKit.MKPlacemark.Subtitle -P:MapKit.MKPlacemark.Title P:MapKit.MKPlacemarkAddress.City P:MapKit.MKPlacemarkAddress.Country P:MapKit.MKPlacemarkAddress.CountryCode P:MapKit.MKPlacemarkAddress.State P:MapKit.MKPlacemarkAddress.Street P:MapKit.MKPlacemarkAddress.Zip -P:MapKit.MKPolygon.BoundingMapRect -P:MapKit.MKPolygon.CanReplaceMapContent -P:MapKit.MKPolygon.Coordinate -P:MapKit.MKPolyline.BoundingMapRect -P:MapKit.MKPolyline.CanReplaceMapContent -P:MapKit.MKPolyline.Coordinate P:MapKit.MKReverseGeocoder.Delegate P:MapKit.MKReverseGeocoder.Querying P:MapKit.MKShape.CalloutInfoDidChangeNotification -P:MapKit.MKShape.Coordinate -P:MapKit.MKTileOverlay.BoundingMapRect -P:MapKit.MKTileOverlay.Coordinate P:MapKit.MKTileOverlay.GeometryFlipped -P:MapKit.MKUserLocation.Coordinate P:MapKit.MKUserLocation.Updating P:MapKit.MKUserLocationEventArgs.UserLocation P:MapKit.MMapViewUserTrackingEventArgs.Animated @@ -71721,41 +62835,7 @@ P:MediaToolbox.MTAudioProcessingTapCallbacks.Initialize P:MediaToolbox.MTAudioProcessingTapCallbacks.Prepare P:MediaToolbox.MTAudioProcessingTapCallbacks.Processing P:MediaToolbox.MTAudioProcessingTapCallbacks.Unprepare -P:Messages.MSConversation.LocalParticipantIdentifier -P:Messages.MSConversation.RemoteParticipantIdentifiers -P:Messages.MSConversation.SelectedMessage -P:Messages.MSMessage.AccessibilityLabel -P:Messages.MSMessage.Error -P:Messages.MSMessage.Layout P:Messages.MSMessage.Pending -P:Messages.MSMessage.SenderParticipantIdentifier -P:Messages.MSMessage.Session -P:Messages.MSMessage.ShouldExpire -P:Messages.MSMessage.SummaryText -P:Messages.MSMessage.Url -P:Messages.MSMessageLiveLayout.AlternateLayout -P:Messages.MSMessagesAppViewController.ActiveConversation -P:Messages.MSMessagesAppViewController.PresentationContext -P:Messages.MSMessagesAppViewController.PresentationStyle -P:Messages.MSMessageTemplateLayout.Caption -P:Messages.MSMessageTemplateLayout.Image -P:Messages.MSMessageTemplateLayout.ImageSubtitle -P:Messages.MSMessageTemplateLayout.ImageTitle -P:Messages.MSMessageTemplateLayout.MediaFileUrl -P:Messages.MSMessageTemplateLayout.Subcaption -P:Messages.MSMessageTemplateLayout.TrailingCaption -P:Messages.MSMessageTemplateLayout.TrailingSubcaption -P:Messages.MSSticker.ImageFileUrl -P:Messages.MSSticker.LocalizedDescription -P:Messages.MSStickerBrowserView.ContentInset -P:Messages.MSStickerBrowserView.ContentOffset -P:Messages.MSStickerBrowserView.DataSource -P:Messages.MSStickerBrowserView.StickerSize -P:Messages.MSStickerBrowserViewController.StickerBrowserView -P:Messages.MSStickerBrowserViewController.StickerSize -P:Messages.MSStickerView.AnimationDuration -P:Messages.MSStickerView.IsAnimating -P:Messages.MSStickerView.Sticker P:MessageUI.MFComposeResultEventArgs.Controller P:MessageUI.MFComposeResultEventArgs.Error P:MessageUI.MFComposeResultEventArgs.Result @@ -72018,20 +63098,11 @@ P:Metal.MTLAttribute.IsPatchData P:Metal.MTLAttributeDescriptorArray.Item(System.UIntPtr) P:Metal.MTLBlitPassSampleBufferAttachmentDescriptorArray.Item(System.UIntPtr) P:Metal.MTLBufferLayoutDescriptorArray.Item(System.UIntPtr) -P:Metal.MTLCaptureScope.CommandQueue -P:Metal.MTLCaptureScope.Device -P:Metal.MTLCaptureScope.Label P:Metal.MTLCommandBufferDescriptor.BufferEncoderInfoErrorKey P:Metal.MTLComputePassSampleBufferAttachmentDescriptorArray.Item(System.UIntPtr) P:Metal.MTLDepthStencilDescriptor.DepthWriteEnabled P:Metal.MTLDevice.SystemDefault -P:Metal.MTLDrawable.DrawableId -P:Metal.MTLDrawable.PresentedTime P:Metal.MTLIOCompressionContext.DefaultChunkSize -P:Metal.MTLLinkedFunctions.InstanceDescriptorType -P:Metal.MTLLinkedFunctions.MotionTransformBuffer -P:Metal.MTLLinkedFunctions.MotionTransformBufferOffset -P:Metal.MTLLinkedFunctions.MotionTransformCount P:Metal.MTLMeshRenderPipelineDescriptor.AlphaToCoverageEnabled P:Metal.MTLMeshRenderPipelineDescriptor.AlphaToOneEnabled P:Metal.MTLMeshRenderPipelineDescriptor.RasterizationEnabled @@ -72098,51 +63169,12 @@ P:MetalFX.IMTLFXTemporalScaler.PreExposure P:MetalFX.IMTLFXTemporalScaler.ReactiveMaskTexture P:MetalFX.IMTLFXTemporalScaler.ReactiveTextureUsage P:MetalFX.IMTLFXTemporalScaler.Reset -P:MetalFX.MTLFXSpatialScalerDescriptor.ColorProcessingMode -P:MetalFX.MTLFXSpatialScalerDescriptor.ColorTextureFormat -P:MetalFX.MTLFXSpatialScalerDescriptor.InputHeight -P:MetalFX.MTLFXSpatialScalerDescriptor.InputWidth -P:MetalFX.MTLFXSpatialScalerDescriptor.OutputHeight -P:MetalFX.MTLFXSpatialScalerDescriptor.OutputTextureFormat -P:MetalFX.MTLFXSpatialScalerDescriptor.OutputWidth P:MetalFX.MTLFXTemporalScalerDescriptor.AutoExposureEnabled -P:MetalFX.MTLFXTemporalScalerDescriptor.ColorTextureFormat -P:MetalFX.MTLFXTemporalScalerDescriptor.DepthTextureFormat -P:MetalFX.MTLFXTemporalScalerDescriptor.InputContentMaxScale -P:MetalFX.MTLFXTemporalScalerDescriptor.InputContentMinScale P:MetalFX.MTLFXTemporalScalerDescriptor.InputContentPropertiesEnabled -P:MetalFX.MTLFXTemporalScalerDescriptor.InputHeight -P:MetalFX.MTLFXTemporalScalerDescriptor.InputWidth -P:MetalFX.MTLFXTemporalScalerDescriptor.MotionTextureFormat -P:MetalFX.MTLFXTemporalScalerDescriptor.OutputHeight -P:MetalFX.MTLFXTemporalScalerDescriptor.OutputTextureFormat -P:MetalFX.MTLFXTemporalScalerDescriptor.OutputWidth P:MetalFX.MTLFXTemporalScalerDescriptor.ReactiveMaskTextureEnabled -P:MetalFX.MTLFXTemporalScalerDescriptor.ReactiveMaskTextureFormat -P:MetalFX.MTLFXTemporalScalerDescriptor.RequiresSynchronousInitialization -P:MetalKit.MTKMesh.Name -P:MetalKit.MTKMesh.Submeshes -P:MetalKit.MTKMesh.VertexBuffers -P:MetalKit.MTKMesh.VertexCount -P:MetalKit.MTKMesh.VertexDescriptor -P:MetalKit.MTKMeshBuffer.Allocator -P:MetalKit.MTKMeshBuffer.Buffer -P:MetalKit.MTKMeshBuffer.Length P:MetalKit.MTKMeshBuffer.Map -P:MetalKit.MTKMeshBuffer.Name -P:MetalKit.MTKMeshBuffer.Offset -P:MetalKit.MTKMeshBuffer.Type -P:MetalKit.MTKMeshBuffer.Zone -P:MetalKit.MTKMeshBufferAllocator.Device P:MetalKit.MTKModel.ErrorDomain P:MetalKit.MTKModel.ErrorKey -P:MetalKit.MTKSubmesh.IndexBuffer -P:MetalKit.MTKSubmesh.IndexCount -P:MetalKit.MTKSubmesh.IndexType -P:MetalKit.MTKSubmesh.Mesh -P:MetalKit.MTKSubmesh.Name -P:MetalKit.MTKSubmesh.PrimitiveType -P:MetalKit.MTKTextureLoader.Device P:MetalKit.MTKTextureLoaderError.Domain P:MetalKit.MTKTextureLoaderError.Key P:MetalKit.MTKTextureLoaderOptions.AllocateMipmaps @@ -72154,32 +63186,8 @@ P:MetalKit.MTKTextureLoaderOptions.Srgb P:MetalKit.MTKTextureLoaderOptions.TextureCpuCacheMode P:MetalKit.MTKTextureLoaderOptions.TextureStorageMode P:MetalKit.MTKTextureLoaderOptions.TextureUsage -P:MetalKit.MTKView.AutoResizeDrawable -P:MetalKit.MTKView.ClearColor -P:MetalKit.MTKView.ClearDepth -P:MetalKit.MTKView.ClearStencil -P:MetalKit.MTKView.ColorPixelFormat -P:MetalKit.MTKView.ColorSpace -P:MetalKit.MTKView.CurrentDrawable -P:MetalKit.MTKView.CurrentRenderPassDescriptor P:MetalKit.MTKView.Delegate -P:MetalKit.MTKView.DepthStencilAttachmentTextureUsage -P:MetalKit.MTKView.DepthStencilPixelFormat -P:MetalKit.MTKView.DepthStencilStorageMode -P:MetalKit.MTKView.DepthStencilTexture -P:MetalKit.MTKView.Device -P:MetalKit.MTKView.DrawableSize -P:MetalKit.MTKView.EnableSetNeedsDisplay -P:MetalKit.MTKView.FramebufferOnly -P:MetalKit.MTKView.MultisampleColorAttachmentTextureUsage -P:MetalKit.MTKView.MultisampleColorTexture P:MetalKit.MTKView.Paused -P:MetalKit.MTKView.PreferredDevice -P:MetalKit.MTKView.PreferredDrawableSize -P:MetalKit.MTKView.PreferredFramesPerSecond -P:MetalKit.MTKView.PresentsWithTransaction -P:MetalKit.MTKView.SampleCount -P:MetalKit.MTKView.WeakDelegate P:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.Beta P:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.Epsilon P:MetalPerformanceShaders.IMPSCnnBatchNormalizationDataSource.Gamma @@ -73190,156 +64198,9 @@ P:MetalPerformanceShadersGraph.MPSGraphTensorData.MPSNDArray P:MetalPerformanceShadersGraph.MPSGraphTensorData.Shape P:MetalPerformanceShadersGraph.MPSGraphVariableOp.DataType P:MetalPerformanceShadersGraph.MPSGraphVariableOp.Shape -P:MetricKit.MXAnimationMetric.ScrollHitchTimeRatio -P:MetricKit.MXAppExitMetric.BackgroundExitData -P:MetricKit.MXAppExitMetric.ForegroundExitData -P:MetricKit.MXAppLaunchDiagnostic.CallStackTree -P:MetricKit.MXAppLaunchDiagnostic.LaunchDuration -P:MetricKit.MXAppLaunchMetric.HistogrammedApplicationResumeTime -P:MetricKit.MXAppLaunchMetric.HistogrammedExtendedLaunch -P:MetricKit.MXAppLaunchMetric.HistogrammedOptimizedTimeToFirstDraw -P:MetricKit.MXAppLaunchMetric.HistogrammedTimeToFirstDraw -P:MetricKit.MXAppResponsivenessMetric.HistogrammedApplicationHangTime -P:MetricKit.MXAppRunTimeMetric.CumulativeBackgroundAudioTime -P:MetricKit.MXAppRunTimeMetric.CumulativeBackgroundLocationTime -P:MetricKit.MXAppRunTimeMetric.CumulativeBackgroundTime -P:MetricKit.MXAppRunTimeMetric.CumulativeForegroundTime -P:MetricKit.MXAverage`1.AverageMeasurement -P:MetricKit.MXAverage`1.SampleCount -P:MetricKit.MXAverage`1.StandardDeviation -P:MetricKit.MXBackgroundExitData.CumulativeAbnormalExitCount -P:MetricKit.MXBackgroundExitData.CumulativeAppWatchdogExitCount -P:MetricKit.MXBackgroundExitData.CumulativeBackgroundTaskAssertionTimeoutExitCount -P:MetricKit.MXBackgroundExitData.CumulativeBadAccessExitCount -P:MetricKit.MXBackgroundExitData.CumulativeCpuResourceLimitExitCount -P:MetricKit.MXBackgroundExitData.CumulativeIllegalInstructionExitCount -P:MetricKit.MXBackgroundExitData.CumulativeMemoryPressureExitCount -P:MetricKit.MXBackgroundExitData.CumulativeMemoryResourceLimitExitCount -P:MetricKit.MXBackgroundExitData.CumulativeNormalAppExitCount -P:MetricKit.MXBackgroundExitData.CumulativeSuspendedWithLockedFileExitCount -P:MetricKit.MXCallStackTree.JsonRepresentation -P:MetricKit.MXCellularConditionMetric.HistogrammedCellularConditionTime -P:MetricKit.MXCpuExceptionDiagnostic.CallStackTree -P:MetricKit.MXCpuExceptionDiagnostic.TotalCpuTime -P:MetricKit.MXCpuExceptionDiagnostic.TotalSampledTime -P:MetricKit.MXCpuMetric.CumulativeCpuInstructions -P:MetricKit.MXCpuMetric.CumulativeCpuTime -P:MetricKit.MXCrashDiagnostic.CallStackTree -P:MetricKit.MXCrashDiagnostic.ExceptionCode -P:MetricKit.MXCrashDiagnostic.ExceptionReason -P:MetricKit.MXCrashDiagnostic.ExceptionType -P:MetricKit.MXCrashDiagnostic.Signal -P:MetricKit.MXCrashDiagnostic.TerminationReason -P:MetricKit.MXCrashDiagnostic.VirtualMemoryRegionInfo -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.Arguments -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.ClassName -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.ComposedMessage -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.DictionaryRepresentation -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.ExceptionName -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.ExceptionType -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.FormatString -P:MetricKit.MXCrashDiagnosticObjectiveCExceptionReason.JsonRepresentation -P:MetricKit.MXDiagnostic.ApplicationVersion -P:MetricKit.MXDiagnostic.DictionaryRepresentation -P:MetricKit.MXDiagnostic.JsonRepresentation -P:MetricKit.MXDiagnostic.MetaData -P:MetricKit.MXDiagnostic.SignpostData -P:MetricKit.MXDiagnosticPayload.AppLaunchDiagnostics -P:MetricKit.MXDiagnosticPayload.CpuExceptionDiagnostics -P:MetricKit.MXDiagnosticPayload.CrashDiagnostics -P:MetricKit.MXDiagnosticPayload.DictionaryRepresentation -P:MetricKit.MXDiagnosticPayload.DiskWriteExceptionDiagnostics -P:MetricKit.MXDiagnosticPayload.HangDiagnostics -P:MetricKit.MXDiagnosticPayload.JsonRepresentation -P:MetricKit.MXDiagnosticPayload.TimeStampBegin -P:MetricKit.MXDiagnosticPayload.TimeStampEnd -P:MetricKit.MXDiskIOMetric.CumulativeLogicalWrites -P:MetricKit.MXDiskWriteExceptionDiagnostic.CallStackTree -P:MetricKit.MXDiskWriteExceptionDiagnostic.TotalWritesCaused -P:MetricKit.MXDisplayMetric.AveragePixelLuminance -P:MetricKit.MXForegroundExitData.CumulativeAbnormalExitCount -P:MetricKit.MXForegroundExitData.CumulativeAppWatchdogExitCount -P:MetricKit.MXForegroundExitData.CumulativeBadAccessExitCount -P:MetricKit.MXForegroundExitData.CumulativeIllegalInstructionExitCount -P:MetricKit.MXForegroundExitData.CumulativeMemoryResourceLimitExitCount -P:MetricKit.MXForegroundExitData.CumulativeNormalAppExitCount -P:MetricKit.MXGpuMetric.CumulativeGpuTime -P:MetricKit.MXHangDiagnostic.CallStackTree -P:MetricKit.MXHangDiagnostic.HangDuration -P:MetricKit.MXHistogram`1.BucketEnumerator -P:MetricKit.MXHistogram`1.TotalBucketCount -P:MetricKit.MXHistogramBucket`1.BucketCount -P:MetricKit.MXHistogramBucket`1.BucketEnd -P:MetricKit.MXHistogramBucket`1.BucketStart -P:MetricKit.MXLocationActivityMetric.CumulativeBestAccuracyForNavigationTime -P:MetricKit.MXLocationActivityMetric.CumulativeBestAccuracyTime -P:MetricKit.MXLocationActivityMetric.CumulativeHundredMetersAccuracyTime -P:MetricKit.MXLocationActivityMetric.CumulativeKilometerAccuracyTime -P:MetricKit.MXLocationActivityMetric.CumulativeNearestTenMetersAccuracyTime -P:MetricKit.MXLocationActivityMetric.CumulativeThreeKilometersAccuracyTime -P:MetricKit.MXMemoryMetric.AverageSuspendedMemory -P:MetricKit.MXMemoryMetric.PeakMemoryUsage -P:MetricKit.MXMetaData.ApplicationBuildVersion -P:MetricKit.MXMetaData.DeviceType -P:MetricKit.MXMetaData.DictionaryRepresentation -P:MetricKit.MXMetaData.IsTestFlightApp -P:MetricKit.MXMetaData.JsonRepresentation -P:MetricKit.MXMetaData.LowPowerModeEnabled -P:MetricKit.MXMetaData.OSVersion -P:MetricKit.MXMetaData.Pid -P:MetricKit.MXMetaData.PlatformArchitecture -P:MetricKit.MXMetaData.RegionFormat P:MetricKit.MXMetric.DictionaryRepresentation -P:MetricKit.MXMetric.JsonRepresentation -P:MetricKit.MXMetricManager.PastDiagnosticPayloads -P:MetricKit.MXMetricManager.PastPayloads -P:MetricKit.MXMetricManager.SharedManager -P:MetricKit.MXMetricPayload.AnimationMetrics -P:MetricKit.MXMetricPayload.ApplicationExitMetrics -P:MetricKit.MXMetricPayload.ApplicationLaunchMetrics -P:MetricKit.MXMetricPayload.ApplicationResponsivenessMetrics -P:MetricKit.MXMetricPayload.ApplicationTimeMetrics -P:MetricKit.MXMetricPayload.CellularConditionMetrics -P:MetricKit.MXMetricPayload.CpuMetrics P:MetricKit.MXMetricPayload.DictionaryRepresentation -P:MetricKit.MXMetricPayload.DiskIOMetrics -P:MetricKit.MXMetricPayload.DisplayMetrics -P:MetricKit.MXMetricPayload.GpuMetrics -P:MetricKit.MXMetricPayload.IncludesMultipleApplicationVersions -P:MetricKit.MXMetricPayload.JsonRepresentation -P:MetricKit.MXMetricPayload.LatestApplicationVersion -P:MetricKit.MXMetricPayload.LocationActivityMetrics -P:MetricKit.MXMetricPayload.MemoryMetrics -P:MetricKit.MXMetricPayload.MetaData -P:MetricKit.MXMetricPayload.NetworkTransferMetrics -P:MetricKit.MXMetricPayload.SignpostMetrics -P:MetricKit.MXMetricPayload.TimeStampBegin -P:MetricKit.MXMetricPayload.TimeStampEnd -P:MetricKit.MXNetworkTransferMetric.CumulativeCellularDownload -P:MetricKit.MXNetworkTransferMetric.CumulativeCellularUpload -P:MetricKit.MXNetworkTransferMetric.CumulativeWifiDownload -P:MetricKit.MXNetworkTransferMetric.CumulativeWifiUpload -P:MetricKit.MXSignpostIntervalData.AverageMemory -P:MetricKit.MXSignpostIntervalData.CumulativeCpuTime -P:MetricKit.MXSignpostIntervalData.CumulativeHitchTimeRatio -P:MetricKit.MXSignpostIntervalData.CumulativeLogicalWrites -P:MetricKit.MXSignpostIntervalData.HistogrammedSignpostDuration -P:MetricKit.MXSignpostMetric.SignpostCategory -P:MetricKit.MXSignpostMetric.SignpostIntervalData -P:MetricKit.MXSignpostMetric.SignpostName -P:MetricKit.MXSignpostMetric.TotalCount -P:MetricKit.MXSignpostRecord.BeginTimeStamp -P:MetricKit.MXSignpostRecord.Category -P:MetricKit.MXSignpostRecord.DictionaryRepresentation -P:MetricKit.MXSignpostRecord.Duration -P:MetricKit.MXSignpostRecord.EndTimeStamp -P:MetricKit.MXSignpostRecord.IsInterval -P:MetricKit.MXSignpostRecord.JsonRepresentation -P:MetricKit.MXSignpostRecord.Name -P:MetricKit.MXSignpostRecord.Subsystem -P:MetricKit.MXUnitAveragePixelLuminance.Apl P:MetricKit.MXUnitAveragePixelLuminance.Symbol -P:MetricKit.MXUnitSignalBars.Bars P:MetricKit.MXUnitSignalBars.Symbol P:MLCompute.MLCActivationDescriptor.A P:MLCompute.MLCActivationDescriptor.ActivationType @@ -74810,46 +65671,6 @@ P:OSLog.IOSLogEntryWithPayload.Category P:OSLog.IOSLogEntryWithPayload.Components P:OSLog.IOSLogEntryWithPayload.FormatString P:OSLog.IOSLogEntryWithPayload.Subsystem -P:OSLog.OSLogEntry.ComposedMessage -P:OSLog.OSLogEntry.Date -P:OSLog.OSLogEntry.StoreCategory -P:OSLog.OSLogEntryActivity.ActivityIdentifier -P:OSLog.OSLogEntryActivity.ParentActivityIdentifier -P:OSLog.OSLogEntryActivity.Process -P:OSLog.OSLogEntryActivity.ProcessIdentifier -P:OSLog.OSLogEntryActivity.Sender -P:OSLog.OSLogEntryActivity.ThreadIdentifier -P:OSLog.OSLogEntryLog.ActivityIdentifier -P:OSLog.OSLogEntryLog.Category -P:OSLog.OSLogEntryLog.Components -P:OSLog.OSLogEntryLog.FormatString -P:OSLog.OSLogEntryLog.Level -P:OSLog.OSLogEntryLog.Process -P:OSLog.OSLogEntryLog.ProcessIdentifier -P:OSLog.OSLogEntryLog.Sender -P:OSLog.OSLogEntryLog.Subsystem -P:OSLog.OSLogEntryLog.ThreadIdentifier -P:OSLog.OSLogEntrySignpost.ActivityIdentifier -P:OSLog.OSLogEntrySignpost.Category -P:OSLog.OSLogEntrySignpost.Components -P:OSLog.OSLogEntrySignpost.FormatString -P:OSLog.OSLogEntrySignpost.Process -P:OSLog.OSLogEntrySignpost.ProcessIdentifier -P:OSLog.OSLogEntrySignpost.Sender -P:OSLog.OSLogEntrySignpost.SignpostIdentifier -P:OSLog.OSLogEntrySignpost.SignpostName -P:OSLog.OSLogEntrySignpost.SignpostType -P:OSLog.OSLogEntrySignpost.Subsystem -P:OSLog.OSLogEntrySignpost.ThreadIdentifier -P:OSLog.OSLogMessageComponent.ArgumentCategory -P:OSLog.OSLogMessageComponent.ArgumentDataValue -P:OSLog.OSLogMessageComponent.ArgumentDoubleValue -P:OSLog.OSLogMessageComponent.ArgumentInt64Value -P:OSLog.OSLogMessageComponent.ArgumentNumberValue -P:OSLog.OSLogMessageComponent.ArgumentStringValue -P:OSLog.OSLogMessageComponent.ArgumentUInt64Value -P:OSLog.OSLogMessageComponent.FormatSubstring -P:OSLog.OSLogMessageComponent.Placeholder P:PassKit.IPKIdentityDocumentDescriptor.Elements P:PassKit.IPKIssuerProvisioningExtensionAuthorizationProviding.CompletionHandler P:PassKit.PKAddCarKeyPassConfiguration.ManufacturerIdentifier @@ -75527,82 +66348,13 @@ P:PdfKit.PdfViewActionEventArgs.Action P:PdfKit.PdfViewAnnotationHitEventArgs.AnnotationHit P:PdfKit.PdfViewDelegate.ParentViewController P:PdfKit.PdfViewUrlEventArgs.Url -P:PencilKit.PKCanvasView.AllowsFingerDrawing P:PencilKit.PKCanvasView.Delegate -P:PencilKit.PKCanvasView.Drawing P:PencilKit.PKCanvasView.DrawingEnabled -P:PencilKit.PKCanvasView.DrawingGestureRecognizer -P:PencilKit.PKCanvasView.DrawingPolicy -P:PencilKit.PKCanvasView.MaximumSupportedContentVersion P:PencilKit.PKCanvasView.RulerActive -P:PencilKit.PKCanvasView.Tool P:PencilKit.PKDrawing.AppleDrawingTypeIdentifier -P:PencilKit.PKDrawing.Bounds -P:PencilKit.PKDrawing.DataRepresentation -P:PencilKit.PKDrawing.RequiredContentVersion -P:PencilKit.PKDrawing.Strokes -P:PencilKit.PKEraserTool.EraserType -P:PencilKit.PKEraserTool.Width -P:PencilKit.PKFloatRange.LowerBound -P:PencilKit.PKFloatRange.UpperBound -P:PencilKit.PKInk.Color P:PencilKit.PKInk.InkType -P:PencilKit.PKInk.RequiredContentVersion -P:PencilKit.PKInkingTool.Color -P:PencilKit.PKInkingTool.Ink -P:PencilKit.PKInkingTool.InkType -P:PencilKit.PKInkingTool.RequiredContentVersion -P:PencilKit.PKInkingTool.Width -P:PencilKit.PKStroke.Ink -P:PencilKit.PKStroke.Mask -P:PencilKit.PKStroke.MaskedPathRanges -P:PencilKit.PKStroke.Path -P:PencilKit.PKStroke.RandomSeed -P:PencilKit.PKStroke.RenderBounds -P:PencilKit.PKStroke.RequiredContentVersion -P:PencilKit.PKStroke.Transform -P:PencilKit.PKStrokePath.Count -P:PencilKit.PKStrokePath.CreationDate -P:PencilKit.PKStrokePoint.Altitude -P:PencilKit.PKStrokePoint.Azimuth -P:PencilKit.PKStrokePoint.Force -P:PencilKit.PKStrokePoint.Location -P:PencilKit.PKStrokePoint.Opacity -P:PencilKit.PKStrokePoint.SecondaryScale -P:PencilKit.PKStrokePoint.Size -P:PencilKit.PKStrokePoint.TimeOffset -P:PencilKit.PKToolPicker.AccessoryItem -P:PencilKit.PKToolPicker.ColorUserInterfaceStyle P:PencilKit.PKToolPicker.Delegate -P:PencilKit.PKToolPicker.IsVisible -P:PencilKit.PKToolPicker.MaximumSupportedContentVersion -P:PencilKit.PKToolPicker.OverrideUserInterfaceStyle P:PencilKit.PKToolPicker.RulerActive -P:PencilKit.PKToolPicker.SelectedTool -P:PencilKit.PKToolPicker.SelectedToolItem -P:PencilKit.PKToolPicker.SelectedToolItemIdentifier -P:PencilKit.PKToolPicker.ShowsDrawingPolicyControls -P:PencilKit.PKToolPicker.StateAutosaveName -P:PencilKit.PKToolPicker.ToolItems -P:PencilKit.PKToolPicker.WeakDelegate -P:PencilKit.PKToolPickerCustomItem.AllowsColorSelection -P:PencilKit.PKToolPickerCustomItem.Color -P:PencilKit.PKToolPickerCustomItem.Configuration -P:PencilKit.PKToolPickerCustomItem.Width -P:PencilKit.PKToolPickerCustomItemConfiguration.AllowsColorSelection -P:PencilKit.PKToolPickerCustomItemConfiguration.DefaultColor -P:PencilKit.PKToolPickerCustomItemConfiguration.DefaultWidth -P:PencilKit.PKToolPickerCustomItemConfiguration.Identifier -P:PencilKit.PKToolPickerCustomItemConfiguration.ImageProvider -P:PencilKit.PKToolPickerCustomItemConfiguration.Name -P:PencilKit.PKToolPickerCustomItemConfiguration.ToolAttributeControls -P:PencilKit.PKToolPickerCustomItemConfiguration.ViewControllerProvider -P:PencilKit.PKToolPickerCustomItemConfiguration.WidthVariants -P:PencilKit.PKToolPickerEraserItem.EraserTool -P:PencilKit.PKToolPickerInkingItem.AllowsColorSelection -P:PencilKit.PKToolPickerInkingItem.InkingTool -P:PencilKit.PKToolPickerItem.Identifier -P:PencilKit.PKToolPickerLassoItem.LassoTool P:Phase.PhaseAmbientMixerDefinition.InputChannelLayout P:Phase.PhaseAmbientMixerDefinition.Orientation P:Phase.PhaseAsset.Identifier @@ -75811,13 +66563,7 @@ P:PrintCore.PMRect.Right P:PrintCore.PMRect.Top P:PrintCore.PMResolution.HorizontalResolution P:PrintCore.PMResolution.VerticalResolution -P:PushKit.PKPushCredentials.Token -P:PushKit.PKPushCredentials.Type -P:PushKit.PKPushPayload.DictionaryPayload -P:PushKit.PKPushPayload.Type P:PushKit.PKPushRegistry.Delegate -P:PushKit.PKPushRegistry.DesiredPushTypes -P:PushKit.PKPushRegistry.WeakDelegate P:PushKit.PKPushType.Complication P:PushKit.PKPushType.FileProvider P:PushKit.PKPushType.Voip @@ -75874,9 +66620,6 @@ P:QuartzComposer.QCCompositionRepository.AllCompositions P:QuartzComposer.QCCompositionRepository.SharedCompositionRepository P:QuickLook.IQLPreviewItem.PreviewItemTitle P:QuickLook.IQLPreviewItem.PreviewItemUrl -P:QuickLook.QLFilePreviewRequest.FileUrl -P:QuickLook.QLPreviewController.CurrentPreviewItem -P:QuickLook.QLPreviewController.CurrentPreviewItemIndex P:QuickLook.QLPreviewController.DataSource P:QuickLook.QLPreviewController.Delegate P:QuickLook.QLPreviewController.FrameForPreviewItem @@ -75884,19 +66627,9 @@ P:QuickLook.QLPreviewController.GetEditingMode P:QuickLook.QLPreviewController.ShouldOpenUrl P:QuickLook.QLPreviewController.TransitionImageForPreviewItem P:QuickLook.QLPreviewController.TransitionViewForPreviewItem -P:QuickLook.QLPreviewController.WeakDataSource -P:QuickLook.QLPreviewController.WeakDelegate P:QuickLook.QLPreviewControllerDelegateDidSaveEventArgs.ModifiedContentsUrl P:QuickLook.QLPreviewControllerDelegateDidSaveEventArgs.PreviewItem P:QuickLook.QLPreviewControllerDelegateDidUpdateEventArgs.PreviewItem -P:QuickLook.QLPreviewItem.PreviewItemTitle -P:QuickLook.QLPreviewItem.PreviewItemUrl -P:QuickLook.QLPreviewReply.Attachments -P:QuickLook.QLPreviewReply.StringEncoding -P:QuickLook.QLPreviewReply.Title -P:QuickLook.QLPreviewReplyAttachment.ContentType -P:QuickLook.QLPreviewReplyAttachment.Data -P:QuickLook.QLPreviewSceneOptions.InitialPreviewIndex P:QuickLookThumbnailing.QLFileThumbnailRequest.FileUrl P:QuickLookThumbnailing.QLFileThumbnailRequest.MaximumSize P:QuickLookThumbnailing.QLFileThumbnailRequest.MinimumSize @@ -75919,54 +66652,19 @@ P:QuickLookThumbnailing.QLThumbnailRepresentation.UIImage P:QuickLookUI.IQLPreviewItem.PreviewItemDisplayState P:QuickLookUI.IQLPreviewItem.PreviewItemTitle P:QuickLookUI.IQLPreviewItem.PreviewItemUrl -P:QuickLookUI.QLFilePreviewRequest.FileUrl -P:QuickLookUI.QLPreviewItem.PreviewItemDisplayState -P:QuickLookUI.QLPreviewItem.PreviewItemTitle -P:QuickLookUI.QLPreviewItem.PreviewItemUrl -P:QuickLookUI.QLPreviewPanel.CurrentController -P:QuickLookUI.QLPreviewPanel.CurrentPreviewItem -P:QuickLookUI.QLPreviewPanel.CurrentPreviewItemIndex P:QuickLookUI.QLPreviewPanel.DataSource P:QuickLookUI.QLPreviewPanel.Delegate -P:QuickLookUI.QLPreviewPanel.DisplayState P:QuickLookUI.QLPreviewPanel.InFullScreenMode -P:QuickLookUI.QLPreviewPanel.WeakDataSource -P:QuickLookUI.QLPreviewPanel.WeakDelegate -P:QuickLookUI.QLPreviewReply.Attachments -P:QuickLookUI.QLPreviewReply.StringEncoding -P:QuickLookUI.QLPreviewReply.Title -P:QuickLookUI.QLPreviewReplyAttachment.ContentType -P:QuickLookUI.QLPreviewReplyAttachment.Data -P:QuickLookUI.QLPreviewView.Autostarts -P:QuickLookUI.QLPreviewView.DisplayState -P:QuickLookUI.QLPreviewView.PreviewItem -P:QuickLookUI.QLPreviewView.ShouldCloseWithWindow P:ReplayKit.RPBroadcastActivityController.Delegate -P:ReplayKit.RPBroadcastActivityController.WeakDelegate -P:ReplayKit.RPBroadcastActivityViewController.Delegate -P:ReplayKit.RPBroadcastConfiguration.ClipDuration P:ReplayKit.RPBroadcastConfiguration.VideoCompressionProperties -P:ReplayKit.RPBroadcastConfiguration.WeakVideoCompressionProperties -P:ReplayKit.RPBroadcastController.BroadcastExtensionBundleID P:ReplayKit.RPBroadcastController.Broadcasting -P:ReplayKit.RPBroadcastController.BroadcastUrl -P:ReplayKit.RPBroadcastController.Delegate P:ReplayKit.RPBroadcastController.Paused -P:ReplayKit.RPBroadcastController.ServiceInfo P:ReplayKit.RPBroadcastSampleHandler.ApplicationInfoBundleIdentifierKey P:ReplayKit.RPBroadcastSampleHandler.VideoSampleOrientationKey -P:ReplayKit.RPPreviewViewController.Mode -P:ReplayKit.RPPreviewViewController.PreviewControllerDelegate P:ReplayKit.RPScreenRecorder.Available P:ReplayKit.RPScreenRecorder.CameraEnabled -P:ReplayKit.RPScreenRecorder.CameraPosition -P:ReplayKit.RPScreenRecorder.CameraPreviewView -P:ReplayKit.RPScreenRecorder.Delegate P:ReplayKit.RPScreenRecorder.MicrophoneEnabled P:ReplayKit.RPScreenRecorder.Recording -P:ReplayKit.RPScreenRecorder.SharedRecorder -P:ReplayKit.RPSystemBroadcastPickerView.PreferredExtension -P:ReplayKit.RPSystemBroadcastPickerView.ShowsMicrophoneButton P:SafariServices.ISFAddToHomeScreenActivityItem.IconItemProvider P:SafariServices.ISFAddToHomeScreenActivityItem.Title P:SafariServices.ISFAddToHomeScreenActivityItem.Url @@ -76000,15 +66698,9 @@ P:SafariServices.SFUniversalLink.WebpageUrl P:SafariServices.SFValidationResult.Arg1 P:SafariServices.SFValidationResult.Arg2 P:SafariServices.SSReadingList.DefaultReadingList -P:SafetyKit.SACrashDetectionEvent.Date -P:SafetyKit.SACrashDetectionEvent.Location -P:SafetyKit.SACrashDetectionEvent.Response -P:SafetyKit.SACrashDetectionManager.AuthorizationStatus P:SafetyKit.SACrashDetectionManager.Available P:SafetyKit.SACrashDetectionManager.Delegate -P:SafetyKit.SACrashDetectionManager.WeakDelegate P:SafetyKit.SAEmergencyResponseManager.Delegate -P:SafetyKit.SAEmergencyResponseManager.WeakDelegate P:SceneKit.ISCNActionable.ActionKeys P:SceneKit.ISCNCameraControlConfiguration.AllowsTranslation P:SceneKit.ISCNCameraControlConfiguration.AutoSwitchToFreeCamera @@ -76048,20 +66740,15 @@ P:SceneKit.ISCNShadable.MinimumLanguageVersion P:SceneKit.ISCNShadable.Program P:SceneKit.ISCNShadable.WeakShaderModifiers P:SceneKit.ISCNTechniqueSupport.Technique -P:SceneKit.SCNActionable.ActionKeys P:SceneKit.SCNAnimation.Additive P:SceneKit.SCNAnimation.AppliedOnCompletion P:SceneKit.SCNAnimation.Cumulative P:SceneKit.SCNAnimation.RemovedOnCompletion P:SceneKit.SCNAudioSource.Positional -P:SceneKit.SCNCamera.Technique P:SceneKit.SCNCameraController.InertiaRunning P:SceneKit.SCNConstraint.Enabled P:SceneKit.SCNConstraint.Incremental -P:SceneKit.SCNGeometry.MinimumLanguageVersion -P:SceneKit.SCNGeometry.Program P:SceneKit.SCNGeometry.ShaderModifiers -P:SceneKit.SCNGeometry.WeakShaderModifiers P:SceneKit.SCNGeometryElement.InterleavedIndicesChannels P:SceneKit.SCNGeometrySourceSemantic.BoneIndices P:SceneKit.SCNGeometrySourceSemantic.BoneWeights @@ -76094,38 +66781,12 @@ P:SceneKit.SCNHitTestOptions.IgnoreLightArea P:SceneKit.SCNHitTestOptions.RootNode P:SceneKit.SCNHitTestOptions.SearchMode P:SceneKit.SCNHitTestOptions.SortResults -P:SceneKit.SCNLayer.AudioEngine -P:SceneKit.SCNLayer.AudioEnvironmentNode -P:SceneKit.SCNLayer.AudioListener -P:SceneKit.SCNLayer.AutoenablesDefaultLighting -P:SceneKit.SCNLayer.ColorPixelFormat -P:SceneKit.SCNLayer.CommandQueue -P:SceneKit.SCNLayer.Context -P:SceneKit.SCNLayer.CurrentRenderCommandEncoder -P:SceneKit.SCNLayer.CurrentRenderPassDescriptor -P:SceneKit.SCNLayer.CurrentTime -P:SceneKit.SCNLayer.CurrentViewport -P:SceneKit.SCNLayer.DebugOptions -P:SceneKit.SCNLayer.DepthPixelFormat -P:SceneKit.SCNLayer.Device P:SceneKit.SCNLayer.JitteringEnabled -P:SceneKit.SCNLayer.Loops -P:SceneKit.SCNLayer.OverlayScene P:SceneKit.SCNLayer.Playing -P:SceneKit.SCNLayer.PointOfView -P:SceneKit.SCNLayer.RenderingApi P:SceneKit.SCNLayer.SceneRendererDelegate -P:SceneKit.SCNLayer.SceneTimeInSeconds -P:SceneKit.SCNLayer.ShowsStatistics -P:SceneKit.SCNLayer.StencilPixelFormat -P:SceneKit.SCNLayer.Technique P:SceneKit.SCNLayer.TemporalAntialiasingEnabled -P:SceneKit.SCNLayer.UsesReverseZ -P:SceneKit.SCNLayer.WeakSceneRendererDelegate -P:SceneKit.SCNLayer.WorkingColorSpace P:SceneKit.SCNLight.Color P:SceneKit.SCNLight.ShadowColor -P:SceneKit.SCNLight.Technique P:SceneKit.SCNLightAttribute.AttenuationEndKey P:SceneKit.SCNLightAttribute.AttenuationFalloffExponentKey P:SceneKit.SCNLightAttribute.AttenuationStartKey @@ -76148,10 +66809,7 @@ P:SceneKit.SCNLightType.Probe P:SceneKit.SCNLightType.Spot P:SceneKit.SCNMaterial.DoubleSided P:SceneKit.SCNMaterial.LitPerPixel -P:SceneKit.SCNMaterial.MinimumLanguageVersion -P:SceneKit.SCNMaterial.Program P:SceneKit.SCNMaterial.ShaderModifiers -P:SceneKit.SCNMaterial.WeakShaderModifiers P:SceneKit.SCNMaterialProperty.ContentColor P:SceneKit.SCNMaterialProperty.ContentImage P:SceneKit.SCNMaterialProperty.ContentImageCube @@ -76160,14 +66818,12 @@ P:SceneKit.SCNMaterialProperty.ContentPath P:SceneKit.SCNMaterialProperty.ContentScene P:SceneKit.SCNMaterialProperty.ContentTexture P:SceneKit.SCNMaterialProperty.ContentUrl -P:SceneKit.SCNNode.ActionKeys P:SceneKit.SCNNode.CanBecomeFocused P:SceneKit.SCNNode.FocusEffect P:SceneKit.SCNNode.FocusGroupIdentifier P:SceneKit.SCNNode.FocusGroupPriority P:SceneKit.SCNNode.FocusItemContainer P:SceneKit.SCNNode.FocusItemDeferralMode -P:SceneKit.SCNNode.Frame P:SceneKit.SCNNode.Hidden P:SceneKit.SCNNode.IsTransparentFocusItem P:SceneKit.SCNNode.ParentFocusEnvironment @@ -76238,35 +66894,10 @@ P:SceneKit.SCNPropertyControllers.RotationAxis P:SceneKit.SCNPropertyControllers.Size P:SceneKit.SCNPropertyControllers.Velocity P:SceneKit.SCNReferenceNode.Loaded -P:SceneKit.SCNRenderer.AudioEngine -P:SceneKit.SCNRenderer.AudioEnvironmentNode -P:SceneKit.SCNRenderer.AudioListener -P:SceneKit.SCNRenderer.AutoenablesDefaultLighting -P:SceneKit.SCNRenderer.ColorPixelFormat -P:SceneKit.SCNRenderer.CommandQueue -P:SceneKit.SCNRenderer.Context -P:SceneKit.SCNRenderer.CurrentRenderCommandEncoder -P:SceneKit.SCNRenderer.CurrentRenderPassDescriptor -P:SceneKit.SCNRenderer.CurrentTime -P:SceneKit.SCNRenderer.CurrentViewport -P:SceneKit.SCNRenderer.DebugOptions -P:SceneKit.SCNRenderer.DepthPixelFormat -P:SceneKit.SCNRenderer.Device P:SceneKit.SCNRenderer.JitteringEnabled -P:SceneKit.SCNRenderer.Loops -P:SceneKit.SCNRenderer.OverlayScene P:SceneKit.SCNRenderer.Playing -P:SceneKit.SCNRenderer.PointOfView -P:SceneKit.SCNRenderer.RenderingApi P:SceneKit.SCNRenderer.SceneRendererDelegate -P:SceneKit.SCNRenderer.SceneTimeInSeconds -P:SceneKit.SCNRenderer.ShowsStatistics -P:SceneKit.SCNRenderer.StencilPixelFormat -P:SceneKit.SCNRenderer.Technique P:SceneKit.SCNRenderer.TemporalAntialiasingEnabled -P:SceneKit.SCNRenderer.UsesReverseZ -P:SceneKit.SCNRenderer.WeakSceneRendererDelegate -P:SceneKit.SCNRenderer.WorkingColorSpace P:SceneKit.SCNRenderingArguments.ModelTransform P:SceneKit.SCNRenderingArguments.ModelViewProjectionTransform P:SceneKit.SCNRenderingArguments.ModelViewTransform @@ -76293,35 +66924,10 @@ P:SceneKit.SCNSceneLoadingOptions.OverrideAssetUrls P:SceneKit.SCNSceneLoadingOptions.PreserveOriginalTopology P:SceneKit.SCNSceneLoadingOptions.StrictConformance P:SceneKit.SCNSceneLoadingOptions.UseSafeMode -P:SceneKit.SCNSceneRenderer.AudioEngine -P:SceneKit.SCNSceneRenderer.AudioEnvironmentNode -P:SceneKit.SCNSceneRenderer.AudioListener -P:SceneKit.SCNSceneRenderer.AutoenablesDefaultLighting -P:SceneKit.SCNSceneRenderer.ColorPixelFormat -P:SceneKit.SCNSceneRenderer.CommandQueue -P:SceneKit.SCNSceneRenderer.Context -P:SceneKit.SCNSceneRenderer.CurrentRenderCommandEncoder -P:SceneKit.SCNSceneRenderer.CurrentRenderPassDescriptor -P:SceneKit.SCNSceneRenderer.CurrentTime -P:SceneKit.SCNSceneRenderer.CurrentViewport -P:SceneKit.SCNSceneRenderer.DebugOptions -P:SceneKit.SCNSceneRenderer.DepthPixelFormat -P:SceneKit.SCNSceneRenderer.Device P:SceneKit.SCNSceneRenderer.JitteringEnabled -P:SceneKit.SCNSceneRenderer.Loops -P:SceneKit.SCNSceneRenderer.OverlayScene P:SceneKit.SCNSceneRenderer.Playing -P:SceneKit.SCNSceneRenderer.PointOfView -P:SceneKit.SCNSceneRenderer.RenderingApi -P:SceneKit.SCNSceneRenderer.Scene P:SceneKit.SCNSceneRenderer.SceneRendererDelegate -P:SceneKit.SCNSceneRenderer.SceneTimeInSeconds -P:SceneKit.SCNSceneRenderer.ShowsStatistics -P:SceneKit.SCNSceneRenderer.StencilPixelFormat P:SceneKit.SCNSceneRenderer.TemporalAntialiasingEnabled -P:SceneKit.SCNSceneRenderer.UsesReverseZ -P:SceneKit.SCNSceneRenderer.WeakSceneRendererDelegate -P:SceneKit.SCNSceneRenderer.WorkingColorSpace P:SceneKit.SCNSceneSourceLoadErrors.ConsistencyElementIDErrorKey P:SceneKit.SCNSceneSourceLoadErrors.ConsistencyElementTypeErrorKey P:SceneKit.SCNSceneSourceLoadErrors.ConsistencyLineNumberErrorKey @@ -76350,10 +66956,7 @@ P:SceneKit.SCNSceneSourceProperties.AssetUnitKey P:SceneKit.SCNSceneSourceProperties.AssetUnitMeterKey P:SceneKit.SCNSceneSourceProperties.AssetUnitNameKey P:SceneKit.SCNSceneSourceProperties.AssetUpAxisKey -P:SceneKit.SCNShadable.MinimumLanguageVersion -P:SceneKit.SCNShadable.Program P:SceneKit.SCNShadable.ShaderModifiers -P:SceneKit.SCNShadable.WeakShaderModifiers P:SceneKit.SCNShaderModifiers.EntryPointFragment P:SceneKit.SCNShaderModifiers.EntryPointGeometry P:SceneKit.SCNShaderModifiers.EntryPointLightingModel @@ -76361,37 +66964,11 @@ P:SceneKit.SCNShaderModifiers.EntryPointSurface P:SceneKit.SCNSkinner.BoneInverseBindTransforms P:SceneKit.SCNSphere.Geodesic P:SceneKit.SCNTechnique.Item(Foundation.NSString) -P:SceneKit.SCNTechniqueSupport.Technique P:SceneKit.SCNText.Wrapped -P:SceneKit.SCNView.AudioEngine -P:SceneKit.SCNView.AudioEnvironmentNode -P:SceneKit.SCNView.AudioListener -P:SceneKit.SCNView.AutoenablesDefaultLighting -P:SceneKit.SCNView.ColorPixelFormat -P:SceneKit.SCNView.CommandQueue -P:SceneKit.SCNView.Context -P:SceneKit.SCNView.CurrentRenderCommandEncoder -P:SceneKit.SCNView.CurrentRenderPassDescriptor -P:SceneKit.SCNView.CurrentTime -P:SceneKit.SCNView.CurrentViewport -P:SceneKit.SCNView.DebugOptions -P:SceneKit.SCNView.DepthPixelFormat -P:SceneKit.SCNView.Device P:SceneKit.SCNView.JitteringEnabled -P:SceneKit.SCNView.Loops -P:SceneKit.SCNView.OverlayScene P:SceneKit.SCNView.Playing -P:SceneKit.SCNView.PointOfView -P:SceneKit.SCNView.RenderingApi P:SceneKit.SCNView.SceneRendererDelegate -P:SceneKit.SCNView.SceneTimeInSeconds -P:SceneKit.SCNView.ShowsStatistics -P:SceneKit.SCNView.StencilPixelFormat -P:SceneKit.SCNView.Technique P:SceneKit.SCNView.TemporalAntialiasingEnabled -P:SceneKit.SCNView.UsesReverseZ -P:SceneKit.SCNView.WeakSceneRendererDelegate -P:SceneKit.SCNView.WorkingColorSpace P:ScreenCaptureKit.SCContentSharingPicker.Active P:ScreenCaptureKit.SCStreamFrameInfoKeys.BoundingRect P:ScreenCaptureKit.SCStreamFrameInfoKeys.ContentRect @@ -76635,7 +67212,6 @@ P:Security.SslContext.PeerTrust P:Security.SslContext.SessionState P:Security.SslStreamConnection.InnerStream P:SensitiveContentAnalysis.SCSensitivityAnalysis.Sensitive -P:SensitiveContentAnalysis.SCSensitivityAnalyzer.AnalysisPolicy P:SensorKit.SRSensorReader.Delegate P:SensorKit.SRSensorReader.Sensor P:ServiceManagement.SMAppService.MainApp @@ -76649,62 +67225,13 @@ P:SharedWithYou.SWCollaborationView.Delegate P:SharedWithYou.SWHighlight.MetadataTypeIdentifier P:SharedWithYou.SWHighlightCenter.Delegate P:SharedWithYou.SWHighlightCenter.SystemCollaborationSupportAvailable -P:SharedWithYou.SWHighlightMembershipEvent.HighlightUrl -P:SharedWithYou.SWHighlightMentionEvent.HighlightUrl -P:SharedWithYou.SWHighlightPersistenceEvent.HighlightUrl P:SharedWithYouCore.SWAction.Complete P:SharedWithYouCore.SWCollaborationMetadata.ReadableTypeIdentifiers P:SharedWithYouCore.SWCollaborationMetadata.WritableTypeIdentifiers P:SharedWithYouCore.SWCollaborationMetadata.WritableTypeIdentifiersForItemProvider P:SharedWithYouCore.SWCollaborationOption.Selected P:SharedWithYouCore.SWCollaborationOptionsGroup.TypeIdentifier -P:ShazamKit.SHCatalog.MaximumQuerySignatureDuration -P:ShazamKit.SHCatalog.MinimumQuerySignatureDuration -P:ShazamKit.SHCustomCatalog.DataRepresentation -P:ShazamKit.SHMatch.MediaItems -P:ShazamKit.SHMatch.QuerySignature -P:ShazamKit.SHMatchedMediaItem.FrequencySkew -P:ShazamKit.SHMatchedMediaItem.MatchOffset -P:ShazamKit.SHMatchedMediaItem.PredictedCurrentMatchOffset -P:ShazamKit.SHMediaItem.AppleMusicId -P:ShazamKit.SHMediaItem.AppleMusicUrl -P:ShazamKit.SHMediaItem.Artist -P:ShazamKit.SHMediaItem.ArtworkUrl -P:ShazamKit.SHMediaItem.CreationDate -P:ShazamKit.SHMediaItem.ExplicitContent -P:ShazamKit.SHMediaItem.FrequencySkewRanges -P:ShazamKit.SHMediaItem.Genres -P:ShazamKit.SHMediaItem.Isrc -P:ShazamKit.SHMediaItem.ShazamId -P:ShazamKit.SHMediaItem.Subtitle -P:ShazamKit.SHMediaItem.TimeRanges -P:ShazamKit.SHMediaItem.Title -P:ShazamKit.SHMediaItem.VideoUrl -P:ShazamKit.SHMediaItem.WebUrl -P:ShazamKit.SHMediaLibrary.DefaultLibrary -P:ShazamKit.SHRange.LowerBound -P:ShazamKit.SHRange.UpperBound -P:ShazamKit.SHSession.Catalog P:ShazamKit.SHSession.Delegate -P:ShazamKit.SHSession.WeakDelegate -P:ShazamKit.SHSignature.DataRepresentation -P:ShazamKit.SHSignature.Duration -P:ShazamKit.SHSignatureGenerator.Signature -P:Social.SLComposeServiceViewController.AutoCompletionViewController -P:Social.SLComposeServiceViewController.CharactersRemaining -P:Social.SLComposeServiceViewController.ContentText -P:Social.SLComposeServiceViewController.Placeholder -P:Social.SLComposeServiceViewController.TextView -P:Social.SLComposeSheetConfigurationItem.TapHandler -P:Social.SLComposeSheetConfigurationItem.Title -P:Social.SLComposeSheetConfigurationItem.Value -P:Social.SLComposeSheetConfigurationItem.ValuePending -P:Social.SLComposeViewController.CompletionHandler -P:Social.SLComposeViewController.ServiceType -P:Social.SLRequest.Account -P:Social.SLRequest.Parameters -P:Social.SLRequest.RequestMethod -P:Social.SLRequest.Url P:Social.SLRequestResult.Arg1 P:Social.SLRequestResult.Arg2 P:Social.SLServiceType.Facebook @@ -76731,8 +67258,6 @@ P:SpriteKit.ISKWarpable.SubdivisionLevels P:SpriteKit.ISKWarpable.WarpGeometry P:SpriteKit.SK3DNode.Playing P:SpriteKit.SKAudioNode.Positional -P:SpriteKit.SKEffectNode.SubdivisionLevels -P:SpriteKit.SKEffectNode.WarpGeometry P:SpriteKit.SKFieldNode.Enabled P:SpriteKit.SKFieldNode.Exclusive P:SpriteKit.SKLightNode.Enabled @@ -76756,8 +67281,6 @@ P:SpriteKit.SKPhysicsBody.Resting P:SpriteKit.SKPhysicsWorld.ContactDelegate P:SpriteKit.SKScene.Delegate P:SpriteKit.SKShapeNode.Antialiased -P:SpriteKit.SKSpriteNode.SubdivisionLevels -P:SpriteKit.SKSpriteNode.WarpGeometry P:SpriteKit.SKTextureAtlasLoadResult.Error P:SpriteKit.SKTextureAtlasLoadResult.FoundAtlases P:SpriteKit.SKUniform.FloatVector2Value @@ -76836,123 +67359,16 @@ P:SystemConfiguration.CaptiveNetwork.NetworkInfoKeyBSSID P:SystemConfiguration.CaptiveNetwork.NetworkInfoKeySSID P:SystemConfiguration.CaptiveNetwork.NetworkInfoKeySSIDData P:SystemConfiguration.SystemConfigurationException.StatusErrorCode -P:ThreadNetwork.THCredentials.ActiveOperationalDataSet -P:ThreadNetwork.THCredentials.BorderAgentId -P:ThreadNetwork.THCredentials.Channel -P:ThreadNetwork.THCredentials.CreationDate -P:ThreadNetwork.THCredentials.ExtendedPanId -P:ThreadNetwork.THCredentials.LastModificationDate -P:ThreadNetwork.THCredentials.NetworkKey -P:ThreadNetwork.THCredentials.NetworkName -P:ThreadNetwork.THCredentials.PanId -P:ThreadNetwork.THCredentials.Pskc P:TVMLKit.ITVPlaybackEventMarshaling.Properties -P:TVMLKit.TVApplicationController.Context P:TVMLKit.TVApplicationController.Delegate -P:TVMLKit.TVApplicationController.NavigationController -P:TVMLKit.TVApplicationController.WeakDelegate -P:TVMLKit.TVApplicationController.Window -P:TVMLKit.TVApplicationControllerContext.JavaScriptApplicationUrl -P:TVMLKit.TVApplicationControllerContext.LaunchOptions -P:TVMLKit.TVApplicationControllerContext.StorageIdentifier -P:TVMLKit.TVApplicationControllerContext.SupportsPictureInPicturePlayback -P:TVMLKit.TVBrowserViewController.CenteredViewElement -P:TVMLKit.TVBrowserViewController.CornerRadius P:TVMLKit.TVBrowserViewController.DataSource P:TVMLKit.TVBrowserViewController.Delegate -P:TVMLKit.TVBrowserViewController.InteritemSpacing -P:TVMLKit.TVBrowserViewController.MaskInset -P:TVMLKit.TVBrowserViewController.ViewElement -P:TVMLKit.TVBrowserViewController.WeakDataSource -P:TVMLKit.TVBrowserViewController.WeakDelegate -P:TVMLKit.TVColor.Color -P:TVMLKit.TVColor.ColorType -P:TVMLKit.TVColor.GradientColors -P:TVMLKit.TVColor.GradientPoints -P:TVMLKit.TVDocumentViewController.AppController P:TVMLKit.TVDocumentViewController.Delegate -P:TVMLKit.TVDocumentViewController.DocumentContext -P:TVMLKit.TVDocumentViewController.WeakDelegate -P:TVMLKit.TVHighlight.HighlightDescription -P:TVMLKit.TVHighlight.ImageUrl -P:TVMLKit.TVHighlight.LocalizedName -P:TVMLKit.TVHighlight.TimeRange -P:TVMLKit.TVHighlightGroup.Highlights -P:TVMLKit.TVHighlightGroup.LocalizedName -P:TVMLKit.TVImageElement.ImageType -P:TVMLKit.TVImageElement.SourceSet -P:TVMLKit.TVImageElement.Url -P:TVMLKit.TVInterfaceFactory.ExtendedInterfaceCreator -P:TVMLKit.TVInterfaceFactory.SharedInterfaceFactory -P:TVMLKit.TVMediaItem.ArtworkImageUrl P:TVMLKit.TVMediaItem.ContentRatingDomain -P:TVMLKit.TVMediaItem.ContentRatingRanking -P:TVMLKit.TVMediaItem.ExplicitContent -P:TVMLKit.TVMediaItem.HighlightGroups -P:TVMLKit.TVMediaItem.Interstitials -P:TVMLKit.TVMediaItem.ItemDescription -P:TVMLKit.TVMediaItem.ResumeTime -P:TVMLKit.TVMediaItem.Subtitle -P:TVMLKit.TVMediaItem.Title P:TVMLKit.TVMediaItem.Type -P:TVMLKit.TVMediaItem.Url -P:TVMLKit.TVMediaItem.UserInfo -P:TVMLKit.TVPlaybackCustomEventUserInfo.ExpectsReturnValue -P:TVMLKit.TVPlaybackCustomEventUserInfo.Properties -P:TVMLKit.TVPlaybackCustomEventUserInfo.ReturnValue -P:TVMLKit.TVPlayer.CurrentMediaItem -P:TVMLKit.TVPlayer.NextMediaItem -P:TVMLKit.TVPlayer.Player -P:TVMLKit.TVPlayer.Playlist -P:TVMLKit.TVPlayer.PreviousMediaItem -P:TVMLKit.TVPlayer.State -P:TVMLKit.TVPlaylist.EndAction -P:TVMLKit.TVPlaylist.MediaItems -P:TVMLKit.TVPlaylist.RepeatMode -P:TVMLKit.TVPlaylist.UserInfo -P:TVMLKit.TVTextElement.AttributedText -P:TVMLKit.TVTextElement.TextStyle -P:TVMLKit.TVTimeRange.Duration -P:TVMLKit.TVTimeRange.EndTime -P:TVMLKit.TVTimeRange.StartTime -P:TVMLKit.TVViewElement.Attributes -P:TVMLKit.TVViewElement.AutoHighlightIdentifier -P:TVMLKit.TVViewElement.ChildViewElements P:TVMLKit.TVViewElement.Disabled -P:TVMLKit.TVViewElement.ElementData -P:TVMLKit.TVViewElement.ElementIdentifier -P:TVMLKit.TVViewElement.ElementName -P:TVMLKit.TVViewElement.ParentViewElement -P:TVMLKit.TVViewElement.Style -P:TVMLKit.TVViewElement.UpdateType P:TVMLKit.TVViewElementDispatchResult.IsCancelled P:TVMLKit.TVViewElementDispatchResult.IsDispatched -P:TVMLKit.TVViewElementStyle.Alignment -P:TVMLKit.TVViewElementStyle.BackgroundColor -P:TVMLKit.TVViewElementStyle.Color -P:TVMLKit.TVViewElementStyle.ContentAlignment -P:TVMLKit.TVViewElementStyle.FocusMargin -P:TVMLKit.TVViewElementStyle.FontSize -P:TVMLKit.TVViewElementStyle.FontWeight -P:TVMLKit.TVViewElementStyle.Height -P:TVMLKit.TVViewElementStyle.HighlightColor -P:TVMLKit.TVViewElementStyle.ImageTreatmentName -P:TVMLKit.TVViewElementStyle.InteritemSpacing -P:TVMLKit.TVViewElementStyle.Margin -P:TVMLKit.TVViewElementStyle.MaxHeight -P:TVMLKit.TVViewElementStyle.MaxTextLines -P:TVMLKit.TVViewElementStyle.MaxWidth -P:TVMLKit.TVViewElementStyle.MinHeight -P:TVMLKit.TVViewElementStyle.MinWidth -P:TVMLKit.TVViewElementStyle.Padding -P:TVMLKit.TVViewElementStyle.Position -P:TVMLKit.TVViewElementStyle.RatingStyle -P:TVMLKit.TVViewElementStyle.TextAlignment -P:TVMLKit.TVViewElementStyle.TextHighlightStyle -P:TVMLKit.TVViewElementStyle.TextMinimumScaleFactor -P:TVMLKit.TVViewElementStyle.TextStyle -P:TVMLKit.TVViewElementStyle.TintColor -P:TVMLKit.TVViewElementStyle.Width P:TVServices.ITVTopShelfProvider.TopShelfItems P:TVServices.ITVTopShelfProvider.TopShelfStyle P:TVServices.TVAppProfileDescriptor.Name @@ -77003,81 +67419,8 @@ P:TVServices.TVUserManager.CurrentUserIdentifier P:TVServices.TVUserManager.CurrentUserIdentifierDidChangeNotification P:TVServices.TVUserManager.ShouldStorePreferencesForCurrentUser P:TVServices.TVUserManager.UserIdentifiersForCurrentProfile -P:TVUIKit.TVCaptionButtonView.ContentImage -P:TVUIKit.TVCaptionButtonView.ContentText -P:TVUIKit.TVCaptionButtonView.MotionDirection -P:TVUIKit.TVCaptionButtonView.Subtitle -P:TVUIKit.TVCaptionButtonView.Title -P:TVUIKit.TVCardView.CardBackgroundColor -P:TVUIKit.TVCollectionViewFullScreenCell.ContentBleed -P:TVUIKit.TVCollectionViewFullScreenCell.CornerRadius -P:TVUIKit.TVCollectionViewFullScreenCell.MaskAmount -P:TVUIKit.TVCollectionViewFullScreenCell.MaskedBackgroundView -P:TVUIKit.TVCollectionViewFullScreenCell.MaskedContentView -P:TVUIKit.TVCollectionViewFullScreenCell.NormalizedPosition -P:TVUIKit.TVCollectionViewFullScreenCell.ParallaxOffset -P:TVUIKit.TVCollectionViewFullScreenLayout.CenterIndexPath -P:TVUIKit.TVCollectionViewFullScreenLayout.CornerRadius -P:TVUIKit.TVCollectionViewFullScreenLayout.InteritemSpacing -P:TVUIKit.TVCollectionViewFullScreenLayout.MaskAmount -P:TVUIKit.TVCollectionViewFullScreenLayout.MaskInset -P:TVUIKit.TVCollectionViewFullScreenLayout.ParallaxFactor P:TVUIKit.TVCollectionViewFullScreenLayout.TransitioningToCenterIndexPath -P:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.ContentBleed -P:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.CornerRadius -P:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.MaskAmount -P:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.NormalizedPosition -P:TVUIKit.TVCollectionViewFullScreenLayoutAttributes.ParallaxOffset -P:TVUIKit.TVDigitEntryViewController.EntryCompletionHandler -P:TVUIKit.TVDigitEntryViewController.NumberOfDigits -P:TVUIKit.TVDigitEntryViewController.PromptText P:TVUIKit.TVDigitEntryViewController.SecureDigitEntry -P:TVUIKit.TVDigitEntryViewController.TitleText -P:TVUIKit.TVLockupHeaderFooterView.ShowsOnlyWhenAncestorFocused -P:TVUIKit.TVLockupHeaderFooterView.SubtitleLabel -P:TVUIKit.TVLockupHeaderFooterView.TitleLabel -P:TVUIKit.TVLockupView.ContentSize -P:TVUIKit.TVLockupView.ContentView -P:TVUIKit.TVLockupView.ContentViewInsets -P:TVUIKit.TVLockupView.FocusSizeIncrease -P:TVUIKit.TVLockupView.FooterView -P:TVUIKit.TVLockupView.HeaderView -P:TVUIKit.TVMediaItemContentBadgeProperties.BackgroundColor -P:TVUIKit.TVMediaItemContentBadgeProperties.Color -P:TVUIKit.TVMediaItemContentBadgeProperties.Font -P:TVUIKit.TVMediaItemContentBadgeProperties.Transform -P:TVUIKit.TVMediaItemContentConfiguration.BadgeProperties -P:TVUIKit.TVMediaItemContentConfiguration.BadgeText -P:TVUIKit.TVMediaItemContentConfiguration.Image -P:TVUIKit.TVMediaItemContentConfiguration.OverlayView -P:TVUIKit.TVMediaItemContentConfiguration.PlaybackProgress -P:TVUIKit.TVMediaItemContentConfiguration.SecondaryText -P:TVUIKit.TVMediaItemContentConfiguration.SecondaryTextProperties -P:TVUIKit.TVMediaItemContentConfiguration.Text -P:TVUIKit.TVMediaItemContentConfiguration.TextProperties -P:TVUIKit.TVMediaItemContentTextProperties.Color -P:TVUIKit.TVMediaItemContentTextProperties.Font -P:TVUIKit.TVMediaItemContentTextProperties.Transform -P:TVUIKit.TVMediaItemContentView.Configuration -P:TVUIKit.TVMediaItemContentView.FocusedFrameGuide -P:TVUIKit.TVMonogramContentConfiguration.Image -P:TVUIKit.TVMonogramContentConfiguration.PersonNameComponents -P:TVUIKit.TVMonogramContentConfiguration.SecondaryText -P:TVUIKit.TVMonogramContentConfiguration.SecondaryTextProperties -P:TVUIKit.TVMonogramContentConfiguration.Text -P:TVUIKit.TVMonogramContentConfiguration.TextProperties -P:TVUIKit.TVMonogramContentTextProperties.Color -P:TVUIKit.TVMonogramContentTextProperties.Font -P:TVUIKit.TVMonogramContentView.Configuration -P:TVUIKit.TVMonogramContentView.FocusedFrameGuide -P:TVUIKit.TVMonogramView.Image -P:TVUIKit.TVMonogramView.PersonNameComponents -P:TVUIKit.TVMonogramView.Subtitle -P:TVUIKit.TVMonogramView.Title -P:TVUIKit.TVPosterView.Image -P:TVUIKit.TVPosterView.ImageView -P:TVUIKit.TVPosterView.Subtitle -P:TVUIKit.TVPosterView.Title P:Twitter.TWRequest.Account P:Twitter.TWRequest.Parameters P:Twitter.TWRequest.RequestMethod @@ -77328,22 +67671,16 @@ P:UIKit.NSLayoutConstraint.Active P:UIKit.NSLayoutManager.Delegate P:UIKit.NSPreviewInteractionPreviewUpdateEventArgs.Ended P:UIKit.NSPreviewInteractionPreviewUpdateEventArgs.TransitionProgress -P:UIKit.NSTextAttachment.AdjustsImageSizeForAccessibilityContentSizeCategory P:UIKit.NSTextContainer.IsSimpleRectangularTextContainer -P:UIKit.NSTextContainer.LayoutOrientation P:UIKit.NSTextContentManager.Delegate -P:UIKit.NSTextContentManager.DocumentRange P:UIKit.NSTextContentManager.StorageUnsupportedAttributeAddedNotification P:UIKit.NSTextContentStorage.Delegate -P:UIKit.NSTextContentStorage.TextStorage P:UIKit.NSTextLayoutManager.Delegate -P:UIKit.NSTextLayoutManager.DocumentRange P:UIKit.NSTextList.CustomMarkerFormat P:UIKit.NSTextList.Ordered P:UIKit.NSTextRange.Empty P:UIKit.NSTextSelection.Logical P:UIKit.NSTextSelection.Transient -P:UIKit.NSTextSelectionDataSource.DocumentRange P:UIKit.NSTextSelectionNavigation.TextSelectionDataSource P:UIKit.NSTextStorage.Delegate P:UIKit.NSTextStorageEventArgs.Delta @@ -77376,17 +67713,11 @@ P:UIKit.UIAccessibility.PrefersCrossFadeTransitions P:UIKit.UIAccessibility.ShouldDifferentiateWithoutColor P:UIKit.UIAccessibilityAnnouncementFinishedEventArgs.Announcement P:UIKit.UIAccessibilityAnnouncementFinishedEventArgs.WasSuccessful -P:UIKit.UIAccessibilityContainerDataTable.AccessibilityColumnCount -P:UIKit.UIAccessibilityContainerDataTable.AccessibilityRowCount P:UIKit.UIAccessibilityCustomAction.CategoryEdit -P:UIKit.UIAccessibilityElement.AccessibilityIdentifier -P:UIKit.UIAction.PresentationSourceItem -P:UIKit.UIAction.SelectedImage P:UIKit.UIActionSheet.Delegate P:UIKit.UIActionSheet.Visible P:UIKit.UIActivityIndicatorView.IsAnimating P:UIKit.UIActivityIndicatorView.UIActivityIndicatorViewAppearance.Color -P:UIKit.UIActivityItemsConfiguration.ItemProvidersForActivityItemsConfiguration P:UIKit.UIActivityItemsConfigurationMetadataKey.CollaborationModeRestrictions P:UIKit.UIActivityItemsConfigurationMetadataKey.LinkPresentationMetadata P:UIKit.UIActivityItemsConfigurationMetadataKey.MessageBody @@ -77412,7 +67743,6 @@ P:UIKit.UIActivityType.PostToWeibo P:UIKit.UIActivityType.Print P:UIKit.UIActivityType.SaveToCameraRoll P:UIKit.UIActivityType.UIActivityTypeSharePlay -P:UIKit.UIAlertAction.AccessibilityIdentifier P:UIKit.UIAlertAction.Enabled P:UIKit.UIAlertController.SpringLoaded P:UIKit.UIAlertView.Delegate @@ -77469,7 +67799,6 @@ P:UIKit.UIApplication.WillChangeStatusBarOrientationNotification P:UIKit.UIApplication.WillEnterForegroundNotification P:UIKit.UIApplication.WillResignActiveNotification P:UIKit.UIApplication.WillTerminateNotification -P:UIKit.UIApplicationDelegate.Window P:UIKit.UIApplicationLaunchEventArgs.LocationLaunch P:UIKit.UIApplicationLaunchEventArgs.RemoteNotifications P:UIKit.UIApplicationLaunchEventArgs.SourceApplication @@ -77479,41 +67808,14 @@ P:UIKit.UIApplicationOpenUrlOptions.OpenInPlace P:UIKit.UIApplicationOpenUrlOptions.SourceApplication P:UIKit.UIApplicationOpenUrlOptions.UniversalLinksOnly P:UIKit.UIBandSelectionInteraction.Enabled -P:UIKit.UIBandSelectionInteraction.View P:UIKit.UIBarButtonItem.Enabled P:UIKit.UIBarButtonItem.Hidden -P:UIKit.UIBarButtonItem.Image -P:UIKit.UIBarButtonItem.ImageInsets P:UIKit.UIBarButtonItem.Selected P:UIKit.UIBarButtonItem.SpringLoaded P:UIKit.UIBarButtonItem.SymbolAnimationEnabled -P:UIKit.UIBarButtonItem.Tag -P:UIKit.UIBarButtonItem.Title P:UIKit.UIBarButtonItem.UIBarButtonItemAppearance.TintColor P:UIKit.UIBarButtonItemGroup.DisplayingRepresentativeItem P:UIKit.UIBarButtonItemGroup.Hidden -P:UIKit.UIBarItem.AccessibilityActivationPoint -P:UIKit.UIBarItem.AccessibilityAttributedHint -P:UIKit.UIBarItem.AccessibilityAttributedLabel -P:UIKit.UIBarItem.AccessibilityAttributedUserInputLabels -P:UIKit.UIBarItem.AccessibilityAttributedValue -P:UIKit.UIBarItem.AccessibilityDirectTouchOptions -P:UIKit.UIBarItem.AccessibilityElementsHidden -P:UIKit.UIBarItem.AccessibilityExpandedStatus -P:UIKit.UIBarItem.AccessibilityFrame -P:UIKit.UIBarItem.AccessibilityHeaderElements -P:UIKit.UIBarItem.AccessibilityHint -P:UIKit.UIBarItem.AccessibilityIdentifier -P:UIKit.UIBarItem.AccessibilityLabel -P:UIKit.UIBarItem.AccessibilityLanguage -P:UIKit.UIBarItem.AccessibilityNavigationStyle -P:UIKit.UIBarItem.AccessibilityPath -P:UIKit.UIBarItem.AccessibilityRespondsToUserInteraction -P:UIKit.UIBarItem.AccessibilityTextualContext -P:UIKit.UIBarItem.AccessibilityTraits -P:UIKit.UIBarItem.AccessibilityUserInputLabels -P:UIKit.UIBarItem.AccessibilityValue -P:UIKit.UIBarItem.AccessibilityViewIsModal P:UIKit.UIBarItem.AnnouncementDidFinishNotification P:UIKit.UIBarItem.AnnouncementNotification P:UIKit.UIBarItem.AssistiveTechnologyKey @@ -77529,7 +67831,6 @@ P:UIKit.UIBarItem.GrayscaleStatusDidChangeNotification P:UIKit.UIBarItem.GuidedAccessStatusDidChangeNotification P:UIKit.UIBarItem.HearingDevicePairedEarDidChangeNotification P:UIKit.UIBarItem.InvertColorsStatusDidChangeNotification -P:UIKit.UIBarItem.IsAccessibilityElement P:UIKit.UIBarItem.LayoutChangedNotification P:UIKit.UIBarItem.MonoAudioStatusDidChangeNotification P:UIKit.UIBarItem.NotificationSwitchControlIdentifier @@ -77544,7 +67845,6 @@ P:UIKit.UIBarItem.ResumeAssistiveTechnologyNotification P:UIKit.UIBarItem.ScreenChangedNotification P:UIKit.UIBarItem.ShakeToUndoDidChangeNotification P:UIKit.UIBarItem.ShouldDifferentiateWithoutColorDidChangeNotification -P:UIKit.UIBarItem.ShouldGroupAccessibilityChildren P:UIKit.UIBarItem.SpeakScreenStatusDidChangeNotification P:UIKit.UIBarItem.SpeakSelectionStatusDidChangeNotification P:UIKit.UIBarItem.SpeechAttributeAnnouncementPriority @@ -77562,9 +67862,7 @@ P:UIKit.UIBarItem.UnfocusedElementKey P:UIKit.UIBarItem.VideoAutoplayStatusDidChangeNotification P:UIKit.UIBarItem.VoiceOverStatusChanged P:UIKit.UIBarItem.VoiceOverStatusDidChangeNotification -P:UIKit.UIBarPositioning.BarPosition P:UIKit.UIBezierPath.Empty -P:UIKit.UIButton.AdjustsImageSizeForAccessibilityContentSizeCategory P:UIKit.UIButton.Held P:UIKit.UIButton.Hovered P:UIKit.UIButton.PointerInteractionEnabled @@ -77585,10 +67883,6 @@ P:UIKit.UICellConfigurationState.Editing P:UIKit.UICellConfigurationState.Expanded P:UIKit.UICellConfigurationState.Reordering P:UIKit.UICellConfigurationState.Swiped -P:UIKit.UICGFloatTraitDefinition.AffectsColorAppearance -P:UIKit.UICGFloatTraitDefinition.DefaultValue -P:UIKit.UICGFloatTraitDefinition.Identifier -P:UIKit.UICGFloatTraitDefinition.Name P:UIKit.UICollectionElementKindSectionKey.Footer P:UIKit.UICollectionElementKindSectionKey.Header P:UIKit.UICollectionLayoutSectionOrthogonalScrollingDecelerationRate.Automatic @@ -77605,8 +67899,6 @@ P:UIKit.UICollectionViewCell.Selected P:UIKit.UICollectionViewCellRegistration.CellType P:UIKit.UICollectionViewFlowLayout.AutomaticSize P:UIKit.UICollectionViewLayout.AutomaticDimension -P:UIKit.UICollectionViewLayoutAttributes.CollisionBoundingPath -P:UIKit.UICollectionViewLayoutAttributes.CollisionBoundsType P:UIKit.UICollectionViewLayoutAttributes.Hidden P:UIKit.UICollectionViewSupplementaryRegistration.SupplementaryType P:UIKit.UICollectionViewTransitionResult.Completed @@ -77626,20 +67918,15 @@ P:UIKit.UIColor.ReadableTypeIdentifiers P:UIKit.UIColor.WritableTypeIdentifiers P:UIKit.UIColor.WritableTypeIdentifiersForItemProvider P:UIKit.UIColorPickerViewController.Delegate -P:UIKit.UICommand.PresentationSourceItem -P:UIKit.UICommand.SelectedImage -P:UIKit.UICommand.Sender P:UIKit.UICommand.UICommandTagShare P:UIKit.UIConfigurationColorTransformer.Grayscale P:UIKit.UIConfigurationColorTransformer.MonochromeTint P:UIKit.UIConfigurationColorTransformer.PreferredTint -P:UIKit.UIContentContainer.PreferredContentSize P:UIKit.UIContentSizeCategoryChangedEventArgs.NewValue P:UIKit.UIContentSizeCategoryChangedEventArgs.WeakNewValue P:UIKit.UIContentUnavailableButtonProperties.Enabled P:UIKit.UIContentUnavailableView.ScrollEnabled P:UIKit.UIContextMenuInteraction.Delegate -P:UIKit.UIContextMenuInteraction.View P:UIKit.UIControl.ContextMenuInteractionEnabled P:UIKit.UIControl.Enabled P:UIKit.UIControl.Highlighted @@ -77647,10 +67934,6 @@ P:UIKit.UIControl.Selected P:UIKit.UIControl.SymbolAnimationEnabled P:UIKit.UIControl.TouchInside P:UIKit.UIControl.Tracking -P:UIKit.UICoordinateSpace.Bounds -P:UIKit.UICubicTimingParameters.CubicTimingParameters -P:UIKit.UICubicTimingParameters.SpringTimingParameters -P:UIKit.UICubicTimingParameters.TimingCurveType P:UIKit.UIDevice.BatteryLevelDidChangeNotification P:UIKit.UIDevice.BatteryMonitoringEnabled P:UIKit.UIDevice.BatteryStateDidChangeNotification @@ -77678,29 +67961,14 @@ P:UIKit.UIDocumentPickerViewController.Delegate P:UIKit.UIDocumentSendingToApplicationEventArgs.Application P:UIKit.UIDragInteraction.Enabled P:UIKit.UIDragInteraction.EnabledByDefault -P:UIKit.UIDragInteraction.View -P:UIKit.UIDropInteraction.View P:UIKit.UIDropProposal.Precise P:UIKit.UIDynamicAnimator.Delegate P:UIKit.UIDynamicAnimator.Running -P:UIKit.UIDynamicItem.Bounds -P:UIKit.UIDynamicItem.Center -P:UIKit.UIDynamicItem.CollisionBoundingPath -P:UIKit.UIDynamicItem.CollisionBoundsType -P:UIKit.UIDynamicItem.Transform P:UIKit.UIDynamicItemBehavior.Anchored -P:UIKit.UIDynamicItemGroup.Bounds -P:UIKit.UIDynamicItemGroup.Center -P:UIKit.UIDynamicItemGroup.CollisionBoundingPath -P:UIKit.UIDynamicItemGroup.CollisionBoundsType -P:UIKit.UIDynamicItemGroup.Transform P:UIKit.UIEditMenuInteraction.Delegate -P:UIKit.UIEditMenuInteraction.View P:UIKit.UIExtensionPointIdentifier.Keyboard -P:UIKit.UIFeedbackGenerator.View P:UIKit.UIFindInteraction.Delegate P:UIKit.UIFindInteraction.FindNavigatorVisible -P:UIKit.UIFindInteraction.View P:UIKit.UIFloatRange.IsInfinite P:UIKit.UIFocusGuide.Enabled P:UIKit.UIFocusUpdateContext.AnimationCoordinatorKey @@ -77779,31 +68047,7 @@ P:UIKit.UIGestureRecognizer.ShouldReceiveTouch P:UIKit.UIGestureRecognizer.ShouldRecognizeSimultaneously P:UIKit.UIGestureRecognizer.ShouldRequireFailureOf P:UIKit.UIGraphics.PDFContextBounds -P:UIKit.UIGraphicsImageRendererFormat.DefaultFormat -P:UIKit.UIGraphicsPdfRendererFormat.DefaultFormat P:UIKit.UIHoverStyle.Enabled -P:UIKit.UIImage.AccessibilityActivationPoint -P:UIKit.UIImage.AccessibilityAttributedHint -P:UIKit.UIImage.AccessibilityAttributedLabel -P:UIKit.UIImage.AccessibilityAttributedUserInputLabels -P:UIKit.UIImage.AccessibilityAttributedValue -P:UIKit.UIImage.AccessibilityDirectTouchOptions -P:UIKit.UIImage.AccessibilityElementsHidden -P:UIKit.UIImage.AccessibilityExpandedStatus -P:UIKit.UIImage.AccessibilityFrame -P:UIKit.UIImage.AccessibilityHeaderElements -P:UIKit.UIImage.AccessibilityHint -P:UIKit.UIImage.AccessibilityIdentifier -P:UIKit.UIImage.AccessibilityLabel -P:UIKit.UIImage.AccessibilityLanguage -P:UIKit.UIImage.AccessibilityNavigationStyle -P:UIKit.UIImage.AccessibilityPath -P:UIKit.UIImage.AccessibilityRespondsToUserInteraction -P:UIKit.UIImage.AccessibilityTextualContext -P:UIKit.UIImage.AccessibilityTraits -P:UIKit.UIImage.AccessibilityUserInputLabels -P:UIKit.UIImage.AccessibilityValue -P:UIKit.UIImage.AccessibilityViewIsModal P:UIKit.UIImage.AnnouncementDidFinishNotification P:UIKit.UIImage.AnnouncementNotification P:UIKit.UIImage.AssistiveTechnologyKey @@ -77819,7 +68063,6 @@ P:UIKit.UIImage.GuidedAccessStatusDidChangeNotification P:UIKit.UIImage.HearingDevicePairedEarDidChangeNotification P:UIKit.UIImage.HeicRepresentation P:UIKit.UIImage.InvertColorsStatusDidChangeNotification -P:UIKit.UIImage.IsAccessibilityElement P:UIKit.UIImage.LayoutChangedNotification P:UIKit.UIImage.MonoAudioStatusDidChangeNotification P:UIKit.UIImage.NotificationSwitchControlIdentifier @@ -77827,7 +68070,6 @@ P:UIKit.UIImage.NotificationVoiceOverIdentifier P:UIKit.UIImage.OnOffSwitchLabelsDidChangeNotification P:UIKit.UIImage.PageScrolledNotification P:UIKit.UIImage.PauseAssistiveTechnologyNotification -P:UIKit.UIImage.PreferredPresentationSizeForItemProvider P:UIKit.UIImage.PrefersCrossFadeTransitionsStatusDidChangeNotification P:UIKit.UIImage.ReadableTypeIdentifiers P:UIKit.UIImage.ReduceMotionStatusDidChangeNotification @@ -77836,7 +68078,6 @@ P:UIKit.UIImage.ResumeAssistiveTechnologyNotification P:UIKit.UIImage.ScreenChangedNotification P:UIKit.UIImage.ShakeToUndoDidChangeNotification P:UIKit.UIImage.ShouldDifferentiateWithoutColorDidChangeNotification -P:UIKit.UIImage.ShouldGroupAccessibilityChildren P:UIKit.UIImage.SpeakScreenStatusDidChangeNotification P:UIKit.UIImage.SpeakSelectionStatusDidChangeNotification P:UIKit.UIImage.SpeechAttributeAnnouncementPriority @@ -77880,12 +68121,10 @@ P:UIKit.UIImagePickerMediaPickedEventArgs.MediaUrl P:UIKit.UIImagePickerMediaPickedEventArgs.OriginalImage P:UIKit.UIImagePickerMediaPickedEventArgs.PHAsset P:UIKit.UIImagePickerMediaPickedEventArgs.ReferenceUrl -P:UIKit.UIImageView.AdjustsImageSizeForAccessibilityContentSizeCategory P:UIKit.UIImageView.Highlighted P:UIKit.UIImageView.IsAnimating P:UIKit.UIIndirectScribbleInteraction.Delegate P:UIKit.UIIndirectScribbleInteraction.HandlingWriting -P:UIKit.UIIndirectScribbleInteraction.View P:UIKit.UIKeyboard.AnimationCurveUserInfoKey P:UIKit.UIKeyboard.AnimationDurationUserInfoKey P:UIKit.UIKeyboard.DidChangeFrameNotification @@ -77923,10 +68162,8 @@ P:UIKit.UIKeyCommand.PageDown P:UIKit.UIKeyCommand.PageUp P:UIKit.UIKeyCommand.RightArrow P:UIKit.UIKeyCommand.UpArrow -P:UIKit.UILabel.AdjustsFontForContentSizeCategory P:UIKit.UILabel.Enabled P:UIKit.UILabel.Highlighted -P:UIKit.UILabel.SizingRule P:UIKit.UILabel.UILabelAppearance.Font P:UIKit.UILabel.UILabelAppearance.HighlightedTextColor P:UIKit.UILabel.UILabelAppearance.PreferredVibrancy @@ -77936,11 +68173,6 @@ P:UIKit.UILabel.UILabelAppearance.TextColor P:UIKit.UILargeContentViewerInteraction.Delegate P:UIKit.UILargeContentViewerInteraction.Enabled P:UIKit.UILargeContentViewerInteraction.InteractionEnabledStatusDidChangeNotification -P:UIKit.UILargeContentViewerInteraction.View -P:UIKit.UILayoutSupport.BottomAnchor -P:UIKit.UILayoutSupport.HeightAnchor -P:UIKit.UILayoutSupport.Length -P:UIKit.UILayoutSupport.TopAnchor P:UIKit.UIListContentImageProperties.StandardDimension P:UIKit.UIListContentView.ListContentConfiguration P:UIKit.UIListSeparatorConfiguration.AutomaticInsets @@ -77951,28 +68183,8 @@ P:UIKit.UIMenuController.DidShowMenuNotification P:UIKit.UIMenuController.MenuFrameDidChangeNotification P:UIKit.UIMenuController.WillHideMenuNotification P:UIKit.UIMenuController.WillShowMenuNotification -P:UIKit.UIMenuElement.AccessibilityIdentifier -P:UIKit.UIMutableTraits.AccessibilityContrast -P:UIKit.UIMutableTraits.ActiveAppearance -P:UIKit.UIMutableTraits.DisplayGamut -P:UIKit.UIMutableTraits.DisplayScale -P:UIKit.UIMutableTraits.ForceTouchCapability -P:UIKit.UIMutableTraits.HorizontalSizeClass -P:UIKit.UIMutableTraits.ImageDynamicRange -P:UIKit.UIMutableTraits.LayoutDirection -P:UIKit.UIMutableTraits.LegibilityWeight -P:UIKit.UIMutableTraits.ListEnvironment -P:UIKit.UIMutableTraits.PreferredContentSizeCategory -P:UIKit.UIMutableTraits.SceneCaptureState -P:UIKit.UIMutableTraits.ToolbarItemPresentationSize -P:UIKit.UIMutableTraits.TypesettingLanguage -P:UIKit.UIMutableTraits.UserInterfaceIdiom -P:UIKit.UIMutableTraits.UserInterfaceLevel -P:UIKit.UIMutableTraits.UserInterfaceStyle -P:UIKit.UIMutableTraits.VerticalSizeClass P:UIKit.UIMutableUserNotificationAction.AuthenticationRequired P:UIKit.UIMutableUserNotificationAction.Destructive -P:UIKit.UINavigationBar.BarPosition P:UIKit.UINavigationBar.Delegate P:UIKit.UINavigationBar.LargeTitleTextAttributes P:UIKit.UINavigationBar.TitleTextAttributes @@ -77998,14 +68210,6 @@ P:UIKit.UINavigationController.NavigationBarHidden P:UIKit.UINavigationController.ToolbarHidden P:UIKit.UINavigationItem.RenameDelegate P:UIKit.UINib.ExternalObjectsKey -P:UIKit.UINSIntegerTraitDefinition.AffectsColorAppearance -P:UIKit.UINSIntegerTraitDefinition.DefaultValue -P:UIKit.UINSIntegerTraitDefinition.Identifier -P:UIKit.UINSIntegerTraitDefinition.Name -P:UIKit.UIObjectTraitDefinition.AffectsColorAppearance -P:UIKit.UIObjectTraitDefinition.DefaultValue -P:UIKit.UIObjectTraitDefinition.Identifier -P:UIKit.UIObjectTraitDefinition.Name P:UIKit.UIPageControl.UIPageControlAppearance.CurrentPageIndicatorTintColor P:UIKit.UIPageControl.UIPageControlAppearance.PageIndicatorTintColor P:UIKit.UIPageControlProgress.Delegate @@ -78047,7 +68251,6 @@ P:UIKit.UIPasteboardOptions.LocalOnly P:UIKit.UIPathEventArgs.Path P:UIKit.UIPencilInteraction.Delegate P:UIKit.UIPencilInteraction.Enabled -P:UIKit.UIPencilInteraction.View P:UIKit.UIPickerView.DataSource P:UIKit.UIPickerView.Delegate P:UIKit.UIPickerView.Model @@ -78060,7 +68263,6 @@ P:UIKit.UIPointerAccessoryPosition.Top P:UIKit.UIPointerAccessoryPosition.TopLeft P:UIKit.UIPointerAccessoryPosition.TopRight P:UIKit.UIPointerInteraction.Enabled -P:UIKit.UIPointerInteraction.View P:UIKit.UIPointerLockState.DidChangeNotification P:UIKit.UIPointerLockState.Locked P:UIKit.UIPointerLockStateDidChangeEventArgs.Scene @@ -78076,15 +68278,6 @@ P:UIKit.UIPopoverPresentationController.ShouldDismissPopover P:UIKit.UIPopoverPresentationControllerRepositionEventArgs.InView P:UIKit.UIPopoverPresentationControllerRepositionEventArgs.TargetRect P:UIKit.UIPresentationController.Delegate -P:UIKit.UIPresentationController.FocusGroupIdentifier -P:UIKit.UIPresentationController.FocusItemContainer -P:UIKit.UIPresentationController.ParentFocusEnvironment -P:UIKit.UIPresentationController.PreferredContentSize -P:UIKit.UIPresentationController.PreferredFocusedView -P:UIKit.UIPresentationController.PreferredFocusEnvironments -P:UIKit.UIPresentationController.TraitCollection -P:UIKit.UIPreviewAction.Title -P:UIKit.UIPreviewActionGroup.Title P:UIKit.UIPreviewInteraction.ShouldBegin P:UIKit.UIPrinterPickerCompletionResult.PrinterPickerController P:UIKit.UIPrinterPickerCompletionResult.UserDidSelect @@ -78105,11 +68298,6 @@ P:UIKit.UIProgressView.UIProgressViewAppearance.TrackImage P:UIKit.UIProgressView.UIProgressViewAppearance.TrackTintColor P:UIKit.UIRefreshControl.Refreshing P:UIKit.UIRefreshControl.UIRefreshControlAppearance.AttributedTitle -P:UIKit.UIResponder.AccessibilityAssistiveTechnologyFocusedIdentifiers -P:UIKit.UIResponder.AccessibilityCustomActions -P:UIKit.UIResponder.AccessibilityDragSourceDescriptors -P:UIKit.UIResponder.AccessibilityDropPointDescriptors -P:UIKit.UIResponder.PasteConfiguration P:UIKit.UIScene.Delegate P:UIKit.UIScene.DidActivateNotification P:UIKit.UIScene.DidDisconnectNotification @@ -78130,13 +68318,10 @@ P:UIKit.UIScreen.DidConnectNotification P:UIKit.UIScreen.DidDisconnectNotification P:UIKit.UIScreen.ModeDidChangeNotification P:UIKit.UIScreen.ReferenceDisplayModeStatusDidChangeNotification -P:UIKit.UIScreen.TraitCollection P:UIKit.UIScreenshotService.Delegate P:UIKit.UIScribbleInteraction.Delegate P:UIKit.UIScribbleInteraction.HandlingWriting P:UIKit.UIScribbleInteraction.PencilInputExpected -P:UIKit.UIScribbleInteraction.View -P:UIKit.UIScrollView.CoordinateSpace P:UIKit.UIScrollView.Decelerating P:UIKit.UIScrollView.DecelerationRateFast P:UIKit.UIScrollView.DecelerationRateNormal @@ -78149,42 +68334,24 @@ P:UIKit.UIScrollView.ScrollEnabled P:UIKit.UIScrollView.ShouldScrollToTop P:UIKit.UIScrollView.Tracking P:UIKit.UIScrollView.ViewForZoomingInScrollView -P:UIKit.UIScrollView.VisibleSize P:UIKit.UIScrollView.ZoomAnimating P:UIKit.UIScrollView.ZoomBouncing P:UIKit.UIScrollView.Zooming P:UIKit.UIScrollViewZoomingEventArgs.View -P:UIKit.UISearchBar.AllowedWritingToolsResultOptions -P:UIKit.UISearchBar.AutocapitalizationType -P:UIKit.UISearchBar.AutocorrectionType -P:UIKit.UISearchBar.BarPosition P:UIKit.UISearchBar.Delegate P:UIKit.UISearchBar.Enabled -P:UIKit.UISearchBar.EnablesReturnKeyAutomatically -P:UIKit.UISearchBar.InlinePredictionType -P:UIKit.UISearchBar.KeyboardAppearance -P:UIKit.UISearchBar.KeyboardType P:UIKit.UISearchBar.LookToDictateEnabled -P:UIKit.UISearchBar.MathExpressionCompletionType -P:UIKit.UISearchBar.PasswordRules -P:UIKit.UISearchBar.ReturnKeyType P:UIKit.UISearchBar.SearchResultsButtonSelected P:UIKit.UISearchBar.SecureTextEntry P:UIKit.UISearchBar.ShouldBeginEditing P:UIKit.UISearchBar.ShouldChangeTextInRange P:UIKit.UISearchBar.ShouldEndEditing -P:UIKit.UISearchBar.SmartDashesType -P:UIKit.UISearchBar.SmartInsertDeleteType -P:UIKit.UISearchBar.SmartQuotesType -P:UIKit.UISearchBar.SpellCheckingType -P:UIKit.UISearchBar.TextContentType P:UIKit.UISearchBar.Translucent P:UIKit.UISearchBar.UISearchBarAppearance.BackgroundImage P:UIKit.UISearchBar.UISearchBarAppearance.BarTintColor P:UIKit.UISearchBar.UISearchBarAppearance.ScopeBarBackgroundImage P:UIKit.UISearchBar.UISearchBarAppearance.SearchFieldBackgroundPositionAdjustment P:UIKit.UISearchBar.UISearchBarAppearance.SearchTextPositionAdjustment -P:UIKit.UISearchBar.WritingToolsBehavior P:UIKit.UISearchBarButtonIndexEventArgs.SelectedScope P:UIKit.UISearchBarTextChangedEventArgs.SearchText P:UIKit.UISearchController.Active @@ -78231,16 +68398,10 @@ P:UIKit.UISplitViewPresentEventArgs.AViewController P:UIKit.UISplitViewPresentEventArgs.Pc P:UIKit.UISplitViewShowEventArgs.AViewController P:UIKit.UISplitViewShowEventArgs.Button -P:UIKit.UISpringLoadedInteraction.View -P:UIKit.UISpringTimingParameters.CubicTimingParameters -P:UIKit.UISpringTimingParameters.SpringTimingParameters -P:UIKit.UISpringTimingParameters.TimingCurveType P:UIKit.UIStackView.BaselineRelativeArrangement P:UIKit.UIStackView.LayoutMarginsRelativeArrangement P:UIKit.UIStandardTextCursorView.Blinking P:UIKit.UIStateRestoration.ViewControllerStoryboardKey -P:UIKit.UIStateRestoring.ObjectRestorationClass -P:UIKit.UIStateRestoring.RestorationParent P:UIKit.UIStatusBarFrameChangeEventArgs.StatusBarFrame P:UIKit.UIStatusBarManager.StatusBarHidden P:UIKit.UIStatusBarOrientationChangeEventArgs.StatusBarOrientation @@ -78298,7 +68459,6 @@ P:UIKit.UISwitch.UISwitchAppearance.OnImage P:UIKit.UISwitch.UISwitchAppearance.OnTintColor P:UIKit.UISwitch.UISwitchAppearance.ThumbTintColor P:UIKit.UISymbolEffectCompletionContext.Finished -P:UIKit.UITab.AccessibilityIdentifier P:UIKit.UITab.Hidden P:UIKit.UITab.HiddenByDefault P:UIKit.UITab.SpringLoaded @@ -78339,11 +68499,7 @@ P:UIKit.UITabBarDisplayOrderChangeEventArgs.Group P:UIKit.UITabBarFinalItemsEventArgs.Changed P:UIKit.UITabBarFinalItemsEventArgs.Items P:UIKit.UITabBarItem.Enabled -P:UIKit.UITabBarItem.Image -P:UIKit.UITabBarItem.ImageInsets P:UIKit.UITabBarItem.SpringLoaded -P:UIKit.UITabBarItem.Tag -P:UIKit.UITabBarItem.Title P:UIKit.UITabBarItem.UITabBarItemAppearance.BadgeColor P:UIKit.UITabBarItem.UITabBarItemAppearance.ScrollEdgeAppearance P:UIKit.UITabBarItem.UITabBarItemAppearance.StandardAppearance @@ -78376,10 +68532,6 @@ P:UIKit.UITableViewCell.Highlighted P:UIKit.UITableViewCell.Selected P:UIKit.UITableViewCell.UITableViewCellAppearance.FocusStyle P:UIKit.UITableViewCell.UITableViewCellAppearance.SeparatorInset -P:UIKit.UITargetedDragPreview.Parameters -P:UIKit.UITargetedDragPreview.Size -P:UIKit.UITargetedDragPreview.Target -P:UIKit.UITargetedDragPreview.View P:UIKit.UITextContentType.AddressCity P:UIKit.UITextContentType.AddressCityAndState P:UIKit.UITextContentType.AddressState @@ -78425,86 +68577,28 @@ P:UIKit.UITextContentType.Sublocality P:UIKit.UITextContentType.TelephoneNumber P:UIKit.UITextContentType.Url P:UIKit.UITextContentType.Username -P:UIKit.UITextDocumentProxy.AllowedWritingToolsResultOptions -P:UIKit.UITextDocumentProxy.AutocapitalizationType -P:UIKit.UITextDocumentProxy.AutocorrectionType -P:UIKit.UITextDocumentProxy.DocumentContextAfterInput -P:UIKit.UITextDocumentProxy.DocumentContextBeforeInput -P:UIKit.UITextDocumentProxy.DocumentIdentifier -P:UIKit.UITextDocumentProxy.DocumentInputMode -P:UIKit.UITextDocumentProxy.EnablesReturnKeyAutomatically -P:UIKit.UITextDocumentProxy.HasText -P:UIKit.UITextDocumentProxy.InlinePredictionType -P:UIKit.UITextDocumentProxy.KeyboardAppearance -P:UIKit.UITextDocumentProxy.KeyboardType -P:UIKit.UITextDocumentProxy.MathExpressionCompletionType -P:UIKit.UITextDocumentProxy.PasswordRules -P:UIKit.UITextDocumentProxy.ReturnKeyType P:UIKit.UITextDocumentProxy.SecureTextEntry -P:UIKit.UITextDocumentProxy.SelectedText -P:UIKit.UITextDocumentProxy.SmartDashesType -P:UIKit.UITextDocumentProxy.SmartInsertDeleteType -P:UIKit.UITextDocumentProxy.SmartQuotesType -P:UIKit.UITextDocumentProxy.SpellCheckingType -P:UIKit.UITextDocumentProxy.TextContentType -P:UIKit.UITextDocumentProxy.WritingToolsBehavior -P:UIKit.UITextField.AdjustsFontForContentSizeCategory -P:UIKit.UITextField.AllowedWritingToolsResultOptions -P:UIKit.UITextField.AutocapitalizationType -P:UIKit.UITextField.AutocorrectionType -P:UIKit.UITextField.BeginningOfDocument P:UIKit.UITextField.CurrentInputModeDidChangeNotification P:UIKit.UITextField.Delegate P:UIKit.UITextField.DidEndEditingReasonKey P:UIKit.UITextField.Editable -P:UIKit.UITextField.EnablesReturnKeyAutomatically -P:UIKit.UITextField.EndOfDocument -P:UIKit.UITextField.HasText -P:UIKit.UITextField.InlinePredictionType P:UIKit.UITextField.InputDelegate P:UIKit.UITextField.IsEditing -P:UIKit.UITextField.KeyboardAppearance -P:UIKit.UITextField.KeyboardType -P:UIKit.UITextField.MarkedTextRange -P:UIKit.UITextField.MarkedTextStyle -P:UIKit.UITextField.MathExpressionCompletionType -P:UIKit.UITextField.PasswordRules -P:UIKit.UITextField.PasteConfiguration -P:UIKit.UITextField.PasteDelegate -P:UIKit.UITextField.ReturnKeyType P:UIKit.UITextField.SecureTextEntry -P:UIKit.UITextField.SelectedTextRange -P:UIKit.UITextField.SelectionAffinity P:UIKit.UITextField.ShouldBeginEditing P:UIKit.UITextField.ShouldChangeCharacters P:UIKit.UITextField.ShouldClear P:UIKit.UITextField.ShouldEndEditing P:UIKit.UITextField.ShouldReturn -P:UIKit.UITextField.SizingRule -P:UIKit.UITextField.SmartDashesType -P:UIKit.UITextField.SmartInsertDeleteType -P:UIKit.UITextField.SmartQuotesType -P:UIKit.UITextField.SpellCheckingType -P:UIKit.UITextField.SupportsAdaptiveImageGlyph P:UIKit.UITextField.TextBackgroundColorKey P:UIKit.UITextField.TextColorKey -P:UIKit.UITextField.TextContentType P:UIKit.UITextField.TextDidBeginEditingNotification P:UIKit.UITextField.TextDidEndEditingNotification P:UIKit.UITextField.TextDragActive -P:UIKit.UITextField.TextDragDelegate -P:UIKit.UITextField.TextDragInteraction -P:UIKit.UITextField.TextDragOptions P:UIKit.UITextField.TextDropActive -P:UIKit.UITextField.TextDropDelegate -P:UIKit.UITextField.TextDropInteraction P:UIKit.UITextField.TextFieldTextDidChangeNotification P:UIKit.UITextField.TextFontKey -P:UIKit.UITextField.TextInputView P:UIKit.UITextField.Tokenizer -P:UIKit.UITextField.WeakInputDelegate -P:UIKit.UITextField.WeakTokenizer -P:UIKit.UITextField.WritingToolsBehavior P:UIKit.UITextFieldEditingEndedEventArgs.Reason P:UIKit.UITextFormattingCoordinator.Delegate P:UIKit.UITextFormattingCoordinator.FontPanelVisible @@ -78518,73 +68612,36 @@ P:UIKit.UITextInputContext.HardwareKeyboardInputExpected P:UIKit.UITextInputContext.PencilInputExpected P:UIKit.UITextInputMode.CurrentInputModeDidChangeNotification P:UIKit.UITextInteraction.Delegate -P:UIKit.UITextInteraction.View P:UIKit.UITextRange.IsEmpty P:UIKit.UITextSelectionDisplayInteraction.Activated P:UIKit.UITextSelectionDisplayInteraction.Delegate -P:UIKit.UITextSelectionDisplayInteraction.View -P:UIKit.UITextView.AdjustsFontForContentSizeCategory P:UIKit.UITextView.AllowTextAttachmentInteraction P:UIKit.UITextView.AllowUrlInteraction -P:UIKit.UITextView.AutocapitalizationType -P:UIKit.UITextView.AutocorrectionType -P:UIKit.UITextView.BeginningOfDocument P:UIKit.UITextView.CurrentInputModeDidChangeNotification P:UIKit.UITextView.Delegate P:UIKit.UITextView.Editable -P:UIKit.UITextView.EnablesReturnKeyAutomatically -P:UIKit.UITextView.EndOfDocument P:UIKit.UITextView.FindInteractionEnabled P:UIKit.UITextView.GetWritingToolsIgnoredRangesInEnclosingRange -P:UIKit.UITextView.HasText -P:UIKit.UITextView.InlinePredictionType P:UIKit.UITextView.InputDelegate -P:UIKit.UITextView.KeyboardAppearance -P:UIKit.UITextView.KeyboardType -P:UIKit.UITextView.MarkedTextRange -P:UIKit.UITextView.MarkedTextStyle -P:UIKit.UITextView.MathExpressionCompletionType -P:UIKit.UITextView.PasswordRules -P:UIKit.UITextView.PasteConfiguration -P:UIKit.UITextView.PasteDelegate -P:UIKit.UITextView.ReturnKeyType P:UIKit.UITextView.SecureTextEntry P:UIKit.UITextView.Selectable -P:UIKit.UITextView.SelectedTextRange -P:UIKit.UITextView.SelectionAffinity P:UIKit.UITextView.ShouldBeginEditing P:UIKit.UITextView.ShouldChangeText P:UIKit.UITextView.ShouldEndEditing P:UIKit.UITextView.ShouldInteractWithTextAttachment P:UIKit.UITextView.ShouldInteractWithUrl -P:UIKit.UITextView.SizingRule -P:UIKit.UITextView.SmartDashesType -P:UIKit.UITextView.SmartInsertDeleteType -P:UIKit.UITextView.SmartQuotesType -P:UIKit.UITextView.SpellCheckingType -P:UIKit.UITextView.SupportsAdaptiveImageGlyph P:UIKit.UITextView.TextBackgroundColorKey P:UIKit.UITextView.TextColorKey -P:UIKit.UITextView.TextContentType P:UIKit.UITextView.TextDidBeginEditingNotification P:UIKit.UITextView.TextDidChangeNotification P:UIKit.UITextView.TextDidEndEditingNotification P:UIKit.UITextView.TextDragActive -P:UIKit.UITextView.TextDragDelegate -P:UIKit.UITextView.TextDragInteraction -P:UIKit.UITextView.TextDragOptions P:UIKit.UITextView.TextDropActive -P:UIKit.UITextView.TextDropDelegate -P:UIKit.UITextView.TextDropInteraction P:UIKit.UITextView.TextFontKey -P:UIKit.UITextView.TextInputView P:UIKit.UITextView.Tokenizer P:UIKit.UITextView.TypingAttributes2 -P:UIKit.UITextView.WeakInputDelegate -P:UIKit.UITextView.WeakTokenizer P:UIKit.UITextView.WritingToolsActive P:UIKit.UITextViewTextFormattingViewControllerEventArgs.ViewController -P:UIKit.UIToolbar.BarPosition P:UIKit.UIToolbar.Delegate P:UIKit.UIToolbar.Translucent P:UIKit.UIToolbar.UIToolbarAppearance.BarStyle @@ -78596,82 +68653,8 @@ P:UIKit.UIToolbar.UIToolbarAppearance.StandardAppearance P:UIKit.UIToolbar.UIToolbarAppearance.Translucent P:UIKit.UIToolTipInteraction.Delegate P:UIKit.UIToolTipInteraction.Enabled -P:UIKit.UIToolTipInteraction.View -P:UIKit.UITraitAccessibilityContrast.AffectsColorAppearance -P:UIKit.UITraitAccessibilityContrast.DefaultValue -P:UIKit.UITraitAccessibilityContrast.Identifier -P:UIKit.UITraitAccessibilityContrast.Name -P:UIKit.UITraitActiveAppearance.AffectsColorAppearance -P:UIKit.UITraitActiveAppearance.DefaultValue -P:UIKit.UITraitActiveAppearance.Identifier -P:UIKit.UITraitActiveAppearance.Name P:UIKit.UITraitCollection.SystemTraitsAffectingColorAppearance2 P:UIKit.UITraitCollection.SystemTraitsAffectingImageLookup2 -P:UIKit.UITraitDisplayGamut.AffectsColorAppearance -P:UIKit.UITraitDisplayGamut.DefaultValue -P:UIKit.UITraitDisplayGamut.Identifier -P:UIKit.UITraitDisplayGamut.Name -P:UIKit.UITraitDisplayScale.AffectsColorAppearance -P:UIKit.UITraitDisplayScale.DefaultValue -P:UIKit.UITraitDisplayScale.Identifier -P:UIKit.UITraitDisplayScale.Name -P:UIKit.UITraitEnvironment.TraitCollection -P:UIKit.UITraitForceTouchCapability.AffectsColorAppearance -P:UIKit.UITraitForceTouchCapability.DefaultValue -P:UIKit.UITraitForceTouchCapability.Identifier -P:UIKit.UITraitForceTouchCapability.Name -P:UIKit.UITraitHorizontalSizeClass.AffectsColorAppearance -P:UIKit.UITraitHorizontalSizeClass.DefaultValue -P:UIKit.UITraitHorizontalSizeClass.Identifier -P:UIKit.UITraitHorizontalSizeClass.Name -P:UIKit.UITraitImageDynamicRange.AffectsColorAppearance -P:UIKit.UITraitImageDynamicRange.DefaultValue -P:UIKit.UITraitImageDynamicRange.Identifier -P:UIKit.UITraitImageDynamicRange.Name -P:UIKit.UITraitLayoutDirection.AffectsColorAppearance -P:UIKit.UITraitLayoutDirection.DefaultValue -P:UIKit.UITraitLayoutDirection.Identifier -P:UIKit.UITraitLayoutDirection.Name -P:UIKit.UITraitLegibilityWeight.AffectsColorAppearance -P:UIKit.UITraitLegibilityWeight.DefaultValue -P:UIKit.UITraitLegibilityWeight.Identifier -P:UIKit.UITraitLegibilityWeight.Name -P:UIKit.UITraitListEnvironment.AffectsColorAppearance -P:UIKit.UITraitListEnvironment.DefaultValue -P:UIKit.UITraitListEnvironment.Identifier -P:UIKit.UITraitListEnvironment.Name -P:UIKit.UITraitPreferredContentSizeCategory.AffectsColorAppearance -P:UIKit.UITraitPreferredContentSizeCategory.DefaultValue -P:UIKit.UITraitPreferredContentSizeCategory.Identifier -P:UIKit.UITraitPreferredContentSizeCategory.Name -P:UIKit.UITraitSceneCaptureState.AffectsColorAppearance -P:UIKit.UITraitSceneCaptureState.DefaultValue -P:UIKit.UITraitSceneCaptureState.Identifier -P:UIKit.UITraitSceneCaptureState.Name -P:UIKit.UITraitToolbarItemPresentationSize.AffectsColorAppearance -P:UIKit.UITraitToolbarItemPresentationSize.DefaultValue -P:UIKit.UITraitToolbarItemPresentationSize.Identifier -P:UIKit.UITraitToolbarItemPresentationSize.Name -P:UIKit.UITraitTypesettingLanguage.AffectsColorAppearance -P:UIKit.UITraitTypesettingLanguage.DefaultValue -P:UIKit.UITraitTypesettingLanguage.Identifier -P:UIKit.UITraitTypesettingLanguage.Name -P:UIKit.UITraitUserInterfaceIdiom.AffectsColorAppearance -P:UIKit.UITraitUserInterfaceIdiom.DefaultValue -P:UIKit.UITraitUserInterfaceIdiom.Identifier -P:UIKit.UITraitUserInterfaceIdiom.Name -P:UIKit.UITraitUserInterfaceLevel.AffectsColorAppearance -P:UIKit.UITraitUserInterfaceLevel.DefaultValue -P:UIKit.UITraitUserInterfaceLevel.Identifier -P:UIKit.UITraitUserInterfaceLevel.Name -P:UIKit.UITraitUserInterfaceStyle.AffectsColorAppearance -P:UIKit.UITraitUserInterfaceStyle.DefaultValue -P:UIKit.UITraitUserInterfaceStyle.Identifier -P:UIKit.UITraitUserInterfaceStyle.Name -P:UIKit.UITraitVerticalSizeClass.AffectsColorAppearance -P:UIKit.UITraitVerticalSizeClass.DefaultValue -P:UIKit.UITraitVerticalSizeClass.Identifier -P:UIKit.UITraitVerticalSizeClass.Name P:UIKit.UITransitionContext.FromViewControllerKey P:UIKit.UITransitionContext.FromViewKey P:UIKit.UITransitionContext.ToViewControllerKey @@ -78685,28 +68668,6 @@ P:UIKit.UIUserNotificationAction.Destructive P:UIKit.UIUserNotificationAction.ResponseTypedTextKey P:UIKit.UIUserNotificationAction.TextInputActionButtonTitleKey P:UIKit.UIVideoEditorController.Delegate -P:UIKit.UIView.AccessibilityActivationPoint -P:UIKit.UIView.AccessibilityAttributedHint -P:UIKit.UIView.AccessibilityAttributedLabel -P:UIKit.UIView.AccessibilityAttributedUserInputLabels -P:UIKit.UIView.AccessibilityAttributedValue -P:UIKit.UIView.AccessibilityDirectTouchOptions -P:UIKit.UIView.AccessibilityElementsHidden -P:UIKit.UIView.AccessibilityExpandedStatus -P:UIKit.UIView.AccessibilityFrame -P:UIKit.UIView.AccessibilityHeaderElements -P:UIKit.UIView.AccessibilityHint -P:UIKit.UIView.AccessibilityIdentifier -P:UIKit.UIView.AccessibilityLabel -P:UIKit.UIView.AccessibilityLanguage -P:UIKit.UIView.AccessibilityNavigationStyle -P:UIKit.UIView.AccessibilityPath -P:UIKit.UIView.AccessibilityRespondsToUserInteraction -P:UIKit.UIView.AccessibilityTextualContext -P:UIKit.UIView.AccessibilityTraits -P:UIKit.UIView.AccessibilityUserInputLabels -P:UIKit.UIView.AccessibilityValue -P:UIKit.UIView.AccessibilityViewIsModal P:UIKit.UIView.AnnouncementDidFinishNotification P:UIKit.UIView.AnnouncementNotification P:UIKit.UIView.AssistiveTechnologyKey @@ -78714,23 +68675,16 @@ P:UIKit.UIView.AssistiveTouchStatusDidChangeNotification P:UIKit.UIView.BoldTextStatusDidChangeNotification P:UIKit.UIView.ButtonShapesEnabledStatusDidChangeNotification P:UIKit.UIView.ClosedCaptioningStatusDidChangeNotification -P:UIKit.UIView.CollisionBoundingPath -P:UIKit.UIView.CollisionBoundsType -P:UIKit.UIView.CoordinateSpace P:UIKit.UIView.DarkerSystemColorsStatusDidChangeNotification P:UIKit.UIView.ElementFocusedNotification P:UIKit.UIView.ExclusiveTouch P:UIKit.UIView.Focused P:UIKit.UIView.FocusedElementKey -P:UIKit.UIView.FocusItemContainer -P:UIKit.UIView.FocusItemDeferralMode P:UIKit.UIView.GrayscaleStatusDidChangeNotification P:UIKit.UIView.GuidedAccessStatusDidChangeNotification P:UIKit.UIView.HearingDevicePairedEarDidChangeNotification P:UIKit.UIView.Hidden P:UIKit.UIView.InvertColorsStatusDidChangeNotification -P:UIKit.UIView.IsAccessibilityElement -P:UIKit.UIView.IsTransparentFocusItem P:UIKit.UIView.LayoutChangedNotification P:UIKit.UIView.MonoAudioStatusDidChangeNotification P:UIKit.UIView.MultipleTouchEnabled @@ -78740,10 +68694,7 @@ P:UIKit.UIView.NotificationVoiceOverIdentifier P:UIKit.UIView.OnOffSwitchLabelsDidChangeNotification P:UIKit.UIView.Opaque P:UIKit.UIView.PageScrolledNotification -P:UIKit.UIView.ParentFocusEnvironment P:UIKit.UIView.PauseAssistiveTechnologyNotification -P:UIKit.UIView.PreferredFocusedView -P:UIKit.UIView.PreferredFocusEnvironments P:UIKit.UIView.PrefersCrossFadeTransitionsStatusDidChangeNotification P:UIKit.UIView.ReduceMotionStatusDidChangeNotification P:UIKit.UIView.ReduceTransparencyStatusDidChangeNotification @@ -78751,7 +68702,6 @@ P:UIKit.UIView.ResumeAssistiveTechnologyNotification P:UIKit.UIView.ScreenChangedNotification P:UIKit.UIView.ShakeToUndoDidChangeNotification P:UIKit.UIView.ShouldDifferentiateWithoutColorDidChangeNotification -P:UIKit.UIView.ShouldGroupAccessibilityChildren P:UIKit.UIView.SpeakScreenStatusDidChangeNotification P:UIKit.UIView.SpeakSelectionStatusDidChangeNotification P:UIKit.UIView.SpeechAttributeAnnouncementPriority @@ -78765,7 +68715,6 @@ P:UIKit.UIView.SwitchControlStatusDidChangeNotification P:UIKit.UIView.TextAttributeContext P:UIKit.UIView.TextAttributeCustom P:UIKit.UIView.TextAttributeHeadingLevel -P:UIKit.UIView.TraitCollection P:UIKit.UIView.UILayoutFittingCompressedSize P:UIKit.UIView.UILayoutFittingExpandedSize P:UIKit.UIView.UIViewAppearance.BackgroundColor @@ -78781,7 +68730,6 @@ P:UIKit.UIViewConfigurationState.Highlighted P:UIKit.UIViewConfigurationState.Pinned P:UIKit.UIViewConfigurationState.Selected P:UIKit.UIViewController.Editing -P:UIKit.UIViewController.FocusItemContainer P:UIKit.UIViewController.HierarchyInconsistencyException P:UIKit.UIViewController.IsBeingDismissed P:UIKit.UIViewController.IsBeingPresented @@ -78790,27 +68738,13 @@ P:UIKit.UIViewController.IsMovingToParentViewController P:UIKit.UIViewController.IsViewLoaded P:UIKit.UIViewController.ModalInPopover P:UIKit.UIViewController.ModalInPresentation -P:UIKit.UIViewController.ParentFocusEnvironment -P:UIKit.UIViewController.PreferredFocusedView -P:UIKit.UIViewController.PreferredFocusEnvironments P:UIKit.UIViewController.ShowDetailTargetDidChangeNotification -P:UIKit.UIViewController.TraitCollection P:UIKit.UIViewController.TransitioningDelegate -P:UIKit.UIViewControllerContextTransitioning.ContainerView P:UIKit.UIViewControllerContextTransitioning.IsAnimated P:UIKit.UIViewControllerContextTransitioning.IsInteractive -P:UIKit.UIViewControllerContextTransitioning.PresentationStyle -P:UIKit.UIViewControllerContextTransitioning.TargetTransform -P:UIKit.UIViewControllerContextTransitioning.TransitionWasCancelled -P:UIKit.UIViewControllerInteractiveTransitioning.CompletionCurve -P:UIKit.UIViewControllerInteractiveTransitioning.CompletionSpeed -P:UIKit.UIViewControllerInteractiveTransitioning.WantsInteractiveStart -P:UIKit.UIViewPropertyAnimator.FractionComplete -P:UIKit.UIViewPropertyAnimator.Interruptible P:UIKit.UIViewPropertyAnimator.ManualHitTestingEnabled P:UIKit.UIViewPropertyAnimator.Reversed P:UIKit.UIViewPropertyAnimator.Running -P:UIKit.UIViewPropertyAnimator.State P:UIKit.UIViewPropertyAnimator.UserInteractionEnabled P:UIKit.UIWebErrorArgs.Error P:UIKit.UIWebView.Delegate @@ -78825,9 +68759,6 @@ P:UIKit.UIWindowLevel.Alert P:UIKit.UIWindowLevel.Normal P:UIKit.UIWindowLevel.StatusBar P:UIKit.UIWindowScene.FullScreen -P:UIKit.UIWindowSceneActivationInteraction.View -P:UIKit.UIWindowSceneDelegate.Window -P:UIKit.UIWindowSceneDragInteraction.View P:UIKit.WillEndDraggingEventArgs.TargetContentOffset P:UIKit.WillEndDraggingEventArgs.Velocity P:UIKit.ZoomingEndedEventArgs.AtScale @@ -79580,369 +69511,49 @@ P:Vision.IVNFaceObservationAccepting.InputFaceObservations P:Vision.IVNRequestProgressProviding.Indeterminate P:Vision.IVNRequestProgressProviding.ProgressHandler P:Vision.IVNRequestRevisionProviding.RequestRevision -P:Vision.VNAnimalBodyPoseObservation.AvailableJointGroupNames -P:Vision.VNAnimalBodyPoseObservation.AvailableJointNames -P:Vision.VNBarcodeObservation.BarcodeDescriptor -P:Vision.VNBarcodeObservation.IsColorInverted -P:Vision.VNBarcodeObservation.IsGS1DataCarrier -P:Vision.VNBarcodeObservation.PayloadData -P:Vision.VNBarcodeObservation.PayloadStringValue -P:Vision.VNBarcodeObservation.SupplementalCompositeType -P:Vision.VNBarcodeObservation.SupplementalPayloadData -P:Vision.VNBarcodeObservation.SupplementalPayloadString P:Vision.VNBarcodeObservation.Symbology -P:Vision.VNBarcodeObservation.WeakSymbology -P:Vision.VNCalculateImageAestheticsScoresRequest.Results -P:Vision.VNCircle.Center -P:Vision.VNCircle.Diameter -P:Vision.VNCircle.Radius -P:Vision.VNCircle.Zero -P:Vision.VNClassificationObservation.HasPrecisionRecallCurve -P:Vision.VNClassificationObservation.Identifier -P:Vision.VNClassifyImageRequest.CurrentRevision -P:Vision.VNClassifyImageRequest.DefaultRevision -P:Vision.VNClassifyImageRequest.Results -P:Vision.VNClassifyImageRequest.Revision P:Vision.VNClassifyImageRequest.SupportedRevisions -P:Vision.VNClassifyImageRequest.WeakSupportedRevisions -P:Vision.VNContour.AspectRatio -P:Vision.VNContour.ChildContourCount -P:Vision.VNContour.ChildContours -P:Vision.VNContour.IndexPath -P:Vision.VNContour.NormalizedPath -P:Vision.VNContour.NormalizedPoints -P:Vision.VNContour.PointCount -P:Vision.VNContour.RequestRevision -P:Vision.VNContoursObservation.ContourCount -P:Vision.VNContoursObservation.NormalizedPath P:Vision.VNContoursObservation.RecognizedPointGroupKeyAll -P:Vision.VNContoursObservation.TopLevelContourCount -P:Vision.VNContoursObservation.TopLevelContours -P:Vision.VNCoreMLFeatureValueObservation.FeatureName -P:Vision.VNCoreMLFeatureValueObservation.FeatureValue -P:Vision.VNCoreMLModel.FeatureProvider -P:Vision.VNCoreMLModel.InputImageFeatureName -P:Vision.VNCoreMLRequest.CurrentRevision -P:Vision.VNCoreMLRequest.DefaultRevision -P:Vision.VNCoreMLRequest.ImageCropAndScaleOption -P:Vision.VNCoreMLRequest.Model -P:Vision.VNCoreMLRequest.Revision P:Vision.VNCoreMLRequest.SupportedRevisions -P:Vision.VNCoreMLRequest.WeakSupportedRevisions -P:Vision.VNDetectAnimalBodyPoseRequest.Results -P:Vision.VNDetectBarcodesRequest.CoalesceCompositeSymbologies -P:Vision.VNDetectBarcodesRequest.CurrentRevision -P:Vision.VNDetectBarcodesRequest.DefaultRevision -P:Vision.VNDetectBarcodesRequest.Results -P:Vision.VNDetectBarcodesRequest.Revision P:Vision.VNDetectBarcodesRequest.SupportedRevisions P:Vision.VNDetectBarcodesRequest.SupportedSymbologies P:Vision.VNDetectBarcodesRequest.Symbologies -P:Vision.VNDetectBarcodesRequest.WeakSupportedRevisions -P:Vision.VNDetectBarcodesRequest.WeakSupportedSymbologies -P:Vision.VNDetectBarcodesRequest.WeakSymbologies -P:Vision.VNDetectContoursRequest.ContrastAdjustment -P:Vision.VNDetectContoursRequest.ContrastPivot -P:Vision.VNDetectContoursRequest.CurrentRevision -P:Vision.VNDetectContoursRequest.DefaultRevision -P:Vision.VNDetectContoursRequest.DetectsDarkOnLight -P:Vision.VNDetectContoursRequest.MaximumImageDimension -P:Vision.VNDetectContoursRequest.Results -P:Vision.VNDetectContoursRequest.Revision P:Vision.VNDetectContoursRequest.SupportedRevisions -P:Vision.VNDetectContoursRequest.WeakSupportedRevisions -P:Vision.VNDetectDocumentSegmentationRequest.Results -P:Vision.VNDetectedObjectObservation.BoundingBox -P:Vision.VNDetectedObjectObservation.GlobalSegmentationMask -P:Vision.VNDetectedPoint.Confidence -P:Vision.VNDetectFaceCaptureQualityRequest.CurrentRevision -P:Vision.VNDetectFaceCaptureQualityRequest.DefaultRevision -P:Vision.VNDetectFaceCaptureQualityRequest.InputFaceObservations -P:Vision.VNDetectFaceCaptureQualityRequest.Results -P:Vision.VNDetectFaceCaptureQualityRequest.Revision P:Vision.VNDetectFaceCaptureQualityRequest.SupportedRevisions -P:Vision.VNDetectFaceCaptureQualityRequest.WeakSupportedRevisions -P:Vision.VNDetectFaceLandmarksRequest.Constellation -P:Vision.VNDetectFaceLandmarksRequest.CurrentRevision -P:Vision.VNDetectFaceLandmarksRequest.DefaultRevision -P:Vision.VNDetectFaceLandmarksRequest.InputFaceObservations -P:Vision.VNDetectFaceLandmarksRequest.Results -P:Vision.VNDetectFaceLandmarksRequest.Revision P:Vision.VNDetectFaceLandmarksRequest.SupportedRevisions -P:Vision.VNDetectFaceLandmarksRequest.WeakSupportedRevisions -P:Vision.VNDetectFaceRectanglesRequest.CurrentRevision -P:Vision.VNDetectFaceRectanglesRequest.DefaultRevision -P:Vision.VNDetectFaceRectanglesRequest.Results -P:Vision.VNDetectFaceRectanglesRequest.Revision P:Vision.VNDetectFaceRectanglesRequest.SupportedRevisions -P:Vision.VNDetectFaceRectanglesRequest.WeakSupportedRevisions -P:Vision.VNDetectHorizonRequest.CurrentRevision -P:Vision.VNDetectHorizonRequest.DefaultRevision -P:Vision.VNDetectHorizonRequest.Results -P:Vision.VNDetectHorizonRequest.Revision P:Vision.VNDetectHorizonRequest.SupportedRevisions -P:Vision.VNDetectHorizonRequest.WeakSupportedRevisions -P:Vision.VNDetectHumanBodyPose3DRequest.CurrentRevision -P:Vision.VNDetectHumanBodyPose3DRequest.DefaultRevision -P:Vision.VNDetectHumanBodyPose3DRequest.Results -P:Vision.VNDetectHumanBodyPose3DRequest.Revision P:Vision.VNDetectHumanBodyPose3DRequest.SupportedRevisions -P:Vision.VNDetectHumanBodyPose3DRequest.WeakSupportedRevisions -P:Vision.VNDetectHumanBodyPoseRequest.CurrentRevision -P:Vision.VNDetectHumanBodyPoseRequest.DefaultRevision -P:Vision.VNDetectHumanBodyPoseRequest.Results -P:Vision.VNDetectHumanBodyPoseRequest.Revision P:Vision.VNDetectHumanBodyPoseRequest.SupportedRevisions -P:Vision.VNDetectHumanBodyPoseRequest.WeakSupportedRevisions -P:Vision.VNDetectHumanHandPoseRequest.CurrentRevision -P:Vision.VNDetectHumanHandPoseRequest.DefaultRevision -P:Vision.VNDetectHumanHandPoseRequest.MaximumHandCount -P:Vision.VNDetectHumanHandPoseRequest.Results -P:Vision.VNDetectHumanHandPoseRequest.Revision P:Vision.VNDetectHumanHandPoseRequest.SupportedRevisions -P:Vision.VNDetectHumanHandPoseRequest.WeakSupportedRevisions -P:Vision.VNDetectHumanRectanglesRequest.CurrentRevision -P:Vision.VNDetectHumanRectanglesRequest.DefaultRevision -P:Vision.VNDetectHumanRectanglesRequest.Results -P:Vision.VNDetectHumanRectanglesRequest.Revision P:Vision.VNDetectHumanRectanglesRequest.SupportedRevisions -P:Vision.VNDetectHumanRectanglesRequest.UpperBodyOnly -P:Vision.VNDetectHumanRectanglesRequest.WeakSupportedRevisions -P:Vision.VNDetectRectanglesRequest.CurrentRevision -P:Vision.VNDetectRectanglesRequest.DefaultRevision -P:Vision.VNDetectRectanglesRequest.MaximumAspectRatio -P:Vision.VNDetectRectanglesRequest.MaximumObservations -P:Vision.VNDetectRectanglesRequest.MinimumAspectRatio -P:Vision.VNDetectRectanglesRequest.MinimumConfidence -P:Vision.VNDetectRectanglesRequest.MinimumSize -P:Vision.VNDetectRectanglesRequest.QuadratureTolerance -P:Vision.VNDetectRectanglesRequest.Results -P:Vision.VNDetectRectanglesRequest.Revision P:Vision.VNDetectRectanglesRequest.SupportedRevisions -P:Vision.VNDetectRectanglesRequest.WeakSupportedRevisions -P:Vision.VNDetectTextRectanglesRequest.CurrentRevision -P:Vision.VNDetectTextRectanglesRequest.DefaultRevision -P:Vision.VNDetectTextRectanglesRequest.ReportCharacterBoxes -P:Vision.VNDetectTextRectanglesRequest.Results -P:Vision.VNDetectTextRectanglesRequest.Revision P:Vision.VNDetectTextRectanglesRequest.SupportedRevisions -P:Vision.VNDetectTextRectanglesRequest.WeakSupportedRevisions -P:Vision.VNDetectTrajectoriesRequest.CurrentRevision -P:Vision.VNDetectTrajectoriesRequest.DefaultRevision -P:Vision.VNDetectTrajectoriesRequest.ObjectMaximumNormalizedRadius -P:Vision.VNDetectTrajectoriesRequest.ObjectMinimumNormalizedRadius -P:Vision.VNDetectTrajectoriesRequest.Results -P:Vision.VNDetectTrajectoriesRequest.Revision P:Vision.VNDetectTrajectoriesRequest.SupportedRevisions -P:Vision.VNDetectTrajectoriesRequest.TargetFrameTime -P:Vision.VNDetectTrajectoriesRequest.TrajectoryLength -P:Vision.VNDetectTrajectoriesRequest.WeakSupportedRevisions -P:Vision.VNFaceLandmarkRegion.PointCount -P:Vision.VNFaceLandmarkRegion.RequestRevision P:Vision.VNFaceLandmarkRegion2D.NormalizedPoints -P:Vision.VNFaceLandmarkRegion2D.PointsClassification -P:Vision.VNFaceLandmarkRegion2D.PrecisionEstimatesPerPoint -P:Vision.VNFaceLandmarks.Confidence -P:Vision.VNFaceLandmarks.RequestRevision -P:Vision.VNFaceLandmarks2D.AllPoints -P:Vision.VNFaceLandmarks2D.FaceContour -P:Vision.VNFaceLandmarks2D.InnerLips -P:Vision.VNFaceLandmarks2D.LeftEye -P:Vision.VNFaceLandmarks2D.LeftEyebrow -P:Vision.VNFaceLandmarks2D.LeftPupil -P:Vision.VNFaceLandmarks2D.MedianLine -P:Vision.VNFaceLandmarks2D.Nose -P:Vision.VNFaceLandmarks2D.NoseCrest -P:Vision.VNFaceLandmarks2D.OuterLips -P:Vision.VNFaceLandmarks2D.RightEye -P:Vision.VNFaceLandmarks2D.RightEyebrow -P:Vision.VNFaceLandmarks2D.RightPupil -P:Vision.VNFaceObservation.FaceCaptureQuality -P:Vision.VNFaceObservation.Landmarks -P:Vision.VNFaceObservation.Pitch -P:Vision.VNFaceObservation.Roll -P:Vision.VNFaceObservation.Yaw -P:Vision.VNFeaturePrintObservation.Data -P:Vision.VNFeaturePrintObservation.ElementCount -P:Vision.VNFeaturePrintObservation.ElementType -P:Vision.VNGenerateAttentionBasedSaliencyImageRequest.CurrentRevision -P:Vision.VNGenerateAttentionBasedSaliencyImageRequest.DefaultRevision -P:Vision.VNGenerateAttentionBasedSaliencyImageRequest.Results -P:Vision.VNGenerateAttentionBasedSaliencyImageRequest.Revision P:Vision.VNGenerateAttentionBasedSaliencyImageRequest.SupportedRevisions -P:Vision.VNGenerateAttentionBasedSaliencyImageRequest.WeakSupportedRevisions -P:Vision.VNGenerateForegroundInstanceMaskRequest.Results -P:Vision.VNGenerateImageFeaturePrintRequest.CurrentRevision -P:Vision.VNGenerateImageFeaturePrintRequest.DefaultRevision -P:Vision.VNGenerateImageFeaturePrintRequest.ImageCropAndScaleOption -P:Vision.VNGenerateImageFeaturePrintRequest.Results -P:Vision.VNGenerateImageFeaturePrintRequest.Revision P:Vision.VNGenerateImageFeaturePrintRequest.SupportedRevisions -P:Vision.VNGenerateImageFeaturePrintRequest.WeakSupportedRevisions -P:Vision.VNGenerateObjectnessBasedSaliencyImageRequest.CurrentRevision -P:Vision.VNGenerateObjectnessBasedSaliencyImageRequest.DefaultRevision -P:Vision.VNGenerateObjectnessBasedSaliencyImageRequest.Results -P:Vision.VNGenerateObjectnessBasedSaliencyImageRequest.Revision P:Vision.VNGenerateObjectnessBasedSaliencyImageRequest.SupportedRevisions -P:Vision.VNGenerateObjectnessBasedSaliencyImageRequest.WeakSupportedRevisions -P:Vision.VNGenerateOpticalFlowRequest.ComputationAccuracy -P:Vision.VNGenerateOpticalFlowRequest.CurrentRevision -P:Vision.VNGenerateOpticalFlowRequest.DefaultRevision -P:Vision.VNGenerateOpticalFlowRequest.KeepNetworkOutput -P:Vision.VNGenerateOpticalFlowRequest.OutputPixelFormat -P:Vision.VNGenerateOpticalFlowRequest.Results -P:Vision.VNGenerateOpticalFlowRequest.Revision P:Vision.VNGenerateOpticalFlowRequest.SupportedRevisions -P:Vision.VNGenerateOpticalFlowRequest.WeakSupportedRevisions -P:Vision.VNGeneratePersonInstanceMaskRequest.Results -P:Vision.VNGeneratePersonSegmentationRequest.OutputPixelFormat -P:Vision.VNGeneratePersonSegmentationRequest.QualityLevel -P:Vision.VNGeneratePersonSegmentationRequest.Results -P:Vision.VNHomographicImageRegistrationRequest.CurrentRevision -P:Vision.VNHomographicImageRegistrationRequest.DefaultRevision -P:Vision.VNHomographicImageRegistrationRequest.Results -P:Vision.VNHomographicImageRegistrationRequest.Revision P:Vision.VNHomographicImageRegistrationRequest.SupportedRevisions -P:Vision.VNHomographicImageRegistrationRequest.WeakSupportedRevisions -P:Vision.VNHorizonObservation.Angle -P:Vision.VNHorizonObservation.Transform -P:Vision.VNHumanBodyPose3DObservation.AvailableJointNames -P:Vision.VNHumanBodyPose3DObservation.AvailableJointsGroupNames -P:Vision.VNHumanBodyPose3DObservation.BodyHeight -P:Vision.VNHumanBodyPose3DObservation.CameraOriginMatrix -P:Vision.VNHumanBodyPose3DObservation.HeightEstimation -P:Vision.VNHumanBodyPoseObservation.AvailableJointNames -P:Vision.VNHumanBodyPoseObservation.AvailableJointsGroupNames -P:Vision.VNHumanBodyRecognizedPoint3D.LocalPosition -P:Vision.VNHumanBodyRecognizedPoint3D.ParentJoint -P:Vision.VNHumanHandPoseObservation.AvailableJointNames -P:Vision.VNHumanHandPoseObservation.AvailableJointsGroupNames -P:Vision.VNHumanHandPoseObservation.Chirality -P:Vision.VNHumanObservation.UpperBodyOnly -P:Vision.VNImageAestheticsScoresObservation.IsUtility -P:Vision.VNImageAestheticsScoresObservation.OverallScore -P:Vision.VNImageBasedRequest.RegionOfInterest -P:Vision.VNImageHomographicAlignmentObservation.WarpTransform P:Vision.VNImageOptions.CameraIntrinsics P:Vision.VNImageOptions.CIContext P:Vision.VNImageOptions.Properties P:Vision.VNImageOptions.WeakProperties -P:Vision.VNImageTranslationAlignmentObservation.AlignmentTransform -P:Vision.VNInstanceMaskObservation.AllInstances -P:Vision.VNInstanceMaskObservation.InstanceMask -P:Vision.VNObservation.Confidence -P:Vision.VNObservation.RequestRevision -P:Vision.VNObservation.TimeRange -P:Vision.VNObservation.Uuid -P:Vision.VNPixelBufferObservation.FeatureName -P:Vision.VNPixelBufferObservation.PixelBuffer -P:Vision.VNPoint.Location -P:Vision.VNPoint.X -P:Vision.VNPoint.Y -P:Vision.VNPoint.Zero -P:Vision.VNPoint3D.Position -P:Vision.VNRecognizeAnimalsRequest.CurrentRevision -P:Vision.VNRecognizeAnimalsRequest.DefaultRevision -P:Vision.VNRecognizeAnimalsRequest.Results -P:Vision.VNRecognizeAnimalsRequest.Revision P:Vision.VNRecognizeAnimalsRequest.SupportedRevisions -P:Vision.VNRecognizeAnimalsRequest.WeakSupportedRevisions -P:Vision.VNRecognizedObjectObservation.Labels -P:Vision.VNRecognizedPoint.Identifier P:Vision.VNRecognizedPoint3D.GroupKeyAll -P:Vision.VNRecognizedPoint3D.Identifier -P:Vision.VNRecognizedPoints3DObservation.AvailableGroupKeys -P:Vision.VNRecognizedPoints3DObservation.AvailableKeys -P:Vision.VNRecognizedPointsObservation.AvailableGroupKeys -P:Vision.VNRecognizedPointsObservation.AvailableKeys -P:Vision.VNRecognizedText.Confidence -P:Vision.VNRecognizedText.RequestRevision -P:Vision.VNRecognizedText.String -P:Vision.VNRecognizeTextRequest.AutomaticallyDetectsLanguage -P:Vision.VNRecognizeTextRequest.CurrentRevision -P:Vision.VNRecognizeTextRequest.CustomWords -P:Vision.VNRecognizeTextRequest.DefaultRevision -P:Vision.VNRecognizeTextRequest.Indeterminate -P:Vision.VNRecognizeTextRequest.MinimumTextHeight -P:Vision.VNRecognizeTextRequest.ProgressHandler -P:Vision.VNRecognizeTextRequest.RecognitionLanguages -P:Vision.VNRecognizeTextRequest.RecognitionLevel -P:Vision.VNRecognizeTextRequest.Results -P:Vision.VNRecognizeTextRequest.Revision P:Vision.VNRecognizeTextRequest.SupportedRevisions -P:Vision.VNRecognizeTextRequest.UsesLanguageCorrection -P:Vision.VNRecognizeTextRequest.WeakSupportedRevisions -P:Vision.VNRectangleObservation.BottomLeft -P:Vision.VNRectangleObservation.BottomRight -P:Vision.VNRectangleObservation.TopLeft -P:Vision.VNRectangleObservation.TopRight -P:Vision.VNRequest.CompletionHandler -P:Vision.VNRequest.PreferBackgroundProcessing -P:Vision.VNRequest.UsesCpuOnly -P:Vision.VNSaliencyImageObservation.SalientObjects -P:Vision.VNStatefulRequest.CurrentRevision -P:Vision.VNStatefulRequest.DefaultRevision -P:Vision.VNStatefulRequest.FrameAnalysisSpacing -P:Vision.VNStatefulRequest.MinimumLatencyFrameCount -P:Vision.VNStatefulRequest.Revision P:Vision.VNStatefulRequest.SupportedRevisions -P:Vision.VNStatefulRequest.WeakSupportedRevisions -P:Vision.VNTextObservation.CharacterBoxes -P:Vision.VNTrackHomographicImageRegistrationRequest.CurrentRevision -P:Vision.VNTrackHomographicImageRegistrationRequest.DefaultRevision -P:Vision.VNTrackHomographicImageRegistrationRequest.Results -P:Vision.VNTrackHomographicImageRegistrationRequest.Revision P:Vision.VNTrackHomographicImageRegistrationRequest.SupportedRevisions -P:Vision.VNTrackHomographicImageRegistrationRequest.WeakSupportedRevisions -P:Vision.VNTrackingRequest.InputObservation P:Vision.VNTrackingRequest.LastFrame -P:Vision.VNTrackingRequest.TrackingLevel -P:Vision.VNTrackObjectRequest.CurrentRevision -P:Vision.VNTrackObjectRequest.DefaultRevision -P:Vision.VNTrackObjectRequest.Revision P:Vision.VNTrackObjectRequest.SupportedRevisions -P:Vision.VNTrackObjectRequest.WeakSupportedRevisions -P:Vision.VNTrackOpticalFlowRequest.ComputationAccuracy -P:Vision.VNTrackOpticalFlowRequest.KeepNetworkOutput -P:Vision.VNTrackOpticalFlowRequest.OutputPixelFormat -P:Vision.VNTrackOpticalFlowRequest.Results -P:Vision.VNTrackRectangleRequest.CurrentRevision -P:Vision.VNTrackRectangleRequest.DefaultRevision -P:Vision.VNTrackRectangleRequest.Revision P:Vision.VNTrackRectangleRequest.SupportedRevisions -P:Vision.VNTrackRectangleRequest.WeakSupportedRevisions -P:Vision.VNTrackTranslationalImageRegistrationRequest.CurrentRevision -P:Vision.VNTrackTranslationalImageRegistrationRequest.DefaultRevision -P:Vision.VNTrackTranslationalImageRegistrationRequest.Results -P:Vision.VNTrackTranslationalImageRegistrationRequest.Revision P:Vision.VNTrackTranslationalImageRegistrationRequest.SupportedRevisions -P:Vision.VNTrackTranslationalImageRegistrationRequest.WeakSupportedRevisions -P:Vision.VNTrajectoryObservation.DetectedPoints -P:Vision.VNTrajectoryObservation.EquationCoefficients -P:Vision.VNTrajectoryObservation.MovingAverageRadius -P:Vision.VNTrajectoryObservation.ProjectedPoints -P:Vision.VNTranslationalImageRegistrationRequest.CurrentRevision -P:Vision.VNTranslationalImageRegistrationRequest.DefaultRevision -P:Vision.VNTranslationalImageRegistrationRequest.Results P:Vision.VNTranslationalImageRegistrationRequest.SupportedRevisions -P:Vision.VNTranslationalImageRegistrationRequest.WeakSupportedRevisions P:Vision.VNUtils.NormalizedIdentityRect P:Vision.VNUtils.VisionVersionNumber -P:Vision.VNVector.Length -P:Vision.VNVector.R -P:Vision.VNVector.SquaredLength -P:Vision.VNVector.Theta -P:Vision.VNVector.X -P:Vision.VNVector.Y -P:Vision.VNVector.Zero -P:Vision.VNVideoProcessorFrameRateCadence.FrameRate -P:Vision.VNVideoProcessorRequestProcessingOptions.Cadence -P:Vision.VNVideoProcessorTimeIntervalCadence.TimeInterval -P:VisionKit.VNDocumentCameraScan.PageCount -P:VisionKit.VNDocumentCameraScan.Title P:VisionKit.VNDocumentCameraViewController.Delegate P:VisionKit.VNDocumentCameraViewController.Supported -P:VisionKit.VNDocumentCameraViewController.WeakDelegate P:WatchConnectivity.WCSession.ActivationState P:WatchConnectivity.WCSession.ApplicationContext P:WatchConnectivity.WCSession.ComplicationEnabled @@ -79971,19 +69582,14 @@ P:WebKit.DomCssRuleList.Item(System.Int32) P:WebKit.DomCssStyleDeclaration.Item(System.Int32) P:WebKit.DomEventArgs.Event P:WebKit.DomHtmlCollection.Item(System.Int32) -P:WebKit.DomHtmlDocument.ActiveElement -P:WebKit.DomHtmlElement.InnerHTML -P:WebKit.DomHtmlElement.OuterHTML P:WebKit.DomHtmlOptionsCollection.Item(System.String) P:WebKit.DomHtmlOptionsCollection.Item(System.UInt32) P:WebKit.DomHtmlSelectElement.Item(System.String) P:WebKit.DomHtmlSelectElement.Item(System.UInt32) -P:WebKit.DomHtmlTextAreaElement.TabIndex P:WebKit.DomMediaList.Item(System.Int32) P:WebKit.DomNamedNodeMap.Item(System.Int32) P:WebKit.DomNamedNodeMap.Item(System.String) P:WebKit.DomNodeList.Item(System.Int32) -P:WebKit.DomProcessingInstruction.Data P:WebKit.DomStyleSheetList.Item(System.Int32) P:WebKit.IIndexedContainer`1.Count P:WebKit.IIndexedContainer`1.Item(System.Int32) @@ -79993,9 +69599,6 @@ P:WebKit.IWebDocumentRepresentation.Title P:WebKit.IWKPreviewActionItem.Identifier P:WebKit.IWKUrlSchemeTask.Request P:WebKit.WebDataSource.IsLoading -P:WebKit.WebDocumentRepresentation.CanProvideDocumentSource -P:WebKit.WebDocumentRepresentation.DocumentSource -P:WebKit.WebDocumentRepresentation.Title P:WebKit.WebFailureToImplementPolicyEventArgs.Error P:WebKit.WebFailureToImplementPolicyEventArgs.Frame P:WebKit.WebFrameClientRedirectEventArgs.FireDate diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index d84277be6802..78c57f95efa8 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -503,19 +503,19 @@ public void BuildAndExecuteNativeReferencesTestApp (string project, ApplePlatfor [TestCase (ApplePlatform.iOS, "iossimulator-x84", true)] // it's x86, not x84 [TestCase (ApplePlatform.iOS, "iossimulator-arm", true)] // we don't support this [TestCase (ApplePlatform.iOS, "helloworld", true)] // random text - [TestCase (ApplePlatform.iOS, "osx-x64", false)] // valid RID for another platform + [TestCase (ApplePlatform.iOS, "tvos-arm64", false)] // valid RID for another platform [TestCase (ApplePlatform.TVOS, "tvos-x64", false)] // valid RID in a previous preview (and common mistake) [TestCase (ApplePlatform.TVOS, "tvossimulator-x46", true)] // it's x64, not x46 [TestCase (ApplePlatform.TVOS, "tvossimulator-arm", true)] // we don't support this [TestCase (ApplePlatform.TVOS, "helloworld", true)] // random text - [TestCase (ApplePlatform.TVOS, "osx-x64", false)] // valid RID for another platform + [TestCase (ApplePlatform.TVOS, "iossimulator-x64", false)] // valid RID for another platform [TestCase (ApplePlatform.MacOSX, "osx-x46", true)] // it's x64, not x46 [TestCase (ApplePlatform.MacOSX, "macos-arm64", true)] // it's osx, not macos [TestCase (ApplePlatform.MacOSX, "helloworld", true)] // random text [TestCase (ApplePlatform.MacOSX, "ios-arm64", false)] // valid RID for another platform [TestCase (ApplePlatform.MacCatalyst, "maccatalyst-x46", true)] // it's x64, not x46 [TestCase (ApplePlatform.MacCatalyst, "helloworld", true)] // random text - [TestCase (ApplePlatform.MacCatalyst, "osx-x64", false)] // valid RID for another platform + [TestCase (ApplePlatform.MacCatalyst, "ios-arm64", false)] // valid RID for another platform public void InvalidRuntimeIdentifier (ApplePlatform platform, string runtimeIdentifier, bool notRecognized) { var project = "MySimpleApp"; @@ -1169,7 +1169,19 @@ public void AppWithGenericLibraryReference (ApplePlatform platform, string runti var project_path = GetProjectPath (project, runtimeIdentifiers: runtimeIdentifiers, platform: platform, out var appPath); Clean (project_path); - DotNet.AssertBuild (project_path, GetDefaultProperties (runtimeIdentifiers)); + // We want RuntimeIdentifier(s) so to be specified in a file, otherwise they're applied to the library + // project as well, and that might not be valid. + var properties = GetDefaultProperties (runtimeIdentifiers); + if (properties.ContainsKey ("RuntimeIdentifiers")) { + properties ["file:RuntimeIdentifiers"] = properties ["RuntimeIdentifiers"]; + properties.Remove ("RuntimeIdentifiers"); + } + if (properties.ContainsKey ("RuntimeIdentifier")) { + properties ["file:RuntimeIdentifier"] = properties ["RuntimeIdentifier"]; + properties.Remove ("RuntimeIdentifier"); + } + + DotNet.AssertBuild (project_path, properties); var appExecutable = GetNativeExecutable (platform, appPath); ExecuteWithMagicWordAndAssert (platform, runtimeIdentifiers, appExecutable); From 5de6b1a8fea3c866c04d0c9fc8197d03524844a9 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Tue, 22 Oct 2024 07:19:35 -0400 Subject: [PATCH 093/155] [Rgen] Provide all the wiring to allow to emit code. (#21460) Add the following: 1. Code needed to register the changes in the compiler pipeline. 2. Code that will add the using statements for the generated code that match those in the binding file. 3. Code that allows to write tabbed code in a way we do not have to keep track of indentation. We have the first unit test that verifies code generation by checking the using statements. --------- Co-authored-by: GitHub Actions Autoformatter Co-authored-by: Rolf Bjarne Kvinge --- src/Makefile.generator | 4 +- src/Makefile.rgenerator | 1 + src/bgen/Attributes.cs | 9 - src/bgen/Extensions/PlatformNameExtensions.cs | 116 +++------ .../Extensions/PlatformNameExtensionsBgen.cs | 102 ++++++++ src/bgen/PlatformName.cs | 8 + .../Examples.cs | 2 + ...oft.Macios.Bindings.Analyzer.Sample.csproj | 7 + .../Microsoft.Macios.Generator.Sample.csproj | 7 + .../SampleBinding.cs | 2 + .../AttributesNames.cs | 9 + .../BindingSourceGeneratorGenerator.cs | 161 ++++++++++++- .../Context/ClassBindingContext.cs | 16 ++ .../Context/ContextFactory.cs | 21 ++ .../Context/ISymbolBindingContext.cs | 19 ++ .../Context/RootBindingContext.cs | 47 ++++ .../Context/SymbolBindingContext.cs | 36 +++ .../Emitters/ClassEmitter.cs | 24 ++ .../Emitters/EmitterFactory.cs | 23 ++ .../Emitters/EnumEmitter.cs | 19 ++ .../Emitters/ICodeEmitter.cs | 13 + .../Emitters/InterfaceEmitter.cs | 16 ++ .../Microsoft.Macios.Generator.csproj | 27 +++ .../Resources.Designer.cs | 66 +++++ .../Microsoft.Macios.Generator/Resources.resx | 34 +++ .../TabbedStringBuilder.cs | 227 ++++++++++++++++++ .../generator/PlatformNameExtensionsTests.cs | 5 +- .../BindingTypeSemanticAnalyzerTests.cs | 8 +- .../BindingSourceGeneratorGeneratorTests.cs | 51 ++-- .../TabbedStringBuilderTests.cs | 209 ++++++++++++++++ 30 files changed, 1167 insertions(+), 122 deletions(-) create mode 100644 src/bgen/Extensions/PlatformNameExtensionsBgen.cs create mode 100644 src/bgen/PlatformName.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/AttributesNames.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Context/ClassBindingContext.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Context/ContextFactory.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Context/ISymbolBindingContext.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Context/RootBindingContext.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Context/SymbolBindingContext.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Emitters/ClassEmitter.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Emitters/EmitterFactory.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Emitters/ICodeEmitter.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Resources.Designer.cs create mode 100644 src/rgen/Microsoft.Macios.Generator/Resources.resx create mode 100644 src/rgen/Microsoft.Macios.Generator/TabbedStringBuilder.cs create mode 100644 tests/rgen/Microsoft.Macios.Generator.Tests/TabbedStringBuilderTests.cs diff --git a/src/Makefile.generator b/src/Makefile.generator index a88c56ec1d50..50f3353b9d12 100644 --- a/src/Makefile.generator +++ b/src/Makefile.generator @@ -70,6 +70,6 @@ $(RSP_DIR)/dotnet/%-defines-dotnet.rsp: frameworks.sources Makefile.generator ge $(Q) ./generate-defines.csharp $@.tmp '$(filter-out $(DOTNET_REMOVED_$(shell echo $* | tr a-z A-Z)_FRAMEWORKS),$($(shell echo $* | tr a-z A-Z)_FRAMEWORKS))' $(Q) mv $@.tmp $@ -$(DOTNET_BUILD_DIR)/Xamarin.Apple.BindingAttributes.dll: bgen/Attributes.cs Makefile.generator | $(DOTNET_BUILD_DIR) - $(Q_DOTNET_BUILD) $(SYSTEM_CSC) $(DOTNET_FLAGS) -out:$@ $< +$(DOTNET_BUILD_DIR)/Xamarin.Apple.BindingAttributes.dll: bgen/Attributes.cs bgen/PlatformName.cs Makefile.generator | $(DOTNET_BUILD_DIR) + $(Q_DOTNET_BUILD) $(SYSTEM_CSC) $(DOTNET_FLAGS) -out:$@ bgen/Attributes.cs bgen/PlatformName.cs diff --git a/src/Makefile.rgenerator b/src/Makefile.rgenerator index e3bd9f2b997a..61bbed1d2067 100644 --- a/src/Makefile.rgenerator +++ b/src/Makefile.rgenerator @@ -1,6 +1,7 @@ # Roslyn code generator ROSLYN_GENERATOR=$(DOTNET_BUILD_DIR)/common/rgen/Microsoft.Macios.Generator.dll ROSLYN_GENERATOR_FILES := $(wildcard rgen/Microsoft.Macios.Generator/*.cs) +ROSLYN_GENERATOR_FILES += $(wildcard rgen/Microsoft.Macios.Generator/*/*.cs) $(ROSLYN_GENERATOR): Makefile.rgenerator $(ROSLYN_GENERATOR_FILES) $(Q_DOTNET_BUILD) $(DOTNET) publish rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj $(DOTNET_BUILD_VERBOSITY) /p:Configuration=Debug /p:IntermediateOutputPath=$(abspath $(DOTNET_BUILD_DIR)/IDE/obj/common/rgen)/ /p:OutputPath=$(abspath $(DOTNET_BUILD_DIR)/IDE/bin/common/rgen/)/ diff --git a/src/bgen/Attributes.cs b/src/bgen/Attributes.cs index 0096d35b1d5f..25ad9f46cd6b 100644 --- a/src/bgen/Attributes.cs +++ b/src/bgen/Attributes.cs @@ -883,15 +883,6 @@ public class NoMethodAttribute : Attribute { } #if NET -public enum PlatformName : byte { - None, - MacOSX, - iOS, - WatchOS, - TvOS, - MacCatalyst, -} - public enum AvailabilityKind { Introduced, Deprecated, diff --git a/src/bgen/Extensions/PlatformNameExtensions.cs b/src/bgen/Extensions/PlatformNameExtensions.cs index 982e5eb1bd8f..ea0b3914cac9 100644 --- a/src/bgen/Extensions/PlatformNameExtensions.cs +++ b/src/bgen/Extensions/PlatformNameExtensions.cs @@ -1,132 +1,74 @@ -using System; -using System.IO; -using ObjCRuntime; -using Xamarin.Utils; +using System.Diagnostics.CodeAnalysis; public static class PlatformNameExtensions { - public static string GetApplicationClassName (this PlatformName currentPlatform) + public static bool TryGetApplicationClassName (this PlatformName currentPlatform, [NotNullWhen (true)] out string? className) { switch (currentPlatform) { case PlatformName.iOS: case PlatformName.WatchOS: case PlatformName.TvOS: case PlatformName.MacCatalyst: - return "UIApplication"; + className = "UIApplication"; + return true; case PlatformName.MacOSX: - return "NSApplication"; + className = "NSApplication"; + return true; default: - throw new BindingException (1047, currentPlatform); + className = null; + return false; } } - public static int GetXamcoreVersion (this PlatformName currentPlatform) - { -#if NET - return 4; -#else - switch (currentPlatform) { - case PlatformName.MacOSX: - case PlatformName.iOS: - return 2; - case PlatformName.TvOS: - case PlatformName.WatchOS: - return 3; - default: - return 4; - } -#endif - } - - public static string GetCoreImageMap (this PlatformName currentPlatform) + public static bool TryGetCoreImageMap (this PlatformName currentPlatform, [NotNullWhen (true)] out string? coreImageMap) { switch (currentPlatform) { case PlatformName.iOS: case PlatformName.WatchOS: case PlatformName.TvOS: case PlatformName.MacCatalyst: - return "CoreImage"; + coreImageMap = "CoreImage"; + return true; case PlatformName.MacOSX: - return "Quartz"; + coreImageMap = "Quartz"; + return true; default: - throw new BindingException (1047, currentPlatform); + coreImageMap = null; + return false; } } - public static string GetCoreServicesMap (this PlatformName currentPlatform) + public static bool TryGetCoreServicesMap (this PlatformName currentPlatform, [NotNullWhen (true)] out string? coreServicesMap) { switch (currentPlatform) { case PlatformName.iOS: case PlatformName.WatchOS: case PlatformName.TvOS: case PlatformName.MacCatalyst: - return "MobileCoreServices"; - case PlatformName.MacOSX: - return "CoreServices"; - default: - throw new BindingException (1047, currentPlatform); - } - } - - public static string GetPDFKitMap (this PlatformName currentPlatform) - { - switch (currentPlatform) { - case PlatformName.iOS: - case PlatformName.MacCatalyst: - return "PDFKit"; - case PlatformName.MacOSX: - return "Quartz"; - default: - throw new BindingException (1047, currentPlatform); - } - } - - public static ApplePlatform AsApplePlatform (this PlatformName platform) - { - switch (platform) { - case PlatformName.iOS: - return ApplePlatform.iOS; - case PlatformName.TvOS: - return ApplePlatform.TVOS; - case PlatformName.MacCatalyst: - return ApplePlatform.MacCatalyst; + coreServicesMap = "MobileCoreServices"; + return true; case PlatformName.MacOSX: - return ApplePlatform.MacOSX; - case PlatformName.WatchOS: - return ApplePlatform.WatchOS; - case PlatformName.None: - return ApplePlatform.None; + coreServicesMap = "CoreServices"; + return true; default: - throw new ArgumentOutOfRangeException (nameof (platform), platform, $"Unknown platform: {platform}"); + coreServicesMap = null; + return false; } } - static string GetSdkRoot (this PlatformName currentPlatform) + public static bool TryGetPDFKitMap (this PlatformName currentPlatform, [NotNullWhen (true)] out string? pdfKitMap) { switch (currentPlatform) { case PlatformName.iOS: - case PlatformName.WatchOS: - case PlatformName.TvOS: case PlatformName.MacCatalyst: - var sdkRoot = Environment.GetEnvironmentVariable ("MD_MTOUCH_SDK_ROOT"); - if (string.IsNullOrEmpty (sdkRoot)) - sdkRoot = "/Library/Frameworks/Xamarin.iOS.framework/Versions/Current"; - return sdkRoot; + pdfKitMap = "PDFKit"; + return true; case PlatformName.MacOSX: - var macSdkRoot = Environment.GetEnvironmentVariable ("XamarinMacFrameworkRoot"); - if (string.IsNullOrEmpty (macSdkRoot)) - macSdkRoot = "/Library/Frameworks/Xamarin.Mac.framework/Versions/Current"; - return macSdkRoot; + pdfKitMap = "Quartz"; + return true; default: - throw new BindingException (1047, currentPlatform); + pdfKitMap = null; + return false; } } - - public static string GetPath (this PlatformName currentPlatform, params string [] paths) - { - var fullPaths = new string [paths.Length + 1]; - fullPaths [0] = currentPlatform.GetSdkRoot (); - Array.Copy (paths, 0, fullPaths, 1, paths.Length); - return Path.Combine (fullPaths); - } } diff --git a/src/bgen/Extensions/PlatformNameExtensionsBgen.cs b/src/bgen/Extensions/PlatformNameExtensionsBgen.cs new file mode 100644 index 000000000000..45e1a29ba443 --- /dev/null +++ b/src/bgen/Extensions/PlatformNameExtensionsBgen.cs @@ -0,0 +1,102 @@ +using System; +using System.IO; +using Xamarin.Utils; + +public static class PlatformNameExtensionsBgen { + + // wrapper that allows us to use the same code for rgen and bgen + public static string GetApplicationClassName (this PlatformName currentPlatform) + { + if (currentPlatform.TryGetApplicationClassName (out var applicationClassName)) + return applicationClassName; + throw new BindingException (1047, currentPlatform); + } + + public static string GetCoreImageMap (this PlatformName currentPlatform) + { + if (currentPlatform.TryGetCoreImageMap (out var coreImageMap)) + return coreImageMap; + throw new BindingException (1047, currentPlatform); + } + + public static string GetCoreServicesMap (this PlatformName currentPlatform) + { + if (currentPlatform.TryGetCoreServicesMap (out var coreServicesMap)) + return coreServicesMap; + throw new BindingException (1047, currentPlatform); + } + + public static string GetPDFKitMap (this PlatformName currentPlatform) + { + if (currentPlatform.TryGetPDFKitMap (out var pdfKitMap)) + return pdfKitMap; + throw new BindingException (1047, currentPlatform); + } + + public static int GetXamcoreVersion (this PlatformName currentPlatform) + { +#if NET + return 4; +#else + switch (currentPlatform) { + case PlatformName.MacOSX: + case PlatformName.iOS: + return 2; + case PlatformName.TvOS: + case PlatformName.WatchOS: + return 3; + default: + return 4; + } +#endif + } + + public static ApplePlatform AsApplePlatform (this PlatformName platform) + { + switch (platform) { + case PlatformName.iOS: + return ApplePlatform.iOS; + case PlatformName.TvOS: + return ApplePlatform.TVOS; + case PlatformName.MacCatalyst: + return ApplePlatform.MacCatalyst; + case PlatformName.MacOSX: + return ApplePlatform.MacOSX; + case PlatformName.WatchOS: + return ApplePlatform.WatchOS; + case PlatformName.None: + return ApplePlatform.None; + default: + throw new ArgumentOutOfRangeException (nameof (platform), platform, $"Unknown platform: {platform}"); + } + } + + static string GetSdkRoot (this PlatformName currentPlatform) + { + switch (currentPlatform) { + case PlatformName.iOS: + case PlatformName.WatchOS: + case PlatformName.TvOS: + case PlatformName.MacCatalyst: + var sdkRoot = Environment.GetEnvironmentVariable ("MD_MTOUCH_SDK_ROOT"); + if (string.IsNullOrEmpty (sdkRoot)) + sdkRoot = "/Library/Frameworks/Xamarin.iOS.framework/Versions/Current"; + return sdkRoot; + case PlatformName.MacOSX: + var macSdkRoot = Environment.GetEnvironmentVariable ("XamarinMacFrameworkRoot"); + if (string.IsNullOrEmpty (macSdkRoot)) + macSdkRoot = "/Library/Frameworks/Xamarin.Mac.framework/Versions/Current"; + return macSdkRoot; + default: + throw new BindingException (1047, currentPlatform); + } + } + + public static string GetPath (this PlatformName currentPlatform, params string [] paths) + { + var fullPaths = new string [paths.Length + 1]; + fullPaths [0] = currentPlatform.GetSdkRoot (); + Array.Copy (paths, 0, fullPaths, 1, paths.Length); + return Path.Combine (fullPaths); + } +} diff --git a/src/bgen/PlatformName.cs b/src/bgen/PlatformName.cs new file mode 100644 index 000000000000..c17caa5d6bf4 --- /dev/null +++ b/src/bgen/PlatformName.cs @@ -0,0 +1,8 @@ +public enum PlatformName : byte { + None, + MacOSX, + iOS, + WatchOS, + TvOS, + MacCatalyst, +} diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs index fe4905a77980..16717f554311 100644 --- a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Examples.cs @@ -1,3 +1,5 @@ +using ObjCBindings; + namespace Microsoft.Macios.Bindings.Analyzer.Sample; // If you don't see warnings, build the Analyzers Project. diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj index bc9520bfbacf..a02eefcf4af5 100644 --- a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj @@ -3,6 +3,7 @@ net$(BundledNETCoreAppTargetFrameworkVersion) enable + APL0003 @@ -11,9 +12,15 @@ + + external\BindginTypeAttribute.cs + external\Attributes.cs + + external\PlatformName.cs + diff --git a/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj b/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj index f21144e77c4c..e10b90a1b8fd 100644 --- a/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj +++ b/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj @@ -4,6 +4,7 @@ net$(BundledNETCoreAppTargetFrameworkVersion) enable Microsoft.Macios.Generator.Sample + APL0003 @@ -11,9 +12,15 @@ + + external\BindingTypeAttribute.cs + external\Attributes.cs + + external\PlatformName.cs + diff --git a/src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs b/src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs index 28d28329ae21..7c2427c1473e 100644 --- a/src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs +++ b/src/rgen/Microsoft.Macios.Generator.Sample/SampleBinding.cs @@ -1,3 +1,5 @@ +using ObjCBindings; + namespace Microsoft.Macios.Generator.Sample; // This code will not compile until you build the project with the Source Generators diff --git a/src/rgen/Microsoft.Macios.Generator/AttributesNames.cs b/src/rgen/Microsoft.Macios.Generator/AttributesNames.cs new file mode 100644 index 000000000000..62ac3b632b01 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/AttributesNames.cs @@ -0,0 +1,9 @@ +namespace Microsoft.Macios.Generator; + +/// +/// Contains all the names of the attributes that are used by the binding generator. +/// +public static class AttributesNames { + + public static readonly string BindingAttribute = "ObjCBindings.BindingTypeAttribute"; +} diff --git a/src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs b/src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs index fcc630f160ce..456c8cf17460 100644 --- a/src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs +++ b/src/rgen/Microsoft.Macios.Generator/BindingSourceGeneratorGenerator.cs @@ -1,16 +1,36 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; +using Microsoft.Macios.Generator.Context; +using Microsoft.Macios.Generator.Emitters; namespace Microsoft.Macios.Generator; /// -/// A sample source generator that creates a custom report based on class properties. The target class should be annotated with the 'Generators.ReportAttribute' attribute. -/// When using the source code as a baseline, an incremental source generator is preferable because it reduces the performance overhead. +/// A sample source generator that creates a custom report based on class properties. The target class should be +/// annotated with the 'Generators.ReportAttribute' attribute. +/// When using the source code as a baseline, an incremental source generator is preferable because it reduces +/// the performance overhead. /// [Generator] public class BindingSourceGeneratorGenerator : IIncrementalGenerator { + internal static readonly DiagnosticDescriptor RBI0000 = new ( + "RBI0000", + new LocalizableResourceString (nameof (Resources.RBI0000Title), Resources.ResourceManager, typeof (Resources)), + new LocalizableResourceString (nameof (Resources.RBI0000MessageFormat), Resources.ResourceManager, typeof (Resources)), + "Usage", + DiagnosticSeverity.Error, + isEnabledByDefault: true, + description: new LocalizableResourceString (nameof (Resources.RBI0000Description), Resources.ResourceManager, typeof (Resources)) + ); + + /// public void Initialize (IncrementalGeneratorInitializationContext context) { // Add the binding generator attributes to the compilation. This are only available when the @@ -19,6 +39,143 @@ public void Initialize (IncrementalGeneratorInitializationContext context) context.RegisterPostInitializationOutput (ctx => ctx.AddSource ( fileName, SourceText.From (content, Encoding.UTF8))); } + + // binding can use different 'types'. To be able to generate the code we are going to add a different + // function for each of the 'types' we are interested in generating that will be added to the compiler + // pipeline + AddPipeline (context); + AddPipeline (context); + AddPipeline (context); + } + + /// + /// Generic method that adds a provider and a code generator to the pipeline. + /// + /// The compilation context + /// The base type declaration that we are going to generate. + static void AddPipeline (IncrementalGeneratorInitializationContext context) where T : BaseTypeDeclarationSyntax + { + var provider = context.SyntaxProvider + .CreateSyntaxProvider ( + static (s, _) => s is T, + (ctx, _) => GetDeclarationForSourceGen (ctx)) + .Where (t => t.BindingAttributeFound) + .Select ((t, _) => t.Declaration); + + context.RegisterSourceOutput (context.CompilationProvider.Combine (provider.Collect ()), + ((ctx, t) => GenerateCode (ctx, t.Left, t.Right))); + } + + /// + /// Generic method that can be used to filter/match a BaseTypeDeclarationSyntax with the BindingTypeAttribute. + /// Because our generator is focused only on Enum, Interface and Class declarations we can use a generic method + /// that will match the type + the presence of the attribute. + /// + /// Context used by the generator. + /// The BaseTypeDeclarationSyntax we are interested in. + /// A tuple that contains the BaseTypeDeclaration that was processed and a boolean that states if it should be processed or not. + static (T Declaration, bool BindingAttributeFound) GetDeclarationForSourceGen (GeneratorSyntaxContext context) + where T : BaseTypeDeclarationSyntax + { + var classDeclarationSyntax = Unsafe.As (context.Node); + + // Go through all attributes of the class. + foreach (AttributeListSyntax attributeListSyntax in classDeclarationSyntax.AttributeLists) + foreach (AttributeSyntax attributeSyntax in attributeListSyntax.Attributes) { + if (context.SemanticModel.GetSymbolInfo (attributeSyntax).Symbol is not IMethodSymbol attributeSymbol) + continue; // if we can't get the symbol, ignore it + + string attributeName = attributeSymbol.ContainingType.ToDisplayString (); + + // Check the full name of the [Binding] attribute. + if (attributeName == AttributesNames.BindingAttribute) + return (classDeclarationSyntax, true); + } + + return (classDeclarationSyntax, false); + } + + /// + /// Collect the using statements from the class declaration root syntaxt tree and add them to the string builder + /// that will be used to generate the code. This way we ensure that we have all the namespaces needed by the + /// generated code. + /// + /// Root syntax tree of the base type declaration. + /// String builder that will be used for the generated code. + static void CollectUsingStatements (SyntaxTree tree, TabbedStringBuilder sb) + { + // collect all using from the syntax tree, add them to a hash to make sure that we don't have duplicates + // and add those usings that we do know we need for bindings. + var usingDirectives = tree.GetRoot () + .DescendantNodes () + .OfType () + .Select (d => d.Name.ToString ()).ToArray (); + var usingDirectivesToKeep = new HashSet (usingDirectives) { + // add the using statements that we know we need and print them to the sb + }; + foreach (var ns in usingDirectivesToKeep) { + if (string.IsNullOrEmpty (ns)) + continue; + sb.AppendLine ($"using {ns};"); + } + } + + /// + /// Generic method that allows to call a emitter for ta type that will emit the binding code. All code generation + /// is very similar. Get create a tabbed string builder to write the code with the needed using statemens from + /// the original syntax tree and we pass it to the emitter that will generate the code. + /// + /// The generator context. + /// The compilation unit. + /// The base type declarations marked by the BindingTypeAttribute. + /// The type of type declaration. + static void GenerateCode (SourceProductionContext context, Compilation compilation, + ImmutableArray baseTypeDeclarations) where T : BaseTypeDeclarationSyntax + { + var rootContext = new RootBindingContext (compilation); + foreach (var baseTypeDeclarationSyntax in baseTypeDeclarations) { + var semanticModel = compilation.GetSemanticModel (baseTypeDeclarationSyntax.SyntaxTree); + if (semanticModel.GetDeclaredSymbol (baseTypeDeclarationSyntax) is not INamedTypeSymbol namedTypeSymbol) + continue; + + // init sb and add all the using statements from the base type declaration + var sb = new TabbedStringBuilder (new ()); + // let people know this is generated code + sb.AppendLine ("// "); + + // enable nullable! + sb.AppendLine (); + sb.AppendLine ("#nullable enable"); + sb.AppendLine (); + + CollectUsingStatements (baseTypeDeclarationSyntax.SyntaxTree, sb); + + + // delegate semantic model and syntax tree analysis to the emitter who will generate the code and knows + // best + if (ContextFactory.TryCreate (rootContext, semanticModel, namedTypeSymbol, baseTypeDeclarationSyntax, out var symbolBindingContext) + && EmitterFactory.TryCreate (symbolBindingContext, sb, out var emitter)) { + if (emitter.TryEmit (out var diagnostics)) { + // only add file when we do generate code + var code = sb.ToString (); + context.AddSource ($"{emitter.SymbolName}.g.cs", SourceText.From (code, Encoding.UTF8)); + } else { + // add to the diagnostics and continue to the next possible candidate + foreach (Diagnostic diagnostic in diagnostics) { + context.ReportDiagnostic (diagnostic); + } + } + + } else { + // we don't have a emitter for this type, so we can't generate the code, add a diagnostic letting the + // user we do not support what he is trying to do, this is a bug in the code generator and we + // cannot recover from it. We do not want to crash but we generate no code. + context.ReportDiagnostic (Diagnostic.Create (RBI0000, + baseTypeDeclarationSyntax.GetLocation (), + namedTypeSymbol.ToDisplayString ().Trim ())); + } + + } } } diff --git a/src/rgen/Microsoft.Macios.Generator/Context/ClassBindingContext.cs b/src/rgen/Microsoft.Macios.Generator/Context/ClassBindingContext.cs new file mode 100644 index 000000000000..8278c6437e6f --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Context/ClassBindingContext.cs @@ -0,0 +1,16 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Microsoft.Macios.Generator.Context; + +class ClassBindingContext : SymbolBindingContext { + public string RegisterName { get; init; } + + public ClassBindingContext (RootBindingContext context, SemanticModel semanticModel, + INamedTypeSymbol symbol, ClassDeclarationSyntax declarationSyntax) + : base (context, semanticModel, symbol, declarationSyntax) + { + RegisterName = + symbol.Name; //TODO: placeholder -> should this be extracted from the BindingTypeAttribute + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Context/ContextFactory.cs b/src/rgen/Microsoft.Macios.Generator/Context/ContextFactory.cs new file mode 100644 index 000000000000..0805f661df89 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Context/ContextFactory.cs @@ -0,0 +1,21 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Microsoft.Macios.Generator.Context; + +static class ContextFactory { + public static bool TryCreate (RootBindingContext context, SemanticModel semanticModel, + INamedTypeSymbol symbol, T declarationSyntax, [NotNullWhen (true)] out ISymbolBindingContext? bindingContext) where T : BaseTypeDeclarationSyntax + { + bindingContext = declarationSyntax switch { + ClassDeclarationSyntax c => Unsafe.As> ( + new ClassBindingContext (context, semanticModel, symbol, c)), + EnumDeclarationSyntax => new SymbolBindingContext (context, semanticModel, symbol, declarationSyntax), + _ => null + }; + return bindingContext is not null; + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Context/ISymbolBindingContext.cs b/src/rgen/Microsoft.Macios.Generator/Context/ISymbolBindingContext.cs new file mode 100644 index 000000000000..a9bc1f3c242f --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Context/ISymbolBindingContext.cs @@ -0,0 +1,19 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Microsoft.Macios.Generator.Context; + +/// +/// Interface that represents a symbol binding context. We use an interface to allow the usage of a coveriance type, +/// because it removes the need to a cast. +/// +/// The base type declaration whose context we have +interface ISymbolBindingContext where T : BaseTypeDeclarationSyntax { + T DeclarationSyntax { get; } + string Namespace { get; } + string SymbolName { get; } + RootBindingContext RootBindingContext { get; init; } + SemanticModel SemanticModel { get; init; } + INamedTypeSymbol Symbol { get; init; } + bool IsStatic { get; } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Context/RootBindingContext.cs b/src/rgen/Microsoft.Macios.Generator/Context/RootBindingContext.cs new file mode 100644 index 000000000000..64159cb0657b --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Context/RootBindingContext.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using Microsoft.CodeAnalysis; + +namespace Microsoft.Macios.Generator.Context; + +/// +/// Shared context through the entire code generation. This context allows to collect data that will be +/// later use to generate the Trampoline.g.cs file. once all classed are processed. +/// +/// The class also provides a number or properties that will allow to determine the platform we are binding and access +/// to the current compilation. +/// +class RootBindingContext { + readonly Dictionary _libraries = new (); + + public PlatformName CurrentPlatform { get; set; } + public Compilation Compilation { get; set; } + public bool BindThirdPartyLibrary { get; set; } + + public RootBindingContext (Compilation compilation) + { + Compilation = compilation; + CurrentPlatform = PlatformName.None; + // use the reference assembly to determine what platform we are binding + foreach (var referencedAssemblyName in compilation.ReferencedAssemblyNames) { + switch (referencedAssemblyName.Name) { + case "Microsoft.iOS": + CurrentPlatform = PlatformName.iOS; + break; + case "Microsoft.MacCatalyst": + CurrentPlatform = PlatformName.MacCatalyst; + break; + case "Microsoft.macOS": + CurrentPlatform = PlatformName.MacOSX; + break; + case "Microsoft.tvOS": + CurrentPlatform = PlatformName.TvOS; + break; + default: + CurrentPlatform = PlatformName.None; + break; + } + } + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Context/SymbolBindingContext.cs b/src/rgen/Microsoft.Macios.Generator/Context/SymbolBindingContext.cs new file mode 100644 index 000000000000..b3d0c24cfbb8 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Context/SymbolBindingContext.cs @@ -0,0 +1,36 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Microsoft.Macios.Generator.Context; + +class SymbolBindingContext { + + public RootBindingContext RootBindingContext { get; init; } + public SemanticModel SemanticModel { get; init; } + public INamedTypeSymbol Symbol { get; init; } + + public bool IsStatic => Symbol.IsStatic; + + public SymbolBindingContext (RootBindingContext rootBindingContext, + SemanticModel semanticModel, INamedTypeSymbol symbol) + { + RootBindingContext = rootBindingContext; + SemanticModel = semanticModel; + Symbol = symbol; + } + +} + +class SymbolBindingContext : SymbolBindingContext, ISymbolBindingContext where T : BaseTypeDeclarationSyntax { + + public T DeclarationSyntax { get; } + public string Namespace => Symbol.ContainingNamespace.ToDisplayString (); + public string SymbolName => Symbol.Name; + + public SymbolBindingContext (RootBindingContext rootBindingContext, + SemanticModel semanticModel, INamedTypeSymbol symbol, T declarationSyntax) + : base (rootBindingContext, semanticModel, symbol) + { + DeclarationSyntax = declarationSyntax; + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Emitters/ClassEmitter.cs b/src/rgen/Microsoft.Macios.Generator/Emitters/ClassEmitter.cs new file mode 100644 index 000000000000..0d56a01a1c10 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Emitters/ClassEmitter.cs @@ -0,0 +1,24 @@ +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis; +using Microsoft.Macios.Generator.Context; + +namespace Microsoft.Macios.Generator.Emitters; + +class ClassEmitter (ClassBindingContext context, TabbedStringBuilder builder) : ICodeEmitter { + public string SymbolName => context.SymbolName; + + public bool TryEmit ([NotNullWhen (false)] out ImmutableArray? diagnostics) + { + + builder.AppendLine (); + diagnostics = null; + // add the namespace and the class declaration + using (var namespaceBlock = builder.CreateBlock ($"namespace {context.Namespace}", true)) { + using (var classBlock = namespaceBlock.CreateBlock ($"public partial class {SymbolName}", true)) { + classBlock.AppendLine ("// TODO: add binding code here"); + } + } + return true; + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Emitters/EmitterFactory.cs b/src/rgen/Microsoft.Macios.Generator/Emitters/EmitterFactory.cs new file mode 100644 index 000000000000..7d9237ce35b5 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Emitters/EmitterFactory.cs @@ -0,0 +1,23 @@ +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.Macios.Generator.Context; + +namespace Microsoft.Macios.Generator.Emitters; + +/// +/// Returns the emitter that is related to the provided declaration type. +/// +static class EmitterFactory { + public static bool TryCreate (ISymbolBindingContext context, TabbedStringBuilder builder, + [NotNullWhen (true)] out ICodeEmitter? emitter) + where T : BaseTypeDeclarationSyntax + { + emitter = context switch { + ClassBindingContext classContext => new ClassEmitter (classContext, builder), + ISymbolBindingContext enumContext => new EnumEmitter (enumContext, builder), + ISymbolBindingContext interfaceContext => new InterfaceEmitter (interfaceContext, builder), + _ => null + }; + return emitter is not null; + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs b/src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs new file mode 100644 index 000000000000..b946986eac9f --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs @@ -0,0 +1,19 @@ +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.Macios.Generator.Context; + +namespace Microsoft.Macios.Generator.Emitters; + +class EnumEmitter (ISymbolBindingContext context, TabbedStringBuilder builder) + : ICodeEmitter { + + public string SymbolName => $"{context.SymbolName}Extensions"; + + public bool TryEmit ([NotNullWhen (false)] out ImmutableArray? diagnostics) + { + diagnostics = null; + return true; + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Emitters/ICodeEmitter.cs b/src/rgen/Microsoft.Macios.Generator/Emitters/ICodeEmitter.cs new file mode 100644 index 000000000000..d78584e82bb1 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Emitters/ICodeEmitter.cs @@ -0,0 +1,13 @@ +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis; + +namespace Microsoft.Macios.Generator.Emitters; + +/// +/// Interface to be implemented by all those classes that know how to emit code for a binding. +/// +interface ICodeEmitter { + public string SymbolName { get; } + bool TryEmit ([NotNullWhen (false)] out ImmutableArray? diagnostics); +} diff --git a/src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs b/src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs new file mode 100644 index 000000000000..23f77d0c4d76 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs @@ -0,0 +1,16 @@ +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.Macios.Generator.Context; + +namespace Microsoft.Macios.Generator.Emitters; + +class InterfaceEmitter (ISymbolBindingContext context, TabbedStringBuilder builder) : ICodeEmitter { + public string SymbolName { get; } = string.Empty; + public bool TryEmit ([NotNullWhen (false)] out ImmutableArray? diagnostics) + { + diagnostics = null; + return true; + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj b/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj index f9c73ed0396a..b27358da29cc 100644 --- a/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj +++ b/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj @@ -22,5 +22,32 @@ + + + <_Parameter1>Microsoft.Macios.Generator.Tests + + + + + + external\PlatformName.cs + + + external\PlatformNameExtensions.cs + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources1.Designer.cs + + + diff --git a/src/rgen/Microsoft.Macios.Generator/Resources.Designer.cs b/src/rgen/Microsoft.Macios.Generator/Resources.Designer.cs new file mode 100644 index 000000000000..f95e5360418d --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Resources.Designer.cs @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Macios.Generator { + using System; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { + get { + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Microsoft.Macios.Generator.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static string RBI0000Description { + get { + return ResourceManager.GetString("RBI0000Description", resourceCulture); + } + } + + internal static string RBI0000MessageFormat { + get { + return ResourceManager.GetString("RBI0000MessageFormat", resourceCulture); + } + } + + internal static string RBI0000Title { + get { + return ResourceManager.GetString("RBI0000Title", resourceCulture); + } + } + } +} diff --git a/src/rgen/Microsoft.Macios.Generator/Resources.resx b/src/rgen/Microsoft.Macios.Generator/Resources.resx new file mode 100644 index 000000000000..42a56d93c001 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/Resources.resx @@ -0,0 +1,34 @@ + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + An unexpected error happened while generating the code. No code will be added to the compilation + An optional longer localizable description of the diagnostic. + + + An unexpected error ocurred while process '{0}'. Please fill a bug report at https://github.com/xamarin/xamarin-macios/issues/new + The format-able message the diagnostic displays. + + + Unexpected error + The title of the diagnostic. + + \ No newline at end of file diff --git a/src/rgen/Microsoft.Macios.Generator/TabbedStringBuilder.cs b/src/rgen/Microsoft.Macios.Generator/TabbedStringBuilder.cs new file mode 100644 index 000000000000..ea4e83625875 --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/TabbedStringBuilder.cs @@ -0,0 +1,227 @@ +using System; +using System.Diagnostics.Contracts; +using System.Runtime.CompilerServices; +using System.Text; + +namespace Microsoft.Macios.Generator; + + +/// +/// String builder wrapper that keeps track of the current indentation level by abusing the IDisposable pattern. Rather +/// than dispose data, what the IDisposable pattern allows is to create a new block with an increased indentation, that +/// way we do not need to keep track of the current indentation level. +/// +/// var classBlock = new TabbedStringBuilder (sb); +/// classBlock.AppendLine ("public static NSString? GetConstant (this {enumSymbol.Name} self)"); +/// // open a new {} block, no need to keep track of the indentation, the new block has it +/// using (var getConstantBlock = classBlock.CreateBlock (isBlock: true)) { +/// // write the contents of the method here. +/// } +/// +/// +class TabbedStringBuilder : IDisposable { + readonly StringBuilder sb; + readonly uint tabCount; + readonly bool isBlock; + bool disposed; + + /// + /// Created a new tabbed string builder that will use the given sb to write code. + /// + /// The string builder to be used to write code. + /// The original tab size. + /// States if we are creating a {} block. + public TabbedStringBuilder (StringBuilder builder, uint currentCount = 0, bool block = false) + { + sb = builder; + isBlock = block; + if (isBlock) { + // increase by 1 because we are in a block + tabCount = currentCount; + WriteTabs ().Append ('{').AppendLine (); + tabCount++; + } else { + tabCount = currentCount; + } + } + + StringBuilder WriteTabs () => sb.Append ('\t', (int) tabCount); + + /// + /// Append a new empty line to the string builder using the correct tab size. + /// + /// The current tabbed string builder. + public TabbedStringBuilder AppendLine () + { + sb.AppendLine (); + return this; + } + + /// + /// Append conteng, but do not add a \n + /// + /// The content to append. + /// The current builder. + public TabbedStringBuilder Append (string line) + { + if (string.IsNullOrWhiteSpace (line)) { + sb.Append (line); + } else { + WriteTabs ().Append (line); + } + return this; + } + + /// + /// Append conteng, but do not add a \n + /// + /// The content to append. + /// The current builder. + public TabbedStringBuilder Append (ReadOnlySpan span) + { + if (span.IsWhiteSpace ()) { + sb.Append (span); + } else { + WriteTabs ().Append (span); + } + + return this; + } + + /// + /// Append a new tabbed line. + /// + /// The line to append. + /// The current builder. + public TabbedStringBuilder AppendLine (string line) + { + if (string.IsNullOrWhiteSpace (line)) { + sb.AppendLine (line); + } else { + WriteTabs ().AppendLine (line); + } + return this; + } + + /// + /// Append a new tabbed lien from the span. + /// + /// The line to append. + /// The current builder. + public TabbedStringBuilder AppendLine (ReadOnlySpan span) + { + if (span.IsWhiteSpace ()) { + sb.Append (span).AppendLine (); + } else { + WriteTabs ().Append (span).AppendLine (); + } + + return this; + } + + public TabbedStringBuilder Append (ref DefaultInterpolatedStringHandler handler) + { + WriteTabs ().Append (handler.ToStringAndClear ()); + return this; + } + + public TabbedStringBuilder AppendLine (ref DefaultInterpolatedStringHandler handler) + { + WriteTabs ().Append (handler.ToStringAndClear ()).AppendLine (); + return this; + } + + /// + /// Append a new raw literal by prepending the correct indentation. + /// + /// The raw string to append. + /// The current builder. + public TabbedStringBuilder AppendRaw (string rawString) + { + // we will split the raw string in lines and then append them so that the + // tabbing is correct + var lines = rawString.AsSpan ().Split ('\n'); + var count = 0; + foreach (var range in lines) { + if (count > 0) + AppendLine (); + var line = rawString.AsSpan (range); + Append (line); + count++; + } + return this; + } + + /// + /// Append the generated code attribute to the current string builder. Added for convenience. + /// + /// If the binding is Optimizable or not. + /// The current builder. + public TabbedStringBuilder AppendGeneratedCodeAttribute (bool optimizable = true) + { + if (optimizable) { + const string attr = "[BindingImpl (BindingImplOptions.GeneratedCode | BindingImplOptions.Optimizable)]"; + AppendLine (attr); + } else { + const string attr = "[BindingImpl (BindingImplOptions.GeneratedCode)]"; + AppendLine (attr); + } + + return this; + } + + /// + /// Append a EditorBrowsable attribute. Added for convenience. + /// + /// The current builder. + public TabbedStringBuilder AppendEditorBrowsableAttribute () + { + const string attr = "[EditorBrowsable (EditorBrowsableState.Never)]"; + AppendLine (attr); + return this; + } + + /// + /// Create a bew empty block. + /// + /// If it is a block that uses {} or not. + /// The new bloc. + public TabbedStringBuilder CreateBlock (bool block) => CreateBlock (string.Empty, block); + + /// + /// Create a new block with the given line. This method can be used to write if/else statements. + /// + /// The new line to append + /// If the new line should considered a block. + /// The current builder. + public TabbedStringBuilder CreateBlock (string line, bool block) + { + if (!string.IsNullOrEmpty (line)) { + WriteTabs ().AppendLine (line); + } + + return new TabbedStringBuilder (sb, tabCount, block); + } + + /// + /// Return the string builder as a string. + /// + /// + public override string ToString () + { + Dispose (); + return sb.ToString (); + } + + /// + /// Does not really dispose anything, it just closes the current block. + /// + public void Dispose () + { + if (disposed || !isBlock) return; + + disposed = true; + sb.Append ('\t', (int) tabCount - 1); + sb.Append ('}').AppendLine (); + } +} diff --git a/tests/generator/PlatformNameExtensionsTests.cs b/tests/generator/PlatformNameExtensionsTests.cs index e955c69ab010..6daef60a5042 100644 --- a/tests/generator/PlatformNameExtensionsTests.cs +++ b/tests/generator/PlatformNameExtensionsTests.cs @@ -17,7 +17,10 @@ public class PlatformNameExtensions { [TestCase (PlatformName.MacCatalyst, "UIApplication")] [TestCase (PlatformName.MacOSX, "NSApplication")] public void GetApplicationClassNameTest (PlatformName platformName, string expected) - => Assert.AreEqual (expected, platformName.GetApplicationClassName ()); + { + Assert.True (platformName.TryGetApplicationClassName (out var applicationClassName)); + Assert.AreEqual (expected, applicationClassName); + } [TestCase (PlatformName.MacOSX, 2)] [TestCase (PlatformName.iOS, 2)] diff --git a/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs index 48cba5be3fbd..67c715043299 100644 --- a/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs +++ b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/BindingTypeSemanticAnalyzerTests.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Xamarin.Tests; @@ -27,10 +28,11 @@ public class Examples { var compilation = CreateCompilation (nameof (CompareGeneratedCode), platform, inputText); var diagnostics = await RunAnalyzer (new BindingTypeSemanticAnalyzer (), compilation); - Assert.Single (diagnostics); + var analyzerDiagnotics = diagnostics + .Where (d => d.Id == BindingTypeSemanticAnalyzer.DiagnosticId).ToArray (); + Assert.Single (analyzerDiagnotics); // verify the diagnostic message - var location = diagnostics [0].Location; - VerifyDiagnosticMessage (diagnostics [0], BindingTypeSemanticAnalyzer.DiagnosticId, + VerifyDiagnosticMessage (analyzerDiagnotics [0], BindingTypeSemanticAnalyzer.DiagnosticId, DiagnosticSeverity.Error, "The binding type 'Test.Examples' must declared as a partial class"); } } diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs b/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs index a101ccbbd214..fd8738e7d3e3 100644 --- a/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs @@ -1,5 +1,4 @@ using System.Linq; -using Microsoft.CodeAnalysis.CSharp; using Xamarin.Tests; using Xamarin.Utils; using Xunit; @@ -9,36 +8,52 @@ namespace Microsoft.Macios.Generator.Tests; // Unit test that ensures that all the generator attributes are correctly added in the compilation initialization public class BindingSourceGeneratorGeneratorTests : BaseGeneratorTestClass { - const string SampleBindingType = @" + const string usingImportInput = @" +using System; +using Foundation; +using ObjCBindings; namespace TestNamespace; [BindingType (Name = ""AVAudioPCMBuffer"")] -interface AVAudioPcmBuffer : AVAudioBuffer { +public partial class AVAudioPcmBuffer : AVAudioBuffer { +} +"; + + const string usingImportOutput = @"// + +#nullable enable + +using System; +using Foundation; +using ObjCBindings; + +namespace TestNamespace +{ + public partial class AVAudioPcmBuffer + { + // TODO: add binding code here + } } "; [Theory] - [PlatformInlineData (ApplePlatform.iOS)] - [PlatformInlineData (ApplePlatform.TVOS)] - [PlatformInlineData (ApplePlatform.MacOSX)] - [PlatformInlineData (ApplePlatform.MacCatalyst)] - public void AttributesAreNotPresent (ApplePlatform platform) + [PlatformInlineData (ApplePlatform.iOS, usingImportInput, usingImportOutput)] + [PlatformInlineData (ApplePlatform.TVOS, usingImportInput, usingImportOutput)] + [PlatformInlineData (ApplePlatform.MacOSX, usingImportInput, usingImportOutput)] + [PlatformInlineData (ApplePlatform.MacCatalyst, usingImportInput, usingImportOutput)] + public void CorrectUsingImports (ApplePlatform platform, string input, string expectedOutput) { // We need to create a compilation with the required source code. - var compilation = CreateCompilation (nameof (AttributesAreNotPresent), - platform, SampleBindingType); + var compilation = CreateCompilation (nameof (CorrectUsingImports), + platform, usingImportInput); // Run generators and retrieve all results. var runResult = _driver.RunGenerators (compilation).GetRunResult (); + Assert.Empty (runResult.Diagnostics); // ensure that we do have all the needed attributes present - var expectedGeneratedAttributes = new [] { - "BindingTypeAttribute.g.cs", - }; - - foreach (string generatedAttribute in expectedGeneratedAttributes) { - var generatedFile = runResult.GeneratedTrees.SingleOrDefault (t => t.FilePath.EndsWith (generatedAttribute)); - Assert.Null (generatedFile); - } + var generatedFile = runResult.GeneratedTrees.SingleOrDefault (t => t.FilePath.EndsWith ("AVAudioPcmBuffer.g.cs")); + Assert.NotNull (generatedFile); + Assert.Equal (expectedOutput, generatedFile.GetText ().ToString ()); } } diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/TabbedStringBuilderTests.cs b/tests/rgen/Microsoft.Macios.Generator.Tests/TabbedStringBuilderTests.cs new file mode 100644 index 000000000000..0333e5b138d0 --- /dev/null +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/TabbedStringBuilderTests.cs @@ -0,0 +1,209 @@ +using System.Text; +using Xunit; + +namespace Microsoft.Macios.Generator.Tests; + +public class TabbedStringBuilderTests { + StringBuilder sb; + + public TabbedStringBuilderTests () + { + sb = new (); + } + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void ConstructorNotBlockTest (uint tabCount, string expectedTabs) + { + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + block.AppendLine ("Test"); + result = block.ToString (); + } + Assert.Equal ($"{expectedTabs}Test\n", result); + } + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void ConstructorBlockTest (uint tabCount, string expectedTabs) + { + string result; + using (var block = new TabbedStringBuilder (sb, tabCount, true)) { + block.AppendLine ("Test"); + result = block.ToString (); + } + Assert.Equal ($"{expectedTabs}{{\n{expectedTabs}\tTest\n{expectedTabs}}}\n", result); + } + + [Theory] + [InlineData (0)] + [InlineData (1)] + [InlineData (5)] + public void AppendLineTest (uint tabCount) + { + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + block.AppendLine (); + result = block.ToString (); + } + // an empty line should have not tabs + Assert.Equal ("\n", result); + } + + [Theory] + [InlineData ("// test comment", 0, "")] + [InlineData ("var t = 1;", 1, "\t")] + [InlineData ("Console.WriteLine (\"1\");", 5, "\t\t\t\t\t")] + public void AppendLineStringTest (string line, uint tabCount, string expectedTabs) + { + string result; + using (var block = new TabbedStringBuilder (sb, tabCount, true)) { + block.AppendLine (line); + result = block.ToString (); + } + Assert.Equal ($"{expectedTabs}{{\n{expectedTabs}\t{line}\n{expectedTabs}}}\n", result); + } + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void AppendInterpolatedLineTest (uint tabCount, string expectedTabs) + { + string result; + var val1 = "Hello"; + var val2 = "World"; + var val3 = '!'; + var line = "Hello World!"; + var expected = $"{expectedTabs}{{\n{expectedTabs}\t{line}\n{expectedTabs}}}\n"; + using (var block = new TabbedStringBuilder (sb, tabCount, true)) { + block.AppendLine ($"{val1} {val2}{val3}"); + result = block.ToString (); + } + Assert.Equal (expected, result); + } + + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void AppendRawTest (uint tabCount, string expectedTabs) + { + var input = @" +## Raw string +Because we are using a raw string we expected: + 1. The string to be split in lines + 2. All lines should have the right indentation + - This means nested one + 3. And all lines should have the correct tabs +"; + var expected = $@" +{expectedTabs}## Raw string +{expectedTabs}Because we are using a raw string we expected: +{expectedTabs} 1. The string to be split in lines +{expectedTabs} 2. All lines should have the right indentation +{expectedTabs} - This means nested one +{expectedTabs} 3. And all lines should have the correct tabs +"; + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + block.AppendRaw (input); + result = block.ToString (); + } + Assert.Equal (expected, result); + } + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void AppendGeneratedCodeAttributeTest (uint tabCount, string expectedTabs) + { + var expected = $"{expectedTabs}[BindingImpl (BindingImplOptions.GeneratedCode)]\n"; + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + block.AppendGeneratedCodeAttribute (false); + result = block.ToString (); + } + Assert.Equal (expected, result); + } + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void AppendGeneratedCodeAttributeOptimizableTest (uint tabCount, string expectedTabs) + { + var expected = $"{expectedTabs}[BindingImpl (BindingImplOptions.GeneratedCode | BindingImplOptions.Optimizable)]\n"; + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + block.AppendGeneratedCodeAttribute (); + result = block.ToString (); + } + Assert.Equal (expected, result); + } + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void AppendEditorBrowsableAttributeTest (uint tabCount, string expectedTabs) + { + var expected = $"{expectedTabs}[EditorBrowsable (EditorBrowsableState.Never)]\n"; + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + block.AppendEditorBrowsableAttribute (); + result = block.ToString (); + } + Assert.Equal (expected, result); + } + + [Theory] + [InlineData (0, "")] + [InlineData (1, "\t")] + [InlineData (5, "\t\t\t\t\t")] + public void CreateEmptyBlockTest (uint tabCount, string expectedTabs) + { + var blockContent = "// the test"; + var expected = $@"{expectedTabs}{{ +{expectedTabs}{"\t"}{blockContent} +{expectedTabs}}} +"; + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + using (var nested = block.CreateBlock (true)) { + nested.AppendLine (blockContent); + } + result = block.ToString (); + } + Assert.Equal (expected, result); + } + + [Theory] + [InlineData (0, "", "if (true)")] + [InlineData (1, "\t", "using (var t = new StringBuilder)")] + [InlineData (5, "\t\t\t\t\t", "fixed (*foo)")] + public void CreateBlockTest (uint tabCount, string expectedTabs, string blockType) + { + var blockContent = "// the test"; + var expected = $@"{expectedTabs}{blockType} +{expectedTabs}{{ +{expectedTabs}{"\t"}{blockContent} +{expectedTabs}}} +"; + string result; + using (var block = new TabbedStringBuilder (sb, tabCount)) { + using (var nested = block.CreateBlock (blockType, true)) { + nested.AppendLine (blockContent); + } + result = block.ToString (); + } + Assert.Equal (expected, result); + } + +} From b55a9996cbadf82c31a8d141cf44d6158b59480d Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 16:34:32 +0200 Subject: [PATCH 094/155] [devops] Clean previously downloaded artifacts. (#21483) Also: * Improve file listing by not wrapping output. * Be a bit more descriptive in step display names. --- tools/devops/automation/templates/tests/build.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/devops/automation/templates/tests/build.yml b/tools/devops/automation/templates/tests/build.yml index 98c2482478b9..d52870fe1de5 100644 --- a/tools/devops/automation/templates/tests/build.yml +++ b/tools/devops/automation/templates/tests/build.yml @@ -155,6 +155,12 @@ steps: # use a diff step depending if we have been trigger by a pipeline of by a PR/Commit - ${{ if or(contains(variables['Build.Reason'], 'ResourceTrigger'), contains(variables['Build.Reason'], 'BuildCompletion'), contains(variables['Build.DefinitionName'], 'xamarin-macios-ci-tests'), contains(variables['Build.DefinitionName'], 'xamarin-macios-pr-tests')) }}: + - bash: | + ls -la "$PIPELINE_WORKSPACE/macios" || true + rm -Rf "$PIPELINE_WORKSPACE/macios" + displayName: "Remove previously downloaded artifacts" + condition: always() + - download: macios displayName: Download WorkloadRollback.json artifact: WorkloadRollback @@ -168,8 +174,8 @@ steps: artifact: package-test-libraries - pwsh: | - Get-ChildItem -Path "$(Pipeline.Workspace)/macios" -Recurse -Force - displayName: 'Display downloads' + Get-ChildItem -Path "$(Pipeline.Workspace)/macios" -Recurse -Force | Format-Table -AutoSize | Out-String -Width 1000 + displayName: 'List downloaded macios artifacts' timeoutInMinutes: 5 # the default location when downloading is $(Pipeline.Workspace)// @@ -204,8 +210,8 @@ steps: # print the downloads to make our life easier on debug - pwsh: | - Get-ChildItem -Path $(Build.SourcesDirectory)/artifacts -Recurse -Force - displayName: 'Display downloads' + Get-ChildItem -Path $(Build.SourcesDirectory)/artifacts -Recurse -Force | Format-Table -AutoSize | Out-String -Width 1000 + displayName: 'List downloaded artifacts' timeoutInMinutes: 5 - bash: | From d30fd58018c379192cecf428bb53b93da56b8554 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 16:34:52 +0200 Subject: [PATCH 095/155] [xibuild] Remove. (#21482) This is a tool used to build legacy projects, so it's no longer needed. I haven't removed everything that depends on xibuild, in particular some of the tests need to be ported to .NET instead of just removed. --- Make.config | 3 - mk/quiet.mk | 1 - tests/common/Configuration.cs | 4 - tests/common/ExecutionHelper.cs | 2 +- tests/common/Tool.cs | 17 +- tests/common/mac/ProjectTestHelpers.cs | 6 +- tests/generator/Makefile | 2 +- tests/mac-binding-project/Makefile | 44 --- tests/mmp-regression/Makefile | 2 +- tests/mmptest/Makefile | 4 +- .../ProjectsTests/ProjectReference.cs | 2 +- .../TestHelpers/BuildEngine.cs | 18 +- tests/mtouch/Makefile | 2 +- tests/xharness/AppBundleLocator.cs | 9 +- tests/xharness/Harness.cs | 4 +- tests/xharness/IHarness.cs | 1 - .../Jenkins/TestTasks/BuildProjectTask.cs | 3 - .../Jenkins/TestTasks/NUnitExecuteTask.cs | 45 +--- tools/Makefile | 5 - tools/autoformat.sh | 1 - .../automation/templates/tests/run-tests.yml | 8 - tools/xibuild/Main.cs | 252 ------------------ tools/xibuild/Makefile | 14 - tools/xibuild/xibuild | 10 - tools/xibuild/xibuild.csproj | 50 ---- 25 files changed, 19 insertions(+), 490 deletions(-) delete mode 100644 tools/xibuild/Main.cs delete mode 100644 tools/xibuild/Makefile delete mode 100755 tools/xibuild/xibuild delete mode 100644 tools/xibuild/xibuild.csproj diff --git a/Make.config b/Make.config index d06bfee12b41..5504de0eb07b 100644 --- a/Make.config +++ b/Make.config @@ -580,9 +580,6 @@ SYSTEM_XBUILD=$(MONO_PREFIX)/bin/msbuild /p:Features=strict /m SYSTEM_MSBUILD=unset MSBuildExtensionsPath && $(MONO_PREFIX)/bin/msbuild /p:Features=strict /m SYSTEM_RESGEN=$(MONO_PREFIX)/bin/resgen -XIBUILD_EXE_PATH=$(abspath $(TOP)/tools/xibuild/bin/Debug/xibuild.exe) -SYSTEM_XIBUILD=$(SYSTEM_MONO) $(XIBUILD_EXE_PATH) $(XIBUILD_VERBOSITY) - PKG_CONFIG=$(MONO_PREFIX)/bin/pkg-config MAC_PRODUCT=Xamarin.Mac diff --git a/mk/quiet.mk b/mk/quiet.mk index 33becd20356b..52062f906ede 100644 --- a/mk/quiet.mk +++ b/mk/quiet.mk @@ -104,4 +104,3 @@ ZIP_VERBOSITY=--verbose endif MSBUILD_VERBOSITY=$(XBUILD_VERBOSITY) MSBUILD_VERBOSITY_QUIET=$(XBUILD_VERBOSITY_QUIET) -XIBUILD_VERBOSITY=$(XBUILD_VERBOSITY) diff --git a/tests/common/Configuration.cs b/tests/common/Configuration.cs index 741c1c2fd21d..5180583bfda9 100644 --- a/tests/common/Configuration.cs +++ b/tests/common/Configuration.cs @@ -915,10 +915,6 @@ public static string NuGetPackagesDirectory { } } - public static string XIBuildPath { - get { return Path.GetFullPath (Path.Combine (RootPath, "tools", "xibuild", "xibuild")); } - } - public static string CloneTestDirectory (string directory) { // Copy the test projects to a temporary directory so that we can run the tests from there without affecting the working directory. diff --git a/tests/common/ExecutionHelper.cs b/tests/common/ExecutionHelper.cs index d0315a82d777..7bc4e94b1be4 100644 --- a/tests/common/ExecutionHelper.cs +++ b/tests/common/ExecutionHelper.cs @@ -10,7 +10,7 @@ namespace Xamarin.Tests { class XBuild { public static string ToolPath { get { - return Configuration.XIBuildPath; + throw new NotSupportedException ("Legacy projects not supported anymore"); } } diff --git a/tests/common/Tool.cs b/tests/common/Tool.cs index d20537227fa7..0bd8879c058c 100644 --- a/tests/common/Tool.cs +++ b/tests/common/Tool.cs @@ -127,22 +127,7 @@ public int Execute (string toolPath, IList arguments) public int Execute (string toolPath, IList arguments, bool always_show_output) { - output.Clear (); - output_lines = null; - - var args = new List (); - args.Add ("-t"); - args.Add ("--"); - args.Add (toolPath); - args.AddRange (arguments); - var rv = ExecutionHelper.Execute (Configuration.XIBuildPath, args, EnvironmentVariables, output, output, workingDirectory: WorkingDirectory); - - if ((rv != 0 || always_show_output) && output.Length > 0) - Console.WriteLine ("\t" + output.ToString ().Replace ("\n", "\n\t")); - - ParseMessages (); - - return rv; + throw new NotSupportedException ("Legacy projects not supported anymore"); } static bool IndexOfAny (string line, out int start, out int end, params string [] values) diff --git a/tests/common/mac/ProjectTestHelpers.cs b/tests/common/mac/ProjectTestHelpers.cs index 1b34a84a0152..ec76c115812b 100644 --- a/tests/common/mac/ProjectTestHelpers.cs +++ b/tests/common/mac/ProjectTestHelpers.cs @@ -193,7 +193,7 @@ public static string RunAndAssert (string exe, IList args, string stepNa // In most cases we generate projects in tmp and this is not needed. But nuget and test projects can make that hard public static void CleanUnifiedProject (string csprojTarget) { - RunAndAssert (Configuration.XIBuildPath, new [] { "--", csprojTarget, "/t:clean" }, "Clean", environment: Configuration.GetBuildEnvironment (ApplePlatform.MacOSX)); + RunAndAssert ("Legacy projects not supported anymore", new [] { "--", csprojTarget, "/t:clean" }, "Clean", environment: Configuration.GetBuildEnvironment (ApplePlatform.MacOSX)); } public static BuildResult BuildProject (string csprojTarget, bool shouldFail = false, bool release = false, Dictionary environment = null, IList extraArgs = null) @@ -227,7 +227,7 @@ public static BuildResult BuildProject (string csprojTarget, bool shouldFail = f }; buildArgs.Insert (0, "--"); - RunAndAssert (Configuration.XIBuildPath, buildArgs, "Compile", shouldFail, getBuildProjectErrorInfo, environment); + RunAndAssert ("Legacy projects not supported anymore", buildArgs, "Compile", shouldFail, getBuildProjectErrorInfo, environment); return new BuildResult (binlog); } @@ -505,7 +505,7 @@ static string GenerateOutputCommand (string tmpDir, Guid guid) public static bool TryNugetRestore (string project, out StringBuilder output) { output = new StringBuilder (); - var rv = ExecutionHelper.Execute (Configuration.XIBuildPath, new [] { $"--", "/t:Restore", project }, stdout: output, stderr: output, environmentVariables: Configuration.GetBuildEnvironment (ApplePlatform.MacOSX)); + var rv = ExecutionHelper.Execute ("Legacy projects not supported anymore", new [] { $"--", "/t:Restore", project }, stdout: output, stderr: output, environmentVariables: Configuration.GetBuildEnvironment (ApplePlatform.MacOSX)); return rv == 0; } diff --git a/tests/generator/Makefile b/tests/generator/Makefile index 64bf43e20eaa..d867bc0727aa 100644 --- a/tests/generator/Makefile +++ b/tests/generator/Makefile @@ -12,7 +12,7 @@ export XamarinMacFrameworkRoot=$(MAC_DESTDIR)/Library/Frameworks/Xamarin.Mac.fra all-local:: run-unit-tests build-unit-tests: - $(Q_XBUILD) $(SYSTEM_XIBUILD) -t -- /Library/Frameworks//Mono.framework/Versions/Current/lib/mono/nuget/NuGet.exe restore $(TOP)/src/generator.sln + $(Q_XBUILD) $(SYSTEM_MSBUILD) -t -- /Library/Frameworks//Mono.framework/Versions/Current/lib/mono/nuget/NuGet.exe restore $(TOP)/src/generator.sln $(SYSTEM_MSBUILD) generator-tests.csproj $(XBUILD_VERBOSITY) run-tests run-unit-tests: build-unit-tests diff --git a/tests/mac-binding-project/Makefile b/tests/mac-binding-project/Makefile index 4b88693c821a..9a8d411caf9d 100644 --- a/tests/mac-binding-project/Makefile +++ b/tests/mac-binding-project/Makefile @@ -25,50 +25,6 @@ bin/SimpleClass.%.a: ../common/mac/SimpleClass.m bin bin/SimpleClassStatic.a: bin/SimpleClass.x86_64.a | bin $(Q) $(CP) $< $@ -bin/Mobile-dynamic/MobileBinding.dll: bin/SimpleClassDylib.dylib - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileBinding/MobileBinding_dynamic.csproj - -bin/Mobile-dynamic-newstyle/MobileBinding.dll: bin/SimpleClassDylib.dylib - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileBinding/MobileBinding_dynamic_newstyle.csproj - -bin/Mobile-dynamic-spaces/Mobile\ Binding.dll: bin/SimpleClass\ Dylib.dylib - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileBinding/MobileBinding_dynamic_spaces.csproj - -bin/Mobile-static/MobileBinding.dll: bin/SimpleClassStatic.a - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileBinding/MobileBinding_static.csproj - -bin/Mobile-static-newstyle/MobileBinding.dll: bin/SimpleClassStatic.a - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileBinding/MobileBinding_static_newstyle.csproj - - -bin/Mobile-framework/MobileBinding.dll: - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileBinding/MobileBinding_framework.csproj - - -bin/MobileTest-static/MobileTestApp.app/Contents/MacOS/MobileTestApp: bin/Mobile-static/MobileBinding.dll - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileTestApp/MobileTestApp_static.csproj - -bin/MobileTest-static-newstyle/MobileTestApp.app/Contents/MacOS/MobileTestApp: bin/Mobile-static-newstyle/MobileBinding.dll - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileTestApp/MobileTestApp_static_newstyle.csproj - -bin/MobileTest-withLinker/MobileTestApp.app/Contents/MacOS/MobileTestApp: bin/Mobile-static/MobileBinding.dll - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileTestApp/MobileTestApp_WithLinker.csproj - -bin/MobileTest-dynamic/MobileTestApp.app/Contents/MacOS/MobileTestApp: bin/Mobile-dynamic/MobileBinding.dll - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileTestApp/MobileTestApp_dynamic.csproj - -bin/MobileTest-dynamic-newstyle/MobileTestApp.app/Contents/MacOS/MobileTestApp: bin/Mobile-dynamic-newstyle/MobileBinding.dll - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileTestApp/MobileTestApp_dynamic_newstyle.csproj - -bin/MobileTest-dynamic-spaces/MobileTestApp.app/Contents/MacOS/MobileTestApp: bin/Mobile-dynamic-spaces/Mobile\ Binding.dll - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileTestApp/MobileTestApp_dynamic_spaces.csproj - -bin/MobileTest-framework/MobileTestApp.app/Contents/MacOS/MobileTestApp: bin/Mobile-framework/MobileBinding.dll - $(Q) $(SYSTEM_XIBUILD) -- $(XBUILD_VERBOSITY) MobileTestApp/MobileTestApp_framework.csproj - - - - test-static:: bin/MobileTest-static/MobileTestApp.app/Contents/MacOS/MobileTestApp bin/MobileTest-static-newstyle/MobileTestApp.app/Contents/MacOS/MobileTestApp $(Q) ./bin/MobileTest-static/MobileTestApp.app/Contents/MacOS/MobileTestApp 2>&1 | grep 42 > /dev/null $(Q) ./bin/MobileTest-static-newstyle/MobileTestApp.app/Contents/MacOS/MobileTestApp 2>&1 | grep 42 > /dev/null diff --git a/tests/mmp-regression/Makefile b/tests/mmp-regression/Makefile index da4f7a154f47..18dfb9b18fa9 100644 --- a/tests/mmp-regression/Makefile +++ b/tests/mmp-regression/Makefile @@ -35,7 +35,7 @@ all-local:: run CONFIG?=Debug $(foreach test,$(ALL_TESTS),$(test)/bin): dylib/libTest.dylib - $(QF_GEN) if ! $(SYSTEM_XIBUILD) -- $(@D)/$(@D).csproj /p:Configuration=$(CONFIG); then EC=$$?; rm -Rf $@; exit $$EC; fi + $(QF_GEN) if ! $(SYSTEM_MSBUILD) -- $(@D)/$(@D).csproj /p:Configuration=$(CONFIG); then EC=$$?; rm -Rf $@; exit $$EC; fi dylib/libTest.dylib: dylib/src.c $(QF_GEN) $(XCODE_CC) $< -o$@ -arch x86_64 -shared -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib diff --git a/tests/mmptest/Makefile b/tests/mmptest/Makefile index 6d43fc541978..14eb41a35da9 100644 --- a/tests/mmptest/Makefile +++ b/tests/mmptest/Makefile @@ -37,8 +37,8 @@ run: build @[[ ! -e .failed-stamp ]] build: - $(Q_XBUILD) $(SYSTEM_XIBUILD) -t -- /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/nuget/NuGet.exe restore ../tests-mac.sln - $(SYSTEM_XIBUILD) -- mmptest.csproj $(XBUILD_VERBOSITY) + $(Q_XBUILD) $(SYSTEM_MSBUILD) -t -- /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/nuget/NuGet.exe restore ../tests-mac.sln + $(SYSTEM_MSBUILD) mmptest.csproj $(XBUILD_VERBOSITY) clean-local:: @rm -rf ./obj diff --git a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/ProjectReference.cs b/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/ProjectReference.cs index 0f9bef6e937c..c21fc0dc3eb8 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/ProjectReference.cs +++ b/tests/msbuild/Xamarin.MacDev.Tests/ProjectsTests/ProjectReference.cs @@ -25,7 +25,7 @@ public void BasicTest () NugetRestore (Path.Combine (Configuration.TestProjectsDirectory, "MyExtensionWithPackageReference", "MyExtensionWithPackageReference.csproj")); // Can't use the in-process MSBuild engine, because it complains that the project file is invalid (the attribute 'Version' in the element '' is unrecognized) - var rv = ExecutionHelper.Execute (Configuration.XIBuildPath, new [] { "--", Path.Combine (Configuration.TestProjectsDirectory, "MyAppWithPackageReference", "MyAppWithPackageReference.csproj"), $"/p:Platform={Platform}", "/p:Configuration=Debug" }, out var output); + var rv = ExecutionHelper.Execute ("Legacy projects not supported anymore", new [] { "--", Path.Combine (Configuration.TestProjectsDirectory, "MyAppWithPackageReference", "MyAppWithPackageReference.csproj"), $"/p:Platform={Platform}", "/p:Configuration=Debug" }, out var output); if (rv != 0) { Console.WriteLine ("Build failed:"); Console.WriteLine (output); diff --git a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs index 8043c1875436..f89ef2500cc2 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs +++ b/tests/msbuild/Xamarin.MacDev.Tests/TestHelpers/BuildEngine.cs @@ -238,23 +238,7 @@ static ExecutionResult MSBuild (ApplePlatform platform, string project, string t if (!File.Exists (project)) throw new FileNotFoundException ($"The project file '{project}' does not exist."); - var args = new List (); - args.Add ("--"); - args.Add ($"/t:{target}"); - args.Add (project); - if (properties is not null) { - foreach (var prop in properties) - args.Add ($"/p:{prop.Key}={prop.Value}"); - } - var binlog = Path.Combine (Path.GetDirectoryName (project)!, $"log-{target}-{DateTime.Now:yyyyMMdd_HHmmss}.binlog"); - args.Add ($"/bl:{binlog}"); - - var output = new StringBuilder (); - var executable = Configuration.XIBuildPath; - var rv = Execution.RunWithStringBuildersAsync (executable, args, Configuration.GetBuildEnvironment (platform), output, output, Console.Out, workingDirectory: Path.GetDirectoryName (project), timeout: TimeSpan.FromMinutes (10)).Result; - return new ExecutionResult (output, output, rv.ExitCode) { - BinLogPath = binlog, - }; + throw new NotSupportedException ("Legacy projects not supported anymore"); } } } diff --git a/tests/mtouch/Makefile b/tests/mtouch/Makefile index 088f8dd8261e..14d40beb8c8e 100644 --- a/tests/mtouch/Makefile +++ b/tests/mtouch/Makefile @@ -32,7 +32,7 @@ mtouchtests.csproj.inc: export BUILD_VERBOSITY=$(MSBUILD_VERBOSITY) -include mtouchtests.csproj.inc bin/Debug/mtouchtests.dll: $(mtouchtests_dependencies) - $(SYSTEM_XIBUILD) -- mtouchtests.csproj /r $(XBUILD_VERBOSITY) /bl + $(SYSTEM_MSBUILD) mtouchtests.csproj /r $(XBUILD_VERBOSITY) /bl $(Q) rm -f .failed-stamp $(abspath $(TOP)/tools/mtouch/Constants.cs): diff --git a/tests/xharness/AppBundleLocator.cs b/tests/xharness/AppBundleLocator.cs index c69cf14519d5..3257b5f01250 100644 --- a/tests/xharness/AppBundleLocator.cs +++ b/tests/xharness/AppBundleLocator.cs @@ -16,7 +16,6 @@ namespace Xharness { public class AppBundleLocator : IAppBundleLocator { readonly IProcessManager processManager; readonly Func getLog; - readonly string msBuildPath; readonly string systemDotnetPath; readonly string dotnetPath; @@ -24,11 +23,10 @@ public class AppBundleLocator : IAppBundleLocator { // config file found in the specified directory or any containing directories. readonly Dictionary dotnet_executables = new Dictionary (); - public AppBundleLocator (IProcessManager processManager, Func getLog, string msBuildPath, string systemDotnetPath, string dotnetPath) + public AppBundleLocator (IProcessManager processManager, Func getLog, string systemDotnetPath, string dotnetPath) { this.processManager = processManager; this.getLog = getLog; - this.msBuildPath = msBuildPath; this.systemDotnetPath = systemDotnetPath; this.dotnetPath = dotnetPath; } @@ -84,7 +82,10 @@ private async Task GetPropertyByMSBuildEvaluationAsync (XmlDocument cspr using (var proc = new Process ()) { var isDotNetProject = csproj.IsDotNetProject (); - proc.StartInfo.FileName = isDotNetProject ? GetDotNetExecutable (projectPath) : msBuildPath; + if (!isDotNetProject) + throw new NotSupportedException ("Legacy projects not supported anymore"); + + proc.StartInfo.FileName = GetDotNetExecutable (projectPath); var args = new List (); if (isDotNetProject) diff --git a/tests/xharness/Harness.cs b/tests/xharness/Harness.cs index 4706bf66aa50..3591dec744da 100644 --- a/tests/xharness/Harness.cs +++ b/tests/xharness/Harness.cs @@ -138,8 +138,6 @@ public class Harness : IHarness { public ITunnelBore TunnelBore { get; } public AppBundleLocator AppBundleLocator { get; } - public string XIBuildPath => Path.GetFullPath (Path.Combine (RootDirectory, "..", "tools", "xibuild", "xibuild")); - string sdkRoot; string SdkRoot { get => sdkRoot; @@ -280,7 +278,7 @@ public Harness (IResultParser resultParser, HarnessAction action, HarnessConfigu SdkRoot = GetVariable ("XCODE_DEVELOPER_ROOT", configuration.SdkRoot); processManager = new MlaunchProcessManager (XcodeRoot, MlaunchPath); - AppBundleLocator = new AppBundleLocator (processManager, () => HarnessLog, XIBuildPath, "/usr/local/share/dotnet/dotnet", GetVariable ("DOTNET")); + AppBundleLocator = new AppBundleLocator (processManager, () => HarnessLog, "/usr/local/share/dotnet/dotnet", GetVariable ("DOTNET")); TunnelBore = new TunnelBore (processManager); } diff --git a/tests/xharness/IHarness.cs b/tests/xharness/IHarness.cs index caca1a62d07a..8161a934a322 100644 --- a/tests/xharness/IHarness.cs +++ b/tests/xharness/IHarness.cs @@ -22,7 +22,6 @@ public interface IHarness { IResultParser ResultParser { get; } AppBundleLocator AppBundleLocator { get; } ITunnelBore TunnelBore { get; } - string XIBuildPath { get; } List IOSTestProjects { get; } List MacTestProjects { get; } bool INCLUDE_IOS { get; } diff --git a/tests/xharness/Jenkins/TestTasks/BuildProjectTask.cs b/tests/xharness/Jenkins/TestTasks/BuildProjectTask.cs index 82690ed5b203..e63718d23763 100644 --- a/tests/xharness/Jenkins/TestTasks/BuildProjectTask.cs +++ b/tests/xharness/Jenkins/TestTasks/BuildProjectTask.cs @@ -21,8 +21,5 @@ public bool RestoreNugets { } public override bool SupportsParallelExecution => BuildProject.SupportsParallelExecution; - - protected override void InitializeTool () - => buildToolTask = new BuildProject (() => Jenkins.Harness.XIBuildPath, ProcessManager, ResourceManager, this, this); } } diff --git a/tests/xharness/Jenkins/TestTasks/NUnitExecuteTask.cs b/tests/xharness/Jenkins/TestTasks/NUnitExecuteTask.cs index 62db5eca4e59..9b6048eb17e7 100644 --- a/tests/xharness/Jenkins/TestTasks/NUnitExecuteTask.cs +++ b/tests/xharness/Jenkins/TestTasks/NUnitExecuteTask.cs @@ -134,50 +134,7 @@ public override string Mode { public override async Task RunTestAsync () { - using (var resource = await NotifyAndAcquireDesktopResourceAsync ()) { - var xmlLog = Logs.CreateFile ($"log-{Timestamp}.xml", LogType.XmlLog.ToString ()); - var log = Logs.Create ($"execute-{Timestamp}.txt", LogType.ExecutionLog.ToString ()); - FindNUnitConsoleExecutable (log); - - var args = new List (); - args.Add ("-t"); - args.Add ("--"); - args.Add (Path.GetFullPath (TestExecutable)); - args.Add (Path.GetFullPath (TestLibrary)); - if (IsNUnit3) { - args.Add ("-result=" + xmlLog + ";format=nunit2"); - args.Add ("--labels=After"); - if (InProcess) - args.Add ("--inprocess"); - } else { - args.Add ("-xml=" + xmlLog); - args.Add ("-labels"); - } - - await ExecuteProcessAsync (log, Jenkins.Harness.XIBuildPath, args); - - if (ProduceHtmlReport) { - try { - var output = Logs.Create ($"Log-{Timestamp}.html", "HTML log"); - using (var srt = new StringReader (File.ReadAllText (Path.Combine (RootDirectory, "HtmlTransform.xslt")))) { - using (var sri = File.OpenRead (xmlLog)) { - using (var xrt = XmlReader.Create (srt)) { - using (var xri = XmlReader.Create (sri)) { - var xslt = new System.Xml.Xsl.XslCompiledTransform (); - xslt.Load (xrt); - using (var xwo = XmlWriter.Create (File.Create (output.FullPath), xslt.OutputSettings)) // use OutputSettings of xsl, so it can be output as HTML - { - xslt.Transform (xri, xwo); - } - } - } - } - } - } catch (Exception e) { - log.WriteLine ("Failed to produce HTML report: {0}", e); - } - } - } + throw new NotSupportedException ("Legacy projects not supported anymore"); } public override void Reset () diff --git a/tools/Makefile b/tools/Makefile index 8a3c97c0bd7e..f62df42e7e7e 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -8,11 +8,6 @@ ifdef INCLUDE_MAC SUBDIRS+=mmp endif - -ifdef INCLUDE_XAMARIN_LEGACY -SUBDIRS += xibuild -endif - ifdef INCLUDE_IOS INCLUDE_MTOUCH=1 endif diff --git a/tools/autoformat.sh b/tools/autoformat.sh index 62e4b180490b..2121ef35d991 100755 --- a/tools/autoformat.sh +++ b/tools/autoformat.sh @@ -37,7 +37,6 @@ IFS=$'\n' cd .. # Start formatting! -dotnet format "$SRC_DIR/tools/xibuild/xibuild.csproj" dotnet format whitespace "$SRC_DIR/tests/cecil-tests/cecil-tests.csproj" dotnet format whitespace "$SRC_DIR/tests/dotnet/UnitTests/DotNetUnitTests.csproj" dotnet format whitespace "$SRC_DIR/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj" diff --git a/tools/devops/automation/templates/tests/run-tests.yml b/tools/devops/automation/templates/tests/run-tests.yml index f64da7afe89b..8b3976f11736 100644 --- a/tools/devops/automation/templates/tests/run-tests.yml +++ b/tools/devops/automation/templates/tests/run-tests.yml @@ -108,14 +108,6 @@ steps: env: MACIOS_UPLOAD_PREFIX: ${{ parameters.uploadPrefix }} -- bash: | - set -x - set -e - make -C tools/xibuild - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-macios - displayName: Build test dependencies - timeoutInMinutes: 30 - # expand all the prebuilt test dependencies - bash: | ls -Rla@ $(Build.SourcesDirectory)/artifacts diff --git a/tools/xibuild/Main.cs b/tools/xibuild/Main.cs deleted file mode 100644 index 4a246b5b90f7..000000000000 --- a/tools/xibuild/Main.cs +++ /dev/null @@ -1,252 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Xml; -using Mono.Options; -using Xamarin.Utils; - -namespace xibuild { - class MainClass { - - static bool verbose; - public static int Main (string [] args) - { - bool runTool = false; - bool configGenerationOnly = false; - string baseConfigFile = null; - string verbosity = ""; - bool no_logo = true; - bool show_help = false; - OptionSet p = null; - p = new OptionSet () { - "xibuild: Run msbuild or a tool with a custom msbuild config file which adds fallback paths from $MSBuildExtensionsPathFallbackPathsOverride.", - String.Empty, - "Usage: xibuild [-v] [-c] [-t] [-m ] [-h] -- [path to managed tool] [arguments...]", - String.Empty, - "Default: Generate a temporary app.config file and run msbuild", - String.Empty, - "Options:", - - { "c", "Generate config file only", c => configGenerationOnly = true }, // merge - { "t", "Path to the managed tool to run. If this and `-c` are not used, then this runs msbuild", t => runTool = true }, - { "m=", "< base config file >: Config file to merge with the one from msbuild.dll.config", m => baseConfigFile = m }, - { "h|?|help", "Show this help message and exit.", v => show_help = true }, - { "v|verbosity:", "Show verbose output.", v => verbosity = string.IsNullOrEmpty (v) ? "diagnostic" : v }, - { "nologo", "Do not display the startup banner and copyright message when running msbuild.", v => no_logo = true }, - - String.Empty, - "Note: Adds the path from the environment variable named", - "`$MSBuildExtensionsPathFallbackPathsOverride` to the list of fallback paths in the generated app.config", - String.Empty, - "Examples:", - String.Empty, - "Generate /path/to/foo.exe.config:", - "\txibuild -c /path/to/foo.exe", - "Run msbuild with a custom app.config and the arguments passed to msbuild:", - "\txibuild -- /v:diag /path/to/project.csproj", - "Run managed_tool.exe with the arguments, and a custom app.config:", - "\txibuild -t -- /path/to/managed_tool.exe args", - String.Empty, - "Add `-m /path/to/base.exe.config` to merge the generated app.config with base.exe.config ." - }; - - List remaining = null; - try { - remaining = p.Parse (args); - } catch (OptionException oe) { - Console.WriteLine (oe.Message); - return -1; - } - - verbose = !string.IsNullOrEmpty (verbosity) && verbosity [0] == 'd'; - if (verbose) - Console.WriteLine ($"Running xibuild with args: {String.Join (" ", args)}\n"); - - if (show_help) { - p.WriteOptionDescriptions (Console.Out); - return 0; - } - - if (configGenerationOnly && runTool) { - Console.WriteLine ("Use either -c or -t, but not both.\n"); - p.WriteOptionDescriptions (Console.Out); - return -1; - } - - if (!String.IsNullOrEmpty (baseConfigFile) && !File.Exists (baseConfigFile)) { - Console.WriteLine ($"Base config file {baseConfigFile} not found."); - return -1; - } - - if (configGenerationOnly && remaining.Count == 0) { - Console.WriteLine ("Please specify the path to managed tool to generate an app.config file for it."); - return -1; - } - - if (runTool && remaining.Count == 0) { - Console.WriteLine ("Please specify the path to managed tool to run."); - return -1; - } - - bool runMSBuild = !runTool && !configGenerationOnly; - - if (!runTool && !runMSBuild) { - GenerateAppConfig (remaining [0] + ".config", baseConfigFile, out string _); - return 0; - } - - if (runMSBuild) { - // Add back any arguments we consumed. - if (!string.IsNullOrEmpty (verbosity)) - remaining.Add ($"/verbosity:{verbosity}"); - if (no_logo) - remaining.Add ("/nologo"); - } - var arguments = remaining.Skip (runMSBuild ? 0 : 1).ToArray (); - return RunTool ( - toolPath: runMSBuild ? "msbuild" : remaining [0], - combinedArgs: StringUtils.FormatArguments (arguments), - baseConfigFile: runMSBuild ? null : baseConfigFile); - } - - static int RunTool (string toolPath, string combinedArgs, string baseConfigFile) - { - var tmpMSBuildExePathForConfig = Path.GetTempFileName (); - var configFilePath = tmpMSBuildExePathForConfig + ".config"; - try { - GenerateAppConfig (configFilePath, baseConfigFile, out string MSBuildSdksPath); - - var psi = new ProcessStartInfo { - FileName = toolPath, - Arguments = combinedArgs, - UseShellExecute = false, - }; - // Required so that msbuild can read the correct config file - psi.EnvironmentVariables ["MSBUILD_EXE_PATH"] = tmpMSBuildExePathForConfig; - // MSBuildSDKsPath only works via an env var - psi.EnvironmentVariables ["MSBuildSDKsPath"] = MSBuildSdksPath; - - var p = Process.Start (psi); - - p.WaitForExit (); - return p.ExitCode; - } finally { - if (File.Exists (tmpMSBuildExePathForConfig)) - File.Delete (tmpMSBuildExePathForConfig); - if (File.Exists (tmpMSBuildExePathForConfig)) - File.Delete (configFilePath); - } - } - - static void GenerateAppConfig (string targetConfigFile, string baseConfigFile, out string MSBuildSdksPath) - { - bool IsMacOS = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform (System.Runtime.InteropServices.OSPlatform.OSX); - - //FIXME: Current? or from PATH? - string mono = IsMacOS ? "/Library/Frameworks/Mono.framework/Versions/Current/lib/mono" : "/usr/lib/mono"; - string vsVersion = "15.0"; - string MSBuildBin = Path.Combine (mono, "msbuild", vsVersion, "bin"); - - string MSBuildConfig = Path.Combine (MSBuildBin, "MSBuild.dll.config"); - string MSBuildExtensionsPath = Path.Combine (mono, "xbuild"); - string FrameworksDirectory = Path.Combine (mono, "xbuild-frameworks"); - MSBuildSdksPath = Path.Combine (MSBuildBin, "Sdks"); - - var dstXml = new XmlDocument (); - - var dstConfigNode = dstXml.CreateNode (XmlNodeType.Element, "configuration", ""); - dstXml.AppendChild (dstConfigNode); - - if (!String.IsNullOrEmpty (baseConfigFile) && File.Exists (baseConfigFile)) { - var baseXml = new XmlDocument (); - baseXml.Load (baseConfigFile); - CopyConfigNode (baseXml, dstConfigNode); - } - - // Copy over msbuild.dll.config - { - var msbuildXml = new XmlDocument (); - msbuildXml.Load (MSBuildConfig); - CopyConfigNode (msbuildXml, dstConfigNode); - } - - var toolsets = dstXml.SelectSingleNode ("configuration/msbuildToolsets/toolset"); - - var SearchPathsOS = IsMacOS ? "osx" : "unix"; - var projectImportSearchPaths = toolsets.SelectSingleNode ("projectImportSearchPaths"); - var searchPaths = projectImportSearchPaths.SelectSingleNode ($"searchPaths[@os='{SearchPathsOS}']") as XmlElement; - - //NOTE: on Linux, the searchPaths XML element does not exist, so we have to create it - if (searchPaths is null) { - searchPaths = dstXml.CreateElement ("searchPaths"); - searchPaths.SetAttribute ("os", SearchPathsOS); - - var property = dstXml.CreateElement ("property"); - property.SetAttribute ("name", "MSBuildExtensionsPath"); - property.SetAttribute ("value", ""); - searchPaths.AppendChild (property); - - property = dstXml.CreateElement ("property"); - property.SetAttribute ("name", "MSBuildExtensionsPath32"); - property.SetAttribute ("value", ""); - searchPaths.AppendChild (property); - - property = dstXml.CreateElement ("property"); - property.SetAttribute ("name", "MSBuildExtensionsPath64"); - property.SetAttribute ("value", ""); - searchPaths.AppendChild (property); - - projectImportSearchPaths.AppendChild (searchPaths); - } - - string monoExternal = IsMacOS ? "/Library/Frameworks/Mono.framework/External/" : "/usr/lib/mono"; - string [] ProjectImportSearchPaths = new [] { Environment.GetEnvironmentVariable ("MSBuildExtensionsPathFallbackPathsOverride"), Path.Combine (monoExternal, "xbuild") }; - - foreach (XmlNode property in searchPaths.SelectNodes ("property[starts-with(@name, 'MSBuildExtensionsPath')]/@value")) - property.Value = string.Join (";", ProjectImportSearchPaths); - - SetToolsetProperty ("MSBuildToolsPath", MSBuildBin); - SetToolsetProperty ("MSBuildToolsPath32", MSBuildBin); - SetToolsetProperty ("MSBuildToolsPath64", MSBuildBin); - SetToolsetProperty ("MSBuildExtensionsPath", MSBuildExtensionsPath); - SetToolsetProperty ("MSBuildExtensionsPath32", MSBuildExtensionsPath); - SetToolsetProperty ("MSBuildExtensionsPath64", MSBuildExtensionsPath); - SetToolsetProperty ("RoslynTargetsPath", Path.Combine (MSBuildBin, "Roslyn")); - - dstXml.Save (targetConfigFile); - return; - - void CopyConfigNode (XmlDocument src, XmlNode dstNode) - { - var srcConfigNode = src.SelectSingleNode ("configuration"); - if (srcConfigNode is not null && srcConfigNode.HasChildNodes) { - srcConfigNode.ChildNodes.OfType ().ToList () - .ForEach (node => dstNode.AppendChild (dstXml.ImportNode (node, deep: true))); - } - } - - /// - /// If the value exists, sets value attribute, else creates the element - /// - void SetToolsetProperty (string name, string value) - { - if (string.IsNullOrEmpty (value)) - return; - - // MSBuild property names are case insensitive - var valueAttribute = toolsets.SelectSingleNode ($"property[translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='{name.ToLowerInvariant ()}']/@value"); - if (valueAttribute is not null) { - valueAttribute.Value = value; - } else { - var property = toolsets.OwnerDocument.CreateElement ("property"); - property.SetAttribute ("name", name); - property.SetAttribute ("value", value); - toolsets.PrependChild (property); - } - } - } - - } -} diff --git a/tools/xibuild/Makefile b/tools/xibuild/Makefile deleted file mode 100644 index a0ca825fd466..000000000000 --- a/tools/xibuild/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -TOP = ../.. - -include $(TOP)/Make.config - -CONFIGURATION=Debug -SRC_FILES=Main.cs $(TOP)/tools/common/StringUtils.cs - -all: bin/$(CONFIGURATION)/xibuild.exe - -bin/$(CONFIGURATION)/xibuild.exe: xibuild.csproj $(SRC_FILES) - $(Q) $(SYSTEM_MSBUILD) "/bl:$@.binlog" /restore xibuild.csproj /p:Configuration=$(CONFIGURATION) $(MSBUILD_VERBOSITY) - -clean-local:: - $(SYSTEM_MSBUILD) /t:Clean xibuild.csproj diff --git a/tools/xibuild/xibuild b/tools/xibuild/xibuild deleted file mode 100755 index 169b0579ad98..000000000000 --- a/tools/xibuild/xibuild +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -e - -ABSOLUTE_PATH=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}") -TOOL_DIR=$(dirname "$ABSOLUTE_PATH") - -if ! test -f "$TOOL_DIR/bin/Debug/xibuild.exe"; then - make -C "$TOOL_DIR" -fi - -mono "$TOOL_DIR/bin/Debug/xibuild.exe" "$@" diff --git a/tools/xibuild/xibuild.csproj b/tools/xibuild/xibuild.csproj deleted file mode 100644 index f59d980f9657..000000000000 --- a/tools/xibuild/xibuild.csproj +++ /dev/null @@ -1,50 +0,0 @@ - - - - Debug - x86 - {F045D371-40B4-487F-B2A3-3CF318A77CA4} - Exe - xibuild - xibuild - v4.7 - default - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - true - x86 - - - true - bin\Release - prompt - 4 - true - x86 - - - - - - - - - - - - - StringUtils.cs - - - NullableAttributes.cs - - - - From bdd711a46e9a08f262c883eb956813743127439f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 16:35:09 +0200 Subject: [PATCH 096/155] [csharp] Port the versions-check.csharp script to a .NET project. (#21474) --- builds/Makefile | 8 +++++--- scripts/Directory.Build.props | 9 +++++++++ scripts/template.mk | 7 +++++++ scripts/versions-check/fragment.mk | 2 ++ .../versions-check/versions-check.cs | 17 ++++++----------- scripts/versions-check/versions-check.csproj | 5 +++++ 6 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 scripts/Directory.Build.props create mode 100644 scripts/template.mk create mode 100644 scripts/versions-check/fragment.mk rename versions-check.csharp => scripts/versions-check/versions-check.cs (91%) create mode 100644 scripts/versions-check/versions-check.csproj diff --git a/builds/Makefile b/builds/Makefile index 371f6bbf7e66..3ce436e95361 100644 --- a/builds/Makefile +++ b/builds/Makefile @@ -130,10 +130,12 @@ DOTNET_COMMON_TARGETS = \ $(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(DOTNET_DESTDIR)/$($(platform)_NUGET_SDK_NAME)/Versions.plist) \ $(foreach platform,$(DOTNET_PLATFORMS_UPPERCASE),$(DOTNET_DESTDIR)/$($(platform)_NUGET_SDK_NAME)/tools/buildinfo) \ +include $(TOP)/scripts/versions-check/fragment.mk +$(VERSIONS_CHECK): downloads/$(DOTNET_INSTALL_NAME) define VersionInfo -$(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)/Versions.plist: $(TOP)/builds/Versions-$(1).plist.in Makefile $(TOP)/Make.config $(TOP)/versions-check.csharp | $(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME) - $$(Q) $(TOP)/versions-check.csharp $$< "$(DOTNET_MIN_IOS_SDK_VERSION)" "$(MAX_IOS_DEPLOYMENT_TARGET)" "$(DOTNET_MIN_TVOS_SDK_VERSION)" "$(MAX_TVOS_DEPLOYMENT_TARGET)" "$(MIN_WATCH_OS_VERSION)" "$(MAX_WATCH_DEPLOYMENT_TARGET)" "$(DOTNET_MIN_MACOS_SDK_VERSION)" "$(MACOS_SDK_VERSION)" "$(DOTNET_MIN_MACCATALYST_SDK_VERSION)" "$(MACCATALYST_SDK_VERSION)" - $$(Q_GEN) sed -e 's/@XCODE_VERSION@/$(XCODE_VERSION)/g' -e "s/@MONO_VERSION@/$(DOTNET_VERSION)/g" $$< > $$@.tmp +$(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME)/Versions.plist: $(TOP)/builds/Versions-$(1).plist.in Makefile $(TOP)/Make.config $(VERSIONS_CHECK) | $(DOTNET_DESTDIR)/$($(1)_NUGET_SDK_NAME) + $$(Q) $(VERSIONS_CHECK_EXEC) $$< "$(DOTNET_MIN_IOS_SDK_VERSION)" "$(MAX_IOS_DEPLOYMENT_TARGET)" "$(DOTNET_MIN_TVOS_SDK_VERSION)" "$(MAX_TVOS_DEPLOYMENT_TARGET)" "$(MIN_WATCH_OS_VERSION)" "$(MAX_WATCH_DEPLOYMENT_TARGET)" "$(DOTNET_MIN_MACOS_SDK_VERSION)" "$(MACOS_SDK_VERSION)" "$(DOTNET_MIN_MACCATALYST_SDK_VERSION)" "$(MACCATALYST_SDK_VERSION)" + $$(QF_GEN) sed -e 's/@XCODE_VERSION@/$(XCODE_VERSION)/g' -e "s/@MONO_VERSION@/$(DOTNET_VERSION)/g" $$< > $$@.tmp $$(Q) mv $$@.tmp $$@ endef $(foreach platform,$(DOTNET_PLATFORMS),$(eval $(call VersionInfo,$(platform)))) diff --git a/scripts/Directory.Build.props b/scripts/Directory.Build.props new file mode 100644 index 000000000000..a68c92a6c121 --- /dev/null +++ b/scripts/Directory.Build.props @@ -0,0 +1,9 @@ + + + + Exe + enable + enable + false + + diff --git a/scripts/template.mk b/scripts/template.mk new file mode 100644 index 000000000000..3b7dc96f7398 --- /dev/null +++ b/scripts/template.mk @@ -0,0 +1,7 @@ +define TemplateScript +$(1)=$(TOP)/scripts/$(2)/bin/Debug/$(2).dll +$(1)_EXEC=$(DOTNET) exec $$($(1)) + +$$($(1)): $$(wildcard $$(TOP)/scripts/$(2)/*.cs) $$(wildcard $$(TOP)/scripts/$(2)/*.csproj) + $$(Q) $$(DOTNET) build $(TOP)/scripts/$(2)/*.csproj /bl:$$(TOP)/scripts/$(2)/msbuild.binlog $$(DOTNET_BUILD_VERBOSITY) +endef diff --git a/scripts/versions-check/fragment.mk b/scripts/versions-check/fragment.mk new file mode 100644 index 000000000000..74127bb2d38d --- /dev/null +++ b/scripts/versions-check/fragment.mk @@ -0,0 +1,2 @@ +include $(TOP)/scripts/template.mk +$(eval $(call TemplateScript,VERSIONS_CHECK,versions-check)) diff --git a/versions-check.csharp b/scripts/versions-check/versions-check.cs similarity index 91% rename from versions-check.csharp rename to scripts/versions-check/versions-check.cs index 8c74494a0198..5c21d54666c3 100755 --- a/versions-check.csharp +++ b/scripts/versions-check/versions-check.cs @@ -1,5 +1,3 @@ -#!/usr/bin/env /Library/Frameworks/Mono.framework/Commands/csharp -s - // this script is to make sure our versions.plist files are not out of date with our min/max supported OS versions. // arguments are: plistPath iOSMinVersion iOSMaxVersion tvOSMinVersion tvOSMaxVersion watchOSMinVersion watchOSMaxVersion macOSMinVersion macOSMaxVersion MacCatalystOSMinVersion MacCatalystOSMaxVersion @@ -8,12 +6,10 @@ using System.Xml; try { - var args = Args; var expectedArgumentCount = 11; if (args.Length != expectedArgumentCount) { Console.WriteLine ("Need 11 arguments, got {0}", args.Length); - Environment.Exit (1); - return; + return 1; } var plistPath = args [0]; @@ -33,13 +29,12 @@ var failed = false; - var check = new Action ((product, min, max) => - { + var check = new Action ((product, min, max) => { var minVersion = Version.Parse (min); var maxVersion = Version.Parse (max); var foundMax = false; var foundMin = false; - var versions = doc.SelectNodes ($"/plist/dict/key[text()='KnownVersions']/following-sibling::dict[1]/key[text()='{product}']/following-sibling::array[1]/string"); + var versions = doc.SelectNodes ($"/plist/dict/key[text()='KnownVersions']/following-sibling::dict[1]/key[text()='{product}']/following-sibling::array[1]/string")!; if (versions.Count == 0) { // Skip this (iOS/tvOS/watchOS versions for macOS, or vice versa) return; @@ -70,7 +65,7 @@ failed = true; } - var supportedTPVNodes = doc.SelectNodes ($"/plist/dict/key[text()='SupportedTargetPlatformVersions']/following-sibling::dict[1]/key[text()='{product}']/following-sibling::array[1]/string").Cast ().ToArray (); + var supportedTPVNodes = doc.SelectNodes ($"/plist/dict/key[text()='SupportedTargetPlatformVersions']/following-sibling::dict[1]/key[text()='{product}']/following-sibling::array[1]/string")!.Cast ().ToArray (); var supportedTPVs = supportedTPVNodes.Select (v => v.InnerText).ToArray (); if (supportedTPVs?.Any () == true) { var supportedTPVSet = new HashSet (supportedTPVs); @@ -91,8 +86,8 @@ check ("macOS", macOSMin, macOSMax); check ("MacCatalyst", MacCatalystMin, MacCatalystMax); - Environment.Exit (failed ? 1 : 0); + return failed ? 1 : 0; } catch (Exception e) { Console.WriteLine (e); - Environment.Exit (1); + return 1; } diff --git a/scripts/versions-check/versions-check.csproj b/scripts/versions-check/versions-check.csproj new file mode 100644 index 000000000000..3e1d041e4d59 --- /dev/null +++ b/scripts/versions-check/versions-check.csproj @@ -0,0 +1,5 @@ + + + net$(BundledNETCoreAppTargetFrameworkVersion) + + From 57f68953b2aae8ef1a9f932c6dd64da33901e3bf Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 22 Oct 2024 16:36:09 +0200 Subject: [PATCH 097/155] [xtro] Port the xtro-sharpie.csproj to a new style project and build with .NET. (#21468) Note that it's still executed with Mono, because we load a native library that needs Mono at runtime. --- tests/xtro-sharpie/Makefile | 7 +- .../xtro-sharpie/xtro-sharpie.csproj | 80 +------------------ 2 files changed, 5 insertions(+), 82 deletions(-) diff --git a/tests/xtro-sharpie/Makefile b/tests/xtro-sharpie/Makefile index 8284cd7d6197..e6a9b839b9cf 100644 --- a/tests/xtro-sharpie/Makefile +++ b/tests/xtro-sharpie/Makefile @@ -41,13 +41,8 @@ XTRO_SHARPIE_EXEC=$(MONO) --debug $(XTRO_SHARPIE) build: $(XTRO_SHARPIE) $(XTRO_REPORT) $(XTRO_SANITY) -.stamp-build: export SHARPIE:=$(SHARPIE) -.stamp-build: $(wildcard *.cs) pch-info.proj $(XTRO_REPORT) $(XTRO_SANITY) $(XTRO_SHARPIE) - $(Q_BUILD) $(SYSTEM_MSBUILD) $(MSBUILD_VERBOSITY) xtro-sharpie.csproj /r /bl:$@.binlog - $(Q) touch $@ - $(XTRO_SHARPIE): $(wildcard xtro-sharpie/*.cs) $(wildcard xtro-sharpie/*.csproj) pch-info.proj $(XTRO_REPORT) - $(Q_BUILD) $(SYSTEM_MSBUILD) $(MSBUILD_VERBOSITY) xtro-sharpie/xtro-sharpie.csproj /r /bl:$@.binlog + $(Q_GEN) unset MSBUILD_EXE_PATH && $(DOTNET) build xtro-sharpie/xtro-sharpie.csproj /bl:xtro-sharpie.binlog $(DOTNET_BUILD_VERBOSITY) $(XTRO_REPORT): $(wildcard xtro-report/*.cs) $(wildcard xtro-report/*.csproj) xtro-sharpie/Filter.cs Makefile $(Q_GEN) unset MSBUILD_EXE_PATH && $(DOTNET) build xtro-report/xtro-report.csproj /bl:xtro-report.binlog $(DOTNET_BUILD_VERBOSITY) diff --git a/tests/xtro-sharpie/xtro-sharpie/xtro-sharpie.csproj b/tests/xtro-sharpie/xtro-sharpie/xtro-sharpie.csproj index f5a67769f9cb..f28b4da3c550 100644 --- a/tests/xtro-sharpie/xtro-sharpie/xtro-sharpie.csproj +++ b/tests/xtro-sharpie/xtro-sharpie/xtro-sharpie.csproj @@ -1,59 +1,12 @@ - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {D890A042-93C2-4B4B-ABF8-7ECBCBF059D8} + net4.7.2 Exe - xtrosharpie - xtro-sharpie - v4.7 - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - ../../../iphoneos12.0-arm64.pch /Library/Frameworks/Xamarin.iOS.framework/Versions/Current//lib/64bits/iOS/Xamarin.iOS.dll - x64 - latest - - - full - true - bin\Release - prompt - 4 - true + false latest - - Project - ../$(WATCHOS_PCH) ../../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/32bits/watchOS/Xamarin.WatchOS.dll - . - - - Project - ../$(iOS_PCH) ../../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/64bits/iOS/Xamarin.iOS.dll ../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/mono/Xamarin.iOS/OpenTK-1.0.dll - . - - - Project - ../$(tvOS_PCH) ../../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/mono/Xamarin.TVOS/Xamarin.TVOS.dll ../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/mono/Xamarin.TVOS/OpenTK-1.0.dll - . - - - Project - ../$(macOS_PCH) ../../../_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/git/lib/64bits/mobile/Xamarin.Mac.dll - . - Project ../$(iOS_PCH) --output-directory ../api-annotations-dotnet --lib ../../../packages/microsoft.netcore.app.ref/$(MicrosoftNETCoreAppRefPackageVersion)/ref/$(DOTNET_TFM) $(iOS_DLL) @@ -75,7 +28,6 @@ . - \Library\Frameworks\ObjectiveSharpie.framework\Versions\Current\bin\Clang.dll @@ -83,31 +35,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + $(SHARPIE)/../bin/x64/Release/libclang-mono.dylib /Library/Frameworks/ObjectiveSharpie.framework/Versions/Current/bin/libclang-mono.dylib From 0eb8ccd953940a02b827dfb966adca0f09e1dd53 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:46:41 +0200 Subject: [PATCH 098/155] [main] Update dependencies from dotnet/xharness (#21484) This pull request updates the following dependencies ## From https://github.com/dotnet/xharness - **Subscription**: 601bc5e1-1cae-44b5-cf5f-08db9342aa2f - **Build**: 20241014.1 - **Date Produced**: October 14, 2024 10:32:08 PM UTC - **Commit**: 8b3d320f930244889da101cd17cbfb6a178b7e35 - **Branch**: refs/heads/main - **Updates**: - **Microsoft.DotNet.XHarness.iOS.Shared**: [from 10.0.0-prerelease.24511.1 to 10.0.0-prerelease.24514.1][1] [1]: https://github.com/dotnet/xharness/compare/8c6d5afd99...8b3d320f93 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5a04d99d2d32..15ed6e1db877 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -78,9 +78,9 @@ https://github.com/dotnet/templating - + https://github.com/dotnet/xharness - 8c6d5afd99c713777165f4378462085a5679c223 + 8b3d320f930244889da101cd17cbfb6a178b7e35 diff --git a/eng/Versions.props b/eng/Versions.props index 25cc1a13db90..bbc3b6413575 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -12,7 +12,7 @@ 9.0.0-rc.2.24462.10 7.0.100-alpha.1.21601.1 0.11.5-alpha.24480.1 - 10.0.0-prerelease.24511.1 + 10.0.0-prerelease.24514.1 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) From d8a46a6abb29da632ed93917eb8ec875031858c6 Mon Sep 17 00:00:00 2001 From: Manuel de la Pena Date: Tue, 22 Oct 2024 17:37:44 -0400 Subject: [PATCH 099/155] [Rgen] Set the projects to fail on warnings. Fix warnings. (#21500) --- .../Microsoft.Macios.Bindings.Analyzer.Sample.csproj | 1 + .../AnalyzerReleases.Shipped.md | 4 ---- .../AnalyzerReleases.Unshipped.md | 8 +++++--- .../Microsoft.Macios.Bindings.Analyzer.csproj | 4 ++++ .../Microsoft.Macios.Generator.Sample.csproj | 1 + .../AnalyzerReleases.Shipped.md | 3 +++ .../AnalyzerReleases.Unshipped.md | 7 +++++++ .../Microsoft.Macios.Generator/Emitters/EnumEmitter.cs | 2 ++ .../Emitters/InterfaceEmitter.cs | 2 ++ .../Microsoft.Macios.Generator.csproj | 4 ++++ src/rgen/Microsoft.Macios.Generator/Resources.resx | 4 ++-- .../Microsoft.Macios.Bindings.Analyzer.Tests.csproj | 2 +- .../BindingSourceGeneratorGeneratorTests.cs | 2 +- .../Microsoft.Macios.Generator.Tests.csproj | 2 +- 14 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Shipped.md create mode 100644 src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Unshipped.md diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj index a02eefcf4af5..d78ab2a49ec2 100644 --- a/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer.Sample/Microsoft.Macios.Bindings.Analyzer.Sample.csproj @@ -4,6 +4,7 @@ net$(BundledNETCoreAppTargetFrameworkVersion) enable APL0003 + true diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md index 5a165075fbca..b11c83ed9b0c 100644 --- a/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Shipped.md @@ -1,7 +1,3 @@ ## Release 1.0 ### New Rules - -| Rule ID | Category | Severity | Notes | -|---------|----------|----------|------------------------------------------------------| -| RBI0001 | Usage | Error | Binding types should be declared as partial classes. | \ No newline at end of file diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md index 44f7c8f4ef7c..91ac58aa2ed2 100644 --- a/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/AnalyzerReleases.Unshipped.md @@ -1,4 +1,6 @@ -### New Rules +## Release 0.1.0 -| Rule ID | Category | Severity | Notes | -|---------|----------|----------|-------| \ No newline at end of file +### New Rules +| Rule ID | Category | Severity | Notes | +|---------|----------|----------|------------------------------------------------------| +| RBI0001 | Usage | Error | Binding types should be declared as partial classes. | diff --git a/src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj index 6f9e0902e438..44b9e0fbb6ff 100644 --- a/src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj +++ b/src/rgen/Microsoft.Macios.Bindings.Analyzer/Microsoft.Macios.Bindings.Analyzer.csproj @@ -8,9 +8,13 @@ true true + true Microsoft.Macios.Bindings.Analyzer Microsoft.Macios.Bindings.Analyzer + 0.1.0 + + RS2007 diff --git a/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj b/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj index e10b90a1b8fd..c29d36cff5b6 100644 --- a/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj +++ b/src/rgen/Microsoft.Macios.Generator.Sample/Microsoft.Macios.Generator.Sample.csproj @@ -5,6 +5,7 @@ enable Microsoft.Macios.Generator.Sample APL0003 + true diff --git a/src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Shipped.md b/src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Shipped.md new file mode 100644 index 000000000000..b11c83ed9b0c --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Shipped.md @@ -0,0 +1,3 @@ +## Release 1.0 + +### New Rules diff --git a/src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Unshipped.md b/src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Unshipped.md new file mode 100644 index 000000000000..0b35e20b5e1a --- /dev/null +++ b/src/rgen/Microsoft.Macios.Generator/AnalyzerReleases.Unshipped.md @@ -0,0 +1,7 @@ +## Release 0.1.0 + +### New Rules + +| Rule ID | Category | Severity | Notes | +|---------|----------|----------|------------------------------------------------------| +| RBI0001 | Usage | Error | Binding types should be declared as partial classes. | diff --git a/src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs b/src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs index b946986eac9f..202785a77ad1 100644 --- a/src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs +++ b/src/rgen/Microsoft.Macios.Generator/Emitters/EnumEmitter.cs @@ -6,7 +6,9 @@ namespace Microsoft.Macios.Generator.Emitters; +#pragma warning disable CS9113 // Parameter is unread. This class is work in progress class EnumEmitter (ISymbolBindingContext context, TabbedStringBuilder builder) +#pragma warning restore CS9113 // Parameter is unread. : ICodeEmitter { public string SymbolName => $"{context.SymbolName}Extensions"; diff --git a/src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs b/src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs index 23f77d0c4d76..80beaebbc7f6 100644 --- a/src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs +++ b/src/rgen/Microsoft.Macios.Generator/Emitters/InterfaceEmitter.cs @@ -6,7 +6,9 @@ namespace Microsoft.Macios.Generator.Emitters; +#pragma warning disable CS9113 // Parameter is unread, this class is work in progress class InterfaceEmitter (ISymbolBindingContext context, TabbedStringBuilder builder) : ICodeEmitter { +#pragma warning restore CS9113 // Parameter is unread. public string SymbolName { get; } = string.Empty; public bool TryEmit ([NotNullWhen (false)] out ImmutableArray? diagnostics) { diff --git a/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj b/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj index b27358da29cc..c5437837ff61 100644 --- a/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj +++ b/src/rgen/Microsoft.Macios.Generator/Microsoft.Macios.Generator.csproj @@ -8,9 +8,13 @@ true true + true Microsoft.Macios.Generator Microsoft.Macios.Generator + 0.1.0 + + RS2007 diff --git a/src/rgen/Microsoft.Macios.Generator/Resources.resx b/src/rgen/Microsoft.Macios.Generator/Resources.resx index 42a56d93c001..1d6fccd8bd27 100644 --- a/src/rgen/Microsoft.Macios.Generator/Resources.resx +++ b/src/rgen/Microsoft.Macios.Generator/Resources.resx @@ -20,11 +20,11 @@ - An unexpected error happened while generating the code. No code will be added to the compilation + An unexpected error happened while generating the code. No code will be added to the compilation. An optional longer localizable description of the diagnostic. - An unexpected error ocurred while process '{0}'. Please fill a bug report at https://github.com/xamarin/xamarin-macios/issues/new + An unexpected error ocurred while processing '{0}'. Please fill a bug report at https://github.com/xamarin/xamarin-macios/issues/new. The format-able message the diagnostic displays. diff --git a/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj index f508fcca942a..1c37290bc01f 100644 --- a/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj +++ b/tests/rgen/Microsoft.Macios.Bindings.Analyzer.Tests/Microsoft.Macios.Bindings.Analyzer.Tests.csproj @@ -3,8 +3,8 @@ net$(BundledNETCoreAppTargetFrameworkVersion) enable - false + true diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs b/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs index fd8738e7d3e3..98d441e1c340 100644 --- a/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/BindingSourceGeneratorGeneratorTests.cs @@ -45,7 +45,7 @@ public void CorrectUsingImports (ApplePlatform platform, string input, string ex { // We need to create a compilation with the required source code. var compilation = CreateCompilation (nameof (CorrectUsingImports), - platform, usingImportInput); + platform, input); // Run generators and retrieve all results. var runResult = _driver.RunGenerators (compilation).GetRunResult (); diff --git a/tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj b/tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj index 417b2c63d198..5efac3f6024d 100644 --- a/tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj +++ b/tests/rgen/Microsoft.Macios.Generator.Tests/Microsoft.Macios.Generator.Tests.csproj @@ -3,8 +3,8 @@ net$(BundledNETCoreAppTargetFrameworkVersion) enable - false + true Microsoft.Macios.Generator.Tests From c263a01ea7380da52eae58c9fb734e9aeadb22a9 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 23 Oct 2024 08:04:43 +0200 Subject: [PATCH 100/155] Remove the macios-binaries dependency. (#21501) We're no longer using it. --- .gitmodules | 4 ---- Make.config | 1 - external/macios-binaries | 1 - mk/versions.mk | 1 - runtime/Makefile | 3 --- 5 files changed, 10 deletions(-) delete mode 160000 external/macios-binaries diff --git a/.gitmodules b/.gitmodules index 1e4489016f1e..b8d9d589ef27 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ -[submodule "external/macios-binaries"] - path = external/macios-binaries - url = ../../xamarin/macios-binaries - branch = main [submodule "external/Touch.Unit"] path = external/Touch.Unit url = ../../xamarin/Touch.Unit.git diff --git a/Make.config b/Make.config index 5504de0eb07b..1e2b3574183c 100644 --- a/Make.config +++ b/Make.config @@ -566,7 +566,6 @@ MONO_PATH=$(TOP)/external/mono TOUCH_UNIT_PATH=$(TOP)/external/Touch.Unit XAMARIN_MACDEV_PATH=$(TOP)/external/Xamarin.MacDev MACCORE_PATH=$(TOP)/../maccore -MACIOS_BINARIES_PATH=$(TOP)/external/macios-binaries MONOTOUCH_DIALOG_PATH=$(TOP)/external/MonoTouch.Dialog API_TOOLS_PATH=$(TOP)/external/api-tools diff --git a/external/macios-binaries b/external/macios-binaries deleted file mode 160000 index 7813391e75d7..000000000000 --- a/external/macios-binaries +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7813391e75d7373ee073ef2d5716e3c607c8636a diff --git a/mk/versions.mk b/mk/versions.mk index d182a3909ba9..377710e926ce 100644 --- a/mk/versions.mk +++ b/mk/versions.mk @@ -66,7 +66,6 @@ $(shell rm -f .check-versions-failure) $(eval $(call CheckSubmoduleTemplate,Touch.Unit,TOUCH_UNIT)) $(eval $(call CheckSubmoduleTemplate,Xamarin.MacDev,XAMARIN_MACDEV)) -$(eval $(call CheckSubmoduleTemplate,macios-binaries,MACIOS_BINARIES)) $(eval $(call CheckSubmoduleTemplate,MonoTouch.Dialog,MONOTOUCH_DIALOG)) $(eval $(call CheckSubmoduleTemplate,api-tools,API_TOOLS)) diff --git a/runtime/Makefile b/runtime/Makefile index 35e62bf6d8de..5c197c474635 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -515,9 +515,6 @@ $(foreach arch,$(MAC_ARCHITECTURES),.libs/mac/extension-main.$(arch).o): EXTRA_D .libs/mac/libxammac-system.a: .libs/mac/libxammac-system.x86_64.a .libs/mac/libxammac-system.arm64.a $(call Q_2,LIPO, [mac]) xcrun lipo -create $^ -o $@ -.libs/mac/libxammac-%.a: $(MACIOS_BINARIES_PATH)/libxammac-%.a | .libs/mac - $(Q) $(CP) $< $@ - .libs/mac/libxamarin%.a: .libs/mac/libxamarin%.x86_64.a $(call Q_2,LIPO, [mac]) xcrun lipo -create $^ -o $@ From c7ae0f72b07acb50a5e97a9d1a887df11eaa8d31 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 08:28:36 +0200 Subject: [PATCH 101/155] [main] Update dependencies from dotnet/sdk (#21494) This pull request updates the following dependencies ## From https://github.com/dotnet/sdk - **Subscription**: afa459aa-bd64-46cb-8138-9f6f795963d4 - **Build**: 20241021.19 - **Date Produced**: October 21, 2024 10:52:01 PM UTC - **Commit**: 1efe47335726077cc75f52ec5b00ebf243f4c048 - **Branch**: refs/heads/release/9.0.1xx - **Updates**: - **Microsoft.NET.Sdk**: [from 9.0.100-rtm.24520.4 to 9.0.100-rtm.24521.19][1] [1]: https://github.com/dotnet/sdk/compare/95bea787c1...1efe473357 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- global.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 15ed6e1db877..b945dcf8c7b0 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,8 +1,8 @@ - + https://github.com/dotnet/sdk - 95bea787c14e3402b47311007dba6b3f503b34e7 + 1efe47335726077cc75f52ec5b00ebf243f4c048 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index bbc3b6413575..871d2cf33a8d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -2,7 +2,7 @@ - 9.0.100-rtm.24520.4 + 9.0.100-rtm.24521.19 9.0.0 9.0.0-alpha.1.23556.4 9.0.0-beta.24516.2 diff --git a/global.json b/global.json index 1f9fab064bcf..639ead5c49d4 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100-rtm.24520.4" + "version": "9.0.100-rtm.24521.19" } } From 063394375bbfa685201f7ac0d5e21ad3a74167f4 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 23 Oct 2024 18:10:40 +0200 Subject: [PATCH 102/155] [devops] Delete simulator runtimes not used in 90 days. (#21489) --- .../automation/scripts/bash/clean-simulator-runtime.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh b/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh index dfddf64f38d9..3e55e489fd3d 100755 --- a/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh +++ b/tools/devops/automation/scripts/bash/clean-simulator-runtime.sh @@ -10,6 +10,13 @@ for i in $(xcrun simctl runtime list | grep "watchOS.*Ready" | sed -e 's/.* - // xcrun simctl runtime delete "$i" done +# delete all simulators not used in the last 90 days +echo "Checking if there are any old runtimes to delete:" +xcrun simctl runtime delete --notUsedSinceDays 90 --dry-run | sed 's/^/ /' +echo "Deleting..." +xcrun simctl runtime delete --notUsedSinceDays 90| sed 's/^/ /' +echo "Delete completed." + xcrun simctl runtime list -j > simruntime.json cat simruntime.json From 0bac6d48f112e73aedf90289e7995ac9e287cbff Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 23 Oct 2024 18:20:35 +0200 Subject: [PATCH 103/155] [maestro] Add a dependency on Arcade. (#21469) Note: all the files in eng/common/ were added automatically, and there's no need to review them (any changes will be lost anyway). This is the command to update arcade manually: ```shell $ darc update-dependencies --name Microsoft.DotNet.Arcade.Sdk --channel '.NET 9 Eng' ``` In any case I'll setup a subscription as well. This is required in order to access internal .NET builds at some point. --- Make.config | 1 + Makefile | 4 +- eng/Version.Details.xml | 5 + eng/Versions.props | 1 + .../build-configuration.json | 4 + eng/common/CIBuild.cmd | 2 + eng/common/PSScriptAnalyzerSettings.psd1 | 11 + eng/common/README.md | 28 + eng/common/SetupNugetSources.ps1 | 90 +- eng/common/SetupNugetSources.sh | 126 ++- eng/common/build.cmd | 3 + eng/common/build.ps1 | 169 ++++ eng/common/build.sh | 260 ++++++ eng/common/cibuild.sh | 16 + eng/common/core-templates/job/job.yml | 247 ++++++ eng/common/core-templates/job/onelocbuild.yml | 121 +++ .../job/publish-build-assets.yml | 158 ++++ .../core-templates/job/source-build.yml | 93 +++ .../job/source-index-stage1.yml | 81 ++ .../core-templates/jobs/codeql-build.yml | 33 + eng/common/core-templates/jobs/jobs.yml | 119 +++ .../core-templates/jobs/source-build.yml | 58 ++ .../post-build/common-variables.yml | 22 + .../core-templates/post-build/post-build.yml | 316 +++++++ .../post-build/setup-maestro-vars.yml | 74 ++ .../steps/component-governance.yml | 16 + .../steps/enable-internal-runtimes.yml | 32 + .../steps/enable-internal-sources.yml | 47 ++ .../core-templates/steps/generate-sbom.yml | 54 ++ .../steps/get-delegation-sas.yml | 55 ++ .../steps/get-federated-access-token.yml | 42 + .../steps/publish-build-artifacts.yml | 20 + .../core-templates/steps/publish-logs.yml | 58 ++ .../steps/publish-pipeline-artifacts.yml | 20 + .../core-templates/steps/retain-build.yml | 28 + .../core-templates/steps/send-to-helix.yml | 93 +++ .../core-templates/steps/source-build.yml | 129 +++ .../variables/pool-providers.yml | 8 + eng/common/cross/arm/tizen/tizen.patch | 9 + eng/common/cross/arm64/tizen/tizen.patch | 9 + eng/common/cross/armel/armel.jessie.patch | 43 + eng/common/cross/armel/tizen/tizen.patch | 9 + eng/common/cross/build-android-rootfs.sh | 131 +++ eng/common/cross/build-rootfs.sh | 786 ++++++++++++++++++ eng/common/cross/riscv64/tizen/tizen.patch | 9 + eng/common/cross/tizen-build-rootfs.sh | 82 ++ eng/common/cross/tizen-fetch.sh | 183 ++++ eng/common/cross/toolchain.cmake | 408 +++++++++ eng/common/cross/x64/tizen/tizen.patch | 9 + eng/common/cross/x86/tizen/tizen.patch | 9 + eng/common/darc-init.ps1 | 47 ++ eng/common/darc-init.sh | 82 ++ eng/common/dotnet-install.cmd | 2 + eng/common/dotnet-install.ps1 | 28 + eng/common/dotnet-install.sh | 94 +++ eng/common/enable-cross-org-publishing.ps1 | 13 + eng/common/generate-locproject.ps1 | 189 +++++ eng/common/generate-sbom-prep.ps1 | 21 + eng/common/generate-sbom-prep.sh | 34 + eng/common/helixpublish.proj | 27 + eng/common/init-tools-native.cmd | 3 + eng/common/init-tools-native.ps1 | 203 +++++ eng/common/init-tools-native.sh | 238 ++++++ eng/common/internal-feed-operations.ps1 | 132 +++ eng/common/internal-feed-operations.sh | 141 ++++ eng/common/internal/Directory.Build.props | 11 + eng/common/internal/NuGet.config | 7 + eng/common/internal/Tools.csproj | 32 + eng/common/loc/P22DotNetHtmlLocalization.lss | 29 + eng/common/msbuild.ps1 | 28 + eng/common/msbuild.sh | 58 ++ eng/common/native/CommonLibrary.psm1 | 401 +++++++++ eng/common/native/common-library.sh | 172 ++++ eng/common/native/init-compiler.sh | 146 ++++ eng/common/native/init-distro-rid.sh | 110 +++ eng/common/native/init-os-and-arch.sh | 85 ++ eng/common/native/install-cmake-test.sh | 117 +++ eng/common/native/install-cmake.sh | 117 +++ eng/common/native/install-tool.ps1 | 132 +++ eng/common/pipeline-logging-functions.ps1 | 2 +- eng/common/pipeline-logging-functions.sh | 2 +- .../post-build/check-channel-consistency.ps1 | 48 ++ eng/common/post-build/nuget-validation.ps1 | 22 + eng/common/post-build/nuget-verification.ps1 | 121 +++ eng/common/post-build/publish-using-darc.ps1 | 59 ++ eng/common/post-build/redact-logs.ps1 | 89 ++ .../post-build/sourcelink-validation.ps1 | 327 ++++++++ eng/common/post-build/symbols-validation.ps1 | 337 ++++++++ eng/common/retain-build.ps1 | 45 + eng/common/sdk-task.ps1 | 97 +++ eng/common/sdl/NuGet.config | 18 + eng/common/sdl/configure-sdl-tool.ps1 | 130 +++ eng/common/sdl/execute-all-sdl-tools.ps1 | 167 ++++ eng/common/sdl/extract-artifact-archives.ps1 | 63 ++ eng/common/sdl/extract-artifact-packages.ps1 | 82 ++ eng/common/sdl/init-sdl.ps1 | 55 ++ eng/common/sdl/packages.config | 4 + eng/common/sdl/run-sdl.ps1 | 49 ++ eng/common/sdl/sdl.ps1 | 38 + eng/common/sdl/trim-assets-version.ps1 | 75 ++ eng/common/template-guidance.md | 133 +++ eng/common/templates-official/job/job.yml | 80 ++ .../templates-official/job/onelocbuild.yml | 7 + .../job/publish-build-assets.yml | 7 + .../templates-official/job/source-build.yml | 7 + .../job/source-index-stage1.yml | 7 + .../templates-official/jobs/codeql-build.yml | 7 + eng/common/templates-official/jobs/jobs.yml | 7 + .../templates-official/jobs/source-build.yml | 7 + .../post-build/common-variables.yml | 8 + .../post-build/post-build.yml | 8 + .../post-build/setup-maestro-vars.yml | 8 + .../steps/component-governance.yml | 7 + .../steps/enable-internal-runtimes.yml | 9 + .../steps/enable-internal-sources.yml | 7 + .../steps/generate-sbom.yml | 7 + .../steps/get-delegation-sas.yml | 7 + .../steps/get-federated-access-token.yml | 7 + .../steps/publish-build-artifacts.yml | 41 + .../templates-official/steps/publish-logs.yml | 7 + .../steps/publish-pipeline-artifacts.yml | 28 + .../templates-official/steps/retain-build.yml | 7 + .../steps/send-to-helix.yml | 7 + .../templates-official/steps/source-build.yml | 7 + .../variables/pool-providers.yml | 45 + .../variables/sdl-variables.yml | 7 + eng/common/templates/job/job.yml | 82 ++ eng/common/templates/job/onelocbuild.yml | 7 + .../templates/job/publish-build-assets.yml | 7 + eng/common/templates/job/source-build.yml | 7 + .../templates/job/source-index-stage1.yml | 7 + eng/common/templates/jobs/codeql-build.yml | 7 + eng/common/templates/jobs/jobs.yml | 7 + eng/common/templates/jobs/source-build.yml | 7 + .../templates/post-build/common-variables.yml | 8 + .../templates/post-build/post-build.yml | 8 + .../post-build/setup-maestro-vars.yml | 8 + .../templates/steps/component-governance.yml | 7 + .../steps/enable-internal-runtimes.yml | 10 + .../steps/enable-internal-sources.yml | 7 + eng/common/templates/steps/generate-sbom.yml | 7 + .../templates/steps/get-delegation-sas.yml | 7 + .../steps/get-federated-access-token.yml | 7 + .../steps/publish-build-artifacts.yml | 40 + eng/common/templates/steps/publish-logs.yml | 7 + .../steps/publish-pipeline-artifacts.yml | 34 + eng/common/templates/steps/retain-build.yml | 7 + eng/common/templates/steps/send-to-helix.yml | 7 + eng/common/templates/steps/source-build.yml | 7 + .../templates/variables/pool-providers.yml | 59 ++ eng/common/tools.ps1 | 209 +++-- eng/common/tools.sh | 168 ++-- global.json | 6 + 153 files changed, 9817 insertions(+), 266 deletions(-) create mode 100644 eng/common/BuildConfiguration/build-configuration.json create mode 100644 eng/common/CIBuild.cmd create mode 100644 eng/common/PSScriptAnalyzerSettings.psd1 create mode 100644 eng/common/README.md create mode 100644 eng/common/build.cmd create mode 100644 eng/common/build.ps1 create mode 100644 eng/common/build.sh create mode 100644 eng/common/cibuild.sh create mode 100644 eng/common/core-templates/job/job.yml create mode 100644 eng/common/core-templates/job/onelocbuild.yml create mode 100644 eng/common/core-templates/job/publish-build-assets.yml create mode 100644 eng/common/core-templates/job/source-build.yml create mode 100644 eng/common/core-templates/job/source-index-stage1.yml create mode 100644 eng/common/core-templates/jobs/codeql-build.yml create mode 100644 eng/common/core-templates/jobs/jobs.yml create mode 100644 eng/common/core-templates/jobs/source-build.yml create mode 100644 eng/common/core-templates/post-build/common-variables.yml create mode 100644 eng/common/core-templates/post-build/post-build.yml create mode 100644 eng/common/core-templates/post-build/setup-maestro-vars.yml create mode 100644 eng/common/core-templates/steps/component-governance.yml create mode 100644 eng/common/core-templates/steps/enable-internal-runtimes.yml create mode 100644 eng/common/core-templates/steps/enable-internal-sources.yml create mode 100644 eng/common/core-templates/steps/generate-sbom.yml create mode 100644 eng/common/core-templates/steps/get-delegation-sas.yml create mode 100644 eng/common/core-templates/steps/get-federated-access-token.yml create mode 100644 eng/common/core-templates/steps/publish-build-artifacts.yml create mode 100644 eng/common/core-templates/steps/publish-logs.yml create mode 100644 eng/common/core-templates/steps/publish-pipeline-artifacts.yml create mode 100644 eng/common/core-templates/steps/retain-build.yml create mode 100644 eng/common/core-templates/steps/send-to-helix.yml create mode 100644 eng/common/core-templates/steps/source-build.yml create mode 100644 eng/common/core-templates/variables/pool-providers.yml create mode 100644 eng/common/cross/arm/tizen/tizen.patch create mode 100644 eng/common/cross/arm64/tizen/tizen.patch create mode 100644 eng/common/cross/armel/armel.jessie.patch create mode 100644 eng/common/cross/armel/tizen/tizen.patch create mode 100644 eng/common/cross/build-android-rootfs.sh create mode 100644 eng/common/cross/build-rootfs.sh create mode 100644 eng/common/cross/riscv64/tizen/tizen.patch create mode 100644 eng/common/cross/tizen-build-rootfs.sh create mode 100644 eng/common/cross/tizen-fetch.sh create mode 100644 eng/common/cross/toolchain.cmake create mode 100644 eng/common/cross/x64/tizen/tizen.patch create mode 100644 eng/common/cross/x86/tizen/tizen.patch create mode 100644 eng/common/darc-init.ps1 create mode 100644 eng/common/darc-init.sh create mode 100644 eng/common/dotnet-install.cmd create mode 100644 eng/common/dotnet-install.ps1 create mode 100644 eng/common/dotnet-install.sh create mode 100644 eng/common/enable-cross-org-publishing.ps1 create mode 100644 eng/common/generate-locproject.ps1 create mode 100644 eng/common/generate-sbom-prep.ps1 create mode 100644 eng/common/generate-sbom-prep.sh create mode 100644 eng/common/helixpublish.proj create mode 100644 eng/common/init-tools-native.cmd create mode 100644 eng/common/init-tools-native.ps1 create mode 100644 eng/common/init-tools-native.sh create mode 100644 eng/common/internal-feed-operations.ps1 create mode 100644 eng/common/internal-feed-operations.sh create mode 100644 eng/common/internal/Directory.Build.props create mode 100644 eng/common/internal/NuGet.config create mode 100644 eng/common/internal/Tools.csproj create mode 100644 eng/common/loc/P22DotNetHtmlLocalization.lss create mode 100644 eng/common/msbuild.ps1 create mode 100644 eng/common/msbuild.sh create mode 100644 eng/common/native/CommonLibrary.psm1 create mode 100644 eng/common/native/common-library.sh create mode 100644 eng/common/native/init-compiler.sh create mode 100644 eng/common/native/init-distro-rid.sh create mode 100644 eng/common/native/init-os-and-arch.sh create mode 100644 eng/common/native/install-cmake-test.sh create mode 100644 eng/common/native/install-cmake.sh create mode 100644 eng/common/native/install-tool.ps1 create mode 100644 eng/common/post-build/check-channel-consistency.ps1 create mode 100644 eng/common/post-build/nuget-validation.ps1 create mode 100644 eng/common/post-build/nuget-verification.ps1 create mode 100644 eng/common/post-build/publish-using-darc.ps1 create mode 100644 eng/common/post-build/redact-logs.ps1 create mode 100644 eng/common/post-build/sourcelink-validation.ps1 create mode 100644 eng/common/post-build/symbols-validation.ps1 create mode 100644 eng/common/retain-build.ps1 create mode 100644 eng/common/sdk-task.ps1 create mode 100644 eng/common/sdl/NuGet.config create mode 100644 eng/common/sdl/configure-sdl-tool.ps1 create mode 100644 eng/common/sdl/execute-all-sdl-tools.ps1 create mode 100644 eng/common/sdl/extract-artifact-archives.ps1 create mode 100644 eng/common/sdl/extract-artifact-packages.ps1 create mode 100644 eng/common/sdl/init-sdl.ps1 create mode 100644 eng/common/sdl/packages.config create mode 100644 eng/common/sdl/run-sdl.ps1 create mode 100644 eng/common/sdl/sdl.ps1 create mode 100644 eng/common/sdl/trim-assets-version.ps1 create mode 100644 eng/common/template-guidance.md create mode 100644 eng/common/templates-official/job/job.yml create mode 100644 eng/common/templates-official/job/onelocbuild.yml create mode 100644 eng/common/templates-official/job/publish-build-assets.yml create mode 100644 eng/common/templates-official/job/source-build.yml create mode 100644 eng/common/templates-official/job/source-index-stage1.yml create mode 100644 eng/common/templates-official/jobs/codeql-build.yml create mode 100644 eng/common/templates-official/jobs/jobs.yml create mode 100644 eng/common/templates-official/jobs/source-build.yml create mode 100644 eng/common/templates-official/post-build/common-variables.yml create mode 100644 eng/common/templates-official/post-build/post-build.yml create mode 100644 eng/common/templates-official/post-build/setup-maestro-vars.yml create mode 100644 eng/common/templates-official/steps/component-governance.yml create mode 100644 eng/common/templates-official/steps/enable-internal-runtimes.yml create mode 100644 eng/common/templates-official/steps/enable-internal-sources.yml create mode 100644 eng/common/templates-official/steps/generate-sbom.yml create mode 100644 eng/common/templates-official/steps/get-delegation-sas.yml create mode 100644 eng/common/templates-official/steps/get-federated-access-token.yml create mode 100644 eng/common/templates-official/steps/publish-build-artifacts.yml create mode 100644 eng/common/templates-official/steps/publish-logs.yml create mode 100644 eng/common/templates-official/steps/publish-pipeline-artifacts.yml create mode 100644 eng/common/templates-official/steps/retain-build.yml create mode 100644 eng/common/templates-official/steps/send-to-helix.yml create mode 100644 eng/common/templates-official/steps/source-build.yml create mode 100644 eng/common/templates-official/variables/pool-providers.yml create mode 100644 eng/common/templates-official/variables/sdl-variables.yml create mode 100644 eng/common/templates/job/job.yml create mode 100644 eng/common/templates/job/onelocbuild.yml create mode 100644 eng/common/templates/job/publish-build-assets.yml create mode 100644 eng/common/templates/job/source-build.yml create mode 100644 eng/common/templates/job/source-index-stage1.yml create mode 100644 eng/common/templates/jobs/codeql-build.yml create mode 100644 eng/common/templates/jobs/jobs.yml create mode 100644 eng/common/templates/jobs/source-build.yml create mode 100644 eng/common/templates/post-build/common-variables.yml create mode 100644 eng/common/templates/post-build/post-build.yml create mode 100644 eng/common/templates/post-build/setup-maestro-vars.yml create mode 100644 eng/common/templates/steps/component-governance.yml create mode 100644 eng/common/templates/steps/enable-internal-runtimes.yml create mode 100644 eng/common/templates/steps/enable-internal-sources.yml create mode 100644 eng/common/templates/steps/generate-sbom.yml create mode 100644 eng/common/templates/steps/get-delegation-sas.yml create mode 100644 eng/common/templates/steps/get-federated-access-token.yml create mode 100644 eng/common/templates/steps/publish-build-artifacts.yml create mode 100644 eng/common/templates/steps/publish-logs.yml create mode 100644 eng/common/templates/steps/publish-pipeline-artifacts.yml create mode 100644 eng/common/templates/steps/retain-build.yml create mode 100644 eng/common/templates/steps/send-to-helix.yml create mode 100644 eng/common/templates/steps/source-build.yml create mode 100644 eng/common/templates/variables/pool-providers.yml diff --git a/Make.config b/Make.config index 1e2b3574183c..4e93a57c4b94 100644 --- a/Make.config +++ b/Make.config @@ -672,6 +672,7 @@ $(TOP)/dotnet.config: $(TOP)/eng/Versions.props $(TOP)/Build.props $(Q) grep MicrosoftNETCoreAppRefPackageVersion $(TOP)/eng/Versions.props | sed -e 's/<*\/*MicrosoftNETCoreAppRefPackageVersion>//g' -e 's/[ \t]*/BUNDLED_NETCORE_PLATFORMS_PACKAGE_VERSION=/' >> $@.tmp $(Q) grep "<$$(grep EmscriptenWorkloadVersion $(TOP)/eng/Versions.props | sed -e 's_.*>$$[\(]\(.*\)[\)]<.*_\1_')>" $(TOP)/eng/Versions.props | sed -e 's/.*>\(.*\)<.*/EMSCRIPTEN_MANIFEST_PACKAGE_VERSION=\1/' >> $@.tmp $(Q) $(foreach platform,$(ALL_DOTNET_PLATFORMS),grep '' $(TOP)/eng/Versions.props | sed -e 's/<*\/*Microsoft$(platform)SdkPackageVersion>//g' -e 's/[ \t]*/NET8_$(shell echo $(platform) | tr '[:lower:]' '[:upper:]')_NUGET_VERSION_NO_METADATA=/' >> $@.tmp &&) true + $(Q) grep '' $(TOP)/eng/Versions.props | sed -e 's/<*\/*MicrosoftDotNetArcadeSdkPackageVersion>//g' -e 's/[ \t]*/ARCADE_VERSION=/' >> $@.tmp $(Q) mv $@.tmp $@ $(TOP)/Build.props: Make.config diff --git a/Makefile b/Makefile index 780e3ff3803b..80321077195a 100644 --- a/Makefile +++ b/Makefile @@ -72,7 +72,9 @@ all-local:: global.json global.json: $(TOP)/dotnet.config Makefile $(GIT_DIRECTORY)/HEAD $(GIT_DIRECTORY)/index $(Q_GEN) \ printf "{\n" > $@; \ - printf " \"sdk\": {\n \"version\": \"$(DOTNET_VERSION)\"\n }\n" >> $@; \ + printf " \"sdk\": {\n \"version\": \"$(DOTNET_VERSION)\"\n },\n" >> $@; \ + printf " \"tools\": {\n \"dotnet\": \"$(DOTNET_VERSION)\"\n },\n" >> $@; \ + printf " \"msbuild-sdks\": {\n \"Microsoft.DotNet.Arcade.Sdk\": \"$(ARCADE_VERSION)\"\n }\n" >> $@; \ printf "}\n" >> $@ install-hook:: diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b945dcf8c7b0..6d6817b34367 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -82,5 +82,10 @@ https://github.com/dotnet/xharness 8b3d320f930244889da101cd17cbfb6a178b7e35 + + https://github.com/dotnet/arcade + 3c393bbd85ae16ddddba20d0b75035b0c6f1a52d + + diff --git a/eng/Versions.props b/eng/Versions.props index 871d2cf33a8d..cb69cf01a1a5 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -13,6 +13,7 @@ 7.0.100-alpha.1.21601.1 0.11.5-alpha.24480.1 10.0.0-prerelease.24514.1 + 9.0.0-beta.24516.2 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) diff --git a/eng/common/BuildConfiguration/build-configuration.json b/eng/common/BuildConfiguration/build-configuration.json new file mode 100644 index 000000000000..3d1cc89894c9 --- /dev/null +++ b/eng/common/BuildConfiguration/build-configuration.json @@ -0,0 +1,4 @@ +{ + "RetryCountLimit": 1, + "RetryByAnyError": false +} diff --git a/eng/common/CIBuild.cmd b/eng/common/CIBuild.cmd new file mode 100644 index 000000000000..56c2f25ac22f --- /dev/null +++ b/eng/common/CIBuild.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0Build.ps1""" -restore -build -test -sign -pack -publish -ci %*" \ No newline at end of file diff --git a/eng/common/PSScriptAnalyzerSettings.psd1 b/eng/common/PSScriptAnalyzerSettings.psd1 new file mode 100644 index 000000000000..4c1ea7c98ea4 --- /dev/null +++ b/eng/common/PSScriptAnalyzerSettings.psd1 @@ -0,0 +1,11 @@ +@{ + IncludeRules=@('PSAvoidUsingCmdletAliases', + 'PSAvoidUsingWMICmdlet', + 'PSAvoidUsingPositionalParameters', + 'PSAvoidUsingInvokeExpression', + 'PSUseDeclaredVarsMoreThanAssignments', + 'PSUseCmdletCorrectly', + 'PSStandardDSCFunctionsInResource', + 'PSUseIdenticalMandatoryParametersForDSC', + 'PSUseIdenticalParametersForDSC') +} \ No newline at end of file diff --git a/eng/common/README.md b/eng/common/README.md new file mode 100644 index 000000000000..ff49c371527a --- /dev/null +++ b/eng/common/README.md @@ -0,0 +1,28 @@ +# Don't touch this folder + + uuuuuuuuuuuuuuuuuuuu + u" uuuuuuuuuuuuuuuuuu "u + u" u$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + $ $$$" ... "$... ...$" ... "$$$ ... "$$$ $ + $ $$$u `"$$$$$$$ $$$ $$$$$ $$ $$$ $$$ $ + $ $$$$$$uu "$$$$ $$$ $$$$$ $$ """ u$$$ $ + $ $$$""$$$ $$$$ $$$u "$$$" u$$ $$$$$$$$ $ + $ $$$$....,$$$$$..$$$$$....,$$$$..$$$$$$$$ $ + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$" u" + "u """""""""""""""""" u" + """""""""""""""""""" + +!!! Changes made in this directory are subject to being overwritten by automation !!! + +The files in this directory are shared by all Arcade repos and managed by automation. If you need to make changes to these files, open an issue or submit a pull request to https://github.com/dotnet/arcade first. diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1 index 5f3105f21114..5db4ad71ee2f 100644 --- a/eng/common/SetupNugetSources.ps1 +++ b/eng/common/SetupNugetSources.ps1 @@ -1,17 +1,10 @@ -# This file is a temporary workaround for internal builds to be able to restore from private AzDO feeds. -# This file should be removed as part of this issue: https://github.com/dotnet/arcade/issues/4080 +# This script adds internal feeds required to build commits that depend on internal package sources. For instance, +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables +# disabled internal Maestro (darc-int*) feeds. # -# What the script does is iterate over all package sources in the pointed NuGet.config and add a credential entry -# under for each Maestro managed private feed. Two additional credential -# entries are also added for the two private static internal feeds: dotnet3-internal and dotnet3-internal-transport. +# Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # -# This script needs to be called in every job that will restore packages and which the base repo has -# private AzDO feeds in the NuGet.config. -# -# See example YAML call for this script below. Note the use of the variable `$(dn-bot-dnceng-artifact-feeds-rw)` -# from the AzureDevOps-Artifact-Feeds-Pats variable group. -# -# Any disabledPackageSources entries which start with "darc-int" will be re-enabled as part of this script executing +# See example call for this script below. # # - task: PowerShell@2 # displayName: Setup Private Feeds Credentials @@ -21,11 +14,18 @@ # arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token # env: # Token: $(dn-bot-dnceng-artifact-feeds-rw) +# +# Note that the NuGetAuthenticate task should be called after SetupNugetSources. +# This ensures that: +# - Appropriate creds are set for the added internal feeds (if not supplied to the scrupt) +# - The credential provider is installed. +# +# This logic is also abstracted into enable-internal-sources.yml. [CmdletBinding()] param ( [Parameter(Mandatory = $true)][string]$ConfigFile, - [Parameter(Mandatory = $true)][string]$Password + $Password ) $ErrorActionPreference = "Stop" @@ -35,7 +35,7 @@ Set-StrictMode -Version 2.0 . $PSScriptRoot\tools.ps1 # Add source entry to PackageSources -function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Username, $Password) { +function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Username, $pwd) { $packageSource = $sources.SelectSingleNode("add[@key='$SourceName']") if ($packageSource -eq $null) @@ -48,12 +48,17 @@ function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Usern else { Write-Host "Package source $SourceName already present." } - - AddCredential -Creds $creds -Source $SourceName -Username $Username -Password $Password + + AddCredential -Creds $creds -Source $SourceName -Username $Username -pwd $pwd } # Add a credential node for the specified source -function AddCredential($creds, $source, $username, $password) { +function AddCredential($creds, $source, $username, $pwd) { + # If no cred supplied, don't do anything. + if (!$pwd) { + return; + } + # Looks for credential configuration for the given SourceName. Create it if none is found. $sourceElement = $creds.SelectSingleNode($Source) if ($sourceElement -eq $null) @@ -82,17 +87,18 @@ function AddCredential($creds, $source, $username, $password) { $passwordElement.SetAttribute("key", "ClearTextPassword") $sourceElement.AppendChild($passwordElement) | Out-Null } - $passwordElement.SetAttribute("value", $Password) + + $passwordElement.SetAttribute("value", $pwd) } -function InsertMaestroPrivateFeedCredentials($Sources, $Creds, $Username, $Password) { +function InsertMaestroPrivateFeedCredentials($Sources, $Creds, $Username, $pwd) { $maestroPrivateSources = $Sources.SelectNodes("add[contains(@key,'darc-int')]") Write-Host "Inserting credentials for $($maestroPrivateSources.Count) Maestro's private feeds." ForEach ($PackageSource in $maestroPrivateSources) { Write-Host "`tInserting credential for Maestro's feed:" $PackageSource.Key - AddCredential -Creds $creds -Source $PackageSource.Key -Username $Username -Password $Password + AddCredential -Creds $creds -Source $PackageSource.Key -Username $Username -pwd $pwd } } @@ -110,11 +116,6 @@ if (!(Test-Path $ConfigFile -PathType Leaf)) { ExitWithExitCode 1 } -if (!$Password) { - Write-PipelineTelemetryError -Category 'Build' -Message 'Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Please supply a valid PAT' - ExitWithExitCode 1 -} - # Load NuGet.config $doc = New-Object System.Xml.XmlDocument $filename = (Get-Item $ConfigFile).FullName @@ -127,11 +128,14 @@ if ($sources -eq $null) { $doc.DocumentElement.AppendChild($sources) | Out-Null } -# Looks for a node. Create it if none is found. -$creds = $doc.DocumentElement.SelectSingleNode("packageSourceCredentials") -if ($creds -eq $null) { - $creds = $doc.CreateElement("packageSourceCredentials") - $doc.DocumentElement.AppendChild($creds) | Out-Null +$creds = $null +if ($Password) { + # Looks for a node. Create it if none is found. + $creds = $doc.DocumentElement.SelectSingleNode("packageSourceCredentials") + if ($creds -eq $null) { + $creds = $doc.CreateElement("packageSourceCredentials") + $doc.DocumentElement.AppendChild($creds) | Out-Null + } } # Check for disabledPackageSources; we'll enable any darc-int ones we find there @@ -144,24 +148,24 @@ if ($disabledSources -ne $null) { $userName = "dn-bot" # Insert credential nodes for Maestro's private feeds -InsertMaestroPrivateFeedCredentials -Sources $sources -Creds $creds -Username $userName -Password $Password +InsertMaestroPrivateFeedCredentials -Sources $sources -Creds $creds -Username $userName -pwd $Password +# 3.1 uses a different feed url format so it's handled differently here $dotnet31Source = $sources.SelectSingleNode("add[@key='dotnet3.1']") if ($dotnet31Source -ne $null) { - AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password - AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password + AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" -Creds $creds -Username $userName -pwd $Password + AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" -Creds $creds -Username $userName -pwd $Password } -$dotnet5Source = $sources.SelectSingleNode("add[@key='dotnet5']") -if ($dotnet5Source -ne $null) { - AddPackageSource -Sources $sources -SourceName "dotnet5-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password - AddPackageSource -Sources $sources -SourceName "dotnet5-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password -} +$dotnetVersions = @('5','6','7','8','9') -$dotnet6Source = $sources.SelectSingleNode("add[@key='dotnet6']") -if ($dotnet6Source -ne $null) { - AddPackageSource -Sources $sources -SourceName "dotnet6-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password - AddPackageSource -Sources $sources -SourceName "dotnet6-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password +foreach ($dotnetVersion in $dotnetVersions) { + $feedPrefix = "dotnet" + $dotnetVersion; + $dotnetSource = $sources.SelectSingleNode("add[@key='$feedPrefix']") + if ($dotnetSource -ne $null) { + AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal/nuget/v2" -Creds $creds -Username $userName -pwd $Password + AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal-transport/nuget/v2" -Creds $creds -Username $userName -pwd $Password + } } -$doc.Save($filename) \ No newline at end of file +$doc.Save($filename) diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh index 30964e5b9500..4604b61b0323 100644 --- a/eng/common/SetupNugetSources.sh +++ b/eng/common/SetupNugetSources.sh @@ -1,28 +1,27 @@ #!/usr/bin/env bash -# This file is a temporary workaround for internal builds to be able to restore from private AzDO feeds. -# This file should be removed as part of this issue: https://github.com/dotnet/arcade/issues/4080 +# This script adds internal feeds required to build commits that depend on internal package sources. For instance, +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables +# disabled internal Maestro (darc-int*) feeds. +# +# Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # -# What the script does is iterate over all package sources in the pointed NuGet.config and add a credential entry -# under for each Maestro's managed private feed. Two additional credential -# entries are also added for the two private static internal feeds: dotnet3-internal and dotnet3-internal-transport. -# -# This script needs to be called in every job that will restore packages and which the base repo has -# private AzDO feeds in the NuGet.config. -# -# See example YAML call for this script below. Note the use of the variable `$(dn-bot-dnceng-artifact-feeds-rw)` -# from the AzureDevOps-Artifact-Feeds-Pats variable group. -# -# Any disabledPackageSources entries which start with "darc-int" will be re-enabled as part of this script executing. +# See example call for this script below. # # - task: Bash@3 -# displayName: Setup Private Feeds Credentials +# displayName: Setup Internal Feeds # inputs: # filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh -# arguments: $(Build.SourcesDirectory)/NuGet.config $Token +# arguments: $(Build.SourcesDirectory)/NuGet.config # condition: ne(variables['Agent.OS'], 'Windows_NT') -# env: -# Token: $(dn-bot-dnceng-artifact-feeds-rw) +# - task: NuGetAuthenticate@1 +# +# Note that the NuGetAuthenticate task should be called after SetupNugetSources. +# This ensures that: +# - Appropriate creds are set for the added internal feeds (if not supplied to the scrupt) +# - The credential provider is installed. +# +# This logic is also abstracted into enable-internal-sources.yml. ConfigFile=$1 CredToken=$2 @@ -48,11 +47,6 @@ if [ ! -f "$ConfigFile" ]; then ExitWithExitCode 1 fi -if [ -z "$CredToken" ]; then - Write-PipelineTelemetryError -category 'Build' "Error: Eng/common/SetupNugetSources.sh returned a non-zero exit code. Please supply a valid PAT" - ExitWithExitCode 1 -fi - if [[ `uname -s` == "Darwin" ]]; then NL=$'\\\n' TB='' @@ -105,53 +99,33 @@ if [ "$?" == "0" ]; then PackageSources+=('dotnet3.1-internal-transport') fi -# Ensure dotnet5-internal and dotnet5-internal-transport are in the packageSources if the public dotnet5 feeds are present -grep -i "" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=('dotnet5-internal') - - grep -i "" $ConfigFile - if [ "$?" != "0" ]; then - echo "Adding dotnet5-internal-transport to the packageSources." - PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=('dotnet5-internal-transport') -fi +DotNetVersions=('5' '6' '7' '8' '9') -# Ensure dotnet6-internal and dotnet6-internal-transport are in the packageSources if the public dotnet6 feeds are present -grep -i "" +for DotNetVersion in ${DotNetVersions[@]} ; do + FeedPrefix="dotnet${DotNetVersion}"; + grep -i "" - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=('dotnet6-internal') + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile + fi + PackageSources+=("$FeedPrefix-internal") - grep -i "" $ConfigFile - if [ "$?" != "0" ]; then - echo "Adding dotnet6-internal-transport to the packageSources." - PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" + grep -i "" $ConfigFile + if [ "$?" != "0" ]; then + echo "Adding $FeedPrefix-internal-transport to the packageSources." + PackageSourcesNodeFooter="" + PackageSourceTemplate="${TB}" - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile + fi + PackageSources+=("$FeedPrefix-internal-transport") fi - PackageSources+=('dotnet6-internal-transport') -fi +done # I want things split line by line PrevIFS=$IFS @@ -160,18 +134,20 @@ PackageSources+="$IFS" PackageSources+=$(grep -oh '"darc-int-[^"]*"' $ConfigFile | tr -d '"') IFS=$PrevIFS -for FeedName in ${PackageSources[@]} ; do - # Check if there is no existing credential for this FeedName - grep -i "<$FeedName>" $ConfigFile - if [ "$?" != "0" ]; then - echo "Adding credentials for $FeedName." +if [ "$CredToken" ]; then + for FeedName in ${PackageSources[@]} ; do + # Check if there is no existing credential for this FeedName + grep -i "<$FeedName>" $ConfigFile + if [ "$?" != "0" ]; then + echo "Adding credentials for $FeedName." - PackageSourceCredentialsNodeFooter="" - NewCredential="${TB}${TB}<$FeedName>${NL}${NL}${NL}" + PackageSourceCredentialsNodeFooter="" + NewCredential="${TB}${TB}<$FeedName>${NL}${NL}${NL}" - sed -i.bak "s|$PackageSourceCredentialsNodeFooter|$NewCredential${NL}$PackageSourceCredentialsNodeFooter|" $ConfigFile - fi -done + sed -i.bak "s|$PackageSourceCredentialsNodeFooter|$NewCredential${NL}$PackageSourceCredentialsNodeFooter|" $ConfigFile + fi + done +fi # Re-enable any entries in disabledPackageSources where the feed name contains darc-int grep -i "" $ConfigFile @@ -188,4 +164,4 @@ if [ "$?" == "0" ]; then echo "Neutralized disablePackageSources entry for '$DisabledSourceName'" fi done -fi \ No newline at end of file +fi diff --git a/eng/common/build.cmd b/eng/common/build.cmd new file mode 100644 index 000000000000..99daf368abae --- /dev/null +++ b/eng/common/build.cmd @@ -0,0 +1,3 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0build.ps1""" %*" +exit /b %ErrorLevel% diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 new file mode 100644 index 000000000000..438f9920c43e --- /dev/null +++ b/eng/common/build.ps1 @@ -0,0 +1,169 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string][Alias('c')]$configuration = "Debug", + [string]$platform = $null, + [string] $projects, + [string][Alias('v')]$verbosity = "minimal", + [string] $msbuildEngine = $null, + [bool] $warnAsError = $true, + [bool] $nodeReuse = $true, + [switch][Alias('r')]$restore, + [switch] $deployDeps, + [switch][Alias('b')]$build, + [switch] $rebuild, + [switch] $deploy, + [switch][Alias('t')]$test, + [switch] $integrationTest, + [switch] $performanceTest, + [switch] $sign, + [switch] $pack, + [switch] $publish, + [switch] $clean, + [switch][Alias('pb')]$productBuild, + [switch][Alias('bl')]$binaryLog, + [switch][Alias('nobl')]$excludeCIBinarylog, + [switch] $ci, + [switch] $prepareMachine, + [string] $runtimeSourceFeed = '', + [string] $runtimeSourceFeedKey = '', + [switch] $excludePrereleaseVS, + [switch] $nativeToolsOnMachine, + [switch] $help, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties +) + +# Unset 'Platform' environment variable to avoid unwanted collision in InstallDotNetCore.targets file +# some computer has this env var defined (e.g. Some HP) +if($env:Platform) { + $env:Platform="" +} +function Print-Usage() { + Write-Host "Common settings:" + Write-Host " -configuration Build configuration: 'Debug' or 'Release' (short: -c)" + Write-Host " -platform Platform configuration: 'x86', 'x64' or any valid Platform value to pass to msbuild" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + Write-Host " -binaryLog Output binary log (short: -bl)" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Actions:" + Write-Host " -restore Restore dependencies (short: -r)" + Write-Host " -build Build solution (short: -b)" + Write-Host " -rebuild Rebuild solution" + Write-Host " -deploy Deploy built VSIXes" + Write-Host " -deployDeps Deploy dependencies (e.g. VSIXes for integration tests)" + Write-Host " -test Run all unit tests in the solution (short: -t)" + Write-Host " -integrationTest Run all integration tests in the solution" + Write-Host " -performanceTest Run all performance tests in the solution" + Write-Host " -pack Package build outputs into NuGet packages and Willow components" + Write-Host " -sign Sign build outputs" + Write-Host " -publish Publish artifacts (e.g. symbols)" + Write-Host " -clean Clean the solution" + Write-Host " -productBuild Build the solution in the way it will be built in the full .NET product (VMR) build (short: -pb)" + Write-Host "" + + Write-Host "Advanced settings:" + Write-Host " -projects Semi-colon delimited list of sln/proj's to build. Globbing is supported (*.sln)" + Write-Host " -ci Set when running on CI server" + Write-Host " -excludeCIBinarylog Don't output binary log (short: -nobl)" + Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build" + Write-Host " -warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host " -excludePrereleaseVS Set to exclude build engines in prerelease versions of Visual Studio" + Write-Host " -nativeToolsOnMachine Sets the native tools on machine environment variable (indicating that the script should use native tools on machine)" + Write-Host "" + + Write-Host "Command line arguments not listed above are passed thru to msbuild." + Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)." +} + +. $PSScriptRoot\tools.ps1 + +function InitializeCustomToolset { + if (-not $restore) { + return + } + + $script = Join-Path $EngRoot 'restore-toolset.ps1' + + if (Test-Path $script) { + . $script + } +} + +function Build { + $toolsetBuildProj = InitializeToolset + InitializeCustomToolset + + $bl = if ($binaryLog) { '/bl:' + (Join-Path $LogDir 'Build.binlog') } else { '' } + $platformArg = if ($platform) { "/p:Platform=$platform" } else { '' } + + if ($projects) { + # Re-assign properties to a new variable because PowerShell doesn't let us append properties directly for unclear reasons. + # Explicitly set the type as string[] because otherwise PowerShell would make this char[] if $properties is empty. + [string[]] $msbuildArgs = $properties + + # Resolve relative project paths into full paths + $projects = ($projects.Split(';').ForEach({Resolve-Path $_}) -join ';') + + $msbuildArgs += "/p:Projects=$projects" + $properties = $msbuildArgs + } + + MSBuild $toolsetBuildProj ` + $bl ` + $platformArg ` + /p:Configuration=$configuration ` + /p:RepoRoot=$RepoRoot ` + /p:Restore=$restore ` + /p:DeployDeps=$deployDeps ` + /p:Build=$build ` + /p:Rebuild=$rebuild ` + /p:Deploy=$deploy ` + /p:Test=$test ` + /p:Pack=$pack ` + /p:DotNetBuildRepo=$productBuild ` + /p:IntegrationTest=$integrationTest ` + /p:PerformanceTest=$performanceTest ` + /p:Sign=$sign ` + /p:Publish=$publish ` + @properties +} + +try { + if ($clean) { + if (Test-Path $ArtifactsDir) { + Remove-Item -Recurse -Force $ArtifactsDir + Write-Host 'Artifacts directory deleted.' + } + exit 0 + } + + if ($help -or (($null -ne $properties) -and ($properties.Contains('/help') -or $properties.Contains('/?')))) { + Print-Usage + exit 0 + } + + if ($ci) { + if (-not $excludeCIBinarylog) { + $binaryLog = $true + } + $nodeReuse = $false + } + + if ($nativeToolsOnMachine) { + $env:NativeToolsOnMachine = $true + } + if ($restore) { + InitializeNativeTools + } + + Build +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_ + ExitWithExitCode 1 +} + +ExitWithExitCode 0 diff --git a/eng/common/build.sh b/eng/common/build.sh new file mode 100644 index 000000000000..ac1ee8620cd2 --- /dev/null +++ b/eng/common/build.sh @@ -0,0 +1,260 @@ +#!/usr/bin/env bash + +# Stop script if unbound variable found (use ${var:-} if intentional) +set -u + +# Stop script if command returns non-zero exit code. +# Prevents hidden errors caused by missing error code propagation. +set -e + +usage() +{ + echo "Common settings:" + echo " --configuration Build configuration: 'Debug' or 'Release' (short: -c)" + echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + echo " --binaryLog Create MSBuild binary log (short: -bl)" + echo " --help Print help and exit (short: -h)" + echo "" + + echo "Actions:" + echo " --restore Restore dependencies (short: -r)" + echo " --build Build solution (short: -b)" + echo " --sourceBuild Source-build the solution (short: -sb)" + echo " Will additionally trigger the following actions: --restore, --build, --pack" + echo " If --configuration is not set explicitly, will also set it to 'Release'" + echo " --productBuild Build the solution in the way it will be built in the full .NET product (VMR) build (short: -pb)" + echo " Will additionally trigger the following actions: --restore, --build, --pack" + echo " If --configuration is not set explicitly, will also set it to 'Release'" + echo " --rebuild Rebuild solution" + echo " --test Run all unit tests in the solution (short: -t)" + echo " --integrationTest Run all integration tests in the solution" + echo " --performanceTest Run all performance tests in the solution" + echo " --pack Package build outputs into NuGet packages and Willow components" + echo " --sign Sign build outputs" + echo " --publish Publish artifacts (e.g. symbols)" + echo " --clean Clean the solution" + echo "" + + echo "Advanced settings:" + echo " --projects Project or solution file(s) to build" + echo " --ci Set when running on CI server" + echo " --excludeCIBinarylog Don't output binary log (short: -nobl)" + echo " --prepareMachine Prepare machine for CI run, clean up processes after build" + echo " --nodeReuse Sets nodereuse msbuild parameter ('true' or 'false')" + echo " --warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" + echo "" + echo "Command line arguments not listed above are passed thru to msbuild." + echo "Arguments can also be passed in with a single hyphen." +} + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +restore=false +build=false +source_build=false +product_build=false +rebuild=false +test=false +integration_test=false +performance_test=false +pack=false +publish=false +sign=false +public=false +ci=false +clean=false + +warn_as_error=true +node_reuse=true +binary_log=false +exclude_ci_binary_log=false +pipelines_log=false + +projects='' +configuration='' +prepare_machine=false +verbosity='minimal' +runtime_source_feed='' +runtime_source_feed_key='' + +properties='' +while [[ $# > 0 ]]; do + opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")" + case "$opt" in + -help|-h) + usage + exit 0 + ;; + -clean) + clean=true + ;; + -configuration|-c) + configuration=$2 + shift + ;; + -verbosity|-v) + verbosity=$2 + shift + ;; + -binarylog|-bl) + binary_log=true + ;; + -excludecibinarylog|-nobl) + exclude_ci_binary_log=true + ;; + -pipelineslog|-pl) + pipelines_log=true + ;; + -restore|-r) + restore=true + ;; + -build|-b) + build=true + ;; + -rebuild) + rebuild=true + ;; + -pack) + pack=true + ;; + -sourcebuild|-sb) + build=true + source_build=true + product_build=true + restore=true + pack=true + ;; + -productBuild|-pb) + build=true + product_build=true + restore=true + pack=true + ;; + -test|-t) + test=true + ;; + -integrationtest) + integration_test=true + ;; + -performancetest) + performance_test=true + ;; + -sign) + sign=true + ;; + -publish) + publish=true + ;; + -preparemachine) + prepare_machine=true + ;; + -projects) + projects=$2 + shift + ;; + -ci) + ci=true + ;; + -warnaserror) + warn_as_error=$2 + shift + ;; + -nodereuse) + node_reuse=$2 + shift + ;; + -runtimesourcefeed) + runtime_source_feed=$2 + shift + ;; + -runtimesourcefeedkey) + runtime_source_feed_key=$2 + shift + ;; + *) + properties="$properties $1" + ;; + esac + + shift +done + +if [[ -z "$configuration" ]]; then + if [[ "$source_build" = true ]]; then configuration="Release"; else configuration="Debug"; fi +fi + +if [[ "$ci" == true ]]; then + pipelines_log=true + node_reuse=false + if [[ "$exclude_ci_binary_log" == false ]]; then + binary_log=true + fi +fi + +. "$scriptroot/tools.sh" + +function InitializeCustomToolset { + local script="$eng_root/restore-toolset.sh" + + if [[ -a "$script" ]]; then + . "$script" + fi +} + +function Build { + InitializeToolset + InitializeCustomToolset + + if [[ ! -z "$projects" ]]; then + properties="$properties /p:Projects=$projects" + fi + + local bl="" + if [[ "$binary_log" == true ]]; then + bl="/bl:\"$log_dir/Build.binlog\"" + fi + + MSBuild $_InitializeToolset \ + $bl \ + /p:Configuration=$configuration \ + /p:RepoRoot="$repo_root" \ + /p:Restore=$restore \ + /p:Build=$build \ + /p:DotNetBuildRepo=$product_build \ + /p:ArcadeBuildFromSource=$source_build \ + /p:DotNetBuildSourceOnly=$source_build \ + /p:Rebuild=$rebuild \ + /p:Test=$test \ + /p:Pack=$pack \ + /p:IntegrationTest=$integration_test \ + /p:PerformanceTest=$performance_test \ + /p:Sign=$sign \ + /p:Publish=$publish \ + $properties + + ExitWithExitCode 0 +} + +if [[ "$clean" == true ]]; then + if [ -d "$artifacts_dir" ]; then + rm -rf $artifacts_dir + echo "Artifacts directory deleted." + fi + exit 0 +fi + +if [[ "$restore" == true ]]; then + InitializeNativeTools +fi + +Build diff --git a/eng/common/cibuild.sh b/eng/common/cibuild.sh new file mode 100644 index 000000000000..1a02c0dec8fd --- /dev/null +++ b/eng/common/cibuild.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where + # the symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. "$scriptroot/build.sh" --restore --build --test --pack --publish --ci $@ \ No newline at end of file diff --git a/eng/common/core-templates/job/job.yml b/eng/common/core-templates/job/job.yml new file mode 100644 index 000000000000..ba53ebfbd513 --- /dev/null +++ b/eng/common/core-templates/job/job.yml @@ -0,0 +1,247 @@ +parameters: +# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job + cancelTimeoutInMinutes: '' + condition: '' + container: '' + continueOnError: false + dependsOn: '' + displayName: '' + pool: '' + steps: [] + strategy: '' + timeoutInMinutes: '' + variables: [] + workspace: '' + templateContext: {} + +# Job base template specific parameters + # See schema documentation - https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/TemplateSchema.md + # publishing defaults + artifacts: '' + enableMicrobuild: false + enablePublishBuildArtifacts: false + enablePublishBuildAssets: false + enablePublishTestResults: false + enablePublishUsingPipelines: false + enableBuildRetry: false + mergeTestResults: false + testRunTitle: '' + testResultsFormat: '' + name: '' + componentGovernanceSteps: [] + preSteps: [] + artifactPublishSteps: [] + runAsPublic: false + +# 1es specific parameters + is1ESPipeline: '' + +jobs: +- job: ${{ parameters.name }} + + ${{ if ne(parameters.cancelTimeoutInMinutes, '') }}: + cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }} + + ${{ if ne(parameters.condition, '') }}: + condition: ${{ parameters.condition }} + + ${{ if ne(parameters.container, '') }}: + container: ${{ parameters.container }} + + ${{ if ne(parameters.continueOnError, '') }}: + continueOnError: ${{ parameters.continueOnError }} + + ${{ if ne(parameters.dependsOn, '') }}: + dependsOn: ${{ parameters.dependsOn }} + + ${{ if ne(parameters.displayName, '') }}: + displayName: ${{ parameters.displayName }} + + ${{ if ne(parameters.pool, '') }}: + pool: ${{ parameters.pool }} + + ${{ if ne(parameters.strategy, '') }}: + strategy: ${{ parameters.strategy }} + + ${{ if ne(parameters.timeoutInMinutes, '') }}: + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + + ${{ if ne(parameters.templateContext, '') }}: + templateContext: ${{ parameters.templateContext }} + + variables: + - ${{ if ne(parameters.enableTelemetry, 'false') }}: + - name: DOTNET_CLI_TELEMETRY_PROFILE + value: '$(Build.Repository.Uri)' + - ${{ if eq(parameters.enableRichCodeNavigation, 'true') }}: + - name: EnableRichCodeNavigation + value: 'true' + # Retry signature validation up to three times, waiting 2 seconds between attempts. + # See https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028#retry-untrusted-root-failures + - name: NUGET_EXPERIMENTAL_CHAIN_BUILD_RETRY_POLICY + value: 3,2000 + - ${{ each variable in parameters.variables }}: + # handle name-value variable syntax + # example: + # - name: [key] + # value: [value] + - ${{ if ne(variable.name, '') }}: + - name: ${{ variable.name }} + value: ${{ variable.value }} + + # handle variable groups + - ${{ if ne(variable.group, '') }}: + - group: ${{ variable.group }} + + # handle template variable syntax + # example: + # - template: path/to/template.yml + # parameters: + # [key]: [value] + - ${{ if ne(variable.template, '') }}: + - template: ${{ variable.template }} + ${{ if ne(variable.parameters, '') }}: + parameters: ${{ variable.parameters }} + + # handle key-value variable syntax. + # example: + # - [key]: [value] + - ${{ if and(eq(variable.name, ''), eq(variable.group, ''), eq(variable.template, '')) }}: + - ${{ each pair in variable }}: + - name: ${{ pair.key }} + value: ${{ pair.value }} + + # DotNet-HelixApi-Access provides 'HelixApiAccessToken' for internal builds + - ${{ if and(eq(parameters.enableTelemetry, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - group: DotNet-HelixApi-Access + + ${{ if ne(parameters.workspace, '') }}: + workspace: ${{ parameters.workspace }} + + steps: + - ${{ if eq(parameters.is1ESPipeline, '') }}: + - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error + + - ${{ if ne(parameters.preSteps, '') }}: + - ${{ each preStep in parameters.preSteps }}: + - ${{ preStep }} + + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - task: MicroBuildSigningPlugin@4 + displayName: Install MicroBuild plugin + inputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + env: + TeamName: $(_TeamName) + MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)' + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + + - ${{ if and(eq(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'internal')) }}: + - task: NuGetAuthenticate@1 + + - ${{ if and(ne(parameters.artifacts.download, 'false'), ne(parameters.artifacts.download, '')) }}: + - task: DownloadPipelineArtifact@2 + inputs: + buildType: current + artifactName: ${{ coalesce(parameters.artifacts.download.name, 'Artifacts_$(Agent.OS)_$(_BuildConfig)') }} + targetPath: ${{ coalesce(parameters.artifacts.download.path, 'artifacts') }} + itemPattern: ${{ coalesce(parameters.artifacts.download.pattern, '**') }} + + - ${{ each step in parameters.steps }}: + - ${{ step }} + + - ${{ if eq(parameters.enableRichCodeNavigation, true) }}: + - task: RichCodeNavIndexer@0 + displayName: RichCodeNav Upload + inputs: + languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }} + environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'internal') }} + richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin + uploadRichNavArtifacts: ${{ coalesce(parameters.richCodeNavigationUploadArtifacts, false) }} + continueOnError: true + + - ${{ each step in parameters.componentGovernanceSteps }}: + - ${{ step }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildCleanup@1 + displayName: Execute Microbuild cleanup tasks + condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + env: + TeamName: $(_TeamName) + + # Publish test results + - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}: + - task: PublishTestResults@2 + displayName: Publish XUnit Test Results + inputs: + testResultsFormat: 'xUnit' + testResultsFiles: '*.xml' + searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' + testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-xunit + mergeTestResults: ${{ parameters.mergeTestResults }} + continueOnError: true + condition: always() + - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'vstest')) }}: + - task: PublishTestResults@2 + displayName: Publish TRX Test Results + inputs: + testResultsFormat: 'VSTest' + testResultsFiles: '*.trx' + searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' + testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-trx + mergeTestResults: ${{ parameters.mergeTestResults }} + continueOnError: true + condition: always() + + # gather artifacts + - ${{ if ne(parameters.artifacts.publish, '') }}: + - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}: + - task: CopyFiles@2 + displayName: Gather binaries for publish to artifacts + inputs: + SourceFolder: 'artifacts/bin' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin' + - task: CopyFiles@2 + displayName: Gather packages for publish to artifacts + inputs: + SourceFolder: 'artifacts/packages' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages' + - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}: + - task: CopyFiles@2 + displayName: Gather logs for publish to artifacts + inputs: + SourceFolder: 'artifacts/log' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/log' + continueOnError: true + condition: always() + + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: + - task: CopyFiles@2 + displayName: Gather logs for publish to artifacts + inputs: + SourceFolder: 'artifacts/log/$(_BuildConfig)' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)' + continueOnError: true + condition: always() + - ${{ if eq(parameters.enableBuildRetry, 'true') }}: + - task: CopyFiles@2 + displayName: Gather buildconfiguration for build retry + inputs: + SourceFolder: '$(Build.SourcesDirectory)/eng/common/BuildConfiguration' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/eng/common/BuildConfiguration' + continueOnError: true + condition: always() + - ${{ each step in parameters.artifactPublishSteps }}: + - ${{ step }} diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml new file mode 100644 index 000000000000..00feec8ebbc3 --- /dev/null +++ b/eng/common/core-templates/job/onelocbuild.yml @@ -0,0 +1,121 @@ +parameters: + # Optional: dependencies of the job + dependsOn: '' + + # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool + pool: '' + + CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex + GithubPat: $(BotAccount-dotnet-bot-repo-PAT) + + SourcesDirectory: $(Build.SourcesDirectory) + CreatePr: true + AutoCompletePr: false + ReusePr: true + UseLfLineEndings: true + UseCheckedInLocProjectJson: false + SkipLocProjectJsonGeneration: false + LanguageSet: VS_Main_Languages + LclSource: lclFilesInRepo + LclPackageId: '' + RepoType: gitHub + GitHubOrg: dotnet + MirrorRepo: '' + MirrorBranch: main + condition: '' + JobNameSuffix: '' + is1ESPipeline: '' +jobs: +- job: OneLocBuild${{ parameters.JobNameSuffix }} + + dependsOn: ${{ parameters.dependsOn }} + + displayName: OneLocBuild${{ parameters.JobNameSuffix }} + + variables: + - group: OneLocBuildVariables # Contains the CeapexPat and GithubPat + - name: _GenerateLocProjectArguments + value: -SourcesDirectory ${{ parameters.SourcesDirectory }} + -LanguageSet "${{ parameters.LanguageSet }}" + -CreateNeutralXlfs + - ${{ if eq(parameters.UseCheckedInLocProjectJson, 'true') }}: + - name: _GenerateLocProjectArguments + value: ${{ variables._GenerateLocProjectArguments }} -UseCheckedInLocProjectJson + - template: /eng/common/core-templates/variables/pool-providers.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + ${{ if ne(parameters.pool, '') }}: + pool: ${{ parameters.pool }} + ${{ if eq(parameters.pool, '') }}: + pool: + # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + demands: Cmd + os: windows + # If it's not devdiv, it's dnceng + ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}: + name: $(DncEngInternalBuildPool) + image: 1es-windows-2022 + os: windows + + steps: + - ${{ if eq(parameters.is1ESPipeline, '') }}: + - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error + + - ${{ if ne(parameters.SkipLocProjectJsonGeneration, 'true') }}: + - task: Powershell@2 + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1 + arguments: $(_GenerateLocProjectArguments) + displayName: Generate LocProject.json + condition: ${{ parameters.condition }} + + - task: OneLocBuild@2 + displayName: OneLocBuild + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + inputs: + locProj: eng/Localize/LocProject.json + outDir: $(Build.ArtifactStagingDirectory) + lclSource: ${{ parameters.LclSource }} + lclPackageId: ${{ parameters.LclPackageId }} + isCreatePrSelected: ${{ parameters.CreatePr }} + isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }} + ${{ if eq(parameters.CreatePr, true) }}: + isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }} + ${{ if eq(parameters.RepoType, 'gitHub') }}: + isShouldReusePrSelected: ${{ parameters.ReusePr }} + packageSourceAuth: patAuth + patVariable: ${{ parameters.CeapexPat }} + ${{ if eq(parameters.RepoType, 'gitHub') }}: + repoType: ${{ parameters.RepoType }} + gitHubPatVariable: "${{ parameters.GithubPat }}" + ${{ if ne(parameters.MirrorRepo, '') }}: + isMirrorRepoSelected: true + gitHubOrganization: ${{ parameters.GitHubOrg }} + mirrorRepo: ${{ parameters.MirrorRepo }} + mirrorBranch: ${{ parameters.MirrorBranch }} + condition: ${{ parameters.condition }} + + - template: /eng/common/core-templates/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + args: + displayName: Publish Localization Files + pathToPublish: '$(Build.ArtifactStagingDirectory)/loc' + publishLocation: Container + artifactName: Loc + condition: ${{ parameters.condition }} + + - template: /eng/common/core-templates/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + args: + displayName: Publish LocProject.json + pathToPublish: '$(Build.SourcesDirectory)/eng/Localize/' + publishLocation: Container + artifactName: Loc + condition: ${{ parameters.condition }} \ No newline at end of file diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml new file mode 100644 index 000000000000..3d3356e31967 --- /dev/null +++ b/eng/common/core-templates/job/publish-build-assets.yml @@ -0,0 +1,158 @@ +parameters: + configuration: 'Debug' + + # Optional: condition for the job to run + condition: '' + + # Optional: 'true' if future jobs should run even if this job fails + continueOnError: false + + # Optional: dependencies of the job + dependsOn: '' + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool + pool: {} + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + + # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing + publishUsingPipelines: false + + # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing + publishAssetsImmediately: false + + artifactsPublishingAdditionalParameters: '' + + signingValidationAdditionalParameters: '' + + is1ESPipeline: '' + +jobs: +- job: Asset_Registry_Publish + + dependsOn: ${{ parameters.dependsOn }} + timeoutInMinutes: 150 + + ${{ if eq(parameters.publishAssetsImmediately, 'true') }}: + displayName: Publish Assets + ${{ else }}: + displayName: Publish to Build Asset Registry + + variables: + - template: /eng/common/core-templates/variables/pool-providers.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - group: Publish-Build-Assets + - group: AzureDevOps-Artifact-Feeds-Pats + - name: runCodesignValidationInjection + value: false + # unconditional - needed for logs publishing (redactor tool version) + - template: /eng/common/core-templates/post-build/common-variables.yml + + pool: + # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + demands: Cmd + os: windows + # If it's not devdiv, it's dnceng + ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}: + name: NetCore1ESPool-Publishing-Internal + image: windows.vs2019.amd64 + os: windows + steps: + - ${{ if eq(parameters.is1ESPipeline, '') }}: + - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error + + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - checkout: self + fetchDepth: 3 + clean: true + + - task: DownloadBuildArtifacts@0 + displayName: Download artifact + inputs: + artifactName: AssetManifests + downloadPath: '$(Build.StagingDirectory)/Download' + checkDownloadedFiles: true + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + + - task: NuGetAuthenticate@1 + + - task: AzureCLI@2 + displayName: Publish Build Assets + inputs: + azureSubscription: "Darc: Maestro Production" + scriptType: ps + scriptLocation: scriptPath + scriptPath: $(Build.SourcesDirectory)/eng/common/sdk-task.ps1 + arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet + /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:MaestroApiEndpoint=https://maestro.dot.net + /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }} + /p:OfficialBuildId=$(Build.BuildNumber) + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + + - task: powershell@2 + displayName: Create ReleaseConfigs Artifact + inputs: + targetType: inline + script: | + New-Item -Path "$(Build.StagingDirectory)/ReleaseConfigs" -ItemType Directory -Force + $filePath = "$(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt" + Add-Content -Path $filePath -Value $(BARBuildId) + Add-Content -Path $filePath -Value "$(DefaultChannels)" + Add-Content -Path $filePath -Value $(IsStableBuild) + + $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt" + if (Test-Path -Path $symbolExclusionfile) + { + Write-Host "SymbolExclusionFile exists" + Copy-Item -Path $symbolExclusionfile -Destination "$(Build.StagingDirectory)/ReleaseConfigs" + } + + - template: /eng/common/core-templates/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + args: + displayName: Publish ReleaseConfigs Artifact + pathToPublish: '$(Build.StagingDirectory)/ReleaseConfigs' + publishLocation: Container + artifactName: ReleaseConfigs + + - ${{ if eq(parameters.publishAssetsImmediately, 'true') }}: + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + - task: AzureCLI@2 + displayName: Publish Using Darc + inputs: + azureSubscription: "Darc: Maestro Production" + scriptType: ps + scriptLocation: scriptPath + scriptPath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1 + arguments: > + -BuildId $(BARBuildId) + -PublishingInfraVersion 3 + -AzdoToken '$(System.AccessToken)' + -WaitPublishingFinish true + -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}' + -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}' + + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: + - template: /eng/common/core-templates/steps/publish-logs.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + JobLabel: 'Publish_Artifacts_Logs' diff --git a/eng/common/core-templates/job/source-build.yml b/eng/common/core-templates/job/source-build.yml new file mode 100644 index 000000000000..c4713c8b6ede --- /dev/null +++ b/eng/common/core-templates/job/source-build.yml @@ -0,0 +1,93 @@ +parameters: + # This template adds arcade-powered source-build to CI. The template produces a server job with a + # default ID 'Source_Build_Complete' to put in a dependency list if necessary. + + # Specifies the prefix for source-build jobs added to pipeline. Use this if disambiguation needed. + jobNamePrefix: 'Source_Build' + + # Defines the platform on which to run the job. By default, a linux-x64 machine, suitable for + # managed-only repositories. This is an object with these properties: + # + # name: '' + # The name of the job. This is included in the job ID. + # targetRID: '' + # The name of the target RID to use, instead of the one auto-detected by Arcade. + # nonPortable: false + # Enables non-portable mode. This means a more specific RID (e.g. fedora.32-x64 rather than + # linux-x64), and compiling against distro-provided packages rather than portable ones. + # skipPublishValidation: false + # Disables publishing validation. By default, a check is performed to ensure no packages are + # published by source-build. + # container: '' + # A container to use. Runs in docker. + # pool: {} + # A pool to use. Runs directly on an agent. + # buildScript: '' + # Specifies the build script to invoke to perform the build in the repo. The default + # './build.sh' should work for typical Arcade repositories, but this is customizable for + # difficult situations. + # jobProperties: {} + # A list of job properties to inject at the top level, for potential extensibility beyond + # container and pool. + platform: {} + + is1ESPipeline: '' + + # If set to true and running on a non-public project, + # Internal nuget and blob storage locations will be enabled. + # This is not enabled by default because many repositories do not need internal sources + # and do not need to have the required service connections approved in the pipeline. + enableInternalSources: false + +jobs: +- job: ${{ parameters.jobNamePrefix }}_${{ parameters.platform.name }} + displayName: Source-Build (${{ parameters.platform.name }}) + + ${{ each property in parameters.platform.jobProperties }}: + ${{ property.key }}: ${{ property.value }} + + ${{ if ne(parameters.platform.container, '') }}: + container: ${{ parameters.platform.container }} + + ${{ if eq(parameters.platform.pool, '') }}: + # The default VM host AzDO pool. This should be capable of running Docker containers: almost all + # source-build builds run in Docker, including the default managed platform. + # /eng/common/core-templates/variables/pool-providers.yml can't be used here (some customers declare variables already), so duplicate its logic + ${{ if eq(parameters.is1ESPipeline, 'true') }}: + pool: + ${{ if eq(variables['System.TeamProject'], 'public') }}: + name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')] + demands: ImageOverride -equals build.ubuntu.2004.amd64 + ${{ if eq(variables['System.TeamProject'], 'internal') }}: + name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')] + image: 1es-mariner-2 + os: linux + ${{ else }}: + pool: + ${{ if eq(variables['System.TeamProject'], 'public') }}: + name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')] + demands: ImageOverride -equals Build.Ubuntu.2204.Amd64.Open + ${{ if eq(variables['System.TeamProject'], 'internal') }}: + name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')] + demands: ImageOverride -equals Build.Ubuntu.2204.Amd64 + ${{ if ne(parameters.platform.pool, '') }}: + pool: ${{ parameters.platform.pool }} + + workspace: + clean: all + + steps: + - ${{ if eq(parameters.is1ESPipeline, '') }}: + - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error + + - ${{ if eq(parameters.enableInternalSources, true) }}: + - template: /eng/common/core-templates/steps/enable-internal-sources.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + - template: /eng/common/core-templates/steps/enable-internal-runtimes.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + - template: /eng/common/core-templates/steps/source-build.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + platform: ${{ parameters.platform }} diff --git a/eng/common/core-templates/job/source-index-stage1.yml b/eng/common/core-templates/job/source-index-stage1.yml new file mode 100644 index 000000000000..205fb5b3a395 --- /dev/null +++ b/eng/common/core-templates/job/source-index-stage1.yml @@ -0,0 +1,81 @@ +parameters: + runAsPublic: false + sourceIndexUploadPackageVersion: 2.0.0-20240522.1 + sourceIndexProcessBinlogPackageVersion: 1.0.1-20240522.1 + sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json + sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci" + preSteps: [] + binlogPath: artifacts/log/Debug/Build.binlog + condition: '' + dependsOn: '' + pool: '' + is1ESPipeline: '' + +jobs: +- job: SourceIndexStage1 + dependsOn: ${{ parameters.dependsOn }} + condition: ${{ parameters.condition }} + variables: + - name: SourceIndexUploadPackageVersion + value: ${{ parameters.sourceIndexUploadPackageVersion }} + - name: SourceIndexProcessBinlogPackageVersion + value: ${{ parameters.sourceIndexProcessBinlogPackageVersion }} + - name: SourceIndexPackageSource + value: ${{ parameters.sourceIndexPackageSource }} + - name: BinlogPath + value: ${{ parameters.binlogPath }} + - template: /eng/common/core-templates/variables/pool-providers.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + ${{ if ne(parameters.pool, '') }}: + pool: ${{ parameters.pool }} + ${{ if eq(parameters.pool, '') }}: + pool: + ${{ if eq(variables['System.TeamProject'], 'public') }}: + name: $(DncEngPublicBuildPool) + image: 1es-windows-2022-open + os: windows + ${{ if eq(variables['System.TeamProject'], 'internal') }}: + name: $(DncEngInternalBuildPool) + image: 1es-windows-2022 + os: windows + + steps: + - ${{ if eq(parameters.is1ESPipeline, '') }}: + - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error + + - ${{ each preStep in parameters.preSteps }}: + - ${{ preStep }} + + - task: UseDotNet@2 + displayName: Use .NET 8 SDK + inputs: + packageType: sdk + version: 8.0.x + installationPath: $(Agent.TempDirectory)/dotnet + workingDirectory: $(Agent.TempDirectory) + + - script: | + $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version $(sourceIndexProcessBinlogPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools + $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version $(sourceIndexUploadPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools + displayName: Download Tools + # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk. + workingDirectory: $(Agent.TempDirectory) + + - script: ${{ parameters.sourceIndexBuildCommand }} + displayName: Build Repository + + - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(Build.SourcesDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output + displayName: Process Binlog into indexable sln + + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: AzureCLI@2 + displayName: Log in to Azure and upload stage1 artifacts to source index + inputs: + azureSubscription: 'SourceDotNet Stage1 Publish' + addSpnToEnvironment: true + scriptType: 'ps' + scriptLocation: 'inlineScript' + inlineScript: | + $(Agent.TempDirectory)/.source-index/tools/UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name) -s netsourceindexstage1 -b stage1 diff --git a/eng/common/core-templates/jobs/codeql-build.yml b/eng/common/core-templates/jobs/codeql-build.yml new file mode 100644 index 000000000000..f2144252cc65 --- /dev/null +++ b/eng/common/core-templates/jobs/codeql-build.yml @@ -0,0 +1,33 @@ +parameters: + # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md + continueOnError: false + # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job + jobs: [] + # Optional: if specified, restore and use this version of Guardian instead of the default. + overrideGuardianVersion: '' + is1ESPipeline: '' + +jobs: +- template: /eng/common/core-templates/jobs/jobs.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + enableMicrobuild: false + enablePublishBuildArtifacts: false + enablePublishTestResults: false + enablePublishBuildAssets: false + enablePublishUsingPipelines: false + enableTelemetry: true + + variables: + - group: Publish-Build-Assets + # The Guardian version specified in 'eng/common/sdl/packages.config'. This value must be kept in + # sync with the packages.config file. + - name: DefaultGuardianVersion + value: 0.109.0 + - name: GuardianPackagesConfigFile + value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config + - name: GuardianVersion + value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }} + + jobs: ${{ parameters.jobs }} + diff --git a/eng/common/core-templates/jobs/jobs.yml b/eng/common/core-templates/jobs/jobs.yml new file mode 100644 index 000000000000..ea69be4341c6 --- /dev/null +++ b/eng/common/core-templates/jobs/jobs.yml @@ -0,0 +1,119 @@ +parameters: + # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md + continueOnError: false + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: Enable publishing using release pipelines + enablePublishUsingPipelines: false + + # Optional: Enable running the source-build jobs to build repo from source + enableSourceBuild: false + + # Optional: Parameters for source-build template. + # See /eng/common/core-templates/jobs/source-build.yml for options + sourceBuildParameters: [] + + graphFileGeneration: + # Optional: Enable generating the graph files at the end of the build + enabled: false + # Optional: Include toolset dependencies in the generated graph files + includeToolset: false + + # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job + jobs: [] + + # Optional: Override automatically derived dependsOn value for "publish build assets" job + publishBuildAssetsDependsOn: '' + + # Optional: Publish the assets as soon as the publish to BAR stage is complete, rather doing so in a separate stage. + publishAssetsImmediately: false + + # Optional: If using publishAssetsImmediately and additional parameters are needed, can be used to send along additional parameters (normally sent to post-build.yml) + artifactsPublishingAdditionalParameters: '' + signingValidationAdditionalParameters: '' + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + + enableSourceIndex: false + sourceIndexParams: {} + + artifacts: {} + is1ESPipeline: '' + +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + +jobs: +- ${{ each job in parameters.jobs }}: + - ${{ if eq(parameters.is1ESPipeline, 'true') }}: + - template: /eng/common/templates-official/job/job.yml + parameters: + # pass along parameters + ${{ each parameter in parameters }}: + ${{ if ne(parameter.key, 'jobs') }}: + ${{ parameter.key }}: ${{ parameter.value }} + + # pass along job properties + ${{ each property in job }}: + ${{ if ne(property.key, 'job') }}: + ${{ property.key }}: ${{ property.value }} + + name: ${{ job.job }} + + - ${{ else }}: + - template: /eng/common/templates/job/job.yml + parameters: + # pass along parameters + ${{ each parameter in parameters }}: + ${{ if ne(parameter.key, 'jobs') }}: + ${{ parameter.key }}: ${{ parameter.value }} + + # pass along job properties + ${{ each property in job }}: + ${{ if ne(property.key, 'job') }}: + ${{ property.key }}: ${{ property.value }} + + name: ${{ job.job }} + +- ${{ if eq(parameters.enableSourceBuild, true) }}: + - template: /eng/common/core-templates/jobs/source-build.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + allCompletedJobId: Source_Build_Complete + ${{ each parameter in parameters.sourceBuildParameters }}: + ${{ parameter.key }}: ${{ parameter.value }} + +- ${{ if eq(parameters.enableSourceIndex, 'true') }}: + - template: ../job/source-index-stage1.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + runAsPublic: ${{ parameters.runAsPublic }} + ${{ each parameter in parameters.sourceIndexParams }}: + ${{ parameter.key }}: ${{ parameter.value }} + +- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if or(eq(parameters.enablePublishBuildAssets, true), eq(parameters.artifacts.publish.manifests, 'true'), ne(parameters.artifacts.publish.manifests, '')) }}: + - template: ../job/publish-build-assets.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + continueOnError: ${{ parameters.continueOnError }} + dependsOn: + - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.publishBuildAssetsDependsOn }}: + - ${{ job.job }} + - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.jobs }}: + - ${{ job.job }} + - ${{ if eq(parameters.enableSourceBuild, true) }}: + - Source_Build_Complete + + runAsPublic: ${{ parameters.runAsPublic }} + publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }} + publishAssetsImmediately: ${{ parameters.publishAssetsImmediately }} + enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + signingValidationAdditionalParameters: ${{ parameters.signingValidationAdditionalParameters }} diff --git a/eng/common/core-templates/jobs/source-build.yml b/eng/common/core-templates/jobs/source-build.yml new file mode 100644 index 000000000000..a10ccfbee6de --- /dev/null +++ b/eng/common/core-templates/jobs/source-build.yml @@ -0,0 +1,58 @@ +parameters: + # This template adds arcade-powered source-build to CI. A job is created for each platform, as + # well as an optional server job that completes when all platform jobs complete. + + # The name of the "join" job for all source-build platforms. If set to empty string, the job is + # not included. Existing repo pipelines can use this job depend on all source-build jobs + # completing without maintaining a separate list of every single job ID: just depend on this one + # server job. By default, not included. Recommended name if used: 'Source_Build_Complete'. + allCompletedJobId: '' + + # See /eng/common/core-templates/job/source-build.yml + jobNamePrefix: 'Source_Build' + + # This is the default platform provided by Arcade, intended for use by a managed-only repo. + defaultManagedPlatform: + name: 'Managed' + container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9' + + # Defines the platforms on which to run build jobs. One job is created for each platform, and the + # object in this array is sent to the job template as 'platform'. If no platforms are specified, + # one job runs on 'defaultManagedPlatform'. + platforms: [] + + is1ESPipeline: '' + + # If set to true and running on a non-public project, + # Internal nuget and blob storage locations will be enabled. + # This is not enabled by default because many repositories do not need internal sources + # and do not need to have the required service connections approved in the pipeline. + enableInternalSources: false + +jobs: + +- ${{ if ne(parameters.allCompletedJobId, '') }}: + - job: ${{ parameters.allCompletedJobId }} + displayName: Source-Build Complete + pool: server + dependsOn: + - ${{ each platform in parameters.platforms }}: + - ${{ parameters.jobNamePrefix }}_${{ platform.name }} + - ${{ if eq(length(parameters.platforms), 0) }}: + - ${{ parameters.jobNamePrefix }}_${{ parameters.defaultManagedPlatform.name }} + +- ${{ each platform in parameters.platforms }}: + - template: /eng/common/core-templates/job/source-build.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + jobNamePrefix: ${{ parameters.jobNamePrefix }} + platform: ${{ platform }} + enableInternalSources: ${{ parameters.enableInternalSources }} + +- ${{ if eq(length(parameters.platforms), 0) }}: + - template: /eng/common/core-templates/job/source-build.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + jobNamePrefix: ${{ parameters.jobNamePrefix }} + platform: ${{ parameters.defaultManagedPlatform }} + enableInternalSources: ${{ parameters.enableInternalSources }} diff --git a/eng/common/core-templates/post-build/common-variables.yml b/eng/common/core-templates/post-build/common-variables.yml new file mode 100644 index 000000000000..d5627a994ae5 --- /dev/null +++ b/eng/common/core-templates/post-build/common-variables.yml @@ -0,0 +1,22 @@ +variables: + - group: Publish-Build-Assets + + # Whether the build is internal or not + - name: IsInternalBuild + value: ${{ and(ne(variables['System.TeamProject'], 'public'), contains(variables['Build.SourceBranch'], 'internal')) }} + + # Default Maestro++ API Endpoint and API Version + - name: MaestroApiEndPoint + value: "https://maestro.dot.net" + - name: MaestroApiVersion + value: "2020-02-20" + + - name: SourceLinkCLIVersion + value: 3.0.0 + - name: SymbolToolVersion + value: 1.0.1 + - name: BinlogToolVersion + value: 1.0.11 + + - name: runCodesignValidationInjection + value: false diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml new file mode 100644 index 000000000000..454fd75c7aff --- /dev/null +++ b/eng/common/core-templates/post-build/post-build.yml @@ -0,0 +1,316 @@ +parameters: + # Which publishing infra should be used. THIS SHOULD MATCH THE VERSION ON THE BUILD MANIFEST. + # Publishing V1 is no longer supported + # Publishing V2 is no longer supported + # Publishing V3 is the default + - name: publishingInfraVersion + displayName: Which version of publishing should be used to promote the build definition? + type: number + default: 3 + values: + - 3 + + - name: BARBuildId + displayName: BAR Build Id + type: number + default: 0 + + - name: PromoteToChannelIds + displayName: Channel to promote BARBuildId to + type: string + default: '' + + - name: enableSourceLinkValidation + displayName: Enable SourceLink validation + type: boolean + default: false + + - name: enableSigningValidation + displayName: Enable signing validation + type: boolean + default: true + + - name: enableSymbolValidation + displayName: Enable symbol validation + type: boolean + default: false + + - name: enableNugetValidation + displayName: Enable NuGet validation + type: boolean + default: true + + - name: publishInstallersAndChecksums + displayName: Publish installers and checksums + type: boolean + default: true + + - name: SDLValidationParameters + type: object + default: + enable: false + publishGdn: false + continueOnError: false + params: '' + artifactNames: '' + downloadArtifacts: true + + # These parameters let the user customize the call to sdk-task.ps1 for publishing + # symbols & general artifacts as well as for signing validation + - name: symbolPublishingAdditionalParameters + displayName: Symbol publishing additional parameters + type: string + default: '' + + - name: artifactsPublishingAdditionalParameters + displayName: Artifact publishing additional parameters + type: string + default: '' + + - name: signingValidationAdditionalParameters + displayName: Signing validation additional parameters + type: string + default: '' + + # Which stages should finish execution before post-build stages start + - name: validateDependsOn + type: object + default: + - build + + - name: publishDependsOn + type: object + default: + - Validate + + # Optional: Call asset publishing rather than running in a separate stage + - name: publishAssetsImmediately + type: boolean + default: false + + - name: is1ESPipeline + type: boolean + default: false + +stages: +- ${{ if or(eq( parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}: + - stage: Validate + dependsOn: ${{ parameters.validateDependsOn }} + displayName: Validate Build Assets + variables: + - template: /eng/common/core-templates/post-build/common-variables.yml + - template: /eng/common/core-templates/variables/pool-providers.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + jobs: + - job: + displayName: NuGet Validation + condition: and(succeededOrFailed(), eq( ${{ parameters.enableNugetValidation }}, 'true')) + pool: + # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + demands: Cmd + os: windows + # If it's not devdiv, it's dnceng + ${{ else }}: + ${{ if eq(parameters.is1ESPipeline, true) }}: + name: $(DncEngInternalBuildPool) + image: windows.vs2022.amd64 + os: windows + ${{ else }}: + name: $(DncEngInternalBuildPool) + demands: ImageOverride -equals windows.vs2022.amd64 + + steps: + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: PackageArtifacts + checkDownloadedFiles: true + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1 + arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ + + - job: + displayName: Signing Validation + condition: and( eq( ${{ parameters.enableSigningValidation }}, 'true'), ne( variables['PostBuildSign'], 'true')) + pool: + # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + demands: Cmd + os: windows + # If it's not devdiv, it's dnceng + ${{ else }}: + ${{ if eq(parameters.is1ESPipeline, true) }}: + name: $(DncEngInternalBuildPool) + image: 1es-windows-2022 + os: windows + ${{ else }}: + name: $(DncEngInternalBuildPool) + demands: ImageOverride -equals windows.vs2022.amd64 + steps: + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: PackageArtifacts + checkDownloadedFiles: true + itemPattern: | + ** + !**/Microsoft.SourceBuild.Intermediate.*.nupkg + + # This is necessary whenever we want to publish/restore to an AzDO private feed + # Since sdk-task.ps1 tries to restore packages we need to do this authentication here + # otherwise it'll complain about accessing a private feed. + - task: NuGetAuthenticate@1 + displayName: 'Authenticate to AzDO Feeds' + + # Signing validation will optionally work with the buildmanifest file which is downloaded from + # Azure DevOps above. + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task SigningValidation -restore -msbuildEngine vs + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts' + /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt' + ${{ parameters.signingValidationAdditionalParameters }} + + - template: /eng/common/core-templates/steps/publish-logs.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + StageLabel: 'Validation' + JobLabel: 'Signing' + BinlogToolVersion: $(BinlogToolVersion) + + - job: + displayName: SourceLink Validation + condition: eq( ${{ parameters.enableSourceLinkValidation }}, 'true') + pool: + # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + demands: Cmd + os: windows + # If it's not devdiv, it's dnceng + ${{ else }}: + ${{ if eq(parameters.is1ESPipeline, true) }}: + name: $(DncEngInternalBuildPool) + image: 1es-windows-2022 + os: windows + ${{ else }}: + name: $(DncEngInternalBuildPool) + demands: ImageOverride -equals windows.vs2022.amd64 + steps: + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: BlobArtifacts + checkDownloadedFiles: true + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1 + arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/ + -ExtractPath $(Agent.BuildDirectory)/Extract/ + -GHRepoName $(Build.Repository.Name) + -GHCommit $(Build.SourceVersion) + -SourcelinkCliVersion $(SourceLinkCLIVersion) + continueOnError: true + +- ${{ if ne(parameters.publishAssetsImmediately, 'true') }}: + - stage: publish_using_darc + ${{ if or(eq(parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}: + dependsOn: ${{ parameters.publishDependsOn }} + ${{ else }}: + dependsOn: ${{ parameters.validateDependsOn }} + displayName: Publish using Darc + variables: + - template: /eng/common/core-templates/post-build/common-variables.yml + - template: /eng/common/core-templates/variables/pool-providers.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + jobs: + - job: + displayName: Publish Using Darc + timeoutInMinutes: 120 + pool: + # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + name: AzurePipelines-EO + image: 1ESPT-Windows2022 + demands: Cmd + os: windows + # If it's not devdiv, it's dnceng + ${{ else }}: + ${{ if eq(parameters.is1ESPipeline, true) }}: + name: NetCore1ESPool-Publishing-Internal + image: windows.vs2019.amd64 + os: windows + ${{ else }}: + name: NetCore1ESPool-Publishing-Internal + demands: ImageOverride -equals windows.vs2019.amd64 + steps: + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + - task: NuGetAuthenticate@1 + + - task: AzureCLI@2 + displayName: Publish Using Darc + inputs: + azureSubscription: "Darc: Maestro Production" + scriptType: ps + scriptLocation: scriptPath + scriptPath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1 + arguments: > + -BuildId $(BARBuildId) + -PublishingInfraVersion ${{ parameters.publishingInfraVersion }} + -AzdoToken '$(System.AccessToken)' + -WaitPublishingFinish true + -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}' + -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}' diff --git a/eng/common/core-templates/post-build/setup-maestro-vars.yml b/eng/common/core-templates/post-build/setup-maestro-vars.yml new file mode 100644 index 000000000000..f7602980dbe7 --- /dev/null +++ b/eng/common/core-templates/post-build/setup-maestro-vars.yml @@ -0,0 +1,74 @@ +parameters: + BARBuildId: '' + PromoteToChannelIds: '' + is1ESPipeline: '' + +steps: + - ${{ if eq(parameters.is1ESPipeline, '') }}: + - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error + + - ${{ if eq(coalesce(parameters.PromoteToChannelIds, 0), 0) }}: + - task: DownloadBuildArtifacts@0 + displayName: Download Release Configs + inputs: + buildType: current + artifactName: ReleaseConfigs + checkDownloadedFiles: true + + - task: AzureCLI@2 + name: setReleaseVars + displayName: Set Release Configs Vars + inputs: + azureSubscription: "Darc: Maestro Production" + scriptType: pscore + scriptLocation: inlineScript + inlineScript: | + try { + if (!$Env:PromoteToMaestroChannels -or $Env:PromoteToMaestroChannels.Trim() -eq '') { + $Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt + + $BarId = $Content | Select -Index 0 + $Channels = $Content | Select -Index 1 + $IsStableBuild = $Content | Select -Index 2 + + $AzureDevOpsProject = $Env:System_TeamProject + $AzureDevOpsBuildDefinitionId = $Env:System_DefinitionId + $AzureDevOpsBuildId = $Env:Build_BuildId + } + else { + . $(Build.SourcesDirectory)\eng\common\tools.ps1 + $darc = Get-Darc + $buildInfo = & $darc get-build ` + --id ${{ parameters.BARBuildId }} ` + --extended ` + --output-format json ` + --ci ` + | convertFrom-Json + + $BarId = ${{ parameters.BARBuildId }} + $Channels = $Env:PromoteToMaestroChannels -split "," + $Channels = $Channels -join "][" + $Channels = "[$Channels]" + + $IsStableBuild = $buildInfo.stable + $AzureDevOpsProject = $buildInfo.azureDevOpsProject + $AzureDevOpsBuildDefinitionId = $buildInfo.azureDevOpsBuildDefinitionId + $AzureDevOpsBuildId = $buildInfo.azureDevOpsBuildId + } + + Write-Host "##vso[task.setvariable variable=BARBuildId]$BarId" + Write-Host "##vso[task.setvariable variable=TargetChannels]$Channels" + Write-Host "##vso[task.setvariable variable=IsStableBuild]$IsStableBuild" + + Write-Host "##vso[task.setvariable variable=AzDOProjectName]$AzureDevOpsProject" + Write-Host "##vso[task.setvariable variable=AzDOPipelineId]$AzureDevOpsBuildDefinitionId" + Write-Host "##vso[task.setvariable variable=AzDOBuildId]$AzureDevOpsBuildId" + } + catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + exit 1 + } + env: + PromoteToMaestroChannels: ${{ parameters.PromoteToChannelIds }} diff --git a/eng/common/core-templates/steps/component-governance.yml b/eng/common/core-templates/steps/component-governance.yml new file mode 100644 index 000000000000..cf0649aa9565 --- /dev/null +++ b/eng/common/core-templates/steps/component-governance.yml @@ -0,0 +1,16 @@ +parameters: + disableComponentGovernance: false + componentGovernanceIgnoreDirectories: '' + is1ESPipeline: false + displayName: 'Component Detection' + +steps: +- ${{ if eq(parameters.disableComponentGovernance, 'true') }}: + - script: echo "##vso[task.setvariable variable=skipComponentGovernanceDetection]true" + displayName: Set skipComponentGovernanceDetection variable +- ${{ if ne(parameters.disableComponentGovernance, 'true') }}: + - task: ComponentGovernanceComponentDetection@0 + continueOnError: true + displayName: ${{ parameters.displayName }} + inputs: + ignoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} diff --git a/eng/common/core-templates/steps/enable-internal-runtimes.yml b/eng/common/core-templates/steps/enable-internal-runtimes.yml new file mode 100644 index 000000000000..6bdbf62ac500 --- /dev/null +++ b/eng/common/core-templates/steps/enable-internal-runtimes.yml @@ -0,0 +1,32 @@ +# Obtains internal runtime download credentials and populates the 'dotnetbuilds-internal-container-read-token-base64' +# variable with the base64-encoded SAS token, by default + +parameters: +- name: federatedServiceConnection + type: string + default: 'dotnetbuilds-internal-read' +- name: outputVariableName + type: string + default: 'dotnetbuilds-internal-container-read-token-base64' +- name: expiryInHours + type: number + default: 1 +- name: base64Encode + type: boolean + default: true +- name: is1ESPipeline + type: boolean + default: false + +steps: +- ${{ if ne(variables['System.TeamProject'], 'public') }}: + - template: /eng/common/core-templates/steps/get-delegation-sas.yml + parameters: + federatedServiceConnection: ${{ parameters.federatedServiceConnection }} + outputVariableName: ${{ parameters.outputVariableName }} + expiryInHours: ${{ parameters.expiryInHours }} + base64Encode: ${{ parameters.base64Encode }} + storageAccount: dotnetbuilds + container: internal + permissions: rl + is1ESPipeline: ${{ parameters.is1ESPipeline }} \ No newline at end of file diff --git a/eng/common/core-templates/steps/enable-internal-sources.yml b/eng/common/core-templates/steps/enable-internal-sources.yml new file mode 100644 index 000000000000..64f881bffc3c --- /dev/null +++ b/eng/common/core-templates/steps/enable-internal-sources.yml @@ -0,0 +1,47 @@ +parameters: +# This is the Azure federated service connection that we log into to get an access token. +- name: nugetFederatedServiceConnection + type: string + default: 'dnceng-artifacts-feeds-read' +- name: is1ESPipeline + type: boolean + default: false +# Legacy parameters to allow for PAT usage +- name: legacyCredential + type: string + default: '' + +steps: +- ${{ if ne(variables['System.TeamProject'], 'public') }}: + - ${{ if ne(parameters.legacyCredential, '') }}: + - task: PowerShell@2 + displayName: Setup Internal Feeds + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1 + arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token + env: + Token: ${{ parameters.legacyCredential }} + # If running on dnceng (internal project), just use the default behavior for NuGetAuthenticate. + # If running on DevDiv, NuGetAuthenticate is not really an option. It's scoped to a single feed, and we have many feeds that + # may be added. Instead, we'll use the traditional approach (add cred to nuget.config), but use an account token. + - ${{ else }}: + - ${{ if eq(variables['System.TeamProject'], 'internal') }}: + - task: PowerShell@2 + displayName: Setup Internal Feeds + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1 + arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config + - ${{ else }}: + - template: /eng/common/templates/steps/get-federated-access-token.yml + parameters: + federatedServiceConnection: ${{ parameters.nugetFederatedServiceConnection }} + outputVariableName: 'dnceng-artifacts-feeds-read-access-token' + - task: PowerShell@2 + displayName: Setup Internal Feeds + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1 + arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $(dnceng-artifacts-feeds-read-access-token) + # This is required in certain scenarios to install the ADO credential provider. + # It installed by default in some msbuild invocations (e.g. VS msbuild), but needs to be installed for others + # (e.g. dotnet msbuild). + - task: NuGetAuthenticate@1 diff --git a/eng/common/core-templates/steps/generate-sbom.yml b/eng/common/core-templates/steps/generate-sbom.yml new file mode 100644 index 000000000000..d938b60e1bb5 --- /dev/null +++ b/eng/common/core-templates/steps/generate-sbom.yml @@ -0,0 +1,54 @@ +# BuildDropPath - The root folder of the drop directory for which the manifest file will be generated. +# PackageName - The name of the package this SBOM represents. +# PackageVersion - The version of the package this SBOM represents. +# ManifestDirPath - The path of the directory where the generated manifest files will be placed +# IgnoreDirectories - Directories to ignore for SBOM generation. This will be passed through to the CG component detector. + +parameters: + PackageVersion: 9.0.0 + BuildDropPath: '$(Build.SourcesDirectory)/artifacts' + PackageName: '.NET' + ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom + IgnoreDirectories: '' + sbomContinueOnError: true + is1ESPipeline: false + # disable publishArtifacts if some other step is publishing the artifacts (like job.yml). + publishArtifacts: true + +steps: +- task: PowerShell@2 + displayName: Prep for SBOM generation in (Non-linux) + condition: or(eq(variables['Agent.Os'], 'Windows_NT'), eq(variables['Agent.Os'], 'Darwin')) + inputs: + filePath: ./eng/common/generate-sbom-prep.ps1 + arguments: ${{parameters.manifestDirPath}} + +# Chmodding is a workaround for https://github.com/dotnet/arcade/issues/8461 +- script: | + chmod +x ./eng/common/generate-sbom-prep.sh + ./eng/common/generate-sbom-prep.sh ${{parameters.manifestDirPath}} + displayName: Prep for SBOM generation in (Linux) + condition: eq(variables['Agent.Os'], 'Linux') + continueOnError: ${{ parameters.sbomContinueOnError }} + +- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: 'Generate SBOM manifest' + continueOnError: ${{ parameters.sbomContinueOnError }} + inputs: + PackageName: ${{ parameters.packageName }} + BuildDropPath: ${{ parameters.buildDropPath }} + PackageVersion: ${{ parameters.packageVersion }} + ManifestDirPath: ${{ parameters.manifestDirPath }} + ${{ if ne(parameters.IgnoreDirectories, '') }}: + AdditionalComponentDetectorArgs: '--IgnoreDirectories ${{ parameters.IgnoreDirectories }}' + +- ${{ if eq(parameters.publishArtifacts, 'true')}}: + - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + args: + displayName: Publish SBOM manifest + continueOnError: ${{parameters.sbomContinueOnError}} + targetPath: '${{ parameters.manifestDirPath }}' + artifactName: $(ARTIFACT_NAME) + diff --git a/eng/common/core-templates/steps/get-delegation-sas.yml b/eng/common/core-templates/steps/get-delegation-sas.yml new file mode 100644 index 000000000000..9db5617ea7de --- /dev/null +++ b/eng/common/core-templates/steps/get-delegation-sas.yml @@ -0,0 +1,55 @@ +parameters: +- name: federatedServiceConnection + type: string +- name: outputVariableName + type: string +- name: expiryInHours + type: number + default: 1 +- name: base64Encode + type: boolean + default: false +- name: storageAccount + type: string +- name: container + type: string +- name: permissions + type: string + default: 'rl' +- name: is1ESPipeline + type: boolean + default: false + +steps: +- task: AzureCLI@2 + displayName: 'Generate delegation SAS Token for ${{ parameters.storageAccount }}/${{ parameters.container }}' + inputs: + azureSubscription: ${{ parameters.federatedServiceConnection }} + scriptType: 'pscore' + scriptLocation: 'inlineScript' + inlineScript: | + # Calculate the expiration of the SAS token and convert to UTC + $expiry = (Get-Date).AddHours(${{ parameters.expiryInHours }}).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") + + # Temporarily work around a helix issue where SAS tokens with / in them will cause incorrect downloads + # of correlation payloads. https://github.com/dotnet/dnceng/issues/3484 + $sas = "" + do { + $sas = az storage container generate-sas --account-name ${{ parameters.storageAccount }} --name ${{ parameters.container }} --permissions ${{ parameters.permissions }} --expiry $expiry --auth-mode login --as-user -o tsv + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to generate SAS token." + exit 1 + } + } while($sas.IndexOf('/') -ne -1) + + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to generate SAS token." + exit 1 + } + + if ('${{ parameters.base64Encode }}' -eq 'true') { + $sas = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($sas)) + } + + Write-Host "Setting '${{ parameters.outputVariableName }}' with the access token value" + Write-Host "##vso[task.setvariable variable=${{ parameters.outputVariableName }};issecret=true]$sas" diff --git a/eng/common/core-templates/steps/get-federated-access-token.yml b/eng/common/core-templates/steps/get-federated-access-token.yml new file mode 100644 index 000000000000..3a4d4410c482 --- /dev/null +++ b/eng/common/core-templates/steps/get-federated-access-token.yml @@ -0,0 +1,42 @@ +parameters: +- name: federatedServiceConnection + type: string +- name: outputVariableName + type: string +- name: is1ESPipeline + type: boolean +- name: stepName + type: string + default: 'getFederatedAccessToken' +- name: condition + type: string + default: '' +# Resource to get a token for. Common values include: +# - '499b84ac-1321-427f-aa17-267ca6975798' for Azure DevOps +# - 'https://storage.azure.com/' for storage +# Defaults to Azure DevOps +- name: resource + type: string + default: '499b84ac-1321-427f-aa17-267ca6975798' +- name: isStepOutputVariable + type: boolean + default: false + +steps: +- task: AzureCLI@2 + displayName: 'Getting federated access token for feeds' + name: ${{ parameters.stepName }} + ${{ if ne(parameters.condition, '') }}: + condition: ${{ parameters.condition }} + inputs: + azureSubscription: ${{ parameters.federatedServiceConnection }} + scriptType: 'pscore' + scriptLocation: 'inlineScript' + inlineScript: | + $accessToken = az account get-access-token --query accessToken --resource ${{ parameters.resource }} --output tsv + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to get access token for resource '${{ parameters.resource }}'" + exit 1 + } + Write-Host "Setting '${{ parameters.outputVariableName }}' with the access token value" + Write-Host "##vso[task.setvariable variable=${{ parameters.outputVariableName }};issecret=true;isOutput=${{ parameters.isStepOutputVariable }}]$accessToken" \ No newline at end of file diff --git a/eng/common/core-templates/steps/publish-build-artifacts.yml b/eng/common/core-templates/steps/publish-build-artifacts.yml new file mode 100644 index 000000000000..f24ce346684e --- /dev/null +++ b/eng/common/core-templates/steps/publish-build-artifacts.yml @@ -0,0 +1,20 @@ +parameters: +- name: is1ESPipeline + type: boolean + default: false +- name: args + type: object + default: {} +steps: +- ${{ if ne(parameters.is1ESPipeline, true) }}: + - template: /eng/common/templates/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + ${{ each parameter in parameters.args }}: + ${{ parameter.key }}: ${{ parameter.value }} +- ${{ else }}: + - template: /eng/common/templates-official/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + ${{ each parameter in parameters.args }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/core-templates/steps/publish-logs.yml b/eng/common/core-templates/steps/publish-logs.yml new file mode 100644 index 000000000000..80788c523191 --- /dev/null +++ b/eng/common/core-templates/steps/publish-logs.yml @@ -0,0 +1,58 @@ +parameters: + StageLabel: '' + JobLabel: '' + CustomSensitiveDataList: '' + # A default - in case value from eng/common/core-templates/post-build/common-variables.yml is not passed + BinlogToolVersion: '1.0.11' + is1ESPipeline: false + +steps: +- task: Powershell@2 + displayName: Prepare Binlogs to Upload + inputs: + targetType: inline + script: | + New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + continueOnError: true + condition: always() + +- task: PowerShell@2 + displayName: Redact Logs + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/redact-logs.ps1 + # For now this needs to have explicit list of all sensitive data. Taken from eng/publishing/v3/publish.yml + # Sensitive data can as well be added to $(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt' + # If the file exists - sensitive data for redaction will be sourced from it + # (single entry per line, lines starting with '# ' are considered comments and skipped) + arguments: -InputPath '$(Build.SourcesDirectory)/PostBuildLogs' + -BinlogToolVersion ${{parameters.BinlogToolVersion}} + -TokensFilePath '$(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt' + '$(publishing-dnceng-devdiv-code-r-build-re)' + '$(MaestroAccessToken)' + '$(dn-bot-all-orgs-artifact-feeds-rw)' + '$(akams-client-id)' + '$(microsoft-symbol-server-pat)' + '$(symweb-symbol-server-pat)' + '$(dn-bot-all-orgs-build-rw-code-rw)' + ${{parameters.CustomSensitiveDataList}} + continueOnError: true + condition: always() + +- task: CopyFiles@2 + displayName: Gather post build logs + inputs: + SourceFolder: '$(Build.SourcesDirectory)/PostBuildLogs' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/PostBuildLogs' + +- template: /eng/common/core-templates/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + args: + displayName: Publish Logs + pathToPublish: '$(Build.ArtifactStagingDirectory)/PostBuildLogs' + publishLocation: Container + artifactName: PostBuildLogs + continueOnError: true + condition: always() diff --git a/eng/common/core-templates/steps/publish-pipeline-artifacts.yml b/eng/common/core-templates/steps/publish-pipeline-artifacts.yml new file mode 100644 index 000000000000..2efec04dc2c1 --- /dev/null +++ b/eng/common/core-templates/steps/publish-pipeline-artifacts.yml @@ -0,0 +1,20 @@ +parameters: +- name: is1ESPipeline + type: boolean + default: false + +- name: args + type: object + default: {} + +steps: +- ${{ if ne(parameters.is1ESPipeline, true) }}: + - template: /eng/common/templates/steps/publish-pipeline-artifacts.yml + parameters: + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} +- ${{ else }}: + - template: /eng/common/templates-official/steps/publish-pipeline-artifacts.yml + parameters: + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/core-templates/steps/retain-build.yml b/eng/common/core-templates/steps/retain-build.yml new file mode 100644 index 000000000000..83d97a26a01f --- /dev/null +++ b/eng/common/core-templates/steps/retain-build.yml @@ -0,0 +1,28 @@ +parameters: + # Optional azure devops PAT with build execute permissions for the build's organization, + # only needed if the build that should be retained ran on a different organization than + # the pipeline where this template is executing from + Token: '' + # Optional BuildId to retain, defaults to the current running build + BuildId: '' + # Azure devops Organization URI for the build in the https://dev.azure.com/ format. + # Defaults to the organization the current pipeline is running on + AzdoOrgUri: '$(System.CollectionUri)' + # Azure devops project for the build. Defaults to the project the current pipeline is running on + AzdoProject: '$(System.TeamProject)' + +steps: + - task: powershell@2 + inputs: + targetType: 'filePath' + filePath: eng/common/retain-build.ps1 + pwsh: true + arguments: > + -AzdoOrgUri: ${{parameters.AzdoOrgUri}} + -AzdoProject ${{parameters.AzdoProject}} + -Token ${{coalesce(parameters.Token, '$env:SYSTEM_ACCESSTOKEN') }} + -BuildId ${{coalesce(parameters.BuildId, '$env:BUILD_ID')}} + displayName: Enable permanent build retention + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + BUILD_ID: $(Build.BuildId) \ No newline at end of file diff --git a/eng/common/core-templates/steps/send-to-helix.yml b/eng/common/core-templates/steps/send-to-helix.yml new file mode 100644 index 000000000000..68fa739c4ab2 --- /dev/null +++ b/eng/common/core-templates/steps/send-to-helix.yml @@ -0,0 +1,93 @@ +# Please remember to update the documentation if you make changes to these parameters! +parameters: + HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/ + HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/' + HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number + HelixTargetQueues: '' # required -- semicolon-delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues + HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group + HelixProjectPath: 'eng/common/helixpublish.proj' # optional -- path to the project file to build relative to BUILD_SOURCESDIRECTORY + HelixProjectArguments: '' # optional -- arguments passed to the build command + HelixConfiguration: '' # optional -- additional property attached to a job + HelixPreCommands: '' # optional -- commands to run before Helix work item execution + HelixPostCommands: '' # optional -- commands to run after Helix work item execution + WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects + WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects + WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects + CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload + XUnitProjects: '' # optional -- semicolon-delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true + XUnitWorkItemTimeout: '' # optional -- the workitem timeout in seconds for all workitems created from the xUnit projects specified by XUnitProjects + XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects + XUnitRuntimeTargetFramework: '' # optional -- framework to use for the xUnit console runner + XUnitRunnerVersion: '' # optional -- version of the xUnit nuget package you wish to use on Helix; required for XUnitProjects + IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion + DotNetCliPackageType: '' # optional -- either 'sdk', 'runtime' or 'aspnetcore-runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json + DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json + WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." + IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set + HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting https://helix.int-dot.net ) + Creator: '' # optional -- if the build is external, use this to specify who is sending the job + DisplayNamePrefix: 'Run Tests' # optional -- rename the beginning of the displayName of the steps in AzDO + condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() + continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false + +steps: + - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' + displayName: ${{ parameters.DisplayNamePrefix }} (Windows) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixConfiguration: ${{ parameters.HelixConfiguration }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + WorkItemTimeout: ${{ parameters.WorkItemTimeout }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }} + XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + HelixBaseUri: ${{ parameters.HelixBaseUri }} + Creator: ${{ parameters.Creator }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog + displayName: ${{ parameters.DisplayNamePrefix }} (Unix) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixConfiguration: ${{ parameters.HelixConfiguration }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + WorkItemTimeout: ${{ parameters.WorkItemTimeout }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }} + XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + HelixBaseUri: ${{ parameters.HelixBaseUri }} + Creator: ${{ parameters.Creator }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} diff --git a/eng/common/core-templates/steps/source-build.yml b/eng/common/core-templates/steps/source-build.yml new file mode 100644 index 000000000000..2915d29bb7f6 --- /dev/null +++ b/eng/common/core-templates/steps/source-build.yml @@ -0,0 +1,129 @@ +parameters: + # This template adds arcade-powered source-build to CI. + + # This is a 'steps' template, and is intended for advanced scenarios where the existing build + # infra has a careful build methodology that must be followed. For example, a repo + # (dotnet/runtime) might choose to clone the GitHub repo only once and store it as a pipeline + # artifact for all subsequent jobs to use, to reduce dependence on a strong network connection to + # GitHub. Using this steps template leaves room for that infra to be included. + + # Defines the platform on which to run the steps. See 'eng/common/core-templates/job/source-build.yml' + # for details. The entire object is described in the 'job' template for simplicity, even though + # the usage of the properties on this object is split between the 'job' and 'steps' templates. + platform: {} + is1ESPipeline: false + +steps: +# Build. Keep it self-contained for simple reusability. (No source-build-specific job variables.) +- script: | + set -x + df -h + + # If file changes are detected, set CopyWipIntoInnerSourceBuildRepo to copy the WIP changes into the inner source build repo. + internalRestoreArgs= + if ! git diff --quiet; then + internalRestoreArgs='/p:CopyWipIntoInnerSourceBuildRepo=true' + # The 'Copy WIP' feature of source build uses git stash to apply changes from the original repo. + # This only works if there is a username/email configured, which won't be the case in most CI runs. + git config --get user.email + if [ $? -ne 0 ]; then + git config user.email dn-bot@microsoft.com + git config user.name dn-bot + fi + fi + + # If building on the internal project, the internal storage variable may be available (usually only if needed) + # In that case, add variables to allow the download of internal runtimes if the specified versions are not found + # in the default public locations. + internalRuntimeDownloadArgs= + if [ '$(dotnetbuilds-internal-container-read-token-base64)' != '$''(dotnetbuilds-internal-container-read-token-base64)' ]; then + internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://dotnetbuilds.blob.core.windows.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://dotnetbuilds.blob.core.windows.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)' + fi + + buildConfig=Release + # Check if AzDO substitutes in a build config from a variable, and use it if so. + if [ '$(_BuildConfig)' != '$''(_BuildConfig)' ]; then + buildConfig='$(_BuildConfig)' + fi + + officialBuildArgs= + if [ '${{ and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}' = 'True' ]; then + officialBuildArgs='/p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER)' + fi + + targetRidArgs= + if [ '${{ parameters.platform.targetRID }}' != '' ]; then + targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}' + fi + + runtimeOsArgs= + if [ '${{ parameters.platform.runtimeOS }}' != '' ]; then + runtimeOsArgs='/p:RuntimeOS=${{ parameters.platform.runtimeOS }}' + fi + + baseOsArgs= + if [ '${{ parameters.platform.baseOS }}' != '' ]; then + baseOsArgs='/p:BaseOS=${{ parameters.platform.baseOS }}' + fi + + publishArgs= + if [ '${{ parameters.platform.skipPublishValidation }}' != 'true' ]; then + publishArgs='--publish' + fi + + assetManifestFileName=SourceBuild_RidSpecific.xml + if [ '${{ parameters.platform.name }}' != '' ]; then + assetManifestFileName=SourceBuild_${{ parameters.platform.name }}.xml + fi + + ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \ + --configuration $buildConfig \ + --restore --build --pack $publishArgs -bl \ + $officialBuildArgs \ + $internalRuntimeDownloadArgs \ + $internalRestoreArgs \ + $targetRidArgs \ + $runtimeOsArgs \ + $baseOsArgs \ + /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \ + /p:ArcadeBuildFromSource=true \ + /p:DotNetBuildSourceOnly=true \ + /p:DotNetBuildRepo=true \ + /p:AssetManifestFileName=$assetManifestFileName + displayName: Build + +# Upload build logs for diagnosis. +- task: CopyFiles@2 + displayName: Prepare BuildLogs staging directory + inputs: + SourceFolder: '$(Build.SourcesDirectory)' + Contents: | + **/*.log + **/*.binlog + artifacts/sb/prebuilt-report/** + TargetFolder: '$(Build.StagingDirectory)/BuildLogs' + CleanTargetFolder: true + continueOnError: true + condition: succeededOrFailed() + +- template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + args: + displayName: Publish BuildLogs + targetPath: '$(Build.StagingDirectory)/BuildLogs' + artifactName: BuildLogs_SourceBuild_${{ parameters.platform.name }}_Attempt$(System.JobAttempt) + continueOnError: true + condition: succeededOrFailed() + sbomEnabled: false # we don't need SBOM for logs + +# Manually inject component detection so that we can ignore the source build upstream cache, which contains +# a nupkg cache of input packages (a local feed). +# This path must match the upstream cache path in property 'CurrentRepoSourceBuiltNupkgCacheDir' +# in src\Microsoft.DotNet.Arcade.Sdk\tools\SourceBuild\SourceBuildArcade.targets +- template: /eng/common/core-templates/steps/component-governance.yml + parameters: + displayName: Component Detection (Exclude upstream cache) + is1ESPipeline: ${{ parameters.is1ESPipeline }} + componentGovernanceIgnoreDirectories: '$(Build.SourcesDirectory)/artifacts/sb/src/artifacts/obj/source-built-upstream-cache' + disableComponentGovernance: ${{ eq(variables['System.TeamProject'], 'public') }} diff --git a/eng/common/core-templates/variables/pool-providers.yml b/eng/common/core-templates/variables/pool-providers.yml new file mode 100644 index 000000000000..41053d382a2e --- /dev/null +++ b/eng/common/core-templates/variables/pool-providers.yml @@ -0,0 +1,8 @@ +parameters: + is1ESPipeline: false + +variables: + - ${{ if eq(parameters.is1ESPipeline, 'true') }}: + - template: /eng/common/templates-official/variables/pool-providers.yml + - ${{ else }}: + - template: /eng/common/templates/variables/pool-providers.yml \ No newline at end of file diff --git a/eng/common/cross/arm/tizen/tizen.patch b/eng/common/cross/arm/tizen/tizen.patch new file mode 100644 index 000000000000..fb12ade7250a --- /dev/null +++ b/eng/common/cross/arm/tizen/tizen.patch @@ -0,0 +1,9 @@ +diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so +--- a/usr/lib/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf32-littlearm) +-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-armhf.so.3 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-armhf.so.3 ) ) diff --git a/eng/common/cross/arm64/tizen/tizen.patch b/eng/common/cross/arm64/tizen/tizen.patch new file mode 100644 index 000000000000..af7c8be05906 --- /dev/null +++ b/eng/common/cross/arm64/tizen/tizen.patch @@ -0,0 +1,9 @@ +diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so +--- a/usr/lib64/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib64/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf64-littleaarch64) +-GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-aarch64.so.1 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-aarch64.so.1 ) ) diff --git a/eng/common/cross/armel/armel.jessie.patch b/eng/common/cross/armel/armel.jessie.patch new file mode 100644 index 000000000000..2d2615619351 --- /dev/null +++ b/eng/common/cross/armel/armel.jessie.patch @@ -0,0 +1,43 @@ +diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h +--- a/usr/include/urcu/uatomic/generic.h 2014-10-22 15:00:58.000000000 -0700 ++++ b/usr/include/urcu/uatomic/generic.h 2020-10-30 21:38:28.550000000 -0700 +@@ -69,10 +69,10 @@ + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- return __sync_val_compare_and_swap_2(addr, old, _new); ++ return __sync_val_compare_and_swap_2((uint16_t*) addr, old, _new); + #endif + case 4: +- return __sync_val_compare_and_swap_4(addr, old, _new); ++ return __sync_val_compare_and_swap_4((uint32_t*) addr, old, _new); + #if (CAA_BITS_PER_LONG == 64) + case 8: + return __sync_val_compare_and_swap_8(addr, old, _new); +@@ -109,7 +109,7 @@ + return; + #endif + case 4: +- __sync_and_and_fetch_4(addr, val); ++ __sync_and_and_fetch_4((uint32_t*) addr, val); + return; + #if (CAA_BITS_PER_LONG == 64) + case 8: +@@ -148,7 +148,7 @@ + return; + #endif + case 4: +- __sync_or_and_fetch_4(addr, val); ++ __sync_or_and_fetch_4((uint32_t*) addr, val); + return; + #if (CAA_BITS_PER_LONG == 64) + case 8: +@@ -187,7 +187,7 @@ + return __sync_add_and_fetch_2(addr, val); + #endif + case 4: +- return __sync_add_and_fetch_4(addr, val); ++ return __sync_add_and_fetch_4((uint32_t*) addr, val); + #if (CAA_BITS_PER_LONG == 64) + case 8: + return __sync_add_and_fetch_8(addr, val); diff --git a/eng/common/cross/armel/tizen/tizen.patch b/eng/common/cross/armel/tizen/tizen.patch new file mode 100644 index 000000000000..ca7c7c1ff751 --- /dev/null +++ b/eng/common/cross/armel/tizen/tizen.patch @@ -0,0 +1,9 @@ +diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so +--- a/usr/lib/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf32-littlearm) +-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) ) diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh new file mode 100644 index 000000000000..7e9ba2b75ed3 --- /dev/null +++ b/eng/common/cross/build-android-rootfs.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash +set -e +__NDK_Version=r21 + +usage() +{ + echo "Creates a toolchain and sysroot used for cross-compiling for Android." + echo + echo "Usage: $0 [BuildArch] [ApiLevel]" + echo + echo "BuildArch is the target architecture of Android. Currently only arm64 is supported." + echo "ApiLevel is the target Android API level. API levels usually match to Android releases. See https://source.android.com/source/build-numbers.html" + echo + echo "By default, the toolchain and sysroot will be generated in cross/android-rootfs/toolchain/[BuildArch]. You can change this behavior" + echo "by setting the TOOLCHAIN_DIR environment variable" + echo + echo "By default, the NDK will be downloaded into the cross/android-rootfs/android-ndk-$__NDK_Version directory. If you already have an NDK installation," + echo "you can set the NDK_DIR environment variable to have this script use that installation of the NDK." + echo "By default, this script will generate a file, android_platform, in the root of the ROOTFS_DIR directory that contains the RID for the supported and tested Android build: android.28-arm64. This file is to replace '/etc/os-release', which is not available for Android." + exit 1 +} + +__ApiLevel=28 # The minimum platform for arm64 is API level 21 but the minimum version that support glob(3) is 28. See $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/glob.h +__BuildArch=arm64 +__AndroidArch=aarch64 +__AndroidToolchain=aarch64-linux-android + +for i in "$@" + do + lowerI="$(echo $i | tr "[:upper:]" "[:lower:]")" + case $lowerI in + -?|-h|--help) + usage + exit 1 + ;; + arm64) + __BuildArch=arm64 + __AndroidArch=aarch64 + __AndroidToolchain=aarch64-linux-android + ;; + arm) + __BuildArch=arm + __AndroidArch=arm + __AndroidToolchain=arm-linux-androideabi + ;; + *[0-9]) + __ApiLevel=$i + ;; + *) + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i" + ;; + esac +done + +# Obtain the location of the bash script to figure out where the root of the repo is. +__ScriptBaseDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +__CrossDir="$__ScriptBaseDir/../../../.tools/android-rootfs" + +if [[ ! -f "$__CrossDir" ]]; then + mkdir -p "$__CrossDir" +fi + +# Resolve absolute path to avoid `../` in build logs +__CrossDir="$( cd "$__CrossDir" && pwd )" + +__NDK_Dir="$__CrossDir/android-ndk-$__NDK_Version" +__lldb_Dir="$__CrossDir/lldb" +__ToolchainDir="$__CrossDir/android-ndk-$__NDK_Version" + +if [[ -n "$TOOLCHAIN_DIR" ]]; then + __ToolchainDir=$TOOLCHAIN_DIR +fi + +if [[ -n "$NDK_DIR" ]]; then + __NDK_Dir=$NDK_DIR +fi + +echo "Target API level: $__ApiLevel" +echo "Target architecture: $__BuildArch" +echo "NDK location: $__NDK_Dir" +echo "Target Toolchain location: $__ToolchainDir" + +# Download the NDK if required +if [ ! -d $__NDK_Dir ]; then + echo Downloading the NDK into $__NDK_Dir + mkdir -p $__NDK_Dir + wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip + unzip -q $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__CrossDir +fi + +if [ ! -d $__lldb_Dir ]; then + mkdir -p $__lldb_Dir + echo Downloading LLDB into $__lldb_Dir + wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/lldb-2.3.3614996-linux-x86_64.zip -O $__CrossDir/lldb-2.3.3614996-linux-x86_64.zip + unzip -q $__CrossDir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir +fi + +echo "Download dependencies..." +__TmpDir=$__CrossDir/tmp/$__BuildArch/ +mkdir -p "$__TmpDir" + +# combined dependencies for coreclr, installer and libraries +__AndroidPackages="libicu" +__AndroidPackages+=" libandroid-glob" +__AndroidPackages+=" liblzma" +__AndroidPackages+=" krb5" +__AndroidPackages+=" openssl" + +for path in $(wget -qO- https://packages.termux.dev/termux-main-21/dists/stable/main/binary-$__AndroidArch/Packages |\ + grep -A15 "Package: \(${__AndroidPackages// /\\|}\)" | grep -v "static\|tool" | grep Filename); do + + if [[ "$path" != "Filename:" ]]; then + echo "Working on: $path" + wget -qO- https://packages.termux.dev/termux-main-21/$path | dpkg -x - "$__TmpDir" + fi +done + +cp -R "$__TmpDir/data/data/com.termux/files/usr/"* "$__ToolchainDir/sysroot/usr/" + +# Generate platform file for build.sh script to assign to __DistroRid +echo "Generating platform file..." +echo "RID=android.${__ApiLevel}-${__BuildArch}" > $__ToolchainDir/sysroot/android_platform + +echo "Now to build coreclr, libraries and installers; run:" +echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ + --subsetCategory coreclr +echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ + --subsetCategory libraries +echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ + --subsetCategory installer diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh new file mode 100644 index 000000000000..4b5e8d7166bd --- /dev/null +++ b/eng/common/cross/build-rootfs.sh @@ -0,0 +1,786 @@ +#!/usr/bin/env bash + +set -e + +usage() +{ + echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [llvmx[.y]] [--skipunmount] --rootfsdir ]" + echo "BuildArch can be: arm(default), arm64, armel, armv6, ppc64le, riscv64, s390x, x64, x86" + echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine" + echo " for alpine can be specified with version: alpineX.YY or alpineedge" + echo " for FreeBSD can be: freebsd13, freebsd14" + echo " for illumos can be: illumos" + echo " for Haiku can be: haiku." + echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD" + echo "llvmx[.y] - optional, LLVM version for LLVM related packages." + echo "--skipunmount - optional, will skip the unmount of rootfs folder." + echo "--skipsigcheck - optional, will skip package signature checks (allowing untrusted packages)." + echo "--use-mirror - optional, use mirror URL to fetch resources, when available." + echo "--jobs N - optional, restrict to N jobs." + exit 1 +} + +__CodeName=xenial +__CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +__BuildArch=arm +__AlpineArch=armv7 +__FreeBSDArch=arm +__FreeBSDMachineArch=armv7 +__IllumosArch=arm7 +__HaikuArch=arm +__QEMUArch=arm +__UbuntuArch=armhf +__UbuntuRepo= +__UbuntuSuites="updates security backports" +__LLDB_Package="liblldb-3.9-dev" +__SkipUnmount=0 + +# base development support +__UbuntuPackages="build-essential" + +__AlpinePackages="alpine-base" +__AlpinePackages+=" build-base" +__AlpinePackages+=" linux-headers" +__AlpinePackages+=" lldb-dev" +__AlpinePackages+=" python3" +__AlpinePackages+=" libedit" + +# symlinks fixer +__UbuntuPackages+=" symlinks" + +# runtime dependencies +__UbuntuPackages+=" libicu-dev" +__UbuntuPackages+=" liblttng-ust-dev" +__UbuntuPackages+=" libunwind8-dev" +__UbuntuPackages+=" libnuma-dev" + +__AlpinePackages+=" gettext-dev" +__AlpinePackages+=" icu-dev" +__AlpinePackages+=" libunwind-dev" +__AlpinePackages+=" lttng-ust-dev" +__AlpinePackages+=" compiler-rt" +__AlpinePackages+=" numactl-dev" + +# runtime libraries' dependencies +__UbuntuPackages+=" libcurl4-openssl-dev" +__UbuntuPackages+=" libkrb5-dev" +__UbuntuPackages+=" libssl-dev" +__UbuntuPackages+=" zlib1g-dev" + +__AlpinePackages+=" curl-dev" +__AlpinePackages+=" krb5-dev" +__AlpinePackages+=" openssl-dev" +__AlpinePackages+=" zlib-dev" + +__FreeBSDBase="13.3-RELEASE" +__FreeBSDPkg="1.17.0" +__FreeBSDABI="13" +__FreeBSDPackages="libunwind" +__FreeBSDPackages+=" icu" +__FreeBSDPackages+=" libinotify" +__FreeBSDPackages+=" openssl" +__FreeBSDPackages+=" krb5" +__FreeBSDPackages+=" terminfo-db" + +__IllumosPackages="icu" +__IllumosPackages+=" mit-krb5" +__IllumosPackages+=" openssl" +__IllumosPackages+=" zlib" + +__HaikuPackages="gcc_syslibs" +__HaikuPackages+=" gcc_syslibs_devel" +__HaikuPackages+=" gmp" +__HaikuPackages+=" gmp_devel" +__HaikuPackages+=" icu66" +__HaikuPackages+=" icu66_devel" +__HaikuPackages+=" krb5" +__HaikuPackages+=" krb5_devel" +__HaikuPackages+=" libiconv" +__HaikuPackages+=" libiconv_devel" +__HaikuPackages+=" llvm12_libunwind" +__HaikuPackages+=" llvm12_libunwind_devel" +__HaikuPackages+=" mpfr" +__HaikuPackages+=" mpfr_devel" +__HaikuPackages+=" openssl" +__HaikuPackages+=" openssl_devel" +__HaikuPackages+=" zlib" +__HaikuPackages+=" zlib_devel" + +# ML.NET dependencies +__UbuntuPackages+=" libomp5" +__UbuntuPackages+=" libomp-dev" + +# Taken from https://github.com/alpinelinux/alpine-chroot-install/blob/6d08f12a8a70dd9b9dc7d997c88aa7789cc03c42/alpine-chroot-install#L85-L133 +__AlpineKeys=' +4a6a0840:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1yHJxQgsHQREclQu4Ohe\nqxTxd1tHcNnvnQTu/UrTky8wWvgXT+jpveroeWWnzmsYlDI93eLI2ORakxb3gA2O\nQ0Ry4ws8vhaxLQGC74uQR5+/yYrLuTKydFzuPaS1dK19qJPXB8GMdmFOijnXX4SA\njixuHLe1WW7kZVtjL7nufvpXkWBGjsfrvskdNA/5MfxAeBbqPgaq0QMEfxMAn6/R\nL5kNepi/Vr4S39Xvf2DzWkTLEK8pcnjNkt9/aafhWqFVW7m3HCAII6h/qlQNQKSo\nGuH34Q8GsFG30izUENV9avY7hSLq7nggsvknlNBZtFUcmGoQrtx3FmyYsIC8/R+B\nywIDAQAB +5243ef4b:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvNijDxJ8kloskKQpJdx+\nmTMVFFUGDoDCbulnhZMJoKNkSuZOzBoFC94omYPtxnIcBdWBGnrm6ncbKRlR+6oy\nDO0W7c44uHKCFGFqBhDasdI4RCYP+fcIX/lyMh6MLbOxqS22TwSLhCVjTyJeeH7K\naA7vqk+QSsF4TGbYzQDDpg7+6aAcNzg6InNePaywA6hbT0JXbxnDWsB+2/LLSF2G\nmnhJlJrWB1WGjkz23ONIWk85W4S0XB/ewDefd4Ly/zyIciastA7Zqnh7p3Ody6Q0\nsS2MJzo7p3os1smGjUF158s6m/JbVh4DN6YIsxwl2OjDOz9R0OycfJSDaBVIGZzg\ncQIDAQAB +524d27bb:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr8s1q88XpuJWLCZALdKj\nlN8wg2ePB2T9aIcaxryYE/Jkmtu+ZQ5zKq6BT3y/udt5jAsMrhHTwroOjIsF9DeG\ne8Y3vjz+Hh4L8a7hZDaw8jy3CPag47L7nsZFwQOIo2Cl1SnzUc6/owoyjRU7ab0p\niWG5HK8IfiybRbZxnEbNAfT4R53hyI6z5FhyXGS2Ld8zCoU/R4E1P0CUuXKEN4p0\n64dyeUoOLXEWHjgKiU1mElIQj3k/IF02W89gDj285YgwqA49deLUM7QOd53QLnx+\nxrIrPv3A+eyXMFgexNwCKQU9ZdmWa00MjjHlegSGK8Y2NPnRoXhzqSP9T9i2HiXL\nVQIDAQAB +5261cecb:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwlzMkl7b5PBdfMzGdCT0\ncGloRr5xGgVmsdq5EtJvFkFAiN8Ac9MCFy/vAFmS8/7ZaGOXoCDWbYVLTLOO2qtX\nyHRl+7fJVh2N6qrDDFPmdgCi8NaE+3rITWXGrrQ1spJ0B6HIzTDNEjRKnD4xyg4j\ng01FMcJTU6E+V2JBY45CKN9dWr1JDM/nei/Pf0byBJlMp/mSSfjodykmz4Oe13xB\nCa1WTwgFykKYthoLGYrmo+LKIGpMoeEbY1kuUe04UiDe47l6Oggwnl+8XD1MeRWY\nsWgj8sF4dTcSfCMavK4zHRFFQbGp/YFJ/Ww6U9lA3Vq0wyEI6MCMQnoSMFwrbgZw\nwwIDAQAB +58199dcc:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3v8/ye/V/t5xf4JiXLXa\nhWFRozsnmn3hobON20GdmkrzKzO/eUqPOKTpg2GtvBhK30fu5oY5uN2ORiv2Y2ht\neLiZ9HVz3XP8Fm9frha60B7KNu66FO5P2o3i+E+DWTPqqPcCG6t4Znk2BypILcit\nwiPKTsgbBQR2qo/cO01eLLdt6oOzAaF94NH0656kvRewdo6HG4urbO46tCAizvCR\nCA7KGFMyad8WdKkTjxh8YLDLoOCtoZmXmQAiwfRe9pKXRH/XXGop8SYptLqyVVQ+\ntegOD9wRs2tOlgcLx4F/uMzHN7uoho6okBPiifRX+Pf38Vx+ozXh056tjmdZkCaV\naQIDAQAB +58cbb476:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSPnuAGKtRIS5fEgYPXD\n8pSGvKAmIv3A08LBViDUe+YwhilSHbYXUEAcSH1KZvOo1WT1x2FNEPBEFEFU1Eyc\n+qGzbA03UFgBNvArurHQ5Z/GngGqE7IarSQFSoqewYRtFSfp+TL9CUNBvM0rT7vz\n2eMu3/wWG+CBmb92lkmyWwC1WSWFKO3x8w+Br2IFWvAZqHRt8oiG5QtYvcZL6jym\nY8T6sgdDlj+Y+wWaLHs9Fc+7vBuyK9C4O1ORdMPW15qVSl4Lc2Wu1QVwRiKnmA+c\nDsH/m7kDNRHM7TjWnuj+nrBOKAHzYquiu5iB3Qmx+0gwnrSVf27Arc3ozUmmJbLj\nzQIDAQAB +58e4f17d:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvBxJN9ErBgdRcPr5g4hV\nqyUSGZEKuvQliq2Z9SRHLh2J43+EdB6A+yzVvLnzcHVpBJ+BZ9RV30EM9guck9sh\nr+bryZcRHyjG2wiIEoduxF2a8KeWeQH7QlpwGhuobo1+gA8L0AGImiA6UP3LOirl\nI0G2+iaKZowME8/tydww4jx5vG132JCOScMjTalRsYZYJcjFbebQQolpqRaGB4iG\nWqhytWQGWuKiB1A22wjmIYf3t96l1Mp+FmM2URPxD1gk/BIBnX7ew+2gWppXOK9j\n1BJpo0/HaX5XoZ/uMqISAAtgHZAqq+g3IUPouxTphgYQRTRYpz2COw3NF43VYQrR\nbQIDAQAB +60ac2099:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwR4uJVtJOnOFGchnMW5Y\nj5/waBdG1u5BTMlH+iQMcV5+VgWhmpZHJCBz3ocD+0IGk2I68S5TDOHec/GSC0lv\n6R9o6F7h429GmgPgVKQsc8mPTPtbjJMuLLs4xKc+viCplXc0Nc0ZoHmCH4da6fCV\ntdpHQjVe6F9zjdquZ4RjV6R6JTiN9v924dGMAkbW/xXmamtz51FzondKC52Gh8Mo\n/oA0/T0KsCMCi7tb4QNQUYrf+Xcha9uus4ww1kWNZyfXJB87a2kORLiWMfs2IBBJ\nTmZ2Fnk0JnHDb8Oknxd9PvJPT0mvyT8DA+KIAPqNvOjUXP4bnjEHJcoCP9S5HkGC\nIQIDAQAB +6165ee59:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAutQkua2CAig4VFSJ7v54\nALyu/J1WB3oni7qwCZD3veURw7HxpNAj9hR+S5N/pNeZgubQvJWyaPuQDm7PTs1+\ntFGiYNfAsiibX6Rv0wci3M+z2XEVAeR9Vzg6v4qoofDyoTbovn2LztaNEjTkB+oK\ntlvpNhg1zhou0jDVYFniEXvzjckxswHVb8cT0OMTKHALyLPrPOJzVtM9C1ew2Nnc\n3848xLiApMu3NBk0JqfcS3Bo5Y2b1FRVBvdt+2gFoKZix1MnZdAEZ8xQzL/a0YS5\nHd0wj5+EEKHfOd3A75uPa/WQmA+o0cBFfrzm69QDcSJSwGpzWrD1ScH3AK8nWvoj\nv7e9gukK/9yl1b4fQQ00vttwJPSgm9EnfPHLAtgXkRloI27H6/PuLoNvSAMQwuCD\nhQRlyGLPBETKkHeodfLoULjhDi1K2gKJTMhtbnUcAA7nEphkMhPWkBpgFdrH+5z4\nLxy+3ek0cqcI7K68EtrffU8jtUj9LFTUC8dERaIBs7NgQ/LfDbDfGh9g6qVj1hZl\nk9aaIPTm/xsi8v3u+0qaq7KzIBc9s59JOoA8TlpOaYdVgSQhHHLBaahOuAigH+VI\nisbC9vmqsThF2QdDtQt37keuqoda2E6sL7PUvIyVXDRfwX7uMDjlzTxHTymvq2Ck\nhtBqojBnThmjJQFgZXocHG8CAwEAAQ== +61666e3f:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlEyxkHggKCXC2Wf5Mzx4\nnZLFZvU2bgcA3exfNPO/g1YunKfQY+Jg4fr6tJUUTZ3XZUrhmLNWvpvSwDS19ZmC\nIXOu0+V94aNgnhMsk9rr59I8qcbsQGIBoHzuAl8NzZCgdbEXkiY90w1skUw8J57z\nqCsMBydAueMXuWqF5nGtYbi5vHwK42PffpiZ7G5Kjwn8nYMW5IZdL6ZnMEVJUWC9\nI4waeKg0yskczYDmZUEAtrn3laX9677ToCpiKrvmZYjlGl0BaGp3cxggP2xaDbUq\nqfFxWNgvUAb3pXD09JM6Mt6HSIJaFc9vQbrKB9KT515y763j5CC2KUsilszKi3mB\nHYe5PoebdjS7D1Oh+tRqfegU2IImzSwW3iwA7PJvefFuc/kNIijfS/gH/cAqAK6z\nbhdOtE/zc7TtqW2Wn5Y03jIZdtm12CxSxwgtCF1NPyEWyIxAQUX9ACb3M0FAZ61n\nfpPrvwTaIIxxZ01L3IzPLpbc44x/DhJIEU+iDt6IMTrHOphD9MCG4631eIdB0H1b\n6zbNX1CXTsafqHRFV9XmYYIeOMggmd90s3xIbEujA6HKNP/gwzO6CDJ+nHFDEqoF\nSkxRdTkEqjTjVKieURW7Swv7zpfu5PrsrrkyGnsRrBJJzXlm2FOOxnbI2iSL1B5F\nrO5kbUxFeZUIDq+7Yv4kLWcCAwEAAQ== +616a9724:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnC+bR4bHf/L6QdU4puhQ\ngl1MHePszRC38bzvVFDUJsmCaMCL2suCs2A2yxAgGb9pu9AJYLAmxQC4mM3jNqhg\n/E7yuaBbek3O02zN/ctvflJ250wZCy+z0ZGIp1ak6pu1j14IwHokl9j36zNfGtfv\nADVOcdpWITFFlPqwq1qt/H3UsKVmtiF3BNWWTeUEQwKvlU8ymxgS99yn0+4OPyNT\nL3EUeS+NQJtDS01unau0t7LnjUXn+XIneWny8bIYOQCuVR6s/gpIGuhBaUqwaJOw\n7jkJZYF2Ij7uPb4b5/R3vX2FfxxqEHqssFSg8FFUNTZz3qNZs0CRVyfA972g9WkJ\nhPfn31pQYil4QGRibCMIeU27YAEjXoqfJKEPh4UWMQsQLrEfdGfb8VgwrPbniGfU\nL3jKJR3VAafL9330iawzVQDlIlwGl6u77gEXMl9K0pfazunYhAp+BMP+9ot5ckK+\nosmrqj11qMESsAj083GeFdfV3pXEIwUytaB0AKEht9DbqUfiE/oeZ/LAXgySMtVC\nsbC4ESmgVeY2xSBIJdDyUap7FR49GGrw0W49NUv9gRgQtGGaNVQQO9oGL2PBC41P\niWF9GLoX30HIz1P8PF/cZvicSSPkQf2Z6TV+t0ebdGNS5DjapdnCrq8m9Z0pyKsQ\nuxAL2a7zX8l5i1CZh1ycUGsCAwEAAQ== +616abc23:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0MfCDrhODRCIxR9Dep1s\neXafh5CE5BrF4WbCgCsevyPIdvTeyIaW4vmO3bbG4VzhogDZju+R3IQYFuhoXP5v\nY+zYJGnwrgz3r5wYAvPnLEs1+dtDKYOgJXQj+wLJBW1mzRDL8FoRXOe5iRmn1EFS\nwZ1DoUvyu7/J5r0itKicZp3QKED6YoilXed+1vnS4Sk0mzN4smuMR9eO1mMCqNp9\n9KTfRDHTbakIHwasECCXCp50uXdoW6ig/xUAFanpm9LtK6jctNDbXDhQmgvAaLXZ\nLvFqoaYJ/CvWkyYCgL6qxvMvVmPoRv7OPcyni4xR/WgWa0MSaEWjgPx3+yj9fiMA\n1S02pFWFDOr5OUF/O4YhFJvUCOtVsUPPfA/Lj6faL0h5QI9mQhy5Zb9TTaS9jB6p\nLw7u0dJlrjFedk8KTJdFCcaGYHP6kNPnOxMylcB/5WcztXZVQD5WpCicGNBxCGMm\nW64SgrV7M07gQfL/32QLsdqPUf0i8hoVD8wfQ3EpbQzv6Fk1Cn90bZqZafg8XWGY\nwddhkXk7egrr23Djv37V2okjzdqoyLBYBxMz63qQzFoAVv5VoY2NDTbXYUYytOvG\nGJ1afYDRVWrExCech1mX5ZVUB1br6WM+psFLJFoBFl6mDmiYt0vMYBddKISsvwLl\nIJQkzDwtXzT2cSjoj3T5QekCAwEAAQ== +616ac3bc:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvaaoSLab+IluixwKV5Od\n0gib2YurjPatGIbn5Ov2DLUFYiebj2oJINXJSwUOO+4WcuHFEqiL/1rya+k5hLZt\nhnPL1tn6QD4rESznvGSasRCQNT2vS/oyZbTYJRyAtFkEYLlq0t3S3xBxxHWuvIf0\nqVxVNYpQWyM3N9RIeYBR/euXKJXileSHk/uq1I5wTC0XBIHWcthczGN0m9wBEiWS\n0m3cnPk4q0Ea8mUJ91Rqob19qETz6VbSPYYpZk3qOycjKosuwcuzoMpwU8KRiMFd\n5LHtX0Hx85ghGsWDVtS0c0+aJa4lOMGvJCAOvDfqvODv7gKlCXUpgumGpLdTmaZ8\n1RwqspAe3IqBcdKTqRD4m2mSg23nVx2FAY3cjFvZQtfooT7q1ItRV5RgH6FhQSl7\n+6YIMJ1Bf8AAlLdRLpg+doOUGcEn+pkDiHFgI8ylH1LKyFKw+eXaAml/7DaWZk1d\ndqggwhXOhc/UUZFQuQQ8A8zpA13PcbC05XxN2hyP93tCEtyynMLVPtrRwDnHxFKa\nqKzs3rMDXPSXRn3ZZTdKH3069ApkEjQdpcwUh+EmJ1Ve/5cdtzT6kKWCjKBFZP/s\n91MlRrX2BTRdHaU5QJkUheUtakwxuHrdah2F94lRmsnQlpPr2YseJu6sIE+Dnx4M\nCfhdVbQL2w54R645nlnohu8CAwEAAQ== +616adfeb:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq0BFD1D4lIxQcsqEpQzU\npNCYM3aP1V/fxxVdT4DWvSI53JHTwHQamKdMWtEXetWVbP5zSROniYKFXd/xrD9X\n0jiGHey3lEtylXRIPxe5s+wXoCmNLcJVnvTcDtwx/ne2NLHxp76lyc25At+6RgE6\nADjLVuoD7M4IFDkAsd8UQ8zM0Dww9SylIk/wgV3ZkifecvgUQRagrNUdUjR56EBZ\nraQrev4hhzOgwelT0kXCu3snbUuNY/lU53CoTzfBJ5UfEJ5pMw1ij6X0r5S9IVsy\nKLWH1hiO0NzU2c8ViUYCly4Fe9xMTFc6u2dy/dxf6FwERfGzETQxqZvSfrRX+GLj\n/QZAXiPg5178hT/m0Y3z5IGenIC/80Z9NCi+byF1WuJlzKjDcF/TU72zk0+PNM/H\nKuppf3JT4DyjiVzNC5YoWJT2QRMS9KLP5iKCSThwVceEEg5HfhQBRT9M6KIcFLSs\nmFjx9kNEEmc1E8hl5IR3+3Ry8G5/bTIIruz14jgeY9u5jhL8Vyyvo41jgt9sLHR1\n/J1TxKfkgksYev7PoX6/ZzJ1ksWKZY5NFoDXTNYUgzFUTOoEaOg3BAQKadb3Qbbq\nXIrxmPBdgrn9QI7NCgfnAY3Tb4EEjs3ON/BNyEhUENcXOH6I1NbcuBQ7g9P73kE4\nVORdoc8MdJ5eoKBpO8Ww8HECAwEAAQ== +616ae350:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyduVzi1mWm+lYo2Tqt/0\nXkCIWrDNP1QBMVPrE0/ZlU2bCGSoo2Z9FHQKz/mTyMRlhNqTfhJ5qU3U9XlyGOPJ\npiM+b91g26pnpXJ2Q2kOypSgOMOPA4cQ42PkHBEqhuzssfj9t7x47ppS94bboh46\nxLSDRff/NAbtwTpvhStV3URYkxFG++cKGGa5MPXBrxIp+iZf9GnuxVdST5PGiVGP\nODL/b69sPJQNbJHVquqUTOh5Ry8uuD2WZuXfKf7/C0jC/ie9m2+0CttNu9tMciGM\nEyKG1/Xhk5iIWO43m4SrrT2WkFlcZ1z2JSf9Pjm4C2+HovYpihwwdM/OdP8Xmsnr\nDzVB4YvQiW+IHBjStHVuyiZWc+JsgEPJzisNY0Wyc/kNyNtqVKpX6dRhMLanLmy+\nf53cCSI05KPQAcGj6tdL+D60uKDkt+FsDa0BTAobZ31OsFVid0vCXtsbplNhW1IF\nHwsGXBTVcfXg44RLyL8Lk/2dQxDHNHzAUslJXzPxaHBLmt++2COa2EI1iWlvtznk\nOk9WP8SOAIj+xdqoiHcC4j72BOVVgiITIJNHrbppZCq6qPR+fgXmXa+sDcGh30m6\n9Wpbr28kLMSHiENCWTdsFij+NQTd5S47H7XTROHnalYDuF1RpS+DpQidT5tUimaT\nJZDr++FjKrnnijbyNF8b98UCAwEAAQ== +616db30d:MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnpUpyWDWjlUk3smlWeA0\nlIMW+oJ38t92CRLHH3IqRhyECBRW0d0aRGtq7TY8PmxjjvBZrxTNDpJT6KUk4LRm\na6A6IuAI7QnNK8SJqM0DLzlpygd7GJf8ZL9SoHSH+gFsYF67Cpooz/YDqWrlN7Vw\ntO00s0B+eXy+PCXYU7VSfuWFGK8TGEv6HfGMALLjhqMManyvfp8hz3ubN1rK3c8C\nUS/ilRh1qckdbtPvoDPhSbTDmfU1g/EfRSIEXBrIMLg9ka/XB9PvWRrekrppnQzP\nhP9YE3x/wbFc5QqQWiRCYyQl/rgIMOXvIxhkfe8H5n1Et4VAorkpEAXdsfN8KSVv\nLSMazVlLp9GYq5SUpqYX3KnxdWBgN7BJoZ4sltsTpHQ/34SXWfu3UmyUveWj7wp0\nx9hwsPirVI00EEea9AbP7NM2rAyu6ukcm4m6ATd2DZJIViq2es6m60AE6SMCmrQF\nwmk4H/kdQgeAELVfGOm2VyJ3z69fQuywz7xu27S6zTKi05Qlnohxol4wVb6OB7qG\nLPRtK9ObgzRo/OPumyXqlzAi/Yvyd1ZQk8labZps3e16bQp8+pVPiumWioMFJDWV\nGZjCmyMSU8V6MB6njbgLHoyg2LCukCAeSjbPGGGYhnKLm1AKSoJh3IpZuqcKCk5C\n8CM1S15HxV78s9dFntEqIokCAwEAAQ== +' +__Keyring= +__KeyringFile="/usr/share/keyrings/ubuntu-archive-keyring.gpg" +__SkipSigCheck=0 +__UseMirror=0 + +__UnprocessedBuildArgs= +while :; do + if [[ "$#" -le 0 ]]; then + break + fi + + lowerI="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + case $lowerI in + -\?|-h|--help) + usage + ;; + arm) + __BuildArch=arm + __UbuntuArch=armhf + __AlpineArch=armv7 + __QEMUArch=arm + ;; + arm64) + __BuildArch=arm64 + __UbuntuArch=arm64 + __AlpineArch=aarch64 + __QEMUArch=aarch64 + __FreeBSDArch=arm64 + __FreeBSDMachineArch=aarch64 + ;; + armel) + __BuildArch=armel + __UbuntuArch=armel + __UbuntuRepo="http://ftp.debian.org/debian/" + __CodeName=jessie + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + ;; + armv6) + __BuildArch=armv6 + __UbuntuArch=armhf + __QEMUArch=arm + __UbuntuRepo="http://raspbian.raspberrypi.org/raspbian/" + __CodeName=buster + __KeyringFile="/usr/share/keyrings/raspbian-archive-keyring.gpg" + __LLDB_Package="liblldb-6.0-dev" + __UbuntuSuites= + + if [[ -e "$__KeyringFile" ]]; then + __Keyring="--keyring $__KeyringFile" + fi + ;; + riscv64) + __BuildArch=riscv64 + __AlpineArch=riscv64 + __AlpinePackages="${__AlpinePackages// lldb-dev/}" + __QEMUArch=riscv64 + __UbuntuArch=riscv64 + __UbuntuPackages="${__UbuntuPackages// libunwind8-dev/}" + unset __LLDB_Package + ;; + ppc64le) + __BuildArch=ppc64le + __AlpineArch=ppc64le + __QEMUArch=ppc64le + __UbuntuArch=ppc64el + __UbuntuRepo="http://ports.ubuntu.com/ubuntu-ports/" + __UbuntuPackages="${__UbuntuPackages// libunwind8-dev/}" + __UbuntuPackages="${__UbuntuPackages// libomp-dev/}" + __UbuntuPackages="${__UbuntuPackages// libomp5/}" + unset __LLDB_Package + ;; + s390x) + __BuildArch=s390x + __AlpineArch=s390x + __QEMUArch=s390x + __UbuntuArch=s390x + __UbuntuRepo="http://ports.ubuntu.com/ubuntu-ports/" + __UbuntuPackages="${__UbuntuPackages// libunwind8-dev/}" + __UbuntuPackages="${__UbuntuPackages// libomp-dev/}" + __UbuntuPackages="${__UbuntuPackages// libomp5/}" + unset __LLDB_Package + ;; + x64) + __BuildArch=x64 + __AlpineArch=x86_64 + __UbuntuArch=amd64 + __FreeBSDArch=amd64 + __FreeBSDMachineArch=amd64 + __illumosArch=x86_64 + __HaikuArch=x86_64 + __UbuntuRepo="http://archive.ubuntu.com/ubuntu/" + ;; + x86) + __BuildArch=x86 + __UbuntuArch=i386 + __AlpineArch=x86 + __UbuntuRepo="http://archive.ubuntu.com/ubuntu/" + ;; + lldb*) + version="$(echo "$lowerI" | tr -d '[:alpha:]-=')" + majorVersion="${version%%.*}" + + [ -z "${version##*.*}" ] && minorVersion="${version#*.}" + if [ -z "$minorVersion" ]; then + minorVersion=0 + fi + + # for versions > 6.0, lldb has dropped the minor version + if [ "$majorVersion" -le 6 ]; then + version="$majorVersion.$minorVersion" + else + version="$majorVersion" + fi + + __LLDB_Package="liblldb-${version}-dev" + ;; + no-lldb) + unset __LLDB_Package + ;; + llvm*) + version="$(echo "$lowerI" | tr -d '[:alpha:]-=')" + __LLVM_MajorVersion="${version%%.*}" + + [ -z "${version##*.*}" ] && __LLVM_MinorVersion="${version#*.}" + if [ -z "$__LLVM_MinorVersion" ]; then + __LLVM_MinorVersion=0 + fi + + # for versions > 6.0, lldb has dropped the minor version + if [ "$__LLVM_MajorVersion" -gt 6 ]; then + __LLVM_MinorVersion= + fi + + ;; + xenial) # Ubuntu 16.04 + if [[ "$__CodeName" != "jessie" ]]; then + __CodeName=xenial + fi + ;; + zesty) # Ubuntu 17.04 + if [[ "$__CodeName" != "jessie" ]]; then + __CodeName=zesty + fi + ;; + bionic) # Ubuntu 18.04 + if [[ "$__CodeName" != "jessie" ]]; then + __CodeName=bionic + fi + ;; + focal) # Ubuntu 20.04 + if [[ "$__CodeName" != "jessie" ]]; then + __CodeName=focal + fi + ;; + jammy) # Ubuntu 22.04 + if [[ "$__CodeName" != "jessie" ]]; then + __CodeName=jammy + fi + ;; + noble) # Ubuntu 24.04 + if [[ "$__CodeName" != "jessie" ]]; then + __CodeName=noble + fi + if [[ -n "$__LLDB_Package" ]]; then + __LLDB_Package="liblldb-18-dev" + fi + ;; + jessie) # Debian 8 + __CodeName=jessie + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.debian.org/debian/" + fi + ;; + stretch) # Debian 9 + __CodeName=stretch + __LLDB_Package="liblldb-6.0-dev" + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.debian.org/debian/" + fi + ;; + buster) # Debian 10 + __CodeName=buster + __LLDB_Package="liblldb-6.0-dev" + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.debian.org/debian/" + fi + ;; + bullseye) # Debian 11 + __CodeName=bullseye + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.debian.org/debian/" + fi + ;; + bookworm) # Debian 12 + __CodeName=bookworm + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.debian.org/debian/" + fi + ;; + sid) # Debian sid + __CodeName=sid + __KeyringFile="/usr/share/keyrings/debian-archive-keyring.gpg" + + if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ftp.debian.org/debian/" + fi + ;; + tizen) + __CodeName= + __UbuntuRepo= + __Tizen=tizen + ;; + alpine*) + __CodeName=alpine + __UbuntuRepo= + + if [[ "$lowerI" == "alpineedge" ]]; then + __AlpineVersion=edge + else + version="$(echo "$lowerI" | tr -d '[:alpha:]-=')" + __AlpineMajorVersion="${version%%.*}" + __AlpineMinorVersion="${version#*.}" + __AlpineVersion="$__AlpineMajorVersion.$__AlpineMinorVersion" + fi + ;; + freebsd13) + __CodeName=freebsd + __SkipUnmount=1 + ;; + freebsd14) + __CodeName=freebsd + __FreeBSDBase="14.0-RELEASE" + __FreeBSDABI="14" + __SkipUnmount=1 + ;; + illumos) + __CodeName=illumos + __SkipUnmount=1 + ;; + haiku) + __CodeName=haiku + __SkipUnmount=1 + ;; + --skipunmount) + __SkipUnmount=1 + ;; + --skipsigcheck) + __SkipSigCheck=1 + ;; + --rootfsdir|-rootfsdir) + shift + __RootfsDir="$1" + ;; + --use-mirror) + __UseMirror=1 + ;; + --use-jobs) + shift + MAXJOBS=$1 + ;; + *) + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1" + ;; + esac + + shift +done + +case "$__AlpineVersion" in + 3.14) __AlpinePackages+=" llvm11-libs" ;; + 3.15) __AlpinePackages+=" llvm12-libs" ;; + 3.16) __AlpinePackages+=" llvm13-libs" ;; + 3.17) __AlpinePackages+=" llvm15-libs" ;; + edge) __AlpineLlvmLibsLookup=1 ;; + *) + if [[ "$__AlpineArch" =~ s390x|ppc64le ]]; then + __AlpineVersion=3.15 # minimum version that supports lldb-dev + __AlpinePackages+=" llvm12-libs" + elif [[ "$__AlpineArch" == "x86" ]]; then + __AlpineVersion=3.17 # minimum version that supports lldb-dev + __AlpinePackages+=" llvm15-libs" + elif [[ "$__AlpineArch" == "riscv64" ]]; then + __AlpineLlvmLibsLookup=1 + __AlpineVersion=edge # minimum version with APKINDEX.tar.gz (packages archive) + else + __AlpineVersion=3.13 # 3.13 to maximize compatibility + __AlpinePackages+=" llvm10-libs" + + if [[ "$__AlpineArch" == "armv7" ]]; then + __AlpinePackages="${__AlpinePackages//numactl-dev/}" + fi + fi +esac + +if [[ "$__AlpineVersion" =~ 3\.1[345] ]]; then + # compiler-rt--static was merged in compiler-rt package in alpine 3.16 + # for older versions, we need compiler-rt--static, so replace the name + __AlpinePackages="${__AlpinePackages/compiler-rt/compiler-rt-static}" +fi + +if [[ "$__BuildArch" == "armel" ]]; then + __LLDB_Package="lldb-3.5-dev" +fi + +if [[ "$__CodeName" == "xenial" && "$__UbuntuArch" == "armhf" ]]; then + # libnuma-dev is not available on armhf for xenial + __UbuntuPackages="${__UbuntuPackages//libnuma-dev/}" +fi + +__UbuntuPackages+=" ${__LLDB_Package:-}" + +if [[ -z "$__UbuntuRepo" ]]; then + __UbuntuRepo="http://ports.ubuntu.com/" +fi + +if [[ -n "$__LLVM_MajorVersion" ]]; then + __UbuntuPackages+=" libclang-common-${__LLVM_MajorVersion}${__LLVM_MinorVersion:+.$__LLVM_MinorVersion}-dev" +fi + +if [[ -z "$__RootfsDir" && -n "$ROOTFS_DIR" ]]; then + __RootfsDir="$ROOTFS_DIR" +fi + +if [[ -z "$__RootfsDir" ]]; then + __RootfsDir="$__CrossDir/../../../.tools/rootfs/$__BuildArch" +fi + +if [[ -d "$__RootfsDir" ]]; then + if [[ "$__SkipUnmount" == "0" ]]; then + umount "$__RootfsDir"/* || true + fi + rm -rf "$__RootfsDir" +fi + +mkdir -p "$__RootfsDir" +__RootfsDir="$( cd "$__RootfsDir" && pwd )" + +__hasWget= +ensureDownloadTool() +{ + if command -v wget &> /dev/null; then + __hasWget=1 + elif command -v curl &> /dev/null; then + __hasWget=0 + else + >&2 echo "ERROR: either wget or curl is required by this script." + exit 1 + fi +} + +if [[ "$__CodeName" == "alpine" ]]; then + __ApkToolsVersion=2.12.11 + __ApkToolsDir="$(mktemp -d)" + __ApkKeysDir="$(mktemp -d)" + arch="$(uname -m)" + + ensureDownloadTool + + if [[ "$__hasWget" == 1 ]]; then + wget -P "$__ApkToolsDir" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v$__ApkToolsVersion/$arch/apk.static" + else + curl -SLO --create-dirs --output-dir "$__ApkToolsDir" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v$__ApkToolsVersion/$arch/apk.static" + fi + if [[ "$arch" == "x86_64" ]]; then + __ApkToolsSHA512SUM="53e57b49230da07ef44ee0765b9592580308c407a8d4da7125550957bb72cb59638e04f8892a18b584451c8d841d1c7cb0f0ab680cc323a3015776affaa3be33" + elif [[ "$arch" == "aarch64" ]]; then + __ApkToolsSHA512SUM="9e2b37ecb2b56c05dad23d379be84fd494c14bd730b620d0d576bda760588e1f2f59a7fcb2f2080577e0085f23a0ca8eadd993b4e61c2ab29549fdb71969afd0" + else + echo "WARNING: add missing hash for your host architecture. To find the value, use: 'find /tmp -name apk.static -exec sha512sum {} \;'" + fi + echo "$__ApkToolsSHA512SUM $__ApkToolsDir/apk.static" | sha512sum -c + chmod +x "$__ApkToolsDir/apk.static" + + if [[ -f "/usr/bin/qemu-$__QEMUArch-static" ]]; then + mkdir -p "$__RootfsDir"/usr/bin + cp -v "/usr/bin/qemu-$__QEMUArch-static" "$__RootfsDir/usr/bin" + fi + + if [[ "$__AlpineVersion" == "edge" ]]; then + version=edge + else + version="v$__AlpineVersion" + fi + + for line in $__AlpineKeys; do + id="${line%%:*}" + content="${line#*:}" + + echo -e "-----BEGIN PUBLIC KEY-----\n$content\n-----END PUBLIC KEY-----" > "$__ApkKeysDir/alpine-devel@lists.alpinelinux.org-$id.rsa.pub" + done + + if [[ "$__SkipSigCheck" == "1" ]]; then + __ApkSignatureArg="--allow-untrusted" + else + __ApkSignatureArg="--keys-dir $__ApkKeysDir" + fi + + # initialize DB + # shellcheck disable=SC2086 + "$__ApkToolsDir/apk.static" \ + -X "http://dl-cdn.alpinelinux.org/alpine/$version/main" \ + -X "http://dl-cdn.alpinelinux.org/alpine/$version/community" \ + -U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" --initdb add + + if [[ "$__AlpineLlvmLibsLookup" == 1 ]]; then + # shellcheck disable=SC2086 + __AlpinePackages+=" $("$__ApkToolsDir/apk.static" \ + -X "http://dl-cdn.alpinelinux.org/alpine/$version/main" \ + -X "http://dl-cdn.alpinelinux.org/alpine/$version/community" \ + -U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" \ + search 'llvm*-libs' | grep -E '^llvm' | sort | tail -1 | sed 's/-[^-]*//2g')" + fi + + # install all packages in one go + # shellcheck disable=SC2086 + "$__ApkToolsDir/apk.static" \ + -X "http://dl-cdn.alpinelinux.org/alpine/$version/main" \ + -X "http://dl-cdn.alpinelinux.org/alpine/$version/community" \ + -U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" \ + add $__AlpinePackages + + rm -r "$__ApkToolsDir" +elif [[ "$__CodeName" == "freebsd" ]]; then + mkdir -p "$__RootfsDir"/usr/local/etc + JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"} + + ensureDownloadTool + + if [[ "$__hasWget" == 1 ]]; then + wget -O- "https://download.freebsd.org/ftp/releases/${__FreeBSDArch}/${__FreeBSDMachineArch}/${__FreeBSDBase}/base.txz" | tar -C "$__RootfsDir" -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version + else + curl -SL "https://download.freebsd.org/ftp/releases/${__FreeBSDArch}/${__FreeBSDMachineArch}/${__FreeBSDBase}/base.txz" | tar -C "$__RootfsDir" -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version + fi + echo "ABI = \"FreeBSD:${__FreeBSDABI}:${__FreeBSDMachineArch}\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > "${__RootfsDir}"/usr/local/etc/pkg.conf + echo "FreeBSD: { url: \"pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly\", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > "${__RootfsDir}"/etc/pkg/FreeBSD.conf + mkdir -p "$__RootfsDir"/tmp + # get and build package manager + if [[ "$__hasWget" == 1 ]]; then + wget -O- "https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz" | tar -C "$__RootfsDir"/tmp -zxf - + else + curl -SL "https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz" | tar -C "$__RootfsDir"/tmp -zxf - + fi + cd "$__RootfsDir/tmp/pkg-${__FreeBSDPkg}" + # needed for install to succeed + mkdir -p "$__RootfsDir"/host/etc + ./autogen.sh && ./configure --prefix="$__RootfsDir"/host && make -j "$JOBS" && make install + rm -rf "$__RootfsDir/tmp/pkg-${__FreeBSDPkg}" + # install packages we need. + INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf update + # shellcheck disable=SC2086 + INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf install --yes $__FreeBSDPackages +elif [[ "$__CodeName" == "illumos" ]]; then + mkdir "$__RootfsDir/tmp" + pushd "$__RootfsDir/tmp" + JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"} + + ensureDownloadTool + + echo "Downloading sysroot." + if [[ "$__hasWget" == 1 ]]; then + wget -O- https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C "$__RootfsDir" -xzf - + else + curl -SL https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C "$__RootfsDir" -xzf - + fi + echo "Building binutils. Please wait.." + if [[ "$__hasWget" == 1 ]]; then + wget -O- https://ftp.gnu.org/gnu/binutils/binutils-2.42.tar.xz | tar -xJf - + else + curl -SL https://ftp.gnu.org/gnu/binutils/binutils-2.42.tar.xz | tar -xJf - + fi + mkdir build-binutils && cd build-binutils + ../binutils-2.42/configure --prefix="$__RootfsDir" --target="${__illumosArch}-sun-solaris2.11" --program-prefix="${__illumosArch}-illumos-" --with-sysroot="$__RootfsDir" + make -j "$JOBS" && make install && cd .. + echo "Building gcc. Please wait.." + if [[ "$__hasWget" == 1 ]]; then + wget -O- https://ftp.gnu.org/gnu/gcc/gcc-13.3.0/gcc-13.3.0.tar.xz | tar -xJf - + else + curl -SL https://ftp.gnu.org/gnu/gcc/gcc-13.3.0/gcc-13.3.0.tar.xz | tar -xJf - + fi + CFLAGS="-fPIC" + CXXFLAGS="-fPIC" + CXXFLAGS_FOR_TARGET="-fPIC" + CFLAGS_FOR_TARGET="-fPIC" + export CFLAGS CXXFLAGS CXXFLAGS_FOR_TARGET CFLAGS_FOR_TARGET + mkdir build-gcc && cd build-gcc + ../gcc-13.3.0/configure --prefix="$__RootfsDir" --target="${__illumosArch}-sun-solaris2.11" --program-prefix="${__illumosArch}-illumos-" --with-sysroot="$__RootfsDir" --with-gnu-as \ + --with-gnu-ld --disable-nls --disable-libgomp --disable-libquadmath --disable-libssp --disable-libvtv --disable-libcilkrts --disable-libada --disable-libsanitizer \ + --disable-libquadmath-support --disable-shared --enable-tls + make -j "$JOBS" && make install && cd .. + BaseUrl=https://pkgsrc.smartos.org + if [[ "$__UseMirror" == 1 ]]; then + BaseUrl=https://pkgsrc.smartos.skylime.net + fi + BaseUrl="$BaseUrl/packages/SmartOS/2019Q4/${__illumosArch}/All" + echo "Downloading manifest" + if [[ "$__hasWget" == 1 ]]; then + wget "$BaseUrl" + else + curl -SLO "$BaseUrl" + fi + echo "Downloading dependencies." + read -ra array <<<"$__IllumosPackages" + for package in "${array[@]}"; do + echo "Installing '$package'" + # find last occurrence of package in listing and extract its name + package="$(sed -En '/.*href="('"$package"'-[0-9].*).tgz".*/h;$!d;g;s//\1/p' All)" + echo "Resolved name '$package'" + if [[ "$__hasWget" == 1 ]]; then + wget "$BaseUrl"/"$package".tgz + else + curl -SLO "$BaseUrl"/"$package".tgz + fi + ar -x "$package".tgz + tar --skip-old-files -xzf "$package".tmp.tg* -C "$__RootfsDir" 2>/dev/null + done + echo "Cleaning up temporary files." + popd + rm -rf "$__RootfsDir"/{tmp,+*} + mkdir -p "$__RootfsDir"/usr/include/net + mkdir -p "$__RootfsDir"/usr/include/netpacket + if [[ "$__hasWget" == 1 ]]; then + wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/bpf.h + wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h + wget -P "$__RootfsDir"/usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h + wget -P "$__RootfsDir"/usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h + else + curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/bpf.h + curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h + curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h + curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h + fi +elif [[ "$__CodeName" == "haiku" ]]; then + JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"} + + echo "Building Haiku sysroot for $__HaikuArch" + mkdir -p "$__RootfsDir/tmp" + pushd "$__RootfsDir/tmp" + + mkdir "$__RootfsDir/tmp/download" + + ensureDownloadTool + + echo "Downloading Haiku package tool" + git clone https://github.com/haiku/haiku-toolchains-ubuntu --depth 1 "$__RootfsDir/tmp/script" + if [[ "$__hasWget" == 1 ]]; then + wget -O "$__RootfsDir/tmp/download/hosttools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --hosttools)" + else + curl -SLo "$__RootfsDir/tmp/download/hosttools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --hosttools)" + fi + + unzip -o "$__RootfsDir/tmp/download/hosttools.zip" -d "$__RootfsDir/tmp/bin" + + DepotBaseUrl="https://depot.haiku-os.org/__api/v2/pkg/get-pkg" + HpkgBaseUrl="https://eu.hpkg.haiku-os.org/haiku/master/$__HaikuArch/current" + + # Download Haiku packages + echo "Downloading Haiku packages" + read -ra array <<<"$__HaikuPackages" + for package in "${array[@]}"; do + echo "Downloading $package..." + # API documented here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L60 + # The schema here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L598 + if [[ "$__hasWget" == 1 ]]; then + hpkgDownloadUrl="$(wget -qO- --post-data '{"name":"'"$package"'","repositorySourceCode":"haikuports_'$__HaikuArch'","versionType":"LATEST","naturalLanguageCode":"en"}' \ + --header 'Content-Type:application/json' "$DepotBaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')" + wget -P "$__RootfsDir/tmp/download" "$hpkgDownloadUrl" + else + hpkgDownloadUrl="$(curl -sSL -XPOST --data '{"name":"'"$package"'","repositorySourceCode":"haikuports_'$__HaikuArch'","versionType":"LATEST","naturalLanguageCode":"en"}' \ + --header 'Content-Type:application/json' "$DepotBaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')" + curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$hpkgDownloadUrl" + fi + done + for package in haiku haiku_devel; do + echo "Downloading $package..." + if [[ "$__hasWget" == 1 ]]; then + hpkgVersion="$(wget -qO- "$HpkgBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')" + wget -P "$__RootfsDir/tmp/download" "$HpkgBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg" + else + hpkgVersion="$(curl -sSL "$HpkgBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')" + curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$HpkgBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg" + fi + done + + # Set up the sysroot + echo "Setting up sysroot and extracting required packages" + mkdir -p "$__RootfsDir/boot/system" + for file in "$__RootfsDir/tmp/download/"*.hpkg; do + echo "Extracting $file..." + LD_LIBRARY_PATH="$__RootfsDir/tmp/bin" "$__RootfsDir/tmp/bin/package" extract -C "$__RootfsDir/boot/system" "$file" + done + + # Download buildtools + echo "Downloading Haiku buildtools" + if [[ "$__hasWget" == 1 ]]; then + wget -O "$__RootfsDir/tmp/download/buildtools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --buildtools --arch=$__HaikuArch)" + else + curl -SLo "$__RootfsDir/tmp/download/buildtools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --buildtools --arch=$__HaikuArch)" + fi + unzip -o "$__RootfsDir/tmp/download/buildtools.zip" -d "$__RootfsDir" + + # Cleaning up temporary files + echo "Cleaning up temporary files" + popd + rm -rf "$__RootfsDir/tmp" +elif [[ -n "$__CodeName" ]]; then + + if [[ "$__SkipSigCheck" == "0" ]]; then + __Keyring="$__Keyring --force-check-gpg" + fi + + # shellcheck disable=SC2086 + echo running debootstrap "--variant=minbase" $__Keyring --arch "$__UbuntuArch" "$__CodeName" "$__RootfsDir" "$__UbuntuRepo" + debootstrap "--variant=minbase" $__Keyring --arch "$__UbuntuArch" "$__CodeName" "$__RootfsDir" "$__UbuntuRepo" + + mkdir -p "$__RootfsDir/etc/apt/sources.list.d/" + cat > "$__RootfsDir/etc/apt/sources.list.d/$__CodeName.sources" <>Start downloading files" +VERBOSE=1 $__CrossDir/tizen-fetch.sh $TIZEN_TMP_DIR $TIZEN_ARCH +echo "<>Start constructing Tizen rootfs" +TIZEN_RPM_FILES=`ls $TIZEN_TMP_DIR/*.rpm` +cd $ROOTFS_DIR +for f in $TIZEN_RPM_FILES; do + rpm2cpio $f | cpio -idm --quiet +done +echo "<>Start configuring Tizen rootfs" +ln -sfn asm-${LINK_ARCH} ./usr/include/asm +patch -p1 < $__TIZEN_CROSSDIR/tizen.patch +if [[ "$TIZEN_ARCH" == "riscv64" ]]; then + echo "Fixing broken symlinks in $PWD" + rm ./usr/lib64/libresolv.so + ln -s ../../lib64/libresolv.so.2 ./usr/lib64/libresolv.so + rm ./usr/lib64/libpthread.so + ln -s ../../lib64/libpthread.so.0 ./usr/lib64/libpthread.so + rm ./usr/lib64/libdl.so + ln -s ../../lib64/libdl.so.2 ./usr/lib64/libdl.so + rm ./usr/lib64/libutil.so + ln -s ../../lib64/libutil.so.1 ./usr/lib64/libutil.so + rm ./usr/lib64/libm.so + ln -s ../../lib64/libm.so.6 ./usr/lib64/libm.so + rm ./usr/lib64/librt.so + ln -s ../../lib64/librt.so.1 ./usr/lib64/librt.so + rm ./lib/ld-linux-riscv64-lp64d.so.1 + ln -s ../lib64/ld-linux-riscv64-lp64d.so.1 ./lib/ld-linux-riscv64-lp64d.so.1 +fi +echo "</dev/null; then + VERBOSE=0 +fi + +Log() +{ + if [ $VERBOSE -ge 1 ]; then + echo ${@:2} + fi +} + +Inform() +{ + Log 1 -e "\x1B[0;34m$@\x1B[m" +} + +Debug() +{ + Log 2 -e "\x1B[0;32m$@\x1B[m" +} + +Error() +{ + >&2 Log 0 -e "\x1B[0;31m$@\x1B[m" +} + +Fetch() +{ + URL=$1 + FILE=$2 + PROGRESS=$3 + if [ $VERBOSE -ge 1 ] && [ $PROGRESS ]; then + CURL_OPT="--progress-bar" + else + CURL_OPT="--silent" + fi + curl $CURL_OPT $URL > $FILE +} + +hash curl 2> /dev/null || { Error "Require 'curl' Aborting."; exit 1; } +hash xmllint 2> /dev/null || { Error "Require 'xmllint' Aborting."; exit 1; } +hash sha256sum 2> /dev/null || { Error "Require 'sha256sum' Aborting."; exit 1; } + +TMPDIR=$1 +if [ ! -d $TMPDIR ]; then + TMPDIR=./tizen_tmp + Debug "Create temporary directory : $TMPDIR" + mkdir -p $TMPDIR +fi + +TIZEN_ARCH=$2 + +TIZEN_URL=http://download.tizen.org/snapshots/TIZEN/Tizen +BUILD_XML=build.xml +REPOMD_XML=repomd.xml +PRIMARY_XML=primary.xml +TARGET_URL="http://__not_initialized" + +Xpath_get() +{ + XPATH_RESULT='' + XPATH=$1 + XML_FILE=$2 + RESULT=$(xmllint --xpath $XPATH $XML_FILE) + if [[ -z ${RESULT// } ]]; then + Error "Can not find target from $XML_FILE" + Debug "Xpath = $XPATH" + exit 1 + fi + XPATH_RESULT=$RESULT +} + +fetch_tizen_pkgs_init() +{ + TARGET=$1 + PROFILE=$2 + Debug "Initialize TARGET=$TARGET, PROFILE=$PROFILE" + + TMP_PKG_DIR=$TMPDIR/tizen_${PROFILE}_pkgs + if [ -d $TMP_PKG_DIR ]; then rm -rf $TMP_PKG_DIR; fi + mkdir -p $TMP_PKG_DIR + + PKG_URL=$TIZEN_URL/$PROFILE/latest + + BUILD_XML_URL=$PKG_URL/$BUILD_XML + TMP_BUILD=$TMP_PKG_DIR/$BUILD_XML + TMP_REPOMD=$TMP_PKG_DIR/$REPOMD_XML + TMP_PRIMARY=$TMP_PKG_DIR/$PRIMARY_XML + TMP_PRIMARYGZ=${TMP_PRIMARY}.gz + + Fetch $BUILD_XML_URL $TMP_BUILD + + Debug "fetch $BUILD_XML_URL to $TMP_BUILD" + + TARGET_XPATH="//build/buildtargets/buildtarget[@name=\"$TARGET\"]/repo[@type=\"binary\"]/text()" + Xpath_get $TARGET_XPATH $TMP_BUILD + TARGET_PATH=$XPATH_RESULT + TARGET_URL=$PKG_URL/$TARGET_PATH + + REPOMD_URL=$TARGET_URL/repodata/repomd.xml + PRIMARY_XPATH='string(//*[local-name()="data"][@type="primary"]/*[local-name()="location"]/@href)' + + Fetch $REPOMD_URL $TMP_REPOMD + + Debug "fetch $REPOMD_URL to $TMP_REPOMD" + + Xpath_get $PRIMARY_XPATH $TMP_REPOMD + PRIMARY_XML_PATH=$XPATH_RESULT + PRIMARY_URL=$TARGET_URL/$PRIMARY_XML_PATH + + Fetch $PRIMARY_URL $TMP_PRIMARYGZ + + Debug "fetch $PRIMARY_URL to $TMP_PRIMARYGZ" + + gunzip $TMP_PRIMARYGZ + + Debug "unzip $TMP_PRIMARYGZ to $TMP_PRIMARY" +} + +fetch_tizen_pkgs() +{ + ARCH=$1 + PACKAGE_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="location"]/@href)' + + PACKAGE_CHECKSUM_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="checksum"]/text())' + + for pkg in ${@:2} + do + Inform "Fetching... $pkg" + XPATH=${PACKAGE_XPATH_TPL/_PKG_/$pkg} + XPATH=${XPATH/_ARCH_/$ARCH} + Xpath_get $XPATH $TMP_PRIMARY + PKG_PATH=$XPATH_RESULT + + XPATH=${PACKAGE_CHECKSUM_XPATH_TPL/_PKG_/$pkg} + XPATH=${XPATH/_ARCH_/$ARCH} + Xpath_get $XPATH $TMP_PRIMARY + CHECKSUM=$XPATH_RESULT + + PKG_URL=$TARGET_URL/$PKG_PATH + PKG_FILE=$(basename $PKG_PATH) + PKG_PATH=$TMPDIR/$PKG_FILE + + Debug "Download $PKG_URL to $PKG_PATH" + Fetch $PKG_URL $PKG_PATH true + + echo "$CHECKSUM $PKG_PATH" | sha256sum -c - > /dev/null + if [ $? -ne 0 ]; then + Error "Fail to fetch $PKG_URL to $PKG_PATH" + Debug "Checksum = $CHECKSUM" + exit 1 + fi + done +} + +if [ "$TIZEN_ARCH" == "riscv64" ]; then + BASE="Tizen-Base-RISCV" + UNIFIED="Tizen-Unified-RISCV" +else + BASE="Tizen-Base" + UNIFIED="Tizen-Unified" +fi + +Inform "Initialize ${TIZEN_ARCH} base" +fetch_tizen_pkgs_init standard $BASE +Inform "fetch common packages" +fetch_tizen_pkgs ${TIZEN_ARCH} gcc gcc-devel-static glibc glibc-devel libicu libicu-devel libatomic linux-glibc-devel keyutils keyutils-devel libkeyutils +Inform "fetch coreclr packages" +fetch_tizen_pkgs ${TIZEN_ARCH} libgcc libstdc++ libstdc++-devel libunwind libunwind-devel lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu +if [ "$TIZEN_ARCH" != "riscv64" ]; then + fetch_tizen_pkgs ${TIZEN_ARCH} lldb lldb-devel +fi +Inform "fetch corefx packages" +fetch_tizen_pkgs ${TIZEN_ARCH} libcom_err libcom_err-devel zlib zlib-devel libopenssl11 libopenssl1.1-devel krb5 krb5-devel + +Inform "Initialize standard unified" +fetch_tizen_pkgs_init standard $UNIFIED +Inform "fetch corefx packages" +fetch_tizen_pkgs ${TIZEN_ARCH} gssdp gssdp-devel tizen-release + diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake new file mode 100644 index 000000000000..9a4e285a5ae3 --- /dev/null +++ b/eng/common/cross/toolchain.cmake @@ -0,0 +1,408 @@ +set(CROSS_ROOTFS $ENV{ROOTFS_DIR}) + +# reset platform variables (e.g. cmake 3.25 sets LINUX=1) +unset(LINUX) +unset(FREEBSD) +unset(ILLUMOS) +unset(ANDROID) +unset(TIZEN) +unset(HAIKU) + +set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH}) +if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version) + set(CMAKE_SYSTEM_NAME FreeBSD) + set(FREEBSD 1) +elseif(EXISTS ${CROSS_ROOTFS}/usr/platform/i86pc) + set(CMAKE_SYSTEM_NAME SunOS) + set(ILLUMOS 1) +elseif(EXISTS ${CROSS_ROOTFS}/boot/system/develop/headers/config/HaikuConfig.h) + set(CMAKE_SYSTEM_NAME Haiku) + set(HAIKU 1) +else() + set(CMAKE_SYSTEM_NAME Linux) + set(LINUX 1) +endif() +set(CMAKE_SYSTEM_VERSION 1) + +if(EXISTS ${CROSS_ROOTFS}/etc/tizen-release) + set(TIZEN 1) +elseif(EXISTS ${CROSS_ROOTFS}/android_platform) + set(ANDROID 1) +endif() + +if(TARGET_ARCH_NAME STREQUAL "arm") + set(CMAKE_SYSTEM_PROCESSOR armv7l) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv7-alpine-linux-musleabihf) + set(TOOLCHAIN "armv7-alpine-linux-musleabihf") + elseif(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf) + set(TOOLCHAIN "armv6-alpine-linux-musleabihf") + else() + set(TOOLCHAIN "arm-linux-gnueabihf") + endif() + if(TIZEN) + set(TIZEN_TOOLCHAIN "armv7hl-tizen-linux-gnueabihf/9.2.0") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "arm64") + set(CMAKE_SYSTEM_PROCESSOR aarch64) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl) + set(TOOLCHAIN "aarch64-alpine-linux-musl") + elseif(LINUX) + set(TOOLCHAIN "aarch64-linux-gnu") + if(TIZEN) + set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0") + endif() + elseif(FREEBSD) + set(triple "aarch64-unknown-freebsd12") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "armel") + set(CMAKE_SYSTEM_PROCESSOR armv7l) + set(TOOLCHAIN "arm-linux-gnueabi") + if(TIZEN) + set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/9.2.0") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "armv6") + set(CMAKE_SYSTEM_PROCESSOR armv6l) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf) + set(TOOLCHAIN "armv6-alpine-linux-musleabihf") + else() + set(TOOLCHAIN "arm-linux-gnueabihf") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "ppc64le") + set(CMAKE_SYSTEM_PROCESSOR ppc64le) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/powerpc64le-alpine-linux-musl) + set(TOOLCHAIN "powerpc64le-alpine-linux-musl") + else() + set(TOOLCHAIN "powerpc64le-linux-gnu") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "riscv64") + set(CMAKE_SYSTEM_PROCESSOR riscv64) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/riscv64-alpine-linux-musl) + set(TOOLCHAIN "riscv64-alpine-linux-musl") + else() + set(TOOLCHAIN "riscv64-linux-gnu") + if(TIZEN) + set(TIZEN_TOOLCHAIN "riscv64-tizen-linux-gnu/13.1.0") + endif() + endif() +elseif(TARGET_ARCH_NAME STREQUAL "s390x") + set(CMAKE_SYSTEM_PROCESSOR s390x) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/s390x-alpine-linux-musl) + set(TOOLCHAIN "s390x-alpine-linux-musl") + else() + set(TOOLCHAIN "s390x-linux-gnu") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x64") + set(CMAKE_SYSTEM_PROCESSOR x86_64) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/x86_64-alpine-linux-musl) + set(TOOLCHAIN "x86_64-alpine-linux-musl") + elseif(LINUX) + set(TOOLCHAIN "x86_64-linux-gnu") + if(TIZEN) + set(TIZEN_TOOLCHAIN "x86_64-tizen-linux-gnu/9.2.0") + endif() + elseif(FREEBSD) + set(triple "x86_64-unknown-freebsd12") + elseif(ILLUMOS) + set(TOOLCHAIN "x86_64-illumos") + elseif(HAIKU) + set(TOOLCHAIN "x86_64-unknown-haiku") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x86") + set(CMAKE_SYSTEM_PROCESSOR i686) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl) + set(TOOLCHAIN "i586-alpine-linux-musl") + else() + set(TOOLCHAIN "i686-linux-gnu") + endif() + if(TIZEN) + set(TIZEN_TOOLCHAIN "i586-tizen-linux-gnu/9.2.0") + endif() +else() + message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only arm, arm64, armel, armv6, ppc64le, riscv64, s390x, x64 and x86 are supported!") +endif() + +if(DEFINED ENV{TOOLCHAIN}) + set(TOOLCHAIN $ENV{TOOLCHAIN}) +endif() + +# Specify include paths +if(TIZEN) + if(TARGET_ARCH_NAME STREQUAL "arm") + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7hl-tizen-linux-gnueabihf) + endif() + if(TARGET_ARCH_NAME STREQUAL "armel") + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi) + endif() + if(TARGET_ARCH_NAME STREQUAL "arm64") + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/aarch64-tizen-linux-gnu) + endif() + if(TARGET_ARCH_NAME STREQUAL "x86") + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/i586-tizen-linux-gnu) + endif() + if(TARGET_ARCH_NAME STREQUAL "x64") + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/x86_64-tizen-linux-gnu) + endif() + if(TARGET_ARCH_NAME STREQUAL "riscv64") + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/riscv64-tizen-linux-gnu) + endif() +endif() + +if(ANDROID) + if(TARGET_ARCH_NAME STREQUAL "arm") + set(ANDROID_ABI armeabi-v7a) + elseif(TARGET_ARCH_NAME STREQUAL "arm64") + set(ANDROID_ABI arm64-v8a) + endif() + + # extract platform number required by the NDK's toolchain + file(READ "${CROSS_ROOTFS}/android_platform" RID_FILE_CONTENTS) + string(REPLACE "RID=" "" ANDROID_RID "${RID_FILE_CONTENTS}") + string(REGEX REPLACE ".*\\.([0-9]+)-.*" "\\1" ANDROID_PLATFORM "${ANDROID_RID}") + + set(ANDROID_TOOLCHAIN clang) + set(FEATURE_EVENT_TRACE 0) # disable event trace as there is no lttng-ust package in termux repository + set(CMAKE_SYSTEM_LIBRARY_PATH "${CROSS_ROOTFS}/usr/lib") + set(CMAKE_SYSTEM_INCLUDE_PATH "${CROSS_ROOTFS}/usr/include") + + # include official NDK toolchain script + include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake) +elseif(FREEBSD) + # we cross-compile by instructing clang + set(CMAKE_C_COMPILER_TARGET ${triple}) + set(CMAKE_CXX_COMPILER_TARGET ${triple}) + set(CMAKE_ASM_COMPILER_TARGET ${triple}) + set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld") +elseif(ILLUMOS) + set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + + include_directories(SYSTEM ${CROSS_ROOTFS}/include) + + set(TOOLSET_PREFIX ${TOOLCHAIN}-) + function(locate_toolchain_exec exec var) + string(TOUPPER ${exec} EXEC_UPPERCASE) + if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "") + set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE) + return() + endif() + + find_program(EXEC_LOCATION_${exec} + NAMES + "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}" + "${TOOLSET_PREFIX}${exec}") + + if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND") + message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.") + endif() + set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE) + endfunction() + + set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}") + + locate_toolchain_exec(gcc CMAKE_C_COMPILER) + locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) + + set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") + set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") +elseif(HAIKU) + set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};${CROSS_ROOTFS}/cross-tools-x86_64/bin") + + set(TOOLSET_PREFIX ${TOOLCHAIN}-) + function(locate_toolchain_exec exec var) + string(TOUPPER ${exec} EXEC_UPPERCASE) + if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "") + set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE) + return() + endif() + + find_program(EXEC_LOCATION_${exec} + NAMES + "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}" + "${TOOLSET_PREFIX}${exec}") + + if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND") + message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.") + endif() + set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE) + endfunction() + + set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}") + + locate_toolchain_exec(gcc CMAKE_C_COMPILER) + locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) + + set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") + set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") + + # let CMake set up the correct search paths + include(Platform/Haiku) +else() + set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + + set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") + set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") + set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") +endif() + +# Specify link flags + +function(add_toolchain_linker_flag Flag) + set(Config "${ARGV1}") + set(CONFIG_SUFFIX "") + if (NOT Config STREQUAL "") + set(CONFIG_SUFFIX "_${Config}") + endif() + set("CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE) + set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE) +endfunction() + +if(LINUX) + add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib/${TOOLCHAIN}") + add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}") +endif() + +if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$") + if(TIZEN) + add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + endif() +elseif(TARGET_ARCH_NAME MATCHES "^(arm64|x64|riscv64)$") + if(TIZEN) + add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib64") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") + + add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib64") + add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64") + add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "s390x") + add_toolchain_linker_flag("--target=${TOOLCHAIN}") +elseif(TARGET_ARCH_NAME STREQUAL "x86") + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl) + add_toolchain_linker_flag("--target=${TOOLCHAIN}") + add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}") + endif() + add_toolchain_linker_flag(-m32) + if(TIZEN) + add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + endif() +elseif(ILLUMOS) + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib/amd64") + add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/amd64/lib") +elseif(HAIKU) + add_toolchain_linker_flag("-lnetwork") + add_toolchain_linker_flag("-lroot") +endif() + +# Specify compile options + +if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|ppc64le|riscv64|s390x|x64|x86)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS OR HAIKU) + set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN}) + set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN}) + set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN}) +endif() + +if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$") + add_compile_options(-mthumb) + if (NOT DEFINED CLR_ARM_FPU_TYPE) + set (CLR_ARM_FPU_TYPE vfpv3) + endif (NOT DEFINED CLR_ARM_FPU_TYPE) + + add_compile_options (-mfpu=${CLR_ARM_FPU_TYPE}) + if (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + set (CLR_ARM_FPU_CAPABILITY 0x7) + endif (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + + add_definitions (-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY}) + + # persist variables across multiple try_compile passes + list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CLR_ARM_FPU_TYPE CLR_ARM_FPU_CAPABILITY) + + if(TARGET_ARCH_NAME STREQUAL "armel") + add_compile_options(-mfloat-abi=softfp) + endif() +elseif(TARGET_ARCH_NAME STREQUAL "s390x") + add_compile_options("--target=${TOOLCHAIN}") +elseif(TARGET_ARCH_NAME STREQUAL "x86") + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl) + add_compile_options(--target=${TOOLCHAIN}) + endif() + add_compile_options(-m32) + add_compile_options(-Wno-error=unused-command-line-argument) +endif() + +if(TIZEN) + if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64|x86)$") + add_compile_options(-Wno-deprecated-declarations) # compile-time option + add_compile_options(-D__extern_always_inline=inline) # compile-time option + endif() +endif() + +# Set LLDB include and library paths for builds that need lldb. +if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$") + if(TARGET_ARCH_NAME STREQUAL "x86") + set(LLVM_CROSS_DIR "$ENV{LLVM_CROSS_HOME}") + else() # arm/armel case + set(LLVM_CROSS_DIR "$ENV{LLVM_ARM_HOME}") + endif() + if(LLVM_CROSS_DIR) + set(WITH_LLDB_LIBS "${LLVM_CROSS_DIR}/lib/" CACHE STRING "") + set(WITH_LLDB_INCLUDES "${LLVM_CROSS_DIR}/include" CACHE STRING "") + set(LLDB_H "${WITH_LLDB_INCLUDES}" CACHE STRING "") + set(LLDB "${LLVM_CROSS_DIR}/lib/liblldb.so" CACHE STRING "") + else() + if(TARGET_ARCH_NAME STREQUAL "x86") + set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/i386-linux-gnu" CACHE STRING "") + set(CHECK_LLVM_DIR "${CROSS_ROOTFS}/usr/lib/llvm-3.8/include") + if(EXISTS "${CHECK_LLVM_DIR}" AND IS_DIRECTORY "${CHECK_LLVM_DIR}") + set(WITH_LLDB_INCLUDES "${CHECK_LLVM_DIR}") + else() + set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include") + endif() + else() # arm/armel case + set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}" CACHE STRING "") + set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include" CACHE STRING "") + endif() + endif() +endif() + +# Set C++ standard library options if specified +set(CLR_CMAKE_CXX_STANDARD_LIBRARY "" CACHE STRING "Standard library flavor to link against. Only supported with the Clang compiler.") +if (CLR_CMAKE_CXX_STANDARD_LIBRARY) + add_compile_options($<$:--stdlib=${CLR_CMAKE_CXX_STANDARD_LIBRARY}>) + add_link_options($<$:--stdlib=${CLR_CMAKE_CXX_STANDARD_LIBRARY}>) +endif() + +option(CLR_CMAKE_CXX_STANDARD_LIBRARY_STATIC "Statically link against the C++ standard library" OFF) +if(CLR_CMAKE_CXX_STANDARD_LIBRARY_STATIC) + add_link_options($<$:-static-libstdc++>) +endif() + +set(CLR_CMAKE_CXX_ABI_LIBRARY "" CACHE STRING "C++ ABI implementation library to link against. Only supported with the Clang compiler.") +if (CLR_CMAKE_CXX_ABI_LIBRARY) + # The user may specify the ABI library with the 'lib' prefix, like 'libstdc++'. Strip the prefix here so the linker finds the right library. + string(REGEX REPLACE "^lib(.+)" "\\1" CLR_CMAKE_CXX_ABI_LIBRARY ${CLR_CMAKE_CXX_ABI_LIBRARY}) + # We need to specify this as a linker-backend option as Clang will filter this option out when linking to libc++. + add_link_options("LINKER:-l${CLR_CMAKE_CXX_ABI_LIBRARY}") +endif() + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/x64/tizen/tizen.patch b/eng/common/cross/x64/tizen/tizen.patch new file mode 100644 index 000000000000..56fbc881095b --- /dev/null +++ b/eng/common/cross/x64/tizen/tizen.patch @@ -0,0 +1,9 @@ +diff -u -r a/usr/lib64/libc.so b/usr/lib64/libc.so +--- a/usr/lib64/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib64/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf64-x86-64) +-GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-x86-64.so.2 ) ) diff --git a/eng/common/cross/x86/tizen/tizen.patch b/eng/common/cross/x86/tizen/tizen.patch new file mode 100644 index 000000000000..f4fe8838ad66 --- /dev/null +++ b/eng/common/cross/x86/tizen/tizen.patch @@ -0,0 +1,9 @@ +diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so +--- a/usr/lib/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf32-i386) +-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.2 ) ) diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1 new file mode 100644 index 000000000000..e33743105635 --- /dev/null +++ b/eng/common/darc-init.ps1 @@ -0,0 +1,47 @@ +param ( + $darcVersion = $null, + $versionEndpoint = 'https://maestro.dot.net/api/assets/darc-version?api-version=2020-02-20', + $verbosity = 'minimal', + $toolpath = $null +) + +. $PSScriptRoot\tools.ps1 + +function InstallDarcCli ($darcVersion, $toolpath) { + $darcCliPackageName = 'microsoft.dotnet.darc' + + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + $toolList = & "$dotnet" tool list -g + + if ($toolList -like "*$darcCliPackageName*") { + & "$dotnet" tool uninstall $darcCliPackageName -g + } + + # If the user didn't explicitly specify the darc version, + # query the Maestro API for the correct version of darc to install. + if (-not $darcVersion) { + $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content + } + + $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + + Write-Host "Installing Darc CLI version $darcVersion..." + Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.' + if (-not $toolpath) { + Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g" + & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g + }else { + Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity --tool-path '$toolpath'" + & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath" + } +} + +try { + InstallDarcCli $darcVersion $toolpath +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Darc' -Message $_ + ExitWithExitCode 1 +} \ No newline at end of file diff --git a/eng/common/darc-init.sh b/eng/common/darc-init.sh new file mode 100644 index 000000000000..36dbd45e1ce8 --- /dev/null +++ b/eng/common/darc-init.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +darcVersion='' +versionEndpoint='https://maestro.dot.net/api/assets/darc-version?api-version=2020-02-20' +verbosity='minimal' + +while [[ $# > 0 ]]; do + opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + case "$opt" in + --darcversion) + darcVersion=$2 + shift + ;; + --versionendpoint) + versionEndpoint=$2 + shift + ;; + --verbosity) + verbosity=$2 + shift + ;; + --toolpath) + toolpath=$2 + shift + ;; + *) + echo "Invalid argument: $1" + usage + exit 1 + ;; + esac + + shift +done + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. "$scriptroot/tools.sh" + +if [ -z "$darcVersion" ]; then + darcVersion=$(curl -X GET "$versionEndpoint" -H "accept: text/plain") +fi + +function InstallDarcCli { + local darc_cli_package_name="microsoft.dotnet.darc" + + InitializeDotNetCli true + local dotnet_root=$_InitializeDotNetCli + + if [ -z "$toolpath" ]; then + local tool_list=$($dotnet_root/dotnet tool list -g) + if [[ $tool_list = *$darc_cli_package_name* ]]; then + echo $($dotnet_root/dotnet tool uninstall $darc_cli_package_name -g) + fi + else + local tool_list=$($dotnet_root/dotnet tool list --tool-path "$toolpath") + if [[ $tool_list = *$darc_cli_package_name* ]]; then + echo $($dotnet_root/dotnet tool uninstall $darc_cli_package_name --tool-path "$toolpath") + fi + fi + + local arcadeServicesSource="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" + + echo "Installing Darc CLI version $darcVersion..." + echo "You may need to restart your command shell if this is the first dotnet tool you have installed." + if [ -z "$toolpath" ]; then + echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g) + else + echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath") + fi +} + +InstallDarcCli diff --git a/eng/common/dotnet-install.cmd b/eng/common/dotnet-install.cmd new file mode 100644 index 000000000000..b1c2642e76f7 --- /dev/null +++ b/eng/common/dotnet-install.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0dotnet-install.ps1""" %*" \ No newline at end of file diff --git a/eng/common/dotnet-install.ps1 b/eng/common/dotnet-install.ps1 new file mode 100644 index 000000000000..811f0f717f73 --- /dev/null +++ b/eng/common/dotnet-install.ps1 @@ -0,0 +1,28 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string] $verbosity = 'minimal', + [string] $architecture = '', + [string] $version = 'Latest', + [string] $runtime = 'dotnet', + [string] $RuntimeSourceFeed = '', + [string] $RuntimeSourceFeedKey = '' +) + +. $PSScriptRoot\tools.ps1 + +$dotnetRoot = Join-Path $RepoRoot '.dotnet' + +$installdir = $dotnetRoot +try { + if ($architecture -and $architecture.Trim() -eq 'x86') { + $installdir = Join-Path $installdir 'x86' + } + InstallDotNet $installdir $version $architecture $runtime $true -RuntimeSourceFeed $RuntimeSourceFeed -RuntimeSourceFeedKey $RuntimeSourceFeedKey +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_ + ExitWithExitCode 1 +} + +ExitWithExitCode 0 diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh new file mode 100644 index 000000000000..7b9d97e3bd4d --- /dev/null +++ b/eng/common/dotnet-install.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. "$scriptroot/tools.sh" + +version='Latest' +architecture='' +runtime='dotnet' +runtimeSourceFeed='' +runtimeSourceFeedKey='' +while [[ $# > 0 ]]; do + opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + case "$opt" in + -version|-v) + shift + version="$1" + ;; + -architecture|-a) + shift + architecture="$1" + ;; + -runtime|-r) + shift + runtime="$1" + ;; + -runtimesourcefeed) + shift + runtimeSourceFeed="$1" + ;; + -runtimesourcefeedkey) + shift + runtimeSourceFeedKey="$1" + ;; + *) + Write-PipelineTelemetryError -Category 'Build' -Message "Invalid argument: $1" + exit 1 + ;; + esac + shift +done + +# Use uname to determine what the CPU is, see https://en.wikipedia.org/wiki/Uname#Examples +cpuname=$(uname -m) +case $cpuname in + arm64|aarch64) + buildarch=arm64 + if [ "$(getconf LONG_BIT)" -lt 64 ]; then + # This is 32-bit OS running on 64-bit CPU (for example Raspberry Pi OS) + buildarch=arm + fi + ;; + loongarch64) + buildarch=loongarch64 + ;; + amd64|x86_64) + buildarch=x64 + ;; + armv*l) + buildarch=arm + ;; + i[3-6]86) + buildarch=x86 + ;; + riscv64) + buildarch=riscv64 + ;; + *) + echo "Unknown CPU $cpuname detected, treating it as x64" + buildarch=x64 + ;; +esac + +dotnetRoot="${repo_root}.dotnet" +if [[ $architecture != "" ]] && [[ $architecture != $buildarch ]]; then + dotnetRoot="$dotnetRoot/$architecture" +fi + +InstallDotNet "$dotnetRoot" $version "$architecture" $runtime true $runtimeSourceFeed $runtimeSourceFeedKey || { + local exit_code=$? + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "dotnet-install.sh failed (exit code '$exit_code')." >&2 + ExitWithExitCode $exit_code +} + +ExitWithExitCode 0 diff --git a/eng/common/enable-cross-org-publishing.ps1 b/eng/common/enable-cross-org-publishing.ps1 new file mode 100644 index 000000000000..da09da4f1fc4 --- /dev/null +++ b/eng/common/enable-cross-org-publishing.ps1 @@ -0,0 +1,13 @@ +param( + [string] $token +) + + +. $PSScriptRoot\pipeline-logging-functions.ps1 + +# Write-PipelineSetVariable will no-op if a variable named $ci is not defined +# Since this script is only ever called in AzDO builds, just universally set it +$ci = $true + +Write-PipelineSetVariable -Name 'VSS_NUGET_ACCESSTOKEN' -Value $token -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'VSS_NUGET_URI_PREFIXES' -Value 'https://dnceng.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/dnceng/;https://devdiv.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/devdiv/' -IsMultiJobVariable $false diff --git a/eng/common/generate-locproject.ps1 b/eng/common/generate-locproject.ps1 new file mode 100644 index 000000000000..524aaa57f2b7 --- /dev/null +++ b/eng/common/generate-locproject.ps1 @@ -0,0 +1,189 @@ +Param( + [Parameter(Mandatory=$true)][string] $SourcesDirectory, # Directory where source files live; if using a Localize directory it should live in here + [string] $LanguageSet = 'VS_Main_Languages', # Language set to be used in the LocProject.json + [switch] $UseCheckedInLocProjectJson, # When set, generates a LocProject.json and compares it to one that already exists in the repo; otherwise just generates one + [switch] $CreateNeutralXlfs # Creates neutral xlf files. Only set to false when running locally +) + +# Generates LocProject.json files for the OneLocBuild task. OneLocBuildTask is described here: +# https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task + +Set-StrictMode -Version 2.0 +$ErrorActionPreference = "Stop" +. $PSScriptRoot\pipeline-logging-functions.ps1 + +$exclusionsFilePath = "$SourcesDirectory\eng\Localize\LocExclusions.json" +$exclusions = @{ Exclusions = @() } +if (Test-Path -Path $exclusionsFilePath) +{ + $exclusions = Get-Content "$exclusionsFilePath" | ConvertFrom-Json +} + +Push-Location "$SourcesDirectory" # push location for Resolve-Path -Relative to work + +# Template files +$jsonFiles = @() +$jsonTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\.template\.config\\localize\\.+\.en\.json" } # .NET templating pattern +$jsonTemplateFiles | ForEach-Object { + $null = $_.Name -Match "(.+)\.[\w-]+\.json" # matches '[filename].[langcode].json + + $destinationFile = "$($_.Directory.FullName)\$($Matches.1).json" + $jsonFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru +} + +$jsonWinformsTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern + +$wxlFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\\.+\.wxl" -And -Not( $_.Directory.Name -Match "\d{4}" ) } # localized files live in four digit lang ID directories; this excludes them +if (-not $wxlFiles) { + $wxlEnFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\\1033\\.+\.wxl" } # pick up en files (1033 = en) specifically so we can copy them to use as the neutral xlf files + if ($wxlEnFiles) { + $wxlFiles = @() + $wxlEnFiles | ForEach-Object { + $destinationFile = "$($_.Directory.Parent.FullName)\$($_.Name)" + $wxlFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru + } + } +} + +$macosHtmlEnFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\.lproj\\.+\.html$" } # add installer HTML files +$macosHtmlFiles = @() +if ($macosHtmlEnFiles) { + $macosHtmlEnFiles | ForEach-Object { + $destinationFile = "$($_.Directory.Parent.FullName)\$($_.Name)" + $macosHtmlFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru + } +} + +$xlfFiles = @() + +$allXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.xlf" +$langXlfFiles = @() +if ($allXlfFiles) { + $null = $allXlfFiles[0].FullName -Match "\.([\w-]+)\.xlf" # matches '[langcode].xlf' + $firstLangCode = $Matches.1 + $langXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.$firstLangCode.xlf" +} +$langXlfFiles | ForEach-Object { + $null = $_.Name -Match "(.+)\.[\w-]+\.xlf" # matches '[filename].[langcode].xlf + + $destinationFile = "$($_.Directory.FullName)\$($Matches.1).xlf" + $xlfFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru +} + +$locFiles = $jsonFiles + $jsonWinformsTemplateFiles + $xlfFiles + +$locJson = @{ + Projects = @( + @{ + LanguageSet = $LanguageSet + LocItems = @( + $locFiles | ForEach-Object { + $outputPath = "$(($_.DirectoryName | Resolve-Path -Relative) + "\")" + $continue = $true + foreach ($exclusion in $exclusions.Exclusions) { + if ($_.FullName.Contains($exclusion)) + { + $continue = $false + } + } + $sourceFile = ($_.FullName | Resolve-Path -Relative) + if (!$CreateNeutralXlfs -and $_.Extension -eq '.xlf') { + Remove-Item -Path $sourceFile + } + if ($continue) + { + if ($_.Directory.Name -eq 'en' -and $_.Extension -eq '.json') { + return @{ + SourceFile = $sourceFile + CopyOption = "LangIDOnPath" + OutputPath = "$($_.Directory.Parent.FullName | Resolve-Path -Relative)\" + } + } else { + return @{ + SourceFile = $sourceFile + CopyOption = "LangIDOnName" + OutputPath = $outputPath + } + } + } + } + ) + }, + @{ + LanguageSet = $LanguageSet + CloneLanguageSet = "WiX_CloneLanguages" + LssFiles = @( "wxl_loc.lss" ) + LocItems = @( + $wxlFiles | ForEach-Object { + $outputPath = "$($_.Directory.FullName | Resolve-Path -Relative)\" + $continue = $true + foreach ($exclusion in $exclusions.Exclusions) { + if ($_.FullName.Contains($exclusion)) { + $continue = $false + } + } + $sourceFile = ($_.FullName | Resolve-Path -Relative) + if ($continue) + { + return @{ + SourceFile = $sourceFile + CopyOption = "LangIDOnPath" + OutputPath = $outputPath + } + } + } + ) + }, + @{ + LanguageSet = $LanguageSet + CloneLanguageSet = "VS_macOS_CloneLanguages" + LssFiles = @( ".\eng\common\loc\P22DotNetHtmlLocalization.lss" ) + LocItems = @( + $macosHtmlFiles | ForEach-Object { + $outputPath = "$($_.Directory.FullName | Resolve-Path -Relative)\" + $continue = $true + foreach ($exclusion in $exclusions.Exclusions) { + if ($_.FullName.Contains($exclusion)) { + $continue = $false + } + } + $sourceFile = ($_.FullName | Resolve-Path -Relative) + $lciFile = $sourceFile + ".lci" + if ($continue) { + $result = @{ + SourceFile = $sourceFile + CopyOption = "LangIDOnPath" + OutputPath = $outputPath + } + if (Test-Path $lciFile -PathType Leaf) { + $result["LciFile"] = $lciFile + } + return $result + } + } + ) + } + ) +} + +$json = ConvertTo-Json $locJson -Depth 5 +Write-Host "LocProject.json generated:`n`n$json`n`n" +Pop-Location + +if (!$UseCheckedInLocProjectJson) { + New-Item "$SourcesDirectory\eng\Localize\LocProject.json" -Force # Need this to make sure the Localize directory is created + Set-Content "$SourcesDirectory\eng\Localize\LocProject.json" $json +} +else { + New-Item "$SourcesDirectory\eng\Localize\LocProject-generated.json" -Force # Need this to make sure the Localize directory is created + Set-Content "$SourcesDirectory\eng\Localize\LocProject-generated.json" $json + + if ((Get-FileHash "$SourcesDirectory\eng\Localize\LocProject-generated.json").Hash -ne (Get-FileHash "$SourcesDirectory\eng\Localize\LocProject.json").Hash) { + Write-PipelineTelemetryError -Category "OneLocBuild" -Message "Existing LocProject.json differs from generated LocProject.json. Download LocProject-generated.json and compare them." + + exit 1 + } + else { + Write-Host "Generated LocProject.json and current LocProject.json are identical." + } +} diff --git a/eng/common/generate-sbom-prep.ps1 b/eng/common/generate-sbom-prep.ps1 new file mode 100644 index 000000000000..3e5c1c74a1c5 --- /dev/null +++ b/eng/common/generate-sbom-prep.ps1 @@ -0,0 +1,21 @@ +Param( + [Parameter(Mandatory=$true)][string] $ManifestDirPath # Manifest directory where sbom will be placed +) + +. $PSScriptRoot\pipeline-logging-functions.ps1 + +Write-Host "Creating dir $ManifestDirPath" +# create directory for sbom manifest to be placed +if (!(Test-Path -path $ManifestDirPath)) +{ + New-Item -ItemType Directory -path $ManifestDirPath + Write-Host "Successfully created directory $ManifestDirPath" +} +else{ + Write-PipelineTelemetryError -category 'Build' "Unable to create sbom folder." +} + +Write-Host "Updating artifact name" +$artifact_name = "${env:SYSTEM_STAGENAME}_${env:AGENT_JOBNAME}_SBOM" -replace '["/:<>\\|?@*"() ]', '_' +Write-Host "Artifact name $artifact_name" +Write-Host "##vso[task.setvariable variable=ARTIFACT_NAME]$artifact_name" diff --git a/eng/common/generate-sbom-prep.sh b/eng/common/generate-sbom-prep.sh new file mode 100644 index 000000000000..d5c76dc827b4 --- /dev/null +++ b/eng/common/generate-sbom-prep.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" +. $scriptroot/pipeline-logging-functions.sh + +manifest_dir=$1 + +if [ ! -d "$manifest_dir" ] ; then + mkdir -p "$manifest_dir" + echo "Sbom directory created." $manifest_dir +else + Write-PipelineTelemetryError -category 'Build' "Unable to create sbom folder." +fi + +artifact_name=$SYSTEM_STAGENAME"_"$AGENT_JOBNAME"_SBOM" +echo "Artifact name before : "$artifact_name +# replace all special characters with _, some builds use special characters like : in Agent.Jobname, that is not a permissible name while uploading artifacts. +safe_artifact_name="${artifact_name//["/:<>\\|?@*$" ]/_}" +echo "Artifact name after : "$safe_artifact_name +export ARTIFACT_NAME=$safe_artifact_name +echo "##vso[task.setvariable variable=ARTIFACT_NAME]$safe_artifact_name" + +exit 0 diff --git a/eng/common/helixpublish.proj b/eng/common/helixpublish.proj new file mode 100644 index 000000000000..c1323bf41210 --- /dev/null +++ b/eng/common/helixpublish.proj @@ -0,0 +1,27 @@ + + + + + msbuild + + + + + %(Identity) + + + + + + $(WorkItemDirectory) + $(WorkItemCommand) + $(WorkItemTimeout) + + + + + + + + + diff --git a/eng/common/init-tools-native.cmd b/eng/common/init-tools-native.cmd new file mode 100644 index 000000000000..438cd548c452 --- /dev/null +++ b/eng/common/init-tools-native.cmd @@ -0,0 +1,3 @@ +@echo off +powershell -NoProfile -NoLogo -ExecutionPolicy ByPass -command "& """%~dp0init-tools-native.ps1""" %*" +exit /b %ErrorLevel% \ No newline at end of file diff --git a/eng/common/init-tools-native.ps1 b/eng/common/init-tools-native.ps1 new file mode 100644 index 000000000000..27ccdb9ecc95 --- /dev/null +++ b/eng/common/init-tools-native.ps1 @@ -0,0 +1,203 @@ +<# +.SYNOPSIS +Entry point script for installing native tools + +.DESCRIPTION +Reads $RepoRoot\global.json file to determine native assets to install +and executes installers for those tools + +.PARAMETER BaseUri +Base file directory or Url from which to acquire tool archives + +.PARAMETER InstallDirectory +Directory to install native toolset. This is a command-line override for the default +Install directory precedence order: +- InstallDirectory command-line override +- NETCOREENG_INSTALL_DIRECTORY environment variable +- (default) %USERPROFILE%/.netcoreeng/native + +.PARAMETER Clean +Switch specifying to not install anything, but cleanup native asset folders + +.PARAMETER Force +Clean and then install tools + +.PARAMETER DownloadRetries +Total number of retry attempts + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds + +.PARAMETER GlobalJsonFile +File path to global.json file + +.PARAMETER PathPromotion +Optional switch to enable either promote native tools specified in the global.json to the path (in Azure Pipelines) +or break the build if a native tool is not found on the path (on a local dev machine) + +.NOTES +#> +[CmdletBinding(PositionalBinding=$false)] +Param ( + [string] $BaseUri = 'https://netcorenativeassets.blob.core.windows.net/resource-packages/external', + [string] $InstallDirectory, + [switch] $Clean = $False, + [switch] $Force = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30, + [string] $GlobalJsonFile, + [switch] $PathPromotion +) + +if (!$GlobalJsonFile) { + $GlobalJsonFile = Join-Path (Get-Item $PSScriptRoot).Parent.Parent.FullName 'global.json' +} + +Set-StrictMode -version 2.0 +$ErrorActionPreference='Stop' + +. $PSScriptRoot\pipeline-logging-functions.ps1 +Import-Module -Name (Join-Path $PSScriptRoot 'native\CommonLibrary.psm1') + +try { + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq 'Continue' + + $EngCommonBaseDir = Join-Path $PSScriptRoot 'native\' + $NativeBaseDir = $InstallDirectory + if (!$NativeBaseDir) { + $NativeBaseDir = CommonLibrary\Get-NativeInstallDirectory + } + $Env:CommonLibrary_NativeInstallDir = $NativeBaseDir + $InstallBin = Join-Path $NativeBaseDir 'bin' + $InstallerPath = Join-Path $EngCommonBaseDir 'install-tool.ps1' + + # Process tools list + Write-Host "Processing $GlobalJsonFile" + If (-Not (Test-Path $GlobalJsonFile)) { + Write-Host "Unable to find '$GlobalJsonFile'" + exit 0 + } + $NativeTools = Get-Content($GlobalJsonFile) -Raw | + ConvertFrom-Json | + Select-Object -Expand 'native-tools' -ErrorAction SilentlyContinue + if ($NativeTools) { + if ($PathPromotion -eq $True) { + $ArcadeToolsDirectory = "$env:SYSTEMDRIVE\arcade-tools" + if (Test-Path $ArcadeToolsDirectory) { # if this directory exists, we should use native tools on machine + $NativeTools.PSObject.Properties | ForEach-Object { + $ToolName = $_.Name + $ToolVersion = $_.Value + $InstalledTools = @{} + + if ((Get-Command "$ToolName" -ErrorAction SilentlyContinue) -eq $null) { + if ($ToolVersion -eq "latest") { + $ToolVersion = "" + } + $ToolDirectories = (Get-ChildItem -Path "$ArcadeToolsDirectory" -Filter "$ToolName-$ToolVersion*" | Sort-Object -Descending) + if ($ToolDirectories -eq $null) { + Write-Error "Unable to find directory for $ToolName $ToolVersion; please make sure the tool is installed on this image." + exit 1 + } + $ToolDirectory = $ToolDirectories[0] + $BinPathFile = "$($ToolDirectory.FullName)\binpath.txt" + if (-not (Test-Path -Path "$BinPathFile")) { + Write-Error "Unable to find binpath.txt in '$($ToolDirectory.FullName)' ($ToolName $ToolVersion); artifact is either installed incorrectly or is not a bootstrappable tool." + exit 1 + } + $BinPath = Get-Content "$BinPathFile" + $ToolPath = Convert-Path -Path $BinPath + Write-Host "Adding $ToolName to the path ($ToolPath)..." + Write-Host "##vso[task.prependpath]$ToolPath" + $env:PATH = "$ToolPath;$env:PATH" + $InstalledTools += @{ $ToolName = $ToolDirectory.FullName } + } + } + return $InstalledTools + } else { + $NativeTools.PSObject.Properties | ForEach-Object { + $ToolName = $_.Name + $ToolVersion = $_.Value + + if ((Get-Command "$ToolName" -ErrorAction SilentlyContinue) -eq $null) { + Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message "$ToolName not found on path. Please install $ToolName $ToolVersion before proceeding." + Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message "If this is running on a build machine, the arcade-tools directory was not found, which means there's an error with the image." + } + } + exit 0 + } + } else { + $NativeTools.PSObject.Properties | ForEach-Object { + $ToolName = $_.Name + $ToolVersion = $_.Value + $LocalInstallerArguments = @{ ToolName = "$ToolName" } + $LocalInstallerArguments += @{ InstallPath = "$InstallBin" } + $LocalInstallerArguments += @{ BaseUri = "$BaseUri" } + $LocalInstallerArguments += @{ CommonLibraryDirectory = "$EngCommonBaseDir" } + $LocalInstallerArguments += @{ Version = "$ToolVersion" } + + if ($Verbose) { + $LocalInstallerArguments += @{ Verbose = $True } + } + if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') { + if($Force) { + $LocalInstallerArguments += @{ Force = $True } + } + } + if ($Clean) { + $LocalInstallerArguments += @{ Clean = $True } + } + + Write-Verbose "Installing $ToolName version $ToolVersion" + Write-Verbose "Executing '$InstallerPath $($LocalInstallerArguments.Keys.ForEach({"-$_ '$($LocalInstallerArguments.$_)'"}) -join ' ')'" + & $InstallerPath @LocalInstallerArguments + if ($LASTEXITCODE -Ne "0") { + $errMsg = "$ToolName installation failed" + if ((Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue') -and $DoNotAbortNativeToolsInstallationOnFailure) { + $showNativeToolsWarning = $true + if ((Get-Variable 'DoNotDisplayNativeToolsInstallationWarnings' -ErrorAction 'SilentlyContinue') -and $DoNotDisplayNativeToolsInstallationWarnings) { + $showNativeToolsWarning = $false + } + if ($showNativeToolsWarning) { + Write-Warning $errMsg + } + $toolInstallationFailure = $true + } else { + # We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482 + Write-Host $errMsg + exit 1 + } + } + } + + if ((Get-Variable 'toolInstallationFailure' -ErrorAction 'SilentlyContinue') -and $toolInstallationFailure) { + # We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482 + Write-Host 'Native tools bootstrap failed' + exit 1 + } + } + } + else { + Write-Host 'No native tools defined in global.json' + exit 0 + } + + if ($Clean) { + exit 0 + } + if (Test-Path $InstallBin) { + Write-Host 'Native tools are available from ' (Convert-Path -Path $InstallBin) + Write-Host "##vso[task.prependpath]$(Convert-Path -Path $InstallBin)" + return $InstallBin + } + elseif (-not ($PathPromotion)) { + Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message 'Native tools install directory does not exist, installation failed' + exit 1 + } + exit 0 +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/init-tools-native.sh b/eng/common/init-tools-native.sh new file mode 100644 index 000000000000..3e6a8d6acf2f --- /dev/null +++ b/eng/common/init-tools-native.sh @@ -0,0 +1,238 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +base_uri='https://netcorenativeassets.blob.core.windows.net/resource-packages/external' +install_directory='' +clean=false +force=false +download_retries=5 +retry_wait_time_seconds=30 +global_json_file="$(dirname "$(dirname "${scriptroot}")")/global.json" +declare -a native_assets + +. $scriptroot/pipeline-logging-functions.sh +. $scriptroot/native/common-library.sh + +while (($# > 0)); do + lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")" + case $lowerI in + --baseuri) + base_uri=$2 + shift 2 + ;; + --installdirectory) + install_directory=$2 + shift 2 + ;; + --clean) + clean=true + shift 1 + ;; + --force) + force=true + shift 1 + ;; + --donotabortonfailure) + donotabortonfailure=true + shift 1 + ;; + --donotdisplaywarnings) + donotdisplaywarnings=true + shift 1 + ;; + --downloadretries) + download_retries=$2 + shift 2 + ;; + --retrywaittimeseconds) + retry_wait_time_seconds=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --installdirectory Directory to install native toolset." + echo " This is a command-line override for the default" + echo " Install directory precedence order:" + echo " - InstallDirectory command-line override" + echo " - NETCOREENG_INSTALL_DIRECTORY environment variable" + echo " - (default) %USERPROFILE%/.netcoreeng/native" + echo "" + echo " --clean Switch specifying not to install anything, but cleanup native asset folders" + echo " --donotabortonfailure Switch specifiying whether to abort native tools installation on failure" + echo " --donotdisplaywarnings Switch specifiying whether to display warnings during native tools installation on failure" + echo " --force Clean and then install tools" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --baseuri Base URI for where to download native tools from" + echo " --downloadretries Number of times a download should be attempted" + echo " --retrywaittimeseconds Wait time between download attempts" + echo "" + exit 0 + ;; + esac +done + +function ReadGlobalJsonNativeTools { + # happy path: we have a proper JSON parsing tool `jq(1)` in PATH! + if command -v jq &> /dev/null; then + + # jq: read each key/value pair under "native-tools" entry and emit: + # KEY="" VALUE="" + # followed by a null byte. + # + # bash: read line with null byte delimeter and push to array (for later `eval`uation). + + while IFS= read -rd '' line; do + native_assets+=("$line") + done < <(jq -r '. | + select(has("native-tools")) | + ."native-tools" | + keys[] as $k | + @sh "KEY=\($k) VALUE=\(.[$k])\u0000"' "$global_json_file") + + return + fi + + # Warning: falling back to manually parsing JSON, which is not recommended. + + # Following routine matches the output and escaping logic of jq(1)'s @sh formatter used above. + # It has been tested with several weird strings with escaped characters in entries (key and value) + # and results were compared with the output of jq(1) in binary representation using xxd(1); + # just before the assignment to 'native_assets' array (above and below). + + # try to capture the section under "native-tools". + if [[ ! "$(cat "$global_json_file")" =~ \"native-tools\"[[:space:]\:\{]*([^\}]+) ]]; then + return + fi + + section="${BASH_REMATCH[1]}" + + parseStarted=0 + possibleEnd=0 + escaping=0 + escaped=0 + isKey=1 + + for (( i=0; i<${#section}; i++ )); do + char="${section:$i:1}" + if ! ((parseStarted)) && [[ "$char" =~ [[:space:],:] ]]; then continue; fi + + if ! ((escaping)) && [[ "$char" == "\\" ]]; then + escaping=1 + elif ((escaping)) && ! ((escaped)); then + escaped=1 + fi + + if ! ((parseStarted)) && [[ "$char" == "\"" ]]; then + parseStarted=1 + possibleEnd=0 + elif [[ "$char" == "'" ]]; then + token="$token'\\\''" + possibleEnd=0 + elif ((escaping)) || [[ "$char" != "\"" ]]; then + token="$token$char" + possibleEnd=1 + fi + + if ((possibleEnd)) && ! ((escaping)) && [[ "$char" == "\"" ]]; then + # Use printf to unescape token to match jq(1)'s @sh formatting rules. + # do not use 'token="$(printf "$token")"' syntax, as $() eats the trailing linefeed. + printf -v token "'$token'" + + if ((isKey)); then + KEY="$token" + isKey=0 + else + line="KEY=$KEY VALUE=$token" + native_assets+=("$line") + isKey=1 + fi + + # reset for next token + parseStarted=0 + token= + elif ((escaping)) && ((escaped)); then + escaping=0 + escaped=0 + fi + done +} + +native_base_dir=$install_directory +if [[ -z $install_directory ]]; then + native_base_dir=$(GetNativeInstallDirectory) +fi + +install_bin="${native_base_dir}/bin" +installed_any=false + +ReadGlobalJsonNativeTools + +if [[ ${#native_assets[@]} -eq 0 ]]; then + echo "No native tools defined in global.json" + exit 0; +else + native_installer_dir="$scriptroot/native" + for index in "${!native_assets[@]}"; do + eval "${native_assets["$index"]}" + + installer_path="$native_installer_dir/install-$KEY.sh" + installer_command="$installer_path" + installer_command+=" --baseuri $base_uri" + installer_command+=" --installpath $install_bin" + installer_command+=" --version $VALUE" + echo $installer_command + + if [[ $force = true ]]; then + installer_command+=" --force" + fi + + if [[ $clean = true ]]; then + installer_command+=" --clean" + fi + + if [[ -a $installer_path ]]; then + $installer_command + if [[ $? != 0 ]]; then + if [[ $donotabortonfailure = true ]]; then + if [[ $donotdisplaywarnings != true ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed" + fi + else + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed" + exit 1 + fi + else + $installed_any = true + fi + else + if [[ $donotabortonfailure == true ]]; then + if [[ $donotdisplaywarnings != true ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script" + fi + else + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script" + exit 1 + fi + fi + done +fi + +if [[ $clean = true ]]; then + exit 0 +fi + +if [[ -d $install_bin ]]; then + echo "Native tools are available from $install_bin" + echo "##vso[task.prependpath]$install_bin" +else + if [[ $installed_any = true ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Native tools install directory does not exist, installation failed" + exit 1 + fi +fi + +exit 0 diff --git a/eng/common/internal-feed-operations.ps1 b/eng/common/internal-feed-operations.ps1 new file mode 100644 index 000000000000..92b77347d990 --- /dev/null +++ b/eng/common/internal-feed-operations.ps1 @@ -0,0 +1,132 @@ +param( + [Parameter(Mandatory=$true)][string] $Operation, + [string] $AuthToken, + [string] $CommitSha, + [string] $RepoName, + [switch] $IsFeedPrivate +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 +. $PSScriptRoot\tools.ps1 + +# Sets VSS_NUGET_EXTERNAL_FEED_ENDPOINTS based on the "darc-int-*" feeds defined in NuGet.config. This is needed +# in build agents by CredProvider to authenticate the restore requests to internal feeds as specified in +# https://github.com/microsoft/artifacts-credprovider/blob/0f53327cd12fd893d8627d7b08a2171bf5852a41/README.md#environment-variables. This should ONLY be called from identified +# internal builds +function SetupCredProvider { + param( + [string] $AuthToken + ) + + # Install the Cred Provider NuGet plugin + Write-Host 'Setting up Cred Provider NuGet plugin in the agent...' + Write-Host "Getting 'installcredprovider.ps1' from 'https://github.com/microsoft/artifacts-credprovider'..." + + $url = 'https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1' + + Write-Host "Writing the contents of 'installcredprovider.ps1' locally..." + Invoke-WebRequest $url -OutFile installcredprovider.ps1 + + Write-Host 'Installing plugin...' + .\installcredprovider.ps1 -Force + + Write-Host "Deleting local copy of 'installcredprovider.ps1'..." + Remove-Item .\installcredprovider.ps1 + + if (-Not("$env:USERPROFILE\.nuget\plugins\netcore")) { + Write-PipelineTelemetryError -Category 'Arcade' -Message 'CredProvider plugin was not installed correctly!' + ExitWithExitCode 1 + } + else { + Write-Host 'CredProvider plugin was installed correctly!' + } + + # Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable + # feeds successfully + + $nugetConfigPath = Join-Path $RepoRoot "NuGet.config" + + if (-Not (Test-Path -Path $nugetConfigPath)) { + Write-PipelineTelemetryError -Category 'Build' -Message 'NuGet.config file not found in repo root!' + ExitWithExitCode 1 + } + + $endpoints = New-Object System.Collections.ArrayList + $nugetConfigPackageSources = Select-Xml -Path $nugetConfigPath -XPath "//packageSources/add[contains(@key, 'darc-int-')]/@value" | foreach{$_.Node.Value} + + if (($nugetConfigPackageSources | Measure-Object).Count -gt 0 ) { + foreach ($stableRestoreResource in $nugetConfigPackageSources) { + $trimmedResource = ([string]$stableRestoreResource).Trim() + [void]$endpoints.Add(@{endpoint="$trimmedResource"; password="$AuthToken"}) + } + } + + if (($endpoints | Measure-Object).Count -gt 0) { + $endpointCredentials = @{endpointCredentials=$endpoints} | ConvertTo-Json -Compress + + # Create the environment variables the AzDo way + Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $endpointCredentials -Properties @{ + 'variable' = 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' + 'issecret' = 'false' + } + + # We don't want sessions cached since we will be updating the endpoints quite frequently + Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data 'False' -Properties @{ + 'variable' = 'NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED' + 'issecret' = 'false' + } + } + else + { + Write-Host 'No internal endpoints found in NuGet.config' + } +} + +#Workaround for https://github.com/microsoft/msbuild/issues/4430 +function InstallDotNetSdkAndRestoreArcade { + $dotnetTempDir = Join-Path $RepoRoot "dotnet" + $dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*) + $dotnet = "$dotnetTempDir\dotnet.exe" + $restoreProjPath = "$PSScriptRoot\restore.proj" + + Write-Host "Installing dotnet SDK version $dotnetSdkVersion to restore Arcade SDK..." + InstallDotNetSdk "$dotnetTempDir" "$dotnetSdkVersion" + + '' | Out-File "$restoreProjPath" + + & $dotnet restore $restoreProjPath + + Write-Host 'Arcade SDK restored!' + + if (Test-Path -Path $restoreProjPath) { + Remove-Item $restoreProjPath + } + + if (Test-Path -Path $dotnetTempDir) { + Remove-Item $dotnetTempDir -Recurse + } +} + +try { + Push-Location $PSScriptRoot + + if ($Operation -like 'setup') { + SetupCredProvider $AuthToken + } + elseif ($Operation -like 'install-restore') { + InstallDotNetSdkAndRestoreArcade + } + else { + Write-PipelineTelemetryError -Category 'Arcade' -Message "Unknown operation '$Operation'!" + ExitWithExitCode 1 + } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Arcade' -Message $_ + ExitWithExitCode 1 +} +finally { + Pop-Location +} diff --git a/eng/common/internal-feed-operations.sh b/eng/common/internal-feed-operations.sh new file mode 100644 index 000000000000..9378223ba095 --- /dev/null +++ b/eng/common/internal-feed-operations.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash + +set -e + +# Sets VSS_NUGET_EXTERNAL_FEED_ENDPOINTS based on the "darc-int-*" feeds defined in NuGet.config. This is needed +# in build agents by CredProvider to authenticate the restore requests to internal feeds as specified in +# https://github.com/microsoft/artifacts-credprovider/blob/0f53327cd12fd893d8627d7b08a2171bf5852a41/README.md#environment-variables. +# This should ONLY be called from identified internal builds +function SetupCredProvider { + local authToken=$1 + + # Install the Cred Provider NuGet plugin + echo "Setting up Cred Provider NuGet plugin in the agent..."... + echo "Getting 'installcredprovider.ps1' from 'https://github.com/microsoft/artifacts-credprovider'..." + + local url="https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh" + + echo "Writing the contents of 'installcredprovider.ps1' locally..." + local installcredproviderPath="installcredprovider.sh" + if command -v curl > /dev/null; then + curl $url > "$installcredproviderPath" + else + wget -q -O "$installcredproviderPath" "$url" + fi + + echo "Installing plugin..." + . "$installcredproviderPath" + + echo "Deleting local copy of 'installcredprovider.sh'..." + rm installcredprovider.sh + + if [ ! -d "$HOME/.nuget/plugins" ]; then + Write-PipelineTelemetryError -category 'Build' 'CredProvider plugin was not installed correctly!' + ExitWithExitCode 1 + else + echo "CredProvider plugin was installed correctly!" + fi + + # Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable + # feeds successfully + + local nugetConfigPath="{$repo_root}NuGet.config" + + if [ ! "$nugetConfigPath" ]; then + Write-PipelineTelemetryError -category 'Build' "NuGet.config file not found in repo's root!" + ExitWithExitCode 1 + fi + + local endpoints='[' + local nugetConfigPackageValues=`cat "$nugetConfigPath" | grep "key=\"darc-int-"` + local pattern="value=\"(.*)\"" + + for value in $nugetConfigPackageValues + do + if [[ $value =~ $pattern ]]; then + local endpoint="${BASH_REMATCH[1]}" + endpoints+="{\"endpoint\": \"$endpoint\", \"password\": \"$authToken\"}," + fi + done + + endpoints=${endpoints%?} + endpoints+=']' + + if [ ${#endpoints} -gt 2 ]; then + local endpointCredentials="{\"endpointCredentials\": "$endpoints"}" + + echo "##vso[task.setvariable variable=VSS_NUGET_EXTERNAL_FEED_ENDPOINTS]$endpointCredentials" + echo "##vso[task.setvariable variable=NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED]False" + else + echo "No internal endpoints found in NuGet.config" + fi +} + +# Workaround for https://github.com/microsoft/msbuild/issues/4430 +function InstallDotNetSdkAndRestoreArcade { + local dotnetTempDir="$repo_root/dotnet" + local dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*) + local restoreProjPath="$repo_root/eng/common/restore.proj" + + echo "Installing dotnet SDK version $dotnetSdkVersion to restore Arcade SDK..." + echo "" > "$restoreProjPath" + + InstallDotNetSdk "$dotnetTempDir" "$dotnetSdkVersion" + + local res=`$dotnetTempDir/dotnet restore $restoreProjPath` + echo "Arcade SDK restored!" + + # Cleanup + if [ "$restoreProjPath" ]; then + rm "$restoreProjPath" + fi + + if [ "$dotnetTempDir" ]; then + rm -r $dotnetTempDir + fi +} + +source="${BASH_SOURCE[0]}" +operation='' +authToken='' +repoName='' + +while [[ $# > 0 ]]; do + opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" + case "$opt" in + --operation) + operation=$2 + shift + ;; + --authtoken) + authToken=$2 + shift + ;; + *) + echo "Invalid argument: $1" + usage + exit 1 + ;; + esac + + shift +done + +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. "$scriptroot/tools.sh" + +if [ "$operation" = "setup" ]; then + SetupCredProvider $authToken +elif [ "$operation" = "install-restore" ]; then + InstallDotNetSdkAndRestoreArcade +else + echo "Unknown operation '$operation'!" +fi diff --git a/eng/common/internal/Directory.Build.props b/eng/common/internal/Directory.Build.props new file mode 100644 index 000000000000..f1d041c33da5 --- /dev/null +++ b/eng/common/internal/Directory.Build.props @@ -0,0 +1,11 @@ + + + + + false + false + + + + + diff --git a/eng/common/internal/NuGet.config b/eng/common/internal/NuGet.config new file mode 100644 index 000000000000..19d3d311b166 --- /dev/null +++ b/eng/common/internal/NuGet.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/eng/common/internal/Tools.csproj b/eng/common/internal/Tools.csproj new file mode 100644 index 000000000000..32f79dfb3402 --- /dev/null +++ b/eng/common/internal/Tools.csproj @@ -0,0 +1,32 @@ + + + + + net472 + false + false + + + + + + + + + + + + + + https://devdiv.pkgs.visualstudio.com/_packaging/dotnet-core-internal-tooling/nuget/v3/index.json; + + + $(RestoreSources); + https://devdiv.pkgs.visualstudio.com/_packaging/VS/nuget/v3/index.json; + + + + + + + diff --git a/eng/common/loc/P22DotNetHtmlLocalization.lss b/eng/common/loc/P22DotNetHtmlLocalization.lss new file mode 100644 index 000000000000..5d892d619398 --- /dev/null +++ b/eng/common/loc/P22DotNetHtmlLocalization.lss @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eng/common/msbuild.ps1 b/eng/common/msbuild.ps1 new file mode 100644 index 000000000000..f041e5ddd958 --- /dev/null +++ b/eng/common/msbuild.ps1 @@ -0,0 +1,28 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string] $verbosity = 'minimal', + [bool] $warnAsError = $true, + [bool] $nodeReuse = $true, + [switch] $ci, + [switch] $prepareMachine, + [switch] $excludePrereleaseVS, + [string] $msbuildEngine = $null, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$extraArgs +) + +. $PSScriptRoot\tools.ps1 + +try { + if ($ci) { + $nodeReuse = $false + } + + MSBuild @extraArgs +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Build' -Message $_ + ExitWithExitCode 1 +} + +ExitWithExitCode 0 \ No newline at end of file diff --git a/eng/common/msbuild.sh b/eng/common/msbuild.sh new file mode 100644 index 000000000000..20d3dad54352 --- /dev/null +++ b/eng/common/msbuild.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +verbosity='minimal' +warn_as_error=true +node_reuse=true +prepare_machine=false +extra_args='' + +while (($# > 0)); do + lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")" + case $lowerI in + --verbosity) + verbosity=$2 + shift 2 + ;; + --warnaserror) + warn_as_error=$2 + shift 2 + ;; + --nodereuse) + node_reuse=$2 + shift 2 + ;; + --ci) + ci=true + shift 1 + ;; + --preparemachine) + prepare_machine=true + shift 1 + ;; + *) + extra_args="$extra_args $1" + shift 1 + ;; + esac +done + +. "$scriptroot/tools.sh" + +if [[ "$ci" == true ]]; then + node_reuse=false +fi + +MSBuild $extra_args +ExitWithExitCode 0 diff --git a/eng/common/native/CommonLibrary.psm1 b/eng/common/native/CommonLibrary.psm1 new file mode 100644 index 000000000000..f71f6af6cdbc --- /dev/null +++ b/eng/common/native/CommonLibrary.psm1 @@ -0,0 +1,401 @@ +<# +.SYNOPSIS +Helper module to install an archive to a directory + +.DESCRIPTION +Helper module to download and extract an archive to a specified directory + +.PARAMETER Uri +Uri of artifact to download + +.PARAMETER InstallDirectory +Directory to extract artifact contents to + +.PARAMETER Force +Force download / extraction if file or contents already exist. Default = False + +.PARAMETER DownloadRetries +Total number of retry attempts. Default = 5 + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds. Default = 30 + +.NOTES +Returns False if download or extraction fail, True otherwise +#> +function DownloadAndExtract { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Uri, + [Parameter(Mandatory=$True)] + [string] $InstallDirectory, + [switch] $Force = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30 + ) + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $TempToolPath = CommonLibrary\Get-TempPathFilename -Path $Uri + + # Download native tool + $DownloadStatus = CommonLibrary\Get-File -Uri $Uri ` + -Path $TempToolPath ` + -DownloadRetries $DownloadRetries ` + -RetryWaitTimeInSeconds $RetryWaitTimeInSeconds ` + -Force:$Force ` + -Verbose:$Verbose + + if ($DownloadStatus -Eq $False) { + Write-Error "Download failed from $Uri" + return $False + } + + # Extract native tool + $UnzipStatus = CommonLibrary\Expand-Zip -ZipPath $TempToolPath ` + -OutputDirectory $InstallDirectory ` + -Force:$Force ` + -Verbose:$Verbose + + if ($UnzipStatus -Eq $False) { + # Retry Download one more time with Force=true + $DownloadRetryStatus = CommonLibrary\Get-File -Uri $Uri ` + -Path $TempToolPath ` + -DownloadRetries 1 ` + -RetryWaitTimeInSeconds $RetryWaitTimeInSeconds ` + -Force:$True ` + -Verbose:$Verbose + + if ($DownloadRetryStatus -Eq $False) { + Write-Error "Last attempt of download failed as well" + return $False + } + + # Retry unzip again one more time with Force=true + $UnzipRetryStatus = CommonLibrary\Expand-Zip -ZipPath $TempToolPath ` + -OutputDirectory $InstallDirectory ` + -Force:$True ` + -Verbose:$Verbose + if ($UnzipRetryStatus -Eq $False) + { + Write-Error "Last attempt of unzip failed as well" + # Clean up partial zips and extracts + if (Test-Path $TempToolPath) { + Remove-Item $TempToolPath -Force + } + if (Test-Path $InstallDirectory) { + Remove-Item $InstallDirectory -Force -Recurse + } + return $False + } + } + + return $True +} + +<# +.SYNOPSIS +Download a file, retry on failure + +.DESCRIPTION +Download specified file and retry if attempt fails + +.PARAMETER Uri +Uri of file to download. If Uri is a local path, the file will be copied instead of downloaded + +.PARAMETER Path +Path to download or copy uri file to + +.PARAMETER Force +Overwrite existing file if present. Default = False + +.PARAMETER DownloadRetries +Total number of retry attempts. Default = 5 + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds Default = 30 + +#> +function Get-File { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Uri, + [Parameter(Mandatory=$True)] + [string] $Path, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30, + [switch] $Force = $False + ) + $Attempt = 0 + + if ($Force) { + if (Test-Path $Path) { + Remove-Item $Path -Force + } + } + if (Test-Path $Path) { + Write-Host "File '$Path' already exists, skipping download" + return $True + } + + $DownloadDirectory = Split-Path -ErrorAction Ignore -Path "$Path" -Parent + if (-Not (Test-Path $DownloadDirectory)) { + New-Item -path $DownloadDirectory -force -itemType "Directory" | Out-Null + } + + $TempPath = "$Path.tmp" + if (Test-Path -IsValid -Path $Uri) { + Write-Verbose "'$Uri' is a file path, copying temporarily to '$TempPath'" + Copy-Item -Path $Uri -Destination $TempPath + Write-Verbose "Moving temporary file to '$Path'" + Move-Item -Path $TempPath -Destination $Path + return $? + } + else { + Write-Verbose "Downloading $Uri" + # Don't display the console progress UI - it's a huge perf hit + $ProgressPreference = 'SilentlyContinue' + while($Attempt -Lt $DownloadRetries) + { + try { + Invoke-WebRequest -UseBasicParsing -Uri $Uri -OutFile $TempPath + Write-Verbose "Downloaded to temporary location '$TempPath'" + Move-Item -Path $TempPath -Destination $Path + Write-Verbose "Moved temporary file to '$Path'" + return $True + } + catch { + $Attempt++ + if ($Attempt -Lt $DownloadRetries) { + $AttemptsLeft = $DownloadRetries - $Attempt + Write-Warning "Download failed, $AttemptsLeft attempts remaining, will retry in $RetryWaitTimeInSeconds seconds" + Start-Sleep -Seconds $RetryWaitTimeInSeconds + } + else { + Write-Error $_ + Write-Error $_.Exception + } + } + } + } + + return $False +} + +<# +.SYNOPSIS +Generate a shim for a native tool + +.DESCRIPTION +Creates a wrapper script (shim) that passes arguments forward to native tool assembly + +.PARAMETER ShimName +The name of the shim + +.PARAMETER ShimDirectory +The directory where shims are stored + +.PARAMETER ToolFilePath +Path to file that shim forwards to + +.PARAMETER Force +Replace shim if already present. Default = False + +.NOTES +Returns $True if generating shim succeeds, $False otherwise +#> +function New-ScriptShim { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $ShimName, + [Parameter(Mandatory=$True)] + [string] $ShimDirectory, + [Parameter(Mandatory=$True)] + [string] $ToolFilePath, + [Parameter(Mandatory=$True)] + [string] $BaseUri, + [switch] $Force + ) + try { + Write-Verbose "Generating '$ShimName' shim" + + if (-Not (Test-Path $ToolFilePath)){ + Write-Error "Specified tool file path '$ToolFilePath' does not exist" + return $False + } + + # WinShimmer is a small .NET Framework program that creates .exe shims to bootstrapped programs + # Many of the checks for installed programs expect a .exe extension for Windows tools, rather + # than a .bat or .cmd file. + # Source: https://github.com/dotnet/arcade/tree/master/src/WinShimmer + if (-Not (Test-Path "$ShimDirectory\WinShimmer\winshimmer.exe")) { + $InstallStatus = DownloadAndExtract -Uri "$BaseUri/windows/winshimmer/WinShimmer.zip" ` + -InstallDirectory $ShimDirectory\WinShimmer ` + -Force:$Force ` + -DownloadRetries 2 ` + -RetryWaitTimeInSeconds 5 ` + -Verbose:$Verbose + } + + if ((Test-Path (Join-Path $ShimDirectory "$ShimName.exe"))) { + Write-Host "$ShimName.exe already exists; replacing..." + Remove-Item (Join-Path $ShimDirectory "$ShimName.exe") + } + + & "$ShimDirectory\WinShimmer\winshimmer.exe" $ShimName $ToolFilePath $ShimDirectory + return $True + } + catch { + Write-Host $_ + Write-Host $_.Exception + return $False + } +} + +<# +.SYNOPSIS +Returns the machine architecture of the host machine + +.NOTES +Returns 'x64' on 64 bit machines + Returns 'x86' on 32 bit machines +#> +function Get-MachineArchitecture { + $ProcessorArchitecture = $Env:PROCESSOR_ARCHITECTURE + $ProcessorArchitectureW6432 = $Env:PROCESSOR_ARCHITEW6432 + if($ProcessorArchitecture -Eq "X86") + { + if(($ProcessorArchitectureW6432 -Eq "") -Or + ($ProcessorArchitectureW6432 -Eq "X86")) { + return "x86" + } + $ProcessorArchitecture = $ProcessorArchitectureW6432 + } + if (($ProcessorArchitecture -Eq "AMD64") -Or + ($ProcessorArchitecture -Eq "IA64") -Or + ($ProcessorArchitecture -Eq "ARM64") -Or + ($ProcessorArchitecture -Eq "LOONGARCH64") -Or + ($ProcessorArchitecture -Eq "RISCV64")) { + return "x64" + } + return "x86" +} + +<# +.SYNOPSIS +Get the name of a temporary folder under the native install directory +#> +function Get-TempDirectory { + return Join-Path (Get-NativeInstallDirectory) "temp/" +} + +function Get-TempPathFilename { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Path + ) + $TempDir = CommonLibrary\Get-TempDirectory + $TempFilename = Split-Path $Path -leaf + $TempPath = Join-Path $TempDir $TempFilename + return $TempPath +} + +<# +.SYNOPSIS +Returns the base directory to use for native tool installation + +.NOTES +Returns the value of the NETCOREENG_INSTALL_DIRECTORY if that environment variable +is set, or otherwise returns an install directory under the %USERPROFILE% +#> +function Get-NativeInstallDirectory { + $InstallDir = $Env:NETCOREENG_INSTALL_DIRECTORY + if (!$InstallDir) { + $InstallDir = Join-Path $Env:USERPROFILE ".netcoreeng/native/" + } + return $InstallDir +} + +<# +.SYNOPSIS +Unzip an archive + +.DESCRIPTION +Powershell module to unzip an archive to a specified directory + +.PARAMETER ZipPath (Required) +Path to archive to unzip + +.PARAMETER OutputDirectory (Required) +Output directory for archive contents + +.PARAMETER Force +Overwrite output directory contents if they already exist + +.NOTES +- Returns True and does not perform an extraction if output directory already exists but Overwrite is not True. +- Returns True if unzip operation is successful +- Returns False if Overwrite is True and it is unable to remove contents of OutputDirectory +- Returns False if unable to extract zip archive +#> +function Expand-Zip { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $ZipPath, + [Parameter(Mandatory=$True)] + [string] $OutputDirectory, + [switch] $Force + ) + + Write-Verbose "Extracting '$ZipPath' to '$OutputDirectory'" + try { + if ((Test-Path $OutputDirectory) -And (-Not $Force)) { + Write-Host "Directory '$OutputDirectory' already exists, skipping extract" + return $True + } + if (Test-Path $OutputDirectory) { + Write-Verbose "'Force' is 'True', but '$OutputDirectory' exists, removing directory" + Remove-Item $OutputDirectory -Force -Recurse + if ($? -Eq $False) { + Write-Error "Unable to remove '$OutputDirectory'" + return $False + } + } + + $TempOutputDirectory = Join-Path "$(Split-Path -Parent $OutputDirectory)" "$(Split-Path -Leaf $OutputDirectory).tmp" + if (Test-Path $TempOutputDirectory) { + Remove-Item $TempOutputDirectory -Force -Recurse + } + New-Item -Path $TempOutputDirectory -Force -ItemType "Directory" | Out-Null + + Add-Type -assembly "system.io.compression.filesystem" + [io.compression.zipfile]::ExtractToDirectory("$ZipPath", "$TempOutputDirectory") + if ($? -Eq $False) { + Write-Error "Unable to extract '$ZipPath'" + return $False + } + + Move-Item -Path $TempOutputDirectory -Destination $OutputDirectory + } + catch { + Write-Host $_ + Write-Host $_.Exception + + return $False + } + return $True +} + +export-modulemember -function DownloadAndExtract +export-modulemember -function Expand-Zip +export-modulemember -function Get-File +export-modulemember -function Get-MachineArchitecture +export-modulemember -function Get-NativeInstallDirectory +export-modulemember -function Get-TempDirectory +export-modulemember -function Get-TempPathFilename +export-modulemember -function New-ScriptShim diff --git a/eng/common/native/common-library.sh b/eng/common/native/common-library.sh new file mode 100644 index 000000000000..080c2c283ae4 --- /dev/null +++ b/eng/common/native/common-library.sh @@ -0,0 +1,172 @@ +#!/usr/bin/env bash + +function GetNativeInstallDirectory { + local install_dir + + if [[ -z $NETCOREENG_INSTALL_DIRECTORY ]]; then + install_dir=$HOME/.netcoreeng/native/ + else + install_dir=$NETCOREENG_INSTALL_DIRECTORY + fi + + echo $install_dir + return 0 +} + +function GetTempDirectory { + + echo $(GetNativeInstallDirectory)temp/ + return 0 +} + +function ExpandZip { + local zip_path=$1 + local output_directory=$2 + local force=${3:-false} + + echo "Extracting $zip_path to $output_directory" + if [[ -d $output_directory ]] && [[ $force = false ]]; then + echo "Directory '$output_directory' already exists, skipping extract" + return 0 + fi + + if [[ -d $output_directory ]]; then + echo "'Force flag enabled, but '$output_directory' exists. Removing directory" + rm -rf $output_directory + if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Unable to remove '$output_directory'" + return 1 + fi + fi + + echo "Creating directory: '$output_directory'" + mkdir -p $output_directory + + echo "Extracting archive" + tar -xf $zip_path -C $output_directory + if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Unable to extract '$zip_path'" + return 1 + fi + + return 0 +} + +function GetCurrentOS { + local unameOut="$(uname -s)" + case $unameOut in + Linux*) echo "Linux";; + Darwin*) echo "MacOS";; + esac + return 0 +} + +function GetFile { + local uri=$1 + local path=$2 + local force=${3:-false} + local download_retries=${4:-5} + local retry_wait_time_seconds=${5:-30} + + if [[ -f $path ]]; then + if [[ $force = false ]]; then + echo "File '$path' already exists. Skipping download" + return 0 + else + rm -rf $path + fi + fi + + if [[ -f $uri ]]; then + echo "'$uri' is a file path, copying file to '$path'" + cp $uri $path + return $? + fi + + echo "Downloading $uri" + # Use curl if available, otherwise use wget + if command -v curl > /dev/null; then + curl "$uri" -sSL --retry $download_retries --retry-delay $retry_wait_time_seconds --create-dirs -o "$path" --fail + else + wget -q -O "$path" "$uri" --tries="$download_retries" + fi + + return $? +} + +function GetTempPathFileName { + local path=$1 + + local temp_dir=$(GetTempDirectory) + local temp_file_name=$(basename $path) + echo $temp_dir$temp_file_name + return 0 +} + +function DownloadAndExtract { + local uri=$1 + local installDir=$2 + local force=${3:-false} + local download_retries=${4:-5} + local retry_wait_time_seconds=${5:-30} + + local temp_tool_path=$(GetTempPathFileName $uri) + + echo "downloading to: $temp_tool_path" + + # Download file + GetFile "$uri" "$temp_tool_path" $force $download_retries $retry_wait_time_seconds + if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Failed to download '$uri' to '$temp_tool_path'." + return 1 + fi + + # Extract File + echo "extracting from $temp_tool_path to $installDir" + ExpandZip "$temp_tool_path" "$installDir" $force $download_retries $retry_wait_time_seconds + if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Failed to extract '$temp_tool_path' to '$installDir'." + return 1 + fi + + return 0 +} + +function NewScriptShim { + local shimpath=$1 + local tool_file_path=$2 + local force=${3:-false} + + echo "Generating '$shimpath' shim" + if [[ -f $shimpath ]]; then + if [[ $force = false ]]; then + echo "File '$shimpath' already exists." >&2 + return 1 + else + rm -rf $shimpath + fi + fi + + if [[ ! -f $tool_file_path ]]; then + # try to see if the path is lower cased + tool_file_path="$(echo $tool_file_path | tr "[:upper:]" "[:lower:]")" + if [[ ! -f $tool_file_path ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Specified tool file path:'$tool_file_path' does not exist" + return 1 + fi + fi + + local shim_contents=$'#!/usr/bin/env bash\n' + shim_contents+="SHIMARGS="$'$1\n' + shim_contents+="$tool_file_path"$' $SHIMARGS\n' + + # Write shim file + echo "$shim_contents" > $shimpath + + chmod +x $shimpath + + echo "Finished generating shim '$shimpath'" + + return $? +} + diff --git a/eng/common/native/init-compiler.sh b/eng/common/native/init-compiler.sh new file mode 100644 index 000000000000..9a0e1f2b4567 --- /dev/null +++ b/eng/common/native/init-compiler.sh @@ -0,0 +1,146 @@ +#!/bin/sh +# +# This file detects the C/C++ compiler and exports it to the CC/CXX environment variables +# +# NOTE: some scripts source this file and rely on stdout being empty, make sure +# to not output *anything* here, unless it is an error message that fails the +# build. + +if [ -z "$build_arch" ] || [ -z "$compiler" ]; then + echo "Usage..." + echo "build_arch= compiler= init-compiler.sh" + echo "Specify the target architecture." + echo "Specify the name of compiler (clang or gcc)." + exit 1 +fi + +case "$compiler" in + clang*|-clang*|--clang*) + # clangx.y or clang-x.y + version="$(echo "$compiler" | tr -d '[:alpha:]-=')" + majorVersion="${version%%.*}" + + # LLVM based on v18 released in early 2024, with two releases per year + maxVersion="$((18 + ((($(date +%Y) - 2024) * 12 + $(date +%-m) - 3) / 6)))" + compiler=clang + ;; + + gcc*|-gcc*|--gcc*) + # gccx.y or gcc-x.y + version="$(echo "$compiler" | tr -d '[:alpha:]-=')" + majorVersion="${version%%.*}" + + # GCC based on v14 released in early 2024, with one release per year + maxVersion="$((14 + ((($(date +%Y) - 2024) * 12 + $(date +%-m) - 3) / 12)))" + compiler=gcc + ;; +esac + +cxxCompiler="$compiler++" + +# clear the existing CC and CXX from environment +CC= +CXX= +LDFLAGS= + +if [ "$compiler" = "gcc" ]; then cxxCompiler="g++"; fi + +check_version_exists() { + desired_version=-1 + + # Set up the environment to be used for building with the desired compiler. + if command -v "$compiler-$1" > /dev/null; then + desired_version="-$1" + elif command -v "$compiler$1" > /dev/null; then + desired_version="$1" + fi + + echo "$desired_version" +} + +__baseOS="$(uname)" +set_compiler_version_from_CC() { + if [ "$__baseOS" = "Darwin" ]; then + # On Darwin, the versions from -version/-dumpversion refer to Xcode + # versions, not llvm versions, so we can't rely on them. + return + fi + + version="$("$CC" -dumpversion)" + if [ -z "$version" ]; then + echo "Error: $CC -dumpversion didn't provide a version" + exit 1 + fi + + # gcc and clang often display 3 part versions. However, gcc can show only 1 part in some environments. + IFS=. read -r majorVersion _ < /dev/null; then + echo "Error: No compatible version of $compiler was found within the range of $minVersion to $maxVersion. Please upgrade your toolchain or specify the compiler explicitly using CLR_CC and CLR_CXX environment variables." + exit 1 + fi + + CC="$(command -v "$compiler" 2> /dev/null)" + CXX="$(command -v "$cxxCompiler" 2> /dev/null)" + set_compiler_version_from_CC + fi + else + desired_version="$(check_version_exists "$majorVersion")" + if [ "$desired_version" = "-1" ]; then + echo "Error: Could not find specific version of $compiler: $majorVersion." + exit 1 + fi + fi + + if [ -z "$CC" ]; then + CC="$(command -v "$compiler$desired_version" 2> /dev/null)" + CXX="$(command -v "$cxxCompiler$desired_version" 2> /dev/null)" + if [ -z "$CXX" ]; then CXX="$(command -v "$cxxCompiler" 2> /dev/null)"; fi + set_compiler_version_from_CC + fi +else + if [ ! -f "$CLR_CC" ]; then + echo "Error: CLR_CC is set but path '$CLR_CC' does not exist" + exit 1 + fi + CC="$CLR_CC" + CXX="$CLR_CXX" + set_compiler_version_from_CC +fi + +if [ -z "$CC" ]; then + echo "Error: Unable to find $compiler." + exit 1 +fi + +if [ "$__baseOS" != "Darwin" ]; then + # On Darwin, we always want to use the Apple linker. + + # Only lld version >= 9 can be considered stable. lld supports s390x starting from 18.0. + if [ "$compiler" = "clang" ] && [ -n "$majorVersion" ] && [ "$majorVersion" -ge 9 ] && { [ "$build_arch" != "s390x" ] || [ "$majorVersion" -ge 18 ]; }; then + if "$CC" -fuse-ld=lld -Wl,--version >/dev/null 2>&1; then + LDFLAGS="-fuse-ld=lld" + fi + fi +fi + +SCAN_BUILD_COMMAND="$(command -v "scan-build$desired_version" 2> /dev/null)" + +export CC CXX LDFLAGS SCAN_BUILD_COMMAND diff --git a/eng/common/native/init-distro-rid.sh b/eng/common/native/init-distro-rid.sh new file mode 100644 index 000000000000..83ea7aab0e08 --- /dev/null +++ b/eng/common/native/init-distro-rid.sh @@ -0,0 +1,110 @@ +#!/bin/sh + +# getNonPortableDistroRid +# +# Input: +# targetOs: (str) +# targetArch: (str) +# rootfsDir: (str) +# +# Return: +# non-portable rid +getNonPortableDistroRid() +{ + targetOs="$1" + targetArch="$2" + rootfsDir="$3" + nonPortableRid="" + + if [ "$targetOs" = "linux" ]; then + # shellcheck disable=SC1091 + if [ -e "${rootfsDir}/etc/os-release" ]; then + . "${rootfsDir}/etc/os-release" + if echo "${VERSION_ID:-}" | grep -qE '^([[:digit:]]|\.)+$'; then + nonPortableRid="${ID}.${VERSION_ID}-${targetArch}" + else + # Rolling release distros either do not set VERSION_ID, set it as blank or + # set it to non-version looking string (such as TEMPLATE_VERSION_ID on ArchLinux); + # so omit it here to be consistent with everything else. + nonPortableRid="${ID}-${targetArch}" + fi + elif [ -e "${rootfsDir}/android_platform" ]; then + # shellcheck disable=SC1091 + . "${rootfsDir}/android_platform" + nonPortableRid="$RID" + fi + fi + + if [ "$targetOs" = "freebsd" ]; then + # $rootfsDir can be empty. freebsd-version is a shell script and should always work. + __freebsd_major_version=$("$rootfsDir"/bin/freebsd-version | cut -d'.' -f1) + nonPortableRid="freebsd.$__freebsd_major_version-${targetArch}" + elif command -v getprop >/dev/null && getprop ro.product.system.model | grep -qi android; then + __android_sdk_version=$(getprop ro.build.version.sdk) + nonPortableRid="android.$__android_sdk_version-${targetArch}" + elif [ "$targetOs" = "illumos" ]; then + __uname_version=$(uname -v) + nonPortableRid="illumos-${targetArch}" + elif [ "$targetOs" = "solaris" ]; then + __uname_version=$(uname -v) + __solaris_major_version=$(echo "$__uname_version" | cut -d'.' -f1) + nonPortableRid="solaris.$__solaris_major_version-${targetArch}" + elif [ "$targetOs" = "haiku" ]; then + __uname_release="$(uname -r)" + nonPortableRid=haiku.r"$__uname_release"-"$targetArch" + fi + + echo "$nonPortableRid" | tr '[:upper:]' '[:lower:]' +} + +# initDistroRidGlobal +# +# Input: +# os: (str) +# arch: (str) +# rootfsDir?: (nullable:string) +# +# Return: +# None +# +# Notes: +# It is important to note that the function does not return anything, but it +# exports the following variables on success: +# __DistroRid : Non-portable rid of the target platform. +# __PortableTargetOS : OS-part of the portable rid that corresponds to the target platform. +initDistroRidGlobal() +{ + targetOs="$1" + targetArch="$2" + rootfsDir="" + if [ $# -ge 3 ]; then + rootfsDir="$3" + fi + + if [ -n "${rootfsDir}" ]; then + # We may have a cross build. Check for the existence of the rootfsDir + if [ ! -e "${rootfsDir}" ]; then + echo "Error: rootfsDir has been passed, but the location is not valid." + exit 1 + fi + fi + + __DistroRid=$(getNonPortableDistroRid "${targetOs}" "${targetArch}" "${rootfsDir}") + + if [ -z "${__PortableTargetOS:-}" ]; then + __PortableTargetOS="$targetOs" + + STRINGS="$(command -v strings || true)" + if [ -z "$STRINGS" ]; then + STRINGS="$(command -v llvm-strings || true)" + fi + + # Check for musl-based distros (e.g. Alpine Linux, Void Linux). + if "${rootfsDir}/usr/bin/ldd" --version 2>&1 | grep -q musl || + ( [ -n "$STRINGS" ] && "$STRINGS" "${rootfsDir}/usr/bin/ldd" 2>&1 | grep -q musl ); then + __PortableTargetOS="linux-musl" + fi + fi + + export __DistroRid __PortableTargetOS +} diff --git a/eng/common/native/init-os-and-arch.sh b/eng/common/native/init-os-and-arch.sh new file mode 100644 index 000000000000..38921d4338f7 --- /dev/null +++ b/eng/common/native/init-os-and-arch.sh @@ -0,0 +1,85 @@ +#!/bin/sh + +# Use uname to determine what the OS is. +OSName=$(uname -s | tr '[:upper:]' '[:lower:]') + +if command -v getprop && getprop ro.product.system.model 2>&1 | grep -qi android; then + OSName="android" +fi + +case "$OSName" in +freebsd|linux|netbsd|openbsd|sunos|android|haiku) + os="$OSName" ;; +darwin) + os=osx ;; +*) + echo "Unsupported OS $OSName detected!" + exit 1 ;; +esac + +# On Solaris, `uname -m` is discouraged, see https://docs.oracle.com/cd/E36784_01/html/E36870/uname-1.html +# and `uname -p` returns processor type (e.g. i386 on amd64). +# The appropriate tool to determine CPU is isainfo(1) https://docs.oracle.com/cd/E36784_01/html/E36870/isainfo-1.html. +if [ "$os" = "sunos" ]; then + if uname -o 2>&1 | grep -q illumos; then + os="illumos" + else + os="solaris" + fi + CPUName=$(isainfo -n) +else + # For the rest of the operating systems, use uname(1) to determine what the CPU is. + CPUName=$(uname -m) +fi + +case "$CPUName" in + arm64|aarch64) + arch=arm64 + if [ "$(getconf LONG_BIT)" -lt 64 ]; then + # This is 32-bit OS running on 64-bit CPU (for example Raspberry Pi OS) + arch=arm + fi + ;; + + loongarch64) + arch=loongarch64 + ;; + + riscv64) + arch=riscv64 + ;; + + amd64|x86_64) + arch=x64 + ;; + + armv7l|armv8l) + # shellcheck disable=SC1091 + if (NAME=""; . /etc/os-release; test "$NAME" = "Tizen"); then + arch=armel + else + arch=arm + fi + ;; + + armv6l) + arch=armv6 + ;; + + i[3-6]86) + echo "Unsupported CPU $CPUName detected, build might not succeed!" + arch=x86 + ;; + + s390x) + arch=s390x + ;; + + ppc64le) + arch=ppc64le + ;; + *) + echo "Unknown CPU $CPUName detected!" + exit 1 + ;; +esac diff --git a/eng/common/native/install-cmake-test.sh b/eng/common/native/install-cmake-test.sh new file mode 100644 index 000000000000..8a5e7cf0db5a --- /dev/null +++ b/eng/common/native/install-cmake-test.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. $scriptroot/common-library.sh + +base_uri= +install_path= +version= +clean=false +force=false +download_retries=5 +retry_wait_time_seconds=30 + +while (($# > 0)); do + lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")" + case $lowerI in + --baseuri) + base_uri=$2 + shift 2 + ;; + --installpath) + install_path=$2 + shift 2 + ;; + --version) + version=$2 + shift 2 + ;; + --clean) + clean=true + shift 1 + ;; + --force) + force=true + shift 1 + ;; + --downloadretries) + download_retries=$2 + shift 2 + ;; + --retrywaittimeseconds) + retry_wait_time_seconds=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --baseuri Base file directory or Url wrom which to acquire tool archives" + echo " --installpath Base directory to install native tool to" + echo " --clean Don't install the tool, just clean up the current install of the tool" + echo " --force Force install of tools even if they previously exist" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --downloadretries Total number of retry attempts" + echo " --retrywaittimeseconds Wait time between retry attempts in seconds" + echo "" + exit 0 + ;; + esac +done + +tool_name="cmake-test" +tool_os=$(GetCurrentOS) +tool_folder="$(echo $tool_os | tr "[:upper:]" "[:lower:]")" +tool_arch="x86_64" +tool_name_moniker="$tool_name-$version-$tool_os-$tool_arch" +tool_install_directory="$install_path/$tool_name/$version" +tool_file_path="$tool_install_directory/$tool_name_moniker/bin/$tool_name" +shim_path="$install_path/$tool_name.sh" +uri="${base_uri}/$tool_folder/$tool_name/$tool_name_moniker.tar.gz" + +# Clean up tool and installers +if [[ $clean = true ]]; then + echo "Cleaning $tool_install_directory" + if [[ -d $tool_install_directory ]]; then + rm -rf $tool_install_directory + fi + + echo "Cleaning $shim_path" + if [[ -f $shim_path ]]; then + rm -rf $shim_path + fi + + tool_temp_path=$(GetTempPathFileName $uri) + echo "Cleaning $tool_temp_path" + if [[ -f $tool_temp_path ]]; then + rm -rf $tool_temp_path + fi + + exit 0 +fi + +# Install tool +if [[ -f $tool_file_path ]] && [[ $force = false ]]; then + echo "$tool_name ($version) already exists, skipping install" + exit 0 +fi + +DownloadAndExtract $uri $tool_install_directory $force $download_retries $retry_wait_time_seconds + +if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Installation failed' + exit 1 +fi + +# Generate Shim +# Always rewrite shims so that we are referencing the expected version +NewScriptShim $shim_path $tool_file_path true + +if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Shim generation failed' + exit 1 +fi + +exit 0 diff --git a/eng/common/native/install-cmake.sh b/eng/common/native/install-cmake.sh new file mode 100644 index 000000000000..de496beebc5a --- /dev/null +++ b/eng/common/native/install-cmake.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. $scriptroot/common-library.sh + +base_uri= +install_path= +version= +clean=false +force=false +download_retries=5 +retry_wait_time_seconds=30 + +while (($# > 0)); do + lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")" + case $lowerI in + --baseuri) + base_uri=$2 + shift 2 + ;; + --installpath) + install_path=$2 + shift 2 + ;; + --version) + version=$2 + shift 2 + ;; + --clean) + clean=true + shift 1 + ;; + --force) + force=true + shift 1 + ;; + --downloadretries) + download_retries=$2 + shift 2 + ;; + --retrywaittimeseconds) + retry_wait_time_seconds=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --baseuri Base file directory or Url wrom which to acquire tool archives" + echo " --installpath Base directory to install native tool to" + echo " --clean Don't install the tool, just clean up the current install of the tool" + echo " --force Force install of tools even if they previously exist" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --downloadretries Total number of retry attempts" + echo " --retrywaittimeseconds Wait time between retry attempts in seconds" + echo "" + exit 0 + ;; + esac +done + +tool_name="cmake" +tool_os=$(GetCurrentOS) +tool_folder="$(echo $tool_os | tr "[:upper:]" "[:lower:]")" +tool_arch="x86_64" +tool_name_moniker="$tool_name-$version-$tool_os-$tool_arch" +tool_install_directory="$install_path/$tool_name/$version" +tool_file_path="$tool_install_directory/$tool_name_moniker/bin/$tool_name" +shim_path="$install_path/$tool_name.sh" +uri="${base_uri}/$tool_folder/$tool_name/$tool_name_moniker.tar.gz" + +# Clean up tool and installers +if [[ $clean = true ]]; then + echo "Cleaning $tool_install_directory" + if [[ -d $tool_install_directory ]]; then + rm -rf $tool_install_directory + fi + + echo "Cleaning $shim_path" + if [[ -f $shim_path ]]; then + rm -rf $shim_path + fi + + tool_temp_path=$(GetTempPathFileName $uri) + echo "Cleaning $tool_temp_path" + if [[ -f $tool_temp_path ]]; then + rm -rf $tool_temp_path + fi + + exit 0 +fi + +# Install tool +if [[ -f $tool_file_path ]] && [[ $force = false ]]; then + echo "$tool_name ($version) already exists, skipping install" + exit 0 +fi + +DownloadAndExtract $uri $tool_install_directory $force $download_retries $retry_wait_time_seconds + +if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Installation failed' + exit 1 +fi + +# Generate Shim +# Always rewrite shims so that we are referencing the expected version +NewScriptShim $shim_path $tool_file_path true + +if [[ $? != 0 ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' 'Shim generation failed' + exit 1 +fi + +exit 0 diff --git a/eng/common/native/install-tool.ps1 b/eng/common/native/install-tool.ps1 new file mode 100644 index 000000000000..78f2d84a4e4b --- /dev/null +++ b/eng/common/native/install-tool.ps1 @@ -0,0 +1,132 @@ +<# +.SYNOPSIS +Install native tool + +.DESCRIPTION +Install cmake native tool from Azure blob storage + +.PARAMETER InstallPath +Base directory to install native tool to + +.PARAMETER BaseUri +Base file directory or Url from which to acquire tool archives + +.PARAMETER CommonLibraryDirectory +Path to folder containing common library modules + +.PARAMETER Force +Force install of tools even if they previously exist + +.PARAMETER Clean +Don't install the tool, just clean up the current install of the tool + +.PARAMETER DownloadRetries +Total number of retry attempts + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds + +.NOTES +Returns 0 if install succeeds, 1 otherwise +#> +[CmdletBinding(PositionalBinding=$false)] +Param ( + [Parameter(Mandatory=$True)] + [string] $ToolName, + [Parameter(Mandatory=$True)] + [string] $InstallPath, + [Parameter(Mandatory=$True)] + [string] $BaseUri, + [Parameter(Mandatory=$True)] + [string] $Version, + [string] $CommonLibraryDirectory = $PSScriptRoot, + [switch] $Force = $False, + [switch] $Clean = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30 +) + +. $PSScriptRoot\..\pipeline-logging-functions.ps1 + +# Import common library modules +Import-Module -Name (Join-Path $CommonLibraryDirectory "CommonLibrary.psm1") + +try { + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $Arch = CommonLibrary\Get-MachineArchitecture + $ToolOs = "win64" + if($Arch -Eq "x32") { + $ToolOs = "win32" + } + $ToolNameMoniker = "$ToolName-$Version-$ToolOs-$Arch" + $ToolInstallDirectory = Join-Path $InstallPath "$ToolName\$Version\" + $Uri = "$BaseUri/windows/$ToolName/$ToolNameMoniker.zip" + $ShimPath = Join-Path $InstallPath "$ToolName.exe" + + if ($Clean) { + Write-Host "Cleaning $ToolInstallDirectory" + if (Test-Path $ToolInstallDirectory) { + Remove-Item $ToolInstallDirectory -Force -Recurse + } + Write-Host "Cleaning $ShimPath" + if (Test-Path $ShimPath) { + Remove-Item $ShimPath -Force + } + $ToolTempPath = CommonLibrary\Get-TempPathFilename -Path $Uri + Write-Host "Cleaning $ToolTempPath" + if (Test-Path $ToolTempPath) { + Remove-Item $ToolTempPath -Force + } + exit 0 + } + + # Install tool + if ((Test-Path $ToolInstallDirectory) -And (-Not $Force)) { + Write-Verbose "$ToolName ($Version) already exists, skipping install" + } + else { + $InstallStatus = CommonLibrary\DownloadAndExtract -Uri $Uri ` + -InstallDirectory $ToolInstallDirectory ` + -Force:$Force ` + -DownloadRetries $DownloadRetries ` + -RetryWaitTimeInSeconds $RetryWaitTimeInSeconds ` + -Verbose:$Verbose + + if ($InstallStatus -Eq $False) { + Write-PipelineTelemetryError "Installation failed" -Category "NativeToolsetBootstrapping" + exit 1 + } + } + + $ToolFilePath = Get-ChildItem $ToolInstallDirectory -Recurse -Filter "$ToolName.exe" | % { $_.FullName } + if (@($ToolFilePath).Length -Gt 1) { + Write-Error "There are multiple copies of $ToolName in $($ToolInstallDirectory): `n$(@($ToolFilePath | out-string))" + exit 1 + } elseif (@($ToolFilePath).Length -Lt 1) { + Write-Host "$ToolName was not found in $ToolInstallDirectory." + exit 1 + } + + # Generate shim + # Always rewrite shims so that we are referencing the expected version + $GenerateShimStatus = CommonLibrary\New-ScriptShim -ShimName $ToolName ` + -ShimDirectory $InstallPath ` + -ToolFilePath "$ToolFilePath" ` + -BaseUri $BaseUri ` + -Force:$Force ` + -Verbose:$Verbose + + if ($GenerateShimStatus -Eq $False) { + Write-PipelineTelemetryError "Generate shim failed" -Category "NativeToolsetBootstrapping" + return 1 + } + + exit 0 +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category "NativeToolsetBootstrapping" -Message $_ + exit 1 +} diff --git a/eng/common/pipeline-logging-functions.ps1 b/eng/common/pipeline-logging-functions.ps1 index 28d7823299eb..8e422c561e4b 100644 --- a/eng/common/pipeline-logging-functions.ps1 +++ b/eng/common/pipeline-logging-functions.ps1 @@ -257,4 +257,4 @@ function Write-LogIssue { } Write-Host $command -ForegroundColor $foregroundColor -BackgroundColor $backgroundColor -} \ No newline at end of file +} diff --git a/eng/common/pipeline-logging-functions.sh b/eng/common/pipeline-logging-functions.sh index 2eaafa8f323b..6a0b2255e911 100644 --- a/eng/common/pipeline-logging-functions.sh +++ b/eng/common/pipeline-logging-functions.sh @@ -203,4 +203,4 @@ function Write-PipelineSetResult { if [[ "$ci" == true ]]; then echo "##vso[task.complete result=$result;]$message" fi -} \ No newline at end of file +} diff --git a/eng/common/post-build/check-channel-consistency.ps1 b/eng/common/post-build/check-channel-consistency.ps1 new file mode 100644 index 000000000000..61208d2d1351 --- /dev/null +++ b/eng/common/post-build/check-channel-consistency.ps1 @@ -0,0 +1,48 @@ +param( + [Parameter(Mandatory=$true)][string] $PromoteToChannels, # List of channels that the build should be promoted to + [Parameter(Mandatory=$true)][array] $AvailableChannelIds # List of channel IDs available in the YAML implementation +) + +try { + $ErrorActionPreference = 'Stop' + Set-StrictMode -Version 2.0 + + # `tools.ps1` checks $ci to perform some actions. Since the post-build + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + $disableConfigureToolsetImport = $true + . $PSScriptRoot\..\tools.ps1 + + if ($PromoteToChannels -eq "") { + Write-PipelineTaskError -Type 'warning' -Message "This build won't publish assets as it's not configured to any Maestro channel. If that wasn't intended use Darc to configure a default channel using add-default-channel for this branch or to promote it to a channel using add-build-to-channel. See https://github.com/dotnet/arcade/blob/main/Documentation/Darc.md#assigning-an-individual-build-to-a-channel for more info." + ExitWithExitCode 0 + } + + # Check that every channel that Maestro told to promote the build to + # is available in YAML + $PromoteToChannelsIds = $PromoteToChannels -split "\D" | Where-Object { $_ } + + $hasErrors = $false + + foreach ($id in $PromoteToChannelsIds) { + if (($id -ne 0) -and ($id -notin $AvailableChannelIds)) { + Write-PipelineTaskError -Message "Channel $id is not present in the post-build YAML configuration! This is an error scenario. Please contact @dnceng." + $hasErrors = $true + } + } + + # The `Write-PipelineTaskError` doesn't error the script and we might report several errors + # in the previous lines. The check below makes sure that we return an error state from the + # script if we reported any validation error + if ($hasErrors) { + ExitWithExitCode 1 + } + + Write-Host 'done.' +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Category 'CheckChannelConsistency' -Message "There was an error while trying to check consistency of Maestro default channels for the build and post-build YAML configuration." + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/nuget-validation.ps1 b/eng/common/post-build/nuget-validation.ps1 new file mode 100644 index 000000000000..e5de00c89836 --- /dev/null +++ b/eng/common/post-build/nuget-validation.ps1 @@ -0,0 +1,22 @@ +# This script validates NuGet package metadata information using this +# tool: https://github.com/NuGet/NuGetGallery/tree/jver-verify/src/VerifyMicrosoftPackage + +param( + [Parameter(Mandatory=$true)][string] $PackagesPath # Path to where the packages to be validated are +) + +# `tools.ps1` checks $ci to perform some actions. Since the post-build +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true +$disableConfigureToolsetImport = $true +. $PSScriptRoot\..\tools.ps1 + +try { + & $PSScriptRoot\nuget-verification.ps1 ${PackagesPath}\*.nupkg +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'NuGetValidation' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/nuget-verification.ps1 b/eng/common/post-build/nuget-verification.ps1 new file mode 100644 index 000000000000..a365194a9389 --- /dev/null +++ b/eng/common/post-build/nuget-verification.ps1 @@ -0,0 +1,121 @@ +<# +.SYNOPSIS + Verifies that Microsoft NuGet packages have proper metadata. +.DESCRIPTION + Downloads a verification tool and runs metadata validation on the provided NuGet packages. This script writes an + error if any of the provided packages fail validation. All arguments provided to this PowerShell script that do not + match PowerShell parameters are passed on to the verification tool downloaded during the execution of this script. +.PARAMETER NuGetExePath + The path to the nuget.exe binary to use. If not provided, nuget.exe will be downloaded into the -DownloadPath + directory. +.PARAMETER PackageSource + The package source to use to download the verification tool. If not provided, nuget.org will be used. +.PARAMETER DownloadPath + The directory path to download the verification tool and nuget.exe to. If not provided, + %TEMP%\NuGet.VerifyNuGetPackage will be used. +.PARAMETER args + Arguments that will be passed to the verification tool. +.EXAMPLE + PS> .\verify.ps1 *.nupkg + Verifies the metadata of all .nupkg files in the currect working directory. +.EXAMPLE + PS> .\verify.ps1 --help + Displays the help text of the downloaded verifiction tool. +.LINK + https://github.com/NuGet/NuGetGallery/blob/master/src/VerifyMicrosoftPackage/README.md +#> + +# This script was copied from https://github.com/NuGet/NuGetGallery/blob/3e25ad135146676bcab0050a516939d9958bfa5d/src/VerifyMicrosoftPackage/verify.ps1 + +[CmdletBinding(PositionalBinding = $false)] +param( + [string]$NuGetExePath, + [string]$PackageSource = "https://api.nuget.org/v3/index.json", + [string]$DownloadPath, + [Parameter(ValueFromRemainingArguments = $true)] + [string[]]$args +) + +# The URL to download nuget.exe. +$nugetExeUrl = "https://dist.nuget.org/win-x86-commandline/v4.9.4/nuget.exe" + +# The package ID of the verification tool. +$packageId = "NuGet.VerifyMicrosoftPackage" + +# The location that nuget.exe and the verification tool will be downloaded to. +if (!$DownloadPath) { + $DownloadPath = (Join-Path $env:TEMP "NuGet.VerifyMicrosoftPackage") +} + +$fence = New-Object -TypeName string -ArgumentList '=', 80 + +# Create the download directory, if it doesn't already exist. +if (!(Test-Path $DownloadPath)) { + New-Item -ItemType Directory $DownloadPath | Out-Null +} +Write-Host "Using download path: $DownloadPath" + +if ($NuGetExePath) { + $nuget = $NuGetExePath +} else { + $downloadedNuGetExe = Join-Path $DownloadPath "nuget.exe" + + # Download nuget.exe, if it doesn't already exist. + if (!(Test-Path $downloadedNuGetExe)) { + Write-Host "Downloading nuget.exe from $nugetExeUrl..." + $ProgressPreference = 'SilentlyContinue' + try { + Invoke-WebRequest $nugetExeUrl -OutFile $downloadedNuGetExe + $ProgressPreference = 'Continue' + } catch { + $ProgressPreference = 'Continue' + Write-Error $_ + Write-Error "nuget.exe failed to download." + exit + } + } + + $nuget = $downloadedNuGetExe +} + +Write-Host "Using nuget.exe path: $nuget" +Write-Host " " + +# Download the latest version of the verification tool. +Write-Host "Downloading the latest version of $packageId from $packageSource..." +Write-Host $fence +& $nuget install $packageId ` + -Prerelease ` + -OutputDirectory $DownloadPath ` + -Source $PackageSource +Write-Host $fence +Write-Host " " + +if ($LASTEXITCODE -ne 0) { + Write-Error "nuget.exe failed to fetch the verify tool." + exit +} + +# Find the most recently downloaded tool +Write-Host "Finding the most recently downloaded verification tool." +$verifyProbePath = Join-Path $DownloadPath "$packageId.*" +$verifyPath = Get-ChildItem -Path $verifyProbePath -Directory ` + | Sort-Object -Property LastWriteTime -Descending ` + | Select-Object -First 1 +$verify = Join-Path $verifyPath "tools\NuGet.VerifyMicrosoftPackage.exe" +Write-Host "Using verification tool: $verify" +Write-Host " " + +# Execute the verification tool. +Write-Host "Executing the verify tool..." +Write-Host $fence +& $verify $args +Write-Host $fence +Write-Host " " + +# Respond to the exit code. +if ($LASTEXITCODE -ne 0) { + Write-Error "The verify tool found some problems." +} else { + Write-Output "The verify tool succeeded." +} diff --git a/eng/common/post-build/publish-using-darc.ps1 b/eng/common/post-build/publish-using-darc.ps1 new file mode 100644 index 000000000000..90b58e32a87b --- /dev/null +++ b/eng/common/post-build/publish-using-darc.ps1 @@ -0,0 +1,59 @@ +param( + [Parameter(Mandatory=$true)][int] $BuildId, + [Parameter(Mandatory=$true)][int] $PublishingInfraVersion, + [Parameter(Mandatory=$true)][string] $AzdoToken, + [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro.dot.net', + [Parameter(Mandatory=$true)][string] $WaitPublishingFinish, + [Parameter(Mandatory=$false)][string] $ArtifactsPublishingAdditionalParameters, + [Parameter(Mandatory=$false)][string] $SymbolPublishingAdditionalParameters +) + +try { + # `tools.ps1` checks $ci to perform some actions. Since the post-build + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + $disableConfigureToolsetImport = $true + . $PSScriptRoot\..\tools.ps1 + + $darc = Get-Darc + + $optionalParams = [System.Collections.ArrayList]::new() + + if ("" -ne $ArtifactsPublishingAdditionalParameters) { + $optionalParams.Add("--artifact-publishing-parameters") | Out-Null + $optionalParams.Add($ArtifactsPublishingAdditionalParameters) | Out-Null + } + + if ("" -ne $SymbolPublishingAdditionalParameters) { + $optionalParams.Add("--symbol-publishing-parameters") | Out-Null + $optionalParams.Add($SymbolPublishingAdditionalParameters) | Out-Null + } + + if ("false" -eq $WaitPublishingFinish) { + $optionalParams.Add("--no-wait") | Out-Null + } + + & $darc add-build-to-channel ` + --id $buildId ` + --publishing-infra-version $PublishingInfraVersion ` + --default-channels ` + --source-branch main ` + --azdev-pat "$AzdoToken" ` + --bar-uri "$MaestroApiEndPoint" ` + --ci ` + --verbose ` + @optionalParams + + if ($LastExitCode -ne 0) { + Write-Host "Problems using Darc to promote build ${buildId} to default channels. Stopping execution..." + exit 1 + } + + Write-Host 'done.' +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Category 'PromoteBuild' -Message "There was an error while trying to publish build '$BuildId' to default channels." + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/redact-logs.ps1 b/eng/common/post-build/redact-logs.ps1 new file mode 100644 index 000000000000..b7fc19591507 --- /dev/null +++ b/eng/common/post-build/redact-logs.ps1 @@ -0,0 +1,89 @@ +[CmdletBinding(PositionalBinding=$False)] +param( + [Parameter(Mandatory=$true, Position=0)][string] $InputPath, + [Parameter(Mandatory=$true)][string] $BinlogToolVersion, + [Parameter(Mandatory=$false)][string] $DotnetPath, + [Parameter(Mandatory=$false)][string] $PackageFeed = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json', + # File with strings to redact - separated by newlines. + # For comments start the line with '# ' - such lines are ignored + [Parameter(Mandatory=$false)][string] $TokensFilePath, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$TokensToRedact +) + +try { + $ErrorActionPreference = 'Stop' + Set-StrictMode -Version 2.0 + + # `tools.ps1` checks $ci to perform some actions. Since the post-build + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + $disableConfigureToolsetImport = $true + . $PSScriptRoot\..\tools.ps1 + + $packageName = 'binlogtool' + + $dotnet = $DotnetPath + + if (!$dotnet) { + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + } + + $toolList = & "$dotnet" tool list -g + + if ($toolList -like "*$packageName*") { + & "$dotnet" tool uninstall $packageName -g + } + + $toolPath = "$PSScriptRoot\..\..\..\.tools" + $verbosity = 'minimal' + + New-Item -ItemType Directory -Force -Path $toolPath + + Push-Location -Path $toolPath + + try { + Write-Host "Installing Binlog redactor CLI..." + Write-Host "'$dotnet' new tool-manifest" + & "$dotnet" new tool-manifest + Write-Host "'$dotnet' tool install $packageName --local --add-source '$PackageFeed' -v $verbosity --version $BinlogToolVersion" + & "$dotnet" tool install $packageName --local --add-source "$PackageFeed" -v $verbosity --version $BinlogToolVersion + + if (Test-Path $TokensFilePath) { + Write-Host "Adding additional sensitive data for redaction from file: " $TokensFilePath + $TokensToRedact += Get-Content -Path $TokensFilePath | Foreach {$_.Trim()} | Where { $_ -notmatch "^# " } + } + + $optionalParams = [System.Collections.ArrayList]::new() + + Foreach ($p in $TokensToRedact) + { + if($p -match '^\$\(.*\)$') + { + Write-Host ("Ignoring token {0} as it is probably unexpanded AzDO variable" -f $p) + } + elseif($p) + { + $optionalParams.Add("-p:" + $p) | Out-Null + } + } + + & $dotnet binlogtool redact --input:$InputPath --recurse --in-place ` + @optionalParams + + if ($LastExitCode -ne 0) { + Write-PipelineTelemetryError -Category 'Redactor' -Type 'warning' -Message "Problems using Redactor tool (exit code: $LastExitCode). But ignoring them now." + } + } + finally { + Pop-Location + } + + Write-Host 'done.' +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Category 'Redactor' -Message "There was an error while trying to redact logs. Error: $_" + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/sourcelink-validation.ps1 b/eng/common/post-build/sourcelink-validation.ps1 new file mode 100644 index 000000000000..1976ef70fb85 --- /dev/null +++ b/eng/common/post-build/sourcelink-validation.ps1 @@ -0,0 +1,327 @@ +param( + [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where Symbols.NuGet packages to be checked are stored + [Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation + [Parameter(Mandatory=$false)][string] $GHRepoName, # GitHub name of the repo including the Org. E.g., dotnet/arcade + [Parameter(Mandatory=$false)][string] $GHCommit, # GitHub commit SHA used to build the packages + [Parameter(Mandatory=$true)][string] $SourcelinkCliVersion # Version of SourceLink CLI to use +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +# `tools.ps1` checks $ci to perform some actions. Since the post-build +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true +$disableConfigureToolsetImport = $true +. $PSScriptRoot\..\tools.ps1 + +# Cache/HashMap (File -> Exist flag) used to consult whether a file exist +# in the repository at a specific commit point. This is populated by inserting +# all files present in the repo at a specific commit point. +$global:RepoFiles = @{} + +# Maximum number of jobs to run in parallel +$MaxParallelJobs = 16 + +$MaxRetries = 5 +$RetryWaitTimeInSeconds = 30 + +# Wait time between check for system load +$SecondsBetweenLoadChecks = 10 + +if (!$InputPath -or !(Test-Path $InputPath)){ + Write-Host "No files to validate." + ExitWithExitCode 0 +} + +$ValidatePackage = { + param( + [string] $PackagePath # Full path to a Symbols.NuGet package + ) + + . $using:PSScriptRoot\..\tools.ps1 + + # Ensure input file exist + if (!(Test-Path $PackagePath)) { + Write-Host "Input file does not exist: $PackagePath" + return [pscustomobject]@{ + result = 1 + packagePath = $PackagePath + } + } + + # Extensions for which we'll look for SourceLink information + # For now we'll only care about Portable & Embedded PDBs + $RelevantExtensions = @('.dll', '.exe', '.pdb') + + Write-Host -NoNewLine 'Validating ' ([System.IO.Path]::GetFileName($PackagePath)) '...' + + $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) + $ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId + $FailedFiles = 0 + + Add-Type -AssemblyName System.IO.Compression.FileSystem + + [System.IO.Directory]::CreateDirectory($ExtractPath) | Out-Null + + try { + $zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath) + + $zip.Entries | + Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} | + ForEach-Object { + $FileName = $_.FullName + $Extension = [System.IO.Path]::GetExtension($_.Name) + $FakeName = -Join((New-Guid), $Extension) + $TargetFile = Join-Path -Path $ExtractPath -ChildPath $FakeName + + # We ignore resource DLLs + if ($FileName.EndsWith('.resources.dll')) { + return [pscustomobject]@{ + result = 0 + packagePath = $PackagePath + } + } + + [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true) + + $ValidateFile = { + param( + [string] $FullPath, # Full path to the module that has to be checked + [string] $RealPath, + [ref] $FailedFiles + ) + + $sourcelinkExe = "$env:USERPROFILE\.dotnet\tools" + $sourcelinkExe = Resolve-Path "$sourcelinkExe\sourcelink.exe" + $SourceLinkInfos = & $sourcelinkExe print-urls $FullPath | Out-String + + if ($LASTEXITCODE -eq 0 -and -not ([string]::IsNullOrEmpty($SourceLinkInfos))) { + $NumFailedLinks = 0 + + # We only care about Http addresses + $Matches = (Select-String '(http[s]?)(:\/\/)([^\s,]+)' -Input $SourceLinkInfos -AllMatches).Matches + + if ($Matches.Count -ne 0) { + $Matches.Value | + ForEach-Object { + $Link = $_ + $CommitUrl = "https://raw.githubusercontent.com/${using:GHRepoName}/${using:GHCommit}/" + + $FilePath = $Link.Replace($CommitUrl, "") + $Status = 200 + $Cache = $using:RepoFiles + + $attempts = 0 + + while ($attempts -lt $using:MaxRetries) { + if ( !($Cache.ContainsKey($FilePath)) ) { + try { + $Uri = $Link -as [System.URI] + + if ($Link -match "submodules") { + # Skip submodule links until sourcelink properly handles submodules + $Status = 200 + } + elseif ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match 'github' -or $Uri.Host -match 'githubusercontent')) { + # Only GitHub links are valid + $Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode + } + else { + # If it's not a github link, we want to break out of the loop and not retry. + $Status = 0 + $attempts = $using:MaxRetries + } + } + catch { + Write-Host $_ + $Status = 0 + } + } + + if ($Status -ne 200) { + $attempts++ + + if ($attempts -lt $using:MaxRetries) + { + $attemptsLeft = $using:MaxRetries - $attempts + Write-Warning "Download failed, $attemptsLeft attempts remaining, will retry in $using:RetryWaitTimeInSeconds seconds" + Start-Sleep -Seconds $using:RetryWaitTimeInSeconds + } + else { + if ($NumFailedLinks -eq 0) { + if ($FailedFiles.Value -eq 0) { + Write-Host + } + + Write-Host "`tFile $RealPath has broken links:" + } + + Write-Host "`t`tFailed to retrieve $Link" + + $NumFailedLinks++ + } + } + else { + break + } + } + } + } + + if ($NumFailedLinks -ne 0) { + $FailedFiles.value++ + $global:LASTEXITCODE = 1 + } + } + } + + &$ValidateFile $TargetFile $FileName ([ref]$FailedFiles) + } + } + catch { + Write-Host $_ + } + finally { + $zip.Dispose() + } + + if ($FailedFiles -eq 0) { + Write-Host 'Passed.' + return [pscustomobject]@{ + result = 0 + packagePath = $PackagePath + } + } + else { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "$PackagePath has broken SourceLink links." + return [pscustomobject]@{ + result = 1 + packagePath = $PackagePath + } + } +} + +function CheckJobResult( + $result, + $packagePath, + [ref]$ValidationFailures, + [switch]$logErrors) { + if ($result -ne '0') { + if ($logErrors) { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "$packagePath has broken SourceLink links." + } + $ValidationFailures.Value++ + } +} + +function ValidateSourceLinkLinks { + if ($GHRepoName -ne '' -and !($GHRepoName -Match '^[^\s\/]+/[^\s\/]+$')) { + if (!($GHRepoName -Match '^[^\s-]+-[^\s]+$')) { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "GHRepoName should be in the format / or -. '$GHRepoName'" + ExitWithExitCode 1 + } + else { + $GHRepoName = $GHRepoName -replace '^([^\s-]+)-([^\s]+)$', '$1/$2'; + } + } + + if ($GHCommit -ne '' -and !($GHCommit -Match '^[0-9a-fA-F]{40}$')) { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "GHCommit should be a 40 chars hexadecimal string. '$GHCommit'" + ExitWithExitCode 1 + } + + if ($GHRepoName -ne '' -and $GHCommit -ne '') { + $RepoTreeURL = -Join('http://api.github.com/repos/', $GHRepoName, '/git/trees/', $GHCommit, '?recursive=1') + $CodeExtensions = @('.cs', '.vb', '.fs', '.fsi', '.fsx', '.fsscript') + + try { + # Retrieve the list of files in the repo at that particular commit point and store them in the RepoFiles hash + $Data = Invoke-WebRequest $RepoTreeURL -UseBasicParsing | ConvertFrom-Json | Select-Object -ExpandProperty tree + + foreach ($file in $Data) { + $Extension = [System.IO.Path]::GetExtension($file.path) + + if ($CodeExtensions.Contains($Extension)) { + $RepoFiles[$file.path] = 1 + } + } + } + catch { + Write-Host "Problems downloading the list of files from the repo. Url used: $RepoTreeURL . Execution will proceed without caching." + } + } + elseif ($GHRepoName -ne '' -or $GHCommit -ne '') { + Write-Host 'For using the http caching mechanism both GHRepoName and GHCommit should be informed.' + } + + if (Test-Path $ExtractPath) { + Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue + } + + $ValidationFailures = 0 + + # Process each NuGet package in parallel + Get-ChildItem "$InputPath\*.symbols.nupkg" | + ForEach-Object { + Write-Host "Starting $($_.FullName)" + Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName | Out-Null + $NumJobs = @(Get-Job -State 'Running').Count + + while ($NumJobs -ge $MaxParallelJobs) { + Write-Host "There are $NumJobs validation jobs running right now. Waiting $SecondsBetweenLoadChecks seconds to check again." + sleep $SecondsBetweenLoadChecks + $NumJobs = @(Get-Job -State 'Running').Count + } + + foreach ($Job in @(Get-Job -State 'Completed')) { + $jobResult = Wait-Job -Id $Job.Id | Receive-Job + CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures) -LogErrors + Remove-Job -Id $Job.Id + } + } + + foreach ($Job in @(Get-Job)) { + $jobResult = Wait-Job -Id $Job.Id | Receive-Job + CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures) + Remove-Job -Id $Job.Id + } + if ($ValidationFailures -gt 0) { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "$ValidationFailures package(s) failed validation." + ExitWithExitCode 1 + } +} + +function InstallSourcelinkCli { + $sourcelinkCliPackageName = 'sourcelink' + + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + $toolList = & "$dotnet" tool list --global + + if (($toolList -like "*$sourcelinkCliPackageName*") -and ($toolList -like "*$sourcelinkCliVersion*")) { + Write-Host "SourceLink CLI version $sourcelinkCliVersion is already installed." + } + else { + Write-Host "Installing SourceLink CLI version $sourcelinkCliVersion..." + Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.' + & "$dotnet" tool install $sourcelinkCliPackageName --version $sourcelinkCliVersion --verbosity "minimal" --global + } +} + +try { + InstallSourcelinkCli + + foreach ($Job in @(Get-Job)) { + Remove-Job -Id $Job.Id + } + + ValidateSourceLinkLinks +} +catch { + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'SourceLink' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/symbols-validation.ps1 b/eng/common/post-build/symbols-validation.ps1 new file mode 100644 index 000000000000..7146e593ffae --- /dev/null +++ b/eng/common/post-build/symbols-validation.ps1 @@ -0,0 +1,337 @@ +param( + [Parameter(Mandatory = $true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored + [Parameter(Mandatory = $true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation + [Parameter(Mandatory = $true)][string] $DotnetSymbolVersion, # Version of dotnet symbol to use + [Parameter(Mandatory = $false)][switch] $CheckForWindowsPdbs, # If we should check for the existence of windows pdbs in addition to portable PDBs + [Parameter(Mandatory = $false)][switch] $ContinueOnError, # If we should keep checking symbols after an error + [Parameter(Mandatory = $false)][switch] $Clean, # Clean extracted symbols directory after checking symbols + [Parameter(Mandatory = $false)][string] $SymbolExclusionFile # Exclude the symbols in the file from publishing to symbol server +) + +. $PSScriptRoot\..\tools.ps1 +# Maximum number of jobs to run in parallel +$MaxParallelJobs = 16 + +# Max number of retries +$MaxRetry = 5 + +# Wait time between check for system load +$SecondsBetweenLoadChecks = 10 + +# Set error codes +Set-Variable -Name "ERROR_BADEXTRACT" -Option Constant -Value -1 +Set-Variable -Name "ERROR_FILEDOESNOTEXIST" -Option Constant -Value -2 + +$WindowsPdbVerificationParam = "" +if ($CheckForWindowsPdbs) { + $WindowsPdbVerificationParam = "--windows-pdbs" +} + +$ExclusionSet = New-Object System.Collections.Generic.HashSet[string]; + +if (!$InputPath -or !(Test-Path $InputPath)){ + Write-Host "No symbols to validate." + ExitWithExitCode 0 +} + +#Check if the path exists +if ($SymbolExclusionFile -and (Test-Path $SymbolExclusionFile)){ + [string[]]$Exclusions = Get-Content "$SymbolExclusionFile" + $Exclusions | foreach { if($_ -and $_.Trim()){$ExclusionSet.Add($_)} } +} +else{ + Write-Host "Symbol Exclusion file does not exists. No symbols to exclude." +} + +$CountMissingSymbols = { + param( + [string] $PackagePath, # Path to a NuGet package + [string] $WindowsPdbVerificationParam # If we should check for the existence of windows pdbs in addition to portable PDBs + ) + + Add-Type -AssemblyName System.IO.Compression.FileSystem + + Write-Host "Validating $PackagePath " + + # Ensure input file exist + if (!(Test-Path $PackagePath)) { + Write-PipelineTaskError "Input file does not exist: $PackagePath" + return [pscustomobject]@{ + result = $using:ERROR_FILEDOESNOTEXIST + packagePath = $PackagePath + } + } + + # Extensions for which we'll look for symbols + $RelevantExtensions = @('.dll', '.exe', '.so', '.dylib') + + # How many files are missing symbol information + $MissingSymbols = 0 + + $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) + $PackageGuid = New-Guid + $ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageGuid + $SymbolsPath = Join-Path -Path $ExtractPath -ChildPath 'Symbols' + + try { + [System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath) + } + catch { + Write-Host "Something went wrong extracting $PackagePath" + Write-Host $_ + return [pscustomobject]@{ + result = $using:ERROR_BADEXTRACT + packagePath = $PackagePath + } + } + + Get-ChildItem -Recurse $ExtractPath | + Where-Object { $RelevantExtensions -contains $_.Extension } | + ForEach-Object { + $FileName = $_.FullName + if ($FileName -Match '\\ref\\') { + Write-Host "`t Ignoring reference assembly file " $FileName + return + } + + $FirstMatchingSymbolDescriptionOrDefault = { + param( + [string] $FullPath, # Full path to the module that has to be checked + [string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols + [string] $WindowsPdbVerificationParam, # Parameter to pass to potential check for windows-pdbs. + [string] $SymbolsPath + ) + + $FileName = [System.IO.Path]::GetFileName($FullPath) + $Extension = [System.IO.Path]::GetExtension($FullPath) + + # Those below are potential symbol files that the `dotnet symbol` might + # return. Which one will be returned depend on the type of file we are + # checking and which type of file was uploaded. + + # The file itself is returned + $SymbolPath = $SymbolsPath + '\' + $FileName + + # PDB file for the module + $PdbPath = $SymbolPath.Replace($Extension, '.pdb') + + # PDB file for R2R module (created by crossgen) + $NGenPdb = $SymbolPath.Replace($Extension, '.ni.pdb') + + # DBG file for a .so library + $SODbg = $SymbolPath.Replace($Extension, '.so.dbg') + + # DWARF file for a .dylib + $DylibDwarf = $SymbolPath.Replace($Extension, '.dylib.dwarf') + + $dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools" + $dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe" + + $totalRetries = 0 + + while ($totalRetries -lt $using:MaxRetry) { + + # Save the output and get diagnostic output + $output = & $dotnetSymbolExe --symbols --modules $WindowsPdbVerificationParam $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String + + if ((Test-Path $PdbPath) -and (Test-path $SymbolPath)) { + return 'Module and PDB for Module' + } + elseif ((Test-Path $NGenPdb) -and (Test-Path $PdbPath) -and (Test-Path $SymbolPath)) { + return 'Dll, PDB and NGen PDB' + } + elseif ((Test-Path $SODbg) -and (Test-Path $SymbolPath)) { + return 'So and DBG for SO' + } + elseif ((Test-Path $DylibDwarf) -and (Test-Path $SymbolPath)) { + return 'Dylib and Dwarf for Dylib' + } + elseif (Test-Path $SymbolPath) { + return 'Module' + } + else + { + $totalRetries++ + } + } + + return $null + } + + $FileRelativePath = $FileName.Replace("$ExtractPath\", "") + if (($($using:ExclusionSet) -ne $null) -and ($($using:ExclusionSet).Contains($FileRelativePath) -or ($($using:ExclusionSet).Contains($FileRelativePath.Replace("\", "/"))))){ + Write-Host "Skipping $FileName from symbol validation" + } + + else { + $FileGuid = New-Guid + $ExpandedSymbolsPath = Join-Path -Path $SymbolsPath -ChildPath $FileGuid + + $SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault ` + -FullPath $FileName ` + -TargetServerParam '--microsoft-symbol-server' ` + -SymbolsPath "$ExpandedSymbolsPath-msdl" ` + -WindowsPdbVerificationParam $WindowsPdbVerificationParam + $SymbolsOnSymWeb = & $FirstMatchingSymbolDescriptionOrDefault ` + -FullPath $FileName ` + -TargetServerParam '--internal-server' ` + -SymbolsPath "$ExpandedSymbolsPath-symweb" ` + -WindowsPdbVerificationParam $WindowsPdbVerificationParam + + Write-Host -NoNewLine "`t Checking file " $FileName "... " + + if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) { + Write-Host "Symbols found on MSDL ($SymbolsOnMSDL) and SymWeb ($SymbolsOnSymWeb)" + } + else { + $MissingSymbols++ + + if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) { + Write-Host 'No symbols found on MSDL or SymWeb!' + } + else { + if ($SymbolsOnMSDL -eq $null) { + Write-Host 'No symbols found on MSDL!' + } + else { + Write-Host 'No symbols found on SymWeb!' + } + } + } + } + } + + if ($using:Clean) { + Remove-Item $ExtractPath -Recurse -Force + } + + Pop-Location + + return [pscustomobject]@{ + result = $MissingSymbols + packagePath = $PackagePath + } +} + +function CheckJobResult( + $result, + $packagePath, + [ref]$DupedSymbols, + [ref]$TotalFailures) { + if ($result -eq $ERROR_BADEXTRACT) { + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath has duplicated symbol files" + $DupedSymbols.Value++ + } + elseif ($result -eq $ERROR_FILEDOESNOTEXIST) { + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath does not exist" + $TotalFailures.Value++ + } + elseif ($result -gt '0') { + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $result modules in the package $packagePath" + $TotalFailures.Value++ + } + else { + Write-Host "All symbols verified for package $packagePath" + } +} + +function CheckSymbolsAvailable { + if (Test-Path $ExtractPath) { + Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue + } + + $TotalPackages = 0 + $TotalFailures = 0 + $DupedSymbols = 0 + + Get-ChildItem "$InputPath\*.nupkg" | + ForEach-Object { + $FileName = $_.Name + $FullName = $_.FullName + + # These packages from Arcade-Services include some native libraries that + # our current symbol uploader can't handle. Below is a workaround until + # we get issue: https://github.com/dotnet/arcade/issues/2457 sorted. + if ($FileName -Match 'Microsoft\.DotNet\.Darc\.') { + Write-Host "Ignoring Arcade-services file: $FileName" + Write-Host + return + } + elseif ($FileName -Match 'Microsoft\.DotNet\.Maestro\.Tasks\.') { + Write-Host "Ignoring Arcade-services file: $FileName" + Write-Host + return + } + + $TotalPackages++ + + Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList @($FullName,$WindowsPdbVerificationParam) | Out-Null + + $NumJobs = @(Get-Job -State 'Running').Count + + while ($NumJobs -ge $MaxParallelJobs) { + Write-Host "There are $NumJobs validation jobs running right now. Waiting $SecondsBetweenLoadChecks seconds to check again." + sleep $SecondsBetweenLoadChecks + $NumJobs = @(Get-Job -State 'Running').Count + } + + foreach ($Job in @(Get-Job -State 'Completed')) { + $jobResult = Wait-Job -Id $Job.Id | Receive-Job + CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$DupedSymbols) ([ref]$TotalFailures) + Remove-Job -Id $Job.Id + } + Write-Host + } + + foreach ($Job in @(Get-Job)) { + $jobResult = Wait-Job -Id $Job.Id | Receive-Job + CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$DupedSymbols) ([ref]$TotalFailures) + } + + if ($TotalFailures -gt 0 -or $DupedSymbols -gt 0) { + if ($TotalFailures -gt 0) { + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Symbols missing for $TotalFailures/$TotalPackages packages" + } + + if ($DupedSymbols -gt 0) { + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$DupedSymbols/$TotalPackages packages had duplicated symbol files and could not be extracted" + } + + ExitWithExitCode 1 + } + else { + Write-Host "All symbols validated!" + } +} + +function InstallDotnetSymbol { + $dotnetSymbolPackageName = 'dotnet-symbol' + + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + $toolList = & "$dotnet" tool list --global + + if (($toolList -like "*$dotnetSymbolPackageName*") -and ($toolList -like "*$dotnetSymbolVersion*")) { + Write-Host "dotnet-symbol version $dotnetSymbolVersion is already installed." + } + else { + Write-Host "Installing dotnet-symbol version $dotnetSymbolVersion..." + Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.' + & "$dotnet" tool install $dotnetSymbolPackageName --version $dotnetSymbolVersion --verbosity "minimal" --global + } +} + +try { + InstallDotnetSymbol + + foreach ($Job in @(Get-Job)) { + Remove-Job -Id $Job.Id + } + + CheckSymbolsAvailable +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/retain-build.ps1 b/eng/common/retain-build.ps1 new file mode 100644 index 000000000000..e7ba975adeb6 --- /dev/null +++ b/eng/common/retain-build.ps1 @@ -0,0 +1,45 @@ + +Param( +[Parameter(Mandatory=$true)][int] $buildId, +[Parameter(Mandatory=$true)][string] $azdoOrgUri, +[Parameter(Mandatory=$true)][string] $azdoProject, +[Parameter(Mandatory=$true)][string] $token +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +function Get-AzDOHeaders( + [string] $token) +{ + $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":${token}")) + $headers = @{"Authorization"="Basic $base64AuthInfo"} + return $headers +} + +function Update-BuildRetention( + [string] $azdoOrgUri, + [string] $azdoProject, + [int] $buildId, + [string] $token) +{ + $headers = Get-AzDOHeaders -token $token + $requestBody = "{ + `"keepForever`": `"true`" + }" + + $requestUri = "${azdoOrgUri}/${azdoProject}/_apis/build/builds/${buildId}?api-version=6.0" + write-Host "Attempting to retain build using the following URI: ${requestUri} ..." + + try { + Invoke-RestMethod -Uri $requestUri -Method Patch -Body $requestBody -Header $headers -contentType "application/json" + Write-Host "Updated retention settings for build ${buildId}." + } + catch { + Write-Error "Failed to update retention settings for build: $_.Exception.Response.StatusDescription" + exit 1 + } +} + +Update-BuildRetention -azdoOrgUri $azdoOrgUri -azdoProject $azdoProject -buildId $buildId -token $token +exit 0 diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 new file mode 100644 index 000000000000..aab40de3fd9a --- /dev/null +++ b/eng/common/sdk-task.ps1 @@ -0,0 +1,97 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string] $configuration = 'Debug', + [string] $task, + [string] $verbosity = 'minimal', + [string] $msbuildEngine = $null, + [switch] $restore, + [switch] $prepareMachine, + [switch] $help, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties +) + +$ci = $true +$binaryLog = $true +$warnAsError = $true + +. $PSScriptRoot\tools.ps1 + +function Print-Usage() { + Write-Host "Common settings:" + Write-Host " -task Name of Arcade task (name of a project in SdkTasks directory of the Arcade SDK package)" + Write-Host " -restore Restore dependencies" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Advanced settings:" + Write-Host " -prepareMachine Prepare machine for CI run" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host "" + Write-Host "Command line arguments not listed above are passed thru to msbuild." +} + +function Build([string]$target) { + $logSuffix = if ($target -eq 'Execute') { '' } else { ".$target" } + $log = Join-Path $LogDir "$task$logSuffix.binlog" + $outputPath = Join-Path $ToolsetDir "$task\" + + MSBuild $taskProject ` + /bl:$log ` + /t:$target ` + /p:Configuration=$configuration ` + /p:RepoRoot=$RepoRoot ` + /p:BaseIntermediateOutputPath=$outputPath ` + /v:$verbosity ` + @properties +} + +try { + if ($help -or (($null -ne $properties) -and ($properties.Contains('/help') -or $properties.Contains('/?')))) { + Print-Usage + exit 0 + } + + if ($task -eq "") { + Write-PipelineTelemetryError -Category 'Build' -Message "Missing required parameter '-task '" + Print-Usage + ExitWithExitCode 1 + } + + if( $msbuildEngine -eq "vs") { + # Ensure desktop MSBuild is available for sdk tasks. + if( -not ($GlobalJson.tools.PSObject.Properties.Name -contains "vs" )) { + $GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty + } + if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) { + $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.10.0-pre.4.0" -MemberType NoteProperty + } + if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") { + $xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true + } + if ($xcopyMSBuildToolsFolder -eq $null) { + throw 'Unable to get xcopy downloadable version of msbuild' + } + + $global:_MSBuildExe = "$($xcopyMSBuildToolsFolder)\MSBuild\Current\Bin\MSBuild.exe" + } + + $taskProject = GetSdkTaskProject $task + if (!(Test-Path $taskProject)) { + Write-PipelineTelemetryError -Category 'Build' -Message "Unknown task: $task" + ExitWithExitCode 1 + } + + if ($restore) { + Build 'Restore' + } + + Build 'Execute' +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Build' -Message $_ + ExitWithExitCode 1 +} + +ExitWithExitCode 0 diff --git a/eng/common/sdl/NuGet.config b/eng/common/sdl/NuGet.config new file mode 100644 index 000000000000..3849bdb3cf51 --- /dev/null +++ b/eng/common/sdl/NuGet.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/eng/common/sdl/configure-sdl-tool.ps1 b/eng/common/sdl/configure-sdl-tool.ps1 new file mode 100644 index 000000000000..27f5a4115fc7 --- /dev/null +++ b/eng/common/sdl/configure-sdl-tool.ps1 @@ -0,0 +1,130 @@ +Param( + [string] $GuardianCliLocation, + [string] $WorkingDirectory, + [string] $TargetDirectory, + [string] $GdnFolder, + # The list of Guardian tools to configure. For each object in the array: + # - If the item is a [hashtable], it must contain these entries: + # - Name = The tool name as Guardian knows it. + # - Scenario = (Optional) Scenario-specific name for this configuration entry. It must be unique + # among all tool entries with the same Name. + # - Args = (Optional) Array of Guardian tool configuration args, like '@("Target > C:\temp")' + # - If the item is a [string] $v, it is treated as '@{ Name="$v" }' + [object[]] $ToolsList, + [string] $GuardianLoggerLevel='Standard', + # Optional: Additional params to add to any tool using CredScan. + [string[]] $CrScanAdditionalRunConfigParams, + # Optional: Additional params to add to any tool using PoliCheck. + [string[]] $PoliCheckAdditionalRunConfigParams, + # Optional: Additional params to add to any tool using CodeQL/Semmle. + [string[]] $CodeQLAdditionalRunConfigParams, + # Optional: Additional params to add to any tool using Binskim. + [string[]] $BinskimAdditionalRunConfigParams +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 +$disableConfigureToolsetImport = $true +$global:LASTEXITCODE = 0 + +try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + # Normalize tools list: all in [hashtable] form with defined values for each key. + $ToolsList = $ToolsList | + ForEach-Object { + if ($_ -is [string]) { + $_ = @{ Name = $_ } + } + + if (-not ($_['Scenario'])) { $_.Scenario = "" } + if (-not ($_['Args'])) { $_.Args = @() } + $_ + } + + Write-Host "List of tools to configure:" + $ToolsList | ForEach-Object { $_ | Out-String | Write-Host } + + # We store config files in the r directory of .gdn + $gdnConfigPath = Join-Path $GdnFolder 'r' + $ValidPath = Test-Path $GuardianCliLocation + + if ($ValidPath -eq $False) + { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Invalid Guardian CLI Location." + ExitWithExitCode 1 + } + + foreach ($tool in $ToolsList) { + # Put together the name and scenario to make a unique key. + $toolConfigName = $tool.Name + if ($tool.Scenario) { + $toolConfigName += "_" + $tool.Scenario + } + + Write-Host "=== Configuring $toolConfigName..." + + $gdnConfigFile = Join-Path $gdnConfigPath "$toolConfigName-configure.gdnconfig" + + # For some tools, add default and automatic args. + switch -Exact ($tool.Name) { + 'credscan' { + if ($targetDirectory) { + $tool.Args += "`"TargetDirectory < $TargetDirectory`"" + } + $tool.Args += "`"OutputType < pre`"" + $tool.Args += $CrScanAdditionalRunConfigParams + } + 'policheck' { + if ($targetDirectory) { + $tool.Args += "`"Target < $TargetDirectory`"" + } + $tool.Args += $PoliCheckAdditionalRunConfigParams + } + {$_ -in 'semmle', 'codeql'} { + if ($targetDirectory) { + $tool.Args += "`"SourceCodeDirectory < $TargetDirectory`"" + } + $tool.Args += $CodeQLAdditionalRunConfigParams + } + 'binskim' { + if ($targetDirectory) { + # Binskim crashes due to specific PDBs. GitHub issue: https://github.com/microsoft/binskim/issues/924. + # We are excluding all `_.pdb` files from the scan. + $tool.Args += "`"Target < $TargetDirectory\**;-:file|$TargetDirectory\**\_.pdb`"" + } + $tool.Args += $BinskimAdditionalRunConfigParams + } + } + + # Create variable pointing to the args array directly so we can use splat syntax later. + $toolArgs = $tool.Args + + # Configure the tool. If args array is provided or the current tool has some default arguments + # defined, add "--args" and splat each element on the end. Arg format is "{Arg id} < {Value}", + # one per parameter. Doc page for "guardian configure": + # https://dev.azure.com/securitytools/SecurityIntegration/_wiki/wikis/Guardian/1395/configure + Exec-BlockVerbosely { + & $GuardianCliLocation configure ` + --working-directory $WorkingDirectory ` + --tool $tool.Name ` + --output-path $gdnConfigFile ` + --logger-level $GuardianLoggerLevel ` + --noninteractive ` + --force ` + $(if ($toolArgs) { "--args" }) @toolArgs + Exit-IfNZEC "Sdl" + } + + Write-Host "Created '$toolConfigName' configuration file: $gdnConfigFile" + } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/execute-all-sdl-tools.ps1 b/eng/common/sdl/execute-all-sdl-tools.ps1 new file mode 100644 index 000000000000..4715d75e974d --- /dev/null +++ b/eng/common/sdl/execute-all-sdl-tools.ps1 @@ -0,0 +1,167 @@ +Param( + [string] $GuardianPackageName, # Required: the name of guardian CLI package (not needed if GuardianCliLocation is specified) + [string] $NugetPackageDirectory, # Required: directory where NuGet packages are installed (not needed if GuardianCliLocation is specified) + [string] $GuardianCliLocation, # Optional: Direct location of Guardian CLI executable if GuardianPackageName & NugetPackageDirectory are not specified + [string] $Repository=$env:BUILD_REPOSITORY_NAME, # Required: the name of the repository (e.g. dotnet/arcade) + [string] $BranchName=$env:BUILD_SOURCEBRANCH, # Optional: name of branch or version of gdn settings; defaults to master + [string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY, # Required: the directory where source files are located + [string] $ArtifactsDirectory = (Join-Path $env:BUILD_ARTIFACTSTAGINGDIRECTORY ('artifacts')), # Required: the directory where build artifacts are located + [string] $AzureDevOpsAccessToken, # Required: access token for dnceng; should be provided via KeyVault + + # Optional: list of SDL tools to run on source code. See 'configure-sdl-tool.ps1' for tools list + # format. + [object[]] $SourceToolsList, + # Optional: list of SDL tools to run on built artifacts. See 'configure-sdl-tool.ps1' for tools + # list format. + [object[]] $ArtifactToolsList, + # Optional: list of SDL tools to run without automatically specifying a target directory. See + # 'configure-sdl-tool.ps1' for tools list format. + [object[]] $CustomToolsList, + + [bool] $TsaPublish=$False, # Optional: true will publish results to TSA; only set to true after onboarding to TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaBranchName=$env:BUILD_SOURCEBRANCH, # Optional: required for TSA publish; defaults to $(Build.SourceBranchName); TSA is the automated framework used to upload test results as bugs. + [string] $TsaRepositoryName=$env:BUILD_REPOSITORY_NAME, # Optional: TSA repository name; will be generated automatically if not submitted; TSA is the automated framework used to upload test results as bugs. + [string] $BuildNumber=$env:BUILD_BUILDNUMBER, # Optional: required for TSA publish; defaults to $(Build.BuildNumber) + [bool] $UpdateBaseline=$False, # Optional: if true, will update the baseline in the repository; should only be run after fixing any issues which need to be fixed + [bool] $TsaOnboard=$False, # Optional: if true, will onboard the repository to TSA; should only be run once; TSA is the automated framework used to upload test results as bugs. + [string] $TsaInstanceUrl, # Optional: only needed if TsaOnboard or TsaPublish is true; the instance-url registered with TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaCodebaseName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the codebase registered with TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaProjectName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the project registered with TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaNotificationEmail, # Optional: only needed if TsaOnboard is true; the email(s) which will receive notifications of TSA bug filings (e.g. alias@microsoft.com); TSA is the automated framework used to upload test results as bugs. + [string] $TsaCodebaseAdmin, # Optional: only needed if TsaOnboard is true; the aliases which are admins of the TSA codebase (e.g. DOMAIN\alias); TSA is the automated framework used to upload test results as bugs. + [string] $TsaBugAreaPath, # Optional: only needed if TsaOnboard is true; the area path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs. + [string] $TsaIterationPath, # Optional: only needed if TsaOnboard is true; the iteration path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs. + [string] $GuardianLoggerLevel='Standard', # Optional: the logger level for the Guardian CLI; options are Trace, Verbose, Standard, Warning, and Error + [string[]] $CrScanAdditionalRunConfigParams, # Optional: Additional Params to custom build a CredScan run config in the format @("xyz:abc","sdf:1") + [string[]] $PoliCheckAdditionalRunConfigParams, # Optional: Additional Params to custom build a Policheck run config in the format @("xyz:abc","sdf:1") + [string[]] $CodeQLAdditionalRunConfigParams, # Optional: Additional Params to custom build a Semmle/CodeQL run config in the format @("xyz < abc","sdf < 1") + [string[]] $BinskimAdditionalRunConfigParams, # Optional: Additional Params to custom build a Binskim run config in the format @("xyz < abc","sdf < 1") + [bool] $BreakOnFailure=$False # Optional: Fail the build if there were errors during the run +) + +try { + $ErrorActionPreference = 'Stop' + Set-StrictMode -Version 2.0 + $disableConfigureToolsetImport = $true + $global:LASTEXITCODE = 0 + + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + #Replace repo names to the format of org/repo + if (!($Repository.contains('/'))) { + $RepoName = $Repository -replace '(.*?)-(.*)', '$1/$2'; + } + else{ + $RepoName = $Repository; + } + + if ($GuardianPackageName) { + $guardianCliLocation = Join-Path $NugetPackageDirectory (Join-Path $GuardianPackageName (Join-Path 'tools' 'guardian.cmd')) + } else { + $guardianCliLocation = $GuardianCliLocation + } + + $workingDirectory = (Split-Path $SourceDirectory -Parent) + $ValidPath = Test-Path $guardianCliLocation + + if ($ValidPath -eq $False) + { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Invalid Guardian CLI Location.' + ExitWithExitCode 1 + } + + Exec-BlockVerbosely { + & $(Join-Path $PSScriptRoot 'init-sdl.ps1') -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $workingDirectory -AzureDevOpsAccessToken $AzureDevOpsAccessToken -GuardianLoggerLevel $GuardianLoggerLevel + } + $gdnFolder = Join-Path $workingDirectory '.gdn' + + if ($TsaOnboard) { + if ($TsaCodebaseName -and $TsaNotificationEmail -and $TsaCodebaseAdmin -and $TsaBugAreaPath) { + Exec-BlockVerbosely { + & $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + } + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-onboard failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + } else { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Could not onboard to TSA -- not all required values ($TsaCodebaseName, $TsaNotificationEmail, $TsaCodebaseAdmin, $TsaBugAreaPath) were specified.' + ExitWithExitCode 1 + } + } + + # Configure a list of tools with a default target directory. Populates the ".gdn/r" directory. + function Configure-ToolsList([object[]] $tools, [string] $targetDirectory) { + if ($tools -and $tools.Count -gt 0) { + Exec-BlockVerbosely { + & $(Join-Path $PSScriptRoot 'configure-sdl-tool.ps1') ` + -GuardianCliLocation $guardianCliLocation ` + -WorkingDirectory $workingDirectory ` + -TargetDirectory $targetDirectory ` + -GdnFolder $gdnFolder ` + -ToolsList $tools ` + -AzureDevOpsAccessToken $AzureDevOpsAccessToken ` + -GuardianLoggerLevel $GuardianLoggerLevel ` + -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams ` + -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams ` + -CodeQLAdditionalRunConfigParams $CodeQLAdditionalRunConfigParams ` + -BinskimAdditionalRunConfigParams $BinskimAdditionalRunConfigParams + if ($BreakOnFailure) { + Exit-IfNZEC "Sdl" + } + } + } + } + + # Configure Artifact and Source tools with default Target directories. + Configure-ToolsList $ArtifactToolsList $ArtifactsDirectory + Configure-ToolsList $SourceToolsList $SourceDirectory + # Configure custom tools with no default Target directory. + Configure-ToolsList $CustomToolsList $null + + # At this point, all tools are configured in the ".gdn" directory. Run them all in a single call. + # (If we used "run" multiple times, each run would overwrite data from earlier runs.) + Exec-BlockVerbosely { + & $(Join-Path $PSScriptRoot 'run-sdl.ps1') ` + -GuardianCliLocation $guardianCliLocation ` + -WorkingDirectory $SourceDirectory ` + -UpdateBaseline $UpdateBaseline ` + -GdnFolder $gdnFolder + } + + if ($TsaPublish) { + if ($TsaBranchName -and $BuildNumber) { + if (-not $TsaRepositoryName) { + $TsaRepositoryName = "$($Repository)-$($BranchName)" + } + Exec-BlockVerbosely { + & $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --onboard $True --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + } + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-publish failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + } else { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Could not publish to TSA -- not all required values ($TsaBranchName, $BuildNumber) were specified.' + ExitWithExitCode 1 + } + } + + if ($BreakOnFailure) { + Write-Host "Failing the build in case of breaking results..." + Exec-BlockVerbosely { + & $guardianCliLocation break --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + } + } else { + Write-Host "Letting the build pass even if there were breaking results..." + } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + exit 1 +} diff --git a/eng/common/sdl/extract-artifact-archives.ps1 b/eng/common/sdl/extract-artifact-archives.ps1 new file mode 100644 index 000000000000..68da4fbf2571 --- /dev/null +++ b/eng/common/sdl/extract-artifact-archives.ps1 @@ -0,0 +1,63 @@ +# This script looks for each archive file in a directory and extracts it into the target directory. +# For example, the file "$InputPath/bin.tar.gz" extracts to "$ExtractPath/bin.tar.gz.extracted/**". +# Uses the "tar" utility added to Windows 10 / Windows 2019 that supports tar.gz and zip. +param( + # Full path to directory where archives are stored. + [Parameter(Mandatory=$true)][string] $InputPath, + # Full path to directory to extract archives into. May be the same as $InputPath. + [Parameter(Mandatory=$true)][string] $ExtractPath +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +$disableConfigureToolsetImport = $true + +try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + Measure-Command { + $jobs = @() + + # Find archive files for non-Windows and Windows builds. + $archiveFiles = @( + Get-ChildItem (Join-Path $InputPath "*.tar.gz") + Get-ChildItem (Join-Path $InputPath "*.zip") + ) + + foreach ($targzFile in $archiveFiles) { + $jobs += Start-Job -ScriptBlock { + $file = $using:targzFile + $fileName = [System.IO.Path]::GetFileName($file) + $extractDir = Join-Path $using:ExtractPath "$fileName.extracted" + + New-Item $extractDir -ItemType Directory -Force | Out-Null + + Write-Host "Extracting '$file' to '$extractDir'..." + + # Pipe errors to stdout to prevent PowerShell detecting them and quitting the job early. + # This type of quit skips the catch, so we wouldn't be able to tell which file triggered the + # error. Save output so it can be stored in the exception string along with context. + $output = tar -xf $file -C $extractDir 2>&1 + # Handle NZEC manually rather than using Exit-IfNZEC: we are in a background job, so we + # don't have access to the outer scope. + if ($LASTEXITCODE -ne 0) { + throw "Error extracting '$file': non-zero exit code ($LASTEXITCODE). Output: '$output'" + } + + Write-Host "Extracted to $extractDir" + } + } + + Receive-Job $jobs -Wait + } +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/extract-artifact-packages.ps1 b/eng/common/sdl/extract-artifact-packages.ps1 new file mode 100644 index 000000000000..f031ed5b25e9 --- /dev/null +++ b/eng/common/sdl/extract-artifact-packages.ps1 @@ -0,0 +1,82 @@ +param( + [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where artifact packages are stored + [Parameter(Mandatory=$true)][string] $ExtractPath # Full path to directory where the packages will be extracted +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +$disableConfigureToolsetImport = $true + +function ExtractArtifacts { + if (!(Test-Path $InputPath)) { + Write-Host "Input Path does not exist: $InputPath" + ExitWithExitCode 0 + } + $Jobs = @() + Get-ChildItem "$InputPath\*.nupkg" | + ForEach-Object { + $Jobs += Start-Job -ScriptBlock $ExtractPackage -ArgumentList $_.FullName + } + + foreach ($Job in $Jobs) { + Wait-Job -Id $Job.Id | Receive-Job + } +} + +try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + $ExtractPackage = { + param( + [string] $PackagePath # Full path to a NuGet package + ) + + if (!(Test-Path $PackagePath)) { + Write-PipelineTelemetryError -Category 'Build' -Message "Input file does not exist: $PackagePath" + ExitWithExitCode 1 + } + + $RelevantExtensions = @('.dll', '.exe', '.pdb') + Write-Host -NoNewLine 'Extracting ' ([System.IO.Path]::GetFileName($PackagePath)) '...' + + $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) + $ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId + + Add-Type -AssemblyName System.IO.Compression.FileSystem + + [System.IO.Directory]::CreateDirectory($ExtractPath); + + try { + $zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath) + + $zip.Entries | + Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} | + ForEach-Object { + $TargetPath = Join-Path -Path $ExtractPath -ChildPath (Split-Path -Path $_.FullName) + [System.IO.Directory]::CreateDirectory($TargetPath); + + $TargetFile = Join-Path -Path $ExtractPath -ChildPath $_.FullName + [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile) + } + } + catch { + Write-Host $_ + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 + } + finally { + $zip.Dispose() + } + } + Measure-Command { ExtractArtifacts } +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/init-sdl.ps1 b/eng/common/sdl/init-sdl.ps1 new file mode 100644 index 000000000000..3ac1d92b3700 --- /dev/null +++ b/eng/common/sdl/init-sdl.ps1 @@ -0,0 +1,55 @@ +Param( + [string] $GuardianCliLocation, + [string] $Repository, + [string] $BranchName='master', + [string] $WorkingDirectory, + [string] $AzureDevOpsAccessToken, + [string] $GuardianLoggerLevel='Standard' +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 +$disableConfigureToolsetImport = $true +$global:LASTEXITCODE = 0 + +# `tools.ps1` checks $ci to perform some actions. Since the SDL +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true +. $PSScriptRoot\..\tools.ps1 + +# Don't display the console progress UI - it's a huge perf hit +$ProgressPreference = 'SilentlyContinue' + +# Construct basic auth from AzDO access token; construct URI to the repository's gdn folder stored in that repository; construct location of zip file +$encodedPat = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$AzureDevOpsAccessToken")) +$escapedRepository = [Uri]::EscapeDataString("/$Repository/$BranchName/.gdn") +$uri = "https://dev.azure.com/dnceng/internal/_apis/git/repositories/sdl-tool-cfg/Items?path=$escapedRepository&versionDescriptor[versionOptions]=0&`$format=zip&api-version=5.0" +$zipFile = "$WorkingDirectory/gdn.zip" + +Add-Type -AssemblyName System.IO.Compression.FileSystem +$gdnFolder = (Join-Path $WorkingDirectory '.gdn') + +try { + # if the folder does not exist, we'll do a guardian init and push it to the remote repository + Write-Host 'Initializing Guardian...' + Write-Host "$GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel" + & $GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Build' -Message "Guardian init failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + # We create the mainbaseline so it can be edited later + Write-Host "$GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline" + & $GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Build' -Message "Guardian baseline failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + ExitWithExitCode 0 +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/packages.config b/eng/common/sdl/packages.config new file mode 100644 index 000000000000..4585cfd6bba1 --- /dev/null +++ b/eng/common/sdl/packages.config @@ -0,0 +1,4 @@ + + + + diff --git a/eng/common/sdl/run-sdl.ps1 b/eng/common/sdl/run-sdl.ps1 new file mode 100644 index 000000000000..2eac8c78f103 --- /dev/null +++ b/eng/common/sdl/run-sdl.ps1 @@ -0,0 +1,49 @@ +Param( + [string] $GuardianCliLocation, + [string] $WorkingDirectory, + [string] $GdnFolder, + [string] $UpdateBaseline, + [string] $GuardianLoggerLevel='Standard' +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 +$disableConfigureToolsetImport = $true +$global:LASTEXITCODE = 0 + +try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + # We store config files in the r directory of .gdn + $gdnConfigPath = Join-Path $GdnFolder 'r' + $ValidPath = Test-Path $GuardianCliLocation + + if ($ValidPath -eq $False) + { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Invalid Guardian CLI Location." + ExitWithExitCode 1 + } + + $gdnConfigFiles = Get-ChildItem $gdnConfigPath -Recurse -Include '*.gdnconfig' + Write-Host "Discovered Guardian config files:" + $gdnConfigFiles | Out-String | Write-Host + + Exec-BlockVerbosely { + & $GuardianCliLocation run ` + --working-directory $WorkingDirectory ` + --baseline mainbaseline ` + --update-baseline $UpdateBaseline ` + --logger-level $GuardianLoggerLevel ` + --config @gdnConfigFiles + Exit-IfNZEC "Sdl" + } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/sdl.ps1 b/eng/common/sdl/sdl.ps1 new file mode 100644 index 000000000000..648c5068d7d6 --- /dev/null +++ b/eng/common/sdl/sdl.ps1 @@ -0,0 +1,38 @@ + +function Install-Gdn { + param( + [Parameter(Mandatory=$true)] + [string]$Path, + + # If omitted, install the latest version of Guardian, otherwise install that specific version. + [string]$Version + ) + + $ErrorActionPreference = 'Stop' + Set-StrictMode -Version 2.0 + $disableConfigureToolsetImport = $true + $global:LASTEXITCODE = 0 + + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true + . $PSScriptRoot\..\tools.ps1 + + $argumentList = @("install", "Microsoft.Guardian.Cli", "-Source https://securitytools.pkgs.visualstudio.com/_packaging/Guardian/nuget/v3/index.json", "-OutputDirectory $Path", "-NonInteractive", "-NoCache") + + if ($Version) { + $argumentList += "-Version $Version" + } + + Start-Process nuget -Verbose -ArgumentList $argumentList -NoNewWindow -Wait + + $gdnCliPath = Get-ChildItem -Filter guardian.cmd -Recurse -Path $Path + + if (!$gdnCliPath) + { + Write-PipelineTelemetryError -Category 'Sdl' -Message 'Failure installing Guardian' + } + + return $gdnCliPath.FullName +} \ No newline at end of file diff --git a/eng/common/sdl/trim-assets-version.ps1 b/eng/common/sdl/trim-assets-version.ps1 new file mode 100644 index 000000000000..0daa2a9e9462 --- /dev/null +++ b/eng/common/sdl/trim-assets-version.ps1 @@ -0,0 +1,75 @@ +<# +.SYNOPSIS +Install and run the 'Microsoft.DotNet.VersionTools.Cli' tool with the 'trim-artifacts-version' command to trim the version from the NuGet assets file name. + +.PARAMETER InputPath +Full path to directory where artifact packages are stored + +.PARAMETER Recursive +Search for NuGet packages recursively + +#> + +Param( + [string] $InputPath, + [bool] $Recursive = $true +) + +$CliToolName = "Microsoft.DotNet.VersionTools.Cli" + +function Install-VersionTools-Cli { + param( + [Parameter(Mandatory=$true)][string]$Version + ) + + Write-Host "Installing the package '$CliToolName' with a version of '$version' ..." + $feed = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" + + $argumentList = @("tool", "install", "--local", "$CliToolName", "--add-source $feed", "--no-cache", "--version $Version", "--create-manifest-if-needed") + Start-Process "$dotnet" -Verbose -ArgumentList $argumentList -NoNewWindow -Wait +} + +# ------------------------------------------------------------------- + +if (!(Test-Path $InputPath)) { + Write-Host "Input Path '$InputPath' does not exist" + ExitWithExitCode 1 +} + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +$disableConfigureToolsetImport = $true +$global:LASTEXITCODE = 0 + +# `tools.ps1` checks $ci to perform some actions. Since the SDL +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true +. $PSScriptRoot\..\tools.ps1 + +try { + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + + $toolsetVersion = Read-ArcadeSdkVersion + Install-VersionTools-Cli -Version $toolsetVersion + + $cliToolFound = (& "$dotnet" tool list --local | Where-Object {$_.Split(' ')[0] -eq $CliToolName}) + if ($null -eq $cliToolFound) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "The '$CliToolName' tool is not installed." + ExitWithExitCode 1 + } + + Exec-BlockVerbosely { + & "$dotnet" $CliToolName trim-assets-version ` + --assets-path $InputPath ` + --recursive $Recursive + Exit-IfNZEC "Sdl" + } +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/template-guidance.md b/eng/common/template-guidance.md new file mode 100644 index 000000000000..5ef6c30ba924 --- /dev/null +++ b/eng/common/template-guidance.md @@ -0,0 +1,133 @@ +# Overview + +Arcade provides templates for public (`/templates`) and 1ES pipeline templates (`/templates-official`) scenarios. Pipelines which are required to be managed by 1ES pipeline templates should reference `/templates-offical`, all other pipelines may reference `/templates`. + +## How to use + +Basic guidance is: + +- 1ES Pipeline Template or 1ES Microbuild template runs should reference `eng/common/templates-official`. Any internal production-graded pipeline should use these templates. + +- All other runs should reference `eng/common/templates`. + +See [azure-pipelines.yml](../../azure-pipelines.yml) (templates-official example) or [azure-pipelines-pr.yml](../../azure-pipelines-pr.yml) (templates example) for examples. + +#### The `templateIs1ESManaged` parameter + +The `templateIs1ESManaged` is available on most templates and affects which of the variants is used for nested templates. See [Development Notes](#development-notes) below for more information on the `templateIs1ESManaged1 parameter. + +- For templates under `job/`, `jobs/`, `steps`, or `post-build/`, this parameter must be explicitly set. + +## Multiple outputs + +1ES pipeline templates impose a policy where every publish artifact execution results in additional security scans being injected into your pipeline. When using `templates-official/jobs/jobs.yml`, Arcade reduces the number of additional security injections by gathering all publishing outputs into the [Build.ArtifactStagingDirectory](https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables-devops-services), and utilizing the [outputParentDirectory](https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/1es-pipeline-templates/features/outputs#multiple-outputs) feature of 1ES pipeline templates. When implementing your pipeline, if you ensure publish artifacts are located in the `$(Build.ArtifactStagingDirectory)`, and utilize the 1ES provided template context, then you can reduce the number of security scans for your pipeline. + +Example: +``` yaml +# azure-pipelines.yml +extends: + template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate + parameters: + stages: + - stage: build + jobs: + - template: /eng/common/templates-official/jobs/jobs.yml@self + parameters: + # 1ES makes use of outputs to reduce security task injection overhead + templateContext: + outputs: + - output: pipelineArtifact + displayName: 'Publish logs from source' + continueOnError: true + condition: always() + targetPath: $(Build.ArtifactStagingDirectory)/artifacts/log + artifactName: Logs + jobs: + - job: Windows + steps: + - script: echo "friendly neighborhood" > artifacts/marvel/spiderman.txt + # copy build outputs to artifact staging directory for publishing + - task: CopyFiles@2 + displayName: Gather build output + inputs: + SourceFolder: '$(Build.SourcesDirectory)/artifacts/marvel' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/marvel' +``` + +Note: Multiple outputs are ONLY applicable to 1ES PT publishing (only usable when referencing `templates-official`). + +# Development notes + +**Folder / file structure** + +``` text +eng\common\ + [templates || templates-official]\ + job\ + job.yml (shim + artifact publishing logic) + onelocbuild.yml (shim) + publish-build-assets.yml (shim) + source-build.yml (shim) + source-index-stage1.yml (shim) + jobs\ + codeql-build.yml (shim) + jobs.yml (shim) + source-build.yml (shim) + post-build\ + post-build.yml (shim) + common-variabls.yml (shim) + setup-maestro-vars.yml (shim) + steps\ + publish-build-artifacts.yml (logic) + publish-pipeline-artifacts.yml (logic) + component-governance.yml (shim) + generate-sbom.yml (shim) + publish-logs.yml (shim) + retain-build.yml (shim) + send-to-helix.yml (shim) + source-build.yml (shim) + variables\ + pool-providers.yml (logic + redirect) # templates/variables/pool-providers.yml will redirect to templates-official/variables/pool-providers.yml if you are running in the internal project + sdl-variables.yml (logic) + core-templates\ + job\ + job.yml (logic) + onelocbuild.yml (logic) + publish-build-assets.yml (logic) + source-build.yml (logic) + source-index-stage1.yml (logic) + jobs\ + codeql-build.yml (logic) + jobs.yml (logic) + source-build.yml (logic) + post-build\ + common-variabls.yml (logic) + post-build.yml (logic) + setup-maestro-vars.yml (logic) + steps\ + component-governance.yml (logic) + generate-sbom.yml (logic) + publish-build-artifacts.yml (redirect) + publish-logs.yml (logic) + publish-pipeline-artifacts.yml (redirect) + retain-build.yml (logic) + send-to-helix.yml (logic) + source-build.yml (logic) + variables\ + pool-providers.yml (redirect) +``` + +In the table above, a file is designated as "shim", "logic", or "redirect". + +- shim - represents a yaml file which is an intermediate step between pipeline logic and .Net Core Engineering's templates (`core-templates`) and defines the `is1ESPipeline` parameter value. + +- logic - represents actual base template logic. + +- redirect- represents a file in `core-templates` which redirects to the "logic" file in either `templates` or `templates-official`. + +Logic for Arcade's templates live **primarily** in the `core-templates` folder. The exceptions to the location of the logic files are around artifact publishing, which is handled differently between 1es pipeline templates and standard templates. `templates` and `templates-official` provide shim entry points which redirect to `core-templates` while also defining the `is1ESPipeline` parameter. If a shim is referenced in `templates`, then `is1ESPipeline` is set to `false`. If a shim is referenced in `templates-official`, then `is1ESPipeline` is set to `true`. + +Within `templates` and `templates-official`, the templates at the "stages", and "jobs" / "job" level have been replaced with shims. Templates at the "steps" and "variables" level are typically too granular to be replaced with shims and instead persist logic which is directly applicable to either scenario. + +Within `core-templates`, there are a handful of places where logic is dependent on which shim entry point was used. In those places, we redirect back to the respective logic file in `templates` or `templates-official`. diff --git a/eng/common/templates-official/job/job.yml b/eng/common/templates-official/job/job.yml new file mode 100644 index 000000000000..605692d2fb77 --- /dev/null +++ b/eng/common/templates-official/job/job.yml @@ -0,0 +1,80 @@ +parameters: +# Sbom related params + enableSbom: true + runAsPublic: false + PackageVersion: 9.0.0 + BuildDropPath: '$(Build.SourcesDirectory)/artifacts' + +jobs: +- template: /eng/common/core-templates/job/job.yml + parameters: + is1ESPipeline: true + + componentGovernanceSteps: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}: + - template: /eng/common/templates/steps/generate-sbom.yml + parameters: + PackageVersion: ${{ parameters.packageVersion }} + BuildDropPath: ${{ parameters.buildDropPath }} + publishArtifacts: false + + # publish artifacts + # for 1ES managed templates, use the templateContext.output to handle multiple outputs. + templateContext: + outputParentDirectory: $(Build.ArtifactStagingDirectory) + outputs: + - ${{ if ne(parameters.artifacts.publish, '') }}: + - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}: + - output: buildArtifacts + displayName: Publish pipeline artifacts + PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' + ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }} + condition: always() + continueOnError: true + - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}: + - output: pipelineArtifact + targetPath: '$(Build.ArtifactStagingDirectory)/artifacts/log' + artifactName: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)_Attempt$(System.JobAttempt)') }} + displayName: 'Publish logs' + continueOnError: true + condition: always() + sbomEnabled: false # we don't need SBOM for logs + + - ${{ if eq(parameters.enablePublishBuildArtifacts, true) }}: + - output: buildArtifacts + displayName: Publish Logs + PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)' + publishLocation: Container + ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }} + continueOnError: true + condition: always() + sbomEnabled: false # we don't need SBOM for logs + + - ${{ if eq(parameters.enableBuildRetry, 'true') }}: + - output: pipelineArtifact + targetPath: '$(Build.ArtifactStagingDirectory)/artifacts/eng/common/BuildConfiguration' + artifactName: 'BuildConfiguration' + displayName: 'Publish build retry configuration' + continueOnError: true + sbomEnabled: false # we don't need SBOM for BuildConfiguration + + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}: + - output: pipelineArtifact + displayName: Publish SBOM manifest + continueOnError: true + targetPath: $(Build.ArtifactStagingDirectory)/sbom + artifactName: $(ARTIFACT_NAME) + + # add any outputs provided via root yaml + - ${{ if ne(parameters.templateContext.outputs, '') }}: + - ${{ each output in parameters.templateContext.outputs }}: + - ${{ output }} + + # add any remaining templateContext properties + ${{ each context in parameters.templateContext }}: + ${{ if and(ne(context.key, 'outputParentDirectory'), ne(context.key, 'outputs')) }}: + ${{ context.key }}: ${{ context.value }} + + ${{ each parameter in parameters }}: + ${{ if and(ne(parameter.key, 'templateContext'), ne(parameter.key, 'is1ESPipeline')) }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/job/onelocbuild.yml b/eng/common/templates-official/job/onelocbuild.yml new file mode 100644 index 000000000000..0f0c514b912d --- /dev/null +++ b/eng/common/templates-official/job/onelocbuild.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/onelocbuild.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/job/publish-build-assets.yml b/eng/common/templates-official/job/publish-build-assets.yml new file mode 100644 index 000000000000..d667a70e8de7 --- /dev/null +++ b/eng/common/templates-official/job/publish-build-assets.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/publish-build-assets.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/job/source-build.yml b/eng/common/templates-official/job/source-build.yml new file mode 100644 index 000000000000..1a480034b678 --- /dev/null +++ b/eng/common/templates-official/job/source-build.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/source-build.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/job/source-index-stage1.yml b/eng/common/templates-official/job/source-index-stage1.yml new file mode 100644 index 000000000000..6d5ead316f92 --- /dev/null +++ b/eng/common/templates-official/job/source-index-stage1.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/source-index-stage1.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/jobs/codeql-build.yml b/eng/common/templates-official/jobs/codeql-build.yml new file mode 100644 index 000000000000..a726322ecfe0 --- /dev/null +++ b/eng/common/templates-official/jobs/codeql-build.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/jobs/codeql-build.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/jobs/jobs.yml b/eng/common/templates-official/jobs/jobs.yml new file mode 100644 index 000000000000..007deddaea0f --- /dev/null +++ b/eng/common/templates-official/jobs/jobs.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/jobs/jobs.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/jobs/source-build.yml b/eng/common/templates-official/jobs/source-build.yml new file mode 100644 index 000000000000..483e7b611f34 --- /dev/null +++ b/eng/common/templates-official/jobs/source-build.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/jobs/source-build.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates-official/post-build/common-variables.yml b/eng/common/templates-official/post-build/common-variables.yml new file mode 100644 index 000000000000..c32fc49233f8 --- /dev/null +++ b/eng/common/templates-official/post-build/common-variables.yml @@ -0,0 +1,8 @@ +variables: +- template: /eng/common/core-templates/post-build/common-variables.yml + parameters: + # Specifies whether to use 1ES + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates-official/post-build/post-build.yml b/eng/common/templates-official/post-build/post-build.yml new file mode 100644 index 000000000000..2364c0fd4a52 --- /dev/null +++ b/eng/common/templates-official/post-build/post-build.yml @@ -0,0 +1,8 @@ +stages: +- template: /eng/common/core-templates/post-build/post-build.yml + parameters: + # Specifies whether to use 1ES + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/post-build/setup-maestro-vars.yml b/eng/common/templates-official/post-build/setup-maestro-vars.yml new file mode 100644 index 000000000000..024397d87864 --- /dev/null +++ b/eng/common/templates-official/post-build/setup-maestro-vars.yml @@ -0,0 +1,8 @@ +steps: +- template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + # Specifies whether to use 1ES + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates-official/steps/component-governance.yml b/eng/common/templates-official/steps/component-governance.yml new file mode 100644 index 000000000000..30bb3985ca2b --- /dev/null +++ b/eng/common/templates-official/steps/component-governance.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/component-governance.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/steps/enable-internal-runtimes.yml b/eng/common/templates-official/steps/enable-internal-runtimes.yml new file mode 100644 index 000000000000..f9dd238c6cd5 --- /dev/null +++ b/eng/common/templates-official/steps/enable-internal-runtimes.yml @@ -0,0 +1,9 @@ +# Obtains internal runtime download credentials and populates the 'dotnetbuilds-internal-container-read-token-base64' +# variable with the base64-encoded SAS token, by default +steps: +- template: /eng/common/core-templates/steps/enable-internal-runtimes.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/steps/enable-internal-sources.yml b/eng/common/templates-official/steps/enable-internal-sources.yml new file mode 100644 index 000000000000..e6d57182284d --- /dev/null +++ b/eng/common/templates-official/steps/enable-internal-sources.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/enable-internal-sources.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates-official/steps/generate-sbom.yml b/eng/common/templates-official/steps/generate-sbom.yml new file mode 100644 index 000000000000..9a89a4706d94 --- /dev/null +++ b/eng/common/templates-official/steps/generate-sbom.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/generate-sbom.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/steps/get-delegation-sas.yml b/eng/common/templates-official/steps/get-delegation-sas.yml new file mode 100644 index 000000000000..c5a9c1f8275c --- /dev/null +++ b/eng/common/templates-official/steps/get-delegation-sas.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/get-delegation-sas.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/steps/get-federated-access-token.yml b/eng/common/templates-official/steps/get-federated-access-token.yml new file mode 100644 index 000000000000..c8dcf6b81392 --- /dev/null +++ b/eng/common/templates-official/steps/get-federated-access-token.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/get-federated-access-token.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates-official/steps/publish-build-artifacts.yml b/eng/common/templates-official/steps/publish-build-artifacts.yml new file mode 100644 index 000000000000..100a3fc98493 --- /dev/null +++ b/eng/common/templates-official/steps/publish-build-artifacts.yml @@ -0,0 +1,41 @@ +parameters: +- name: displayName + type: string + default: 'Publish to Build Artifact' + +- name: condition + type: string + default: succeeded() + +- name: artifactName + type: string + +- name: pathToPublish + type: string + +- name: continueOnError + type: boolean + default: false + +- name: publishLocation + type: string + default: 'Container' + +- name: is1ESPipeline + type: boolean + default: true + +steps: +- ${{ if ne(parameters.is1ESPipeline, true) }}: + - 'eng/common/templates-official cannot be referenced from a non-1ES managed template': error +- task: 1ES.PublishBuildArtifacts@1 + displayName: ${{ parameters.displayName }} + condition: ${{ parameters.condition }} + ${{ if parameters.continueOnError }}: + continueOnError: ${{ parameters.continueOnError }} + inputs: + PublishLocation: ${{ parameters.publishLocation }} + PathtoPublish: ${{ parameters.pathToPublish }} + ${{ if parameters.artifactName }}: + ArtifactName: ${{ parameters.artifactName }} + diff --git a/eng/common/templates-official/steps/publish-logs.yml b/eng/common/templates-official/steps/publish-logs.yml new file mode 100644 index 000000000000..579fd531e94c --- /dev/null +++ b/eng/common/templates-official/steps/publish-logs.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/publish-logs.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/steps/publish-pipeline-artifacts.yml b/eng/common/templates-official/steps/publish-pipeline-artifacts.yml new file mode 100644 index 000000000000..172f9f0fdc97 --- /dev/null +++ b/eng/common/templates-official/steps/publish-pipeline-artifacts.yml @@ -0,0 +1,28 @@ +parameters: +- name: is1ESPipeline + type: boolean + default: true + +- name: args + type: object + default: {} + +steps: +- ${{ if ne(parameters.is1ESPipeline, true) }}: + - 'eng/common/templates-official cannot be referenced from a non-1ES managed template': error +- task: 1ES.PublishPipelineArtifact@1 + displayName: ${{ coalesce(parameters.args.displayName, 'Publish to Build Artifact') }} + ${{ if parameters.args.condition }}: + condition: ${{ parameters.args.condition }} + ${{ else }}: + condition: succeeded() + ${{ if parameters.args.continueOnError }}: + continueOnError: ${{ parameters.args.continueOnError }} + inputs: + targetPath: ${{ parameters.args.targetPath }} + ${{ if parameters.args.artifactName }}: + artifactName: ${{ parameters.args.artifactName }} + ${{ if parameters.args.properties }}: + properties: ${{ parameters.args.properties }} + ${{ if parameters.args.sbomEnabled }}: + sbomEnabled: ${{ parameters.args.sbomEnabled }} diff --git a/eng/common/templates-official/steps/retain-build.yml b/eng/common/templates-official/steps/retain-build.yml new file mode 100644 index 000000000000..5594551508a3 --- /dev/null +++ b/eng/common/templates-official/steps/retain-build.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/retain-build.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/steps/send-to-helix.yml b/eng/common/templates-official/steps/send-to-helix.yml new file mode 100644 index 000000000000..6500f21bf845 --- /dev/null +++ b/eng/common/templates-official/steps/send-to-helix.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/send-to-helix.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/steps/source-build.yml b/eng/common/templates-official/steps/source-build.yml new file mode 100644 index 000000000000..8f92c49e7b06 --- /dev/null +++ b/eng/common/templates-official/steps/source-build.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/source-build.yml + parameters: + is1ESPipeline: true + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates-official/variables/pool-providers.yml b/eng/common/templates-official/variables/pool-providers.yml new file mode 100644 index 000000000000..1f308b24efc4 --- /dev/null +++ b/eng/common/templates-official/variables/pool-providers.yml @@ -0,0 +1,45 @@ +# Select a pool provider based off branch name. Anything with branch name containing 'release' must go into an -Svc pool, +# otherwise it should go into the "normal" pools. This separates out the queueing and billing of released branches. + +# Motivation: +# Once a given branch of a repository's output has been officially "shipped" once, it is then considered to be COGS +# (Cost of goods sold) and should be moved to a servicing pool provider. This allows both separation of queueing +# (allowing release builds and main PR builds to not intefere with each other) and billing (required for COGS. +# Additionally, the pool provider name itself may be subject to change when the .NET Core Engineering Services +# team needs to move resources around and create new and potentially differently-named pools. Using this template +# file from an Arcade-ified repo helps guard against both having to update one's release/* branches and renaming. + +# How to use: +# This yaml assumes your shipped product branches use the naming convention "release/..." (which many do). +# If we find alternate naming conventions in broad usage it can be added to the condition below. +# +# First, import the template in an arcade-ified repo to pick up the variables, e.g.: +# +# variables: +# - template: /eng/common/templates-official/variables/pool-providers.yml +# +# ... then anywhere specifying the pool provider use the runtime variables, +# $(DncEngInternalBuildPool) +# +# pool: +# name: $(DncEngInternalBuildPool) +# image: 1es-windows-2022 + +variables: + # Coalesce the target and source branches so we know when a PR targets a release branch + # If these variables are somehow missing, fall back to main (tends to have more capacity) + + # Any new -Svc alternative pools should have variables added here to allow for splitting work + + - name: DncEngInternalBuildPool + value: $[ + replace( + replace( + eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), + True, + 'NetCore1ESPool-Svc-Internal' + ), + False, + 'NetCore1ESPool-Internal' + ) + ] \ No newline at end of file diff --git a/eng/common/templates-official/variables/sdl-variables.yml b/eng/common/templates-official/variables/sdl-variables.yml new file mode 100644 index 000000000000..dbdd66d4a4b3 --- /dev/null +++ b/eng/common/templates-official/variables/sdl-variables.yml @@ -0,0 +1,7 @@ +variables: +# The Guardian version specified in 'eng/common/sdl/packages.config'. This value must be kept in +# sync with the packages.config file. +- name: DefaultGuardianVersion + value: 0.109.0 +- name: GuardianPackagesConfigFile + value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config \ No newline at end of file diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml new file mode 100644 index 000000000000..d1aeb92fcea5 --- /dev/null +++ b/eng/common/templates/job/job.yml @@ -0,0 +1,82 @@ +parameters: + enablePublishBuildArtifacts: false + disableComponentGovernance: '' + componentGovernanceIgnoreDirectories: '' +# Sbom related params + enableSbom: true + runAsPublic: false + PackageVersion: 9.0.0 + BuildDropPath: '$(Build.SourcesDirectory)/artifacts' + +jobs: +- template: /eng/common/core-templates/job/job.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ if and(ne(parameter.key, 'steps'), ne(parameter.key, 'is1ESPipeline')) }}: + ${{ parameter.key }}: ${{ parameter.value }} + + steps: + - ${{ each step in parameters.steps }}: + - ${{ step }} + + componentGovernanceSteps: + - template: /eng/common/templates/steps/component-governance.yml + parameters: + ${{ if eq(parameters.disableComponentGovernance, '') }}: + ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.runAsPublic, 'false'), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/dotnet/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/microsoft/'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))) }}: + disableComponentGovernance: false + ${{ else }}: + disableComponentGovernance: true + ${{ else }}: + disableComponentGovernance: ${{ parameters.disableComponentGovernance }} + componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }} + + artifactPublishSteps: + - ${{ if ne(parameters.artifacts.publish, '') }}: + - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}: + - template: /eng/common/core-templates/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: false + args: + displayName: Publish pipeline artifacts + pathToPublish: '$(Build.ArtifactStagingDirectory)/artifacts' + publishLocation: Container + artifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }} + continueOnError: true + condition: always() + - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}: + - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml + parameters: + is1ESPipeline: false + args: + targetPath: '$(Build.ArtifactStagingDirectory)/artifacts/log' + artifactName: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }} + displayName: 'Publish logs' + continueOnError: true + condition: always() + sbomEnabled: false # we don't need SBOM for logs + + - ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}: + - template: /eng/common/core-templates/steps/publish-build-artifacts.yml + parameters: + is1ESPipeline: false + args: + displayName: Publish Logs + pathToPublish: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)' + publishLocation: Container + artifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }} + continueOnError: true + condition: always() + + - ${{ if eq(parameters.enableBuildRetry, 'true') }}: + - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml + parameters: + is1ESPipeline: false + args: + targetPath: '$(Build.SourcesDirectory)\eng\common\BuildConfiguration' + artifactName: 'BuildConfiguration' + displayName: 'Publish build retry configuration' + continueOnError: true + sbomEnabled: false # we don't need SBOM for BuildConfiguration diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml new file mode 100644 index 000000000000..ff829dc4c700 --- /dev/null +++ b/eng/common/templates/job/onelocbuild.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/onelocbuild.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml new file mode 100644 index 000000000000..ab2edec2adb5 --- /dev/null +++ b/eng/common/templates/job/publish-build-assets.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/publish-build-assets.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/job/source-build.yml b/eng/common/templates/job/source-build.yml new file mode 100644 index 000000000000..e44d47b1d760 --- /dev/null +++ b/eng/common/templates/job/source-build.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/source-build.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/job/source-index-stage1.yml b/eng/common/templates/job/source-index-stage1.yml new file mode 100644 index 000000000000..89f3291593cb --- /dev/null +++ b/eng/common/templates/job/source-index-stage1.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/job/source-index-stage1.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/jobs/codeql-build.yml b/eng/common/templates/jobs/codeql-build.yml new file mode 100644 index 000000000000..517f24d6a52c --- /dev/null +++ b/eng/common/templates/jobs/codeql-build.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/jobs/codeql-build.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml new file mode 100644 index 000000000000..388e9037b3e6 --- /dev/null +++ b/eng/common/templates/jobs/jobs.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/jobs/jobs.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/jobs/source-build.yml b/eng/common/templates/jobs/source-build.yml new file mode 100644 index 000000000000..818d4c326dbb --- /dev/null +++ b/eng/common/templates/jobs/source-build.yml @@ -0,0 +1,7 @@ +jobs: +- template: /eng/common/core-templates/jobs/source-build.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates/post-build/common-variables.yml b/eng/common/templates/post-build/common-variables.yml new file mode 100644 index 000000000000..7fa105875592 --- /dev/null +++ b/eng/common/templates/post-build/common-variables.yml @@ -0,0 +1,8 @@ +variables: +- template: /eng/common/core-templates/post-build/common-variables.yml + parameters: + # Specifies whether to use 1ES + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml new file mode 100644 index 000000000000..53ede714bdd2 --- /dev/null +++ b/eng/common/templates/post-build/post-build.yml @@ -0,0 +1,8 @@ +stages: +- template: /eng/common/core-templates/post-build/post-build.yml + parameters: + # Specifies whether to use 1ES + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates/post-build/setup-maestro-vars.yml b/eng/common/templates/post-build/setup-maestro-vars.yml new file mode 100644 index 000000000000..a79fab5b441e --- /dev/null +++ b/eng/common/templates/post-build/setup-maestro-vars.yml @@ -0,0 +1,8 @@ +steps: +- template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + # Specifies whether to use 1ES + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates/steps/component-governance.yml b/eng/common/templates/steps/component-governance.yml new file mode 100644 index 000000000000..c12a5f8d21d7 --- /dev/null +++ b/eng/common/templates/steps/component-governance.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/component-governance.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/enable-internal-runtimes.yml b/eng/common/templates/steps/enable-internal-runtimes.yml new file mode 100644 index 000000000000..b21a8038cc1c --- /dev/null +++ b/eng/common/templates/steps/enable-internal-runtimes.yml @@ -0,0 +1,10 @@ +# Obtains internal runtime download credentials and populates the 'dotnetbuilds-internal-container-read-token-base64' +# variable with the base64-encoded SAS token, by default + +steps: +- template: /eng/common/core-templates/steps/enable-internal-runtimes.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/enable-internal-sources.yml b/eng/common/templates/steps/enable-internal-sources.yml new file mode 100644 index 000000000000..5f87e9abb8aa --- /dev/null +++ b/eng/common/templates/steps/enable-internal-sources.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/enable-internal-sources.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates/steps/generate-sbom.yml b/eng/common/templates/steps/generate-sbom.yml new file mode 100644 index 000000000000..26dc00a2e0f3 --- /dev/null +++ b/eng/common/templates/steps/generate-sbom.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/generate-sbom.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/get-delegation-sas.yml b/eng/common/templates/steps/get-delegation-sas.yml new file mode 100644 index 000000000000..83760c9798e3 --- /dev/null +++ b/eng/common/templates/steps/get-delegation-sas.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/get-delegation-sas.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/get-federated-access-token.yml b/eng/common/templates/steps/get-federated-access-token.yml new file mode 100644 index 000000000000..31e151d9d9e7 --- /dev/null +++ b/eng/common/templates/steps/get-federated-access-token.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/get-federated-access-token.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} \ No newline at end of file diff --git a/eng/common/templates/steps/publish-build-artifacts.yml b/eng/common/templates/steps/publish-build-artifacts.yml new file mode 100644 index 000000000000..6428a98dfef6 --- /dev/null +++ b/eng/common/templates/steps/publish-build-artifacts.yml @@ -0,0 +1,40 @@ +parameters: +- name: is1ESPipeline + type: boolean + default: false + +- name: displayName + type: string + default: 'Publish to Build Artifact' + +- name: condition + type: string + default: succeeded() + +- name: artifactName + type: string + +- name: pathToPublish + type: string + +- name: continueOnError + type: boolean + default: false + +- name: publishLocation + type: string + default: 'Container' + +steps: +- ${{ if eq(parameters.is1ESPipeline, true) }}: + - 'eng/common/templates cannot be referenced from a 1ES managed template': error +- task: PublishBuildArtifacts@1 + displayName: ${{ parameters.displayName }} + condition: ${{ parameters.condition }} + ${{ if parameters.continueOnError }}: + continueOnError: ${{ parameters.continueOnError }} + inputs: + PublishLocation: ${{ parameters.publishLocation }} + PathtoPublish: ${{ parameters.pathToPublish }} + ${{ if parameters.artifactName }}: + ArtifactName: ${{ parameters.artifactName }} \ No newline at end of file diff --git a/eng/common/templates/steps/publish-logs.yml b/eng/common/templates/steps/publish-logs.yml new file mode 100644 index 000000000000..4ea86bd88235 --- /dev/null +++ b/eng/common/templates/steps/publish-logs.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/publish-logs.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/publish-pipeline-artifacts.yml b/eng/common/templates/steps/publish-pipeline-artifacts.yml new file mode 100644 index 000000000000..5dd698b212fc --- /dev/null +++ b/eng/common/templates/steps/publish-pipeline-artifacts.yml @@ -0,0 +1,34 @@ +parameters: +- name: is1ESPipeline + type: boolean + default: false + +- name: args + type: object + default: {} + +steps: +- ${{ if eq(parameters.is1ESPipeline, true) }}: + - 'eng/common/templates cannot be referenced from a 1ES managed template': error +- task: PublishPipelineArtifact@1 + displayName: ${{ coalesce(parameters.args.displayName, 'Publish to Build Artifact') }} + ${{ if parameters.args.condition }}: + condition: ${{ parameters.args.condition }} + ${{ else }}: + condition: succeeded() + ${{ if parameters.args.continueOnError }}: + continueOnError: ${{ parameters.args.continueOnError }} + inputs: + targetPath: ${{ parameters.args.targetPath }} + ${{ if parameters.args.artifactName }}: + artifactName: ${{ parameters.args.artifactName }} + ${{ if parameters.args.publishLocation }}: + publishLocation: ${{ parameters.args.publishLocation }} + ${{ if parameters.args.fileSharePath }}: + fileSharePath: ${{ parameters.args.fileSharePath }} + ${{ if parameters.args.Parallel }}: + parallel: ${{ parameters.args.Parallel }} + ${{ if parameters.args.parallelCount }}: + parallelCount: ${{ parameters.args.parallelCount }} + ${{ if parameters.args.properties }}: + properties: ${{ parameters.args.properties }} \ No newline at end of file diff --git a/eng/common/templates/steps/retain-build.yml b/eng/common/templates/steps/retain-build.yml new file mode 100644 index 000000000000..8e841ace3d29 --- /dev/null +++ b/eng/common/templates/steps/retain-build.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/retain-build.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml new file mode 100644 index 000000000000..39f99fc2762d --- /dev/null +++ b/eng/common/templates/steps/send-to-helix.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/send-to-helix.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml new file mode 100644 index 000000000000..23c1d6f4e9f8 --- /dev/null +++ b/eng/common/templates/steps/source-build.yml @@ -0,0 +1,7 @@ +steps: +- template: /eng/common/core-templates/steps/source-build.yml + parameters: + is1ESPipeline: false + + ${{ each parameter in parameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/common/templates/variables/pool-providers.yml b/eng/common/templates/variables/pool-providers.yml new file mode 100644 index 000000000000..e0b19c14a073 --- /dev/null +++ b/eng/common/templates/variables/pool-providers.yml @@ -0,0 +1,59 @@ +# Select a pool provider based off branch name. Anything with branch name containing 'release' must go into an -Svc pool, +# otherwise it should go into the "normal" pools. This separates out the queueing and billing of released branches. + +# Motivation: +# Once a given branch of a repository's output has been officially "shipped" once, it is then considered to be COGS +# (Cost of goods sold) and should be moved to a servicing pool provider. This allows both separation of queueing +# (allowing release builds and main PR builds to not intefere with each other) and billing (required for COGS. +# Additionally, the pool provider name itself may be subject to change when the .NET Core Engineering Services +# team needs to move resources around and create new and potentially differently-named pools. Using this template +# file from an Arcade-ified repo helps guard against both having to update one's release/* branches and renaming. + +# How to use: +# This yaml assumes your shipped product branches use the naming convention "release/..." (which many do). +# If we find alternate naming conventions in broad usage it can be added to the condition below. +# +# First, import the template in an arcade-ified repo to pick up the variables, e.g.: +# +# variables: +# - template: /eng/common/templates/variables/pool-providers.yml +# +# ... then anywhere specifying the pool provider use the runtime variables, +# $(DncEngInternalBuildPool) and $ (DncEngPublicBuildPool), e.g.: +# +# pool: +# name: $(DncEngInternalBuildPool) +# demands: ImageOverride -equals windows.vs2019.amd64 +variables: + - ${{ if eq(variables['System.TeamProject'], 'internal') }}: + - template: /eng/common/templates-official/variables/pool-providers.yml + - ${{ else }}: + # Coalesce the target and source branches so we know when a PR targets a release branch + # If these variables are somehow missing, fall back to main (tends to have more capacity) + + # Any new -Svc alternative pools should have variables added here to allow for splitting work + - name: DncEngPublicBuildPool + value: $[ + replace( + replace( + eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), + True, + 'NetCore-Svc-Public' + ), + False, + 'NetCore-Public' + ) + ] + + - name: DncEngInternalBuildPool + value: $[ + replace( + replace( + eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), + True, + 'NetCore1ESPool-Svc-Internal' + ), + False, + 'NetCore1ESPool-Internal' + ) + ] diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index a4745b344456..22954477a574 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -65,6 +65,11 @@ $ErrorActionPreference = 'Stop' # Base-64 encoded SAS token that has permission to storage container described by $runtimeSourceFeed [string]$runtimeSourceFeedKey = if (Test-Path variable:runtimeSourceFeedKey) { $runtimeSourceFeedKey } else { $null } +# True if the build is a product build +[bool]$productBuild = if (Test-Path variable:productBuild) { $productBuild } else { $false } + +[String[]]$properties = if (Test-Path variable:properties) { $properties } else { @() } + function Create-Directory ([string[]] $path) { New-Item -Path $path -Force -ItemType 'Directory' | Out-Null } @@ -158,19 +163,11 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { $env:DOTNET_MULTILEVEL_LOOKUP=0 # Disable first run since we do not need all ASP.NET packages restored. - $env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + $env:DOTNET_NOLOGO=1 # Disable telemetry on CI. if ($ci) { $env:DOTNET_CLI_TELEMETRY_OPTOUT=1 - - # In case of network error, try to log the current IP for reference - Try-LogClientIpAddress - } - - # Source Build uses DotNetCoreSdkDir variable - if ($env:DotNetCoreSdkDir -ne $null) { - $env:DOTNET_INSTALL_DIR = $env:DotNetCoreSdkDir } # Find the first path on %PATH% that contains the dotnet.exe @@ -231,7 +228,7 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { Write-PipelinePrependPath -Path $dotnetRoot Write-PipelineSetVariable -Name 'DOTNET_MULTILEVEL_LOOKUP' -Value '0' - Write-PipelineSetVariable -Name 'DOTNET_SKIP_FIRST_TIME_EXPERIENCE' -Value '1' + Write-PipelineSetVariable -Name 'DOTNET_NOLOGO' -Value '1' return $global:_DotNetInstallDir = $dotnetRoot } @@ -257,7 +254,6 @@ function Retry($downloadBlock, $maxRetries = 5) { Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unable to download file in $maxRetries attempts." break } - } } @@ -290,6 +286,25 @@ function InstallDotNet([string] $dotnetRoot, [string] $runtimeSourceFeedKey = '', [switch] $noPath) { + $dotnetVersionLabel = "'sdk v$version'" + + if ($runtime -ne '' -and $runtime -ne 'sdk') { + $runtimePath = $dotnetRoot + $runtimePath = $runtimePath + "\shared" + if ($runtime -eq "dotnet") { $runtimePath = $runtimePath + "\Microsoft.NETCore.App" } + if ($runtime -eq "aspnetcore") { $runtimePath = $runtimePath + "\Microsoft.AspNetCore.App" } + if ($runtime -eq "windowsdesktop") { $runtimePath = $runtimePath + "\Microsoft.WindowsDesktop.App" } + $runtimePath = $runtimePath + "\" + $version + + $dotnetVersionLabel = "runtime toolset '$runtime/$architecture v$version'" + + if (Test-Path $runtimePath) { + Write-Host " Runtime toolset '$runtime/$architecture v$version' already installed." + $installSuccess = $true + Exit + } + } + $installScript = GetDotNetInstallScript $dotnetRoot $installParameters = @{ Version = $version @@ -301,32 +316,45 @@ function InstallDotNet([string] $dotnetRoot, if ($skipNonVersionedFiles) { $installParameters.SkipNonVersionedFiles = $skipNonVersionedFiles } if ($noPath) { $installParameters.NoPath = $True } - try { - & $installScript @installParameters - } - catch { - if ($runtimeSourceFeed -or $runtimeSourceFeedKey) { - Write-Host "Failed to install dotnet from public location. Trying from '$runtimeSourceFeed'" - if ($runtimeSourceFeed) { $installParameters.AzureFeed = $runtimeSourceFeed } + $variations = @() + $variations += @($installParameters) - if ($runtimeSourceFeedKey) { - $decodedBytes = [System.Convert]::FromBase64String($runtimeSourceFeedKey) - $decodedString = [System.Text.Encoding]::UTF8.GetString($decodedBytes) - $installParameters.FeedCredential = $decodedString - } + $dotnetBuilds = $installParameters.Clone() + $dotnetbuilds.AzureFeed = "https://dotnetbuilds.azureedge.net/public" + $variations += @($dotnetBuilds) - try { - & $installScript @installParameters - } - catch { - Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet from custom location '$runtimeSourceFeed'." - ExitWithExitCode 1 - } + if ($runtimeSourceFeed) { + $runtimeSource = $installParameters.Clone() + $runtimeSource.AzureFeed = $runtimeSourceFeed + if ($runtimeSourceFeedKey) { + $decodedBytes = [System.Convert]::FromBase64String($runtimeSourceFeedKey) + $decodedString = [System.Text.Encoding]::UTF8.GetString($decodedBytes) + $runtimeSource.FeedCredential = $decodedString + } + $variations += @($runtimeSource) + } + + $installSuccess = $false + foreach ($variation in $variations) { + if ($variation | Get-Member AzureFeed) { + $location = $variation.AzureFeed } else { - Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet from public location." - ExitWithExitCode 1 + $location = "public location"; + } + Write-Host " Attempting to install $dotnetVersionLabel from $location." + try { + & $installScript @variation + $installSuccess = $true + break + } + catch { + Write-Host " Failed to install $dotnetVersionLabel from $location." } } + if (-not $installSuccess) { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install $dotnetVersionLabel from any of the specified locations." + ExitWithExitCode 1 + } } # @@ -350,15 +378,22 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = } # Minimum VS version to require. - $vsMinVersionReqdStr = '16.8' + $vsMinVersionReqdStr = '17.7' $vsMinVersionReqd = [Version]::new($vsMinVersionReqdStr) # If the version of msbuild is going to be xcopied, # use this version. Version matches a package here: - # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=16.10.0-preview2&view=overview - $defaultXCopyMSBuildVersion = '16.10.0-preview2' + # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/Microsoft.DotNet.Arcade.MSBuild.Xcopy/versions/17.10.0-pre.4.0 + $defaultXCopyMSBuildVersion = '17.10.0-pre.4.0' - if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } + if (!$vsRequirements) { + if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') { + $vsRequirements = $GlobalJson.tools.vs + } + else { + $vsRequirements = New-Object PSObject -Property @{ version = $vsMinVersionReqdStr } + } + } $vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { $vsMinVersionReqdStr } $vsMinVersion = [Version]::new($vsMinVersionStr) @@ -382,12 +417,12 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = # Locate Visual Studio installation or download x-copy msbuild. $vsInfo = LocateVisualStudio $vsRequirements if ($vsInfo -ne $null) { - $vsInstallDir = $vsInfo.installationPath + # Ensure vsInstallDir has a trailing slash + $vsInstallDir = Join-Path $vsInfo.installationPath "\" $vsMajorVersion = $vsInfo.installationVersion.Split('.')[0] InitializeVisualStudioEnvironmentVariables $vsInstallDir $vsMajorVersion } else { - if (Get-Member -InputObject $GlobalJson.tools -Name 'xcopy-msbuild') { $xcopyMSBuildVersion = $GlobalJson.tools.'xcopy-msbuild' $vsMajorVersion = $xcopyMSBuildVersion.Split('.')[0] @@ -396,6 +431,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = if($vsMinVersion -lt $vsMinVersionReqd){ Write-Host "Using xcopy-msbuild version of $defaultXCopyMSBuildVersion since VS version $vsMinVersionStr provided in global.json is not compatible" $xcopyMSBuildVersion = $defaultXCopyMSBuildVersion + $vsMajorVersion = $xcopyMSBuildVersion.Split('.')[0] } else{ # If the VS version IS compatible, look for an xcopy msbuild package @@ -412,7 +448,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = if ($xcopyMSBuildVersion.Trim() -ine "none") { $vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install if ($vsInstallDir -eq $null) { - throw "Could not xcopy msbuild. Please check that package 'RoslynTools.MSBuild @ $xcopyMSBuildVersion' exists on feed 'dotnet-eng'." + throw "Could not xcopy msbuild. Please check that package 'Microsoft.DotNet.Arcade.MSBuild.Xcopy @ $xcopyMSBuildVersion' exists on feed 'dotnet-eng'." } } if ($vsInstallDir -eq $null) { @@ -449,7 +485,7 @@ function InstallXCopyMSBuild([string]$packageVersion) { } function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { - $packageName = 'RoslynTools.MSBuild' + $packageName = 'Microsoft.DotNet.Arcade.MSBuild.Xcopy' $packageDir = Join-Path $ToolsDir "msbuild\$packageVersion" $packagePath = Join-Path $packageDir "$packageName.$packageVersion.nupkg" @@ -466,6 +502,10 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -OutFile $packagePath }) + if (!(Test-Path $packagePath)) { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "See https://dev.azure.com/dnceng/internal/_wiki/wikis/DNCEng%20Services%20Wiki/1074/Updating-Microsoft.DotNet.Arcade.MSBuild.Xcopy-WAS-RoslynTools.MSBuild-(xcopy-msbuild)-generation?anchor=troubleshooting for help troubleshooting issues with XCopy MSBuild" + throw + } Unzip $packagePath $packageDir } @@ -563,7 +603,15 @@ function InitializeBuildTool() { ExitWithExitCode 1 } $dotnetPath = Join-Path $dotnetRoot (GetExecutableFileName 'dotnet') - $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = 'netcoreapp3.1' } + + # Use override if it exists - commonly set by source-build + if ($null -eq $env:_OverrideArcadeInitializeBuildToolFramework) { + $initializeBuildToolFramework="net9.0" + } else { + $initializeBuildToolFramework=$env:_OverrideArcadeInitializeBuildToolFramework + } + + $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = $initializeBuildToolFramework } } elseif ($msbuildEngine -eq "vs") { try { $msbuildPath = InitializeVisualStudioMSBuild -install:$restore @@ -605,7 +653,7 @@ function GetNuGetPackageCachePath() { $env:NUGET_PACKAGES = Join-Path $env:UserProfile '.nuget\packages\' } else { $env:NUGET_PACKAGES = Join-Path $RepoRoot '.packages\' - $env:RESTORENOCACHE = $true + $env:RESTORENOHTTPCACHE = $true } } @@ -625,24 +673,38 @@ function InitializeNativeTools() { InstallDirectory = "$ToolsDir" } } + if ($env:NativeToolsOnMachine) { + Write-Host "Variable NativeToolsOnMachine detected, enabling native tool path promotion..." + $nativeArgs += @{ PathPromotion = $true } + } & "$PSScriptRoot/init-tools-native.ps1" @nativeArgs } } +function Read-ArcadeSdkVersion() { + return $GlobalJson.'msbuild-sdks'.'Microsoft.DotNet.Arcade.Sdk' +} + function InitializeToolset() { - if (Test-Path variable:global:_ToolsetBuildProj) { - return $global:_ToolsetBuildProj + # For Unified Build/Source-build support, check whether the environment variable is + # set. If it is, then use this as the toolset build project. + if ($env:_InitializeToolset -ne $null) { + return $global:_InitializeToolset = $env:_InitializeToolset + } + + if (Test-Path variable:global:_InitializeToolset) { + return $global:_InitializeToolset } $nugetCache = GetNuGetPackageCachePath - $toolsetVersion = $GlobalJson.'msbuild-sdks'.'Microsoft.DotNet.Arcade.Sdk' + $toolsetVersion = Read-ArcadeSdkVersion $toolsetLocationFile = Join-Path $ToolsetDir "$toolsetVersion.txt" if (Test-Path $toolsetLocationFile) { $path = Get-Content $toolsetLocationFile -TotalCount 1 if (Test-Path $path) { - return $global:_ToolsetBuildProj = $path + return $global:_InitializeToolset = $path } } @@ -665,7 +727,7 @@ function InitializeToolset() { throw "Invalid toolset path: $path" } - return $global:_ToolsetBuildProj = $path + return $global:_InitializeToolset = $path } function ExitWithExitCode([int] $exitCode) { @@ -717,10 +779,10 @@ function MSBuild() { # new scripts need to work with old packages, so we need to look for the old names/versions (Join-Path $basePath (Join-Path $buildTool.Framework 'Microsoft.DotNet.ArcadeLogging.dll')), (Join-Path $basePath (Join-Path $buildTool.Framework 'Microsoft.DotNet.Arcade.Sdk.dll')), - (Join-Path $basePath (Join-Path netcoreapp2.1 'Microsoft.DotNet.ArcadeLogging.dll')), - (Join-Path $basePath (Join-Path netcoreapp2.1 'Microsoft.DotNet.Arcade.Sdk.dll')) - (Join-Path $basePath (Join-Path netcoreapp3.1 'Microsoft.DotNet.ArcadeLogging.dll')), - (Join-Path $basePath (Join-Path netcoreapp3.1 'Microsoft.DotNet.Arcade.Sdk.dll')) + (Join-Path $basePath (Join-Path net7.0 'Microsoft.DotNet.ArcadeLogging.dll')), + (Join-Path $basePath (Join-Path net7.0 'Microsoft.DotNet.Arcade.Sdk.dll')), + (Join-Path $basePath (Join-Path net8.0 'Microsoft.DotNet.ArcadeLogging.dll')), + (Join-Path $basePath (Join-Path net8.0 'Microsoft.DotNet.Arcade.Sdk.dll')) ) $selectedPath = $null foreach ($path in $possiblePaths) { @@ -779,7 +841,8 @@ function MSBuild-Core() { } } - $env:ARCADE_BUILD_TOOL_COMMAND = "$($buildTool.Path) $cmdArgs" + # Be sure quote the path in case there are spaces in the dotnet installation location. + $env:ARCADE_BUILD_TOOL_COMMAND = "`"$($buildTool.Path)`" $cmdArgs" $exitCode = Exec-Process $buildTool.Path $cmdArgs @@ -793,7 +856,9 @@ function MSBuild-Core() { Write-Host "See log: $buildLog" -ForegroundColor DarkGray } - if ($ci) { + # When running on Azure Pipelines, override the returned exit code to avoid double logging. + # Skip this when the build is a child of the VMR orchestrator build. + if ($ci -and $env:SYSTEM_TEAMPROJECT -ne $null -and !$productBuild -and -not($properties -like "*DotNetBuildRepo=true*")) { Write-PipelineSetResult -Result "Failed" -Message "msbuild execution failed." # Exiting with an exit code causes the azure pipelines task to log yet another "noise" error # The above Write-PipelineSetResult will cause the task to be marked as failure without adding yet another error @@ -835,7 +900,7 @@ function IsWindowsPlatform() { } function Get-Darc($version) { - $darcPath = "$TempDir\darc\$(New-Guid)" + $darcPath = "$TempDir\darc\$([guid]::NewGuid())" if ($version -ne $null) { & $PSScriptRoot\darc-init.ps1 -toolpath $darcPath -darcVersion $version | Out-Host } else { @@ -882,35 +947,19 @@ if (!$disableConfigureToolsetImport) { } } -function Try-LogClientIpAddress() -{ - Write-Host "Attempting to log this client's IP for Azure Package feed telemetry purposes" - try - { - $result = Invoke-WebRequest -Uri "http://co1.msedge.net/fdv2/diagnostics.aspx" -UseBasicParsing - $lines = $result.Content.Split([Environment]::NewLine) - $socketIp = $lines | Select-String -Pattern "^Socket IP:.*" - Write-Host $socketIp - $clientIp = $lines | Select-String -Pattern "^Client IP:.*" - Write-Host $clientIp - } - catch - { - Write-Host "Unable to get this machine's effective IP address for logging: $_" - } -} - # # If $ci flag is set, turn on (and log that we did) special environment variables for improved Nuget client retry logic. # function Enable-Nuget-EnhancedRetry() { if ($ci) { Write-Host "Setting NUGET enhanced retry environment variables" - $env:NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY = 'true' - $env:NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT = 6 - $env:NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS = 1000 - Write-PipelineSetVariable -Name 'NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY' -Value 'true' - Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT' -Value '6' - Write-PipelineSetVariable -Name 'NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS' -Value '1000' - } -} \ No newline at end of file + $env:NUGET_ENABLE_ENHANCED_HTTP_RETRY = 'true' + $env:NUGET_ENHANCED_MAX_NETWORK_TRY_COUNT = 6 + $env:NUGET_ENHANCED_NETWORK_RETRY_DELAY_MILLISECONDS = 1000 + $env:NUGET_RETRY_HTTP_429 = 'true' + Write-PipelineSetVariable -Name 'NUGET_ENABLE_ENHANCED_HTTP_RETRY' -Value 'true' + Write-PipelineSetVariable -Name 'NUGET_ENHANCED_MAX_NETWORK_TRY_COUNT' -Value '6' + Write-PipelineSetVariable -Name 'NUGET_ENHANCED_NETWORK_RETRY_DELAY_MILLISECONDS' -Value '1000' + Write-PipelineSetVariable -Name 'NUGET_RETRY_HTTP_429' -Value 'true' + } +} diff --git a/eng/common/tools.sh b/eng/common/tools.sh index bd89e2a2c952..00473c9f918d 100644 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -68,6 +68,9 @@ fi runtime_source_feed=${runtime_source_feed:-''} runtime_source_feed_key=${runtime_source_feed_key:-''} +# True if the build is a product build +product_build=${product_build:-false} + # Resolve any symlinks in the given path. function ResolvePath { local path=$1 @@ -112,7 +115,7 @@ function InitializeDotNetCli { export DOTNET_MULTILEVEL_LOOKUP=0 # Disable first run since we want to control all package sources - export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + export DOTNET_NOLOGO=1 # Disable telemetry on CI if [[ $ci == true ]]; then @@ -123,11 +126,6 @@ function InitializeDotNetCli { # so it doesn't output warnings to the console. export LTTNG_HOME="$HOME" - # Source Build uses DotNetCoreSdkDir variable - if [[ -n "${DotNetCoreSdkDir:-}" ]]; then - export DOTNET_INSTALL_DIR="$DotNetCoreSdkDir" - fi - # Find the first path on $PATH that contains the dotnet.exe if [[ "$use_installed_dotnet_cli" == true && $global_json_has_runtimes == false && -z "${DOTNET_INSTALL_DIR:-}" ]]; then local dotnet_path=`command -v dotnet` @@ -146,7 +144,7 @@ function InitializeDotNetCli { if [[ $global_json_has_runtimes == false && -n "${DOTNET_INSTALL_DIR:-}" && -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then dotnet_root="$DOTNET_INSTALL_DIR" else - dotnet_root="$repo_root/.dotnet" + dotnet_root="${repo_root}.dotnet" export DOTNET_INSTALL_DIR="$dotnet_root" @@ -165,7 +163,7 @@ function InitializeDotNetCli { Write-PipelinePrependPath -path "$dotnet_root" Write-PipelineSetVariable -name "DOTNET_MULTILEVEL_LOOKUP" -value "0" - Write-PipelineSetVariable -name "DOTNET_SKIP_FIRST_TIME_EXPERIENCE" -value "1" + Write-PipelineSetVariable -name "DOTNET_NOLOGO" -value "1" # return value _InitializeDotNetCli="$dotnet_root" @@ -178,38 +176,68 @@ function InstallDotNetSdk { if [[ $# -ge 3 ]]; then architecture=$3 fi - InstallDotNet "$root" "$version" $architecture 'sdk' 'false' $runtime_source_feed $runtime_source_feed_key + InstallDotNet "$root" "$version" $architecture 'sdk' 'true' $runtime_source_feed $runtime_source_feed_key } function InstallDotNet { local root=$1 local version=$2 + local runtime=$4 + + local dotnetVersionLabel="'$runtime v$version'" + if [[ -n "${4:-}" ]] && [ "$4" != 'sdk' ]; then + runtimePath="$root" + runtimePath="$runtimePath/shared" + case "$runtime" in + dotnet) + runtimePath="$runtimePath/Microsoft.NETCore.App" + ;; + aspnetcore) + runtimePath="$runtimePath/Microsoft.AspNetCore.App" + ;; + windowsdesktop) + runtimePath="$runtimePath/Microsoft.WindowsDesktop.App" + ;; + *) + ;; + esac + runtimePath="$runtimePath/$version" + + dotnetVersionLabel="runtime toolset '$runtime/$architecture v$version'" + + if [ -d "$runtimePath" ]; then + echo " Runtime toolset '$runtime/$architecture v$version' already installed." + local installSuccess=1 + return + fi + fi GetDotNetInstallScript "$root" local install_script=$_GetDotNetInstallScript - local archArg='' + local installParameters=(--version $version --install-dir "$root") + if [[ -n "${3:-}" ]] && [ "$3" != 'unset' ]; then - archArg="--architecture $3" + installParameters+=(--architecture $3) fi - local runtimeArg='' if [[ -n "${4:-}" ]] && [ "$4" != 'sdk' ]; then - runtimeArg="--runtime $4" + installParameters+=(--runtime $4) fi - local skipNonVersionedFilesArg="" if [[ "$#" -ge "5" ]] && [[ "$5" != 'false' ]]; then - skipNonVersionedFilesArg="--skip-non-versioned-files" + installParameters+=(--skip-non-versioned-files) fi - bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg || { - local exit_code=$? - echo "Failed to install dotnet SDK from public location (exit code '$exit_code')." - local runtimeSourceFeed='' - if [[ -n "${6:-}" ]]; then - runtimeSourceFeed="--azure-feed $6" - fi + local variations=() # list of variable names with parameter arrays in them - local runtimeSourceFeedKey='' + local public_location=("${installParameters[@]}") + variations+=(public_location) + + local dotnetbuilds=("${installParameters[@]}" --azure-feed "https://dotnetbuilds.azureedge.net/public") + variations+=(dotnetbuilds) + + if [[ -n "${6:-}" ]]; then + variations+=(private_feed) + local private_feed=("${installParameters[@]}" --azure-feed $6) if [[ -n "${7:-}" ]]; then # The 'base64' binary on alpine uses '-d' and doesn't support '--decode' # '-d'. To work around this, do a simple detection and switch the parameter @@ -219,22 +247,27 @@ function InstallDotNet { decodeArg="-d" fi decodedFeedKey=`echo $7 | base64 $decodeArg` - runtimeSourceFeedKey="--feed-credential $decodedFeedKey" + private_feed+=(--feed-credential $decodedFeedKey) fi + fi - if [[ -n "$runtimeSourceFeed" || -n "$runtimeSourceFeedKey" ]]; then - bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg $runtimeSourceFeed $runtimeSourceFeedKey || { - local exit_code=$? - Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from custom location '$runtimeSourceFeed' (exit code '$exit_code')." - ExitWithExitCode $exit_code - } - else - if [[ $exit_code != 0 ]]; then - Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from public location (exit code '$exit_code')." - fi - ExitWithExitCode $exit_code + local installSuccess=0 + for variationName in "${variations[@]}"; do + local name="$variationName[@]" + local variation=("${!name}") + echo " Attempting to install $dotnetVersionLabel from $variationName." + bash "$install_script" "${variation[@]}" && installSuccess=1 + if [[ "$installSuccess" -eq 1 ]]; then + break fi - } + + echo " Failed to install $dotnetVersionLabel from $variationName." + done + + if [[ "$installSuccess" -eq 0 ]]; then + Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install $dotnetVersionLabel from any of the specified locations." + ExitWithExitCode 1 + fi } function with_retries { @@ -275,7 +308,7 @@ function GetDotNetInstallScript { curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || { if command -v openssl &> /dev/null; then echo "Curl failed; dumping some information about dotnet.microsoft.com for later investigation" - echo | openssl s_client -showcerts -servername dotnet.microsoft.com -connect dotnet.microsoft.com:443 + echo | openssl s_client -showcerts -servername dotnet.microsoft.com -connect dotnet.microsoft.com:443 || true fi echo "Will now retry the same URL with verbose logging." with_retries curl "$install_script_url" -sSL --verbose --retry 10 --create-dirs -o "$install_script" || { @@ -306,17 +339,22 @@ function InitializeBuildTool { # return values _InitializeBuildTool="$_InitializeDotNetCli/dotnet" _InitializeBuildToolCommand="msbuild" - _InitializeBuildToolFramework="netcoreapp3.1" + # use override if it exists - commonly set by source-build + if [[ "${_OverrideArcadeInitializeBuildToolFramework:-x}" == "x" ]]; then + _InitializeBuildToolFramework="net9.0" + else + _InitializeBuildToolFramework="${_OverrideArcadeInitializeBuildToolFramework}" + fi } -# Set RestoreNoCache as a workaround for https://github.com/NuGet/Home/issues/3116 +# Set RestoreNoHttpCache as a workaround for https://github.com/NuGet/Home/issues/3116 function GetNuGetPackageCachePath { if [[ -z ${NUGET_PACKAGES:-} ]]; then if [[ "$use_global_nuget_cache" == true ]]; then - export NUGET_PACKAGES="$HOME/.nuget/packages" + export NUGET_PACKAGES="$HOME/.nuget/packages/" else - export NUGET_PACKAGES="$repo_root/.packages" - export RESTORENOCACHE=true + export NUGET_PACKAGES="$repo_root/.packages/" + export RESTORENOHTTPCACHE=true fi fi @@ -399,15 +437,8 @@ function StopProcesses { return 0 } -function TryLogClientIpAddress () { - echo 'Attempting to log this client''s IP for Azure Package feed telemetry purposes' - if command -v curl > /dev/null; then - curl -s 'http://co1.msedge.net/fdv2/diagnostics.aspx' | grep ' IP: ' || true - fi -} - function MSBuild { - local args=$@ + local args=( "$@" ) if [[ "$pipelines_log" == true ]]; then InitializeBuildTool InitializeToolset @@ -417,13 +448,6 @@ function MSBuild { export NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS=20 Write-PipelineSetVariable -name "NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS" -value "20" Write-PipelineSetVariable -name "NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS" -value "20" - - export NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY=true - export NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT=6 - export NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS=1000 - Write-PipelineSetVariable -name "NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY" -value "true" - Write-PipelineSetVariable -name "NUGET_EXPERIMENTAL_MAX_NETWORK_TRY_COUNT" -value "6" - Write-PipelineSetVariable -name "NUGET_EXPERIMENTAL_NETWORK_RETRY_DELAY_MILLISECONDS" -value "1000" fi local toolset_dir="${_InitializeToolset%/*}" @@ -432,10 +456,10 @@ function MSBuild { local possiblePaths=() possiblePaths+=( "$toolset_dir/$_InitializeBuildToolFramework/Microsoft.DotNet.ArcadeLogging.dll" ) possiblePaths+=( "$toolset_dir/$_InitializeBuildToolFramework/Microsoft.DotNet.Arcade.Sdk.dll" ) - possiblePaths+=( "$toolset_dir/netcoreapp2.1/Microsoft.DotNet.ArcadeLogging.dll" ) - possiblePaths+=( "$toolset_dir/netcoreapp2.1/Microsoft.DotNet.Arcade.Sdk.dll" ) - possiblePaths+=( "$toolset_dir/netcoreapp3.1/Microsoft.DotNet.ArcadeLogging.dll" ) - possiblePaths+=( "$toolset_dir/netcoreapp3.1/Microsoft.DotNet.Arcade.Sdk.dll" ) + possiblePaths+=( "$toolset_dir/net7.0/Microsoft.DotNet.ArcadeLogging.dll" ) + possiblePaths+=( "$toolset_dir/net7.0/Microsoft.DotNet.Arcade.Sdk.dll" ) + possiblePaths+=( "$toolset_dir/net8.0/Microsoft.DotNet.ArcadeLogging.dll" ) + possiblePaths+=( "$toolset_dir/net8.0/Microsoft.DotNet.Arcade.Sdk.dll" ) for path in "${possiblePaths[@]}"; do if [[ -f $path ]]; then selectedPath=$path @@ -449,7 +473,7 @@ function MSBuild { args+=( "-logger:$selectedPath" ) fi - MSBuild-Core ${args[@]} + MSBuild-Core "${args[@]}" } function MSBuild-Core { @@ -480,7 +504,10 @@ function MSBuild-Core { # We should not Write-PipelineTaskError here because that message shows up in the build summary # The build already logged an error, that's the reason it failed. Producing an error here only adds noise. echo "Build failed with exit code $exit_code. Check errors above." - if [[ "$ci" == "true" ]]; then + + # When running on Azure Pipelines, override the returned exit code to avoid double logging. + # Skip this when the build is a child of the VMR orchestrator build. + if [[ "$ci" == true && -n ${SYSTEM_TEAMPROJECT:-} && "$product_build" != true && "$properties" != *"DotNetBuildRepo=true"* ]]; then Write-PipelineSetResult -result "Failed" -message "msbuild execution failed." # Exiting with an exit code causes the azure pipelines task to log yet another "noise" error # The above Write-PipelineSetResult will cause the task to be marked as failure without adding yet another error @@ -494,6 +521,17 @@ function MSBuild-Core { RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" } +function GetDarc { + darc_path="$temp_dir/darc" + version="$1" + + if [[ -n "$version" ]]; then + version="--darcversion $version" + fi + + "$eng_root/common/darc-init.sh" --toolpath "$darc_path" $version +} + ResolvePath "${BASH_SOURCE[0]}" _script_dir=`dirname "$_ResolvePath"` @@ -512,7 +550,7 @@ global_json_file="${repo_root}global.json" # determine if global.json contains a "runtimes" entry global_json_has_runtimes=false if command -v jq &> /dev/null; then - if jq -er '. | select(has("runtimes"))' "$global_json_file" &> /dev/null; then + if jq -e '.tools | has("runtimes")' "$global_json_file" &> /dev/null; then global_json_has_runtimes=true fi elif [[ "$(cat "$global_json_file")" =~ \"runtimes\"[[:space:]\:]*\{ ]]; then @@ -548,4 +586,4 @@ fi # Remove once repos are updated. if [[ -n "${useInstalledDotNetCli:-}" ]]; then use_installed_dotnet_cli="$useInstalledDotNetCli" -fi \ No newline at end of file +fi diff --git a/global.json b/global.json index 639ead5c49d4..c85e4b4a7357 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,11 @@ { "sdk": { "version": "9.0.100-rtm.24521.19" + }, + "tools": { + "dotnet": "9.0.100-rtm.24521.19" + }, + "msbuild-sdks": { + "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24516.2" } } From 220d98c2a38a069ab30ad3c2c384c9d77802d094 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Wed, 23 Oct 2024 13:18:34 -0400 Subject: [PATCH 104/155] [xcode16.1] Update xcode version to Xcode 16.1 RC (#21502) --- Make.config | 8 ++++---- tests/cecil-tests/Documentation.KnownFailures.txt | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Make.config b/Make.config index 37f686f7ca98..d36902b48d9c 100644 --- a/Make.config +++ b/Make.config @@ -219,10 +219,10 @@ MACCATALYST_NUGET_VERSION_FULL=$(MACCATALYST_NUGET_VERSION_NO_METADATA)$(NUGET_B # Xcode version should have both a major and a minor version (even if the minor version is 0) XCODE_VERSION=16.1 -XCODE_URL=https://dl.internalx.com/internal-files/xcodes/Xcode_16.1_beta_3.xip -XCODE_IOS_SIMULATOR_FILENAME=iOS_18.1_beta_6_Simulator_Runtime.dmg -XCODE_IOS_SIMULATOR_VERSION=22B5069a -XCODE_DEVELOPER_ROOT=/Applications/Xcode_16.1.0-beta3.app/Contents/Developer +XCODE_URL=https://dl.internalx.com/internal-files/xcodes/Xcode_16.1_Release_Candidate.xip +XCODE_IOS_SIMULATOR_FILENAME=iOS_18.1_Release_Candidate_Simulator_Runtime.dmg +XCODE_IOS_SIMULATOR_VERSION=22B81 +XCODE_DEVELOPER_ROOT=/Applications/Xcode_16.1.0-rc.app/Contents/Developer XCODE_PRODUCT_BUILD_VERSION:=$(shell /usr/libexec/PlistBuddy -c 'Print :ProductBuildVersion' $(XCODE_DEVELOPER_ROOT)/../version.plist 2>/dev/null || echo " $(shell tput setaf 1 2>/dev/null)The required Xcode ($(XCODE_VERSION)) is not installed in $(basename $(basename $(XCODE_DEVELOPER_ROOT)))$(shell tput sgr0 2>/dev/null)" >&2) # We define stable Xcode as the Xcode app being named like "Xcode_#.#[.#].app" diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 8fcf9b1d7d30..59344b7f2d74 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -77957,7 +77957,6 @@ P:UIKit.UIMenu.SelectedElements P:UIKit.UIMenuController.DidHideMenuNotification P:UIKit.UIMenuController.DidShowMenuNotification P:UIKit.UIMenuController.MenuFrameDidChangeNotification -P:UIKit.UIMenuController.MenuVisible P:UIKit.UIMenuController.WillHideMenuNotification P:UIKit.UIMenuController.WillShowMenuNotification P:UIKit.UIMenuElement.AccessibilityIdentifier @@ -78040,7 +78039,6 @@ P:UIKit.UIPasteboard.Automatic P:UIKit.UIPasteboard.ChangedNotification P:UIKit.UIPasteboard.ChangedTypesAddedKey P:UIKit.UIPasteboard.ChangedTypesRemovedKey -P:UIKit.UIPasteboard.Persistent P:UIKit.UIPasteboard.RemovedNotification P:UIKit.UIPasteboard.TypeListColor P:UIKit.UIPasteboard.TypeListImage From d5bc3e0f702df75e2e6f98ada8f6f429bef527f4 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 23 Oct 2024 21:09:03 +0200 Subject: [PATCH 105/155] [msbuild] Don't try to create an output file on Windows using a full path. (#21486) Fixes this warning: > [...]\packs\Microsoft.iOS.Sdk.net9.0_18.0\18.0.9731-ci.dev-rolf\tools\msbuild\iOS\Xamarin.Shared.targets(755,3): Access to the path 'C:\Users\rolf\Library\Caches\Xamarin\mtbs\builds\BundleStructure\e3602c179d4eceb04f35658ffc4180192072542b74da729d64a6505c255de589\obj\Debug\net9.0-ios\ios-arm64' is denied. --- .../Tasks/CompileEntitlements.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs index 9bf8ee809c47..d0e08651c7b0 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs @@ -54,6 +54,7 @@ public class CompileEntitlements : XamarinTask, ITaskCallback, ICancelableTask { public string BundleIdentifier { get; set; } = string.Empty; [Required] + [Output] // this is required to create an output file on Windows. Note: this is a relative path. public ITaskItem? CompiledEntitlements { get; set; } public ITaskItem [] CustomEntitlements { get; set; } = Array.Empty (); @@ -524,16 +525,16 @@ public override bool Execute () /* The path to the entitlements must be resolved to the full path, because we might want to reference it from a containing project that just references this project, * and in that case it becomes a bit complicated to resolve to a full path on disk when building remotely from Windows. Instead just resolve to a full path here, * and use that from now on. This has to be done from a task, so that we get the full path on the mac when executed remotely from Windows. */ - CompiledEntitlements = new TaskItem (Path.GetFullPath (CompiledEntitlements!.ItemSpec)); + var compiledEntitlementsFullPath = new TaskItem (Path.GetFullPath (CompiledEntitlements!.ItemSpec)); if (Platform == Utils.ApplePlatform.MacCatalyst) { - EntitlementsInSignature = CompiledEntitlements; + EntitlementsInSignature = compiledEntitlementsFullPath; } else if (SdkIsSimulator) { if (compiled.Count > 0) { - EntitlementsInExecutable = CompiledEntitlements; + EntitlementsInExecutable = compiledEntitlementsFullPath; } } else { - EntitlementsInSignature = CompiledEntitlements; + EntitlementsInSignature = compiledEntitlementsFullPath; } return !Log.HasLoggedErrors; @@ -569,7 +570,13 @@ bool SaveArchivedExpandedEntitlements (PDictionary archived) public bool ShouldCopyToBuildServer (ITaskItem item) => true; - public bool ShouldCreateOutputFile (ITaskItem item) => true; + public bool ShouldCreateOutputFile (ITaskItem item) + { + // EntitlementsInExecutable and EntitlementsInSignature are full paths on macOS, + // which doesn't work correctly when trying to create such output files on Windows. + var isFullPath = item == EntitlementsInExecutable || item == EntitlementsInSignature; + return !isFullPath; + } public IEnumerable GetAdditionalItemsToBeCopied () { From b4c001954202c7cf115d6c0e29c08b40fec2a3e2 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 23 Oct 2024 21:09:55 +0200 Subject: [PATCH 106/155] [msbuild/dotnet] Add support for compressed xcframeworks in binding projects and as NativeReference items. Fixes #21294. (#21492) Now it's possible to reference a compressed xcframework like this: ```xml ``` This makes it easier to work with xcframeworks on Windows, because xcframeworks can contain symlinks, and by zipping them up the whole symlink problem is avoided. Turns out there's already a NuGet that adds a .xcframework.zip file as a NativeReference (Microsoft.ML.OnnxRuntime), so this makes that NuGet work. Fixes https://github.com/xamarin/xamarin-macios/issues/21294. Fixes https://github.com/xamarin/xamarin-macios/issues/21450. --- .../Tasks/ResolveNativeReferences.cs | 36 +++--- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 4 +- .../ApiDefinition.cs | 1 + .../BindingWithCompressedXCFramework.csproj | 8 ++ .../MacCatalyst/Makefile | 1 + .../MyClass.cs | 8 ++ .../StructsAndEnums.cs | 16 +++ .../BindingWithCompressedXCFramework.csproj | 8 ++ .../iOS/Makefile | 1 + .../BindingWithCompressedXCFramework.csproj | 8 ++ .../macOS/Makefile | 1 + .../shared.csproj | 16 +++ .../shared.mk | 2 + .../BindingWithCompressedXCFramework.csproj | 8 ++ .../tvOS/Makefile | 1 + .../AppDelegate.cs | 32 ++++++ ...essedNativeXCFrameworkReferencesApp.csproj | 7 ++ .../MacCatalyst/Makefile | 1 + ...essedNativeXCFrameworkReferencesApp.csproj | 7 ++ .../iOS/Makefile | 1 + ...essedNativeXCFrameworkReferencesApp.csproj | 7 ++ .../macOS/Makefile | 1 + .../shared.csproj | 24 ++++ .../shared.mk | 3 + ...essedNativeXCFrameworkReferencesApp.csproj | 7 ++ .../tvOS/Makefile | 1 + .../AppDelegate.cs | 32 ++++++ ...essedXCFrameworkInBindingProjectApp.csproj | 7 ++ .../MacCatalyst/Makefile | 1 + ...essedXCFrameworkInBindingProjectApp.csproj | 7 ++ .../iOS/Makefile | 1 + ...essedXCFrameworkInBindingProjectApp.csproj | 7 ++ .../macOS/Makefile | 1 + .../shared.csproj | 20 ++++ .../shared.mk | 3 + ...essedXCFrameworkInBindingProjectApp.csproj | 7 ++ .../tvOS/Makefile | 1 + tests/dotnet/UnitTests/PackTest.cs | 103 ++++++++++++++++++ tests/dotnet/UnitTests/ProjectTest.cs | 24 ++++ tests/dotnet/UnitTests/TestBaseClass.cs | 10 ++ tests/dotnet/UnitTests/ZipHelpers.cs | 30 +++++ tests/test-libraries/Makefile | 11 +- 42 files changed, 455 insertions(+), 20 deletions(-) create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/ApiDefinition.cs create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/MacCatalyst/BindingWithCompressedXCFramework.csproj create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/MacCatalyst/Makefile create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/MyClass.cs create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/StructsAndEnums.cs create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/iOS/BindingWithCompressedXCFramework.csproj create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/iOS/Makefile create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/macOS/BindingWithCompressedXCFramework.csproj create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/macOS/Makefile create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/shared.csproj create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/shared.mk create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/tvOS/BindingWithCompressedXCFramework.csproj create mode 100644 tests/dotnet/BindingWithCompressedXCFramework/tvOS/Makefile create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/AppDelegate.cs create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/CompressedNativeXCFrameworkReferencesApp.csproj create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/Makefile create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/CompressedNativeXCFrameworkReferencesApp.csproj create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/Makefile create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/CompressedNativeXCFrameworkReferencesApp.csproj create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/Makefile create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.csproj create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.mk create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/CompressedNativeXCFrameworkReferencesApp.csproj create mode 100644 tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/Makefile create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/AppDelegate.cs create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/CompressedXCFrameworkInBindingProjectApp.csproj create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/Makefile create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/CompressedXCFrameworkInBindingProjectApp.csproj create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/Makefile create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/CompressedXCFrameworkInBindingProjectApp.csproj create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/Makefile create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.csproj create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.mk create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/CompressedXCFrameworkInBindingProjectApp.csproj create mode 100644 tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/Makefile diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs index a975efb5abc1..2992aaf79595 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ResolveNativeReferences.cs @@ -262,8 +262,10 @@ static bool TryGetSidecarManifest (TaskLoggingHelper log, string resources, [Not /// True if the Info.plist was found and successfully parsed. static bool TryGetInfoPlist (TaskLoggingHelper log, string resourcePath, string xcframework, [NotNullWhen (true)] out PDictionary? plist) { - var manifestPath = Path.Combine (xcframework, "Info.plist"); - using var stream = CompressionHelper.TryGetPotentiallyCompressedFile (log, resourcePath, manifestPath); + var isCompressedXcframework = CompressionHelper.IsCompressed (xcframework); + var potentiallyCompressedFile = isCompressedXcframework ? Path.Combine (resourcePath, xcframework) : resourcePath; + var manifestPath = Path.Combine (isCompressedXcframework ? Path.GetFileNameWithoutExtension (xcframework) : xcframework, "Info.plist"); + using var stream = CompressionHelper.TryGetPotentiallyCompressedFile (log, potentiallyCompressedFile, manifestPath); if (stream is null) { plist = null; return false; @@ -305,14 +307,11 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame foreach (XmlNode referenceNode in document.GetElementsByTagName ("NativeReference")) { ITaskItem t = new TaskItem (r); var name = referenceNode.Attributes ["Name"].Value.Trim ('\\', '/'); - switch (Path.GetExtension (name)) { - case ".xcframework": { + if (name.EndsWith (".xcframework", StringComparison.Ordinal) || name.EndsWith (".xcframework.zip", StringComparison.Ordinal)) { if (!TryResolveXCFramework (Log, TargetFrameworkMoniker, SdkIsSimulator, Architectures, resources, name, GetIntermediateDecompressionDir (resources), createdFiles, cancellationToken, out var nativeLibraryPath)) continue; SetMetadataNativeLibrary (t, nativeLibraryPath); - break; - } - case ".framework": { + } else if (name.EndsWith (".framework", StringComparison.Ordinal)) { string? frameworkPath; if (!isCompressed) { frameworkPath = Path.Combine (resources, name); @@ -323,9 +322,8 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame t.SetMetadata ("Kind", "Framework"); t.SetMetadata ("PublishFolderType", "AppleFramework"); t.SetMetadata ("RelativePath", Path.Combine (FrameworksDirectory, Path.GetFileName (Path.GetDirectoryName (t.ItemSpec)))); - break; - } - case ".dylib": // macOS + } else if (name.EndsWith (".dylib", StringComparison.Ordinal)) { + // macOS string? dylibPath; if (!isCompressed) { dylibPath = Path.Combine (resources, name); @@ -335,8 +333,8 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame t.ItemSpec = dylibPath; t.SetMetadata ("Kind", "Dynamic"); t.SetMetadata ("PublishFolderType", "DynamicLibrary"); - break; - case ".a": // static library + } else if (name.EndsWith (".a", StringComparison.Ordinal)) { + // static library string? aPath; if (!isCompressed) { aPath = Path.Combine (resources, name); @@ -346,11 +344,9 @@ void ProcessSidecar (ITaskItem r, string resources, List native_frame t.ItemSpec = aPath; t.SetMetadata ("Kind", "Static"); t.SetMetadata ("PublishFolderType", "StaticLibrary"); - break; - default: + } else { Log.LogWarning (MSBStrings.W7105 /* Unexpected extension '{0}' for native reference '{1}' in binding resource package '{2}'. */, Path.GetExtension (name), name, r.ItemSpec); t = r; - break; } // defaults @@ -419,6 +415,16 @@ public static bool TryResolveXCFramework (TaskLoggingHelper log, string targetFr if (!TryResolveXCFramework (log, plist, xcframeworkPath, targetFrameworkMoniker, isSimulator, architectures!, cancellationToken, out var nativeLibraryRelativePath)) return false; + if (!isCompressed && CompressionHelper.IsCompressed (xcframework)) { + var zipPath = Path.Combine (resourcePath, xcframework); + var xcframeworkName = Path.GetFileNameWithoutExtension (xcframework); + if (!CompressionHelper.TryDecompress (log, zipPath, xcframeworkName, intermediateDecompressionDir, createdFiles, cancellationToken, out var decompressedXcframeworkPath)) + return false; + + nativeLibraryPath = Path.Combine (intermediateDecompressionDir, xcframeworkName, nativeLibraryRelativePath); + return true; + } + if (!isCompressed) { nativeLibraryPath = Path.Combine (resourcePath, xcframework, nativeLibraryRelativePath); return true; diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index 534665a2d6b8..ae10bfc0da13 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -146,9 +146,9 @@ Copyright (C) 2018 Microsoft. All rights reserved. --> - <_XCFrameworkNativeReference Include="@(NativeReference -> '%(Identity)/.')" Condition="'%(Extension)' == '.xcframework'" /> + <_XCFrameworkNativeReference Include="@(NativeReference -> '%(Identity)/.')" Condition="'%(Extension)' == '.xcframework' Or $([MSBuild]::ValueOrDefault('%(FileName)%(Extension)', '').EndsWith('.xcframework.zip'))" /> <_FrameworkNativeReference Include="@(NativeReference -> '%(Identity)/%(Filename)')" Condition="'%(Extension)' == '.framework'" /> - <_FileNativeReference Include="@(NativeReference)" Condition="'%(Extension)' != '.framework' And '%(Extension)' != '.xcframework'" /> + <_FileNativeReference Include="@(NativeReference)" Condition="'%(Extension)' != '.framework' And '%(Extension)' != '.xcframework' And '%(Extension)' != '.zip'" /> + + + net$(BundledNETCoreAppTargetFrameworkVersion)-maccatalyst + + + + diff --git a/tests/dotnet/BindingWithCompressedXCFramework/MacCatalyst/Makefile b/tests/dotnet/BindingWithCompressedXCFramework/MacCatalyst/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/MacCatalyst/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/BindingWithCompressedXCFramework/MyClass.cs b/tests/dotnet/BindingWithCompressedXCFramework/MyClass.cs new file mode 100644 index 000000000000..00cb25b9419f --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/MyClass.cs @@ -0,0 +1,8 @@ +using System; +namespace BindingWithCompressedXCFramework { + public class MyClass { + public MyClass () + { + } + } +} diff --git a/tests/dotnet/BindingWithCompressedXCFramework/StructsAndEnums.cs b/tests/dotnet/BindingWithCompressedXCFramework/StructsAndEnums.cs new file mode 100644 index 000000000000..50c541d38bae --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/StructsAndEnums.cs @@ -0,0 +1,16 @@ +using System.Runtime.InteropServices; + +namespace BindingWithCompressedXCFramework { + public static class CFunctions { + [DllImport ("XTest.framework/XTest")] + static extern int theUltimateAnswer (); + + // This comes from XStaticArTest.framework + [DllImport ("__Internal")] + static extern int ar_theUltimateAnswer (); + + // This comes from XStaticObjectTest.framework + [DllImport ("__Internal", EntryPoint = "theUltimateAnswer")] + static extern int object_theUltimateAnswer (); + } +} diff --git a/tests/dotnet/BindingWithCompressedXCFramework/iOS/BindingWithCompressedXCFramework.csproj b/tests/dotnet/BindingWithCompressedXCFramework/iOS/BindingWithCompressedXCFramework.csproj new file mode 100644 index 000000000000..bb9259517c64 --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/iOS/BindingWithCompressedXCFramework.csproj @@ -0,0 +1,8 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-ios + + + + diff --git a/tests/dotnet/BindingWithCompressedXCFramework/iOS/Makefile b/tests/dotnet/BindingWithCompressedXCFramework/iOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/iOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/BindingWithCompressedXCFramework/macOS/BindingWithCompressedXCFramework.csproj b/tests/dotnet/BindingWithCompressedXCFramework/macOS/BindingWithCompressedXCFramework.csproj new file mode 100644 index 000000000000..71b28ba48c7c --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/macOS/BindingWithCompressedXCFramework.csproj @@ -0,0 +1,8 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-macos + + + + diff --git a/tests/dotnet/BindingWithCompressedXCFramework/macOS/Makefile b/tests/dotnet/BindingWithCompressedXCFramework/macOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/macOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/BindingWithCompressedXCFramework/shared.csproj b/tests/dotnet/BindingWithCompressedXCFramework/shared.csproj new file mode 100644 index 000000000000..aa779283a4b7 --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/shared.csproj @@ -0,0 +1,16 @@ + + + + true + + + + + + + + + + + + diff --git a/tests/dotnet/BindingWithCompressedXCFramework/shared.mk b/tests/dotnet/BindingWithCompressedXCFramework/shared.mk new file mode 100644 index 000000000000..f555cad4e805 --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/shared.mk @@ -0,0 +1,2 @@ +TOP=../../../.. +include $(TOP)/tests/common/shared-dotnet.mk diff --git a/tests/dotnet/BindingWithCompressedXCFramework/tvOS/BindingWithCompressedXCFramework.csproj b/tests/dotnet/BindingWithCompressedXCFramework/tvOS/BindingWithCompressedXCFramework.csproj new file mode 100644 index 000000000000..388e767c58ed --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/tvOS/BindingWithCompressedXCFramework.csproj @@ -0,0 +1,8 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-tvos + + + + diff --git a/tests/dotnet/BindingWithCompressedXCFramework/tvOS/Makefile b/tests/dotnet/BindingWithCompressedXCFramework/tvOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/BindingWithCompressedXCFramework/tvOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/AppDelegate.cs b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/AppDelegate.cs new file mode 100644 index 000000000000..42e3d31b2d41 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/AppDelegate.cs @@ -0,0 +1,32 @@ +using System; +using System.Runtime.InteropServices; + +using Foundation; + +namespace NativeFrameworkReferencesApp { + public class Program { + [DllImport ("XTest.framework/XTest")] + static extern int theUltimateAnswer (); + + // This comes from XStaticArTest.framework + [DllImport ("__Internal")] + static extern int ar_theUltimateAnswer (); + + // This comes from XStaticObjectTest.framework + [DllImport ("__Internal", EntryPoint = "theUltimateAnswer")] + static extern int object_theUltimateAnswer (); + + static int Main (string [] args) + { + Console.WriteLine ($"XCFramework: {theUltimateAnswer ()}"); + Console.WriteLine ($"XCFramework with ar files: {ar_theUltimateAnswer ()}"); + Console.WriteLine ($"XCFramework with object files: {object_theUltimateAnswer ()}"); + + GC.KeepAlive (typeof (NSObject)); // prevent linking away the platform assembly + + Console.WriteLine (Environment.GetEnvironmentVariable ("MAGIC_WORD")); + + return 0; + } + } +} diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/CompressedNativeXCFrameworkReferencesApp.csproj b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/CompressedNativeXCFrameworkReferencesApp.csproj new file mode 100644 index 000000000000..6b0e2c773180 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/CompressedNativeXCFrameworkReferencesApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-maccatalyst + + + diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/Makefile b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/MacCatalyst/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/CompressedNativeXCFrameworkReferencesApp.csproj b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/CompressedNativeXCFrameworkReferencesApp.csproj new file mode 100644 index 000000000000..86d408734aa8 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/CompressedNativeXCFrameworkReferencesApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-ios + + + diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/Makefile b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/iOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/CompressedNativeXCFrameworkReferencesApp.csproj b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/CompressedNativeXCFrameworkReferencesApp.csproj new file mode 100644 index 000000000000..a77287b9ba00 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/CompressedNativeXCFrameworkReferencesApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-macos + + + diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/Makefile b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/macOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.csproj b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.csproj new file mode 100644 index 000000000000..cd5f59e3903f --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.csproj @@ -0,0 +1,24 @@ + + + + Exe + + CompressedNativeXCFrameworkReferencesApp + com.xamarin.compressednativexcframeworkreferencesapp + 1.0 + + true + + + + + + + + + + + + + + diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.mk b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.mk new file mode 100644 index 000000000000..2b9c3cf2ea73 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/shared.mk @@ -0,0 +1,3 @@ +TOP=../../../.. +TESTNAME=CompressedNativeXCFrameworkReferencesApp +include $(TOP)/tests/common/shared-dotnet.mk diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/CompressedNativeXCFrameworkReferencesApp.csproj b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/CompressedNativeXCFrameworkReferencesApp.csproj new file mode 100644 index 000000000000..bd487ddcd88d --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/CompressedNativeXCFrameworkReferencesApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-tvos + + + diff --git a/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/Makefile b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedNativeXCFrameworkReferencesApp/tvOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/AppDelegate.cs b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/AppDelegate.cs new file mode 100644 index 000000000000..42e3d31b2d41 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/AppDelegate.cs @@ -0,0 +1,32 @@ +using System; +using System.Runtime.InteropServices; + +using Foundation; + +namespace NativeFrameworkReferencesApp { + public class Program { + [DllImport ("XTest.framework/XTest")] + static extern int theUltimateAnswer (); + + // This comes from XStaticArTest.framework + [DllImport ("__Internal")] + static extern int ar_theUltimateAnswer (); + + // This comes from XStaticObjectTest.framework + [DllImport ("__Internal", EntryPoint = "theUltimateAnswer")] + static extern int object_theUltimateAnswer (); + + static int Main (string [] args) + { + Console.WriteLine ($"XCFramework: {theUltimateAnswer ()}"); + Console.WriteLine ($"XCFramework with ar files: {ar_theUltimateAnswer ()}"); + Console.WriteLine ($"XCFramework with object files: {object_theUltimateAnswer ()}"); + + GC.KeepAlive (typeof (NSObject)); // prevent linking away the platform assembly + + Console.WriteLine (Environment.GetEnvironmentVariable ("MAGIC_WORD")); + + return 0; + } + } +} diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/CompressedXCFrameworkInBindingProjectApp.csproj b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/CompressedXCFrameworkInBindingProjectApp.csproj new file mode 100644 index 000000000000..6b0e2c773180 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/CompressedXCFrameworkInBindingProjectApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-maccatalyst + + + diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/Makefile b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/MacCatalyst/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/CompressedXCFrameworkInBindingProjectApp.csproj b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/CompressedXCFrameworkInBindingProjectApp.csproj new file mode 100644 index 000000000000..86d408734aa8 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/CompressedXCFrameworkInBindingProjectApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-ios + + + diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/Makefile b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/iOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/CompressedXCFrameworkInBindingProjectApp.csproj b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/CompressedXCFrameworkInBindingProjectApp.csproj new file mode 100644 index 000000000000..a77287b9ba00 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/CompressedXCFrameworkInBindingProjectApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-macos + + + diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/Makefile b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/macOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.csproj b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.csproj new file mode 100644 index 000000000000..b4faea2baef4 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.csproj @@ -0,0 +1,20 @@ + + + + Exe + + CompressedXCFrameworkInBindingProjectApp + com.xamarin.compressedxcframeworkinbindingprojectapp + 1.0 + + + + + + + + + + + + diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.mk b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.mk new file mode 100644 index 000000000000..dc05794f7175 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/shared.mk @@ -0,0 +1,3 @@ +TOP=../../../.. +TESTNAME=CompressedXCFrameworkInBindingProjectApp +include $(TOP)/tests/common/shared-dotnet.mk diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/CompressedXCFrameworkInBindingProjectApp.csproj b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/CompressedXCFrameworkInBindingProjectApp.csproj new file mode 100644 index 000000000000..bd487ddcd88d --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/CompressedXCFrameworkInBindingProjectApp.csproj @@ -0,0 +1,7 @@ + + + + net$(BundledNETCoreAppTargetFrameworkVersion)-tvos + + + diff --git a/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/Makefile b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/Makefile new file mode 100644 index 000000000000..110d078f4577 --- /dev/null +++ b/tests/dotnet/CompressedXCFrameworkInBindingProjectApp/tvOS/Makefile @@ -0,0 +1 @@ +include ../shared.mk diff --git a/tests/dotnet/UnitTests/PackTest.cs b/tests/dotnet/UnitTests/PackTest.cs index 59da47dc18f4..aa52a321d141 100644 --- a/tests/dotnet/UnitTests/PackTest.cs +++ b/tests/dotnet/UnitTests/PackTest.cs @@ -140,6 +140,109 @@ public void BindingXcFrameworksProject (ApplePlatform platform, bool noBindingEm } } + [Test] + [TestCase (ApplePlatform.iOS, true)] + [TestCase (ApplePlatform.iOS, false)] + [TestCase (ApplePlatform.MacCatalyst, true)] + [TestCase (ApplePlatform.MacCatalyst, false)] + [TestCase (ApplePlatform.TVOS, true)] + [TestCase (ApplePlatform.TVOS, false)] + [TestCase (ApplePlatform.MacOSX, true)] + [TestCase (ApplePlatform.MacOSX, false)] + public void BindingCompressedXcFrameworksProject (ApplePlatform platform, bool compressed) + { + var project = "BindingWithCompressedXCFramework"; + var assemblyName = project; + var configuration = "Release"; + Configuration.IgnoreIfIgnoredPlatform (platform); + var project_path = GetProjectPath (project, runtimeIdentifiers: string.Empty, platform: platform, out var appPath, configuration: configuration); + Clean (project_path); + + var tmpdir = Cache.CreateTemporaryDirectory (); + var outputPath = Path.Combine (tmpdir, "OutputPath"); + var intermediateOutputPath = Path.Combine (tmpdir, "IntermediateOutputPath"); + var properties = GetDefaultProperties (); + properties ["OutputPath"] = outputPath + Path.DirectorySeparatorChar; + properties ["IntermediateOutputPath"] = intermediateOutputPath + Path.DirectorySeparatorChar; + properties ["CompressBindingResourcePackage"] = compressed ? "true" : "false"; + + DotNet.AssertPack (project_path, properties, msbuildParallelism: false); + + var nupkg = Path.Combine (outputPath, assemblyName + ".1.0.0.nupkg"); + Assert.That (nupkg, Does.Exist, "nupkg existence"); + + var archive = ZipFile.OpenRead (nupkg); + var files = archive.Entries.Select (v => v.FullName).ToHashSet (); + var tfm = platform.ToFrameworkWithPlatformVersion (isExecutable: false); + Assert.AreEqual (compressed ? 6 : 9, archive.Entries.Count, $"nupkg file count - {nupkg}"); + Assert.That (files, Does.Contain (assemblyName + ".nuspec"), "nuspec"); + Assert.That (files, Does.Contain ("_rels/.rels"), ".rels"); + Assert.That (files, Does.Contain ("[Content_Types].xml"), "[Content_Types].xml"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.dll"), $"{assemblyName}.dll"); + Assert.That (files, Has.Some.Matches (v => v.StartsWith ("package/services/metadata/core-properties/", StringComparison.Ordinal) && v.EndsWith (".psmdcp", StringComparison.Ordinal)), "psmdcp"); + string? manifest; + if (compressed) { + var resourcesZip = $"lib/{tfm}/{assemblyName}.resources.zip"; + Assert.That (files, Does.Contain (resourcesZip), $"{assemblyName}.resources.zip"); + var innerZip = ZipHelpers.ListInnerZip (nupkg, resourcesZip); + var innerZipContents = new string [] { + "manifest", + "XTest.xcframework.zip", + "XStaticArTest.xcframework.zip", + "XStaticObjectTest.xcframework.zip", + }; + CollectionAssert.AreEqual (innerZipContents.OrderBy (v => v), innerZip.OrderBy (v => v), "Inner zip"); + manifest = ZipHelpers.GetInnerString (nupkg, resourcesZip, "manifest"); + } else { + Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.resources/manifest"), $"manifest"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.resources/XTest.xcframework.zip"), $"XTest.xcframework.zip"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.resources/XStaticArTest.xcframework.zip"), $"XStaticArTest.xcframework.zip"); + Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.resources/XStaticObjectTest.xcframework.zip"), $"XStaticObjectTest.xcframework.zip"); + manifest = ZipHelpers.GetString (nupkg, $"lib/{tfm}/{assemblyName}.resources/manifest"); + } + var expectedManifest = $""" + + + + + ../../../test-libraries/.libs/XTest.xcframework.zip + + Framework + + + + + + + + + + ../../../test-libraries/.libs/XStaticArTest.xcframework.zip + + Static + + + + + + + + + + ../../../test-libraries/.libs/XStaticObjectTest.xcframework.zip + + Static + + + + + + + + """; + Assert.AreEqual (expectedManifest, manifest, "manifest contents"); + } + [Test] [TestCase (ApplePlatform.iOS)] [TestCase (ApplePlatform.MacCatalyst)] diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index 78c57f95efa8..22d65faed0e6 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -1665,6 +1665,30 @@ public void BuildAndExecuteAppWithXCFrameworkWithStaticLibraryInRuntimesNativeDi } } + [Test] + [TestCase (ApplePlatform.MacCatalyst)] + [TestCase (ApplePlatform.iOS)] + [TestCase (ApplePlatform.TVOS)] + [TestCase (ApplePlatform.MacOSX)] + public void CompressedXCFrameworkInBindingProjectApp (ApplePlatform platform) + { + var project = "CompressedXCFrameworkInBindingProjectApp"; + Configuration.IgnoreIfIgnoredPlatform (platform); + + var runtimeIdentifiers = GetDefaultRuntimeIdentifier (platform); + var project_path = GetProjectPath (project, runtimeIdentifiers: runtimeIdentifiers, platform: platform, out var appPath); + Clean (project_path); + var properties = GetDefaultProperties (runtimeIdentifiers); + DotNet.AssertBuild (project_path, properties); + + var appExecutable = GetNativeExecutable (platform, appPath); + Assert.That (appExecutable, Does.Exist, "There is an executable"); + + if (CanExecute (platform, properties)) { + ExecuteWithMagicWordAndAssert (appExecutable); + } + } + [Test] [TestCase (ApplePlatform.MacOSX, "osx-x64")] public void BuildAndExecuteAppWithWinExeOutputType (ApplePlatform platform, string runtimeIdentifier) diff --git a/tests/dotnet/UnitTests/TestBaseClass.cs b/tests/dotnet/UnitTests/TestBaseClass.cs index 7d58311359fd..8ab610a29738 100644 --- a/tests/dotnet/UnitTests/TestBaseClass.cs +++ b/tests/dotnet/UnitTests/TestBaseClass.cs @@ -171,6 +171,16 @@ protected static void Clean (string project_path) } } + protected static bool CanExecute (ApplePlatform platform, Dictionary properties) + { + if (properties.TryGetValue ("RuntimeIdentifier", out var runtimeIdentifiers)) { + return CanExecute (platform, runtimeIdentifiers); + } else if (properties.TryGetValue ("RuntimeIdentifiers", out runtimeIdentifiers)) { + return CanExecute (platform, runtimeIdentifiers); + } + return false; + } + protected static bool CanExecute (ApplePlatform platform, string runtimeIdentifiers) { switch (platform) { diff --git a/tests/dotnet/UnitTests/ZipHelpers.cs b/tests/dotnet/UnitTests/ZipHelpers.cs index 5a44d6b5465d..a931eb23160d 100644 --- a/tests/dotnet/UnitTests/ZipHelpers.cs +++ b/tests/dotnet/UnitTests/ZipHelpers.cs @@ -26,6 +26,36 @@ public static List ListInnerZip (string file, string innerZipFileName) return innerZip.Entries.Select (entry => entry.FullName.TrimEnd ('/').Replace ('/', Path.DirectorySeparatorChar)).ToList (); } + public static string? GetString (string zipfile, string filename) + { + using var zip = ZipFile.OpenRead (zipfile); + var entry = zip.GetEntry (filename); + if (entry is null) + return null; + + using var entryStream = entry.Open (); + using var reader = new StreamReader (entryStream); + return reader.ReadToEnd (); + } + + public static string? GetInnerString (string zipfile, string innerZipFileName, string filename) + { + using var zip = ZipFile.OpenRead (zipfile); + var innerZipEntry = zip.GetEntry (innerZipFileName); + if (innerZipEntry is null) + return null; + + using Stream innerZipStream = innerZipEntry.Open (); + using ZipArchive innerZip = new ZipArchive (innerZipStream, ZipArchiveMode.Read); + var innerEntry = innerZip.GetEntry (filename); + if (innerEntry is null) + return null; + + using var innerStream = innerEntry.Open (); + using var reader = new StreamReader (innerStream); + return reader.ReadToEnd (); + } + public static void DumpZipFile (ZipArchive zip, string path) { #if TRACE diff --git a/tests/test-libraries/Makefile b/tests/test-libraries/Makefile index c50be1a4ad85..6a6a7a27a518 100644 --- a/tests/test-libraries/Makefile +++ b/tests/test-libraries/Makefile @@ -446,10 +446,15 @@ SWIFTTEST_XCTARGETS += \ all-local:: .libs/SwiftTest.xcframework -.libs/XTest.xcframework.zip: .libs/XTest.xcframework - $(Q_ZIP) cd .libs && $(ZIP) -r "$(notdir $@)" "$(notdir $<)" +define ZippedXcframework +.libs/$(1).xcframework.zip: .libs/$(1).xcframework + $(Q_ZIP) cd .libs && $(ZIP) -r "$$(notdir $$@)" "$$(notdir $$<)" +all-local:: .libs/$(1).xcframework.zip +endef -all-local:: .libs/XTest.xcframework.zip +$(eval $(call ZippedXcframework,XTest)) +$(eval $(call ZippedXcframework,XStaticArTest)) +$(eval $(call ZippedXcframework,XStaticObjectTest)) # Xamarin.Mac From 71a29e3777dfeba0e829ce375ce8be6acdd1d25d Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 23 Oct 2024 21:10:21 +0200 Subject: [PATCH 107/155] [msbuild] Use MSBuild assemblies from NuGet instead of Mono's installation. (#21471) Use MSBuild assemblies from NuGet instead of Mono's installation. Try to get the closest version to Mono's assemblies. This avoids a Mono dependency. --- Directory.Build.props | 4 ++++ .../Xamarin.Messaging.Build.csproj | 17 ++++------------- .../Xamarin.MacDev.Tasks.csproj | 8 ++++---- .../Xamarin.iOS.Tasks/Xamarin.iOS.Tasks.csproj | 8 ++++---- .../Xamarin.MacDev.Tasks.Tests.csproj | 8 ++++---- .../class-redirector/class-redirector.csproj | 2 +- 6 files changed, 21 insertions(+), 26 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 3fdd678cd995..d2d76a71d25d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,6 +4,10 @@ true 0.11.5 2.2.158 + 17.11.4 + 17.11.4 + 17.11.4 + 17.11.4 diff --git a/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj b/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj index 8a3428ab3070..b46d9a83e98f 100644 --- a/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj +++ b/msbuild/Messaging/Xamarin.Messaging.Build/Xamarin.Messaging.Build.csproj @@ -6,7 +6,6 @@ $(NoWarn);NU1603 $(NoWarn);MSB3277 true - /Library/Frameworks/Mono.framework/Versions/6.12.0/lib/mono/msbuild/Current/bin enable latest Nullable @@ -29,18 +28,10 @@ - - $(MonoMSBuildBinPath)/Microsoft.Build.dll - - - $(MonoMSBuildBinPath)/Microsoft.Build.Framework.dll - - - $(MonoMSBuildBinPath)/Microsoft.Build.Tasks.Core.dll - - - $(MonoMSBuildBinPath)/Microsoft.Build.Utilities.Core.dll - + + + + Versions.g.cs diff --git a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj index 608e795242bd..1e4b3dba3a65 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj +++ b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj @@ -20,10 +20,10 @@ - - - - + + + + diff --git a/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Tasks.csproj b/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Tasks.csproj index ab13417e13ef..ddebf2c99e63 100644 --- a/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Tasks.csproj +++ b/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Tasks.csproj @@ -20,10 +20,10 @@ - - - - + + + + diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj index 33fb783ef82f..9c01e50e5e25 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj @@ -34,10 +34,10 @@ - - - - + + + + diff --git a/tools/class-redirector/class-redirector/class-redirector.csproj b/tools/class-redirector/class-redirector/class-redirector.csproj index 13301992bc25..93aabb3f2186 100644 --- a/tools/class-redirector/class-redirector/class-redirector.csproj +++ b/tools/class-redirector/class-redirector/class-redirector.csproj @@ -10,7 +10,7 @@ - + From bc3a1d821eb19e5dba9319226a3df7afa2d71458 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 10:13:36 +0200 Subject: [PATCH 108/155] [main] Update dependencies from dotnet/sdk (#21504) This pull request updates the following dependencies ## From https://github.com/dotnet/sdk - **Subscription**: afa459aa-bd64-46cb-8138-9f6f795963d4 - **Build**: 20241023.3 - **Date Produced**: October 23, 2024 9:18:45 AM UTC - **Commit**: ece1951b3615a3f6d48cffc99ed66c06c1261ea1 - **Branch**: refs/heads/release/9.0.1xx - **Updates**: - **Microsoft.NET.Sdk**: [from 9.0.100-rtm.24521.19 to 9.0.100-rtm.24523.3][1] [1]: https://github.com/dotnet/sdk/compare/1efe473357...ece1951b36 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- global.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6d6817b34367..927cb508a8b8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,8 +1,8 @@ - + https://github.com/dotnet/sdk - 1efe47335726077cc75f52ec5b00ebf243f4c048 + ece1951b3615a3f6d48cffc99ed66c06c1261ea1 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index cb69cf01a1a5..4e74900f313e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -2,7 +2,7 @@ - 9.0.100-rtm.24521.19 + 9.0.100-rtm.24523.3 9.0.0 9.0.0-alpha.1.23556.4 9.0.0-beta.24516.2 diff --git a/global.json b/global.json index c85e4b4a7357..ad29491b0068 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "9.0.100-rtm.24521.19" + "version": "9.0.100-rtm.24523.3" }, "tools": { - "dotnet": "9.0.100-rtm.24521.19" + "dotnet": "9.0.100-rtm.24523.3" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24516.2" From 769a7a0c85021a8f7684f697b916de093396f0fa Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 24 Oct 2024 10:14:46 +0200 Subject: [PATCH 109/155] [devops] File an AzDo issue if a bot runs out of space. (#21505) File an AzDo issue if a bot runs out of space, but if there's already an open issue for a bot, then just add a comment to the existing issue. Example issue created locally: https://devdiv.visualstudio.com/DevDiv/_workitems/edit/2289908. --- tools/devops/automation/scripts/System.psm1 | 70 +++++++- tools/devops/automation/scripts/VSTS.psm1 | 151 ++++++++++++++++++ .../devops/automation/templates/mac/build.yml | 6 +- .../automation/templates/tests/build.yml | 6 +- 4 files changed, 218 insertions(+), 15 deletions(-) diff --git a/tools/devops/automation/scripts/System.psm1 b/tools/devops/automation/scripts/System.psm1 index f8dd87b35b70..5b67f2f7a4f2 100644 --- a/tools/devops/automation/scripts/System.psm1 +++ b/tools/devops/automation/scripts/System.psm1 @@ -207,22 +207,82 @@ function Clear-AfterTests { <# .SYNOPSIS - Checks if there is enough space in the HD + Get the remaining space in the HD (in GB) #> -function Test-HDFreeSpace { +function Get-HDFreeSpace { + $drive = Get-PSDrive "/" + return $drive.Free / 1GB +} + +<# + .SYNOPSIS + Asserts that the HD has he specified number of GB left, if will: + + * Add a GitHub comment. + * File an AzureDevOps issue. + * Throw an exception + + (all of these will be done) +#> +function Assert-HDFreeSpace { param ( [Parameter(Mandatory)] [int] $Size ) - $drive = Get-PSDrive "/" - return $drive.Free / 1GB -gt $Size + + $space = Get-HDFreeSpace + if ($space -gt $Size) { + Write-Host "This machine has plenty of space, $Size GB are required, and there's $space GB free space left." + return + } + + $space = Get-HDFreeSpace + $shortMessage = "Not enough free space in the host $Env:AGENT_MACHINENAME, need $Size GB, has $space GB." + + Write-Host $shortMessage + try { + Write-Host "Adding GitHub comment..." + New-GitHubComment -Header "Tests failed catastrophically on $Env:CONTEXT" -Emoji ":fire:" -Description "$shortMessage" + } catch { + Write-Host "Failed to post GitHub comment: $_" + } + + Write-Host "" + + $stepUrl = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/results?buildId=$Env:BUILD_BUILDID&view=logs&j=$Env:SYSTEM_JOBIDENTIFIER&t=$Env:SYSTEM_TASKINSTANCEID" + $workItemTitle = "[CI] Bot '$Env:AGENT_MACHINENAME' out of disk space" + $workItemMessage = @" +
    The bot $Env:AGENT_MACHINENAME does not have enough hard disk space left.
    +

    +
    The bot has $space GB left (needs $Size GB).
    +

    +
    See: $stepUrl for more logs.
    +"@ + + Write-Host "Creating new DevOps issue..." + try { + $workItemId = Find-AzureDevOpsWorkItemWithTitle -Title $workItemTitle + if ($workItemId -gt 0) { + # there's already an existing work item open for this bot + Write-Host "There's already an existing issue for this bot, so just adding a comment to the existing issue $workItemId instead..." + $issueUrl = New-AzureDevOpsWorkItemComment -WorkItemId $workItemId -Comment $workItemMessage + } else { + $issueUrl = New-AzureDevOpsWorkItem -Title $workItemTitle -Message $workItemMessage + } + Write-Host "Completed, DevOps issue: $issueUrl" + } catch { + Write-Host "Failed to create work item: $_" + } + + throw [System.InvalidOperationException]::new("$shortMessage") } # module exports, any other functions are private and should not be used outside the module Export-ModuleMember -Function Get-SystemInfo Export-ModuleMember -Function Clear-XamarinProcesses -Export-ModuleMember -Function Test-HDFreeSpace +Export-ModuleMember -Function Get-HDFreeSpace +Export-ModuleMember -Function Assert-HDFreeSpace Export-ModuleMember -Function Clear-AfterTests Export-ModuleMember -Function Remove-InstalledSimulators diff --git a/tools/devops/automation/scripts/VSTS.psm1 b/tools/devops/automation/scripts/VSTS.psm1 index 440929afe300..b3d47a652f5b 100644 --- a/tools/devops/automation/scripts/VSTS.psm1 +++ b/tools/devops/automation/scripts/VSTS.psm1 @@ -886,7 +886,154 @@ function Edit-BuildConfiguration { return $buildConfiguration.Update($ConfigKey, $ConfigValue, $ConfigFile) } +function Find-AzureDevOpsWorkItemWithTitle { + param + ( + [Parameter(Mandatory)] + [string] + $Title, + + [string] + $WorkItemType = 'Bug', + + [string] + $AreaPath = 'DevDiv\VS Client - Runtime SDKs\iOS and Mac' + ) + + $headers = Get-AuthHeader -AccessToken $Env:ACCESSTOKEN + + $url = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_apis/wit/wiql?api-version=7.1" + $payload = @{ + "query" = "Select [System.Id] FROM WorkItems WHERE [System.State] = 'Active' AND [System.Title] = '$Title' AND [System.WorkItemType] = '$WorkItemType' AND [System.AreaPath] UNDER '$AreaPath'" + } + $body = ConvertTo-Json $payload -Depth 100 + + try { + Write-Host "Uri: $url" + Write-Host "Body:" + $body | Out-String | Write-Host + + $response = Invoke-RestMethod -Uri $url -Headers $headers -Method "POST" -ContentType 'application/json' -Body $body + Write-Host "Response:" + $response | Out-String | Write-Host + + $itemCount = $response.workItems.count + if ($itemCount -eq 0) { + Write-Host "No work items found with the given criteria" + return 0 + } + + $workItemId = $response.workItems[0].id + Write-Host "Found $itemCount work items with the given criteria, returning id: $workItemId" + return $workItemId + } catch { + Write-Host "Failed to find work item: $_" + } + return 0 +} + +function New-AzureDevOpsWorkItem { + param + ( + [Parameter(Mandatory)] + [string] + $Message, + + [Parameter(Mandatory)] + [string] + $Title, + + [string] + $WorkItemType = 'Bug', + + [string] + $AreaPath = 'DevDiv\VS Client - Runtime SDKs\iOS and Mac' + ) + + $headers = Get-AuthHeader -AccessToken $Env:ACCESSTOKEN + + $payload = @( + @{ + "op" = "add" + "path" = "/fields/System.Title" + "from" = $null + "value" = $Title + } + @{ + "op" = "add" + "path" = "/fields/System.AreaPath" + "from" = $null + "value" = $AreaPath + } + @{ + "op" = "add" + "path" = "/fields/Microsoft.VSTS.TCM.ReproSteps" + "from" = $null + "value" = $Message + } + ) + + $body = ConvertTo-Json $payload -Depth 100 + + $url = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_apis/wit/workitems/`$$($WorkItemType)?api-version=7.1" + try { + Write-Host "Creating DevOps $WorkItemType with Title=$Title and AreaPath=$AreaPath" + Write-Host "Uri: $url" + Write-Host "Body:" + $body | Out-String | Write-Host + $response = Invoke-RestMethod -Uri $url -Headers $headers -Method "POST" -ContentType 'application/json-patch+json' -Body $body + Write-Host "Response = $response" + $workItemId = $response.id + $workItemUrl = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_workitems/edit/$workItemId" + Write-Host "Work Item Url: $workItemUrl" + return $workItemUrl + } catch { + Write-Host "Failed to create work item:" + $_ | Out-String | Write-Host + return "" + } +} + +function New-AzureDevOpsWorkItemComment { + param + ( + [Parameter(Mandatory)] + [int] + $WorkItemId, + + [Parameter(Mandatory)] + [string] + $Comment + ) + + $headers = Get-AuthHeader -AccessToken $Env:ACCESSTOKEN + + $payload = + @{ + "text" = $Comment + } + + $body = ConvertTo-Json $payload -Depth 100 + + $url = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_apis/wit/workItems/$WorkItemId/comments?api-version=7.1-preview.4" + try { + Write-Host "Uri: $url" + Write-Host "Headers:" + $headers + Write-Host "Body:" + $body + $response = Invoke-RestMethod -Uri $url -Headers $headers -Method "POST" -ContentType 'application/json' -Body $body + Write-Host "Response:" + $response + $workItemUrl = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_workitems/edit/$workItemId" + return $workItemUrl + } catch { + Write-Host "Failed to add comment to work item:" + $_ | Out-String | Write-Host + return "" + } +} # export public functions, other functions are private and should not be used ouside the module. Export-ModuleMember -Function Stop-Pipeline Export-ModuleMember -Function Set-PipelineResult @@ -896,3 +1043,7 @@ Export-ModuleMember -Function New-BuildConfiguration Export-ModuleMember -Function Import-BuildConfiguration Export-ModuleMember -Function Edit-BuildConfiguration Export-ModuleMember -Function Get-YamlPreview +Export-ModuleMember -Function New-AzureDevOpsWorkItem +Export-ModuleMember -Function New-AzureDevOpsWorkItemComment +Export-ModuleMember -Function Find-AzureDevOpsWorkItemWithTitle + diff --git a/tools/devops/automation/templates/mac/build.yml b/tools/devops/automation/templates/mac/build.yml index fca31bfd84fd..7a997df65eb5 100644 --- a/tools/devops/automation/templates/mac/build.yml +++ b/tools/devops/automation/templates/mac/build.yml @@ -100,11 +100,7 @@ steps: # 3. Cancel the pipeline and do not execute any of the following steps. - pwsh: | Import-Module $Env:SYSTEM_DEFAULTWORKINGDIRECTORY\xamarin-macios\tools\devops\automation\scripts\MaciosCI.psd1 - - if ( -not (Test-HDFreeSpace -Size 5)) { - Set-Content -Path "$GITHUB_FAILURE_COMMENT_FILE" -Value "Not enough free space in the host $Env:AGENT_MACHINENAME." - exit 1 - } + Assert-HDFreeSpace -Size 5 env: CONTEXT: ${{ parameters.statusContext }} GITHUB_TOKEN: $(GitHub.Token) diff --git a/tools/devops/automation/templates/tests/build.yml b/tools/devops/automation/templates/tests/build.yml index d52870fe1de5..8f3f39a1f9be 100644 --- a/tools/devops/automation/templates/tests/build.yml +++ b/tools/devops/automation/templates/tests/build.yml @@ -97,11 +97,7 @@ steps: # 2. Cancel the pipeline and do not execute any of the following steps. - pwsh: | Import-Module ./MaciosCI.psd1 - - if ( -not (Test-HDFreeSpace -Size 20)) { - New-GitHubComment -Header "Tests failed catastrophically on $Env:CONTEXT" -Emoji ":fire:" -Description "Not enough free space in the host $Env:AGENT_MACHINENAME." - Stop-Pipeline - } + Assert-HDFreeSpace -Size 20 env: CONTEXT: ${{ parameters.statusContext }} GITHUB_TOKEN: $(GitHub.Token) From 9b8f44a036a7b228e406d8eb9ae4a7b953834e37 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Thu, 24 Oct 2024 06:15:00 -0400 Subject: [PATCH 110/155] [xcode16.1] Update HealthKit all the way to Xcode 16.1 RC (#21510) Co-authored-by: GitHub Actions Autoformatter --- src/healthkit.cs | 85 +++++++++++++++++++ .../Documentation.KnownFailures.txt | 23 +++++ .../MacCatalyst-HealthKit.todo | 16 ---- .../api-annotations-dotnet/iOS-HealthKit.todo | 18 ---- .../macOS-HealthKit.todo | 16 ---- 5 files changed, 108 insertions(+), 50 deletions(-) delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo diff --git a/src/healthkit.cs b/src/healthkit.cs index 9ed4196da20d..8f17dea2e02b 100644 --- a/src/healthkit.cs +++ b/src/healthkit.cs @@ -206,6 +206,19 @@ public enum HKGad7AssessmentAnswer : long { NearlyEveryDay, } + [Watch (11, 1), MacCatalyst (18, 1), Mac (15, 1), iOS (18, 1)] + [Native] + public enum HKAudiogramConductionType : long { + Air = 0, + } + + [Watch (11, 1), MacCatalyst (18, 1), Mac (15, 1), iOS (18, 1)] + [Native] + public enum HKAudiogramSensitivityTestSide : long { + Left = 0, + Right = 1, + } + #if NET /// The completion handler for . /// Completion handler for anchored object queries. @@ -4540,16 +4553,38 @@ interface HKAudiogramSensitivityPoint : NSSecureCoding { [Export ("frequency", ArgumentSemantic.Copy)] HKQuantity Frequency { get; } + [Deprecated (PlatformName.iOS, 18, 1)] + [Deprecated (PlatformName.MacCatalyst, 18, 1)] + [Deprecated (PlatformName.MacOSX, 15, 1)] + [Deprecated (PlatformName.WatchOS, 11, 1)] [NullAllowed, Export ("leftEarSensitivity", ArgumentSemantic.Copy)] HKQuantity LeftEarSensitivity { get; } + [Deprecated (PlatformName.iOS, 18, 1)] + [Deprecated (PlatformName.MacCatalyst, 18, 1)] + [Deprecated (PlatformName.MacOSX, 15, 1)] + [Deprecated (PlatformName.WatchOS, 11, 1)] [NullAllowed, Export ("rightEarSensitivity", ArgumentSemantic.Copy)] HKQuantity RightEarSensitivity { get; } + [Deprecated (PlatformName.iOS, 18, 1, message: "Use the 'HKAudiogramSensitivityTest' overload instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use the 'HKAudiogramSensitivityTest' overload instead.")] + [Deprecated (PlatformName.MacOSX, 15, 1, message: "Use the 'HKAudiogramSensitivityTest' overload instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use the 'HKAudiogramSensitivityTest' overload instead.")] [Static] [Export ("sensitivityPointWithFrequency:leftEarSensitivity:rightEarSensitivity:error:")] [return: NullAllowed] HKAudiogramSensitivityPoint GetSensitivityPoint (HKQuantity frequency, [NullAllowed] HKQuantity leftEarSensitivity, [NullAllowed] HKQuantity rightEarSensitivity, [NullAllowed] out NSError error); + + [Watch (11, 1), MacCatalyst (18, 1), Mac (15, 1), iOS (18, 1)] + [Static] + [Export ("sensitivityPointWithFrequency:tests:error:")] + [return: NullAllowed] + HKAudiogramSensitivityPoint GetSensitivityPoint (HKQuantity frequency, HKAudiogramSensitivityTest [] tests, [NullAllowed] out NSError error); + + [Watch (11, 1), MacCatalyst (18, 1), Mac (15, 1), iOS (18, 1)] + [Export ("tests", ArgumentSemantic.Copy)] + HKAudiogramSensitivityTest [] Tests { get; } } [Watch (6, 0), iOS (13, 0), Mac (13, 0)] @@ -4560,9 +4595,18 @@ interface HKAudiogramSample { [Export ("sensitivityPoints", ArgumentSemantic.Copy)] HKAudiogramSensitivityPoint [] SensitivityPoints { get; } + [Deprecated (PlatformName.iOS, 18, 1, message: "Use the 'HKDevice' overload instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use the 'HKDevice' overload instead.")] + [Deprecated (PlatformName.MacOSX, 15, 1, message: "Use the 'HKDevice' overload instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use the 'HKDevice' overload instead.")] [Static] [Export ("audiogramSampleWithSensitivityPoints:startDate:endDate:metadata:")] HKAudiogramSample GetAudiogramSample (HKAudiogramSensitivityPoint [] sensitivityPoints, NSDate startDate, NSDate endDate, [NullAllowed] NSDictionary metadata); + + [Watch (11, 1), MacCatalyst (18, 1), Mac (15, 1), iOS (18, 1)] + [Static] + [Export ("audiogramSampleWithSensitivityPoints:startDate:endDate:device:metadata:")] + HKAudiogramSample GetAudiogramSample (HKAudiogramSensitivityPoint [] sensitivityPoints, NSDate startDate, NSDate endDate, [NullAllowed] HKDevice device, [NullAllowed] NSDictionary metadata); } [Watch (6, 0), iOS (13, 0), Mac (13, 0)] @@ -5326,4 +5370,45 @@ public enum HKAppleSleepingBreathingDisturbancesClassification : long { Elevated, } + [Watch (11, 1), MacCatalyst (18, 1), Mac (15, 1), iOS (18, 1)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface HKAudiogramSensitivityPointClampingRange : NSSecureCoding, NSCopying { + + [NullAllowed, Export ("lowerBound", ArgumentSemantic.Copy)] + HKQuantity LowerBound { get; } + + [NullAllowed, Export ("upperBound", ArgumentSemantic.Copy)] + HKQuantity UpperBound { get; } + + [Static] + [Export ("clampingRangeWithLowerBound:upperBound:error:")] + [return: NullAllowed] + HKAudiogramSensitivityPointClampingRange Create ([NullAllowed][BindAs (typeof (double?))] NSNumber lowerBound, [NullAllowed][BindAs (typeof (double?))] NSNumber upperBound, [NullAllowed] out NSError error); + } + + [Watch (11, 1), MacCatalyst (18, 1), Mac (15, 1), iOS (18, 1)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface HKAudiogramSensitivityTest : NSSecureCoding, NSCopying { + + [Export ("sensitivity", ArgumentSemantic.Copy)] + HKQuantity Sensitivity { get; } + + [Export ("type", ArgumentSemantic.Assign)] + HKAudiogramConductionType Type { get; } + + [Export ("masked")] + bool Masked { get; } + + [Export ("side", ArgumentSemantic.Assign)] + HKAudiogramSensitivityTestSide Side { get; } + + [NullAllowed, Export ("clampingRange", ArgumentSemantic.Copy)] + HKAudiogramSensitivityPointClampingRange ClampingRange { get; } + + [Export ("initWithSensitivity:type:masked:side:clampingRange:error:")] + NativeHandle Constructor (HKQuantity sensitivity, HKAudiogramConductionType type, bool masked, HKAudiogramSensitivityTestSide side, [NullAllowed] HKAudiogramSensitivityPointClampingRange clampingRange, [NullAllowed] out NSError error); + } + } diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 59344b7f2d74..a4f7925d00af 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -10870,6 +10870,9 @@ F:HealthKit.HKAppleSleepingBreathingDisturbancesClassification.NotElevated F:HealthKit.HKAppleWalkingSteadinessClassification.Low F:HealthKit.HKAppleWalkingSteadinessClassification.Ok F:HealthKit.HKAppleWalkingSteadinessClassification.VeryLow +F:HealthKit.HKAudiogramConductionType.Air +F:HealthKit.HKAudiogramSensitivityTestSide.Left +F:HealthKit.HKAudiogramSensitivityTestSide.Right F:HealthKit.HKAuthorizationRequestStatus.ShouldRequest F:HealthKit.HKAuthorizationRequestStatus.Unknown F:HealthKit.HKAuthorizationRequestStatus.Unnecessary @@ -37737,7 +37740,15 @@ M:HealthKit.HKAttachmentStore.GetAttachmentsAsync(HealthKit.HKObject) M:HealthKit.HKAttachmentStore.GetDataAsync(HealthKit.HKAttachment,Foundation.NSProgress@) M:HealthKit.HKAttachmentStore.GetDataAsync(HealthKit.HKAttachment) M:HealthKit.HKAttachmentStore.RemoveAttachmentAsync(HealthKit.HKAttachment,HealthKit.HKObject) +M:HealthKit.HKAudiogramSample.GetAudiogramSample(HealthKit.HKAudiogramSensitivityPoint[],Foundation.NSDate,Foundation.NSDate,HealthKit.HKDevice,Foundation.NSDictionary{Foundation.NSString,Foundation.NSObject}) M:HealthKit.HKAudiogramSensitivityPoint.EncodeTo(Foundation.NSCoder) +M:HealthKit.HKAudiogramSensitivityPoint.GetSensitivityPoint(HealthKit.HKQuantity,HealthKit.HKAudiogramSensitivityTest[],Foundation.NSError@) +M:HealthKit.HKAudiogramSensitivityPointClampingRange.Copy(Foundation.NSZone) +M:HealthKit.HKAudiogramSensitivityPointClampingRange.Create(System.Nullable{System.Double},System.Nullable{System.Double},Foundation.NSError@) +M:HealthKit.HKAudiogramSensitivityPointClampingRange.EncodeTo(Foundation.NSCoder) +M:HealthKit.HKAudiogramSensitivityTest.#ctor(HealthKit.HKQuantity,HealthKit.HKAudiogramConductionType,System.Boolean,HealthKit.HKAudiogramSensitivityTestSide,HealthKit.HKAudiogramSensitivityPointClampingRange,Foundation.NSError@) +M:HealthKit.HKAudiogramSensitivityTest.Copy(Foundation.NSZone) +M:HealthKit.HKAudiogramSensitivityTest.EncodeTo(Foundation.NSCoder) M:HealthKit.HKBiologicalSexObject.Copy(Foundation.NSZone) M:HealthKit.HKBiologicalSexObject.EncodeTo(Foundation.NSCoder) M:HealthKit.HKBloodTypeObject.Copy(Foundation.NSZone) @@ -68917,6 +68928,14 @@ P:GLKit.GLKViewController.TimeSinceLastUpdate P:GLKit.GLKViewController.WeakDelegate P:GLKit.GLKViewDrawEventArgs.Rect P:HealthKit.HKActivitySummary.Paused +P:HealthKit.HKAudiogramSensitivityPoint.Tests +P:HealthKit.HKAudiogramSensitivityPointClampingRange.LowerBound +P:HealthKit.HKAudiogramSensitivityPointClampingRange.UpperBound +P:HealthKit.HKAudiogramSensitivityTest.ClampingRange +P:HealthKit.HKAudiogramSensitivityTest.Masked +P:HealthKit.HKAudiogramSensitivityTest.Sensitivity +P:HealthKit.HKAudiogramSensitivityTest.Side +P:HealthKit.HKAudiogramSensitivityTest.Type P:HealthKit.HKDeletedObject.Metadata P:HealthKit.HKDetailedCdaErrors.ValidationError P:HealthKit.HKDevicePropertyKey.FirmwareVersion @@ -83794,6 +83813,10 @@ T:HealthKit.HKAppleWalkingSteadinessClassification T:HealthKit.HKAttachmentStoreCompletionHandler T:HealthKit.HKAttachmentStoreDataHandler T:HealthKit.HKAttachmentStoreGetAttachmentCompletionHandler +T:HealthKit.HKAudiogramConductionType +T:HealthKit.HKAudiogramSensitivityPointClampingRange +T:HealthKit.HKAudiogramSensitivityTest +T:HealthKit.HKAudiogramSensitivityTestSide T:HealthKit.HKCategoryValueAppetiteChanges T:HealthKit.HKCategoryValueAppleWalkingSteadinessEvent T:HealthKit.HKCategoryValueAudioExposureEvent diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo deleted file mode 100644 index 151890b0201c..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-HealthKit.todo +++ /dev/null @@ -1,16 +0,0 @@ -!missing-enum! HKAudiogramConductionType not bound -!missing-enum! HKAudiogramSensitivityTestSide not bound -!missing-selector! +HKAudiogramSample::audiogramSampleWithSensitivityPoints:startDate:endDate:device:metadata: not bound -!missing-selector! +HKAudiogramSensitivityPoint::sensitivityPointWithFrequency:tests:error: not bound -!missing-selector! +HKAudiogramSensitivityPointClampingRange::clampingRangeWithLowerBound:upperBound:error: not bound -!missing-selector! HKAudiogramSensitivityPoint::tests not bound -!missing-selector! HKAudiogramSensitivityPointClampingRange::lowerBound not bound -!missing-selector! HKAudiogramSensitivityPointClampingRange::upperBound not bound -!missing-selector! HKAudiogramSensitivityTest::clampingRange not bound -!missing-selector! HKAudiogramSensitivityTest::initWithSensitivity:type:masked:side:clampingRange:error: not bound -!missing-selector! HKAudiogramSensitivityTest::masked not bound -!missing-selector! HKAudiogramSensitivityTest::sensitivity not bound -!missing-selector! HKAudiogramSensitivityTest::side not bound -!missing-selector! HKAudiogramSensitivityTest::type not bound -!missing-type! HKAudiogramSensitivityPointClampingRange not bound -!missing-type! HKAudiogramSensitivityTest not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo deleted file mode 100644 index e8d1a930da7a..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-HealthKit.todo +++ /dev/null @@ -1,18 +0,0 @@ -!deprecated-attribute-missing! HKAudiogramSensitivityPoint::leftEarSensitivity missing a [Deprecated] attribute -!deprecated-attribute-missing! HKAudiogramSensitivityPoint::rightEarSensitivity missing a [Deprecated] attribute -!missing-enum! HKAudiogramConductionType not bound -!missing-enum! HKAudiogramSensitivityTestSide not bound -!missing-selector! +HKAudiogramSample::audiogramSampleWithSensitivityPoints:startDate:endDate:device:metadata: not bound -!missing-selector! +HKAudiogramSensitivityPoint::sensitivityPointWithFrequency:tests:error: not bound -!missing-selector! +HKAudiogramSensitivityPointClampingRange::clampingRangeWithLowerBound:upperBound:error: not bound -!missing-selector! HKAudiogramSensitivityPoint::tests not bound -!missing-selector! HKAudiogramSensitivityPointClampingRange::lowerBound not bound -!missing-selector! HKAudiogramSensitivityPointClampingRange::upperBound not bound -!missing-selector! HKAudiogramSensitivityTest::clampingRange not bound -!missing-selector! HKAudiogramSensitivityTest::initWithSensitivity:type:masked:side:clampingRange:error: not bound -!missing-selector! HKAudiogramSensitivityTest::masked not bound -!missing-selector! HKAudiogramSensitivityTest::sensitivity not bound -!missing-selector! HKAudiogramSensitivityTest::side not bound -!missing-selector! HKAudiogramSensitivityTest::type not bound -!missing-type! HKAudiogramSensitivityPointClampingRange not bound -!missing-type! HKAudiogramSensitivityTest not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo deleted file mode 100644 index 151890b0201c..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/macOS-HealthKit.todo +++ /dev/null @@ -1,16 +0,0 @@ -!missing-enum! HKAudiogramConductionType not bound -!missing-enum! HKAudiogramSensitivityTestSide not bound -!missing-selector! +HKAudiogramSample::audiogramSampleWithSensitivityPoints:startDate:endDate:device:metadata: not bound -!missing-selector! +HKAudiogramSensitivityPoint::sensitivityPointWithFrequency:tests:error: not bound -!missing-selector! +HKAudiogramSensitivityPointClampingRange::clampingRangeWithLowerBound:upperBound:error: not bound -!missing-selector! HKAudiogramSensitivityPoint::tests not bound -!missing-selector! HKAudiogramSensitivityPointClampingRange::lowerBound not bound -!missing-selector! HKAudiogramSensitivityPointClampingRange::upperBound not bound -!missing-selector! HKAudiogramSensitivityTest::clampingRange not bound -!missing-selector! HKAudiogramSensitivityTest::initWithSensitivity:type:masked:side:clampingRange:error: not bound -!missing-selector! HKAudiogramSensitivityTest::masked not bound -!missing-selector! HKAudiogramSensitivityTest::sensitivity not bound -!missing-selector! HKAudiogramSensitivityTest::side not bound -!missing-selector! HKAudiogramSensitivityTest::type not bound -!missing-type! HKAudiogramSensitivityPointClampingRange not bound -!missing-type! HKAudiogramSensitivityTest not bound From ddd75fc1da1aa3522aed2d4a1b836da8de81bb95 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 24 Oct 2024 13:49:24 +0200 Subject: [PATCH 111/155] [msbuild] Unify escaping algorithm for mangled resources, and remove code duplication. (#21488) When embedding bundle resources to an assembly as assembly resources, we store the LogicalName property for the resource. We do this by using the LogicalName property as the resource name - but we need to encode forward and backward slashes, since they don't work properly has resource names. In the past, we've encoded forward and backward slashes differently, but this results in different encodings depending on whether the resources are embedded on Windows or macOS. So change the encoding, so that both forward and backward slashes are encoded the same way, and then they're extracted using the platform's path character. This way we get consistent behavior on both platforms. --- .../Tasks/CreateEmbeddedResources.cs | 18 +-------------- .../Tasks/PackLibraryResources.cs | 7 +++--- .../Tasks/UnpackLibraryResources.cs | 2 ++ .../TargetTests/TargetTests.cs | 22 +++++++++---------- 4 files changed, 18 insertions(+), 31 deletions(-) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateEmbeddedResources.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateEmbeddedResources.cs index 2a17ff59e898..e550c47af9b4 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateEmbeddedResources.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CreateEmbeddedResources.cs @@ -17,22 +17,6 @@ public class CreateEmbeddedResources : XamarinTask { [Output] public ITaskItem [] EmbeddedResources { get; set; } = Array.Empty (); - static string EscapeMangledResource (string name) - { - var mangled = new StringBuilder (); - - for (int i = 0; i < name.Length; i++) { - switch (name [i]) { - case '\\': mangled.Append ("_b"); break; - case '/': mangled.Append ("_f"); break; - case '_': mangled.Append ("__"); break; - default: mangled.Append (name [i]); break; - } - } - - return mangled.ToString (); - } - public override bool Execute () { if (ShouldExecuteRemotely ()) { @@ -56,7 +40,7 @@ public override bool Execute () bundleResource.CopyMetadataTo (embeddedResource); // mangle the resource name - var logicalName = "__" + Prefix + "_content_" + EscapeMangledResource (bundleResource.GetMetadata ("LogicalName")); + var logicalName = "__" + Prefix + "_content_" + PackLibraryResources.EscapeMangledResource (bundleResource.GetMetadata ("LogicalName")); embeddedResource.SetMetadata ("LogicalName", logicalName); // add it to the output connection diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/PackLibraryResources.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/PackLibraryResources.cs index fad793f7a11a..163a08b432cd 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/PackLibraryResources.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/PackLibraryResources.cs @@ -26,14 +26,15 @@ public class PackLibraryResources : XamarinTask, ITaskCallback, ICancelableTask #endregion - static string EscapeMangledResource (string name) + // The opposite function is UnpackLibraryResources.UnmangleResource + public static string EscapeMangledResource (string name) { var mangled = new StringBuilder (); for (int i = 0; i < name.Length; i++) { switch (name [i]) { - case '\\': mangled.Append ("_b"); break; - case '/': mangled.Append ("_f"); break; + case '\\': + case '/': mangled.Append ("_s"); break; case '_': mangled.Append ("__"); break; default: mangled.Append (name [i]); break; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs index 8c6d713e2e2a..558c27d52b3c 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/UnpackLibraryResources.cs @@ -186,6 +186,7 @@ List ExtractContentAssembly (string assembly, string intermediatePath return rv; } + // The opposite function is PackLibraryResources.EscapeMangledResource static string UnmangleResource (string mangled) { var unmangled = new StringBuilder (mangled.Length); @@ -201,6 +202,7 @@ static string UnmangleResource (string mangled) if (escaped) { switch (c) { + case 's': c = Path.DirectorySeparatorChar; break; case 'b': c = '\\'; break; case 'f': c = '/'; break; case '_': c = '_'; break; diff --git a/tests/msbuild/Xamarin.MacDev.Tests/TargetTests/TargetTests.cs b/tests/msbuild/Xamarin.MacDev.Tests/TargetTests/TargetTests.cs index 6cf38341ca61..aed1fa38d413 100644 --- a/tests/msbuild/Xamarin.MacDev.Tests/TargetTests/TargetTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tests/TargetTests/TargetTests.cs @@ -100,17 +100,17 @@ static string [] ExpectedLibraryEmbeddedResources { return new [] { "MyLibrary.MyLibraryFolder.LibraryLinkedEmbeddedResource.txt", "MyLibrary.MyLibraryFolder.LibraryEmbeddedResource.txt", - "__monotouch_content_MyLibraryFolder_fLibraryLinkedBundleResource.txt", - "__monotouch_content_MyLibraryFolder_fLibraryBundleResource.txt", - "__monotouch_content_MyLibraryFolder_fLibraryLinkedContent.txt", - "__monotouch_content_MyLibraryFolder_fLibraryContent.txt", - "__monotouch_content_LibraryStoryboard.storyboardc_f1-view-2.nib", - "__monotouch_content_LibraryStoryboard.storyboardc_fInfo.plist", - "__monotouch_content_LibraryStoryboard.storyboardc_fUIViewController-1.nib", - "__monotouch_content_LibrarySecondStoryboard.storyboardc_f43-view-49.nib", - "__monotouch_content_LibrarySecondStoryboard.storyboardc_f45-view-53.nib", - "__monotouch_content_LibrarySecondStoryboard.storyboardc_fInfo.plist", - "__monotouch_content_LibrarySecondStoryboard.storyboardc_fUITabBarController-41.nib" + "__monotouch_content_MyLibraryFolder_sLibraryLinkedBundleResource.txt", + "__monotouch_content_MyLibraryFolder_sLibraryBundleResource.txt", + "__monotouch_content_MyLibraryFolder_sLibraryLinkedContent.txt", + "__monotouch_content_MyLibraryFolder_sLibraryContent.txt", + "__monotouch_content_LibraryStoryboard.storyboardc_s1-view-2.nib", + "__monotouch_content_LibraryStoryboard.storyboardc_sInfo.plist", + "__monotouch_content_LibraryStoryboard.storyboardc_sUIViewController-1.nib", + "__monotouch_content_LibrarySecondStoryboard.storyboardc_s43-view-49.nib", + "__monotouch_content_LibrarySecondStoryboard.storyboardc_s45-view-53.nib", + "__monotouch_content_LibrarySecondStoryboard.storyboardc_sInfo.plist", + "__monotouch_content_LibrarySecondStoryboard.storyboardc_sUITabBarController-41.nib" }; } } From a6ca85f5fdaf4dba8a05b702cb7c805682169581 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 24 Oct 2024 16:37:30 +0200 Subject: [PATCH 112/155] [msbuild] Add support for the 'overwrite' metadata for PartialAppManifest items. (#21508) This makes it possible to provide partial app manifests with default values, which can then be overridden in the main Info.plist. --- docs/build-apps/build-items.md | 36 +++++++++++++++++++ .../Tasks/CompileAppManifest.cs | 9 +++-- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 2 +- .../TaskTests/CompileAppManifestTaskTests.cs | 30 ++++++++++++++++ 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/docs/build-apps/build-items.md b/docs/build-apps/build-items.md index 608836c94d40..e8f6b01fb402 100644 --- a/docs/build-apps/build-items.md +++ b/docs/build-apps/build-items.md @@ -9,6 +9,42 @@ ms.date: 09/19/2024 Build items control how .NET for iOS, Mac Catalyst, macOS, and tvOS application or library projects are built. +## PartialAppManifest + +`PartialAppManifest` can be used to add additional partial app manifests that +will be merged with the main app manifest (Info.plist). + +Any values in the partial app manifests will override values in the main app +manifest unless the `Overwrite` metadata is set to `false`. + +If the same value is specified in multiple partial app manifests, it's +undetermined which one will be the one used. + +```xml + + + +``` + +If the developer needs to execute a target to compute what to add to the +`PartialAppManifest` item group, it's possible to make sure this target is +executed before the `PartialAppManifest` items are procesed by adding it to +the `CollectAppManifestsDependsOn` property: + +```xml + + + AddPartialAppManifests; + $(CollectAppManifestsDependsOn); + + + + + + + +``` + ## XcodeProject `` can be used to build and consume the outputs diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs index 7901c1f9f72d..8f54d817cbd0 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileAppManifest.cs @@ -393,15 +393,17 @@ protected void SetValue (PDictionary dict, string key, string value) dict [key] = value; } - public static void MergePartialPlistDictionary (PDictionary plist, PDictionary partial) + public static void MergePartialPlistDictionary (PDictionary plist, PDictionary partial, bool overwrite) { foreach (var property in partial) { var key = property.Key!; if (plist.ContainsKey (key)) { + if (!overwrite) + continue; var value = plist [key]; if (value is PDictionary && property.Value is PDictionary) { - MergePartialPlistDictionary ((PDictionary) value, (PDictionary) property.Value); + MergePartialPlistDictionary ((PDictionary) value, (PDictionary) property.Value, overwrite); } else { plist [key] = property.Value.Clone (); } @@ -418,6 +420,7 @@ public static void MergePartialPLists (Task task, PDictionary plist, IEnumerable foreach (var template in partialLists) { PDictionary partial; + var overwrite = !string.Equals (template.GetMetadata ("Overwrite"), "false", StringComparison.OrdinalIgnoreCase); try { partial = PDictionary.FromFile (template.ItemSpec)!; @@ -426,7 +429,7 @@ public static void MergePartialPLists (Task task, PDictionary plist, IEnumerable continue; } - MergePartialPlistDictionary (plist, partial); + MergePartialPlistDictionary (plist, partial, overwrite); } } diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index ae10bfc0da13..630342eb12d3 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -509,7 +509,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. property to run targets that add to the `PartialAppManifest` item group before we process them. * Some MSBuild properties can also add values. - The precedence is: MSBuild properties can be overridden by the Info.plist, which can be overridden by a partial plist. + The precedence is: MSBuild properties can be overridden by the Info.plist, which can be overridden by a partial plist (a partial plist can also specify the "Overwrite=false" metadata to not overwrite any existing entries). 2. In the `CompileAppManifest` target we get all the inputs from above, and compute a temporary app manifest, which is written to a temporary output file. diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs index 93cc0b5e6d41..54b1e55a42d7 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileAppManifestTaskTests.cs @@ -77,6 +77,36 @@ public void MultipleMinimumOSVersions () Assert.AreEqual ("13.0", plist.GetMinimumOSVersion (), "MinimumOSVersion"); } + [Test] + [TestCase (false, "14.0")] + [TestCase (true, "13.0")] + public void MultipleMinimumOSVersions_Overwrite (bool overwrite, string expectedMinimumOSVersion) + { + var dir = Cache.CreateTemporaryDirectory (); + var task = CreateTask (dir); + + var mainPath = Path.Combine (dir, "Info.plist"); + var main = new PDictionary (); + main.SetMinimumOSVersion ("14.0"); + main.Save (mainPath); + + var partialPath = Path.Combine (dir, "PartialAppManifest.plist"); + var partial = new PDictionary (); + partial.SetMinimumOSVersion ("13.0"); + partial.Save (partialPath); + + task.AppManifest = new TaskItem (mainPath); + var partialAppManifest = new TaskItem (partialPath); + partialAppManifest.SetMetadata ("Overwrite", overwrite ? "true" : "false"); + task.PartialAppManifests = new [] { partialAppManifest }; + task.SupportedOSPlatformVersion = "14.0"; + + ExecuteTask (task); + + var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!; + Assert.AreEqual (expectedMinimumOSVersion, plist.GetMinimumOSVersion (), "MinimumOSVersion"); + } + [Test] public void ErrorWithMismatchedInfoPlistMinimumOSVersion () { From f9c18f4e4dbc70c8e4b2c5eee8c10b6623310b69 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 24 Oct 2024 16:55:06 +0200 Subject: [PATCH 113/155] [devops] Upload MSBuild crash logs. (#21503) When MSBuild crashes, MSBuild creates a log file and prints: > error MSB4166: Child node "3" exited prematurely. Shutting down. Diagnostic information may be found in files in "/var/folders/52/tx7jvhs16x19bkdf030_nyww0000gn/T/MSBuildTempbuilder/" and will be named MSBuild_*.failure.txt. This location can be changed by setting the MSBUILDDEBUGPATH environment variable to a different directory. However, these log files aren't accessible after a CI build has concluded, so set the MSBUILDDEBUGPATH environment variable to the jenkins-results directory, which will be uploaded as a build artifact. This way we can inspect whatever made MSBuild fail in a CI build. --- tools/devops/automation/templates/common/setup.yml | 4 ++++ tools/devops/automation/templates/variables/common.yml | 3 +++ 2 files changed, 7 insertions(+) diff --git a/tools/devops/automation/templates/common/setup.yml b/tools/devops/automation/templates/common/setup.yml index 8811f43cb03b..e059f8df1ca6 100644 --- a/tools/devops/automation/templates/common/setup.yml +++ b/tools/devops/automation/templates/common/setup.yml @@ -42,3 +42,7 @@ steps: displayName: 'Set Jenkins variables' env: BRANCH_NAME: $[ replace(variables['Build.SourceBranch'], 'refs/heads/', '') ] + +# Write MSBuild logs into the jenkins-results directory, so they're uploaded after test runs. +- pwsh: Write-Host "##vso[task.setvariable variable=MSBUILDDEBUGPATH]$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$Env:BUILD_REPOSITORY_TITLE/jenkins-results/MSBuildCrashLogs" + displayName: 'Set MSBuild crash log directory' diff --git a/tools/devops/automation/templates/variables/common.yml b/tools/devops/automation/templates/variables/common.yml index 6ae19e0d4d38..c8f729d5e219 100644 --- a/tools/devops/automation/templates/variables/common.yml +++ b/tools/devops/automation/templates/variables/common.yml @@ -59,3 +59,6 @@ variables: # point to the vsdrops that we will be using for the diff uploads. - name: VSDropsPrefix value: 'https://vsdrop.corp.microsoft.com/file/v1/xamarin-macios/device-tests' + +- name: BUILD_REPOSITORY_TITLE + value: 'xamarin-macios' From f7dae27fa2ff4d88e1f1ac40a64098cd6419efeb Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 24 Oct 2024 16:55:32 +0200 Subject: [PATCH 114/155] [src/tests] Remove the XAMCORE_3_0 define. (#21506) It's always defined, now that legacy Xamarin is not supported anymore, so just remove it. --- .../AVAudioSessionPortDescription.cs | 8 - src/AVFoundation/AVCompat.cs | 46 - src/AVFoundation/AVFragmentedAsset.cs | 19 - src/AVFoundation/AVFragmentedAssetTrack.cs | 19 - src/AVFoundation/AVTextStyleRule.cs | 6 - src/AVFoundation/Enums.cs | 4 - src/AVKit/Enums.cs | 2 +- src/Accounts/Enums.cs | 8 - src/AppKit/Enums.cs | 9 - src/AppKit/NSPathControlItem.cs | 15 +- src/AudioToolbox/AudioQueue.cs | 9 - src/AudioToolbox/AudioSession.cs | 953 ------------------ src/AudioUnit/AUEnums.cs | 4 - src/AudioUnit/AudioUnit.cs | 29 +- src/CloudKit/CKRecordID.cs | 6 - src/CloudKit/CKRecordZoneID.cs | 6 - src/Contacts/CNObsolete.cs | 27 - src/CoreBluetooth/CoreBluetooth.cs | 9 - src/CoreData/Obsolete.cs | 25 - src/CoreGraphics/CGColorSpace.cs | 35 - src/CoreGraphics/CGSize.cs | 14 - src/CoreImage/CIFilter.cs | 8 - src/CoreImage/CIImage.cs | 3 - src/CoreImage/CISampler.cs | 4 - src/CoreImage/Enums.cs | 6 - src/CoreMedia/CoreMedia.cs | 12 - src/CoreMotion/CMCompat.cs | 22 - src/CoreText/CTFontManager.cs | 21 - src/CoreVideo/CVImageBuffer.cs | 11 - src/CoreVideo/CVPixelBuffer.cs | 16 - src/CoreVideo/CVPixelFormatDescription.cs | 17 - src/Foundation/Compat.cs | 19 - src/Foundation/Enum.cs | 15 +- src/Foundation/NSAttributedString.cs | 12 - .../NSDistributedNotificationCenter.cs | 32 - src/Foundation/NSFileManagerDelegate.cs | 16 - src/Foundation/NSObject2.cs | 49 - src/Foundation/NSUrl.cs | 11 - src/GameController/GCController.cs | 1 - src/GameKit/GKCompat.cs | 25 - src/GameKit/GameKit2.cs | 18 - src/HealthKit/HKObsolete.cs | 37 - src/HomeKit/HMService.cs | 8 - src/Makefile | 6 +- src/MapKit/MKDirections.cs | 17 - src/MediaPlayer/MPMediaItemArtwork.cs | 7 - src/MediaPlayer/MPPlayableContentDelegate.cs | 44 - src/MultipeerConnectivity/Compat.cs | 33 - src/ObjCRuntime/Blocks.cs | 7 +- src/ObjCRuntime/PlatformAvailability.cs | 2 +- src/ObjCRuntime/SelectorMarshaler.cs | 67 -- src/OpenGLES/EAGLContext.cs | 7 - src/Photos/Enums.cs | 7 - src/Photos/PHAssetChangeRequest.cs | 7 - src/Photos/PHChangeRequest.cs | 6 - src/Photos/PHCompat.cs | 17 - src/README.md | 4 +- src/SceneKit/SCNCompat.cs | 7 - src/SceneKit/SCNGeometry.cs | 26 - src/SceneKit/SCNSceneRenderer.cs | 29 - src/Social/SLCompat.cs | 21 - src/SpriteKit/ObsoleteCompat.cs | 33 - src/SpriteKit/SKFieldNode.cs | 27 - src/StoreKit/SKPayment.cs | 19 - src/StoreKit/SKPaymentTransactionObserver.cs | 32 - src/Twitter/TWCompat.cs | 21 - src/UIKit/Compat.cs | 30 - src/UIKit/UIAccessibilityCustomAction.cs | 7 - src/UIKit/UIActivityItemProvider.cs | 15 - src/UIKit/UIActivityViewController.cs | 21 - src/UIKit/UIBarItem.cs | 12 - src/UIKit/UICollectionViewTransitionLayout.cs | 15 - src/UIKit/UIDocumentMenuViewController.cs | 15 - src/UIKit/UIDocumentPickerViewController.cs | 15 - src/UIKit/UIPopoverPresentationController.cs | 16 - src/UIKit/UIPrint.cs | 24 - src/UIKit/UIPrintInteractionController.cs | 10 - src/UIKit/UISearchBar.cs | 12 - src/UIKit/UISimpleTextPrintFormatter.cs | 24 - src/UIKit/UIStoryboardPopoverSegue.cs | 15 - src/UIKit/UIStoryboardSegue.cs | 15 - src/accounts.cs | 6 - src/addressbookui.cs | 4 - src/bgen/Attributes.cs | 1 - src/cloudkit.cs | 6 - src/contacts.cs | 6 - src/corebluetooth.cs | 44 - src/coreimage.cs | 6 - src/corevideo.cs | 4 - src/dotnet.tmpl.csproj | 2 +- src/eventkit.cs | 2 - src/eventkitui.cs | 4 - src/externalaccessory.cs | 6 - src/foundation.cs | 52 +- src/frameworks.sources | 30 - src/homekit.cs | 12 - src/javascriptcore.cs | 2 - src/mapkit.cs | 2 - src/mediaplayer.cs | 5 - src/messageui.cs | 7 - src/scenekit.cs | 8 - src/spritekit.cs | 8 +- src/uikit.cs | 95 -- src/watchkit.cs | 6 - src/webkit.cs | 57 -- src/xkit.cs | 12 - .../watchOS/Container/Container.csproj | 2 +- tests/common/shared-dotnet.csproj | 3 - tests/introspection/Mac/MacApiProtocolTest.cs | 8 - tests/introspection/Mac/MacApiSelectorTest.cs | 28 - tests/introspection/iOS/iOSApiCtorInitTest.cs | 2 +- tests/introspection/iOS/iOSApiProtocolTest.cs | 15 - .../iOS/iOSApiWeakPropertyTest.cs | 8 - tests/linker/ios/link all/LinkAllTest.cs | 6 - .../AudioToolbox/AudioSessionTest.cs | 43 - .../CoreBluetooth/CentralManagerTest.cs | 15 - .../CoreGraphics/ColorSpaceTest.cs | 8 - .../CoreGraphics/GradientTest.cs | 3 - tests/monotouch-test/CoreMedia/CMTimeTests.cs | 3 - .../MapKit/AnnotationViewTest.cs | 44 - tests/monotouch-test/MapKit/CircleViewTest.cs | 60 -- tests/monotouch-test/MapKit/MapViewTest.cs | 184 ---- .../monotouch-test/MapKit/OverlayViewTest.cs | 44 - .../monotouch-test/MapKit/PolygonViewTest.cs | 60 -- .../monotouch-test/MapKit/PolylineViewTest.cs | 60 -- .../MapKit/UserTrackingBarButtonItemTest.cs | 86 -- .../CaptionAppearanceTest.cs | 17 - .../MailComposeViewControllerTest.cs | 5 - .../monotouch-test/UIKit/BarButtonItemTest.cs | 4 - .../UIKit/SearchDisplayControllerTest.cs | 119 --- .../UIKit/SimpleTextPrintFormatterTest.cs | 25 - tests/monotouch-test/UIKit/SliderTest.cs | 164 --- .../UIKit/StringAttributesTest.cs | 4 - tests/monotouch-test/UIKit/UIDocumentTest.cs | 70 -- .../VideoToolbox/VTUtilitiesTests.cs | 8 - .../templates/WatchContainer/Container.csproj | 2 +- .../common-SpriteKit.ignore | 2 +- 137 files changed, 22 insertions(+), 3775 deletions(-) delete mode 100644 src/AVFoundation/AVFragmentedAsset.cs delete mode 100644 src/AVFoundation/AVFragmentedAssetTrack.cs delete mode 100644 src/AudioToolbox/AudioSession.cs delete mode 100644 src/Contacts/CNObsolete.cs delete mode 100644 src/CoreMotion/CMCompat.cs delete mode 100644 src/Foundation/NSDistributedNotificationCenter.cs delete mode 100644 src/HealthKit/HKObsolete.cs delete mode 100644 src/MapKit/MKDirections.cs delete mode 100644 src/MediaPlayer/MPPlayableContentDelegate.cs delete mode 100644 src/MultipeerConnectivity/Compat.cs delete mode 100644 src/ObjCRuntime/SelectorMarshaler.cs delete mode 100644 src/SceneKit/SCNGeometry.cs delete mode 100644 src/SceneKit/SCNSceneRenderer.cs delete mode 100644 src/Social/SLCompat.cs delete mode 100644 src/SpriteKit/ObsoleteCompat.cs delete mode 100644 src/SpriteKit/SKFieldNode.cs delete mode 100644 src/StoreKit/SKPaymentTransactionObserver.cs delete mode 100644 src/Twitter/TWCompat.cs delete mode 100644 src/UIKit/UIActivityItemProvider.cs delete mode 100644 src/UIKit/UIActivityViewController.cs delete mode 100644 src/UIKit/UICollectionViewTransitionLayout.cs delete mode 100644 src/UIKit/UIDocumentMenuViewController.cs delete mode 100644 src/UIKit/UIDocumentPickerViewController.cs delete mode 100644 src/UIKit/UIPrint.cs delete mode 100644 src/UIKit/UIPrintInteractionController.cs delete mode 100644 src/UIKit/UISimpleTextPrintFormatter.cs delete mode 100644 src/UIKit/UIStoryboardPopoverSegue.cs delete mode 100644 src/UIKit/UIStoryboardSegue.cs delete mode 100644 tests/monotouch-test/AudioToolbox/AudioSessionTest.cs delete mode 100644 tests/monotouch-test/MapKit/UserTrackingBarButtonItemTest.cs delete mode 100644 tests/monotouch-test/UIKit/SearchDisplayControllerTest.cs delete mode 100644 tests/monotouch-test/UIKit/SliderTest.cs diff --git a/src/AVFoundation/AVAudioSessionPortDescription.cs b/src/AVFoundation/AVAudioSessionPortDescription.cs index d0d21b5429a7..0ca3fdbbe916 100644 --- a/src/AVFoundation/AVAudioSessionPortDescription.cs +++ b/src/AVFoundation/AVAudioSessionPortDescription.cs @@ -18,14 +18,6 @@ #if !MONOMAC namespace AVFoundation { public partial class AVAudioSessionPortDescription { -#if !XAMCORE_3_0 - [Obsolete ("Use 'DataSourceDescriptions' instead.")] - public virtual AVAudioSessionChannelDescription [] DataSources { - get { - throw new InvalidOperationException ("Call DataSourceDescriptions instead."); - } - } -#endif } } #endif diff --git a/src/AVFoundation/AVCompat.cs b/src/AVFoundation/AVCompat.cs index 8702909c8a36..6a4d9d0e3c67 100644 --- a/src/AVFoundation/AVCompat.cs +++ b/src/AVFoundation/AVCompat.cs @@ -114,52 +114,6 @@ protected internal AVCaptureDataOutputSynchronizerDelegate (NativeHandle handle) } #endif // MONOMAC -#if !XAMCORE_3_0 - partial class AVAsset { - - [Obsolete ("Use 'GetChapterMetadataGroups'.")] - public virtual AVMetadataItem []? ChapterMetadataGroups (NSLocale forLocale, AVMetadataItem [] commonKeys) - { - return null; - } - } - - partial class AVAssetTrack { - - [Obsolete ("Use 'GetAssociatedTracks'.")] - public virtual NSString? GetAssociatedTracksOfType (NSString avAssetTrackTrackAssociationType) - { - return null; - } - } - - partial class AVMutableCompositionTrack { - - [Obsolete ("Use 'InsertTimeRanges' overload accepting an 'NSValue' array.")] - public virtual bool InsertTimeRanges (NSValue cmTimeRanges, AVAssetTrack [] tracks, CMTime startTime, out NSError error) - { - return InsertTimeRanges (new NSValue [] { cmTimeRanges }, tracks, startTime, out error); - } - } - - - partial class AVCaptureAudioDataOutputSampleBufferDelegate { - - [Obsolete ("This member only exists for 'AVCaptureVideoDataOutputSampleBufferDelegate'.")] - public virtual void DidDropSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection) - { - } - } - - static partial class AVCaptureAudioDataOutputSampleBufferDelegate_Extensions { - - [Obsolete ("This member only exists for 'AVCaptureVideoDataOutputSampleBufferDelegate'.")] - public static void DidDropSampleBuffer (IAVCaptureAudioDataOutputSampleBufferDelegate This, AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection) - { - } - } -#endif - partial class AVCaptureInputPort { [Obsolete ("Valid instance of this type cannot be directly created.")] diff --git a/src/AVFoundation/AVFragmentedAsset.cs b/src/AVFoundation/AVFragmentedAsset.cs deleted file mode 100644 index c2668aaca1b3..000000000000 --- a/src/AVFoundation/AVFragmentedAsset.cs +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright 2015 Xamarin Inc -// - -using System; -using Foundation; - -#nullable enable - -namespace AVFoundation { -#if MONOMAC && !XAMCORE_3_0 - public partial class AVFragmentedAsset { - [Obsolete ("Default constructor should not be used")] - public AVFragmentedAsset () : base (NSObjectFlag.Empty) - { - } - } -#endif -} diff --git a/src/AVFoundation/AVFragmentedAssetTrack.cs b/src/AVFoundation/AVFragmentedAssetTrack.cs deleted file mode 100644 index 2d7bfe397cd9..000000000000 --- a/src/AVFoundation/AVFragmentedAssetTrack.cs +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright 2015 Xamarin Inc -// - -using System; -using Foundation; - -#nullable enable - -namespace AVFoundation { -#if MONOMAC && !XAMCORE_3_0 - public partial class AVFragmentedAssetTrack { - [Obsolete ("Default constructor should not be used")] - public AVFragmentedAssetTrack () : base (NSObjectFlag.Empty) - { - } - } -#endif -} diff --git a/src/AVFoundation/AVTextStyleRule.cs b/src/AVFoundation/AVTextStyleRule.cs index 91f694c854d9..7e432b4415c3 100644 --- a/src/AVFoundation/AVTextStyleRule.cs +++ b/src/AVFoundation/AVTextStyleRule.cs @@ -5,11 +5,5 @@ namespace AVFoundation { public partial class AVTextStyleRule { -#if !XAMCORE_3_0 - [Obsolete ("iOS9 does not allow creating an empty instance")] - public AVTextStyleRule () - { - } -#endif } } diff --git a/src/AVFoundation/Enums.cs b/src/AVFoundation/Enums.cs index 5a82d23db4f2..36f3a5ee05df 100644 --- a/src/AVFoundation/Enums.cs +++ b/src/AVFoundation/Enums.cs @@ -317,10 +317,8 @@ public enum AVAssetImageGeneratorResult : long { } /// An enumeration whose values specify whether a is playing or not. -#if XAMCORE_3_0 [NoiOS] [NoWatch] -#endif [Unavailable (PlatformName.MacCatalyst)] [NoTV] [Native] @@ -332,9 +330,7 @@ public enum AVCaptureDeviceTransportControlsPlaybackMode : long { /// An enumeration whose values specify how interlaced fields should be dealt with. /// /// -#if XAMCORE_3_0 [NoiOS] -#endif [Unavailable (PlatformName.MacCatalyst)] [NoTV] [NoWatch] diff --git a/src/AVKit/Enums.cs b/src/AVKit/Enums.cs index b4b182765c04..d8ba0c052201 100644 --- a/src/AVKit/Enums.cs +++ b/src/AVKit/Enums.cs @@ -5,7 +5,7 @@ namespace AVKit { -#if !XAMCORE_3_0 || MONOMAC +#if MONOMAC // this enum only exists for OSX (not iOS) /// Determines which user interface elements are visible in the AVPlayerView [Native] diff --git a/src/Accounts/Enums.cs b/src/Accounts/Enums.cs index 7b782cb9f84c..1f3a59da84ee 100644 --- a/src/Accounts/Enums.cs +++ b/src/Accounts/Enums.cs @@ -31,15 +31,7 @@ public enum ACErrorCode { CoreDataSaveFailed, FailedSerializingAccountInfo, InvalidCommand, -#if XAMCORE_3_0 MissingTransportMessageId, -#else - [Obsolete ("Use 'MissingTransportMessageId'.")] - MissingMessageID, -#pragma warning disable 618 // MissingMessageID is obsolete - MissingTransportMessageId = MissingMessageID, -#pragma warning restore 618 -#endif CredentialItemNotFound, CredentialItemNotExpired, } diff --git a/src/AppKit/Enums.cs b/src/AppKit/Enums.cs index 89ccd86e4e59..8489dd41abb4 100644 --- a/src/AppKit/Enums.cs +++ b/src/AppKit/Enums.cs @@ -219,15 +219,6 @@ public enum NSColorSpaceModel : long { #endregion #region NSFileWrapper -#if !XAMCORE_3_0 - [NoMacCatalyst] - [Flags] - [Native] - [Obsolete ("Use NSFileWrapperReadingOptions in Foundation instead.")] - public enum NSFileWrapperReadingOptions : ulong { - Immediate = 1, WithoutMapping = 2 - } -#endif #endregion #region NSParagraphStyle diff --git a/src/AppKit/NSPathControlItem.cs b/src/AppKit/NSPathControlItem.cs index 9846f0fb3bc8..9317ba60e3b2 100644 --- a/src/AppKit/NSPathControlItem.cs +++ b/src/AppKit/NSPathControlItem.cs @@ -5,20 +5,7 @@ #nullable enable namespace AppKit { - public partial class NSPathControlItem -#if !XAMCORE_3_0 - : INSCoding -#endif - { -#if !XAMCORE_3_0 - public NSPathControlItem (NSCoder coder) : this () - { - } - - public virtual void EncodeTo (NSCoder coder) - { - } -#endif + public partial class NSPathControlItem { } } #endif // !__MACCATALYST__ diff --git a/src/AudioToolbox/AudioQueue.cs b/src/AudioToolbox/AudioQueue.cs index c387ec547b4f..861adfb17a66 100644 --- a/src/AudioToolbox/AudioQueue.cs +++ b/src/AudioToolbox/AudioQueue.cs @@ -1185,15 +1185,6 @@ public int DecodeBufferSizeFrames { } } -#if !XAMCORE_3_0 - [Obsolete ("Use 'AudioStreamDescription' instead.")] - public AudioStreamBasicDescription AudioStreamPacketDescription { - get { - return AudioStreamDescription; - } - } -#endif - public AudioStreamBasicDescription AudioStreamDescription { get { #if !MONOMAC diff --git a/src/AudioToolbox/AudioSession.cs b/src/AudioToolbox/AudioSession.cs deleted file mode 100644 index 1fb243bb330a..000000000000 --- a/src/AudioToolbox/AudioSession.cs +++ /dev/null @@ -1,953 +0,0 @@ -// -// AudioSession.cs: AudioSession bindings -// -// Authors: -// Miguel de Icaza (miguel@novell.com) -// Marek Safar (marek.safar@gmail.com) -// -// Copyright 2009 Novell, Inc -// Copyright 2011-2013 Xamarin Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -#nullable enable - -using System; -using System.IO; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using CoreFoundation; -using ObjCRuntime; -using Foundation; -using System.Threading; - -using OSStatus = System.Int32; - -namespace AudioToolbox { - // This API has been deprecated in iOS 7 and everyone should be using AVAudioSession now - // also AudioSession has been removed from TVOS already and AVAudioSession has been around since iOS 3.0 -#if !XAMCORE_3_0 -#if !TVOS -#if !MONOMAC // AudioSession isn't an OS X API, but can't remove from compat - public class AudioSessionException : Exception { - static string Lookup (int k) - { - switch ((AudioSessionErrors) k) { - case AudioSessionErrors.NotInitialized: - return "AudioSession.Initialize has not been called"; - - case AudioSessionErrors.AlreadyInitialized: - return "You called AudioSession.Initialize more than once"; - - case AudioSessionErrors.InitializationError: - return "There was an error during the AudioSession.initialization"; - - case AudioSessionErrors.UnsupportedPropertyError: - return "The audio session property is not supported"; - - case AudioSessionErrors.BadPropertySizeError: - return "The size of the audio property was not correct"; - - case AudioSessionErrors.NotActiveError: - return "Application Audio Session is not active"; - - case AudioSessionErrors.NoHardwareError: - return "The device has no Audio Input capability"; - - case AudioSessionErrors.IncompatibleCategory: - return "The specified AudioSession.Category can not be used with this audio operation"; - - case AudioSessionErrors.NoCategorySet: - return "This operation requries AudioSession.Category to be explicitly set"; - - } - return String.Format ("Unknown error code: {0}", k); - } - - internal AudioSessionException (int k) : base (Lookup (k)) - { - ErrorCode = (AudioSessionErrors) k; - } - - public AudioSessionErrors ErrorCode { get; private set; } - } - - public class AccessoryInfo { - internal AccessoryInfo (int id, string? description) - { - ID = id; - Description = description; - } - - public int ID { get; private set; } - public string? Description { get; private set; } - } - - public class InputSourceInfo { - public int ID { get; private set; } - public string? Description { get; private set; } - } - - public class AudioSessionPropertyEventArgs : EventArgs { - public AudioSessionPropertyEventArgs (AudioSessionProperty prop, int size, IntPtr data) - { - this.Property = prop; - this.Size = size; - this.Data = data; - } - public AudioSessionProperty Property { get; set; } - public int Size { get; set; } - public IntPtr Data { get; set; } - } - - public class AudioSessionRouteChangeEventArgs : EventArgs { - static IntPtr route_change_key, previous_route_key, current_route_key; - - static AudioSessionRouteChangeEventArgs () - { - var lib = Libraries.AudioToolbox.Handle; - route_change_key = Dlfcn.GetIntPtr (lib, "kAudioSession_RouteChangeKey_Reason"); - previous_route_key = Dlfcn.GetIntPtr (lib, "kAudioSession_AudioRouteChangeKey_PreviousRouteDescription"); - current_route_key = Dlfcn.GetIntPtr (lib, "kAudioSession_AudioRouteChangeKey_CurrentRouteDescription"); - } - - public NSDictionary Dictionary { get; private set; } - - public AudioSessionRouteChangeEventArgs (IntPtr dictHandle) - { - Dictionary = new NSDictionary (dictHandle); - } - -#if NET - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("ios7.0")] - [ObsoletedOSPlatform ("ios7.0")] -#else - [Deprecated (PlatformName.iOS, 7, 0)] -#endif - public AudioSessionRouteChangeReason Reason { - get { - using (var num = new NSNumber (Dictionary.LowlevelObjectForKey (route_change_key))) { - return (AudioSessionRouteChangeReason) num.Int32Value; - } - } - } - - NSArray? Extract (IntPtr key, NSString secondKey) - { - var dictH = Dictionary.LowlevelObjectForKey (key); - if (dictH == IntPtr.Zero) - return null; - - // Console.WriteLine ("Extracting from {2} {0} and getting {1}", new NSString (key), new NSDictionary (dictH).Description, Dictionary.Description); - // Description dictionary, indexed by the second key, the result is an array - using (var descDict = new NSDictionary (dictH)) { - var sdict = descDict.LowlevelObjectForKey (secondKey.Handle); - if (sdict == IntPtr.Zero) - return null; - - return new NSArray (sdict); - } - } - -#if NET - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("ios7.0")] - [ObsoletedOSPlatform ("ios7.0")] -#else - [Deprecated (PlatformName.iOS, 7, 0)] -#endif - public AudioSessionInputRouteKind PreviousInputRoute { - get { - using (var array = Extract (previous_route_key, AudioSession.AudioRouteKey_Inputs!)) - return AudioSession.GetInputRoute (array); - } - } - -#if NET - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("ios7.0")] - [ObsoletedOSPlatform ("ios7.0")] -#else - [Deprecated (PlatformName.iOS, 7, 0)] -#endif - public AudioSessionOutputRouteKind []? PreviousOutputRoutes { - get { - using (var array = Extract (previous_route_key, AudioSession.AudioRouteKey_Outputs!)) - return AudioSession.GetOutputRoutes (array); - } - } - -#if NET - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("ios7.0")] - [ObsoletedOSPlatform ("ios7.0")] -#else - [Deprecated (PlatformName.iOS, 7, 0)] -#endif - public AudioSessionInputRouteKind CurrentInputRoute { - get { - using (var array = Extract (current_route_key, AudioSession.AudioRouteKey_Inputs!)) - return AudioSession.GetInputRoute (array); - } - } - -#if NET - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("ios7.0")] - [ObsoletedOSPlatform ("ios7.0")] -#else - [Deprecated (PlatformName.iOS, 7, 0)] -#endif - public AudioSessionOutputRouteKind []? CurrentOutputRoutes { - get { - using (var array = Extract (current_route_key, AudioSession.AudioRouteKey_Outputs!)) - return AudioSession.GetOutputRoutes (array); - } - } - } - -#if NET - [UnsupportedOSPlatform ("ios7.0")] - [ObsoletedOSPlatform ("ios7.0", "Use 'AVAudioSession' instead.")] -#else - [Deprecated (PlatformName.iOS, 7, 0, message: "Use 'AVAudioSession' instead.")] -#endif - public static class AudioSession { - static bool initialized; - public static event EventHandler? Interrupted; - public static event EventHandler? Resumed; - - internal static NSString? AudioRouteKey_Type; - internal static NSString? AudioRouteKey_Inputs; - internal static NSString? AudioRouteKey_Outputs; - - static NSString? InputRoute_LineIn; - static NSString? InputRoute_BuiltInMic; - static NSString? InputRoute_HeadsetMic; - static NSString? InputRoute_BluetoothHFP; - static NSString? InputRoute_USBAudio; - - static NSString? OutputRoute_LineOut; - static NSString? OutputRoute_Headphones; - static NSString? OutputRoute_BluetoothHFP; - static NSString? OutputRoute_BluetoothA2DP; - static NSString? OutputRoute_BuiltInReceiver; - static NSString? OutputRoute_BuiltInSpeaker; - static NSString? OutputRoute_USBAudio; - static NSString? OutputRoute_HDMI; - static NSString? OutputRoute_AirPlay; - static NSString? InputSourceKey_ID; - static NSString? InputSourceKey_Description; - static NSString? OutputDestinationKey_ID; - static NSString? OutputDestinationKey_Description; - - [DllImport (Constants.AudioToolboxLibrary)] -#if NET - unsafe extern static OSStatus AudioSessionInitialize(IntPtr cfRunLoop, IntPtr cfstr_runMode, delegate* unmanaged listener, IntPtr userData); -#else - extern static OSStatus AudioSessionInitialize (IntPtr cfRunLoop, IntPtr cfstr_runMode, InterruptionListener listener, IntPtr userData); -#endif - - public static void Initialize () - { - Initialize (null, null); - } - - public static void Initialize (CFRunLoop? runLoop, string? runMode) - { - CFString? s = runMode is null ? null : new CFString (runMode); -#if NET - int k; - unsafe { - k = AudioSessionInitialize (runLoop.GetHandle (), s.GetHandle (), &Interruption, IntPtr.Zero); - } -#else - int k = AudioSessionInitialize (runLoop.GetHandle (), s.GetHandle (), Interruption, IntPtr.Zero); -#endif - if (k != 0 && k != (int) AudioSessionErrors.AlreadyInitialized) - throw new AudioSessionException (k); - - if (initialized) - return; - - IntPtr lib = Libraries.AudioToolbox.Handle; - - AudioRouteKey_Inputs = Dlfcn.GetStringConstant (lib, "kAudioSession_AudioRouteKey_Inputs"); - AudioRouteKey_Outputs = Dlfcn.GetStringConstant (lib, "kAudioSession_AudioRouteKey_Outputs"); - AudioRouteKey_Type = Dlfcn.GetStringConstant (lib, "kAudioSession_AudioRouteKey_Type"); - - InputRoute_LineIn = Dlfcn.GetStringConstant (lib, "kAudioSessionInputRoute_LineIn"); - InputRoute_BuiltInMic = Dlfcn.GetStringConstant (lib, "kAudioSessionInputRoute_BuiltInMic"); - InputRoute_HeadsetMic = Dlfcn.GetStringConstant (lib, "kAudioSessionInputRoute_HeadsetMic"); - InputRoute_BluetoothHFP = Dlfcn.GetStringConstant (lib, "kAudioSessionInputRoute_BluetoothHFP"); - InputRoute_USBAudio = Dlfcn.GetStringConstant (lib, "kAudioSessionInputRoute_USBAudio"); - - OutputRoute_LineOut = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_LineOut"); - OutputRoute_Headphones = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_Headphones"); - OutputRoute_BluetoothHFP = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_BluetoothHFP"); - OutputRoute_BluetoothA2DP = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_BluetoothA2DP"); - OutputRoute_BuiltInReceiver = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_BuiltInReceiver"); - OutputRoute_BuiltInSpeaker = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_BuiltInSpeaker"); - OutputRoute_USBAudio = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_USBAudio"); - OutputRoute_HDMI = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_HDMI"); - OutputRoute_AirPlay = Dlfcn.GetStringConstant (lib, "kAudioSessionOutputRoute_AirPlay"); - - InputSourceKey_ID = Dlfcn.GetStringConstant (lib, "kAudioSession_InputSourceKey_ID"); - InputSourceKey_Description = Dlfcn.GetStringConstant (lib, "kAudioSession_InputSourceKey_Description"); - - OutputDestinationKey_ID = Dlfcn.GetStringConstant (lib, "kAudioSession_OutputDestinationKey_ID"); - OutputDestinationKey_Description = Dlfcn.GetStringConstant (lib, "kAudioSession_OutputDestinationKey_Description"); - - initialized = true; - } - -#if !NET - delegate void InterruptionListener (IntPtr userData, uint state); -#endif - -#if NET - [UnmanagedCallersOnly] -#else - [MonoPInvokeCallback (typeof (InterruptionListener))] -#endif - static void Interruption (IntPtr userData, uint state) - { - EventHandler h; - - h = (state == 1) ? Interrupted! : Resumed!; - if (h is not null) - h (null, EventArgs.Empty); - } - - [DllImport (Constants.AudioToolboxLibrary)] - extern static OSStatus AudioSessionSetActive (byte active); - - public static void SetActive (bool active) - { - int k = AudioSessionSetActive (active ? (byte) 1 : (byte) 0); - if (k != 0) - throw new AudioSessionException (k); - } - - [DllImport (Constants.AudioToolboxLibrary)] - extern static AudioSessionErrors AudioSessionSetActiveWithFlags (byte active, AudioSessionActiveFlags inFlags); - - public static AudioSessionErrors SetActive (bool active, AudioSessionActiveFlags flags) - { - return AudioSessionSetActiveWithFlags (active ? (byte) 1 : (byte) 0, flags); - } - - [DllImport (Constants.AudioToolboxLibrary)] - unsafe extern static OSStatus AudioSessionGetProperty (AudioSessionProperty id, int* size, IntPtr data); - - [DllImport (Constants.AudioToolboxLibrary)] - extern static OSStatus AudioSessionSetProperty (AudioSessionProperty id, int size, IntPtr data); - - [DllImport (Constants.AudioToolboxLibrary)] - // deprecated in iOS7 but not exposed / used anywhere - unsafe extern static OSStatus AudioSessionGetPropertySize (AudioSessionProperty id, int* size); - - static double GetDouble (AudioSessionProperty property) - { - unsafe { - double val = 0; - int size = 8; - int k = AudioSessionGetProperty (property, &size, (IntPtr) (&val)); - if (k != 0) - throw new AudioSessionException (k); - - return val; - } - } - - static float GetFloat (AudioSessionProperty property) - { - unsafe { - float val = 0; - int size = 4; - int k = AudioSessionGetProperty (property, &size, (IntPtr) (&val)); - if (k != 0) - throw new AudioSessionException (k); - return val; - } - } - - static int GetInt (AudioSessionProperty property) - { - unsafe { - int val = 0; - int size = 4; - int k = AudioSessionGetProperty (property, &size, (IntPtr) (&val)); - if (k != 0) - throw new AudioSessionException (k); - - return val; - } - } - - static IntPtr GetIntPtr (AudioSessionProperty property) - { - unsafe { - IntPtr val; - int size = IntPtr.Size; - int k = AudioSessionGetProperty (property, &size, (IntPtr) (&val)); - if (k != 0) - throw new AudioSessionException (k); - - return val; - } - } - - static void SetDouble (AudioSessionProperty property, double val) - { - unsafe { - int k = AudioSessionSetProperty (property, 8, (IntPtr) (&val)); - if (k != 0) - throw new AudioSessionException (k); - } - } - - static void SetInt (AudioSessionProperty property, int val) - { - unsafe { - int k = AudioSessionSetProperty (property, sizeof (int), (IntPtr) (&val)); - if (k != 0) - throw new AudioSessionException (k); - } - } - - static void SetFloat (AudioSessionProperty property, float val) - { - unsafe { - int k = AudioSessionSetProperty (property, 4, (IntPtr) (&val)); - if (k != 0) - throw new AudioSessionException (k); - } - } - - static public double PreferredHardwareSampleRate { - get { - return GetDouble (AudioSessionProperty.PreferredHardwareSampleRate); - } - set { - SetDouble (AudioSessionProperty.PreferredHardwareSampleRate, value); - } - } - - static public float PreferredHardwareIOBufferDuration { - get { - return GetFloat (AudioSessionProperty.PreferredHardwareIOBufferDuration); - } - set { - SetFloat (AudioSessionProperty.PreferredHardwareIOBufferDuration, value); - } - } - - static public AudioSessionCategory Category { - get { - return (AudioSessionCategory) GetInt (AudioSessionProperty.AudioCategory); - } - set { - SetInt (AudioSessionProperty.AudioCategory, (int) value); - } - } - - public static AudioSessionInterruptionType InterruptionType { - get { - return (AudioSessionInterruptionType) GetInt (AudioSessionProperty.InterruptionType); - } - } - -#if NET - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [SupportedOSPlatform ("tvos")] - [SupportedOSPlatform ("macos")] - [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'InputRoute' or 'OutputRoute' instead.")] - [ObsoletedOSPlatform ("macos10.7", "Use 'InputRoute' or 'OutputRoute' instead.")] - [ObsoletedOSPlatform ("ios5.0", "Use 'InputRoute' or 'OutputRoute' instead.")] - [ObsoletedOSPlatform ("tvos9.0", "Use 'InputRoute' or 'OutputRoute' instead.")] -#else - [Deprecated (PlatformName.iOS, 5, 0, message: "Use 'InputRoute' or 'OutputRoute' instead.")] -#endif - static public string? AudioRoute { - get { - return CFString.FromHandle (GetIntPtr (AudioSessionProperty.AudioRoute)); - } - } - - static public AccessoryInfo [] InputSources { - get { - return ExtractAccessoryInfo (GetIntPtr (AudioSessionProperty.InputSources), InputSourceKey_ID!, InputSourceKey_Description!); - } - } - - static public AccessoryInfo [] OutputDestinations { - get { - return ExtractAccessoryInfo (GetIntPtr (AudioSessionProperty.OutputDestinations), OutputDestinationKey_ID!, OutputDestinationKey_Description!); - } - } - - static AccessoryInfo [] ExtractAccessoryInfo (IntPtr ptr, NSString id, NSString description) - { - using (var array = new CFArray (ptr, false)) { - var res = new AccessoryInfo [array.Count]; - for (int i = 0; i < res.Length; ++i) { - var dict = array.GetValue (i); - var n = new NSNumber (CFDictionary.GetValue (dict, id.Handle)); - var desc = CFString.FromHandle (CFDictionary.GetValue (dict, description.Handle)); - - res [i] = new AccessoryInfo ((int) n, desc); - id.Dispose (); - } - return res; - } - } - - /* Could not test what sort of unique CFNumberRef value it's - - static public int InputSource { - get { - return GetInt (AudioSessionProperty.InputSource); - } - set { - SetInt (AudioSessionProperty.InputSource, value); - } - } - - static public int OutputDestination { - get { - return GetInt (AudioSessionProperty.OutputDestination); - } - set { - SetInt (AudioSessionProperty.OutputDestination, value); - } - } - - */ - - static internal AudioSessionInputRouteKind GetInputRoute (NSArray? arr) - { - if (arr is null || arr.Count == 0) - return AudioSessionInputRouteKind.None; - - var dict = new NSDictionary (arr.ValueAt (0)); - - if (dict is null || dict.Count == 0) - return AudioSessionInputRouteKind.None; - - var val = (NSString) dict [AudioRouteKey_Type]; - - if (val is null) - return AudioSessionInputRouteKind.None; - - if (val == InputRoute_LineIn) { - return AudioSessionInputRouteKind.LineIn; - } else if (val == InputRoute_BuiltInMic) { - return AudioSessionInputRouteKind.BuiltInMic; - } else if (val == InputRoute_HeadsetMic) { - return AudioSessionInputRouteKind.HeadsetMic; - } else if (val == InputRoute_BluetoothHFP) { - return AudioSessionInputRouteKind.BluetoothHFP; - } else if (val == InputRoute_USBAudio) { - return AudioSessionInputRouteKind.USBAudio; - } else { - return (AudioSessionInputRouteKind) (int) (IntPtr) val.Handle; - } - } - - static internal AudioSessionOutputRouteKind []? GetOutputRoutes (NSArray? arr) - { - if (arr is null || arr.Count == 0) - return null; - - var result = new AudioSessionOutputRouteKind [arr.Count]; - for (uint i = 0; i < arr.Count; i++) { - var dict = new NSDictionary ((IntPtr) arr.ValueAt (i)); - - result [i] = AudioSessionOutputRouteKind.None; - - if (dict is null || dict.Count == 0) - continue; - - var val = (NSString) dict [AudioRouteKey_Type]; - - if (val is null) - continue; - - if (val == OutputRoute_LineOut) { - result [i] = AudioSessionOutputRouteKind.LineOut; - } else if (val == OutputRoute_Headphones) { - result [i] = AudioSessionOutputRouteKind.Headphones; - } else if (val == OutputRoute_BluetoothHFP) { - result [i] = AudioSessionOutputRouteKind.BluetoothHFP; - } else if (val == OutputRoute_BluetoothA2DP) { - result [i] = AudioSessionOutputRouteKind.BluetoothA2DP; - } else if (val == OutputRoute_BuiltInReceiver) { - result [i] = AudioSessionOutputRouteKind.BuiltInReceiver; - } else if (val == OutputRoute_BuiltInSpeaker) { - result [i] = AudioSessionOutputRouteKind.BuiltInSpeaker; - } else if (val == OutputRoute_USBAudio) { - result [i] = AudioSessionOutputRouteKind.USBAudio; - } else if (val == OutputRoute_HDMI) { - result [i] = AudioSessionOutputRouteKind.HDMI; - } else if (val == OutputRoute_AirPlay) { - result [i] = AudioSessionOutputRouteKind.AirPlay; - } else - result [i] = (AudioSessionOutputRouteKind) (int) (IntPtr) val.Handle; - } - return result; - } - - static public AudioSessionInputRouteKind InputRoute { - get { - return GetInputRoute ((NSArray) AudioRouteDescription [AudioRouteKey_Inputs]); - } - } - - static public AudioSessionOutputRouteKind []? OutputRoutes { - get { - return GetOutputRoutes ((NSArray) AudioRouteDescription [AudioRouteKey_Outputs]); - } - } - - static NSDictionary AudioRouteDescription { - get { - NSDictionary dict = new NSDictionary (GetIntPtr (AudioSessionProperty.AudioRouteDescription)); - dict.DangerousRelease (); - return dict; - } - } - - static public double CurrentHardwareSampleRate { - get { - return GetDouble (AudioSessionProperty.CurrentHardwareSampleRate); - } - } - - static public int CurrentHardwareInputNumberChannels { - get { - return GetInt (AudioSessionProperty.CurrentHardwareInputNumberChannels); - } - } - - static public int CurrentHardwareOutputNumberChannels { - get { - return GetInt (AudioSessionProperty.CurrentHardwareOutputNumberChannels); - } - } - - static public float CurrentHardwareOutputVolume { - get { - return GetFloat (AudioSessionProperty.CurrentHardwareOutputVolume); - } - } - - static public float CurrentHardwareInputLatency { - get { - return GetFloat (AudioSessionProperty.CurrentHardwareInputLatency); - } - } - - static public float CurrentHardwareOutputLatency { - get { - return GetFloat (AudioSessionProperty.CurrentHardwareOutputLatency); - } - } - - static public float CurrentHardwareIOBufferDuration { - get { - return GetFloat (AudioSessionProperty.CurrentHardwareIOBufferDuration); - } - } - - static public bool OtherAudioIsPlaying { - get { - return GetInt (AudioSessionProperty.OtherAudioIsPlaying) != 0; - } - } - - static public AudioSessionRoutingOverride RoutingOverride { - set { - SetInt (AudioSessionProperty.OverrideAudioRoute, (int) value); - } - } - - static public bool AudioInputAvailable { - get { - return GetInt (AudioSessionProperty.AudioInputAvailable) != 0; - } - } - - static public bool AudioShouldDuck { - get { - return GetInt (AudioSessionProperty.OtherMixableAudioShouldDuck) != 0; - } - set { - SetInt (AudioSessionProperty.OtherMixableAudioShouldDuck, value ? 1 : 0); - } - } - - static public bool OverrideCategoryMixWithOthers { - get { - return GetInt (AudioSessionProperty.OverrideCategoryMixWithOthers) != 0; - } - set { - SetInt (AudioSessionProperty.OverrideCategoryMixWithOthers, value ? 1 : 0); - } - } - - static public bool OverrideCategoryDefaultToSpeaker { - get { - return GetInt (AudioSessionProperty.OverrideCategoryDefaultToSpeaker) != 0; - } - set { - SetInt (AudioSessionProperty.OverrideCategoryDefaultToSpeaker, value ? 1 : 0); - } - } - - static public bool OverrideCategoryEnableBluetoothInput { - get { - return GetInt (AudioSessionProperty.OverrideCategoryEnableBluetoothInput) != 0; - } - set { - SetInt (AudioSessionProperty.OverrideCategoryEnableBluetoothInput, value ? 1 : 0); - } - } - - static public AudioSessionMode Mode { - get { - return (AudioSessionMode) GetInt (AudioSessionProperty.Mode); - } - set { - SetInt (AudioSessionProperty.Mode, (int) value); - } - } - - static public bool InputGainAvailable { - get { - return GetInt (AudioSessionProperty.InputGainAvailable) != 0; - } - } - - static public float InputGainScalar { - get { - return GetFloat (AudioSessionProperty.InputGainScalar); - } - set { - SetFloat (AudioSessionProperty.InputGainScalar, value); - } - } - -#if !NET - delegate void _PropertyListener (IntPtr userData, AudioSessionProperty prop, int size, IntPtr data); -#endif - public delegate void PropertyListener (AudioSessionProperty prop, int size, IntPtr data); - -#if NET - [UnmanagedCallersOnly] -#else - [MonoPInvokeCallback (typeof (_PropertyListener))] -#endif - static void Listener (IntPtr userData, AudioSessionProperty prop, int size, IntPtr data) - { - ArrayList a = (ArrayList) listeners! [prop]; - if (a is null) { - // Should never happen - return; - } - - foreach (PropertyListener pl in a) { - pl (prop, size, data); - } - } - - [DllImport (Constants.AudioToolboxLibrary)] -#if NET - unsafe extern static AudioSessionErrors AudioSessionAddPropertyListener(AudioSessionProperty id, delegate* unmanaged inProc, IntPtr userData); -#else - extern static AudioSessionErrors AudioSessionAddPropertyListener (AudioSessionProperty id, _PropertyListener inProc, IntPtr userData); -#endif - - static Hashtable? listeners; - - public static AudioSessionErrors AddListener (AudioSessionProperty property, PropertyListener listener) - { - if (listener is null) - ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (listener)); - - if (listeners is null) - listeners = new Hashtable (); - - ArrayList a = (ArrayList) listeners [property]; - if (a is null) - listeners [property] = a = new ArrayList (); - - a.Add (listener); - - if (a.Count == 1) { -#if NET - unsafe { - return AudioSessionAddPropertyListener (property, &Listener, IntPtr.Zero); - } -#else - return AudioSessionAddPropertyListener (property, Listener, IntPtr.Zero); -#endif - } - - return AudioSessionErrors.None; - } - - public static void RemoveListener (AudioSessionProperty property, PropertyListener listener) - { - if (listener is null) - ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (listener)); - - ArrayList a = (ArrayList) listeners! [property]; - if (a is null) - return; - a.Remove (listener); - if (a.Count == 0) - listeners [property] = null; - } - - static Hashtable? strongListenerHash; - - static void AddListenerEvent (AudioSessionProperty property, object handler, PropertyListener listener) - { - if (strongListenerHash is null) - Interlocked.CompareExchange (ref strongListenerHash, new Hashtable (), null); - - lock (strongListenerHash) { - strongListenerHash [handler] = listener; - } - - AddListener (property, listener); - } - - static void RemoveListenerEvent (AudioSessionProperty property, object handler) - { - if (strongListenerHash is null) - return; - - PropertyListener listener; - lock (strongListenerHash) { - listener = (PropertyListener) strongListenerHash [handler]; - if (listener is null) - return; - - strongListenerHash.Remove (handler); - } - - RemoveListener (AudioSessionProperty.CurrentHardwareOutputVolume, listener); - } - - public static event EventHandler AudioRouteChanged { - add { - AddListenerEvent (AudioSessionProperty.AudioRouteChange, value, - (prop, size, data) => value (null, new AudioSessionRouteChangeEventArgs (data))); - } - remove { - RemoveListenerEvent (AudioSessionProperty.AudioRouteChange, value); - } - } - - public static event Action CurrentHardwareOutputVolumeChanged { - add { - AddListenerEvent (AudioSessionProperty.CurrentHardwareOutputVolume, value, - (prop, size, data) => value ((float) data)); - } - remove { - RemoveListenerEvent (AudioSessionProperty.CurrentHardwareOutputVolume, value); - } - } - - public static event Action AudioInputBecameAvailable { - add { - AddListenerEvent (AudioSessionProperty.AudioInputAvailable, value, - (prop, size, data) => value (data != IntPtr.Zero)); - } - remove { - RemoveListenerEvent (AudioSessionProperty.AudioInputAvailable, value); - } - } - - public static event Action ServerDied { - add { - AddListenerEvent (AudioSessionProperty.ServerDied, value, - (prop, size, data) => value (data != IntPtr.Zero)); - } - remove { - RemoveListenerEvent (AudioSessionProperty.ServerDied, value); - } - } - - public static event Action InputGainBecameAvailable { - add { - AddListenerEvent (AudioSessionProperty.InputGainAvailable, value, - (prop, size, data) => value (data != IntPtr.Zero)); - } - remove { - RemoveListenerEvent (AudioSessionProperty.InputGainAvailable, value); - } - } - - public static event Action InputGainScalarChanged { - add { - AddListenerEvent (AudioSessionProperty.InputGainScalar, value, - (prop, size, data) => value ((float) data)); - } - remove { - RemoveListenerEvent (AudioSessionProperty.InputGainScalar, value); - } - } - - public static event Action InputSourcesChanged { - add { - AddListenerEvent (AudioSessionProperty.InputSources, value, - (prop, size, data) => value (ExtractAccessoryInfo (data, InputSourceKey_ID!, InputSourceKey_Description!))); - } - remove { - RemoveListenerEvent (AudioSessionProperty.InputSources, value); - } - } - - public static event Action OutputDestinationsChanged { - add { - AddListenerEvent (AudioSessionProperty.OutputDestinations, value, - (prop, size, data) => value (ExtractAccessoryInfo (data, OutputDestinationKey_ID!, OutputDestinationKey_Description!))); - } - remove { - RemoveListenerEvent (AudioSessionProperty.OutputDestinations, value); - } - } - } -#endif // !MONOMAC -#endif // !TVOS -#endif // !XAMCORE_3_0 -} diff --git a/src/AudioUnit/AUEnums.cs b/src/AudioUnit/AUEnums.cs index acc8e5ccdcf9..78e04b45d24e 100644 --- a/src/AudioUnit/AUEnums.cs +++ b/src/AudioUnit/AUEnums.cs @@ -260,12 +260,8 @@ public enum AudioObjectPropertyElement : uint { Main = 0, // 0 } -#if XAMCORE_3_0 /// An enumeration whose values specify a kind of . [Internal] -#else - [Obsolete ("Please use the strongly typed properties instead.")] -#endif enum AudioUnitPropertyIDType { // UInt32 AudioUnitPropertyID // Audio Unit Properties ClassInfo = 0, diff --git a/src/AudioUnit/AudioUnit.cs b/src/AudioUnit/AudioUnit.cs index 4b390ed3abf5..332c6302aa1f 100644 --- a/src/AudioUnit/AudioUnit.cs +++ b/src/AudioUnit/AudioUnit.cs @@ -30,11 +30,6 @@ #nullable enable -// Adding this warning disable since AudioUnitPropertyIDType is removed from public API but used internally -#if !XAMCORE_3_0 -#pragma warning disable CS0618 -#endif - using System; using System.Collections; using System.Collections.Generic; @@ -396,22 +391,6 @@ public AudioComponent Component { public bool IsPlaying { get { return _isPlaying; } } - -#if !XAMCORE_3_0 - [Obsolete ("Use 'SetFormat' instead as it has the ability of returning a status code.")] - public unsafe void SetAudioFormat (AudioToolbox.AudioStreamBasicDescription audioFormat, AudioUnitScopeType scope, uint audioUnitElement = 0) - { - var err = AudioUnitSetProperty (Handle, - AudioUnitPropertyIDType.StreamFormat, - scope, - audioUnitElement, - &audioFormat, - (uint) Marshal.SizeOf ()); - if (err != 0) - throw new AudioUnitException (err); - } -#endif - public unsafe AudioUnitStatus SetFormat (AudioToolbox.AudioStreamBasicDescription audioFormat, AudioUnitScopeType scope, uint audioUnitElement = 0) { return (AudioUnitStatus) AudioUnitSetProperty (Handle, @@ -440,7 +419,7 @@ public uint GetCurrentDevice (AudioUnitScopeType scope, uint audioUnitElement = return device; } -#if !XAMCORE_3_0 || MONOMAC || __MACCATALYST__ +#if MONOMAC || __MACCATALYST__ #if !MONOMAC && !__MACCATALYST__ [Obsolete ("This API is not available on iOS.")] #endif @@ -477,8 +456,6 @@ public static uint GetCurrentInputDevice () if (err != 0) throw new AudioUnitException ((int) err); return inputDevice; -#elif !XAMCORE_3_0 - return 0; #endif } #endif @@ -1163,7 +1140,7 @@ public unsafe AudioUnitStatus SetScheduledFiles (AudioFile [] audioFiles) #endif // !COREBUILD } -#if !XAMCORE_3_0 || MONOMAC || __MACCATALYST__ +#if MONOMAC || __MACCATALYST__ [StructLayout (LayoutKind.Sequential)] struct AudioObjectPropertyAddress { #if !COREBUILD @@ -1186,7 +1163,7 @@ public AudioObjectPropertyAddress (AudioObjectPropertySelector selector, AudioOb } #endif // !COREBUILD } -#endif // !XAMCORE_3_0 || MONOMAC || __MACCATALYST__ +#endif // MONOMAC || __MACCATALYST__ #if NET [SupportedOSPlatform ("ios")] diff --git a/src/CloudKit/CKRecordID.cs b/src/CloudKit/CKRecordID.cs index 88a4cbcc7314..48bc5c66149c 100644 --- a/src/CloudKit/CKRecordID.cs +++ b/src/CloudKit/CKRecordID.cs @@ -5,11 +5,5 @@ namespace CloudKit { public partial class CKRecordID { -#if !XAMCORE_3_0 - [Obsolete ("iOS9 does not allow creating an empty instance")] - public CKRecordID () - { - } -#endif } } diff --git a/src/CloudKit/CKRecordZoneID.cs b/src/CloudKit/CKRecordZoneID.cs index c35b563cb3eb..fbe85e875a8a 100644 --- a/src/CloudKit/CKRecordZoneID.cs +++ b/src/CloudKit/CKRecordZoneID.cs @@ -5,11 +5,5 @@ namespace CloudKit { public partial class CKRecordZoneID { -#if !XAMCORE_3_0 - [Obsolete ("iOS9 does not allow creating an empty instance")] - public CKRecordZoneID () - { - } -#endif } } diff --git a/src/Contacts/CNObsolete.cs b/src/Contacts/CNObsolete.cs deleted file mode 100644 index a67238558478..000000000000 --- a/src/Contacts/CNObsolete.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015 Xamarin Inc. All rights reserved. - -// note: Contacts is not part of classic as several API requires generics - -#nullable enable - -#if !XAMCORE_3_0 - -using System; -using Foundation; -using ObjCRuntime; - -namespace Contacts { - - public static partial class CNGroup_PredicatesExtension { - -#if !MONOMAC - [Obsolete ("This API is only available on macOS 10.11+.")] - public static Foundation.NSPredicate? GetPredicateForSubgroupsInGroup (CNGroup This, string parentGroupIdentifier) - { - return null; - } -#endif - } -} - -#endif diff --git a/src/CoreBluetooth/CoreBluetooth.cs b/src/CoreBluetooth/CoreBluetooth.cs index c51d7bb31c89..738dec0c38a9 100644 --- a/src/CoreBluetooth/CoreBluetooth.cs +++ b/src/CoreBluetooth/CoreBluetooth.cs @@ -21,15 +21,6 @@ public CBCentralManager (DispatchQueue dispatchQueue) : this (new _CBCentralMana } } -#if !MONOMAC && !XAMCORE_3_0 && !NET - public partial class CBPeer { - - [Obsolete ("This type is not meant to be created by user code.", true)] - public CBPeer () - { - } - } -#endif #if !WATCH && !NET public partial class CBCentralManager { diff --git a/src/CoreData/Obsolete.cs b/src/CoreData/Obsolete.cs index e91d1e1ca697..8135abc137f0 100644 --- a/src/CoreData/Obsolete.cs +++ b/src/CoreData/Obsolete.cs @@ -5,31 +5,6 @@ #nullable enable namespace CoreData { -#if !XAMCORE_3_0 - public partial class NSMergeConflict { - - [Obsolete ("Default constructor is not available")] - public NSMergeConflict () - { - } - } - - public partial class NSMergePolicy { - - [Obsolete ("Default constructor is not available")] - public NSMergePolicy () - { - } - } - - public partial class NSPersistentStore { - - [Obsolete ("Default constructor is not available")] - public NSPersistentStore () - { - } - } -#endif #if !NET public partial class NSCoreDataCoreSpotlightDelegate { diff --git a/src/CoreGraphics/CGColorSpace.cs b/src/CoreGraphics/CGColorSpace.cs index 864a758d1abc..ec5bcaa1a88a 100644 --- a/src/CoreGraphics/CGColorSpace.cs +++ b/src/CoreGraphics/CGColorSpace.cs @@ -72,15 +72,6 @@ public enum CGColorSpaceModel { #endif public class CGColorSpace : NativeObject { #if !COREBUILD -#if !XAMCORE_3_0 -#if !NET - [Obsolete ("Use a real 'null' value instead of this managed wrapper over a null native instance.")] -#else - [Obsolete ("Use a real 'null' value instead of this managed wrapper over a null native instance.", DiagnosticId = "BI1234", UrlFormat = "https://github.com/xamarin/xamarin-macios/wiki/Obsolete")] -#endif - public readonly static CGColorSpace Null = CreateNull (); -#endif - #if !NET public CGColorSpace (NativeHandle handle) : base (handle, false) @@ -88,19 +79,6 @@ public CGColorSpace (NativeHandle handle) } #endif -#if !XAMCORE_3_0 - static CGColorSpace CreateNull () - { - var throwOnInitFailure = Class.ThrowOnInitFailure; - Class.ThrowOnInitFailure = false; - try { - return new CGColorSpace (IntPtr.Zero, true); - } finally { - Class.ThrowOnInitFailure = throwOnInitFailure; - } - } -#endif - static IntPtr Create (CFPropertyList propertyList) { if (propertyList is null) @@ -166,19 +144,6 @@ public static CGColorSpace CreateDeviceRGB () return new CGColorSpace (CGColorSpaceCreateDeviceCMYK (), true); } -#if !XAMCORE_3_0 -#if !NET - [Obsolete ("This method has been renamed 'CreateDeviceCmyk'.")] -#else - [Obsolete ("This method has been renamed 'CreateDeviceCmyk'.", DiagnosticId = "BI1234", UrlFormat = "https://github.com/xamarin/xamarin-macios/wiki/Obsolete")] -#endif - [EditorBrowsable (EditorBrowsableState.Never)] - public static /* CGColorSpaceRef */ CGColorSpace CreateDeviceCMYK () - { - return new CGColorSpace (CGColorSpaceCreateDeviceCMYK (), true); - } -#endif - [DllImport (Constants.CoreGraphicsLibrary)] extern unsafe static /* CGColorSpaceRef */ IntPtr CGColorSpaceCreateCalibratedGray (/* const CGFloat[3] */ nfloat* whitepoint, /* const CGFloat[3] */ nfloat* blackpoint, /* CGFloat */ nfloat gamma); diff --git a/src/CoreGraphics/CGSize.cs b/src/CoreGraphics/CGSize.cs index 2558c5412f06..407e97acdaba 100644 --- a/src/CoreGraphics/CGSize.cs +++ b/src/CoreGraphics/CGSize.cs @@ -180,20 +180,6 @@ public CGSize ToRoundedCGSize () return new CGSize ((nfloat) Math.Round (width), (nfloat) Math.Round (height)); } -#if !XAMCORE_3_0 - [Obsolete ("Use 'ToRoundedCGSize' instead.")] - public CGSize ToSize () - { - return ToRoundedCGSize (); - } - - [Obsolete ("Use 'ToCGPoint' instead.")] - public CGPoint ToPointF () - { - return (CGPoint) this; - } -#endif - public CGPoint ToCGPoint () { return (CGPoint) this; diff --git a/src/CoreImage/CIFilter.cs b/src/CoreImage/CIFilter.cs index d6660f9ad3e0..9dcfdd3872fc 100644 --- a/src/CoreImage/CIFilter.cs +++ b/src/CoreImage/CIFilter.cs @@ -752,12 +752,4 @@ bool SupportsInputImage { } #endif } - -#if MONOMAC && !XAMCORE_3_0 && !NET - [Obsolete ("This type has been renamed to CICmykHalftone.")] - public class CICMYKHalftone : CICmykHalftone { - public CICMYKHalftone () {} - public CICMYKHalftone (IntPtr handle) : base (handle) {} - } -#endif } diff --git a/src/CoreImage/CIImage.cs b/src/CoreImage/CIImage.cs index 9171b1e9a4ce..8a81191e6a76 100644 --- a/src/CoreImage/CIImage.cs +++ b/src/CoreImage/CIImage.cs @@ -179,9 +179,6 @@ internal static int CIFormatToInt (CIFormat format) #if MONOMAC case CIFormat.RGBA16: return FormatRGBA16; case CIFormat.RGBAf: return FormatRGBAf; -#elif !XAMCORE_3_0 - case CIFormat.BGRA8: return FormatBGRA8; - case CIFormat.RGBA8: return FormatRGBA8; #endif case CIFormat.kRGBAf: return FormatRGBAf; case CIFormat.kBGRA8: return FormatBGRA8; diff --git a/src/CoreImage/CISampler.cs b/src/CoreImage/CISampler.cs index 554b71963048..bc62262306ec 100644 --- a/src/CoreImage/CISampler.cs +++ b/src/CoreImage/CISampler.cs @@ -89,10 +89,6 @@ internal NSDictionary ToDictionary () } public partial class CISampler { -#if !XAMCORE_3_0 && MONOMAC - [Obsolete ("This default constructor does not provide a valid instance")] - public CISampler () {} -#endif public CISampler FromImage (CIImage sourceImage, CISamplerOptions? options) { if (options is null) diff --git a/src/CoreImage/Enums.cs b/src/CoreImage/Enums.cs index 6fc7438d5323..60941bb22369 100644 --- a/src/CoreImage/Enums.cs +++ b/src/CoreImage/Enums.cs @@ -55,12 +55,6 @@ public enum CIFormat { [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kRGBAf instead.")] RGBAf = 3, - // Please, do not add values into MonoMac/iOS without adding an explicit value -#elif !XAMCORE_3_0 - [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kBGRA8 instead.")] - BGRA8 = 2, - [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kRGBA8 instead.")] - RGBA8 = 3, // Please, do not add values into MonoMac/iOS without adding an explicit value #endif kRGBAf = 4, diff --git a/src/CoreMedia/CoreMedia.cs b/src/CoreMedia/CoreMedia.cs index a33dd821e4f6..868c3b058437 100644 --- a/src/CoreMedia/CoreMedia.cs +++ b/src/CoreMedia/CoreMedia.cs @@ -49,13 +49,6 @@ public struct CMTimeRange { public CMTime Duration; #if !COREBUILD public static readonly CMTimeRange Zero; - -#if !XAMCORE_3_0 -#if !WATCH - [Obsolete ("Use 'InvalidRange'.")] - public static readonly CMTimeRange Invalid; -#endif // !WATCH -#endif // !XAMCORE_3_0 public static readonly CMTimeRange InvalidRange; #if NET @@ -89,11 +82,6 @@ static CMTimeRange () Zero = Marshal.PtrToStructure (retZero)!; var retInvalid = Dlfcn.dlsym (lib, "kCMTimeRangeInvalid"); -#if !XAMCORE_3_0 -#pragma warning disable CS0618 // Type or member is obsolete - Invalid = Marshal.PtrToStructure (retInvalid)!; -#pragma warning restore CS0618 // Type or member is obsolete -#endif InvalidRange = Marshal.PtrToStructure (retInvalid)!; var retMappingInvalid = Dlfcn.dlsym (lib, "kCMTimeMappingInvalid"); diff --git a/src/CoreMotion/CMCompat.cs b/src/CoreMotion/CMCompat.cs deleted file mode 100644 index 951913cf8353..000000000000 --- a/src/CoreMotion/CMCompat.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2016 Xamarin Inc. All rights reserved. - -#nullable enable - -#if !XAMCORE_3_0 && !MONOMAC - -using System; -using System.Runtime.InteropServices; - -namespace CoreMotion { - - public partial class CMSensorRecorder { - - [Obsolete ("Apple removed this API in iOS 9.3.")] - public virtual CMSensorDataList? GetAccelerometerDataSince (ulong identifier) - { - return null; - } - } -} - -#endif diff --git a/src/CoreText/CTFontManager.cs b/src/CoreText/CTFontManager.cs index 2dd5c5e0e300..ae613d675c15 100644 --- a/src/CoreText/CTFontManager.cs +++ b/src/CoreText/CTFontManager.cs @@ -115,21 +115,6 @@ public static bool IsFontSupported (NSUrl url) ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (url)); return CTFontManagerIsSupportedFont (url.Handle) != 0; } -#elif !XAMCORE_3_0 -#if NET - [ObsoletedOSPlatform ("macos10.6")] - [UnsupportedOSPlatform ("ios")] -#else - [Deprecated (PlatformName.MacOSX, 10, 6)] - [Unavailable (PlatformName.iOS)] -#endif - [Obsolete ("API not available on iOS, it will always return false.")] - public static bool IsFontSupported (NSUrl url) - { - if (url is null) - ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (url)); - return false; - } #endif [DllImport (Constants.CoreTextLibrary)] @@ -558,9 +543,6 @@ public static bool UnregisterGraphicsFont (CGFont font, out NSError? error) static CTFontManager () { var handle = Libraries.CoreText.Handle; -#if !XAMCORE_3_0 - ErrorDomain = Dlfcn.GetStringConstant (handle, "kCTFontManagerErrorDomain"); -#endif #pragma warning disable CS0618 // Type or member is obsolete ErrorFontUrlsKey = Dlfcn.GetStringConstant (handle, "kCTFontManagerErrorFontURLsKey"); #pragma warning restore CS0618 // Type or member is obsolete @@ -583,9 +565,6 @@ static NSString? RegisteredFontsChangedNotification { } } -#if !XAMCORE_3_0 - public readonly static NSString? ErrorDomain; -#endif #if !NET [Obsolete ("Use the 'CTFontManagerErrorKeys.FontUrlsKey' property instead.")] public readonly static NSString? ErrorFontUrlsKey; diff --git a/src/CoreVideo/CVImageBuffer.cs b/src/CoreVideo/CVImageBuffer.cs index 7f9dad56822e..063924e77237 100644 --- a/src/CoreVideo/CVImageBuffer.cs +++ b/src/CoreVideo/CVImageBuffer.cs @@ -112,17 +112,6 @@ public CGColorSpace? ColorSpace { return h == IntPtr.Zero ? null : new CGColorSpace (h, false); } } -#elif !XAMCORE_3_0 - [Deprecated (PlatformName.MacOSX, 10, 4)] - [Unavailable (PlatformName.iOS)] -#if IOS - [Obsolete ("This API is not available on this platform.")] -#endif - public CGColorSpace? ColorSpace { - get { - return null; - } - } #endif #if MONOMAC diff --git a/src/CoreVideo/CVPixelBuffer.cs b/src/CoreVideo/CVPixelBuffer.cs index abf3611f71bf..b8c35e02de61 100644 --- a/src/CoreVideo/CVPixelBuffer.cs +++ b/src/CoreVideo/CVPixelBuffer.cs @@ -499,14 +499,6 @@ public nint GetWidthOfPlane (nint planeIndex) extern static CVReturn CVPixelBufferLockBaseAddress ( /* CVPixelBufferRef __nonnull */ IntPtr pixelBuffer, CVPixelBufferLock lockFlags); -#if !XAMCORE_3_0 - [Obsolete ("Use 'Lock (CVPixelBufferLock)' instead.")] - public CVReturn Lock (CVOptionFlags lockFlags) - { - return CVPixelBufferLockBaseAddress (Handle, (CVPixelBufferLock) lockFlags); - } -#endif - public CVReturn Lock (CVPixelBufferLock lockFlags) { return CVPixelBufferLockBaseAddress (Handle, lockFlags); @@ -516,14 +508,6 @@ public CVReturn Lock (CVPixelBufferLock lockFlags) extern static CVReturn CVPixelBufferUnlockBaseAddress ( /* CVPixelBufferRef __nonnull */ IntPtr pixelBuffer, CVPixelBufferLock unlockFlags); -#if !XAMCORE_3_0 - [Obsolete ("Use 'Unlock (CVPixelBufferLock)'.")] - public CVReturn Unlock (CVOptionFlags unlockFlags) - { - return CVPixelBufferUnlockBaseAddress (Handle, (CVPixelBufferLock) unlockFlags); - } -#endif - public CVReturn Unlock (CVPixelBufferLock unlockFlags) { return CVPixelBufferUnlockBaseAddress (Handle, unlockFlags); diff --git a/src/CoreVideo/CVPixelFormatDescription.cs b/src/CoreVideo/CVPixelFormatDescription.cs index 1a77965fd366..968c6540558d 100644 --- a/src/CoreVideo/CVPixelFormatDescription.cs +++ b/src/CoreVideo/CVPixelFormatDescription.cs @@ -250,13 +250,6 @@ public static CVPixelFormatType [] AllPixelFormatTypes { extern static /* CFDictionaryRef __nullable */ IntPtr CVPixelFormatDescriptionCreateWithPixelFormatType ( /* CFAllocatorRef __nullable */ IntPtr allocator, int /* OSType = int32_t */ pixelFormat); -#if !XAMCORE_3_0 - public static NSDictionary? Create (int pixelFormat) - { - return Runtime.GetNSObject (CVPixelFormatDescriptionCreateWithPixelFormatType (IntPtr.Zero, pixelFormat)); - } -#endif - /// Create a description of the specified pixel format. /// The pixel format to create a description of. public static NSDictionary? Create (CVPixelFormatType pixelFormat) @@ -278,16 +271,6 @@ public static CVPixelFormatType [] AllPixelFormatTypes { extern static void CVPixelFormatDescriptionRegisterDescriptionWithPixelFormatType ( /* CFDictionaryRef __nonnull */ IntPtr description, int /* OSType = int32_t */ pixelFormat); -#if !XAMCORE_3_0 - public static void Register (NSDictionary description, int pixelFormat) - { - if (description is null) - ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (description)); - - CVPixelFormatDescriptionRegisterDescriptionWithPixelFormatType (description.Handle, pixelFormat); - } -#endif - /// Register a new pixel format with CoreVideo. /// The pixel format description for the pixel format to register. /// The pixel format to register. diff --git a/src/Foundation/Compat.cs b/src/Foundation/Compat.cs index 8f9d82469b15..ea35e074f5ed 100644 --- a/src/Foundation/Compat.cs +++ b/src/Foundation/Compat.cs @@ -26,25 +26,6 @@ public static NSError GetFileProviderErrorForOutOfDateItem (FileProvider.INSFile } #endif -#if !XAMCORE_3_0 - public partial class NSOperation { - - [Obsolete ("Use 'WaitUntilFinished' method.")] - public virtual void WaitUntilFinishedNS () - { - WaitUntilFinished (); - } - } - - public partial class NSNetService { - - [Obsolete ("This constructor does not create a valid instance of the type")] - public NSNetService () - { - } - } -#endif - #if !WATCH public partial class NSUserActivity { diff --git a/src/Foundation/Enum.cs b/src/Foundation/Enum.cs index 29b9ff476f93..d28d5b430907 100644 --- a/src/Foundation/Enum.cs +++ b/src/Foundation/Enum.cs @@ -75,7 +75,7 @@ public enum NSUrlCredentialPersistence : ulong { Synchronizable } -#if MONOMAC || !XAMCORE_3_0 +#if MONOMAC #if !NET [Native] @@ -89,9 +89,6 @@ public enum NSBundleExecutableArchitecture { PPC = 0x00000012, X86_64 = 0x01000007, PPC64 = 0x01000012, -#if !XAMCORE_3_0 - [Watch (7, 0), TV (14, 0), iOS (14, 0)] -#endif ARM64 = 0x0100000c, } #endif @@ -1026,16 +1023,6 @@ public enum NSDataBase64EncodingOptions : ulong { EndLineWithLineFeed = 1 << 5 } -#if !XAMCORE_3_0 - [Deprecated (PlatformName.iOS, 9, 0, message: "Use 'NSWritingDirectionFormatType'.")] - [Deprecated (PlatformName.MacCatalyst, 13, 1, message: "Use 'NSWritingDirectionFormatType'.")] - [Flags] - [Native] - public enum NSTextWritingDirection : long { - Embedding = 0, Override = 2 - } -#endif - [Native] public enum NSUrlSessionAuthChallengeDisposition : long { UseCredential = 0, diff --git a/src/Foundation/NSAttributedString.cs b/src/Foundation/NSAttributedString.cs index 474c85497cf7..f57ce4070159 100644 --- a/src/Foundation/NSAttributedString.cs +++ b/src/Foundation/NSAttributedString.cs @@ -212,18 +212,6 @@ public NSAttributedString (string str, strokeWidth, strikethroughStyle)) { } - -#if !XAMCORE_3_0 - // This is a [Category] -> C# extension method (see uikit.cs) but it targets on static selector - // the resulting syntax does not look good in user code so we provide a better looking API - // https://bugzilla.xamarin.com/show_bug.cgi?id=15268 - // https://trello.com/c/iQpXOxCd/227-category-and-static-methods-selectors - // note: we cannot reuse the same method name - as it would break compilation of existing apps - public static NSAttributedString CreateFrom (NSTextAttachment attachment) - { - return (null as NSAttributedString)!.FromTextAttachment (attachment); - } -#endif #endif } } diff --git a/src/Foundation/NSDistributedNotificationCenter.cs b/src/Foundation/NSDistributedNotificationCenter.cs deleted file mode 100644 index f690fb8a10d0..000000000000 --- a/src/Foundation/NSDistributedNotificationCenter.cs +++ /dev/null @@ -1,32 +0,0 @@ -// -// Helper methods for NSDistributedNotificationCenter -// -// Author: -// Miguel de Icaza -// -// Copyright 2011 Xamarin Inc -// -#if !MONOMAC && !XAMCORE_3_0 - -using System; - -using ObjCRuntime; - -namespace Foundation { - - [Obsolete ("This is not available in iOS.")] - public partial class NSDistributedNotificationCenter { - - [Obsolete ("This is not available in iOS.")] - public void AddObserver (NSObject observer, Selector aSelector, string aName, string anObject) - { - } - - [Obsolete ("This is not available in iOS.")] - public void RemoveObserver (NSObject observer, string aName, string anObject) - { - } - } -} - -#endif diff --git a/src/Foundation/NSFileManagerDelegate.cs b/src/Foundation/NSFileManagerDelegate.cs index a140361337a2..926be3d70e93 100644 --- a/src/Foundation/NSFileManagerDelegate.cs +++ b/src/Foundation/NSFileManagerDelegate.cs @@ -16,14 +16,6 @@ public virtual bool ShouldCopyItemAtPath (NSFileManager fileManager, string srcP { return ShouldCopyItemAtPath (fileManager, (NSString) srcPath, (NSString) dstPath); } - -#if !XAMCORE_3_0 - [Obsolete ("API removed after iOS 2.0 / macOS 10.5. It will never be called by the OS.")] - public virtual bool ShouldProceedAfterError (NSFileManager fm, NSDictionary errorInfo) - { - return false; - } -#endif } public static partial class NSFileManagerDelegate_Extensions { // This was a duplicate [Export] so in order to avoid breaking the API we expose it this way. @@ -32,13 +24,5 @@ public static bool ShouldCopyItemAtPath (this INSFileManagerDelegate This, NSFil { return This.ShouldCopyItemAtPath (fileManager, (NSString) srcPath, (NSString) dstPath); } - -#if !XAMCORE_3_0 - [Obsolete ("API removed after iOS 2.0 / macOS 10.5. It will never be called by the OS.")] - public static bool ShouldProceedAfterError (INSFileManagerDelegate This, NSFileManager fm, NSDictionary errorInfo) - { - return false; - } -#endif } } diff --git a/src/Foundation/NSObject2.cs b/src/Foundation/NSObject2.cs index 33aa5ecfdc16..16dd2dd38dda 100644 --- a/src/Foundation/NSObject2.cs +++ b/src/Foundation/NSObject2.cs @@ -344,14 +344,6 @@ static void RegisterToggleReference (NSObject obj, IntPtr handle, bool isCustomT #endif } -#if !XAMCORE_3_0 - [EditorBrowsable (EditorBrowsableState.Never)] - public static bool IsNewRefcountEnabled () - { - return true; - } -#endif - /* Register the current object with the toggleref machinery if the following conditions are met: -The new refcounting is enabled; and @@ -706,47 +698,6 @@ private bool AllocIfNeeded () return false; } -#if !XAMCORE_3_0 - private IntPtr GetObjCIvar (string name) - { - IntPtr native; - - object_getInstanceVariable (handle, name, out native); - - return native; - } - - [Obsolete ("Do not use; this API does not properly retain/release existing/new values, so leaks and/or crashes may occur.")] - public NSObject GetNativeField (string name) - { - IntPtr field = GetObjCIvar (name); - - if (field == IntPtr.Zero) - return null; - return Runtime.GetNSObject (field); - } - - private void SetObjCIvar (string name, IntPtr value) - { - object_setInstanceVariable (handle, name, value); - } - - [Obsolete ("Do not use; this API does not properly retain/release existing/new values, so leaks and/or crashes may occur.")] - public void SetNativeField (string name, NSObject value) - { - if (value is null) - SetObjCIvar (name, IntPtr.Zero); - else - SetObjCIvar (name, value.Handle); - } - - [DllImport (Messaging.LIBOBJC_DYLIB)] - extern static void object_getInstanceVariable (IntPtr obj, string name, out IntPtr val); - - [DllImport (Messaging.LIBOBJC_DYLIB)] - extern static void object_setInstanceVariable (IntPtr obj, string name, IntPtr val); -#endif // !XAMCORE_3_0 - private void InvokeOnMainThread (Selector sel, NSObject obj, bool wait) { #if NET diff --git a/src/Foundation/NSUrl.cs b/src/Foundation/NSUrl.cs index 3a3ed771487c..46cf9d5ff8d0 100644 --- a/src/Foundation/NSUrl.cs +++ b/src/Foundation/NSUrl.cs @@ -129,15 +129,4 @@ public int Port { return !(x == y); } } - -#if !XAMCORE_3_0 - public static partial class NSUrl_PromisedItems { - - [Obsolete ("Use overload with an 'out NSObject value' parameter.")] - public static bool GetPromisedItemResourceValue (NSUrl This, NSObject value, NSString key, out NSError error) - { - return This.GetPromisedItemResourceValue (out value, key, out error); - } - } -#endif } diff --git a/src/GameController/GCController.cs b/src/GameController/GCController.cs index 2b4e6f188305..c89488c589f1 100644 --- a/src/GameController/GCController.cs +++ b/src/GameController/GCController.cs @@ -19,7 +19,6 @@ public partial class GCController { #if !NET // In an undefined enum (GCController.h). - // the API will use the new enum in XAMCORE_3_0 so the constant is not helpful anymore public const int PlayerIndexUnset = -1; #endif } diff --git a/src/GameKit/GKCompat.cs b/src/GameKit/GKCompat.cs index 0fbcdc06c136..d6ff49a42b02 100644 --- a/src/GameKit/GKCompat.cs +++ b/src/GameKit/GKCompat.cs @@ -12,31 +12,6 @@ #endif namespace GameKit { - -#if !XAMCORE_3_0 - public partial class GKMatchRequest { - -#if !NET - [Obsolete ("Use 'RecipientResponseHandler' property.")] -#else - [Obsolete ("Use 'RecipientResponseHandler' property.", DiagnosticId = "BI1234", UrlFormat = "https://github.com/xamarin/xamarin-macios/wiki/Obsolete")] -#endif - public virtual void SetRecipientResponseHandler (Action handler) - { - RecipientResponseHandler = handler; - } - } - - public partial class GKMatchmaker { - - [Obsolete ("Use 'InviteHandler' property.")] - public virtual void SetInviteHandler (GKInviteHandler handler) - { - InviteHandler = handler; - } - } -#endif // !XAMCORE_3_0 - #if WATCH && !NET [Unavailable (PlatformName.WatchOS)] [Obsolete ("This API is not available on this platform.")] diff --git a/src/GameKit/GameKit2.cs b/src/GameKit/GameKit2.cs index 5e6398eabe3b..71ce8ea0d5ea 100644 --- a/src/GameKit/GameKit2.cs +++ b/src/GameKit/GameKit2.cs @@ -196,17 +196,6 @@ public GKPeerConnectionEventArgs (GKSession session, string? peerID, NSError? er #endif public partial class GKVoiceChat { - -#if !XAMCORE_3_0 - [Obsolete ("Use 'SetMute (bool, string)' method.")] - public virtual void SetMute (bool isMuted, GKPlayer player) - { - if (player is null) - ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (player)); - - SetMute (isMuted, player.PlayerID); - } -#endif } public partial class GKTurnBasedExchange { @@ -234,12 +223,5 @@ public override string ToString () } public partial class GKMatch { -#if !XAMCORE_3_0 - // Compatbility with the broken API, it is deprecated, so that is good. - public virtual bool SendData (NSData data, string [] players, GKMatchSendDataMode mode, NSError error) - { - return SendData (data, players, mode, out error); - } -#endif } } diff --git a/src/HealthKit/HKObsolete.cs b/src/HealthKit/HKObsolete.cs deleted file mode 100644 index c59a7ac6e7df..000000000000 --- a/src/HealthKit/HKObsolete.cs +++ /dev/null @@ -1,37 +0,0 @@ -#nullable enable - -using System; - -namespace HealthKit { - -#if !XAMCORE_3_0 - public partial class HKStatisticsCollectionQuery { - - [Obsolete ("Use 'InitialResultsHandler'.")] - public virtual void SetInitialResultsHandler (HKStatisticsCollectionQueryInitialResultsHandler handler) - { - InitialResultsHandler = handler; - } - - [Obsolete ("Use 'StatisticsUpdated', this handler uses an incorrect type and does nothing to avoid a crash.")] - public virtual void SetStatisticsUpdateHandler (HKStatisticsCollectionQueryInitialResultsHandler handler) - { - } - - [Obsolete ("Use 'StatisticsUpdated', this handler uses an incorrect type and does nothing to avoid a crash.")] - public virtual HKStatisticsCollectionQueryInitialResultsHandler? StatisticsUpdateHandler { - get; set; - } - } - - public partial class HKObjectType { - - [Obsolete ("Use 'GetWorkoutType', it will return a valid HKWorkoutType instance.")] - static public HKWorkout? WorkoutType () - { - // would throw an InvalidCastException since the old selector returned a HKWorkoutType - return null; - } - } -#endif -} diff --git a/src/HomeKit/HMService.cs b/src/HomeKit/HMService.cs index 461a6d8c08fd..9b1ffc371506 100644 --- a/src/HomeKit/HMService.cs +++ b/src/HomeKit/HMService.cs @@ -20,14 +20,6 @@ public Task UpdateAssociatedServiceTypeAsync (HMServiceType serviceType) { return UpdateAssociatedServiceTypeAsync (serviceType.GetConstant ()); } - -#if !XAMCORE_3_0 - [Obsolete] - public Task UpdateNameAsync (HMServiceType serviceType) - { - return UpdateNameAsync (serviceType.GetConstant ()); - } -#endif #endif } } diff --git a/src/Makefile b/src/Makefile index bb088101958c..4863aee6ab05 100644 --- a/src/Makefile +++ b/src/Makefile @@ -56,7 +56,7 @@ DOTNET_REFERENCES = \ /r:$(DOTNET_BCL_DIR)/System.Xml.ReaderWriter.dll \ DOTNET_OR_GREATER_DEFINES:=$(foreach version,$(shell seq 6 $(firstword $(subst ., ,$(subst net,,$(DOTNET_TFM))))),/define:NET$(version)_0_OR_GREATER) -DOTNET_FLAGS=/warnaserror+ /noconfig /nostdlib+ /deterministic /features:strict /nologo /target:library /debug /unsafe /define:NET /define:NET_TODO /define:XAMCORE_3_0 $(DOTNET_OR_GREATER_DEFINES) $(DOTNET_REFERENCES) +DOTNET_FLAGS=/warnaserror+ /noconfig /nostdlib+ /deterministic /features:strict /nologo /target:library /debug /unsafe /define:NET /define:NET_TODO $(DOTNET_OR_GREATER_DEFINES) $(DOTNET_REFERENCES) ifeq ($(XCODE_IS_STABLE),true) DOTNET_FLAGS+=/define:XCODE_IS_STABLE @@ -233,10 +233,10 @@ $(MACOS_DOTNET_BUILD_DIR)/AssemblyInfo.cs: $(TOP)/src/AssemblyInfo.cs.in | $(MAC # tvOS # -TVOS_DEFINES = -define:IPHONE -define:MONOTOUCH -d:TVOS -d:XAMCORE_3_0 -d:__TVOS__ -d:SYSTEM_NET_HTTP +TVOS_DEFINES = -define:IPHONE -define:MONOTOUCH -d:TVOS -d:__TVOS__ -d:SYSTEM_NET_HTTP TVOS_CORE_DEFINES=$(TVOS_DEFINES) -d:COREBUILD -TVOS_GENERATOR_FLAGS = -d:TVOS -d:XAMCORE_3_0 -inline-selectors +TVOS_GENERATOR_FLAGS = -d:TVOS -inline-selectors TVOS_DOTNET_EXTRA_CORE_SOURCES = \ $(TVOS_DOTNET_BUILD_DIR)/Constants.cs \ diff --git a/src/MapKit/MKDirections.cs b/src/MapKit/MKDirections.cs deleted file mode 100644 index 4f09cb6d73a2..000000000000 --- a/src/MapKit/MKDirections.cs +++ /dev/null @@ -1,17 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -#nullable enable - -namespace MapKit { - - public partial class MKDirections { - [Obsolete ("iOS9 does not allow creating an empty instance")] - public MKDirections () - { - } - } -} - -#endif diff --git a/src/MediaPlayer/MPMediaItemArtwork.cs b/src/MediaPlayer/MPMediaItemArtwork.cs index 18f3c040f8c5..324eba891d18 100644 --- a/src/MediaPlayer/MPMediaItemArtwork.cs +++ b/src/MediaPlayer/MPMediaItemArtwork.cs @@ -19,13 +19,6 @@ namespace MediaPlayer { public partial class MPMediaItemArtwork { -#if !XAMCORE_3_0 && !NET - [Obsolete ("Use the (UIImage) constructor instead, iOS9 does not allow creating an empty instance.")] - public MPMediaItemArtwork () - { - - } -#endif } } diff --git a/src/MediaPlayer/MPPlayableContentDelegate.cs b/src/MediaPlayer/MPPlayableContentDelegate.cs deleted file mode 100644 index bc1ae414a1f1..000000000000 --- a/src/MediaPlayer/MPPlayableContentDelegate.cs +++ /dev/null @@ -1,44 +0,0 @@ -#if !XAMCORE_3_0 && !MONOMAC && !NET - -using System; -using System.Threading.Tasks; -using Foundation; -using ObjCRuntime; - -#nullable enable - -namespace MediaPlayer { - public partial class MPPlayableContentDelegate { - [Obsolete ("Use 'InitiatePlaybackOfContentItem' instead.")] - public virtual void PlayableContentManager (MPPlayableContentManager contentManager, NSIndexPath indexPath, Action completionHandler) - { - InitiatePlaybackOfContentItem (contentManager, indexPath, completionHandler); - } - - } - - public static partial class MPPlayableContentDelegate_Extensions { - [Obsolete ("Use 'InitiatePlaybackOfContentItem' instead.")] - public static void PlayableContentManager (this IMPPlayableContentDelegate This, MPPlayableContentManager contentManager, NSIndexPath indexPath, Action completionHandler) - { - This.InitiatePlaybackOfContentItem (contentManager, indexPath, completionHandler); - } - - } - - public partial class MPPlayableContentDataSource : NSObject { -#if NET - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("macos")] - [UnsupportedOSPlatform ("tvos")] -#endif - [Obsolete ("Use 'MPPlayableContentDataSource_Extensions.GetContentItemAsync' instead.")] - public unsafe virtual Task GetContentItemAsync (string identifier) - { - return MPPlayableContentDataSource_Extensions.GetContentItemAsync (this, identifier); - } - } -} - -#endif diff --git a/src/MultipeerConnectivity/Compat.cs b/src/MultipeerConnectivity/Compat.cs deleted file mode 100644 index 3f81fcba237d..000000000000 --- a/src/MultipeerConnectivity/Compat.cs +++ /dev/null @@ -1,33 +0,0 @@ -// -// Compatibility Helpers -// -// Authors: -// Sebastien Pouliot -// -// Copyright 2015 Xamarin Inc. -// - -#nullable enable - -using System; - -namespace MultipeerConnectivity { - -#if !XAMCORE_3_0 - public partial class MCPeerID { - - [Obsolete ("This constructor does not create a valid instance")] - public MCPeerID () - { - } - } - - public partial class MCAdvertiserAssistant { - - [Obsolete ("This constructor does not create a valid instance")] - public MCAdvertiserAssistant () - { - } - } -#endif -} diff --git a/src/ObjCRuntime/Blocks.cs b/src/ObjCRuntime/Blocks.cs index 332f58b95919..cb3b4091fbe3 100644 --- a/src/ObjCRuntime/Blocks.cs +++ b/src/ObjCRuntime/Blocks.cs @@ -693,12 +693,7 @@ public void Add (IntPtr block) #endif [Flags] -#if XAMCORE_3_0 - internal -#else - public -#endif - enum BlockFlags : int { + internal enum BlockFlags : int { BLOCK_REFCOUNT_MASK = (0xffff), BLOCK_NEEDS_FREE = (1 << 24), BLOCK_HAS_COPY_DISPOSE = (1 << 25), diff --git a/src/ObjCRuntime/PlatformAvailability.cs b/src/ObjCRuntime/PlatformAvailability.cs index f7b5bda19bde..3322154bdb39 100644 --- a/src/ObjCRuntime/PlatformAvailability.cs +++ b/src/ObjCRuntime/PlatformAvailability.cs @@ -12,7 +12,7 @@ // // Copyright 2013-2014 Xamarin Inc. -#if COREBUILD || (!XAMCORE_3_0 && !NET) +#if COREBUILD using System; using System.Globalization; diff --git a/src/ObjCRuntime/SelectorMarshaler.cs b/src/ObjCRuntime/SelectorMarshaler.cs deleted file mode 100644 index 693591721047..000000000000 --- a/src/ObjCRuntime/SelectorMarshaler.cs +++ /dev/null @@ -1,67 +0,0 @@ -// -// Copyright 2010, Novell, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -#if MONOMAC && !XAMCORE_3_0 - -using System; -using System.Runtime.InteropServices; - -using Foundation; - -namespace ObjCRuntime { - public class SelectorMarshaler : ICustomMarshaler { - static SelectorMarshaler marshaler; - - public object MarshalNativeToManaged (IntPtr handle) { - return new Selector (handle); - } - - public IntPtr MarshalManagedToNative (object obj) { - if (obj is null) - return IntPtr.Zero; - if (!(obj is Selector)) - throw new MarshalDirectiveException ("This custom marshaler must be used on a Selector derived type."); - - return (obj as Selector).Handle; - } - - public void CleanUpNativeData (IntPtr handle) { - } - - public void CleanUpManagedData (object obj) { - } - - public int GetNativeDataSize () { - return -1; - } - - public static ICustomMarshaler GetInstance(string cookie) { - if(marshaler is null) - return marshaler = new SelectorMarshaler (); - - return marshaler; - } - } -} - -#endif // MONOMAC && !XAMCORE_3_0 diff --git a/src/OpenGLES/EAGLContext.cs b/src/OpenGLES/EAGLContext.cs index 9a511b000e6a..0630f8c7cb81 100644 --- a/src/OpenGLES/EAGLContext.cs +++ b/src/OpenGLES/EAGLContext.cs @@ -20,13 +20,6 @@ public unsafe static void EAGLGetVersion (out nuint major, out nuint minor) EAGLGetVersion ((nuint*) Unsafe.AsPointer (ref major), (nuint*) Unsafe.AsPointer (ref minor)); } -#if !XAMCORE_3_0 - [Obsolete ("iOS9 does not allow creating an empty instance")] - public EAGLContext () - { - } -#endif - #if NET [SupportedOSPlatform ("ios")] [SupportedOSPlatform ("tvos")] diff --git a/src/Photos/Enums.cs b/src/Photos/Enums.cs index 08554d3c0c96..6a90ee0e4492 100644 --- a/src/Photos/Enums.cs +++ b/src/Photos/Enums.cs @@ -98,13 +98,6 @@ public enum PHCollectionListSubtype : long { SmartFolderEvents = 200, SmartFolderFaces = 201, -#if !XAMCORE_3_0 - // this was added in the wrong enum type (ref bug #40019) - [Obsolete ("Incorrect value (exists in 'PHAssetCollectionSubtype').")] - SmartAlbumSelfPortraits = 210, - [Obsolete ("Incorrect value (exists in 'PHAssetCollectionSubtype').")] - SmartAlbumScreenshots = 211, -#endif Any = Int64.MaxValue, } diff --git a/src/Photos/PHAssetChangeRequest.cs b/src/Photos/PHAssetChangeRequest.cs index b14b95be8727..76abd2942077 100644 --- a/src/Photos/PHAssetChangeRequest.cs +++ b/src/Photos/PHAssetChangeRequest.cs @@ -7,13 +7,6 @@ namespace Photos { public partial class PHAssetChangeRequest { - -#if !XAMCORE_3_0 - [Obsolete ("iOS9 does not allow creating an empty instance")] - public PHAssetChangeRequest () - { - } -#endif } } diff --git a/src/Photos/PHChangeRequest.cs b/src/Photos/PHChangeRequest.cs index 3cac53d7ef1c..eb16763ec340 100644 --- a/src/Photos/PHChangeRequest.cs +++ b/src/Photos/PHChangeRequest.cs @@ -5,11 +5,5 @@ namespace Photos { public partial class PHChangeRequest { -#if !XAMCORE_3_0 - // This constructor is required for the default constructor in PHAssetChangeRequest to compile. - internal PHChangeRequest () - { - } -#endif } } diff --git a/src/Photos/PHCompat.cs b/src/Photos/PHCompat.cs index 7b2d58b333af..fc8fe04bdc0b 100644 --- a/src/Photos/PHCompat.cs +++ b/src/Photos/PHCompat.cs @@ -11,23 +11,6 @@ namespace Photos { -#if !XAMCORE_3_0 && !MONOMAC - public partial class PHContentEditingInputRequestOptions { - - [Obsolete ("Use 'CanHandleAdjustmentData' property.")] - public virtual void SetCanHandleAdjustmentDataHandler (Func canHandleAdjustmentDataPredicate) - { - CanHandleAdjustmentData = canHandleAdjustmentDataPredicate; - } - - [Obsolete ("Use 'ProgressHandler' property.")] - public virtual void SetProgressHandler (PHProgressHandler progressHandler) - { - ProgressHandler = progressHandler; - } - } -#endif - #if !NET // incorrect signature, should have been `ref NSError` [Obsolete ("Use 'PHLivePhotoFrameProcessingBlock2' instead.")] diff --git a/src/README.md b/src/README.md index af322faa3ea4..2512ad73a987 100644 --- a/src/README.md +++ b/src/README.md @@ -48,8 +48,8 @@ These are the symbols defined for each platform assembly: | ------------------ | ----------- | | Xamarin.iOS.dll | IPHONE MONOTOUCH IOS | | Xamarin.Mac.dll | MONOMAC | -| Xamarin.WatchOS.dll | IPHONE MONOTOUCH WATCH XAMCORE_3_0 | -| Xamarin.TVOS.dll | IPHONE MONOTOUCH TVOS XAMCORE_3_0 | +| Xamarin.WatchOS.dll | IPHONE MONOTOUCH WATCH | +| Xamarin.TVOS.dll | IPHONE MONOTOUCH TVOS | To build core for only one platform, use the platform unique variables `IOS`, `MONOMAC`, `WATCH` or `TVOS`. diff --git a/src/SceneKit/SCNCompat.cs b/src/SceneKit/SCNCompat.cs index 0b9e5343376d..03d5077ce579 100644 --- a/src/SceneKit/SCNCompat.cs +++ b/src/SceneKit/SCNCompat.cs @@ -42,13 +42,6 @@ public virtual Action? TimingFunction { } #endif // !NET -#if !XAMCORE_3_0 - [Obsolete ("Use 'TimingFunction2' property.")] - public virtual void SetTimingFunction (Action timingFunction) - { - TimingFunction = timingFunction; - } -#endif // !XAMCORE_3_0 } #if TVOS && !NET partial class SCNMaterialProperty { diff --git a/src/SceneKit/SCNGeometry.cs b/src/SceneKit/SCNGeometry.cs deleted file mode 100644 index bbfa1a825434..000000000000 --- a/src/SceneKit/SCNGeometry.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// SCNGeometry.cs: extensions to SCNGeometry -// -// Authors: -// MIguel de Icaza (miguel@xamarin.com) -// -// Copyright Xamarin Inc -// -using System; - -using CoreGraphics; -using Foundation; - -#nullable enable - -namespace SceneKit { - public partial class SCNGeometry { -#if !XAMCORE_3_0 - [Obsolete ("Use the 'Create (SCNGeometrySource[], SCNGeometryElement[])' method instead, as it has a strongly typed return.")] - public static NSObject FromSources (SCNGeometrySource [] sources, SCNGeometryElement [] elements) - { - return Create (sources, elements); - } -#endif - } -} diff --git a/src/SceneKit/SCNSceneRenderer.cs b/src/SceneKit/SCNSceneRenderer.cs deleted file mode 100644 index fc1954c5b594..000000000000 --- a/src/SceneKit/SCNSceneRenderer.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// SCNSceneRenderer.cs -// -// Authors: -// Rolf Bjarne Kvinge -// -// Copyright 2015 Xamarin Inc. All rights reserved. -// - -using System; -using System.Runtime.InteropServices; - -using ObjCRuntime; -using Foundation; -using CoreGraphics; - -#nullable enable - -namespace SceneKit { - -#if !XAMCORE_3_0 - public static partial class SCNSceneRenderer_Extensions { - public static SCNHitTestResult [] HitTest (ISCNSceneRenderer This, CGPoint thePoint, SCNHitTestOptions? options) - { - return This.HitTest (thePoint, options?.Dictionary); - } - } -#endif -} diff --git a/src/Social/SLCompat.cs b/src/Social/SLCompat.cs deleted file mode 100644 index 169c66139d6b..000000000000 --- a/src/Social/SLCompat.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2016 Xamarin Inc. All rights reserved. - -#nullable enable - -#if !XAMCORE_3_0 && !MONOMAC - -using System; - -namespace Social { - - partial class SLComposeSheetConfigurationItem { - - [Obsolete ("Use the 'TapHandler' property.")] - public virtual void SetTapHandler (Action tapHandler) - { - TapHandler = tapHandler; - } - } -} - -#endif diff --git a/src/SpriteKit/ObsoleteCompat.cs b/src/SpriteKit/ObsoleteCompat.cs deleted file mode 100644 index fcaa638d3f52..000000000000 --- a/src/SpriteKit/ObsoleteCompat.cs +++ /dev/null @@ -1,33 +0,0 @@ -// -// Compat.cs: Compatibility functions -// -// Authors: -// Miguel de Icaza (miguel@xamarin.com) -// -// Copyright 2013-2014, 2016 Xamarin Inc - -using System; -using ObjCRuntime; -using CoreGraphics; - -#nullable enable - -namespace SpriteKit { - -#if !XAMCORE_3_0 && !MONOMAC - public partial class SKAction { - - [Obsolete ("Use the 'FalloffBy' method.")] - public static SKAction Falloff (float /* float, not CGFloat */ to, double duration) - { - return FalloffBy (to, duration); - } - - [Obsolete ("Use the 'TimingFunction2' property.")] - public virtual void SetTimingFunction (SKActionTimingFunction? timingFunction) - { - TimingFunction = timingFunction; - } - } -#endif -} diff --git a/src/SpriteKit/SKFieldNode.cs b/src/SpriteKit/SKFieldNode.cs deleted file mode 100644 index 3f5f1be32929..000000000000 --- a/src/SpriteKit/SKFieldNode.cs +++ /dev/null @@ -1,27 +0,0 @@ -// -// SKFieldNode.cs: SKFieldNode class -// -// Authors: -// Alex Soto (alex.soto@xamarin.com) -// -// Copyright 2015 Xamarin Inc. -// - -using System; -using Foundation; -using ObjCRuntime; - -#nullable enable - -namespace SpriteKit { -#if !XAMCORE_3_0 && !MONOMAC - public partial class SKFieldNode { - - [Obsolete ("Use the method 'CreateVortexField' instead.")] - public static SKFieldNode CraeteVortexField () - { - return CreateVortexField (); - } - } -#endif -} diff --git a/src/StoreKit/SKPayment.cs b/src/StoreKit/SKPayment.cs index b4d0dfc51216..7c15d1974a0d 100644 --- a/src/StoreKit/SKPayment.cs +++ b/src/StoreKit/SKPayment.cs @@ -9,24 +9,5 @@ namespace StoreKit { public partial class SKPayment { - -#if !XAMCORE_3_0 - - [Obsolete ("Use CreateFrom (SKProduct) instead.")] - public static SKPayment PaymentWithProduct (SKProduct product) - { - return CreateFrom (product); - } - -#if !MONOMAC - - [Obsolete ("Use CreateFrom (string) instead.")] - public static SKPayment PaymentWithProduct (string identifier) - { - return CreateFrom (identifier); - } -#endif - -#endif } } diff --git a/src/StoreKit/SKPaymentTransactionObserver.cs b/src/StoreKit/SKPaymentTransactionObserver.cs deleted file mode 100644 index b272967a1120..000000000000 --- a/src/StoreKit/SKPaymentTransactionObserver.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015-2016 Xamarin Inc. - -#nullable enable - -#if !XAMCORE_3_0 - -using System; - -using StoreKit; - -namespace StoreKit { - - public partial class SKPaymentTransactionObserver { - - [Obsolete ("Use RestoreCompletedTransactionsFinished (SKPaymentQueue) instead.")] - public virtual void PaymentQueueRestoreCompletedTransactionsFinished (SKPaymentQueue queue) - { - RestoreCompletedTransactionsFinished (queue); - } - } - - public static partial class SKPaymentTransactionObserver_Extensions { - - [Obsolete ("Use RestoreCompletedTransactionsFinished (SKPaymentQueue) instead.")] - public static void PaymentQueueRestoreCompletedTransactionsFinished (ISKPaymentTransactionObserver This, SKPaymentQueue queue) - { - RestoreCompletedTransactionsFinished (This, queue); - } - } -} - -#endif diff --git a/src/Twitter/TWCompat.cs b/src/Twitter/TWCompat.cs deleted file mode 100644 index e175a6f7cf11..000000000000 --- a/src/Twitter/TWCompat.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2016 Xamarin Inc. All rights reserved. - -#nullable enable - -#if !XAMCORE_3_0 - -using System; - -namespace Twitter { - - public partial class TWTweetComposeViewController { - - [Obsolete ("Use the 'CompletionHandler' property.")] - public virtual void SetCompletionHandler (Action handler) - { - CompletionHandler = handler; - } - } -} - -#endif diff --git a/src/UIKit/Compat.cs b/src/UIKit/Compat.cs index ab408f61ea22..743db952b1f7 100644 --- a/src/UIKit/Compat.cs +++ b/src/UIKit/Compat.cs @@ -16,36 +16,6 @@ using ObjCRuntime; namespace UIKit { - -#if !XAMCORE_3_0 - public partial class UIAdaptivePresentationControllerDelegate { - - [Obsolete ("Incorrect signature. Use the overload with a UITraitCollection parameter.")] - public virtual UIViewController GetAdaptivePresentationStyle (UIPresentationController controller, UIModalPresentationStyle style) - { - return null; - } - } - - public partial class UIAdaptivePresentationControllerDelegate_Extensions { - - [Obsolete ("Incorrect signature. Use the overload with a UITraitCollection parameter.")] - public static UIViewController GetAdaptivePresentationStyle (IUIAdaptivePresentationControllerDelegate This, UIPresentationController controller, UIModalPresentationStyle style) - { - return null; - } - } - - public static partial class NSIdentifier { - - [Obsolete ("Use 'GetIdentifier' method.")] - public static string Identifier (this NSLayoutConstraint This) - { - return This.GetIdentifier (); - } - } -#endif - #if !NET && !WATCH public partial class UIPresentationController { diff --git a/src/UIKit/UIAccessibilityCustomAction.cs b/src/UIKit/UIAccessibilityCustomAction.cs index eedc1034cc4a..fb3e348b3e62 100644 --- a/src/UIKit/UIAccessibilityCustomAction.cs +++ b/src/UIKit/UIAccessibilityCustomAction.cs @@ -22,13 +22,6 @@ namespace UIKit { public partial class UIAccessibilityCustomAction { object action; -#if !XAMCORE_3_0 - [Obsolete ("iOS9 does not allow creating an empty instance")] - public UIAccessibilityCustomAction () - { - } -#endif - public UIAccessibilityCustomAction (string name, Func probe) : this (name, FuncBoolDispatcher.Selector, new FuncBoolDispatcher (probe)) { diff --git a/src/UIKit/UIActivityItemProvider.cs b/src/UIKit/UIActivityItemProvider.cs deleted file mode 100644 index 2c566034b774..000000000000 --- a/src/UIKit/UIActivityItemProvider.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -namespace UIKit { - - public partial class UIActivityItemProvider { - [Obsolete ("iOS9 does not allow creating an empty instance")] - public UIActivityItemProvider () - { - } - } -} - -#endif diff --git a/src/UIKit/UIActivityViewController.cs b/src/UIKit/UIActivityViewController.cs deleted file mode 100644 index 10b731dfb936..000000000000 --- a/src/UIKit/UIActivityViewController.cs +++ /dev/null @@ -1,21 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -namespace UIKit { - - public partial class UIActivityViewController { - [Obsolete ("iOS 9 does not allow creating an empty instance.")] - public UIActivityViewController () - { - } - - [Obsolete ("Use 'CompletionWithItemsHandler' property.")] - public virtual void SetCompletionHandler (UIActivityViewControllerCompletion completionHandler) - { - CompletionWithItemsHandler = completionHandler; - } - } -} - -#endif diff --git a/src/UIKit/UIBarItem.cs b/src/UIKit/UIBarItem.cs index 30651d80afd7..b510afcab7e4 100644 --- a/src/UIKit/UIBarItem.cs +++ b/src/UIKit/UIBarItem.cs @@ -13,22 +13,14 @@ using ObjCRuntime; using Foundation; -#if XAMCORE_3_0 using TextAttributes = UIKit.UIStringAttributes; -#else -using TextAttributes = UIKit.UITextAttributes; -#endif namespace UIKit { public partial class UIBarItem { public void SetTitleTextAttributes (TextAttributes attributes, UIControlState state) { -#if XAMCORE_3_0 var dict = attributes?.Dictionary; -#else - using var dict = attributes?.ToDictionary (); -#endif _SetTitleTextAttributes (dict, state); } @@ -44,11 +36,7 @@ public virtual void SetTitleTextAttributes (TextAttributes attributes, UIControl { if (attributes is null) throw new ArgumentNullException ("attributes"); -#if XAMCORE_3_0 var dict = attributes.Dictionary; -#else - using var dict = attributes.ToDictionary (); -#endif _SetTitleTextAttributes (dict, state); } diff --git a/src/UIKit/UICollectionViewTransitionLayout.cs b/src/UIKit/UICollectionViewTransitionLayout.cs deleted file mode 100644 index a23a7c3bb6dd..000000000000 --- a/src/UIKit/UICollectionViewTransitionLayout.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -namespace UIKit { - - public partial class UICollectionViewTransitionLayout { - [Obsolete ("iOS9 does not allow creating an empty instance")] - public UICollectionViewTransitionLayout () - { - } - } -} - -#endif diff --git a/src/UIKit/UIDocumentMenuViewController.cs b/src/UIKit/UIDocumentMenuViewController.cs deleted file mode 100644 index a58d03d8f643..000000000000 --- a/src/UIKit/UIDocumentMenuViewController.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -namespace UIKit { - - public partial class UIDocumentMenuViewController { - [Obsolete ("iOS9 does not allow creating an empty instance")] - public UIDocumentMenuViewController () - { - } - } -} - -#endif diff --git a/src/UIKit/UIDocumentPickerViewController.cs b/src/UIKit/UIDocumentPickerViewController.cs deleted file mode 100644 index e14ea6212f45..000000000000 --- a/src/UIKit/UIDocumentPickerViewController.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -namespace UIKit { - - public partial class UIDocumentPickerViewController { - [Obsolete ("iOS9 does not allow creating an empty instance")] - public UIDocumentPickerViewController () - { - } - } -} - -#endif diff --git a/src/UIKit/UIPopoverPresentationController.cs b/src/UIKit/UIPopoverPresentationController.cs index 33c7d95788b5..61eb25a88b38 100644 --- a/src/UIKit/UIPopoverPresentationController.cs +++ b/src/UIKit/UIPopoverPresentationController.cs @@ -27,22 +27,6 @@ public virtual Type PopoverBackgroundViewType { } } } - -#if !XAMCORE_3_0 - public partial class UIPopoverPresentationControllerDelegate { - [Obsolete ("Use the overload with 'ref' parameters for 'targetRect' and 'inView'.")] - public virtual void WillRepositionPopover (UIPopoverPresentationController popoverPresentationController, CGRect targetRect, UIView inView) - { - } - } - - public static partial class UIPopoverPresentationControllerDelegate_Extensions { - [Obsolete ("Use the overload with 'ref' parameters for 'targetRect' and 'inView'.")] - public static void WillRepositionPopover (IUIPopoverPresentationControllerDelegate This, UIPopoverPresentationController popoverPresentationController, CGRect targetRect, UIView inView) - { - } - } -#endif } #endif // IOS diff --git a/src/UIKit/UIPrint.cs b/src/UIKit/UIPrint.cs deleted file mode 100644 index 910c97631804..000000000000 --- a/src/UIKit/UIPrint.cs +++ /dev/null @@ -1,24 +0,0 @@ -#if !XAMCORE_3_0 - -using System; -using System.Runtime.InteropServices; - -using Foundation; -using ObjCRuntime; - -namespace UIKit { - public static class UIPrint { - - static NSString _ErrorDomain; - public static NSString ErrorDomain { - get { - if (_ErrorDomain is null) - _ErrorDomain = Dlfcn.GetStringConstant (Libraries.UIKit.Handle, "UIPrintErrorDomain"); - return _ErrorDomain; - } - } - - } -} - -#endif diff --git a/src/UIKit/UIPrintInteractionController.cs b/src/UIKit/UIPrintInteractionController.cs deleted file mode 100644 index d397286d71bf..000000000000 --- a/src/UIKit/UIPrintInteractionController.cs +++ /dev/null @@ -1,10 +0,0 @@ -#if !XAMCORE_3_0 - -using Foundation; - -namespace UIKit { - public partial class UIPrintInteractionController : NSObject { - } -} - -#endif diff --git a/src/UIKit/UISearchBar.cs b/src/UIKit/UISearchBar.cs index 127880e23d3f..22e457e16fd8 100644 --- a/src/UIKit/UISearchBar.cs +++ b/src/UIKit/UISearchBar.cs @@ -11,11 +11,7 @@ using System; -#if XAMCORE_3_0 using TextAttributes = UIKit.UIStringAttributes; -#else -using TextAttributes = UIKit.UITextAttributes; -#endif namespace UIKit { public partial class UISearchBar { @@ -24,11 +20,7 @@ public void SetScopeBarButtonTitle (TextAttributes attributes, UIControlState st if (attributes is null) throw new ArgumentNullException ("attributes"); -#if XAMCORE_3_0 var dict = attributes.Dictionary; -#else - using var dict = attributes.ToDictionary (); -#endif _SetScopeBarButtonTitle (dict, state); } @@ -45,11 +37,7 @@ public void SetScopeBarButtonTitle (TextAttributes attributes, UIControlState st if (attributes is null) throw new ArgumentNullException ("attributes"); -#if XAMCORE_3_0 var dict = attributes.Dictionary; -#else - using var dict = attributes.ToDictionary (); -#endif _SetScopeBarButtonTitle (dict, state); } diff --git a/src/UIKit/UISimpleTextPrintFormatter.cs b/src/UIKit/UISimpleTextPrintFormatter.cs deleted file mode 100644 index e1641098f6bd..000000000000 --- a/src/UIKit/UISimpleTextPrintFormatter.cs +++ /dev/null @@ -1,24 +0,0 @@ -// -// UISimpleTextPrintFormatter helpers -// -// Authors: -// Sebastien Pouliot -// -// Copyright 2013, 2015 Xamarin Inc. All rights reserved. -// - -#if IOS && !XAMCORE_3_0 - -namespace UIKit { - - public partial class UISimpleTextPrintFormatter : UIPrintFormatter { - - // since 7.0 GM calling `init` returns an instance where we can't call properties - // without an Objective-C exception. We work around this since it will accept a null string - public UISimpleTextPrintFormatter () : this ((string) null) - { - } - } -} - -#endif diff --git a/src/UIKit/UIStoryboardPopoverSegue.cs b/src/UIKit/UIStoryboardPopoverSegue.cs deleted file mode 100644 index 27610d0177d5..000000000000 --- a/src/UIKit/UIStoryboardPopoverSegue.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -namespace UIKit { - - public partial class UIStoryboardPopoverSegue { - [Obsolete ("iOS9 does not allow creating an empty instance")] - public UIStoryboardPopoverSegue () - { - } - } -} - -#endif diff --git a/src/UIKit/UIStoryboardSegue.cs b/src/UIKit/UIStoryboardSegue.cs deleted file mode 100644 index f0fb361e0f9c..000000000000 --- a/src/UIKit/UIStoryboardSegue.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !XAMCORE_3_0 - -using System; - -namespace UIKit { - - public partial class UIStoryboardSegue { - [Obsolete ("iOS9 does not allow creating an empty instance")] - public UIStoryboardSegue () - { - } - } -} - -#endif diff --git a/src/accounts.cs b/src/accounts.cs index 736dd0eb9041..d9026e98ead5 100644 --- a/src/accounts.cs +++ b/src/accounts.cs @@ -41,12 +41,6 @@ interface ACAccount : NSSecureCoding { [Export ("initWithAccountType:")] NativeHandle Constructor (ACAccountType type); -#if !XAMCORE_3_0 - // now exposed with the corresponding EABluetoothAccessoryPickerError enum - [Field ("ACErrorDomain")] - NSString ErrorDomain { get; } -#endif - [NoMac] [MacCatalyst (13, 1)] [Export ("userFullName")] diff --git a/src/addressbookui.cs b/src/addressbookui.cs index efee55724a6a..9de7fe206f57 100644 --- a/src/addressbookui.cs +++ b/src/addressbookui.cs @@ -108,11 +108,7 @@ interface ABPeoplePickerNavigationController : UIAppearance { /// /// Apple documentation for ABPeoplePickerNavigationControllerDelegate [Deprecated (PlatformName.iOS, 9, 0, message: "Use the 'Contacts' API instead.")] -#if XAMCORE_3_0 [BaseType (typeof (NSObject))] -#else - [BaseType (typeof (UINavigationControllerDelegate))] -#endif [Model] [Protocol] interface ABPeoplePickerNavigationControllerDelegate { diff --git a/src/bgen/Attributes.cs b/src/bgen/Attributes.cs index 25ad9f46cd6b..9c5d819f7270 100644 --- a/src/bgen/Attributes.cs +++ b/src/bgen/Attributes.cs @@ -65,7 +65,6 @@ public ForcedTypeAttribute (bool owns = false) // // Valid on return values and parameters // -// To protocolize newer versions, use [Protocolize (3)] for XAMCORE_3_0, [Protocolize (4)] for NET, etc // [Obsolete ("This attribute no longer has any effect; do not use")] public class ProtocolizeAttribute : Attribute { diff --git a/src/cloudkit.cs b/src/cloudkit.cs index 1006e2274762..0488be7e6acd 100644 --- a/src/cloudkit.cs +++ b/src/cloudkit.cs @@ -508,12 +508,6 @@ interface CKDiscoveredUserInfo : NSCoding, NSCopying, NSSecureCoding { [MacCatalyst (13, 1)] [Static] interface CKErrorFields { -#if !XAMCORE_3_0 - // now exposed with the corresponding CKErrorCode enum - [Field ("CKErrorDomain")] - NSString ErrorDomain { get; } -#endif - [Field ("CKPartialErrorsByItemIDKey")] NSString PartialErrorsByItemIdKey { get; } diff --git a/src/contacts.cs b/src/contacts.cs index 956bbc178b92..c87a195a7f36 100644 --- a/src/contacts.cs +++ b/src/contacts.cs @@ -161,12 +161,6 @@ interface CNContact : NSCopying, NSMutableCopying, NSSecureCoding, NSItemProvide [Field ("CNContactPropertyNotFetchedExceptionName")] NSString PropertyNotFetchedExceptionName { get; } -#if !XAMCORE_3_0 - // now exposed with the corresponding CNErrorCode enum - [Field ("CNErrorDomain")] - NSString ErrorDomain { get; } -#endif - // CNContact_PredicatesExtension - they should be in a [Category] but it makes // [Static] API hard (and ugly) to use since they become extension methods (and // do not look static anymore. diff --git a/src/corebluetooth.cs b/src/corebluetooth.cs index ef2f88aeb79a..7bade79a4a39 100644 --- a/src/corebluetooth.cs +++ b/src/corebluetooth.cs @@ -825,18 +825,6 @@ interface CBUUID : NSCopying { [Export ("UUIDWithNSUUID:")] CBUUID FromNSUuid (NSUuid theUUID); -#if !XAMCORE_3_0 && !NET - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDGenericAccessProfileString")] - NSString GenericAccessProfileString { get; } - - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDGenericAttributeProfileString")] - NSString GenericAttributeProfileString { get; } -#endif // !XAMCORE_3_0 && !NET - [Field ("CBUUIDCharacteristicExtendedPropertiesString")] NSString CharacteristicExtendedPropertiesString { get; } @@ -883,38 +871,6 @@ interface CBUUID : NSCopying { [Field ("CBUUIDL2CAPPSMCharacteristicString")] NSString L2CapPsmCharacteristicString { get; } -#if !XAMCORE_3_0 && !NET - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDDeviceNameString")] - NSString DeviceNameString { get; } - - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDAppearanceString")] - NSString AppearanceString { get; } - - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDPeripheralPrivacyFlagString")] - NSString PeripheralPrivacyFlagString { get; } - - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDReconnectionAddressString")] - NSString ReconnectionAddressString { get; } - - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDPeripheralPreferredConnectionParametersString")] - NSString PeripheralPreferredConnectionParametersString { get; } - - [Deprecated (PlatformName.iOS, 7, 0)] - [Obsoleted (PlatformName.iOS, 9, 0)] - [Field ("CBUUIDServiceChangedString")] - NSString ServiceChangedString { get; } -#endif // !XAMCORE_3_0 && !NET - [MacCatalyst (13, 1)] [Export ("UUIDString")] string Uuid { get; } diff --git a/src/coreimage.cs b/src/coreimage.cs index a2c5dec598fe..561ea85fc545 100644 --- a/src/coreimage.cs +++ b/src/coreimage.cs @@ -5597,12 +5597,6 @@ interface CISunbeamsGenerator : CISunbeamsGeneratorProtocol { [CoreImageFilterProperty ("inputCenter")] CIVector Center { get; set; } #endif - -#if !XAMCORE_3_0 - // binding mistake - it should never been added - [CoreImageFilterProperty ("inputCropAmount")] - float CropAmount { get; set; } -#endif } /// The CIFaceBalance CoreImage filter diff --git a/src/corevideo.cs b/src/corevideo.cs index 91deb76a3b95..fa439996ba14 100644 --- a/src/corevideo.cs +++ b/src/corevideo.cs @@ -519,11 +519,7 @@ interface CVPixelBuffer { /// A reusable set of s. [Partial] -#if XAMCORE_3_0 interface CVPixelBufferPool { -#else - interface CVPixelBufferPool : CVImageBuffer { -#endif [Field ("kCVPixelBufferPoolMinimumBufferCountKey")] NSString MinimumBufferCountKey { get; } diff --git a/src/dotnet.tmpl.csproj b/src/dotnet.tmpl.csproj index d72b0bc5f096..f6ac0a948d8f 100644 --- a/src/dotnet.tmpl.csproj +++ b/src/dotnet.tmpl.csproj @@ -21,7 +21,7 @@ ..\..\..\..\rsp\ios-defines.rsp - $(DefineConstants);__TVOS__;TVOS;MONOTOUCH;IPHONE;XAMCORE_3_0;SYSTEM_NET_HTTP + $(DefineConstants);__TVOS__;TVOS;MONOTOUCH;IPHONE;SYSTEM_NET_HTTP ..\..\..\..\rsp\tvos-defines.rsp diff --git a/src/eventkit.cs b/src/eventkit.cs index 85cfeaf1fb0b..3ab42cd1ba56 100644 --- a/src/eventkit.cs +++ b/src/eventkit.cs @@ -398,9 +398,7 @@ interface EKEvent { /// /// Apple documentation for EKParticipant [BaseType (typeof (EKObject))] -#if XAMCORE_3_0 [DisableDefaultCtor] -#endif interface EKParticipant : NSCopying { [Export ("URL")] NSUrl Url { get; } diff --git a/src/eventkitui.cs b/src/eventkitui.cs index 281677304fce..8c0a03acbd18 100644 --- a/src/eventkitui.cs +++ b/src/eventkitui.cs @@ -139,10 +139,6 @@ interface EKCalendarChooser { [Export ("selectionStyle")] EKCalendarChooserSelectionStyle SelectionStyle { get; -#if !XAMCORE_3_0 - [NotImplemented] - set; -#endif } [Export ("delegate", ArgumentSemantic.Weak), NullAllowed] diff --git a/src/externalaccessory.cs b/src/externalaccessory.cs index 8f68fe1a7efc..82bac4fbb29d 100644 --- a/src/externalaccessory.cs +++ b/src/externalaccessory.cs @@ -113,12 +113,6 @@ interface EAAccessoryManager { [Notification (typeof (EAAccessoryEventArgs))] NSString DidDisconnectNotification { get; } -#if !XAMCORE_3_0 && !MONOMAC - // now exposed with the corresponding EABluetoothAccessoryPickerError enum - [Field ("EABluetoothAccessoryPickerErrorDomain")] - NSString BluetoothAccessoryPickerErrorDomain { get; } -#endif - // [Introduced (PlatformName.MacCatalyst, 14, 0)] [NoMacCatalyst] // selector does not respond [NoMac] diff --git a/src/foundation.cs b/src/foundation.cs index e0966fa0714d..c74a77d22a0e 100644 --- a/src/foundation.cs +++ b/src/foundation.cs @@ -4622,28 +4622,6 @@ interface NSError : NSSecureCoding, NSCopying { [Field ("CarPlayErrorDomain", "CarPlay")] NSString CarPlayErrorDomain { get; } -#if !XAMCORE_3_0 - // now exposed with the corresponding EABluetoothAccessoryPickerError enum - [NoMac, NoTV, NoWatch] - [MacCatalyst (13, 1)] - [Field ("EABluetoothAccessoryPickerErrorDomain", "ExternalAccessory")] - NSString EABluetoothAccessoryPickerErrorDomain { get; } - - // now exposed with the corresponding MKErrorCode enum - [NoMac] - [NoWatch] - [MacCatalyst (13, 1)] - [Field ("MKErrorDomain", "MapKit")] - NSString MapKitErrorDomain { get; } - - // now exposed with the corresponding WKErrorCode enum - [NoMac, NoTV] - [Unavailable (PlatformName.iOS)] - [MacCatalyst (13, 1)] - [Field ("WatchKitErrorDomain", "WatchKit")] - NSString WatchKitErrorDomain { get; } -#endif - [Field ("NSUnderlyingErrorKey")] NSString UnderlyingErrorKey { get; } @@ -7718,14 +7696,7 @@ interface NSUrlCredentialStorage { } -#if NET - delegate void NSUrlSessionPendingTasks (NSUrlSessionTask [] dataTasks, NSUrlSessionTask [] uploadTasks, NSUrlSessionTask[] downloadTasks); -#elif XAMCORE_3_0 - delegate void NSUrlSessionPendingTasks2 (NSUrlSessionTask [] dataTasks, NSUrlSessionTask [] uploadTasks, NSUrlSessionTask[] downloadTasks); -#else - delegate void NSUrlSessionPendingTasks (NSUrlSessionDataTask [] dataTasks, NSUrlSessionUploadTask [] uploadTasks, NSUrlSessionDownloadTask [] downloadTasks); - delegate void NSUrlSessionPendingTasks2 (NSUrlSessionTask [] dataTasks, NSUrlSessionTask [] uploadTasks, NSUrlSessionTask [] downloadTasks); -#endif + delegate void NSUrlSessionPendingTasks (NSUrlSessionTask [] dataTasks, NSUrlSessionTask [] uploadTasks, NSUrlSessionTask [] downloadTasks); delegate void NSUrlSessionAllPendingTasks (NSUrlSessionTask [] tasks); delegate void NSUrlSessionResponse (NSData data, NSUrlResponse response, NSError error); delegate void NSUrlSessionDownloadResponse (NSUrl data, NSUrlResponse response, NSError error); @@ -7798,19 +7769,10 @@ partial interface NSUrlSession { [Async] void Flush (Action completionHandler); -#if !XAMCORE_3_0 - // broken version that we must keep for XAMCORE_3_0 binary compatibility - // but that we do not have to expose on tvOS and watchOS, forcing people to use the correct API - [Obsolete ("Use GetTasks2 instead. This method may throw spurious InvalidCastExceptions, in particular for backgrounded tasks.")] - [Export ("getTasksWithCompletionHandler:")] - [Async (ResultTypeName = "NSUrlSessionActiveTasks")] - void GetTasks (NSUrlSessionPendingTasks completionHandler); -#elif NET // Fixed version (breaking change) only for NET [Export ("getTasksWithCompletionHandler:")] - [Async (ResultTypeName="NSUrlSessionActiveTasks")] + [Async (ResultTypeName = "NSUrlSessionActiveTasks")] void GetTasks (NSUrlSessionPendingTasks completionHandler); -#endif #if !NET // Workaround, not needed for NET+ @@ -15607,16 +15569,6 @@ interface NSAppleEventDescriptor : NSSecureCoding, NSCopying { [Export ("initRecordDescriptor")] IntPtr _InitRecordDescriptor (); -#if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead.")] - [Export ("initListDescriptor")] - NSObject InitListDescriptor (); - - [Obsolete ("Use the constructor instead.")] - [Export ("initRecordDescriptor")] - NSObject InitRecordDescriptor (); -#endif - /*[Export ("aeDesc")] const AEDesc AeDesc (); diff --git a/src/frameworks.sources b/src/frameworks.sources index ec3f51ec8d61..4458a3c9561f 100644 --- a/src/frameworks.sources +++ b/src/frameworks.sources @@ -203,7 +203,6 @@ AUDIOTOOLBOX_SOURCES = \ AudioToolbox/AudioFormatAvailability.cs \ AudioToolbox/AudioQueue.cs \ AudioToolbox/AudioServices.cs \ - AudioToolbox/AudioSession.cs \ AudioToolbox/AudioToolbox.cs \ AudioToolbox/SystemSound.cs \ AudioToolbox/MusicPlayer.cs \ @@ -277,8 +276,6 @@ AVFOUNDATION_SOURCES = \ AVFoundation/AVCompat.cs \ AVFoundation/AVContentKeyResponse.cs \ AVFoundation/AVDepthData.cs \ - AVFoundation/AVFragmentedAsset.cs \ - AVFoundation/AVFragmentedAssetTrack.cs \ AVFoundation/AVLayerVideoGravity.cs \ AVFoundation/AVMetadataItemFilter.cs \ AVFoundation/AVMetadataMachineReadableCodeObject.cs \ @@ -419,7 +416,6 @@ CONTACTS_SOURCES = \ Contacts/CNContactFetchRequest.cs \ Contacts/CNContactStore.cs \ Contacts/CNInstantMessageAddress.cs \ - Contacts/CNObsolete.cs \ Contacts/CNSocialProfile.cs \ # CoreAnimation (this is really Quartz.framework) @@ -648,7 +644,6 @@ COREMOTION_CORE_SOURCES = \ CoreMotion/Defs.cs \ COREMOTION_SOURCES = \ - CoreMotion/CMCompat.cs \ CoreMotion/Extras.cs \ CoreMotion/CMSensorDataList.cs \ @@ -861,7 +856,6 @@ FOUNDATION_SOURCES = \ Foundation/NSDictionary.cs \ Foundation/NSDictionary_2.cs \ Foundation/NSDirectoryEnumerator.cs \ - Foundation/NSDistributedNotificationCenter.cs \ Foundation/NSEnumerator_1.cs \ Foundation/NSErrorException.cs \ Foundation/NSExceptionError.cs \ @@ -1018,7 +1012,6 @@ HEALTHKIT_SOURCES = \ HealthKit/HKAnchoredObjectQuery.cs \ HealthKit/HKCategoryValueSleepAnalysisAsleep.cs \ HealthKit/HKObjectType.cs \ - HealthKit/HKObsolete.cs \ HealthKit/HKSampleQuery.cs \ HealthKit/HKSupportFunctions.cs \ HealthKit/HKUnit.cs \ @@ -1164,7 +1157,6 @@ MAPKIT_CORE_SOURCES = \ MAPKIT_SOURCES = \ MapKit/MKAddressFilter.cs \ MapKit/MKCompat.cs \ - MapKit/MKDirections.cs \ MapKit/MKFeatureDisplayPriority.cs \ MapKit/MKGeodesicPolyline.cs \ MapKit/MKLocalSearch.cs \ @@ -1207,7 +1199,6 @@ MEDIAPLAYER_SOURCES = \ MediaPlayer/MPMediaQuery.cs \ MediaPlayer/MPMoviePlayerController.cs \ MediaPlayer/MPNowPlayingInfoCenter.cs \ - MediaPlayer/MPPlayableContentDelegate.cs \ MediaPlayer/MPRemoteCommandCenter.cs \ MediaPlayer/MPSkipIntervalCommand.cs \ MediaPlayer/MPVolumeSettings.cs \ @@ -1354,7 +1345,6 @@ MULTIPEERCONNECTIVITY_API_SOURCES = \ MultipeerConnectivity/Enums.cs \ MULTIPEERCONNECTIVITY_SOURCES = \ - MultipeerConnectivity/Compat.cs \ MultipeerConnectivity/MCSession.cs \ # Natural Language @@ -1633,7 +1623,6 @@ SCENEKIT_SOURCES = \ SceneKit/Constructors.cs \ SceneKit/SCNAnimatable.cs \ SceneKit/SCNCompat.cs \ - SceneKit/SCNGeometry.cs \ SceneKit/SCNGeometrySource.cs \ SceneKit/SCNJavaScript.cs \ SceneKit/SCNNode.cs \ @@ -1643,7 +1632,6 @@ SCENEKIT_SOURCES = \ SceneKit/SCNRenderingOptions.cs \ SceneKit/SCNScene.cs \ SceneKit/SCNSceneLoadingOptions.cs \ - SceneKit/SCNSceneRenderer.cs \ SceneKit/SCNSceneSource.cs \ SceneKit/SCNSkinner.cs \ SceneKit/SCNTechnique.cs \ @@ -1719,7 +1707,6 @@ SOCIAL_API_SOURCES = \ Social/Enums.cs \ SOCIAL_SOURCES = \ - Social/SLCompat.cs \ Social/SLComposeViewController.cs \ Social/SLRequest.cs \ @@ -1734,11 +1721,9 @@ SPRITEKIT_API_SOURCES = \ SpriteKit/Enums.cs \ SPRITEKIT_SOURCES = \ - SpriteKit/ObsoleteCompat.cs \ SpriteKit/SKAction.cs \ SpriteKit/SKKeyframeSequence.cs \ SpriteKit/SKNode.cs \ - SpriteKit/SKFieldNode.cs \ SpriteKit/SKShapeNode.cs \ SpriteKit/SKUniform.cs \ SpriteKit/SKVideoNode.cs \ @@ -1760,7 +1745,6 @@ STOREKIT_SOURCES = \ StoreKit/SKAdNetworkCompat.cs \ StoreKit/SKCloudServiceSetupOptions.cs \ StoreKit/SKPayment.cs \ - StoreKit/SKPaymentTransactionObserver.cs \ StoreKit/SwiftAPI.cs \ # SystemConfiguration @@ -1792,9 +1776,6 @@ TVSERVICES_CORE_SOURCES = \ TWITTER_CORE_SOURCES = \ Twitter/Enums.cs \ -TWITTER_SOURCES = \ - Twitter/TWCompat.cs \ - # UIKit UIKIT_API_SOURCES = \ @@ -1804,7 +1785,6 @@ UIKIT_CORE_SOURCES = \ UIKit/UIFontDescriptor.cs \ UIKit/UIGuidedAccessRestriction.cs \ UIKit/UIOffset.cs \ - UIKit/UIPrintInteractionController.cs \ UIKit/UIStringAttributes.cs \ UIKit/UITypes.cs \ XKit/Types.cs \ @@ -1818,8 +1798,6 @@ UIKIT_SOURCES = \ UIKit/UIAccessibility.cs \ UIKit/UIAccessibilityCustomAction.cs \ UIKit/UIActionSheet.cs \ - UIKit/UIActivityItemProvider.cs \ - UIKit/UIActivityViewController.cs \ UIKit/UIAlertView.cs \ UIKit/UIAppearance.cs \ UIKit/UIApplication.cs \ @@ -1831,15 +1809,12 @@ UIKIT_SOURCES = \ UIKit/UICollectionView.cs \ UIKit/UICollectionViewLayout.cs \ UIKit/UICollectionViewLayoutAttributes.cs \ - UIKit/UICollectionViewTransitionLayout.cs \ UIKit/UIColor.cs \ UIKit/UIConfigurationColorTransformer.cs \ UIKit/UIContentSizeCategory.cs \ UIKit/UIControl.cs \ UIKit/UIDevice.cs \ UIKit/UIDocumentBrowserViewController.cs \ - UIKit/UIDocumentMenuViewController.cs \ - UIKit/UIDocumentPickerViewController.cs \ UIKit/UIDragDropSessionExtensions.cs \ UIKit/UIDynamicAnimator.cs \ UIKit/UIEnumsExtensions.cs \ @@ -1862,7 +1837,6 @@ UIKIT_SOURCES = \ UIKit/UIPickerView.cs \ UIKit/UIPopoverController.cs \ UIKit/UIPopoverPresentationController.cs \ - UIKit/UIPrint.cs \ UIKit/UIPushBehavior.cs \ UIKit/UIScreen.cs \ UIKit/UIScrollView.cs \ @@ -1870,9 +1844,6 @@ UIKIT_SOURCES = \ UIKit/UISearchController.cs \ UIKit/UISearchDisplayController.cs \ UIKit/UISegmentedControl.cs \ - UIKit/UISimpleTextPrintFormatter.cs \ - UIKit/UIStoryboardPopoverSegue.cs \ - UIKit/UIStoryboardSegue.cs \ UIKit/UIStringDrawing.cs \ UIKit/UITableView.cs \ UIKit/UITableViewCell.cs \ @@ -2092,7 +2063,6 @@ SHARED_SOURCES = \ ObjCRuntime/RuntimeException.cs \ ObjCRuntime/RuntimeOptions.cs \ ObjCRuntime/Selector.mac.cs \ - ObjCRuntime/SelectorMarshaler.cs \ ObjCRuntime/Stret.cs \ ObjCRuntime/ThreadSafeAttribute.cs \ ObjCRuntime/TrampolineBlockBase.cs \ diff --git a/src/homekit.cs b/src/homekit.cs index 30c78b1e9f8f..b3b85b21511e 100644 --- a/src/homekit.cs +++ b/src/homekit.cs @@ -580,32 +580,20 @@ partial interface HMCharacteristicWriteAction { [NoWatch] [MacCatalyst (13, 1)] [Export ("initWithCharacteristic:targetValue:")] -#if XAMCORE_3_0 NativeHandle Constructor (HMCharacteristic characteristic, INSCopying targetValue); -#else - NativeHandle Constructor (HMCharacteristic characteristic, NSObject targetValue); -#endif [Export ("characteristic", ArgumentSemantic.Retain)] HMCharacteristic Characteristic { get; } [Export ("targetValue", ArgumentSemantic.Copy)] -#if XAMCORE_3_0 INSCopying TargetValue { get; } -#else - NSObject TargetValue { get; } -#endif [NoTV] [NoWatch] [MacCatalyst (13, 1)] [Async] [Export ("updateTargetValue:completionHandler:")] -#if XAMCORE_3_0 void UpdateTargetValue (INSCopying targetValue, Action completion); -#else - void UpdateTargetValue (NSObject targetValue, Action completion); -#endif } [MacCatalyst (14, 0)] diff --git a/src/javascriptcore.cs b/src/javascriptcore.cs index 3494bcfded19..526bccf2b2b3 100644 --- a/src/javascriptcore.cs +++ b/src/javascriptcore.cs @@ -391,9 +391,7 @@ partial interface JSValue { /// Apple documentation for JSManagedValue [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] -#if XAMCORE_3_0 [DisableDefaultCtor] -#endif partial interface JSManagedValue { [Static, Export ("managedValueWithValue:")] JSManagedValue Get (JSValue value); diff --git a/src/mapkit.cs b/src/mapkit.cs index f644b66d60ab..e1c79774b803 100644 --- a/src/mapkit.cs +++ b/src/mapkit.cs @@ -2166,9 +2166,7 @@ interface MKLocalSearchCompleterDelegate { [NoWatch] [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] -#if MONOMAC || XAMCORE_3_0 // "You do not create instances of this class directly" [DisableDefaultCtor] -#endif interface MKLocalSearchCompletion { [Export ("title", ArgumentSemantic.Strong)] string Title { get; } diff --git a/src/mediaplayer.cs b/src/mediaplayer.cs index bd69f9dd38d7..9f6a79f5c05b 100644 --- a/src/mediaplayer.cs +++ b/src/mediaplayer.cs @@ -324,12 +324,7 @@ interface MPMediaItemArtwork { #else [BaseType (typeof (NSObject))] #endif -#if XAMCORE_3_0 || !IOS || NET interface MPMediaItemCollection : NSSecureCoding { -#else - // part of the bug is that we inlined MPMediaEntity needlessly - interface MPMediaItemCollection : MPMediaEntity, NSSecureCoding { -#endif [Static] [Export ("collectionWithItems:")] MPMediaItemCollection FromItems (MPMediaItem [] items); diff --git a/src/messageui.cs b/src/messageui.cs index b8aee9721eae..b511886b1a03 100644 --- a/src/messageui.cs +++ b/src/messageui.cs @@ -71,14 +71,7 @@ interface MFMailComposeViewController : UIAppearance { /// interface IMFMailComposeViewControllerDelegate { } -#if XAMCORE_3_0 [BaseType (typeof (NSObject))] -#else - /// Used to receive notifications from the MFMailComposeViewController class. - /// - /// Apple documentation for MFMailComposeViewControllerDelegate - [BaseType (typeof (UINavigationControllerDelegate))] -#endif [Model] [Protocol] interface MFMailComposeViewControllerDelegate { diff --git a/src/scenekit.cs b/src/scenekit.cs index 0822a5ed6f84..b2533569a94a 100644 --- a/src/scenekit.cs +++ b/src/scenekit.cs @@ -1369,11 +1369,7 @@ interface SCNLight : SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCodi [Static, Export ("light")] SCNLight Create (); -#if XAMCORE_3_0 [NoiOS] -#elif !MONOMAC - [Obsolete ("Do not use; this method only exist in macOS, not in iOS.")] -#endif [NoTV] [Deprecated (PlatformName.MacOSX, 10, 10)] [NoMacCatalyst] @@ -1381,11 +1377,7 @@ interface SCNLight : SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCodi [return: NullAllowed] NSObject GetAttribute (NSString lightAttribute); -#if XAMCORE_3_0 [NoiOS] -#elif !MONOMAC - [Obsolete ("Do not use; this method only exist in macOS, not in iOS.")] -#endif [NoTV] [Deprecated (PlatformName.MacOSX, 10, 10)] [NoMacCatalyst] diff --git a/src/spritekit.cs b/src/spritekit.cs index c45535c821c9..d56fc61c83d5 100644 --- a/src/spritekit.cs +++ b/src/spritekit.cs @@ -1205,16 +1205,14 @@ partial interface SKShapeNode { [Static, Export ("shapeNodeWithEllipseOfSize:")] SKShapeNode FromEllipse (CGSize size); -#if XAMCORE_3_0 // Hide this ugly api fixes https://bugzilla.xamarin.com/show_bug.cgi?id=39706 + // Hide this ugly api fixes https://bugzilla.xamarin.com/show_bug.cgi?id=39706 [Internal] -#endif [MacCatalyst (13, 1)] [Static, Export ("shapeNodeWithPoints:count:")] SKShapeNode FromPoints (ref CGPoint points, nuint numPoints); -#if XAMCORE_3_0 // Hide this ugly api fixes https://bugzilla.xamarin.com/show_bug.cgi?id=39706 + // Hide this ugly api fixes https://bugzilla.xamarin.com/show_bug.cgi?id=39706 [Internal] -#endif [MacCatalyst (13, 1)] [Static, Export ("shapeNodeWithSplinePoints:count:")] SKShapeNode FromSplinePoints (ref CGPoint points, nuint numPoints); @@ -1533,9 +1531,7 @@ partial interface SKCropNode { [NoWatch] [MacCatalyst (13, 1)] [BaseType (typeof (UIView))] -#if XAMCORE_3_0 [DisableDefaultCtor] -#endif #if MONOMAC partial interface SKView : NSSecureCoding { #else diff --git a/src/uikit.cs b/src/uikit.cs index f1d33b25bb51..1223b2cbb3c5 100644 --- a/src/uikit.cs +++ b/src/uikit.cs @@ -312,20 +312,6 @@ public enum UISearchControllerScopeBarActivation : long { // In the hopes that the parameter is self document: this array can contain either UIDocuments or UIResponders delegate void UIApplicationRestorationHandler (NSObject [] uidocumentOrResponderObjects); -#if !XAMCORE_3_0 - [NoWatch] - [MacCatalyst (13, 1)] -#pragma warning disable 0618 // warning CS0618: 'CategoryAttribute.CategoryAttribute(bool)' is obsolete: 'Inline the static members in this category in the category's class (and remove this obsolete once fixed)' - [Category (allowStaticMembers: true)] // Classic isn't internal so we need this -#pragma warning restore - [BaseType (typeof (NSAttributedString))] - interface NSAttributedStringAttachmentConveniences { - [Internal] - [Static, Export ("attributedStringWithAttachment:")] - NSAttributedString FromTextAttachment (NSTextAttachment attachment); - } -#endif - /// Abstract base class for classes that generate feedback hints, such as haptics. [NoWatch, NoTV] [MacCatalyst (13, 1)] @@ -2294,10 +2280,6 @@ interface UIViewControllerPreviewing { [Export ("delegate", ArgumentSemantic.Assign), NullAllowed] NSObject WeakDelegate { get; // readonly -#if !XAMCORE_3_0 - [NotImplemented] - set; -#endif } [Wrap ("WeakDelegate")] @@ -4687,15 +4669,8 @@ interface IUICollectionViewDelegate { } [MacCatalyst (13, 1)] [Model] [Protocol] -#if XAMCORE_3_0 && !NET - // bind like UITableViewDelegate to avoid generating duplicate code - // it's an API break (binary, source should be fine) - [BaseType (typeof (UIScrollViewDelegate))] - interface UICollectionViewDelegate { -#else [BaseType (typeof (NSObject))] interface UICollectionViewDelegate : UIScrollViewDelegate { -#endif [Export ("collectionView:shouldHighlightItemAtIndexPath:")] bool ShouldHighlightItem (UICollectionView collectionView, NSIndexPath indexPath); @@ -7729,32 +7704,6 @@ interface UIKeyboard { [Notification (typeof (UIKeyboardEventArgs))] NSString DidChangeFrameNotification { get; } -#if !XAMCORE_3_0 - // - // Deprecated methods - // - - [NoTV] - [Deprecated (PlatformName.iOS, 3, 2)] - [MacCatalyst (13, 1)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Field ("UIKeyboardCenterBeginUserInfoKey")] - NSString CenterBeginUserInfoKey { get; } - - [NoTV] - [Deprecated (PlatformName.iOS, 3, 2)] - [MacCatalyst (13, 1)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Field ("UIKeyboardCenterEndUserInfoKey")] - NSString CenterEndUserInfoKey { get; } - - [NoTV] - [Deprecated (PlatformName.iOS, 3, 2)] - [MacCatalyst (13, 1)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Field ("UIKeyboardBoundsUserInfoKey")] - NSString BoundsUserInfoKey { get; } -#endif // // Keys // @@ -10199,23 +10148,6 @@ interface UIButton : UIAccessibilityContentSizeCategoryImageAdjusting [Export ("imageRectForContentRect:")] CGRect ImageRectForContentRect (CGRect rect); -#if !XAMCORE_3_0 - [Deprecated (PlatformName.iOS, 3, 0)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Export ("font", ArgumentSemantic.Retain)] - UIFont Font { get; set; } - - [Deprecated (PlatformName.iOS, 3, 0)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Export ("lineBreakMode")] - UILineBreakMode LineBreakMode { get; set; } - - [Deprecated (PlatformName.iOS, 3, 0)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Export ("titleShadowOffset")] - CGSize TitleShadowOffset { get; set; } -#endif - // // 6.0 // @@ -10858,13 +10790,6 @@ interface UIImagePickerController { [Export ("mediaTypes", ArgumentSemantic.Copy)] string [] MediaTypes { get; set; } -#if !XAMCORE_3_0 - [Export ("allowsImageEditing")] - [Deprecated (PlatformName.iOS, 3, 1)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - bool AllowsImageEditing { get; set; } -#endif - // // 3.1 APIs // @@ -10974,12 +10899,6 @@ interface UIImagePickerController { [Model] [Protocol] interface UIImagePickerControllerDelegate { -#if !XAMCORE_3_0 - [Obsoleted (PlatformName.iOS, 3, 0)] - [Export ("imagePickerController:didFinishPickingImage:editingInfo:"), EventArgs ("UIImagePickerImagePicked")] - void FinishedPickingImage (UIImagePickerController picker, UIImage image, NSDictionary editingInfo); -#endif - [Export ("imagePickerController:didFinishPickingMediaWithInfo:"), EventArgs ("UIImagePickerMediaPicked")] void FinishedPickingMedia (UIImagePickerController picker, NSDictionary info); @@ -15297,13 +15216,6 @@ interface UITableViewSource { [Export ("tableView:viewForFooterInSection:")] UIView GetViewForFooter (UITableView tableView, nint section); -#if !XAMCORE_3_0 - [Deprecated (PlatformName.iOS, 3, 0)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Export ("tableView:accessoryTypeForRowWithIndexPath:")] - UITableViewCellAccessory AccessoryForRow (UITableView tableView, NSIndexPath indexPath); -#endif - [Export ("tableView:accessoryButtonTappedForRowWithIndexPath:")] void AccessoryButtonTapped (UITableView tableView, NSIndexPath indexPath); @@ -15786,13 +15698,6 @@ interface UITableViewDelegate { [Export ("tableView:viewForFooterInSection:")] UIView GetViewForFooter (UITableView tableView, nint section); -#if !XAMCORE_3_0 - [Deprecated (PlatformName.iOS, 3, 0)] - [Deprecated (PlatformName.MacCatalyst, 13, 1)] - [Export ("tableView:accessoryTypeForRowWithIndexPath:")] - UITableViewCellAccessory AccessoryForRow (UITableView tableView, NSIndexPath indexPath); -#endif - [Export ("tableView:accessoryButtonTappedForRowWithIndexPath:")] void AccessoryButtonTapped (UITableView tableView, NSIndexPath indexPath); diff --git a/src/watchkit.cs b/src/watchkit.cs index 5de9374b825a..a71267ef0be1 100644 --- a/src/watchkit.cs +++ b/src/watchkit.cs @@ -182,12 +182,6 @@ interface WKInterfaceController { [Export ("reloadRootPageControllersWithNames:contexts:orientation:pageIndex:")] void ReloadRootPageControllers (string [] names, [NullAllowed] NSObject [] contexts, WKPageOrientation orientation, nint pageIndex); -#if !XAMCORE_3_0 && !NET - // now exposed with the corresponding WKErrorCode enum - [Field ("WatchKitErrorDomain")] - NSString ErrorDomain { get; } -#endif - [Export ("dismissMediaPlayerController")] void DismissMediaPlayerController (); diff --git a/src/webkit.cs b/src/webkit.cs index 807674a82b7b..a48951edf953 100644 --- a/src/webkit.cs +++ b/src/webkit.cs @@ -1216,15 +1216,6 @@ partial interface DomEvent { [Export ("preventDefault")] void PreventDefault (); -#if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead.")] - [Export ("initEvent:canBubbleArg:cancelableArg:")] - void InitEvent (string eventTypeArg, bool canBubbleArg, bool cancelableArg); -#endif - -#if !XAMCORE_3_0 - [Sealed] // Just to avoid the duplicate selector error -#endif [Export ("initEvent:canBubbleArg:cancelableArg:")] NativeHandle Constructor (string eventTypeArg, bool canBubbleArg, bool cancelableArg); } @@ -1237,14 +1228,6 @@ partial interface DomEvent { [BaseType (typeof (DomEvent), Name = "DOMOverflowEvent")] [DisableDefaultCtor] partial interface DomOverflowEvent { -#if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead.")] - [Export ("initOverflowEvent:horizontalOverflow:verticalOverflow:")] - void InitEvent (ushort orient, bool hasHorizontalOverflow, bool hasVerticalOverflow); -#endif -#if !XAMCORE_3_0 - [Sealed] // Just to avoid the duplicate selector error -#endif [Export ("initOverflowEvent:horizontalOverflow:verticalOverflow:")] NativeHandle Constructor (ushort orient, bool hasHorizontalOverflow, bool hasVerticalOverflow); @@ -1278,14 +1261,6 @@ partial interface DomProgressEvent { [BaseType (typeof (DomEvent), Name = "DOMUIEvent")] [DisableDefaultCtor] partial interface DomUIEvent { -#if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead.")] - [Export ("initUIEvent:canBubble:cancelable:view:detail:")] - void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, int /* int, not NSInteger */ detail); -#endif -#if !XAMCORE_3_0 - [Sealed] // Just to avoid the duplicate selector error -#endif [Export ("initUIEvent:canBubble:cancelable:view:detail:")] NativeHandle Constructor (string eventType, bool canBubble, bool cancelable, DomAbstractView view, int /* int, not NSInteger */ detail); @@ -1319,25 +1294,9 @@ partial interface DomUIEvent { [BaseType (typeof (DomUIEvent), Name = "DOMKeyboardEvent")] [DisableDefaultCtor] partial interface DomKeyboardEvent { -#if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead.")] - [Export ("initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:altGraphKey:")] - void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, string keyIdentifier, DomKeyLocation keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey); - - [Obsolete ("Use the constructor instead.")] - [Export ("initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:")] - void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, string keyIdentifier, DomKeyLocation keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey); -#endif - -#if !XAMCORE_3_0 - [Sealed] // Just to avoid the duplicate selector error -#endif [Export ("initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:altGraphKey:")] NativeHandle Constructor (string eventType, bool canBubble, bool cancelable, DomAbstractView view, string keyIdentifier, DomKeyLocation keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey); -#if !XAMCORE_3_0 - [Sealed] // Just to avoid the duplicate selector error -#endif [Export ("initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:")] NativeHandle Constructor (string eventType, bool canBubble, bool cancelable, DomAbstractView view, string keyIdentifier, DomKeyLocation keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey); @@ -1377,14 +1336,6 @@ partial interface DomKeyboardEvent { [BaseType (typeof (DomUIEvent), Name = "DOMMouseEvent")] [DisableDefaultCtor] partial interface DomMouseEvent { -#if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead.")] - [Export ("initMouseEvent:canBubble:cancelable:view:detail:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:button:relatedTarget:")] - void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, int /* int, not NSInteger */ detail, int /* int, not NSInteger */ screenX, int /* int, not NSInteger */ screenY, int /* int, not NSInteger */ clientX, int /* int, not NSInteger */ clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, ushort button, IDomEventTarget relatedTarget); -#endif -#if !XAMCORE_3_0 - [Sealed] // Just to avoid the duplicate selector error -#endif [Export ("initMouseEvent:canBubble:cancelable:view:detail:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:button:relatedTarget:")] NativeHandle Constructor (string eventType, bool canBubble, bool cancelable, DomAbstractView view, int /* int, not NSInteger */ detail, int /* int, not NSInteger */ screenX, int /* int, not NSInteger */ screenY, int /* int, not NSInteger */ clientX, int /* int, not NSInteger */ clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, ushort button, IDomEventTarget relatedTarget); @@ -1442,14 +1393,6 @@ partial interface DomMouseEvent { [BaseType (typeof (DomMouseEvent), Name = "DOMWheelEvent")] [DisableDefaultCtor] partial interface DomWheelEvent { -#if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead.")] - [Export ("initWheelEvent:wheelDeltaY:view:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:")] - void InitEvent (int /* int, not NSInteger */ wheelDeltaX, int /* int, not NSInteger */ wheelDeltaY, DomAbstractView view, int /* int, not NSInteger */ screenX, int /* int, not NSInteger */ screnY, int /* int, not NSInteger */ clientX, int /* int, not NSInteger */ clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey); -#endif -#if !XAMCORE_3_0 - [Sealed] // Just to avoid the duplicate selector error -#endif [Export ("initWheelEvent:wheelDeltaY:view:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:")] NativeHandle Constructor (int /* int, not NSInteger */ wheelDeltaX, int /* int, not NSInteger */ wheelDeltaY, DomAbstractView view, int /* int, not NSInteger */ screenX, int /* int, not NSInteger */ screnY, int /* int, not NSInteger */ clientX, int /* int, not NSInteger */ clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey); diff --git a/src/xkit.cs b/src/xkit.cs index ad28ed08344a..00e7a8d355c5 100644 --- a/src/xkit.cs +++ b/src/xkit.cs @@ -2665,19 +2665,11 @@ NSTextStorageEditActions EditedMask { [Export ("editedRange")] NSRange EditedRange { get; -#if !XAMCORE_3_0 && !MONOMAC && !__MACCATALYST__ - [NotImplemented] - set; -#endif } [Export ("changeInLength")] nint ChangeInLength { get; -#if !XAMCORE_3_0 && !MONOMAC && !__MACCATALYST__ - [NotImplemented] - set; -#endif } [NullAllowed] @@ -3132,10 +3124,6 @@ interface NSTextLayoutOrientationProvider { [Export ("layoutOrientation")] NSTextLayoutOrientation LayoutOrientation { get; -#if !XAMCORE_3_0 && !MONOMAC - [NotImplemented] - set; -#endif } } diff --git a/tests/bcl-test/templates/watchOS/Container/Container.csproj b/tests/bcl-test/templates/watchOS/Container/Container.csproj index 3d89bb2574af..c5e5d7f5b952 100644 --- a/tests/bcl-test/templates/watchOS/Container/Container.csproj +++ b/tests/bcl-test/templates/watchOS/Container/Container.csproj @@ -10,7 +10,7 @@ Resources Container obj\$(Platform)\$(Configuration)-watchos - XAMCORE_3_0; + latest diff --git a/tests/common/shared-dotnet.csproj b/tests/common/shared-dotnet.csproj index 2b46011e8e0e..f84dd0fb3c12 100644 --- a/tests/common/shared-dotnet.csproj +++ b/tests/common/shared-dotnet.csproj @@ -55,9 +55,6 @@ latest - - $(DefineConstants);XAMCORE_3_0 - CA1416;$(NoWarn) diff --git a/tests/introspection/Mac/MacApiProtocolTest.cs b/tests/introspection/Mac/MacApiProtocolTest.cs index f66faae37722..ac357c8534f0 100644 --- a/tests/introspection/Mac/MacApiProtocolTest.cs +++ b/tests/introspection/Mac/MacApiProtocolTest.cs @@ -434,14 +434,6 @@ protected override bool Skip (Type type, string protocolName) break; } - switch (type.Name) { -#if !XAMCORE_3_0 - case "NSRemoteSavePanel": - case "NSRemoteOpenPanel": - return true; // These two classes don't show up in any documentation. -#endif - } - switch (type.Namespace) { case "MonoMac.SceneKit": case "SceneKit": diff --git a/tests/introspection/Mac/MacApiSelectorTest.cs b/tests/introspection/Mac/MacApiSelectorTest.cs index 5d0f2ff513f9..8344a3c4f39e 100644 --- a/tests/introspection/Mac/MacApiSelectorTest.cs +++ b/tests/introspection/Mac/MacApiSelectorTest.cs @@ -157,13 +157,6 @@ protected override bool Skip (Type type, string selectorName) #if !NET case "xamarinselector:removed:": return true; -#endif -#if !XAMCORE_3_0 - case "initWithPasteboardPropertyList:ofType:": - // This is a broken binding, but it's an abstract protocol - // method, so there's no way to remove it without breaking - // compat. - return true; #endif case "readInBackgroundAndNotifyForModes:": case "readInBackgroundAndNotify": @@ -1322,27 +1315,6 @@ protected override bool CheckStaticResponse (bool value, Type actualType, Type d protected override bool SkipInit (string selector, MethodBase m) { switch (selector) { -#if !XAMCORE_3_0 - // DomEvent - case "initEvent:canBubbleArg:cancelableArg:": - // DomOverflowEvent - case "initOverflowEvent:horizontalOverflow:verticalOverflow:": - // DomUIEvent - case "initUIEvent:canBubble:cancelable:view:detail:": - // DomKeyboardEvent - case "initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:altGraphKey:": - case "initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:": - // DomMouseEvent - case "initMouseEvent:canBubble:cancelable:view:detail:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:button:relatedTarget:": - // DomWheelEvent - case "initWheelEvent:wheelDeltaY:view:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:": - // QTMovie - case "movieWithTimeRange:error:": - case "initWithQuickTimeMedia:error:": - // NSAnimation - case "initWithDuration:animationCurve:": - return true; -#endif // Cinematic.CNDecision case "initWithTime:detectionGroupID:strong:": case "initWithTime:detectionID:strong:": diff --git a/tests/introspection/iOS/iOSApiCtorInitTest.cs b/tests/introspection/iOS/iOSApiCtorInitTest.cs index 723a679f7692..b68250732512 100644 --- a/tests/introspection/iOS/iOSApiCtorInitTest.cs +++ b/tests/introspection/iOS/iOSApiCtorInitTest.cs @@ -205,7 +205,7 @@ protected override bool Skip (Type type) case "UICollectionViewFocusUpdateContext": // [Assert] -init is not a useful initializer for this class. Use one of the designated initializers instead case "UIFocusUpdateContext": // [Assert] -init is not a useful initializer for this class. Use one of the designated initializers instead case "EKCalendarItem": // Fails with NSInvalidArgumentException +[EKCalendarItem frozenClass]: unrecognized selector sent to class, will fill a radar - case "EKParticipant": // ctor disabled in XAMCORE_3_0 + case "EKParticipant": case "UITableViewFocusUpdateContext": // Objective-C exception thrown. Name: NSInternalInconsistencyException Reason: Invalid parameter not satisfying: focusSystem, will fill a radar return true; case "INBookRestaurantReservationIntentResponse": // iOS 11 beta 2: stack overflow in description. radar:32945914 diff --git a/tests/introspection/iOS/iOSApiProtocolTest.cs b/tests/introspection/iOS/iOSApiProtocolTest.cs index 8d7c19d5c7a0..46aa75662381 100644 --- a/tests/introspection/iOS/iOSApiProtocolTest.cs +++ b/tests/introspection/iOS/iOSApiProtocolTest.cs @@ -173,13 +173,6 @@ protected override bool Skip (Type type, string protocolName) switch (type.Name) { case "CAMetalLayer": return TestRuntime.IsSimulatorOrDesktop && !TestRuntime.CheckXcodeVersion (11, 0); -#if !XAMCORE_3_0 - // mistake (base type) fixed by a breaking change - case "MFMailComposeViewControllerDelegate": - if (protocolName == "UINavigationControllerDelegate") - return true; - break; -#endif // special case: the Delegate property is id so we made A subclass B in managed // but this test see the conformance is not correct case "UIImagePickerControllerDelegate": @@ -940,14 +933,6 @@ protected override bool Skip (Type type, string protocolName) if ((type.Name == "UISearchBar") && !TestRuntime.CheckXcodeVersion (5, 1)) return true; break; -#if !XAMCORE_3_0 - case "UINavigationControllerDelegate": - switch (type.Name) { - case "ABPeoplePickerNavigationControllerDelegate": // 37180 - return true; - } - break; -#endif case "GKSavedGameListener": switch (type.Name) { case "GKLocalPlayerListener": // 37180 diff --git a/tests/introspection/iOS/iOSApiWeakPropertyTest.cs b/tests/introspection/iOS/iOSApiWeakPropertyTest.cs index 90466b97c3c5..d2438e4e3d5f 100644 --- a/tests/introspection/iOS/iOSApiWeakPropertyTest.cs +++ b/tests/introspection/iOS/iOSApiWeakPropertyTest.cs @@ -41,14 +41,6 @@ protected override bool Skip (PropertyInfo property) // NSString manually bound as smart enum CLSContextTopic case "CLSContext": return property.Name == "WeakTopic"; -#if !XAMCORE_3_0 - // #37451 - setter does not exists but we have to keep it for binary compatibility - // OTOH we can't give it a selector (private API) even if we suspect Apple is mostly running `strings` on executable - case "IUIViewControllerPreviewing": - return property.Name == "WeakDelegate"; - case "UIViewControllerPreviewingWrapper": - return property.Name == "WeakDelegate"; -#endif case "CHHapticPatternDefinition": return property.Name == "WeakParameterCurve" || property.Name == "WeakParameterCurveControlPoints"; } diff --git a/tests/linker/ios/link all/LinkAllTest.cs b/tests/linker/ios/link all/LinkAllTest.cs index 19796568a4e1..f5fd3587c2a0 100644 --- a/tests/linker/ios/link all/LinkAllTest.cs +++ b/tests/linker/ios/link all/LinkAllTest.cs @@ -278,9 +278,6 @@ public void DetectPlatform () #endif // !__MACOS__ [Test] -#if !XAMCORE_3_0 && !NET - [Availability ()] -#endif #if NET [SupportedOSPlatform ("none")] [UnsupportedOSPlatform ("none)")] @@ -298,9 +295,6 @@ public void RemovedAttributes () string suffix = AssemblyName; // since we're linking the attributes will NOT be available - even if they are used -#if !XAMCORE_3_0 - Assert.Null (Helper.GetType (prefix + "ObjCRuntime.AvailabilityAttribute, " + suffix), "AvailabilityAttribute"); -#endif Assert.Null (Helper.GetType (prefix + "ObjCRuntime.IntroducedAttribute, " + suffix), "IntroducedAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.DeprecatedAttribute, " + suffix), "DeprecatedAttribute"); Assert.Null (Helper.GetType (prefix + "ObjCRuntime.ObsoletedAttribute, " + suffix), "ObsoletedAttribute"); diff --git a/tests/monotouch-test/AudioToolbox/AudioSessionTest.cs b/tests/monotouch-test/AudioToolbox/AudioSessionTest.cs deleted file mode 100644 index 904c4709af14..000000000000 --- a/tests/monotouch-test/AudioToolbox/AudioSessionTest.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2011 Xamarin Inc. All rights reserved - -#if !__TVOS__ && !__WATCHOS__ && !MONOMAC && !XAMCORE_3_0 - -using System; -using Foundation; -using AudioToolbox; -using ObjCRuntime; -using NUnit.Framework; - -namespace MonoTouchFixtures.AudioToolbox { - - [TestFixture] - [Preserve (AllMembers = true)] - public class AudioSessionTest { - - public AudioSessionTest () - { - TestRuntime.RequestMicrophonePermission (); - AudioSession.Initialize (); - } - - [Test] - public void Properties () - { - var input = AudioSession.InputRoute; - - Assert.That (Enum.IsDefined (typeof (AudioSessionInputRouteKind), input), "InputRoute"); - - var outputs = AudioSession.OutputRoutes; - if (outputs is not null) { - foreach (var output in outputs) - Assert.That (Enum.IsDefined (typeof (AudioSessionOutputRouteKind), output), "Output: " + output.ToString ()); - } - - if (TestRuntime.IsDevice) { - Assert.That (outputs is not null && outputs.Length > 0, "All known devices have at least speakers #1"); - Assert.That (outputs [0] != AudioSessionOutputRouteKind.None, "All known devices have at least speakers #2"); - } - } - } -} -#endif // !__TVOS__ && !__WATCHOS__ && !MONOMAC && !XAMCORE_3_0 diff --git a/tests/monotouch-test/CoreBluetooth/CentralManagerTest.cs b/tests/monotouch-test/CoreBluetooth/CentralManagerTest.cs index 9f58a4070cd0..283fac00a4ae 100644 --- a/tests/monotouch-test/CoreBluetooth/CentralManagerTest.cs +++ b/tests/monotouch-test/CoreBluetooth/CentralManagerTest.cs @@ -41,16 +41,6 @@ public override void UpdatedState (CBCentralManager central) PoweredOnEvent.Set (); } -#if !XAMCORE_3_0 && !NET - public override void RetrievedPeripherals (CBCentralManager central, CBPeripheral [] peripherals) - { - } - - public override void RetrievedConnectedPeripherals (CBCentralManager central, CBPeripheral [] peripherals) - { - } -#endif // !XAMCORE_3_0 && !NET - public override void DiscoveredPeripheral (CBCentralManager central, CBPeripheral peripheral, NSDictionary advertisementData, NSNumber RSSI) { } @@ -119,11 +109,6 @@ public void RetrievePeripherals () // ToString in a CBUUID with true returns the full uuid which can be used to create a NSUuid using (var uuid = new NSUuid (heartRateMonitorUUID.ToString (true))) mgr.RetrievePeripheralsWithIdentifiers (uuid); - } else { -#if !XAMCORE_3_0 && !NET - // that API was deprecated in 7.0 and removed from 9.0 - mgr.RetrievePeripherals (heartRateMonitorUUID); -#endif // !XAMCORE_3_0 && !NET } } } diff --git a/tests/monotouch-test/CoreGraphics/ColorSpaceTest.cs b/tests/monotouch-test/CoreGraphics/ColorSpaceTest.cs index 63019ca03b3e..b5af4fba3281 100644 --- a/tests/monotouch-test/CoreGraphics/ColorSpaceTest.cs +++ b/tests/monotouch-test/CoreGraphics/ColorSpaceTest.cs @@ -37,14 +37,6 @@ void CheckUnknown (CGColorSpace cs) Assert.That (cs.GetColorTable ().Length, Is.EqualTo (0), "Unknown-GetColorTable"); } -#if !XAMCORE_3_0 - [Test] - public void Null () - { - CheckUnknown (CGColorSpace.Null); - } -#endif - [Test] public void CreateDeviceGray () { diff --git a/tests/monotouch-test/CoreGraphics/GradientTest.cs b/tests/monotouch-test/CoreGraphics/GradientTest.cs index d3c04d9e66ce..739beb03f9df 100644 --- a/tests/monotouch-test/CoreGraphics/GradientTest.cs +++ b/tests/monotouch-test/CoreGraphics/GradientTest.cs @@ -50,9 +50,6 @@ public void Colorspace_Null () static CGColorSpace [] spaces = { CGColorSpace.CreateDeviceGray (), CGColorSpace.CreateDeviceRGB (), -#if !XAMCORE_3_0 - CGColorSpace.Null -#endif }; [Test] diff --git a/tests/monotouch-test/CoreMedia/CMTimeTests.cs b/tests/monotouch-test/CoreMedia/CMTimeTests.cs index ee7453d35346..26ec65851e51 100644 --- a/tests/monotouch-test/CoreMedia/CMTimeTests.cs +++ b/tests/monotouch-test/CoreMedia/CMTimeTests.cs @@ -116,9 +116,6 @@ public void CMTimeRangeConstants () Assert.DoesNotThrow (() => { var x = CMTimeRange.Zero; }, "CMTimeRangeConstants - Zero"); Assert.DoesNotThrow (() => { var x = CMTimeRange.InvalidRange; }, "CMTimeRangeConstants - InvalidRange"); Assert.DoesNotThrow (() => { var x = CMTimeRange.InvalidMapping; }, "CMTimeRangeConstants - InvalidMapping"); -#if !XAMCORE_3_0 - Assert.DoesNotThrow (() => { var x = CMTimeRange.Invalid; }, "CMTimeRangeConstants - Invalid"); -#endif if (TestRuntime.CheckXcodeVersion (7, 0)) { Assert.DoesNotThrow (() => { var x = CMTimeRange.InvalidMapping; }, "CMTimeRangeConstants - InvalidMapping"); Assert.DoesNotThrow (() => { var x = CMTimeRange.TimeMappingSourceKey; }, "CMTimeRangeConstants - TimeMappingSourceKey"); diff --git a/tests/monotouch-test/MapKit/AnnotationViewTest.cs b/tests/monotouch-test/MapKit/AnnotationViewTest.cs index d2c35290bfda..83b28940a0ae 100644 --- a/tests/monotouch-test/MapKit/AnnotationViewTest.cs +++ b/tests/monotouch-test/MapKit/AnnotationViewTest.cs @@ -21,35 +21,6 @@ using Xamarin.Utils; namespace MonoTouchFixtures.MapKit { - -#if !XAMCORE_3_0 - class AnnotationViewPoker : MKAnnotationView { - - static FieldInfo bkAnnotation; - - static AnnotationViewPoker () - { - var t = typeof (MKAnnotationView); - bkAnnotation = t.GetField ("__mt_Annotation_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public AnnotationViewPoker (IMKAnnotation annotation) : base (annotation, "reuse") - { - } - - public NSObject AnnotationBackingField { - get { - return (NSObject) bkAnnotation.GetValue (this); - } - } - } -#endif - [TestFixture] [Preserve (AllMembers = true)] public class AnnotationViewTest { @@ -81,21 +52,6 @@ public void InitWithAnnotation () } } -#if !XAMCORE_3_0 - [Test] - public void Annotation_BackingFields () - { - if (AnnotationViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var a = new MKPolygon ()) - using (var av = new AnnotationViewPoker (a)) { - Assert.AreSame (a, av.AnnotationBackingField, "1a"); - Assert.AreSame (a, av.Annotation, "2a"); - } - } -#endif // !XAMCORE_3_0 - [Test] public void Default () { diff --git a/tests/monotouch-test/MapKit/CircleViewTest.cs b/tests/monotouch-test/MapKit/CircleViewTest.cs index fe0f7be494e4..b637ad579164 100644 --- a/tests/monotouch-test/MapKit/CircleViewTest.cs +++ b/tests/monotouch-test/MapKit/CircleViewTest.cs @@ -11,39 +11,6 @@ using NUnit.Framework; namespace MonoTouchFixtures.MapKit { - -#if !XAMCORE_3_0 - class CircleViewPoker : MKCircleView { - - static FieldInfo bkCircle; - - static CircleViewPoker () - { - var t = typeof (MKCircleView); - bkCircle = t.GetField ("__mt_Circle_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public CircleViewPoker () - { - } - - public CircleViewPoker (MKCircle circle) : base (circle) - { - } - - public MKCircle CircleBackingField { - get { - return (MKCircle) bkCircle.GetValue (this); - } - } - } - -#endif // !XAMCORE_3_0 [TestFixture] [Preserve (AllMembers = true)] public class CircleViewTest { @@ -56,33 +23,6 @@ public void InitWithFrame () Assert.That (cv.Frame, Is.EqualTo (frame), "Frame"); } } - -#if !XAMCORE_3_0 - [Test] - public void Defaults_BackingFields () - { - if (CircleViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var cv = new CircleViewPoker ()) { - Assert.Null (cv.CircleBackingField, "1a"); - Assert.Null (cv.Circle, "2a"); - } - } - - [Test] - public void Circle_BackingFields () - { - if (CircleViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var c = new MKCircle ()) - using (var cv = new CircleViewPoker (c)) { - Assert.AreSame (c, cv.CircleBackingField, "1a"); - Assert.AreSame (c, cv.Circle, "2a"); - } - } -#endif // !XAMCORE_3_0 } } diff --git a/tests/monotouch-test/MapKit/MapViewTest.cs b/tests/monotouch-test/MapKit/MapViewTest.cs index c7c45e37bcc6..c638943c8921 100644 --- a/tests/monotouch-test/MapKit/MapViewTest.cs +++ b/tests/monotouch-test/MapKit/MapViewTest.cs @@ -17,56 +17,6 @@ using Xamarin.Utils; namespace MonoTouchFixtures.MapKit { - -#if !XAMCORE_3_0 - class MapViewPoker : MKMapView { - - static FieldInfo bkAnnotations; - static FieldInfo bkSelectedAnnotations; - static FieldInfo bkOverlays; - - static MapViewPoker () - { - var t = typeof (MKMapView); - bkAnnotations = t.GetField ("__mt_Annotations_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkSelectedAnnotations = t.GetField ("__mt_SelectedAnnotations_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkOverlays = t.GetField ("__mt_Overlays_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public MapViewPoker () - { - } - - // if created (and even if unused) iOS will call it back later (retain) - public MapViewPoker (IntPtr p) : base (p) - { - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public NSObject [] AnnotationsBackingField { - get { - return (NSObject []) bkAnnotations.GetValue (this); - } - } - - public NSObject [] SelectedAnnotationsBackingField { - get { - return (NSObject []) bkSelectedAnnotations.GetValue (this); - } - } - - public NSObject [] OverlaysBackingField { - get { - return (NSObject []) bkOverlays.GetValue (this); - } - } - } -#endif // !XAMCORE_3_0 - [TestFixture] [Preserve (AllMembers = true)] public class MapViewTest { @@ -85,140 +35,6 @@ public void InitWithFrame () } } -#if !XAMCORE_3_0 - [Test] - public void Annotations_BackingFields () - { - if (MapViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var a = new MKCircle ()) // MKAnnotation is abstract - using (var o1 = new MKPolygon ()) // it must export 'coordinate' or this will fail - using (var o2 = new MKPolyline ()) - using (var mv = new MapViewPoker ()) { - Assert.Null (mv.AnnotationsBackingField, "1a"); - Assert.That (mv.Annotations, Is.Empty, "1b"); - - mv.AddAnnotation (a); - Assert.AreSame (a, mv.AnnotationsBackingField [0], "2a"); - Assert.AreSame (a, mv.Annotations [0], "2b"); - - mv.RemoveAnnotation (a); - Assert.That (mv.AnnotationsBackingField, Is.Empty, "3a"); - Assert.That (mv.Annotations, Is.Empty, "3b"); - - mv.AddAnnotation (o1); - Assert.AreSame (o1, mv.AnnotationsBackingField [0], "4a"); - Assert.AreSame (o1, mv.Annotations [0], "4b"); - - mv.RemoveAnnotation (o1); - Assert.That (mv.AnnotationsBackingField, Is.Empty, "5a"); - Assert.That (mv.Annotations, Is.Empty, "5b"); - - mv.AddAnnotations (new IMKAnnotation [] { o1, o2 }); - // don't assume ordering - Assert.That (mv.AnnotationsBackingField.Length, Is.EqualTo (2), "6a"); - Assert.That (mv.Annotations.Length, Is.EqualTo (2), "6b"); - - mv.RemoveAnnotations (new IMKAnnotation [] { o2, o1 }); - Assert.That (mv.AnnotationsBackingField, Is.Empty, "7a"); - Assert.That (mv.Annotations, Is.Empty, "7b"); - } - } - - [Test] - public void SelectedAnnotations_BackingFields () - { - if (MapViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - -#if !MONOMAC - if (TestRuntime.CheckSystemVersion (ApplePlatform.iOS, 7, 0)) { - // This test selects annotations on a map view, but according to apple's docs - // and a lot of googling this will not necessarily work until the map view is - // show. Since we can't relinquish control of the UI thread, we have no option - // but ignoring this test. For now I've only seen it fail on iOS 7 DP4. - Assert.Inconclusive ("This test is not deterministic on iOS7 DP4."); - } -#endif - - using (var a = new MKCircle ()) // MKAnnotation is abstract - using (var o1 = new MKPolygon ()) // it must export 'coordinate' or this will fail - using (var o2 = new MKPolyline ()) - using (var mv = new MapViewPoker ()) { - Assert.Null (mv.SelectedAnnotationsBackingField, "1a"); - Assert.Null (mv.SelectedAnnotations, "1b"); // not an empty array - - mv.SelectAnnotation (a, false); - Assert.AreSame (a, mv.SelectedAnnotationsBackingField [0], "2a"); - Assert.AreSame (a, mv.SelectedAnnotations [0], "2b"); - - // sanity - Assert.Null (mv.AnnotationsBackingField, "3a"); - Assert.That (mv.Annotations, Is.Empty, "3b"); - - mv.SelectedAnnotations = new IMKAnnotation [] { o1, o2 }; - // note: when assigning the property only the first item is selected (by design) - // so we're not exactly backing up correctly (we still hold 'o2') - // OTOH we do not want to recursively [PostGet] the same property (unless handled by the generator) - Assert.That (mv.SelectedAnnotationsBackingField.Length, Is.EqualTo (2), "4a"); - Assert.That (mv.SelectedAnnotations.Length, Is.EqualTo (1), "4b"); - - mv.DeselectAnnotation (o1, false); - // since only 'o1' was really selected, unselecting it will return null - Assert.Null (mv.SelectedAnnotationsBackingField, "5a"); - Assert.Null (mv.SelectedAnnotations, "5b"); // not an empty array - } - } - - [Test] - public void Overlays_BackingFields () - { - if (MapViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var o1 = new MKPolygon ()) // it must export 'boundingMapRect' or this will fail - using (var o2 = new MKPolyline ()) - using (var mv = new MapViewPoker ()) { - var overlays = new IMKOverlay [] { o1, o2 }; - Assert.Null (mv.OverlaysBackingField, "1a"); - Assert.Null (mv.Overlays, "1b"); // not an empty array - - mv.AddOverlay (o1); - Assert.AreSame (o1, mv.OverlaysBackingField [0], "2a"); - Assert.AreSame (o1, mv.Overlays [0], "2b"); - - mv.InsertOverlay (o2, 0); - Assert.That (mv.OverlaysBackingField.Length, Is.EqualTo (2), "3a"); - Assert.That (mv.Overlays.Length, Is.EqualTo (2), "3b"); - - mv.RemoveOverlay (o1); - Assert.AreSame (o2, mv.OverlaysBackingField [0], "4a"); - Assert.AreSame (o2, mv.Overlays [0], "4b"); - - mv.InsertOverlayAbove (o1, o2); - Assert.That (mv.OverlaysBackingField.Length, Is.EqualTo (2), "5a"); - Assert.That (mv.Overlays.Length, Is.EqualTo (2), "5b"); - - mv.RemoveOverlay (o2); - Assert.AreSame (o1, mv.OverlaysBackingField [0], "6a"); - Assert.AreSame (o1, mv.Overlays [0], "6b"); - - mv.InsertOverlayBelow (o2, o1); - Assert.That (mv.OverlaysBackingField.Length, Is.EqualTo (2), "7a"); - Assert.That (mv.Overlays.Length, Is.EqualTo (2), "7b"); - - mv.RemoveOverlays (overlays); - Assert.That (mv.OverlaysBackingField, Is.Empty, "8a"); - Assert.That (mv.Overlays, Is.Empty, "8b"); - - mv.AddOverlays (overlays); - Assert.That (mv.OverlaysBackingField.Length, Is.EqualTo (2), "9a"); - Assert.That (mv.Overlays.Length, Is.EqualTo (2), "9b"); - } - } -#endif // !XAMCORE_3_0 - [Test] public void Overlays () { diff --git a/tests/monotouch-test/MapKit/OverlayViewTest.cs b/tests/monotouch-test/MapKit/OverlayViewTest.cs index 6cfb26c7eaeb..6cde522c62c6 100644 --- a/tests/monotouch-test/MapKit/OverlayViewTest.cs +++ b/tests/monotouch-test/MapKit/OverlayViewTest.cs @@ -13,35 +13,6 @@ using NUnit.Framework; namespace MonoTouchFixtures.MapKit { - -#if !XAMCORE_3_0 - class OverlayViewPoker : MKOverlayView { - - static FieldInfo bkOverlay; - - static OverlayViewPoker () - { - var t = typeof (MKOverlayView); - bkOverlay = t.GetField ("__mt_Overlay_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public OverlayViewPoker (IMKOverlay overlay) : base (overlay) - { - } - - public NSObject OverlayBackingField { - get { - return (NSObject) bkOverlay.GetValue (this); - } - } - } -#endif // !XAMCORE_3_0 - [TestFixture] [Preserve (AllMembers = true)] public class OverlayViewTest { @@ -55,21 +26,6 @@ public void InitWithFrame () Assert.Null (ov.Overlay, "Overlay"); } } - -#if !XAMCORE_3_0 - [Test] - public void Overlay_BackingFields () - { - if (OverlayViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var c = new MKCircle ()) - using (var ov = new OverlayViewPoker (c)) { - Assert.AreSame (c, ov.Overlay, "1a"); - Assert.AreSame (c, ov.Overlay, "2a"); - } - } -#endif // !XAMCORE_3_0 } } diff --git a/tests/monotouch-test/MapKit/PolygonViewTest.cs b/tests/monotouch-test/MapKit/PolygonViewTest.cs index e8f572f78cb6..d719cb0bfa8f 100644 --- a/tests/monotouch-test/MapKit/PolygonViewTest.cs +++ b/tests/monotouch-test/MapKit/PolygonViewTest.cs @@ -11,39 +11,6 @@ using NUnit.Framework; namespace MonoTouchFixtures.MapKit { - -#if !XAMCORE_3_0 - class PolygonViewPoker : MKPolygonView { - - static FieldInfo bkPolygon; - - static PolygonViewPoker () - { - var t = typeof (MKPolygonView); - bkPolygon = t.GetField ("__mt_Polygon_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public PolygonViewPoker () - { - } - - public PolygonViewPoker (MKPolygon polygon) : base (polygon) - { - } - - public MKPolygon PolygonBackingField { - get { - return (MKPolygon) bkPolygon.GetValue (this); - } - } - } -#endif // !XAMCORE_3_0 - [TestFixture] [Preserve (AllMembers = true)] public class PolygonViewTest { @@ -56,33 +23,6 @@ public void InitWithFrame () Assert.That (pv.Frame, Is.EqualTo (frame), "Frame"); } } - -#if !XAMCORE_3_0 - [Test] - public void Defaults_BackingFields () - { - if (PolygonViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var pv = new PolygonViewPoker ()) { - Assert.Null (pv.PolygonBackingField, "1a"); - Assert.Null (pv.Polygon, "2a"); - } - } - - [Test] - public void Polygon_BackingFields () - { - if (PolygonViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var p = new MKPolygon ()) - using (var pv = new PolygonViewPoker (p)) { - Assert.AreSame (p, pv.PolygonBackingField, "1a"); - Assert.AreSame (p, pv.Polygon, "2a"); - } - } -#endif // !XAMCORE_3_0 } } diff --git a/tests/monotouch-test/MapKit/PolylineViewTest.cs b/tests/monotouch-test/MapKit/PolylineViewTest.cs index 4cdf25c7c4d7..53dd8d80e0e3 100644 --- a/tests/monotouch-test/MapKit/PolylineViewTest.cs +++ b/tests/monotouch-test/MapKit/PolylineViewTest.cs @@ -11,39 +11,6 @@ using NUnit.Framework; namespace MonoTouchFixtures.MapKit { - -#if !XAMCORE_3_0 - class PolylineViewPoker : MKPolylineView { - - static FieldInfo bkPolyline; - - static PolylineViewPoker () - { - var t = typeof (MKPolylineView); - bkPolyline = t.GetField ("__mt_Polyline_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public PolylineViewPoker () - { - } - - public PolylineViewPoker (MKPolyline polyline) : base (polyline) - { - } - - public MKPolyline PolylineBackingField { - get { - return (MKPolyline) bkPolyline.GetValue (this); - } - } - } -#endif // !XAMCORE_3_0 - [TestFixture] [Preserve (AllMembers = true)] public class PolylineViewTest { @@ -56,33 +23,6 @@ public void InitWithFrame () Assert.That (pl.Frame, Is.EqualTo (frame), "Frame"); } } - -#if !XAMCORE_3_0 - [Test] - public void Defaults_BackingFields () - { - if (PolylineViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var pv = new PolylineViewPoker ()) { - Assert.Null (pv.PolylineBackingField, "1a"); - Assert.Null (pv.Polyline, "2a"); - } - } - - [Test] - public void Polygon_BackingFields () - { - if (PolylineViewPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var p = new MKPolyline ()) - using (var pv = new PolylineViewPoker (p)) { - Assert.AreSame (p, pv.PolylineBackingField, "1a"); - Assert.AreSame (p, pv.Polyline, "2a"); - } - } -#endif // !XAMCORE_3_0 } } diff --git a/tests/monotouch-test/MapKit/UserTrackingBarButtonItemTest.cs b/tests/monotouch-test/MapKit/UserTrackingBarButtonItemTest.cs deleted file mode 100644 index db90db6f8f5d..000000000000 --- a/tests/monotouch-test/MapKit/UserTrackingBarButtonItemTest.cs +++ /dev/null @@ -1,86 +0,0 @@ -// -// MKUserTrackingBarButtonItem Unit Tests -// -// Authors: -// Sebastien Pouliot -// -// Copyright 2012 Xamarin Inc. All rights reserved. -// - -#if !XAMCORE_3_0 && !MONOMAC - -using System; -using System.Drawing; -using System.Reflection; -using Foundation; -using MapKit; -using ObjCRuntime; - -using NUnit.Framework; - -namespace MonoTouchFixtures.MapKit { - - class UserTrackingBarButtonItemPoker : MKUserTrackingBarButtonItem { - - static FieldInfo bkMapView; - - static UserTrackingBarButtonItemPoker () - { - var t = typeof (MKUserTrackingBarButtonItem); - bkMapView = t.GetField ("__mt_MapView_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public UserTrackingBarButtonItemPoker (MKMapView view) : base (view) - { - } - - public MKMapView MapViewBackingField { - get { - return (MKMapView) bkMapView.GetValue (this); - } - } - } - - [TestFixture] - [Preserve (AllMembers = true)] - public class UserTrackingBarButtonItemTest { - - [Test] - public void Ctor_Defaults () - { - using (var a = new NSObject ()) - using (MKUserTrackingBarButtonItem ut = new MKUserTrackingBarButtonItem ()) { - Assert.Null (ut.MapView, "MapView"); - } - } - - [Test] - public void Ctor_MKMapView () - { - using (MKMapView mv = new MKMapView ()) - using (MKUserTrackingBarButtonItem ut = new MKUserTrackingBarButtonItem (mv)) { - Assert.AreSame (mv, ut.MapView, "MapView"); - } - } - - [Test] - public void MapView_BackingFields () - { - if (UserTrackingBarButtonItemPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var mv = new MKMapView ()) - using (var ut = new UserTrackingBarButtonItemPoker (mv)) { - Assert.AreSame (mv, ut.MapViewBackingField, "1a"); - Assert.AreSame (mv, ut.MapView, "2a"); - } - } - } -} - -#endif // !XAMCORE_3_0 && !MONOMAC diff --git a/tests/monotouch-test/MediaAccessibility/CaptionAppearanceTest.cs b/tests/monotouch-test/MediaAccessibility/CaptionAppearanceTest.cs index 1c8c60489073..15ab7a6f9ddd 100644 --- a/tests/monotouch-test/MediaAccessibility/CaptionAppearanceTest.cs +++ b/tests/monotouch-test/MediaAccessibility/CaptionAppearanceTest.cs @@ -20,23 +20,6 @@ namespace MonoTouchFixtures.MediaAccessibility { // we want the test to be availble if we use the linker [Preserve (AllMembers = true)] public class CaptionAppearanceTest { - -#if !XAMCORE_3_0 - [Test] - public void Fields () - { - if (TestRuntime.CheckXcodeVersion (5, 0, 1)) { - Assert.NotNull (MACaptionAppearance.MediaCharacteristicDescribesMusicAndSoundForAccessibility, "MediaCharacteristicDescribesMusicAndSoundForAccessibility"); - Assert.NotNull (MACaptionAppearance.MediaCharacteristicTranscribesSpokenDialogForAccessibility, "MediaCharacteristicTranscribesSpokenDialogForAccessibility"); - Assert.NotNull (MACaptionAppearance.SettingsChangedNotification, "SettingsChangedNotification"); - } else { - Assert.Null (MACaptionAppearance.MediaCharacteristicDescribesMusicAndSoundForAccessibility, "MediaCharacteristicDescribesMusicAndSoundForAccessibility"); - Assert.Null (MACaptionAppearance.MediaCharacteristicTranscribesSpokenDialogForAccessibility, "MediaCharacteristicTranscribesSpokenDialogForAccessibility"); - Assert.Null (MACaptionAppearance.SettingsChangedNotification, "SettingsChangedNotification"); - } - } -#endif // !XAMCORE_3_0 - [Test] [Culture ("en")] // this setting depends on locale of the device according to apple docs on MACaptionAppearanceGetDisplayType, we know english works public void GetDisplayType () diff --git a/tests/monotouch-test/MessageUI/MailComposeViewControllerTest.cs b/tests/monotouch-test/MessageUI/MailComposeViewControllerTest.cs index 746e83d9abc7..7196598522e6 100644 --- a/tests/monotouch-test/MessageUI/MailComposeViewControllerTest.cs +++ b/tests/monotouch-test/MessageUI/MailComposeViewControllerTest.cs @@ -29,12 +29,7 @@ public void TextShadowOffset_7443 () if (!MFMailComposeViewController.CanSendMail) Assert.Inconclusive ("Not configured to send emails"); -#if XAMCORE_3_0 var cancelAttributes = new UIStringAttributes (); -#else - var cancelAttributes = new UITextAttributes (); - cancelAttributes.TextShadowOffset = new UIOffset (0, -1); -#endif UIBarButtonItem.AppearanceWhenContainedIn (typeof (UISearchBar)).SetTitleTextAttributes (cancelAttributes, UIControlState.Disabled); using (var mail = new MFMailComposeViewController ()) { // we're happy the .ctor did not crash (only on iOS6) because the dictionary had a null key (typo) diff --git a/tests/monotouch-test/UIKit/BarButtonItemTest.cs b/tests/monotouch-test/UIKit/BarButtonItemTest.cs index b4cc9460c84d..526f9dcd4cfe 100644 --- a/tests/monotouch-test/UIKit/BarButtonItemTest.cs +++ b/tests/monotouch-test/UIKit/BarButtonItemTest.cs @@ -128,11 +128,7 @@ public void SetTitleTextAttributes_Null () { using (MyView v = new MyView ("note")) using (var b = new UIBarButtonItem (v)) { -#if XAMCORE_3_0 b.SetTitleTextAttributes ((UIStringAttributes) null, UIControlState.Disabled); -#else - b.SetTitleTextAttributes ((UITextAttributes) null, UIControlState.Disabled); -#endif } } #endif diff --git a/tests/monotouch-test/UIKit/SearchDisplayControllerTest.cs b/tests/monotouch-test/UIKit/SearchDisplayControllerTest.cs deleted file mode 100644 index 9ea0042f1a6b..000000000000 --- a/tests/monotouch-test/UIKit/SearchDisplayControllerTest.cs +++ /dev/null @@ -1,119 +0,0 @@ -// -// Unit tests for UISearchDisplayController -// -// Authors: -// Sebastien Pouliot -// -// Copyright 2012 Xamarin Inc. All rights reserved. -// - -#if !XAMCORE_3_0 && !MONOMAC && !__MACCATALYST__ - -using System; -using System.Drawing; -using System.Reflection; -using Foundation; -using UIKit; -using NUnit.Framework; - -namespace MonoTouchFixtures.UIKit { - - class SearchDisplayControllerPoker : UISearchDisplayController { - - static FieldInfo bkSearchBar; - static FieldInfo bkSearchContentsController; - static FieldInfo bkSearchResultsTableView; - - static SearchDisplayControllerPoker () - { - var t = typeof (UISearchDisplayController); - bkSearchBar = t.GetField ("__mt_SearchBar_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkSearchContentsController = t.GetField ("__mt_SearchContentsController_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkSearchResultsTableView = t.GetField ("__mt_SearchResultsTableView_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public SearchDisplayControllerPoker () - { - } - - public SearchDisplayControllerPoker (UISearchBar searchBar, UIViewController viewController) : base (searchBar, viewController) - { - } - - public UISearchBar SearchBarBackingField { - get { - return (UISearchBar) bkSearchBar.GetValue (this); - } - } - - public UIViewController SearchContentsControllerBackingField { - get { - return (UIViewController) bkSearchContentsController.GetValue (this); - } - } - - public UITableView SearchResultsTableViewBackingField { - get { - return (UITableView) bkSearchResultsTableView.GetValue (this); - } - } - } - - [TestFixture] - [Preserve (AllMembers = true)] - public class SearchDisplayControllerTest { - - [Test] - public void Ctor_Default_BackingFields () - { - if (SearchDisplayControllerPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var sc = new SearchDisplayControllerPoker ()) { - // default constructor does not set any UIViewController so the backing fields are null - Assert.Null (sc.SearchBarBackingField, "1a"); - Assert.Null (sc.SearchContentsControllerBackingField, "2a"); - Assert.Null (sc.SearchResultsTableViewBackingField, "3a"); - - Assert.Null (sc.SearchBar, "1b"); - Assert.Null (sc.SearchContentsController, "2b"); - // not an issue (backing field being null before calling the getter) - // since it's not something we supplied to the instance - Assert.NotNull (sc.SearchResultsTableView, "3b"); - // the backing field will be set afterward - Assert.NotNull (sc.SearchResultsTableViewBackingField, "3c"); - } - } - - [Test] - public void Ctor_BackingFields () - { - if (SearchDisplayControllerPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var sb = new UISearchBar ()) - using (var vc = new UIViewController ()) - using (var sc = new SearchDisplayControllerPoker (sb, vc)) { - // default constructor does not set any UIViewController so the backing fields are null - Assert.AreSame (sb, sc.SearchBarBackingField, "1a"); - Assert.AreSame (vc, sc.SearchContentsControllerBackingField, "2a"); - Assert.Null (sc.SearchResultsTableViewBackingField, "3a"); - - Assert.AreSame (sb, sc.SearchBar, "1b"); - Assert.AreSame (vc, sc.SearchContentsController, "2b"); - // not an issue (backing field being null before calling the getter) - // since it's not something we supplied to the instance - Assert.NotNull (sc.SearchResultsTableView, "3b"); - // the backing field will be set afterward - Assert.NotNull (sc.SearchResultsTableViewBackingField, "3c"); - } - } - } -} - -#endif // !XAMCORE_3_0 && !MONOMAC diff --git a/tests/monotouch-test/UIKit/SimpleTextPrintFormatterTest.cs b/tests/monotouch-test/UIKit/SimpleTextPrintFormatterTest.cs index 195783b2fd5b..337f90f11e29 100644 --- a/tests/monotouch-test/UIKit/SimpleTextPrintFormatterTest.cs +++ b/tests/monotouch-test/UIKit/SimpleTextPrintFormatterTest.cs @@ -23,31 +23,6 @@ namespace MonoTouchFixtures.UIKit { [TestFixture] [Preserve (AllMembers = true)] public class SimpleTextPrintFormatterTest { - -#if !XAMCORE_3_0 // The default ctor is not available in XAMCORE_3_0+ - [Test] - public void DefaultCtor () - { - using (var stpf = new UISimpleTextPrintFormatter ()) { - Assert.That (stpf.Handle, Is.Not.EqualTo (IntPtr.Zero), "Handle"); - if (TestRuntime.CheckXcodeVersion (11, 0)) { - Assert.NotNull (stpf.Color, "Color"); - Assert.Null (stpf.Font, "Font"); - Assert.That (stpf.TextAlignment, Is.EqualTo (UITextAlignment.Natural), "TextAlignment"); - } else if (TestRuntime.CheckSystemVersion (ApplePlatform.iOS, 7, 0, throwIfOtherPlatform: false)) { - Assert.Null (stpf.Color, "Color"); - Assert.Null (stpf.Font, "Font"); - Assert.That (stpf.TextAlignment, Is.EqualTo (UITextAlignment.Natural), "TextAlignment"); - } else { - Assert.That (stpf.Color, Is.EqualTo (UIColor.Black), "Color"); - Assert.NotNull (stpf.Font, "Font"); - Assert.That (stpf.TextAlignment, Is.EqualTo (UITextAlignment.Left), "TextAlignment"); - } - Assert.That (stpf.Text, Is.Empty, "Text"); - } - } -#endif // !XAMCORE_3_0 - [Test] public void StringCtor () { diff --git a/tests/monotouch-test/UIKit/SliderTest.cs b/tests/monotouch-test/UIKit/SliderTest.cs deleted file mode 100644 index 94d4a5bf355d..000000000000 --- a/tests/monotouch-test/UIKit/SliderTest.cs +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2011-2012 Xamarin Inc. All rights reserved - -#if !XAMCORE_3_0 && !MONOMAC - -using System; -using System.Drawing; -using System.Reflection; -using CoreGraphics; -using Foundation; -using UIKit; -using NUnit.Framework; - -namespace MonoTouchFixtures.UIKit { - - class SliderPoker : UISlider { - - static FieldInfo bkCurrentThumbImage; - static FieldInfo bkCurrentMinTrackImage; - static FieldInfo bkCurrentMaxTrackImage; - static FieldInfo bkMinValueImage; - static FieldInfo bkMaxValueImage; - - static SliderPoker () - { - var t = typeof (UISlider); - bkCurrentThumbImage = t.GetField ("__mt_CurrentThumbImage_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkCurrentMinTrackImage = t.GetField ("__mt_CurrentMinTrackImage_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkCurrentMaxTrackImage = t.GetField ("__mt_CurrentMaxTrackImage_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkMinValueImage = t.GetField ("__mt_MinValueImage_var", BindingFlags.Instance | BindingFlags.NonPublic); - bkMaxValueImage = t.GetField ("__mt_MaxValueImage_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public SliderPoker () - { - } - - public UIImage CurrentThumbImageBackingField { - get { - return (UIImage) bkCurrentThumbImage.GetValue (this); - } - } - - public UIImage CurrentMinTrackImageBackingField { - get { - return (UIImage) bkCurrentMinTrackImage.GetValue (this); - } - } - - public UIImage CurrentMaxTrackImageBackingField { - get { - return (UIImage) bkCurrentMaxTrackImage.GetValue (this); - } - } - - public UIImage MinValueImageBackingField { - get { - return (UIImage) bkMinValueImage.GetValue (this); - } - } - - public UIImage MaxValueImageBackingField { - get { - return (UIImage) bkMaxValueImage.GetValue (this); - } - } - } - - [TestFixture] - [Preserve (AllMembers = true)] - public class SliderTest { - - [Test] - public void InitWithFrame () - { - var frame = new CGRect (10, 10, 100, 100); - using (UISlider s = new UISlider (frame)) { - Assert.That (s.Frame, Is.EqualTo (frame), "Frame"); - } - } - - [Test] - public void Ctor_Default_BackingFields () - { - if (SliderPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var s = new SliderPoker ()) { - // default constructor does not set any UIViewController so the backing fields are null - Assert.Null (s.CurrentThumbImageBackingField, "1a"); - Assert.Null (s.CurrentMinTrackImageBackingField, "2a"); - Assert.Null (s.CurrentMaxTrackImageBackingField, "3a"); - Assert.Null (s.MinValueImageBackingField, "4a"); - Assert.Null (s.MaxValueImageBackingField, "5a"); - - Assert.Null (s.CurrentThumbImage, "1b"); - Assert.Null (s.CurrentMinTrackImage, "2b"); - Assert.Null (s.CurrentMaxTrackImage, "3b"); - Assert.Null (s.MinValueImage, "4b"); - Assert.Null (s.MaxValueImage, "5b"); - } - } - - [Test] - public void CurrentThumbImage_BackingFields () - { - if (SliderPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var i = new UIImage ()) - using (var s = new SliderPoker ()) { - // default constructor does not set any UIViewController so the backing fields are null - Assert.Null (s.CurrentThumbImageBackingField, "1a"); - Assert.Null (s.CurrentThumbImage, "1b"); - - s.SetThumbImage (i, UIControlState.Normal); - Assert.NotNull (s.CurrentThumbImageBackingField, "1c"); - Assert.NotNull (s.CurrentThumbImage, "1d"); - } - } - - [Test] - public void CurrentMinTrackImage_BackingFields () - { - if (SliderPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var i = new UIImage ()) - using (var s = new SliderPoker ()) { - // default constructor does not set any UIViewController so the backing fields are null - Assert.Null (s.CurrentMinTrackImageBackingField, "1a"); - Assert.Null (s.CurrentMinTrackImage, "1b"); - - s.SetMinTrackImage (i, UIControlState.Normal); - Assert.NotNull (s.CurrentMinTrackImageBackingField, "1c"); - Assert.NotNull (s.CurrentMinTrackImage, "1d"); - } - } - - [Test] - public void CurrentMaxTrackImage_BackingFields () - { - if (SliderPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - using (var i = new UIImage ()) - using (var s = new SliderPoker ()) { - // default constructor does not set any UIViewController so the backing fields are null - Assert.Null (s.CurrentMaxTrackImageBackingField, "1a"); - Assert.Null (s.CurrentMaxTrackImage, "1b"); - - s.SetMaxTrackImage (i, UIControlState.Normal); - Assert.NotNull (s.CurrentMaxTrackImageBackingField, "1c"); - Assert.NotNull (s.CurrentMaxTrackImage, "1d"); - } - } - } -} - -#endif // !XAMCORE_3_0 && !MONOMAC diff --git a/tests/monotouch-test/UIKit/StringAttributesTest.cs b/tests/monotouch-test/UIKit/StringAttributesTest.cs index f70a399fa62a..2b4e357f37ef 100644 --- a/tests/monotouch-test/UIKit/StringAttributesTest.cs +++ b/tests/monotouch-test/UIKit/StringAttributesTest.cs @@ -14,11 +14,7 @@ using UIKit; using NUnit.Framework; -#if XAMCORE_3_0 using TextAttributes = UIKit.UIStringAttributes; -#else -using TextAttributes = UIKit.UITextAttributes; -#endif namespace MonoTouchFixtures.UIKit { diff --git a/tests/monotouch-test/UIKit/UIDocumentTest.cs b/tests/monotouch-test/UIKit/UIDocumentTest.cs index 93803be14d71..40bb9a8f847e 100644 --- a/tests/monotouch-test/UIKit/UIDocumentTest.cs +++ b/tests/monotouch-test/UIKit/UIDocumentTest.cs @@ -22,34 +22,6 @@ namespace MonoTouchFixtures.UIKit { -#if !XAMCORE_3_0 - class DocumentPoker : UIDocument { - - static FieldInfo bkFileUrl; - - static DocumentPoker () - { - var t = typeof (UIDocument); - bkFileUrl = t.GetField ("__mt_FileUrl_var", BindingFlags.Instance | BindingFlags.NonPublic); - } - - public static bool NewRefcountEnabled () - { - return NSObject.IsNewRefcountEnabled (); - } - - public DocumentPoker (NSUrl url) : base (url) - { - } - - public NSUrl FileUrlBackingField { - get { - return (NSUrl) bkFileUrl.GetValue (this); - } - } - } - -#endif // !XAMCORE_3_0 class MyUrl : NSUrl { public MyUrl (string url, string annotation) : base (url) @@ -125,48 +97,6 @@ public void PerformAsynchronousFileAccess_Null () } } -#if !XAMCORE_3_0 - [Test] - public void FileUrl_BackingField () - { - if (DocumentPoker.NewRefcountEnabled ()) - Assert.Inconclusive ("backing fields are removed when newrefcount is enabled"); - - string file = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments), "uidocument.txt"); - if (File.Exists (file)) - File.Delete (file); - - using (NSUrl url = NSUrl.FromFilename (file)) - using (var doc = new DocumentPoker (url)) { - Assert.NotNull (doc.FileUrlBackingField, "1a"); - Assert.AreSame (doc.FileUrl, doc.FileUrlBackingField, "2a"); - // not a big deal in this case since we can't subclass NSUrl - } - } - - [Test] - [Ignore ("crash on the bots, run fines locally on sim")] - public void NSUrl_Subclass () - { - string file = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments), "uidocument.txt"); - if (File.Exists (file)) - File.Delete (file); - - // interesting limitation - using (MyUrl url2 = new MyUrl (file, "my document")) { - // Objective-C exception thrown. Name: NSInvalidArgumentException Reason: must pass a valid file URL to -[UIDocument initWithFileURL:] -#if NET - Assert.Throws (delegate { -#else - Assert.Throws (delegate - { -#endif - new DocumentPoker (url2); - }); - } - } -#endif // !XAMCORE_3_0 - [Test] public void Fields () { diff --git a/tests/monotouch-test/VideoToolbox/VTUtilitiesTests.cs b/tests/monotouch-test/VideoToolbox/VTUtilitiesTests.cs index 557edde95ed0..7e3d3f85db6b 100644 --- a/tests/monotouch-test/VideoToolbox/VTUtilitiesTests.cs +++ b/tests/monotouch-test/VideoToolbox/VTUtilitiesTests.cs @@ -55,21 +55,13 @@ public void ToCGImageTest () var pxbuffer = new CVPixelBuffer (originalCGImage.Width, originalCGImage.Height, CVPixelFormatType.CV32ARGB, new CVPixelBufferAttributes { CGImageCompatibility = true, CGBitmapContextCompatibility = true }); -#if !XAMCORE_3_0 - pxbuffer.Lock (CVOptionFlags.None); -#else pxbuffer.Lock (CVPixelBufferLock.None); -#endif using (var colorSpace = CGColorSpace.CreateDeviceRGB ()) using (var ctx = new CGBitmapContext (pxbuffer.BaseAddress, originalCGImage.Width, originalCGImage.Height, 8, 4 * originalCGImage.Width, colorSpace, CGBitmapFlags.NoneSkipLast)) { ctx.RotateCTM (0); ctx.DrawImage (new CGRect (0, 0, originalCGImage.Width, originalCGImage.Height), originalCGImage); -#if !XAMCORE_3_0 - pxbuffer.Unlock (CVOptionFlags.None); -#else pxbuffer.Unlock (CVPixelBufferLock.None); -#endif } Assert.NotNull (pxbuffer, "VTUtilitiesTests.ToCGImageTest pxbuffer should not be null"); diff --git a/tests/templates/WatchContainer/Container.csproj b/tests/templates/WatchContainer/Container.csproj index 7a28c6740122..be21316fde9a 100644 --- a/tests/templates/WatchContainer/Container.csproj +++ b/tests/templates/WatchContainer/Container.csproj @@ -10,7 +10,7 @@ Resources Container obj\$(Platform)\$(Configuration)-watchos - XAMCORE_3_0; + PackageReference latest diff --git a/tests/xtro-sharpie/api-annotations-dotnet/common-SpriteKit.ignore b/tests/xtro-sharpie/api-annotations-dotnet/common-SpriteKit.ignore index a7eea7cfd4f3..0c3378bd1cf4 100644 --- a/tests/xtro-sharpie/api-annotations-dotnet/common-SpriteKit.ignore +++ b/tests/xtro-sharpie/api-annotations-dotnet/common-SpriteKit.ignore @@ -1,7 +1,7 @@ ## it's an internal that is called from a non-generated binding !incorrect-designated-initializer! SKWarpGeometryGrid::initWithColumns:rows:sourcePositions:destPositions: is not a constructor -## bad API signature, removed in XAMCORE_3_0 +## bad API signature, bound manually !extra-null-allowed! 'SpriteKit.SKShapeNode SpriteKit.SKShapeNode::FromPoints(CoreGraphics.CGPoint&,System.UIntPtr)' has a extraneous [NullAllowed] on parameter #0 !extra-null-allowed! 'SpriteKit.SKShapeNode SpriteKit.SKShapeNode::FromSplinePoints(CoreGraphics.CGPoint&,System.UIntPtr)' has a extraneous [NullAllowed] on parameter #0 From c2c617bf000c4ff864cbba9d65421f915941136b Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 24 Oct 2024 16:55:59 +0200 Subject: [PATCH 115/155] [devops] Don't checkout tags. (#21499) This should speed up the checkout step a little bit. Ref: https://github.com/xamarin/yaml-templates/pull/338. --- tools/devops/automation/templates/common/checkout.yml | 3 +++ tools/devops/automation/templates/loc-translations.yml | 1 + tools/devops/automation/templates/windows/reserve-mac.yml | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/tools/devops/automation/templates/common/checkout.yml b/tools/devops/automation/templates/common/checkout.yml index 961ccd305307..9213d39fd26c 100644 --- a/tools/devops/automation/templates/common/checkout.yml +++ b/tools/devops/automation/templates/common/checkout.yml @@ -21,6 +21,7 @@ steps: clean: true submodules: recursive path: s/xamarin-macios + fetchTags: false - pwsh: ./undo_github_merge.ps1 -SourceBranch "$(Build.SourceBranch)" -IsPr "${{ parameters.isPR }}" name: fix_commit @@ -32,9 +33,11 @@ steps: clean: true fetchDepth: 0 persistCredentials: true # hugely important, else there are some scripts that check a single file from maccore that will fail + fetchTags: false - checkout: yaml-templates clean: true + fetchTags: false - pwsh: ./clean_git_vsts.ps1 -GithubToken "$(GitHub.Token)" -MaccorePath "$(System.DefaultWorkingDirectory)/maccore" displayName: 'Clean git mess from VSTS' diff --git a/tools/devops/automation/templates/loc-translations.yml b/tools/devops/automation/templates/loc-translations.yml index 58dc6f056b7b..1a6b2ceaf41e 100644 --- a/tools/devops/automation/templates/loc-translations.yml +++ b/tools/devops/automation/templates/loc-translations.yml @@ -24,6 +24,7 @@ steps: clean: true submodules: recursive path: s/xamarin-macios + fetchTags: false - ${{ if parameters.isPR }}: - pwsh: | diff --git a/tools/devops/automation/templates/windows/reserve-mac.yml b/tools/devops/automation/templates/windows/reserve-mac.yml index 83ab5a98fb4a..1882594aaa0c 100644 --- a/tools/devops/automation/templates/windows/reserve-mac.yml +++ b/tools/devops/automation/templates/windows/reserve-mac.yml @@ -29,9 +29,13 @@ steps: commit: ${{ parameters.commit }} clean: true path: s/xamarin-macios + fetchTags: false - checkout: maccore + clean: true + fetchDepth: 0 persistCredentials: true # hugely important, else there are some scripts that check a single file from maccore that will fail + fetchTags: false - pwsh: '& "$Env:SYSTEM_DEFAULTWORKINGDIRECTORY/$($Env:BUILD_REPOSITORY_NAME.Split(''/'')[1])/tools/devops/automation/scripts/show_bot_info.ps1"' displayName: 'Show Bot Info' From 13b56f0bbe3baff8edbabaf8550a8e98a36c28b3 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Thu, 24 Oct 2024 16:40:16 -0400 Subject: [PATCH 116/155] [xcode16.1] Update TVServices all the way to Xcode 16.1 RC --- src/tvservices.cs | 4 ++++ tests/cecil-tests/Documentation.KnownFailures.txt | 1 + .../xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo | 1 - 3 files changed, 5 insertions(+), 1 deletion(-) delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo diff --git a/src/tvservices.cs b/src/tvservices.cs index 39facc15825b..c8debacb13f7 100644 --- a/src/tvservices.cs +++ b/src/tvservices.cs @@ -390,5 +390,9 @@ interface TVUserActivityType { [Field ("TVUserActivityTypeBrowsingChannelGuide")] NSString BrowsingChannelGuide { get; } + + [TV (18, 1)] + [Field ("TVUserActivityTypeBrowsingEntertainmentContent")] + NSString BrowsingEntertainmentContent { get; } } } diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index a4f7925d00af..75a5c9582e65 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -77026,6 +77026,7 @@ P:TVServices.TVTopShelfSectionedContent.Sections P:TVServices.TVTopShelfSectionedItem.ImageShape P:TVServices.TVTopShelfSectionedItem.PlaybackProgress P:TVServices.TVUserActivityType.BrowsingChannelGuide +P:TVServices.TVUserActivityType.BrowsingEntertainmentContent P:TVServices.TVUserManager.CurrentUserIdentifier P:TVServices.TVUserManager.CurrentUserIdentifierDidChangeNotification P:TVServices.TVUserManager.ShouldStorePreferencesForCurrentUser diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo deleted file mode 100644 index 5758ef88de70..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-TVServices.todo +++ /dev/null @@ -1 +0,0 @@ -!missing-field! TVUserActivityTypeBrowsingEntertainmentContent not bound From f610d76598ee683480098b3c47527db36719b3aa Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Thu, 24 Oct 2024 16:46:07 -0400 Subject: [PATCH 117/155] [xcode16.1] Update Intents all the way to Xcode 16.1 RC (#21515) --- src/intents.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/intents.cs b/src/intents.cs index 8fec14e7a42c..f4fed7017ce6 100644 --- a/src/intents.cs +++ b/src/intents.cs @@ -1459,11 +1459,29 @@ public enum INMessageType : long { DigitalTouch, Handwriting, Sticker, + [Deprecated (PlatformName.iOS, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use 'INMessageReaction' instead.")] TapbackLiked, + [Deprecated (PlatformName.iOS, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use 'INMessageReaction' instead.")] TapbackDisliked, + [Deprecated (PlatformName.iOS, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use 'INMessageReaction' instead.")] TapbackEmphasized, + [Deprecated (PlatformName.iOS, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use 'INMessageReaction' instead.")] TapbackLoved, + [Deprecated (PlatformName.iOS, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use 'INMessageReaction' instead.")] TapbackQuestioned, + [Deprecated (PlatformName.iOS, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.MacCatalyst, 18, 1, message: "Use 'INMessageReaction' instead.")] + [Deprecated (PlatformName.WatchOS, 11, 1, message: "Use 'INMessageReaction' instead.")] TapbackLaughed, MediaCalendar, MediaLocation, From 9caa2cf6bcf52d4cba0e50deaee3f1e99276e73c Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 25 Oct 2024 09:27:41 +0200 Subject: [PATCH 118/155] [dotnet] Port misc build/test logic to .NET. (#21497) More steps towards removing our build-time Mono dependency. --- src/Makefile.generator | 2 +- tests/Makefile | 4 +++- .../SimpleAppWithOldReferences/dotnet45assembly/Makefile | 2 +- .../dotnet45assembly/dotnet45assembly.csproj | 7 +++++++ tools/common/create-makefile-fragment.sh | 6 +++++- tools/mmp/Makefile | 1 + tools/mtouch/Makefile | 1 + 7 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/dotnet45assembly.csproj diff --git a/src/Makefile.generator b/src/Makefile.generator index 50f3353b9d12..f640bcee20c6 100644 --- a/src/Makefile.generator +++ b/src/Makefile.generator @@ -71,5 +71,5 @@ $(RSP_DIR)/dotnet/%-defines-dotnet.rsp: frameworks.sources Makefile.generator ge $(Q) mv $@.tmp $@ $(DOTNET_BUILD_DIR)/Xamarin.Apple.BindingAttributes.dll: bgen/Attributes.cs bgen/PlatformName.cs Makefile.generator | $(DOTNET_BUILD_DIR) - $(Q_DOTNET_BUILD) $(SYSTEM_CSC) $(DOTNET_FLAGS) -out:$@ bgen/Attributes.cs bgen/PlatformName.cs + $(Q_DOTNET_BUILD) $(DOTNET_CSC) $(DOTNET_FLAGS) -out:$@ bgen/Attributes.cs bgen/PlatformName.cs diff --git a/tests/Makefile b/tests/Makefile index 6b57f8b34d4f..e3a0ef28c1bc 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -203,8 +203,10 @@ $(TOP)/tools/common/SdkVersions.cs: $(TOP)/tools/common/SdkVersions.in.cs $(XHARNESS_EXECUTABLE): MSBUILD_EXE_PATH= $(XHARNESS_EXECUTABLE): $(xharness_dependencies) test.config test-system.config .stamp-src-project-files $(TOP)/tools/common/SdkVersions.cs $(Q_GEN) $(DOTNET) build "/bl:$@.binlog" $(MSBUILD_VERBOSITY_QUIET) xharness/xharness.csproj -xharness/xharness.csproj.inc: export BUILD_VERBOSITY=$(XBUILD_VERBOSITY) +xharness/xharness.csproj.inc: export BUILD_VERBOSITY=$(DOTNET_BUILD_VERBOSITY) xharness/xharness.csproj.inc: export ABSOLUTE_PATHS=1 +xharness/xharness.csproj.inc: export DOTNET:=$(DOTNET) +xharness/xharness.csproj.inc: export MSBUILD_EXE_PATH= -include xharness/xharness.csproj.inc killall: diff --git a/tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/Makefile b/tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/Makefile index 9188c3e964f0..b28595becb1e 100644 --- a/tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/Makefile +++ b/tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/Makefile @@ -3,6 +3,6 @@ TOP=../../../.. include $(TOP)/Make.config dotnet45assembly.dll: Library.cs - $(SYSTEM_CSC) -target:library -out:$@ $< + $(Q) $(DOTNET) build *.csproj $(DOTNET_BUILD_VERBOSITY) all-local:: dotnet45assembly.dll diff --git a/tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/dotnet45assembly.csproj b/tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/dotnet45assembly.csproj new file mode 100644 index 000000000000..c075e690613e --- /dev/null +++ b/tests/dotnet/SimpleAppWithOldReferences/dotnet45assembly/dotnet45assembly.csproj @@ -0,0 +1,7 @@ + + + net4.7.2 + . + false + + diff --git a/tools/common/create-makefile-fragment.sh b/tools/common/create-makefile-fragment.sh index 42bf3a7882f2..3b86f5b57491 100755 --- a/tools/common/create-makefile-fragment.sh +++ b/tools/common/create-makefile-fragment.sh @@ -34,7 +34,11 @@ if test -z "$FRAGMENT_PATH"; then fi if test -z "$BUILD_EXECUTABLE"; then - BUILD_EXECUTABLE=msbuild + if test -z "$DOTNET"; then + echo "The DOTNET environment variable isn't set to the location of the 'dotnet' executable" + exit 1 + fi + BUILD_EXECUTABLE="$DOTNET build" fi if test -z "$BUILD_VERBOSITY"; then diff --git a/tools/mmp/Makefile b/tools/mmp/Makefile index 5e0e31e53b67..88ef456ee43c 100644 --- a/tools/mmp/Makefile +++ b/tools/mmp/Makefile @@ -14,6 +14,7 @@ LOCAL_MMP_COMMAND=$(SYSTEM_MONO) --debug $(LOCAL_MMP) # mmp.csproj.inc contains the mmp_dependencies variable used to determine if mmp needs to be rebuilt or not. mmp.csproj.inc: export BUILD_VERBOSITY=$(MSBUILD_VERBOSITY) +mmp.csproj.inc: export DOTNET:=$(DOTNET) -include mmp.csproj.inc $(MMP_DIR)/mmp.exe: $(mmp_dependencies) diff --git a/tools/mtouch/Makefile b/tools/mtouch/Makefile index 80d83328ddab..b8b74f4ff913 100644 --- a/tools/mtouch/Makefile +++ b/tools/mtouch/Makefile @@ -233,6 +233,7 @@ DOTNET_PLATFORMS_MTOUCH=$(filter-out macOS,$(DOTNET_PLATFORMS)) # mtouch.csproj.inc contains the mtouch_dependencies variable used to determine if mtouch needs to be rebuilt or not. mtouch.csproj.inc: export BUILD_VERBOSITY=$(MSBUILD_VERBOSITY) +mtouch.csproj.inc: export DOTNET:=$(DOTNET) -include mtouch.csproj.inc $(MTOUCH_DIR)/mtouch.exe: $(mtouch_dependencies) From 201f02e0eeac33c0b7dbbbef8e160f8cd7229c3c Mon Sep 17 00:00:00 2001 From: Mauro Agnoletti Date: Fri, 25 Oct 2024 05:23:40 -0300 Subject: [PATCH 119/155] Update Xamarin.Messaging to 2.2.10 (#21521) Brings some important fixes on client and agent side to handle agent status notifications better Diff: https://github.com/xamarin/Xamarin.Messaging/compare/a3a1e00e5a89ec27bc9e19ddc596e2e63e3ac017..6b35d9de966802709767d61306917642ff72f622 --- msbuild/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msbuild/Directory.Build.props b/msbuild/Directory.Build.props index 65659347ff2a..328f0b3a5edd 100644 --- a/msbuild/Directory.Build.props +++ b/msbuild/Directory.Build.props @@ -15,7 +15,7 @@ https://dev.azure.com/azure-public/vside/_artifacts/feed/xamarin-impl/NuGet/Xamarin.Messaging.Client/ --> - [2.1.15] + [2.2.10] [1.1.7] From ecb83ced32a405f6708b2eaf6a033e7b5c48386a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:18:44 +0200 Subject: [PATCH 120/155] [main] Update dependencies from dotnet/sdk (#21513) This pull request updates the following dependencies ## From https://github.com/dotnet/sdk - **Subscription**: afa459aa-bd64-46cb-8138-9f6f795963d4 - **Build**: 20241023.41 - **Date Produced**: October 24, 2024 6:32:34 AM UTC - **Commit**: 61144bb03d670a06562fb761505a36b7cc837faf - **Branch**: refs/heads/release/9.0.1xx - **Updates**: - **Microsoft.NET.Sdk**: [from 9.0.100-rtm.24523.3 to 9.0.100-rtm.24523.41][1] [1]: https://github.com/dotnet/sdk/compare/ece1951b36...61144bb03d --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- global.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 927cb508a8b8..1b057bf7f574 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,8 +1,8 @@ - + https://github.com/dotnet/sdk - ece1951b3615a3f6d48cffc99ed66c06c1261ea1 + 61144bb03d670a06562fb761505a36b7cc837faf https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 4e74900f313e..6117aae1e105 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -2,7 +2,7 @@ - 9.0.100-rtm.24523.3 + 9.0.100-rtm.24523.41 9.0.0 9.0.0-alpha.1.23556.4 9.0.0-beta.24516.2 diff --git a/global.json b/global.json index ad29491b0068..972c7c0dca9a 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "9.0.100-rtm.24523.3" + "version": "9.0.100-rtm.24523.41" }, "tools": { - "dotnet": "9.0.100-rtm.24523.3" + "dotnet": "9.0.100-rtm.24523.41" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24516.2" From a80e2ce8c1b6995c2e03a8877a57e7f21e4b2f21 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Fri, 25 Oct 2024 07:18:23 -0400 Subject: [PATCH 121/155] [xcode16.1] Update UIKit all the way to Xcode 16.1 RC (#21522) --- src/UIKit/UIEnums.cs | 8 ++++++- src/uikit.cs | 23 +++++++++++++++++++ .../Documentation.KnownFailures.txt | 9 ++++++++ .../MacCatalyst-UIKit.todo | 7 ------ .../api-annotations-dotnet/iOS-UIKit.todo | 7 ------ .../api-annotations-dotnet/tvOS-UIKit.todo | 3 --- 6 files changed, 39 insertions(+), 18 deletions(-) delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo diff --git a/src/UIKit/UIEnums.cs b/src/UIKit/UIEnums.cs index 1d98f61689c9..2267f8c047fa 100644 --- a/src/UIKit/UIEnums.cs +++ b/src/UIKit/UIEnums.cs @@ -2146,6 +2146,10 @@ public enum UIPressType : long { [NoiOS] [NoMacCatalyst] PageDown = 31, + [TV (18, 1), NoiOS, NoMacCatalyst] + TVRemoteOneTwoThree = 32, + [TV (18, 1), NoiOS, NoMacCatalyst] + TVRemoteFourColors = 33, } [NoWatch] @@ -2833,7 +2837,9 @@ public enum UIMenuIdentifier { [TV (17, 0), iOS (17, 0), MacCatalyst (17, 0)] [Field ("UIMenuAutoFill")] AutoFill, - + [TV (18, 1), iOS (18, 1), MacCatalyst (18, 1)] + [Field ("UIMenuOpen")] + Open, } [iOS (13, 0), TV (13, 0), Watch (6, 0)] diff --git a/src/uikit.cs b/src/uikit.cs index f1d33b25bb51..48cd1b007f3b 100644 --- a/src/uikit.cs +++ b/src/uikit.cs @@ -31001,4 +31001,27 @@ interface NSUIViewToolbarItem { UIView UIView { get; [Bind ("setUIView:")] set; } } + [NoMac, NoWatch, NoTV, iOS (18, 1), MacCatalyst (18, 1)] + delegate IUITextInput UITextInputReturnHandler (); + + [NoMac, NoWatch, NoTV, iOS (18, 1), MacCatalyst (18, 1)] + [Category] + [BaseType (typeof (NSObject))] + interface NSObject_UIAccessibilityTextOperations { + + [return: NullAllowed] + [Export ("accessibilityTextInputResponder")] + IUITextInput GetAccessibilityTextInputResponder (); + + [Export ("setAccessibilityTextInputResponder:")] + void SetAccessibilityTextInputResponder ([NullAllowed] IUITextInput textInput); + + [return: NullAllowed] + [Export ("accessibilityTextInputResponderBlock")] + UITextInputReturnHandler GetAccessibilityTextInputResponderHandler (); + + [Export ("setAccessibilityTextInputResponderBlock:")] + void SetAccessibilityTextInputResponderHandler ([NullAllowed] UITextInputReturnHandler handler); + } + } diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 75a5c9582e65..c6ae6f2b9415 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -20330,6 +20330,7 @@ F:UIKit.UIMenuIdentifier.Lookup F:UIKit.UIMenuIdentifier.MinimizeAndZoom F:UIKit.UIMenuIdentifier.NewScene F:UIKit.UIMenuIdentifier.None +F:UIKit.UIMenuIdentifier.Open F:UIKit.UIMenuIdentifier.OpenRecent F:UIKit.UIMenuIdentifier.Preferences F:UIKit.UIMenuIdentifier.Print @@ -20481,6 +20482,8 @@ F:UIKit.UIPressType.PageUp F:UIKit.UIPressType.PlayPause F:UIKit.UIPressType.RightArrow F:UIKit.UIPressType.Select +F:UIKit.UIPressType.TVRemoteFourColors +F:UIKit.UIPressType.TVRemoteOneTwoThree F:UIKit.UIPressType.UpArrow F:UIKit.UIPreviewActionStyle.Default F:UIKit.UIPreviewActionStyle.Destructive @@ -49344,6 +49347,10 @@ M:UIKit.NSObject_UIAccessibilityTextNavigation.SetAccessibilityNextTextNavigatio M:UIKit.NSObject_UIAccessibilityTextNavigation.SetAccessibilityNextTextNavigationElementBlock(Foundation.NSObject,UIKit.AXObjectReturnBlock) M:UIKit.NSObject_UIAccessibilityTextNavigation.SetAccessibilityPreviousTextNavigationElement(Foundation.NSObject,Foundation.NSObject) M:UIKit.NSObject_UIAccessibilityTextNavigation.SetAccessibilityPreviousTextNavigationElementBlock(Foundation.NSObject,UIKit.AXObjectReturnBlock) +M:UIKit.NSObject_UIAccessibilityTextOperations.GetAccessibilityTextInputResponder(Foundation.NSObject) +M:UIKit.NSObject_UIAccessibilityTextOperations.GetAccessibilityTextInputResponderHandler(Foundation.NSObject) +M:UIKit.NSObject_UIAccessibilityTextOperations.SetAccessibilityTextInputResponder(Foundation.NSObject,UIKit.IUITextInput) +M:UIKit.NSObject_UIAccessibilityTextOperations.SetAccessibilityTextInputResponderHandler(Foundation.NSObject,UIKit.UITextInputReturnHandler) M:UIKit.NSParagraphStyle.Copy(Foundation.NSZone) M:UIKit.NSParagraphStyle.EncodeTo(Foundation.NSCoder) M:UIKit.NSParagraphStyle.MutableCopy(Foundation.NSZone) @@ -86292,6 +86299,7 @@ T:UIKit.NSMutableAttributedStringKitAdditions T:UIKit.NSObject_UIAccessibilityCustomRotor T:UIKit.NSObject_UIAccessibilityHitTest T:UIKit.NSObject_UIAccessibilityTextNavigation +T:UIKit.NSObject_UIAccessibilityTextOperations T:UIKit.NSPreviewInteractionPreviewUpdateEventArgs T:UIKit.NSRectAlignment T:UIKit.NSStringDrawing @@ -86768,6 +86776,7 @@ T:UIKit.UITextFormattingViewControllerTextList T:UIKit.UITextGranularity T:UIKit.UITextInlinePredictionType T:UIKit.UITextInputDelegate +T:UIKit.UITextInputReturnHandler T:UIKit.UITextInputTokenizer T:UIKit.UITextInteractionDelegate T:UIKit.UITextInteractionMode diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo deleted file mode 100644 index 59b0d796c122..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-UIKit.todo +++ /dev/null @@ -1,7 +0,0 @@ -!missing-enum-value! UIPressType native value UIPressTypeTVRemoteFourColors = 33 not bound -!missing-enum-value! UIPressType native value UIPressTypeTVRemoteOneTwoThree = 32 not bound -!missing-field! UIMenuOpen not bound -!missing-selector! NSObject::accessibilityTextInputResponder not bound -!missing-selector! NSObject::accessibilityTextInputResponderBlock not bound -!missing-selector! NSObject::setAccessibilityTextInputResponder: not bound -!missing-selector! NSObject::setAccessibilityTextInputResponderBlock: not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo deleted file mode 100644 index 59b0d796c122..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-UIKit.todo +++ /dev/null @@ -1,7 +0,0 @@ -!missing-enum-value! UIPressType native value UIPressTypeTVRemoteFourColors = 33 not bound -!missing-enum-value! UIPressType native value UIPressTypeTVRemoteOneTwoThree = 32 not bound -!missing-field! UIMenuOpen not bound -!missing-selector! NSObject::accessibilityTextInputResponder not bound -!missing-selector! NSObject::accessibilityTextInputResponderBlock not bound -!missing-selector! NSObject::setAccessibilityTextInputResponder: not bound -!missing-selector! NSObject::setAccessibilityTextInputResponderBlock: not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo deleted file mode 100644 index acc0c342e623..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-UIKit.todo +++ /dev/null @@ -1,3 +0,0 @@ -!missing-enum-value! UIPressType native value UIPressTypeTVRemoteFourColors = 33 not bound -!missing-enum-value! UIPressType native value UIPressTypeTVRemoteOneTwoThree = 32 not bound -!missing-field! UIMenuOpen not bound From ab54538c7e382670af9847ef116d4e2a05dd6c66 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Fri, 25 Oct 2024 07:18:44 -0400 Subject: [PATCH 122/155] [xcode16.1] Update TVServices all the way to Xcode 16.1 RC (#21520) From ae9a1ed767f5dfd3094f7e7a844c5853a6505dd4 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Fri, 25 Oct 2024 07:19:11 -0400 Subject: [PATCH 123/155] [xcode16.1] Update PencilKit all the way to Xcode 16.1 RC (#21519) Co-authored-by: GitHub Actions Autoformatter --- src/pencilkit.cs | 4 ++++ tests/cecil-tests/Documentation.KnownFailures.txt | 3 +++ tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo | 1 - 3 files changed, 7 insertions(+), 1 deletion(-) delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo diff --git a/src/pencilkit.cs b/src/pencilkit.cs index f0a5f3f81dce..37c9a4b6e4f8 100644 --- a/src/pencilkit.cs +++ b/src/pencilkit.cs @@ -120,6 +120,10 @@ interface PKCanvasViewDelegate : UIScrollViewDelegate { [Export ("canvasViewDidEndUsingTool:")] void EndUsingTool (PKCanvasView canvasView); + + [iOS (18, 1), NoMacCatalyst] + [Export ("canvasView:didRefineStrokes:withNewStrokes:")] + void DidRefineStrokes (PKCanvasView canvasView, PKStroke [] strokes, PKStroke [] newStrokes); } interface IPKCanvasViewDelegate { } diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index c6ae6f2b9415..68da533553a8 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -45766,6 +45766,7 @@ M:PdfKit.PdfViewDelegate.WillClickOnLink(PdfKit.PdfView,Foundation.NSUrl) M:PdfKit.PdfViewUrlEventArgs.#ctor(Foundation.NSUrl) M:PencilKit.IPKCanvasViewDelegate.DidBeginUsingTool(PencilKit.PKCanvasView) M:PencilKit.IPKCanvasViewDelegate.DidFinishRendering(PencilKit.PKCanvasView) +M:PencilKit.IPKCanvasViewDelegate.DidRefineStrokes(PencilKit.PKCanvasView,PencilKit.PKStroke[],PencilKit.PKStroke[]) M:PencilKit.IPKCanvasViewDelegate.DrawingDidChange(PencilKit.PKCanvasView) M:PencilKit.IPKCanvasViewDelegate.EndUsingTool(PencilKit.PKCanvasView) M:PencilKit.IPKToolPickerObserver.FramesObscuredDidChange(PencilKit.PKToolPicker) @@ -45781,6 +45782,7 @@ M:PencilKit.PKCanvasView.SelectedToolItemDidChange(PencilKit.PKToolPicker) M:PencilKit.PKCanvasView.VisibilityDidChange(PencilKit.PKToolPicker) M:PencilKit.PKCanvasViewDelegate_Extensions.DidBeginUsingTool(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate_Extensions.DidFinishRendering(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) +M:PencilKit.PKCanvasViewDelegate_Extensions.DidRefineStrokes(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView,PencilKit.PKStroke[],PencilKit.PKStroke[]) M:PencilKit.PKCanvasViewDelegate_Extensions.DrawingDidChange(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate_Extensions.EndUsingTool(PencilKit.IPKCanvasViewDelegate,PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate.DecelerationEnded(UIKit.UIScrollView) @@ -45788,6 +45790,7 @@ M:PencilKit.PKCanvasViewDelegate.DecelerationStarted(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.DidBeginUsingTool(PencilKit.PKCanvasView) M:PencilKit.PKCanvasViewDelegate.DidChangeAdjustedContentInset(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.DidFinishRendering(PencilKit.PKCanvasView) +M:PencilKit.PKCanvasViewDelegate.DidRefineStrokes(PencilKit.PKCanvasView,PencilKit.PKStroke[],PencilKit.PKStroke[]) M:PencilKit.PKCanvasViewDelegate.DidZoom(UIKit.UIScrollView) M:PencilKit.PKCanvasViewDelegate.DraggingEnded(UIKit.UIScrollView,System.Boolean) M:PencilKit.PKCanvasViewDelegate.DraggingStarted(UIKit.UIScrollView) diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo deleted file mode 100644 index 34d8fbc559ed..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-PencilKit.todo +++ /dev/null @@ -1 +0,0 @@ -!missing-protocol-member! PKCanvasViewDelegate::canvasView:didRefineStrokes:withNewStrokes: not found From 0c21018d8f667388f82bbf66b763ac9188a4ff0d Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Sat, 26 Oct 2024 07:10:22 -0400 Subject: [PATCH 124/155] [xcode16.1] Update NetworkExtension all the way to Xcode 16.1 RC (#21518) --- src/NetworkExtension/NEEnums.cs | 4 +++- tests/cecil-tests/Documentation.KnownFailures.txt | 1 + .../api-annotations-dotnet/MacCatalyst-NetworkExtension.todo | 1 - .../api-annotations-dotnet/iOS-NetworkExtension.todo | 1 - .../api-annotations-dotnet/macOS-NetworkExtension.todo | 1 - .../api-annotations-dotnet/tvOS-NetworkExtension.todo | 1 - 6 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo diff --git a/src/NetworkExtension/NEEnums.cs b/src/NetworkExtension/NEEnums.cs index 5f4ffffce95f..dc6090928706 100644 --- a/src/NetworkExtension/NEEnums.cs +++ b/src/NetworkExtension/NEEnums.cs @@ -208,7 +208,9 @@ public enum NEProviderStopReason : long { Sleep = 15, [iOS (13, 0)] [MacCatalyst (13, 1)] - AppUpdate, + AppUpdate = 16, + [iOS (18, 1), MacCatalyst (18, 1), TV (18, 1), Mac (15, 1)] + InternalError = 17, } [Deprecated (PlatformName.iOS, 18, 0, message: "Use 'Network.NWPathStatus' instead.")] diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index 68da533553a8..d2cd8c9a4f5e 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -16178,6 +16178,7 @@ F:NetworkExtension.NEProviderStopReason.ConfigurationFailed F:NetworkExtension.NEProviderStopReason.ConfigurationRemoved F:NetworkExtension.NEProviderStopReason.ConnectionFailed F:NetworkExtension.NEProviderStopReason.IdleTimeout +F:NetworkExtension.NEProviderStopReason.InternalError F:NetworkExtension.NEProviderStopReason.None F:NetworkExtension.NEProviderStopReason.NoNetworkAvailable F:NetworkExtension.NEProviderStopReason.ProviderDisabled diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo deleted file mode 100644 index 1d2d71785638..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-NetworkExtension.todo +++ /dev/null @@ -1 +0,0 @@ -!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo deleted file mode 100644 index 1d2d71785638..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-NetworkExtension.todo +++ /dev/null @@ -1 +0,0 @@ -!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo deleted file mode 100644 index 1d2d71785638..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/macOS-NetworkExtension.todo +++ /dev/null @@ -1 +0,0 @@ -!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo deleted file mode 100644 index 1d2d71785638..000000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-NetworkExtension.todo +++ /dev/null @@ -1 +0,0 @@ -!missing-enum-value! NEProviderStopReason native value NEProviderStopReasonInternalError = 17 not bound From 5f69e3cd14f4dccd7f8df41fe3f227d584db0aa0 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 28 Oct 2024 08:57:30 +0100 Subject: [PATCH 125/155] [devops] Fix link to step logs. (#21529) --- tools/devops/automation/scripts/System.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/devops/automation/scripts/System.psm1 b/tools/devops/automation/scripts/System.psm1 index 5b67f2f7a4f2..d9bad3e0258c 100644 --- a/tools/devops/automation/scripts/System.psm1 +++ b/tools/devops/automation/scripts/System.psm1 @@ -251,7 +251,7 @@ function Assert-HDFreeSpace { Write-Host "" - $stepUrl = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/results?buildId=$Env:BUILD_BUILDID&view=logs&j=$Env:SYSTEM_JOBIDENTIFIER&t=$Env:SYSTEM_TASKINSTANCEID" + $stepUrl = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_build/results?buildId=$Env:BUILD_BUILDID&view=logs&j=$Env:SYSTEM_JOBID&t=$Env:SYSTEM_TASKINSTANCEID" $workItemTitle = "[CI] Bot '$Env:AGENT_MACHINENAME' out of disk space" $workItemMessage = @"
    The bot $Env:AGENT_MACHINENAME does not have enough hard disk space left.
    From 62bea9dc76123b5c866abb3b114f75e821e96936 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 28 Oct 2024 09:08:59 +0100 Subject: [PATCH 126/155] [devops] Clean up bots better from previous usage. (#21523) * Find all git repositories in the default working directory, for both multi-repo checkouts and single-repo checkouts, and clean them all. * Completely remove the 'packages' directory before putting any other files in it. --- .../automation/scripts/bash/build-nugets.sh | 2 +- .../automation/scripts/bash/clean-bot.sh | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/tools/devops/automation/scripts/bash/build-nugets.sh b/tools/devops/automation/scripts/bash/build-nugets.sh index 8f469722b4dd..b133aa2da864 100755 --- a/tools/devops/automation/scripts/bash/build-nugets.sh +++ b/tools/devops/automation/scripts/bash/build-nugets.sh @@ -10,8 +10,8 @@ cd "$XAM_TOP" DOTNET_NUPKG_DIR=$(make -C tools/devops print-abspath-variable VARIABLE=DOTNET_NUPKG_DIR | grep "^DOTNET_NUPKG_DIR=" | sed -e 's/^DOTNET_NUPKG_DIR=//') +rm -rf ../package/ mkdir -p ../package/ -rm -f ../package/*.nupkg cp -c "$DOTNET_NUPKG_DIR"/*.nupkg ../package/ cp -c "$DOTNET_NUPKG_DIR"/vs-workload.props ../package/ cp -c dotnet/Workloads/SignList.xml ../package/ diff --git a/tools/devops/automation/scripts/bash/clean-bot.sh b/tools/devops/automation/scripts/bash/clean-bot.sh index c48e4d5895f7..07e0adc41bb7 100755 --- a/tools/devops/automation/scripts/bash/clean-bot.sh +++ b/tools/devops/automation/scripts/bash/clean-bot.sh @@ -14,11 +14,27 @@ set +e # Clean workspace ( - REPO_PATH="SYSTEM_DEFAULTWORKINGDIRECTORY/$(basename "$BUILD_REPOSITORY_NAME")" - if test -d "$REPO_PATH"; then - cd "$REPO_PATH" - git clean -xfd - fi + for repo in "$SYSTEM_DEFAULTWORKINGDIRECTORY"/.git "$SYSTEM_DEFAULTWORKINGDIRECTORY"/*/.git; do + if test -d "$repo"; then + cd "$repo" + cd .. + echo "Running 'git clean' (for all submodules too) in $(pwd)" + git clean -xffd | sed 's/^/ /' || true + git submodule foreach --recursive git clean -xffd | sed 's/^/ /' || true + else + echo "$repo is not a git repository" + fi + done + + echo "Cleaning packages directory:" + rm -rv "$SYSTEM_DEFAULTWORKINGDIRECTORY/packages" | sed 's/^/ /' || true + + echo "Contents of SYSTEM_DEFAULTWORKINGDIRECTORY ($SYSTEM_DEFAULTWORKINGDIRECTORY):" + # shellcheck disable=SC2012 + ls -la "$SYSTEM_DEFAULTWORKINGDIRECTORY" | sed 's/^/ /' || true + echo "Contents of BUILD_SOURCESDIRECTORY ($BUILD_SOURCESDIRECTORY):" + # shellcheck disable=SC2012 + ls -la "$BUILD_SOURCESDIRECTORY" | sed 's/^/ /' || true ) # Delete all the simulator devices. These can take up a lot of space over time (I've seen 100+GB on the bots) From 94526bc7bc0daa1549b5da5d04b8859a7d973fda Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 28 Oct 2024 09:09:29 +0100 Subject: [PATCH 127/155] [msbuild] Fix an incremental build issue with resources in universal apps. (#21516) For universal apps, we compile as many resources as we can in the outer (universal) build, and then pass a path to a temporary file with a list of those compiled resources to the inner (rid-specific) builds, so that the inner builds can skip them. We have to delete this temporary file after the inner builds have completed, otherwise they may interfere with subsequent builds if the set of resources has changed. However, this revealed another issue with incremental builds: we still need to write out this temporary file even if the outer build won't compile the resources because they were compiled in a previous build, otherwise the inner builds would unnecessarily compile those resources. An upcoming test for a new feature found this issue, so I'm not adding a test. --- dotnet/targets/Xamarin.Shared.Sdk.targets | 3 + msbuild/Xamarin.Shared/Xamarin.Shared.targets | 67 +++++++++++++++++-- 2 files changed, 63 insertions(+), 7 deletions(-) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index 37a4fe423f1b..f7329f9b6ba1 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -424,6 +424,9 @@ <_AssemblyPublishInputs Include="@(_AssemblyPublishDirectories -> '%(Identity)/**')" />
    + + + @@ -814,11 +815,17 @@ Copyright (C) 2018 Microsoft. All rights reserved. - - + + + + + + + + @@ -836,6 +843,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. _BeforeCoreCompileImageAssets; _ReadCompileImageAssets; _CoreCompileImageAssets; + _PostCompileImageAssets; @@ -938,10 +946,16 @@ Copyright (C) 2018 Microsoft. All rights reserved. + + + + + + + - @@ -958,6 +972,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. _BeforeCoreCompileSceneKitAssets; _ReadCoreCompileSceneKitAssets; _CoreCompileSceneKitAssets; + _PostCompileSceneKitAssets; @@ -1024,10 +1039,16 @@ Copyright (C) 2018 Microsoft. All rights reserved. + + + + + + + - @@ -1041,6 +1062,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. _BeforeCoreCompileColladaAssets; _ReadCoreCompileColladaAssets; _CoreCompileColladaAssets; + _PostCompileColladaAssets; @@ -1107,10 +1129,16 @@ Copyright (C) 2018 Microsoft. All rights reserved. + + + + + + + - @@ -1181,6 +1209,18 @@ Copyright (C) 2018 Microsoft. All rights reserved. <_CompiledEntitlementsPath Condition="'$(_CompiledEntitlementsPath)' == ''">$(DeviceSpecificIntermediateOutputPath)Entitlements.xcent <_SaveProcessedItems Condition="'$(RuntimeIdentifiers)' != '' And '$(UsingAppleNETSdk)' == 'true'">true + + + + <_ProcessedPaths Include="$(_ProcessedBundleResourcesPath)" /> + <_ProcessedPaths Include="$(_ProcessedContentPath)" /> + <_ProcessedPaths Include="$(_ProcessedImageAssetsPath)" /> + <_ProcessedPaths Include="$(_ProcessedInterfaceDefinitionsPath)" /> + <_ProcessedPaths Include="$(_ProcessedSceneKitAssetsPath)" /> + <_ProcessedPaths Include="$(_ProcessedColladaAssetsPath)" /> + <_ProcessedPaths Include="$(_ProcessedTextureAtlasesPath)" /> + <_ProcessedPaths Include="$(_ProcessedCoreMLModelsPath)" /> + @@ -1233,6 +1273,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. _BeforeCompileTextureAtlases; _ReadCoreCompileTextureAtlases; _CoreCompileTextureAtlases; + _PostCompileTextureAtlases; @@ -1296,10 +1337,16 @@ Copyright (C) 2018 Microsoft. All rights reserved. + + + + + + + - @@ -1391,10 +1438,16 @@ Copyright (C) 2018 Microsoft. All rights reserved. + + + + + + + - From 3565119e8ec8c87f90428662a64284fa6117e7c1 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 28 Oct 2024 15:28:48 +0100 Subject: [PATCH 128/155] [devops] Escape quotes when searching for work items using title. (#21534) This makes the code to find existing work items for a given title actually work. --- tools/devops/automation/scripts/VSTS.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/devops/automation/scripts/VSTS.psm1 b/tools/devops/automation/scripts/VSTS.psm1 index b3d47a652f5b..65ae59197f46 100644 --- a/tools/devops/automation/scripts/VSTS.psm1 +++ b/tools/devops/automation/scripts/VSTS.psm1 @@ -903,8 +903,9 @@ function Find-AzureDevOpsWorkItemWithTitle { $headers = Get-AuthHeader -AccessToken $Env:ACCESSTOKEN $url = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_apis/wit/wiql?api-version=7.1" + $escapedTitle = $Title.Replace("'", "''") $payload = @{ - "query" = "Select [System.Id] FROM WorkItems WHERE [System.State] = 'Active' AND [System.Title] = '$Title' AND [System.WorkItemType] = '$WorkItemType' AND [System.AreaPath] UNDER '$AreaPath'" + "query" = "Select [System.Id] FROM WorkItems WHERE [System.State] = 'Active' AND [System.Title] = '$escapedTitle' AND [System.WorkItemType] = '$WorkItemType' AND [System.AreaPath] UNDER '$AreaPath'" } $body = ConvertTo-Json $payload -Depth 100 From 3ac70f74fb208cef196f9b2ea7c0cfff00a0ddcc Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 28 Oct 2024 15:28:57 +0100 Subject: [PATCH 129/155] [tests] Improve the AssetsTest test. (#21532) * Remove test cases for 32-bit arm, which we don't support anymore. * Use test-level test cases instead of fixture-level test cases, because the fixture-level test cases are all rendered identically in both the console output and the html report, making it impossible to figure out which variation failed when something goes wrong. * Add new assets related to app icons. * Update according to new test project assets. * Ask 'assetutil` to write the output we care about to a file, that way we don't have to take random stdout output into account. * Simplify how the test asserts asset catalog contents to include all assets, not just a selection of them. Note: might be easier to review commit-by-commit, because there's a lot of new assets and I'm adding them in a separate commit. --- .../Contents.json | 74 +++++ .../AlternateAppIcons.appiconset/Icon1024.png | Bin 0 -> 67534 bytes .../AlternateAppIcons.appiconset/Icon128.png | Bin 0 -> 7201 bytes .../AlternateAppIcons.appiconset/Icon16.png | Bin 0 -> 1190 bytes .../AlternateAppIcons.appiconset/Icon256.png | Bin 0 -> 16859 bytes .../AlternateAppIcons.appiconset/Icon32.png | Bin 0 -> 1904 bytes .../AlternateAppIcons.appiconset/Icon512.png | Bin 0 -> 39702 bytes .../AlternateAppIcons.appiconset/Icon64.png | Bin 0 -> 3636 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon-AppStore.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-green-1920x720.png | Bin 0 -> 101704 bytes .../Icon-green-3840x1440.png | Bin 0 -> 294192 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-green-2320x720.png | Bin 0 -> 116884 bytes .../Icon-green-4640x1440.png | Bin 0 -> 340507 bytes .../AppIcons.appiconset/Contents.json | 74 +++++ .../AppIcons.appiconset/Icon1024.png | Bin 0 -> 70429 bytes .../AppIcons.appiconset/Icon128.png | Bin 0 -> 6347 bytes .../AppIcons.appiconset/Icon16.png | Bin 0 -> 1263 bytes .../AppIcons.appiconset/Icon256.png | Bin 0 -> 15521 bytes .../AppIcons.appiconset/Icon32.png | Bin 0 -> 1556 bytes .../AppIcons.appiconset/Icon512.png | Bin 0 -> 34732 bytes .../AppIcons.appiconset/Icon64.png | Bin 0 -> 3107 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon-AppStore.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../BrandAssets.brandassets/Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-blue-1920x720.png | Bin 0 -> 104014 bytes .../Icon-blue-3840x1440.png | Bin 0 -> 351834 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-blue-2320x720.png | Bin 0 -> 120691 bytes .../Icon-blue-4640x1440.png | Bin 0 -> 407270 bytes .../iOSLaunchImage.launchimage/Contents.json | 270 +++++++++++++++++ .../Icon1024x748.png | Bin 0 -> 32688 bytes .../Icon1024x768.png | Bin 0 -> 33326 bytes .../Icon1125x2436.png | Bin 0 -> 89069 bytes .../Icon1242x2208.png | Bin 0 -> 89434 bytes .../Icon1242x2688.png | Bin 0 -> 103965 bytes .../Icon1536x2008.png | Bin 0 -> 98353 bytes .../Icon1536x2048.png | Bin 0 -> 99041 bytes .../Icon1668x2224.png | Bin 0 -> 115190 bytes .../Icon1668x2388.png | Bin 0 -> 121855 bytes .../Icon1792x828.png | Bin 0 -> 55975 bytes .../Icon2048x1496.png | Bin 0 -> 100476 bytes .../Icon2048x1536.png | Bin 0 -> 101677 bytes .../Icon2048x2732.png | Bin 0 -> 159514 bytes .../Icon2208x1242.png | Bin 0 -> 91985 bytes .../Icon2224x1668.png | Bin 0 -> 118212 bytes .../Icon2388x1668.png | Bin 0 -> 125030 bytes .../Icon2436x1125.png | Bin 0 -> 91608 bytes .../Icon2688x1242.png | Bin 0 -> 107007 bytes .../Icon2732x2048.png | Bin 0 -> 165756 bytes .../Icon320x480.png | Bin 0 -> 12915 bytes .../Icon640x1136.png | Bin 0 -> 34693 bytes .../Icon640x960.png | Bin 0 -> 30687 bytes .../Icon750x1334.png | Bin 0 -> 43302 bytes .../Icon768x1004.png | Bin 0 -> 34664 bytes .../Icon768x1024.png | Bin 0 -> 34232 bytes .../Icon828x1792.png | Bin 0 -> 57881 bytes .../tvOSLaunchImage.launchimage/Contents.json | 24 ++ .../Icon1920x1080.png | Bin 0 -> 74343 bytes .../Icon3840x2160.png | Bin 0 -> 223720 bytes .../Contents.json | 74 +++++ .../AlternateAppIcons.appiconset/Icon1024.png | Bin 0 -> 67534 bytes .../AlternateAppIcons.appiconset/Icon128.png | Bin 0 -> 7201 bytes .../AlternateAppIcons.appiconset/Icon16.png | Bin 0 -> 1190 bytes .../AlternateAppIcons.appiconset/Icon256.png | Bin 0 -> 16859 bytes .../AlternateAppIcons.appiconset/Icon32.png | Bin 0 -> 1904 bytes .../AlternateAppIcons.appiconset/Icon512.png | Bin 0 -> 39702 bytes .../AlternateAppIcons.appiconset/Icon64.png | Bin 0 -> 3636 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon-AppStore.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-green-1920x720.png | Bin 0 -> 101704 bytes .../Icon-green-3840x1440.png | Bin 0 -> 294192 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-green-2320x720.png | Bin 0 -> 116884 bytes .../Icon-green-4640x1440.png | Bin 0 -> 340507 bytes .../AppIcons.appiconset/Contents.json | 74 +++++ .../AppIcons.appiconset/Icon1024.png | Bin 0 -> 70429 bytes .../AppIcons.appiconset/Icon128.png | Bin 0 -> 6347 bytes .../AppIcons.appiconset/Icon16.png | Bin 0 -> 1263 bytes .../AppIcons.appiconset/Icon256.png | Bin 0 -> 15521 bytes .../AppIcons.appiconset/Icon32.png | Bin 0 -> 1556 bytes .../AppIcons.appiconset/Icon512.png | Bin 0 -> 34732 bytes .../AppIcons.appiconset/Icon64.png | Bin 0 -> 3107 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon-AppStore.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../BrandAssets.brandassets/Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-blue-1920x720.png | Bin 0 -> 104014 bytes .../Icon-blue-3840x1440.png | Bin 0 -> 351834 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-blue-2320x720.png | Bin 0 -> 120691 bytes .../Icon-blue-4640x1440.png | Bin 0 -> 407270 bytes .../iOSLaunchImage.launchimage/Contents.json | 270 +++++++++++++++++ .../Icon1024x748.png | Bin 0 -> 32688 bytes .../Icon1024x768.png | Bin 0 -> 33326 bytes .../Icon1125x2436.png | Bin 0 -> 89069 bytes .../Icon1242x2208.png | Bin 0 -> 89434 bytes .../Icon1242x2688.png | Bin 0 -> 103965 bytes .../Icon1536x2008.png | Bin 0 -> 98353 bytes .../Icon1536x2048.png | Bin 0 -> 99041 bytes .../Icon1668x2224.png | Bin 0 -> 115190 bytes .../Icon1668x2388.png | Bin 0 -> 121855 bytes .../Icon1792x828.png | Bin 0 -> 55975 bytes .../Icon2048x1496.png | Bin 0 -> 100476 bytes .../Icon2048x1536.png | Bin 0 -> 101677 bytes .../Icon2048x2732.png | Bin 0 -> 159514 bytes .../Icon2208x1242.png | Bin 0 -> 91985 bytes .../Icon2224x1668.png | Bin 0 -> 118212 bytes .../Icon2388x1668.png | Bin 0 -> 125030 bytes .../Icon2436x1125.png | Bin 0 -> 91608 bytes .../Icon2688x1242.png | Bin 0 -> 107007 bytes .../Icon2732x2048.png | Bin 0 -> 165756 bytes .../Icon320x480.png | Bin 0 -> 12915 bytes .../Icon640x1136.png | Bin 0 -> 34693 bytes .../Icon640x960.png | Bin 0 -> 30687 bytes .../Icon750x1334.png | Bin 0 -> 43302 bytes .../Icon768x1004.png | Bin 0 -> 34664 bytes .../Icon768x1024.png | Bin 0 -> 34232 bytes .../Icon828x1792.png | Bin 0 -> 57881 bytes .../tvOSLaunchImage.launchimage/Contents.json | 24 ++ .../Icon1920x1080.png | Bin 0 -> 74343 bytes .../Icon3840x2160.png | Bin 0 -> 223720 bytes .../Contents.json | 74 +++++ .../AlternateAppIcons.appiconset/Icon1024.png | Bin 0 -> 67534 bytes .../AlternateAppIcons.appiconset/Icon128.png | Bin 0 -> 7201 bytes .../AlternateAppIcons.appiconset/Icon16.png | Bin 0 -> 1190 bytes .../AlternateAppIcons.appiconset/Icon256.png | Bin 0 -> 16859 bytes .../AlternateAppIcons.appiconset/Icon32.png | Bin 0 -> 1904 bytes .../AlternateAppIcons.appiconset/Icon512.png | Bin 0 -> 39702 bytes .../AlternateAppIcons.appiconset/Icon64.png | Bin 0 -> 3636 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon-AppStore.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon1280x768.png | Bin 0 -> 79481 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon400x240 1.png | Bin 0 -> 22054 bytes .../Content.imageset/Icon400x240.png | Bin 0 -> 22054 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-green-1920x720.png | Bin 0 -> 101704 bytes .../Icon-green-3840x1440.png | Bin 0 -> 294192 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-green-2320x720.png | Bin 0 -> 116884 bytes .../Icon-green-4640x1440.png | Bin 0 -> 340507 bytes .../AppIcons.appiconset/Contents.json | 74 +++++ .../AppIcons.appiconset/Icon1024.png | Bin 0 -> 70429 bytes .../AppIcons.appiconset/Icon128.png | Bin 0 -> 6347 bytes .../AppIcons.appiconset/Icon16.png | Bin 0 -> 1263 bytes .../AppIcons.appiconset/Icon256.png | Bin 0 -> 15521 bytes .../AppIcons.appiconset/Icon32.png | Bin 0 -> 1556 bytes .../AppIcons.appiconset/Icon512.png | Bin 0 -> 34732 bytes .../AppIcons.appiconset/Icon64.png | Bin 0 -> 3107 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon-AppStore.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcon.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon240x400 1.png | Bin 0 -> 20204 bytes .../Content.imageset/Icon240x400.png | Bin 0 -> 20204 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../BrandAssets.brandassets/Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-blue-1920x720.png | Bin 0 -> 104014 bytes .../Icon-blue-3840x1440.png | Bin 0 -> 351834 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-blue-2320x720.png | Bin 0 -> 120691 bytes .../Icon-blue-4640x1440.png | Bin 0 -> 407270 bytes .../iOSLaunchImage.launchimage/Contents.json | 270 +++++++++++++++++ .../Icon1024x748.png | Bin 0 -> 32688 bytes .../Icon1024x768.png | Bin 0 -> 33326 bytes .../Icon1125x2436.png | Bin 0 -> 89069 bytes .../Icon1242x2208.png | Bin 0 -> 89434 bytes .../Icon1242x2688.png | Bin 0 -> 103965 bytes .../Icon1536x2008.png | Bin 0 -> 98353 bytes .../Icon1536x2048.png | Bin 0 -> 99041 bytes .../Icon1668x2224.png | Bin 0 -> 115190 bytes .../Icon1668x2388.png | Bin 0 -> 121855 bytes .../Icon1792x828.png | Bin 0 -> 55975 bytes .../Icon2048x1496.png | Bin 0 -> 100476 bytes .../Icon2048x1536.png | Bin 0 -> 101677 bytes .../Icon2048x2732.png | Bin 0 -> 159514 bytes .../Icon2208x1242.png | Bin 0 -> 91985 bytes .../Icon2224x1668.png | Bin 0 -> 118212 bytes .../Icon2388x1668.png | Bin 0 -> 125030 bytes .../Icon2436x1125.png | Bin 0 -> 91608 bytes .../Icon2688x1242.png | Bin 0 -> 107007 bytes .../Icon2732x2048.png | Bin 0 -> 165756 bytes .../Icon320x480.png | Bin 0 -> 12915 bytes .../Icon640x1136.png | Bin 0 -> 34693 bytes .../Icon640x960.png | Bin 0 -> 30687 bytes .../Icon750x1334.png | Bin 0 -> 43302 bytes .../Icon768x1004.png | Bin 0 -> 34664 bytes .../Icon768x1024.png | Bin 0 -> 34232 bytes .../Icon828x1792.png | Bin 0 -> 57881 bytes .../tvOSLaunchImage.launchimage/Contents.json | 24 ++ .../Icon1920x1080.png | Bin 0 -> 74343 bytes .../Icon3840x2160.png | Bin 0 -> 223720 bytes .../Contents.json | 74 +++++ .../AlternateAppIcons.appiconset/Icon1024.png | Bin 0 -> 67534 bytes .../AlternateAppIcons.appiconset/Icon128.png | Bin 0 -> 7201 bytes .../AlternateAppIcons.appiconset/Icon16.png | Bin 0 -> 1190 bytes .../AlternateAppIcons.appiconset/Icon256.png | Bin 0 -> 16859 bytes .../AlternateAppIcons.appiconset/Icon32.png | Bin 0 -> 1904 bytes .../AlternateAppIcons.appiconset/Icon512.png | Bin 0 -> 39702 bytes .../AlternateAppIcons.appiconset/Icon64.png | Bin 0 -> 3636 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-green-1280x768.png | Bin 0 -> 79481 bytes .../Back.imagestacklayer/Contents.json | 6 + .../Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-green-1280x768.png | Bin 0 -> 79481 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-green-1280x768.png | Bin 0 -> 79481 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon-green-400x240.png | Bin 0 -> 22054 bytes .../Back.imagestacklayer/Contents.json | 6 + .../Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon-green-400x240.png | Bin 0 -> 22054 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon-green-400x240.png | Bin 0 -> 22054 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-green-1920x720.png | Bin 0 -> 101704 bytes .../Icon-green-3840x1440.png | Bin 0 -> 294192 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-green-2320x720.png | Bin 0 -> 116884 bytes .../Icon-green-4640x1440.png | Bin 0 -> 340507 bytes .../AppIcons.appiconset/Contents.json | 74 +++++ .../AppIcons.appiconset/Icon1024.png | Bin 0 -> 70429 bytes .../AppIcons.appiconset/Icon128.png | Bin 0 -> 6347 bytes .../AppIcons.appiconset/Icon16.png | Bin 0 -> 1263 bytes .../AppIcons.appiconset/Icon256.png | Bin 0 -> 15521 bytes .../AppIcons.appiconset/Icon32.png | Bin 0 -> 1556 bytes .../AppIcons.appiconset/Icon512.png | Bin 0 -> 34732 bytes .../AppIcons.appiconset/Icon64.png | Bin 0 -> 3107 bytes .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Back.imagestacklayer/Contents.json | 6 + .../Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Content.imageset/Icon-blue-1280x768.png | Bin 0 -> 77516 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon-blue-400x240.png | Bin 0 -> 20204 bytes .../Back.imagestacklayer/Contents.json | 6 + .../AppIcons.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon-blue-400x240.png | Bin 0 -> 20204 bytes .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 18 ++ .../Content.imageset/Icon-blue-400x240.png | Bin 0 -> 20204 bytes .../Middle.imagestacklayer/Contents.json | 6 + .../BrandAssets.brandassets/Contents.json | 32 ++ .../TopShelfImage.imageset/Contents.json | 18 ++ .../Icon-blue-1920x720.png | Bin 0 -> 104014 bytes .../Icon-blue-3840x1440.png | Bin 0 -> 351834 bytes .../TopShelfImageWide.imageset/Contents.json | 18 ++ .../Icon-blue-2320x720.png | Bin 0 -> 120691 bytes .../Icon-blue-4640x1440.png | Bin 0 -> 407270 bytes .../iOSLaunchImage.launchimage/Contents.json | 270 +++++++++++++++++ .../Icon1024x748.png | Bin 0 -> 32688 bytes .../Icon1024x768.png | Bin 0 -> 33326 bytes .../Icon1125x2436.png | Bin 0 -> 89069 bytes .../Icon1242x2208.png | Bin 0 -> 89434 bytes .../Icon1242x2688.png | Bin 0 -> 103965 bytes .../Icon1536x2008.png | Bin 0 -> 98353 bytes .../Icon1536x2048.png | Bin 0 -> 99041 bytes .../Icon1668x2224.png | Bin 0 -> 115190 bytes .../Icon1668x2388.png | Bin 0 -> 121855 bytes .../Icon1792x828.png | Bin 0 -> 55975 bytes .../Icon2048x1496.png | Bin 0 -> 100476 bytes .../Icon2048x1536.png | Bin 0 -> 101677 bytes .../Icon2048x2732.png | Bin 0 -> 159514 bytes .../Icon2208x1242.png | Bin 0 -> 91985 bytes .../Icon2224x1668.png | Bin 0 -> 118212 bytes .../Icon2388x1668.png | Bin 0 -> 125030 bytes .../Icon2436x1125.png | Bin 0 -> 91608 bytes .../Icon2688x1242.png | Bin 0 -> 107007 bytes .../Icon2732x2048.png | Bin 0 -> 165756 bytes .../Icon320x480.png | Bin 0 -> 12915 bytes .../Icon640x1136.png | Bin 0 -> 34693 bytes .../Icon640x960.png | Bin 0 -> 30687 bytes .../Icon750x1334.png | Bin 0 -> 43302 bytes .../Icon768x1004.png | Bin 0 -> 34664 bytes .../Icon768x1024.png | Bin 0 -> 34232 bytes .../Icon828x1792.png | Bin 0 -> 57881 bytes .../tvOSLaunchImage.launchimage/Contents.json | 24 ++ .../Icon1920x1080.png | Bin 0 -> 74343 bytes .../Icon3840x2160.png | Bin 0 -> 223720 bytes tests/dotnet/UnitTests/AssetsTest.cs | 282 +++++++++++------- 419 files changed, 3761 insertions(+), 113 deletions(-) create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x748.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x768.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1125x2436.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2208.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2688.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2008.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2224.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2388.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1792x828.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1496.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1536.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x2732.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2208x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2224x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2388x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2436x1125.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2688x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2732x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon320x480.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x1136.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x960.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon750x1334.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1004.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1024.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon828x1792.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon1920x1080.png create mode 100644 tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon3840x2160.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/AppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x748.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x768.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1125x2436.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2208.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2688.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2008.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2224.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2388.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1792x828.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1496.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1536.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x2732.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2208x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2224x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2388x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2436x1125.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2688x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2732x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon320x480.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x1136.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x960.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon750x1334.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1004.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1024.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon828x1792.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon1920x1080.png create mode 100644 tests/dotnet/AppWithXCAssets/iOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon3840x2160.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240 1.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/AppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400 1.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x748.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x768.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1125x2436.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2208.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2688.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2008.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2224.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2388.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1792x828.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1496.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1536.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x2732.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2208x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2224x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2388x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2436x1125.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2688x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2732x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon320x480.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x1136.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x960.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon750x1334.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1004.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1024.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon828x1792.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon1920x1080.png create mode 100644 tests/dotnet/AppWithXCAssets/macOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon3840x2160.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon-green-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon-green-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon-green-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Back.imagestacklayer/Content.imageset/Icon-green-400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Front.imagestacklayer/Content.imageset/Icon-green-400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Middle.imagestacklayer/Content.imageset/Icon-green-400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AlternateAppIcons.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Icon1024.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Icon128.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Icon16.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Icon256.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Icon32.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Icon512.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/AppIcons.appiconset/Icon64.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Front.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Middle.imagestacklayer/Content.imageset/Icon-blue-1280x768.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons-AppStore.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Back.imagestacklayer/Content.imageset/Icon-blue-400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Back.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Front.imagestacklayer/Content.imageset/Icon-blue-400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Front.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Middle.imagestacklayer/Content.imageset/Icon-blue-400x240.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/AppIcons.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-1920x720.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-3840x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-2320x720.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-4640x1440.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x748.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1024x768.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1125x2436.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2208.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1242x2688.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2008.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1536x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2224.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1668x2388.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon1792x828.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1496.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x1536.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2048x2732.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2208x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2224x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2388x1668.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2436x1125.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2688x1242.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon2732x2048.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon320x480.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x1136.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon640x960.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon750x1334.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1004.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon768x1024.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/iOSLaunchImage.launchimage/Icon828x1792.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Contents.json create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon1920x1080.png create mode 100644 tests/dotnet/AppWithXCAssets/tvOS/Resources/Images.xcassets/tvOSLaunchImage.launchimage/Icon3840x2160.png diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Contents.json new file mode 100644 index 000000000000..53c1afb9cbae --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Contents.json @@ -0,0 +1,74 @@ +{ + "images" : [ + { + "filename" : "Icon1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "filename" : "Icon16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "Icon32.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "Icon32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "Icon64.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "Icon128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "Icon256.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "Icon256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "Icon512.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "Icon512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "Icon1024.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon1024.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon1024.png new file mode 100644 index 0000000000000000000000000000000000000000..49676158376a675902f5647c33e2f0f3992024cc GIT binary patch literal 67534 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon128.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..1bdee23cd1ea57825443d6d8ad597a63523ce92b GIT binary patch literal 7201 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon16.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..2353e257d666588a5426a82a02160b7470831004 GIT binary patch literal 1190 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 O|A@VflXayPOY|RCZTi*# literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon512.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon512.png new file mode 100644 index 0000000000000000000000000000000000000000..290507f735d4618d1c0e5b1143c91a5cc9d8f1b2 GIT binary patch literal 39702 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 Z=I?p2P-teD?*joZGh-{Gm#19s{s&e#CfEP~ literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon64.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateAppIcons.appiconset/Icon64.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b1df9315fb2b28d92276e0edb23f650ef75b60 GIT binary patch literal 3636 zcmY*cc|4SD7k*}#!H|(9Yhw)Ao1qXhW9&k<>}$=KWD8>-V`((9Bun(7)mBlFrATB= zwn$1T5t5x@(t@aOyl-Fc_ubF${+;Wb`#RS-=l<({Qf;jd?}ACd007u!Zf0!9w)#7p z8wvoRu^eU&TW3AGUrW$G>(~LBQp!Vr(^6 zKL?j^7b{CFIXDnaIuY#Ujiv@tcCr9G70ZT!-r*!9HSknW7?!Gw`kR4e?Z(#@^BKKfaWnBlc_Zl|ZRhU#bwI!ZME8zUvA#l_}Z zDo_Vu1KZ}$yIp>&Ha11&evb_vfB%ctr;g{x9gJc&h0Q+iyM~K0C3V2dV=Yu7%6pAc zsCWY_2w} zvr4OXI*o{&X=!tVeN8_*EPv`ytwmGeO26zYmyv+E=`~IPo_AyKAr@!3Ib(%VIqWCk zT_@G+ly8o7AWnO(oVDVQb>DN~@%fprIwl1PZEv44(hKR)vQ8{-v@A1J`XY4OuHRs8 zD60KZuT;HDoY)qgL7$*8{BkLLa-IUu^AiY0q?4ntRp$WG;)Z1gRO`mfnL9RPf;=@< z*#rz+j~d^xLL8nRCjCn9SHlHqGJeT#*k8{F1bM{v{4CcaaGmcwcCY*8xXlK5=#08t zp$Qaap#m`%EuZLh(v9WuV4hjBJjL`+EVY>x_^q~VcOA}f|5pWoPRCyp`Y<({q;mz0I^K#Lfc5p z<-*#=vnAfQ%Xr^EZ-G3#{Ct)BYQmmK^V_TR@*zyL)CEpVMs#xJs@;a6r@P2f_i=bm z@gCOdJDy5bbZ?3n_0D6Yi%`G7n_DNIB$vkXn|xJ}*&nISP@+JrQ`DAWe005Hv_RIE zRi_|jXN<+T^#+`86(-zfENGh!{$)pYrkC~}{$kTPay5T4CuC1`cop(Os{yTAaPL0( z*t~sN=g%Cpt2dkqg?sp2^_6Y_YQ9eNMi;8fegyKvxfZ9+X(K2b(>K|`ZsMRbHeTx72g!tb`zmJ#SOlN zw#6u1PiB6IMCiSU;eM<>f4t9ZP2ZsN7Le%v&hDHFkw8Dkw&-QG)rbZ+;?E0leGhaDHD*UgARvZ95zaxErifJO+? z@bbGGy9C=ubtlDg6c7`8QH|e2wA+VdK#7UWUUyFj)4xNaARe?itN%-CZkRrX7QZxk zP$aqN&NNgpe{b&iG2M$2`FrjIWJ$MxZ^@PS-RbZ9_f=JPZ$9q~sdzC)_wJFVnB2YX z8P-ad$sFKKBqTUqr!*=_TSx@rDm$K{L1-sw#;xZTixn{cbRvDsxrQ>V!Cm;-^$IwA z9*3OWJdFSPs`^s>KugB4Eb5m|{&?sNk*Hts`DA^+XVm0-+>dDN5phYd*raWb_1ygO z#QfsOGm_UQ)qE*$Y=r&Uhsk<=W1@7faXT8d)AwGWNGKi ze}X#HD)jBGhUylmQBhvli<+Va(P7OuE<6*Xm9NyRB!mHJ;P9`JhOV!o`E4#b&EGSO zSPT@?^%czcA;HHdF*y!dNu|_-dA7z;&)ljM>9Dx?$)04g*=?9Ed4I#i{%h%3nIK1q z+pYZ8YD3|p1T67lnX0Obuzq^_i;yGCD^g8j8i?kq*#$1jO{Sv8l!pvF-y?EuzHzjM}-8HG%g>7z9_QGWpw30MGQV!p1*A8HsruVBR{~qWOHQw4&#f~G zK#>iM47lFeoRNkI>cGt>MN5x<3lCBL85M>T9+GOyUVd@)V7vVi$?~mb ztlYO6_uNExVf~__hB_EuVj!s+M(Xn2g!;9!;NkxrHU?Pst;KFx|la)!QY;g=9C zFhM9GHNrIZ8%1cU;`CE)@*~c?_PwO$kaBWSybyOFKy7ebMOUhLAP9HPMYB z8w^;-;bP-rq(A+&VrUW`s(QkH;X#Wtw=z`+kI>>_pfVn5Su4@6*Iri~hj;brz}pJe`H49zSB3gua|Q)=|5{ASsNPL{8q#ic@7OAs=RIzDpm< z-&Z!_%HPk~HS}7+5UyNU_Vc3AH3hq-A|cq~=fdWSBp&nUR)(uo4d0%L^lPQ1`y-ZL z+tPy-m*cLG1bb4PWw7k0jKp#hxiQlow%Vynjodn*L6H67;DwXn5M99W#pgcQGZm@6 z6!PWiLWwW_Q2WnC>2~i}Sz{G#H=NXrtaX-ryVffLUybz9k*>kFb}1i1ly?FilW1O)( zEyhOnEVyKOU)94o*-=eP8@ej%R-l%;9OS^qJjNSbx8P-y`d2Vy#tqKB1O=?amQ8n8 zqhii8m7uiIH|rCrSr_WTV3sC)Y~-5a_%pt%A6m!eF8R*Y1-tP{^mg-|R9s}q1X~Yw z*`E219Ln7&b)uC7Z1MGpeN%ZL9Zs5EpUno>&tPdI6V!Kz^%-j|>%fpw4Ft!kDQn;3 zK3-FZc;N$@^`4qGjbxFq9m04egQaNrzfBSCsLhI5lopIJ>a|F9}eTm9mDZ)rZ(EO1uQlEuEb;=`)0U4swMz=%uTF~?->%${0E1nGK>HK literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000000..08ef43149272 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Icon1280x768.png", + "idiom" : "tv" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon1280x768.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon1280x768.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d3097507962469411a5b93ed57390f84bcff15 GIT binary patch literal 79481 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 Hqv-zuPLnqK literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon400x240.png new file mode 100644 index 0000000000000000000000000000000000000000..f558229e8eacec411769b485348785d11f9cb85a GIT binary patch literal 22054 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 Hqv-zuPLnqK literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000000..73c00596a7fc --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Contents.json new file mode 100644 index 000000000000..de59d885ae8d --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ] +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000000..60cce20c2b25 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon400x240.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon400x240 1.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240 1.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240 1.png new file mode 100644 index 0000000000000000000000000000000000000000..f558229e8eacec411769b485348785d11f9cb85a GIT binary patch literal 22054 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 Hqv-zuPLnqK literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon400x240.png new file mode 100644 index 0000000000000000000000000000000000000000..f558229e8eacec411769b485348785d11f9cb85a GIT binary patch literal 22054 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 Hqv-zuPLnqK literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000000..73c00596a7fc --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000000..60cce20c2b25 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon400x240.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon400x240 1.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240 1.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240 1.png new file mode 100644 index 0000000000000000000000000000000000000000..f558229e8eacec411769b485348785d11f9cb85a GIT binary patch literal 22054 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 Hqv-zuPLnqK literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon400x240.png new file mode 100644 index 0000000000000000000000000000000000000000..f558229e8eacec411769b485348785d11f9cb85a GIT binary patch literal 22054 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 Hqv-zuPLnqK literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 000000000000..73c00596a7fc --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/Contents.json new file mode 100644 index 000000000000..9b55b2086ce6 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/Contents.json @@ -0,0 +1,32 @@ +{ + "assets" : [ + { + "filename" : "AppIcon-AppStore.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "1280x768" + }, + { + "filename" : "AppIcon.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "400x240" + }, + { + "filename" : "TopShelfImage.imageset", + "idiom" : "tv", + "role" : "top-shelf-image", + "size" : "1920x720" + }, + { + "filename" : "TopShelfImageWide.imageset", + "idiom" : "tv", + "role" : "top-shelf-image-wide", + "size" : "2320x720" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Contents.json new file mode 100644 index 000000000000..f24b1d62fe33 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon-green-1920x720.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon-green-3840x1440.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-1920x720.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImage.imageset/Icon-green-1920x720.png new file mode 100644 index 0000000000000000000000000000000000000000..30d5121714a06d9203c11129d848f6adfeaf7c40 GIT binary patch literal 101704 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 EA0f`b8vpyFN?6dE_ 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

    j+Sh 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�lM2o=lcQ(>kys^XY&u(x@o#QJF~{8Z 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

    UhYJ@c0h(B$6<| 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 z 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%0Ang4c|mB{$4;XwUt-2BSFJe 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

    G_SXkqIGFy^EtUaIm*^GRk;5g=NetFSb6B9S7 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Contents.json new file mode 100644 index 000000000000..53c1afb9cbae --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Contents.json @@ -0,0 +1,74 @@ +{ + "images" : [ + { + "filename" : "Icon1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "filename" : "Icon16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "Icon32.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "Icon32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "Icon64.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "Icon128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "Icon256.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "Icon256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "Icon512.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "Icon512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "Icon1024.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon1024.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon1024.png new file mode 100644 index 0000000000000000000000000000000000000000..9174c989a9c8b8a5ca133228f4ed7c173fffd2ee GIT binary patch literal 70429 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 z zCn)b8&=oMu6ygwwJfdasJX|@L6?m1Dv0X9t>JAWO^UIj0#&(3UrHx;vP^3g= zL{(XT!?`D*pP8)WoGHYEZZc$!odTzb8n)q0|88*>6P z`?6&CSv_W7r2yF0beQ2*?V^_%pKktVAo`)T^26X@NpK_*-ni{D7{Sp{C0A<|16l(; zOL*xGW|*sKsiwHvE!h3QXe@^a#6W3}8!DQu-h?A_4gkeRYkt4NC~GR5P8eyp;9kVQ8$QG$5ad7Fo23Z~ak1jY~RXG{v?3G$RarFe`XePu3X{R+=mBOw&X zks)|Sc$RcG-jhn!`~-x|vg!&DA&@}QH^RNdyy9nq56yrU$^qAaS+F_NOaeFb)CVaH z?!UvPajgrK&zqdAs>&Def#wkcG_UhmYOVw^M`VZz@+4IWAVzK%`+za9rm2SD9={u@ zlx5D6UDL;lc7#9`+%vnlP3PescU=N`DHQPt_N55GNBMkVCRMR4?fvp zAFsvcHN4c9rb>J@{*IH>RTr9de%9i4Gd(cbFa9SP4anhoP;TA0!oZyB8?lNMDHPHK zCaOaFU9?x2A!o>p>mCF9r+hKs9Czu_P1l$LWU%}q#)=T3p`ZnYyeHmsewqw`}L^4LuHqfo+CG6<2n7#l^3;H^^!1 zsaieYFnN)Kc7Mv}^xE)4kXUw8<9I+jMB@QV9T9I8haLDt1Ne#exWUfGYG$4uMoEu& zo81#2up18Y40h%tIsOZglp(ltVsE*j1~$lVd|;rN)&${~o~-%KZnJp&3|OFR{^8E9 zJ;fCu53Ysw%}@VYWE*z7r)&4P=^B-SF%a@>*9g84<4aFUZT7x)qdsS+#2tu5NbpU@ zg;EwV)l-#sK>#r9>(0Figx{9lKm>KvRj;y<8 zc8SxMW4<11(s@QMV_}n9MRzA*62->vzxmHh1)GVASEJY7LVtRw`Rv{v`(Fuc00(&o z%m>gS2aJekmdNQ4p<{pD3HqZ-%4hdU1__xYhLi9mTJXD|E zE`t6SX)}l_DY5vO0Xrs#O6_DKtPKn0f+e~SprDYmJL_`<053iA5P`zn z4<5etc%aF58sHFr#M;U-9|=;l)J#Q2vS!Q9(d(EX6fubL%uA_lqa2%!cpNIv78QZ}Ayo(>C(ZpsRtKhzD--fpuoCch87cX-Bna9_{z%$b*dHM0?+T&Hk!+^UM`r|vq z2Id$??bX^|tfYaE+h#Nik(ZcN+wt)28q^gWe!y8jDCXrD<2qV#49x@5$8&Zrd5NTs zNYcix;9fe#PQQ;T?!6hG>9K{K+RCPqiGc9z%t{=`QaX>7O{l(+#7mJ1>Rae^J?82e z6cLqLypskTCyu>uc~$0-XZ^1Qvhwr+pKQ#CKImhGu*MGM*ZrROuAHWuT*yM$ieEy8*KLFMMdLZL|D+yDmy@3_PELTEVMI6nwfcYA3ZQ9wwKdtkT z;`;z7fU{U6>CS7kr3=A-()_G*G(Mjf2wXKe

    Fpy)y!S(AQHSG#udd_8#b4sQu!R zu5}IzX*$;Hxs1sgr9+QLeUpi2f*mS@gu1o7j$4a#3eTy87Cy1W(bOxj9-8ZRrIM4o z(cA}65RvU5I{R>voiE4hq?IR|Ex_{-*@Npqt( zIDp!L(vSJ6d4kt3bs?%QG|WN<_=G`~ybhL&9_Y*G$dd&gzIVx_>J;7D4C2nuwc4#) z5oJX$8=Md9e*Hi8-uf-dt_vH6aex6-NQT&YzDk9kkAV%_iab>#OS+YuEn$;$M;c(Sd)J0rIbX z{EH0#cbb8K`3uC+X#dwI2Izf^0iyroYQl1He~3Sp z9Fx@l`8(iZoPRI=N3{P+<9~JRUupa+jel|Df6(z?6#ZZK@vk)gl?IxW{OczE-*gi+ zb8qh85`ndqgV%nJ>guX{$n)M6qHnj_T$b`tR34FDa`$1_^U?ItSlFw7d=L5&1Cl^` zzpFQD=#B9D^F*$kw;n?UG)96ooiUh<(xCDxFm&rVoixfLVV1D$51WNGgTyb4hxoep zCkq#MwtDymBypp3DCNYLDZkdfjO{|In?8-NU#Mn=$kbsx4g1<{dG1OsOM z^S(GH0vscF2!TPh=BouYuW&YxI~I4S;wDeL#7504see`vK7baJIpAFjE;|jybj?Ma z4DlkjJ_ZDL!-{brXo3m*fPv-j&+x{K#^1jM!aVx;bWXQPf2BwTCGFF=BX2&$R%NH69*WD((3g^WLA>z!2{l#;#hj53RrdA*6k@ z>)frxQ$dTm%&tDoNad2N!Xf?80s~Br8`5}Z{yEctC?Atp>LVRH<6aCCqyi0$1~e4H z1Doqa98wsV*Pu7G$2)Q2?W1PQ=~EW$#YJ&Jl)^*uRFsW|nIg(BdB6zd*<{TqmuLPA zo^UGz!$FSD5FMyg8)gU+$Eg&1s~c*jpE%q4ZQk`@hQJb8BA>%7*oaVDkH6_MBYHGQ zZUcEsfdz{bOFRTmQ8<9w?k7Egoe+b7hez-{|L9yZ6$udpR!<-4Z7Dv-OBZ6tp0M!7 z+l{wR>yO)}z`Bp|NNx89(5?A!1i334oHD^iEAMQaS@h6+VJDnTUjhSjAB*@chR>?M zMa%hWT%f5I+-?O&DF{s3|2^auhVXYYZ5WMlDsileyDcV|8K&a&-!2A+Q*b$9T;oXj--c-MIcGjH`Q)ok9@te@%IVBB6 z+@-WYrOWHLw^o)XiG)?@fM9fij3T9<^M+wSj$qzRve6M>d8 z9##had3h00gQ*I|!Kvaz!2IffZ0b3>j(}V#FnvPc1^9d&my1ed+&Y>aN76hiO@%Eqs96VKz?GBY$o^^fpwH#q8W1)rgpdg1#+iCr0EF;rVtjf zw7>iF8Cn`THv+bpruM@+k~jHa%z*3Q&R72J`rx;f1GEXWJ8`t^Omh5$hE+zu?6bt3 zh~`%ebCC0+-+XLtG|2#~`N}MgN#iY$^#lDqVo~U3r-=3O1Jp4$&Tk4JO40#ojEfIN zLQsuZ(k_yRZ4);n55SWXrvOiG2(gd@#8Zdx0k+CjM{Snl*VKeLNbfI>0gVp95W$nu z>MMz?MR{OakSn3_=nV%L>nG~7E6{Ypfd1xsCDOZsKbFL3P#NTCbs&BEoR}~~PCvM# zQg<=iO-|qVkCN#TW?&3JZmQ6NC#d?kJSEF+zb>aRzEf-l9k#i#(`-dn zwj0K5mc-zx5ne}|QpdFtAQcQejZx`WUCxx*JjCYUEa%F5CiHKGi<=P9kjCvq?9fwF zPY!#0Ec;_fa$srE4^Ggk<^X-Iks6nzP%EE$Dxs|Wt>iLg^#o`N_<7*~DWdslTgVQ@ zh!S}3u<ENlKq+q-TSn`EL$8o-Xx?;mt>y*II$^sY?%|IpsMJKM2n@|(e zUP?K$u<1dJR%s=m(zfKxhEPHa)%glroTVwsW5*W15P4xVIzqL@$uJL|%rQAgIi?8< zSvM~&uVB}GslE#pNM=jTi<_FDso4 z-@4rIQCatChJo82=z`liCm4C5gim$n!Qr>%w_OhvFV#sG-=go@#Y&+Q2S*9;&BLR< z~}{!Wy}U z8_`F+?$^*Z^by#QI*%L`FzZ@zQze51UO&x>cbb=nR##w`9QA;QIfO_P={R9`2Rp(rfLDMQ(B{q(EVQo7`mcTJf(*G=@5L}P&(>C;=_BoOWV_6t*|bbun_f>NP>k-{^n=vBY1a^Y>kwf@=K*Dmg7TX2CEpC{RlA$f_q( zpl-r8;B0Is%E(Tv=cS)z_a642Pyjv9nkr4Dlil0u-u`PiXhoI;Ya+5_fI$fdAZ{g- zO!x$8FOe#4Xq_VL(4ldZ6K7|#Wu)si3yYa$w0$_sM2Y_DoHPSt-VOVw7zFl;olx^y zwZI0ipMIfL(z$tYC-xtWq(X!94&ej8uBS;FS{uSYw80!`VgWixCh<}L7ZNV6X&{v= zTqnUw?`XHbnz4Hu3@MIy9MDE5&dz#_h84=m;Tqd2TJ)c-fr1!@REYspQ8Jbt)lF)6 zRRn4mSC$@4Z}iuM{kaHCtPhvrBgU#7iTiklozu?pwF=-sp^`wHG_jUhgD{%%1%zXR z$>>z^fr|E@HSS8ydlS*H4tGy>nv91Xy@LOSf@wIY1Fa$};7+I*hx z>;&@)p??q{n+uV+*nurX_SR}=RaKjUpn4&zk+@MQh%fxj9-ht$}7%YlR;J{<8|HEBndHrI7}l zR)eq*+Hwf%pV6p7pSgWz0VUzTdboM&t53cr?AoKH>Hwq)Ng$>O!hn$BjYymD`0U9{ zxaOvHUcKc%rv&$kBlysd!=B_Mx$}vsUKwX=&D*>5KxqnK&oG`!2af}tw}-?%b`737 z*Ze`Dg&Hrq*#9FRahm&(Flh|eWQ3ROVQiDkA+G$e1rC4~hbRCoAx}>*f#OLU4_6HH z?4bAjf@yd0La_6g`G%73r=34S0>i=-SuJ2_A+i5-*0}UN zRQ?aRU_b(Hqa7!3OZB-5QRjA(iHO>`cR(&JV4YZN`9&i{Z54)2pkXfPMgUGG zqZNFca5v|LDe{Nog}N^n7kWC=Xp5}9KlKD7AQsC|4W584*?Y6Ti9arf;umlHnc@plG{)a2)D@_coLpIbE5I-rjsc-10Vr4* zH256)mD6Fo(6(}So`vb^g$l!#ELyuQYQz_!{dE*4<)z|#DVSRnCTl(Qo6+IjQ&|9O zf_lw>QRs01tV#V3*3{`m@u2}0mPm&d=3U5&3OP$mm%I{g7(cKI1llT6s6M^(XMt$C z5+xz0u?s@KH}s~n$T8jo+JX@fibWBEQIS6_)*9h$W6>X4_XoQI;sFh;&i>{M{AUFs zys(PLxl^k^UB9c-vVPR4jnee*o#{Jtk@q1fO-l1~H#V4z;NBUuQAF6l8dSl239BTN z2_Hxq{|H!gYA>wQT^E~2jRf|Wi@K-=<3J4YcZC*f>QQGxM$ivkq4$0u*J`qQ2tL8U zLm>kXrM0|D9oj?oU*MrG*AOB}00sJc+Igv@%PUX&U%$n)Ue8HZrwr+C-S{9{!!X!? zAao!0d@@Wsn`_|2D{G90=+MtnqSVDQCjIiAx9|JQ)CnU4uDz7$cXO0|T}T1?of#h! zG4(oJD%BL`{yqvWj|NulKWu^wO}#&K<^qF~n4f*zv{cs=&VwS*c|Q=??fw!%5=U^n z#c*uI{qw_@<$$Uhn;h1wOuCis;rQmFI1HLv<}4bt#^x0Xfu3;nqg3-VJLd2VVbVk&aedMql$jg9H#R zl_E=m14E@w5c~Q|ql=@(gT&>(nW(GCda2j~6+*6!Nq!0hR&g6B~vChl<_^~MzR@^s^~laKwwK2h9wo)QU!C?+R+ zCD*D{sQ)G!a@F=m^d?G5+xuP+t~c7}Qrb{S6>eVS9c;v|uRty?y+^OoQbhH@IR$RV zhQRPt9LPG1AI|k-FTXic8P4m0EHgkihzT}0aS=!rT^O}?m5{koife|TrV?i3WqEfF zt;T-?SAQJ0XAo<4RW;b%N@@NbfoLrzxsO>W&v`9sB@z(Rrl?&wPsC|vylV;#9 z3Hd=pHpd^NwvuvT;7lmze47&&LvRoq(Ph>;Y-?B{-FtaW@lJIv42hT0>e zS>>f~I;vf1TR+ zpF>bH_iDyE_bF#4A58(bjE|*r?XMCNJJ`9+eiPDOpTMaLPMLVm<{QdIJ(DPDsw(jO zB@#w(L=kGx?7kc1eg0!BI%fRA=d5S9Lz|&Fw^#l6GI{dMy*z$q&V?n6d`+VE_{HJN z_hyKkYcPCCQu9Bq<%E5Q*hUzz7&73=>M?@+==>2mSgqBb@6YFE7ZoqLly2v1GZ5Tk zlgD2UCSQb%w%YKTp=nFStB`z3tjb9b-p@~JxAtSMK6u+X@S&`JAR?s)PFF<#VtXop zgQ*rDhWj=@9JC*OleaZ0c$;lCPGLM#QtZ36;>H;olmavb_82|TV_@C{st8u0+ zaa`!aXwGn}F6MnflZgv2Q>_9PGJ?xKf%zyk`^pH9723~yy!gKK4g=qfwR>;0hQWUD zu0C+5bL7TXupn{cs|mfNMu#kob^#wj=(>DEa3A}CP47Rw0OnQw-W>FVa`RNih@{i_ zxS+I9MS3TpbmCnzKN86VFIs7|xbV$G<7n@0HDJx2CD_J~hdW~@aHr~GMX&XrzRt7q zN#MG{7Q+?3X|Lw~{SC-?fY><_OM^GqUk*}suQZyVP&zXx?ovtK+JwFD)l)y>)AWro zkE&BwYwx}T`%6?!D)P)NTow92WKeET;G!i^aDVxS$L*m4C5fS`6<__VzWK%%gEFAi z(eic9Yr`pk_}2j9f3WcjTSo3F$RWf7%2CHKaT9`#cP_y}d>H2(BDKC-Z#IcwD2hyx zi)tl3omCZCE>-pExn3Qde{Zr<#kYJJL)xFoM)5Rid-3$M{l59s#yY?i9_bPv)!U2L zIb%)_-c~Ri?|r<9h5X*LN7fqTho*kGz|pusf#+45KLZ(vZ&L&hxvkXNo2i+A6gz!W zmyMWjaC3E-(Rm_MMv8i+&;2P zQ9Fw{J2l-{iofm5mR-Ua(wqzZ4&r(m5KH=pgE7f)r)#W|*@fLdc3w&Im|bO5z%uN( zT%R1jMiy<#B;9pTb19=Ph(0b`QcGYUrf;?VJ-l(cMsTowU(9#z0sVqJ;|IpG@XkEL zNr@M1x7oiL#;hH0@Xu<|Roaa4uNw@FmBVlW*6{$o7a4qSM;h@UAfMtvk7^xiN=>tS zX|8-amqHoI{FFXqe*XsC8fH2{97!sBcBqfD zluUU9EMl85-e>0)rjy3rW`w#-M|P!JHxxz&;#t6I22!qz$s%|H3LBp;2o82VO_9!I z@Agsu#e^NP;kj<-;pid35wG<;a&DwM^bGVXc{dmM?eP3wkU&GdAa4F zTmVr<3U&`9{n(Gp&C-U$y2yn|e^4sZZw=3e4?h(kVVX%JE(V6DrECo*Kfy|9QWrOla zv`d|!qPbd*nCeBaVCpHaa-LlcqkT`BcxHNGw^k$gr&T!GKSeg_IMFq6ny;u^FL871 z2Y(=&*9_Z%{urDZn88~C$&wvpvGitBkf;aL-@h9S^c>sN85SfxPig(S({D?#%Qf?b zTw?#0@D;9_RI6~YV(Wuacs~cy?)X+$bCq3hS~N57x5?$Muaw;-y7frJgx+J+-2G8U z(o!3xxr#jz<d~omhGW zGwr7mhIS7q5|*{7O10p!8?l?i+}nv!rW>SubNn8vb$n;1`Q1x9GKaQ%hfE?U(8_8l zfCK0L!lzh`^p|p%BByQnX~-m1A8#w%CTR>zE)c5!Dpa!XSvLoak3IdNp=Y)A@B#jf zGs_meCexK@CFIe%;Azr}h8t@9!0lgd43*}9f07EETX<^sEbt+QfS~M3Ci&3J2O<)* zb|SB)yizc;2#$EShmul)8=1~p9eqG0wMfZ}lP~XDkOTVfPYk-%+G3cQ5({;W|~nfx>CSmzkxa+t;rB?E3v^eedr3rL-C^;)F>DA>QNA z80IU`@o~9;vU_IA9Z^?ZRH!#oV_G$`T<&0vP&a+P4|1w$f<>Eu<@1OaUoy}@ZP29F z`6zgXAG3vjqWUf6Dwj`U8u)Cz_<-+T+DTgm= z_6y!dAG=c0ww7OnoDM0xSMHKEbPs7=QZst_a2=mt8pFqO{E7DU=wxgc6+imsYnV_7 zI*Al%`B@c~%~gJ7Q=+I@$6OS?Z>f6f+58QhF>)9oXvxr!w)`y2ZIY6lOmI+(PJWXs z)IM$5^-7e>>{Gdef7zEu2pd?Us z+DACx+h)&tdC`1Pj_B!kUKP%GPS&?PB9b9!a<@S|wCv29-4VT6t1>dyUDIzHNupXh zWv7%buPFGE+fqj*vrbPXQ`?%Cr0e+HVbRdTfpSwWh{xj{uV4er!MaQhwLbdoMp$e) zVL1q|{Y4s>)Sh5nW|WFtb~RW>xPDN)yrJas^qUitGh-%c>>oy_`%J!US`?jG@{mcz z&%kp&H_ROiNWIKd5xU%3dcl*EAmSE#(yl!l&paz4;U`y8w986>b+D7;%h0#6@r*{L zhid27>;%{|s|Onypod58d$5CbTsB7!|LL2Ene~3(e(xmq4stX>9bEQRUd8#QW! zR?SP#gX{1t78lCA^jqIIOn-$|@MN1f;_dJ(GS+cSv6oSo<)$Y_Dbr_xti#XOd^hPy zph?R%<}Hp2xAApnVh*dOhYiE&zc2sZNE?&#>$etK-g67zYnqg7 zOT8SFNM%7TG~=z0$jt2YzmW~ot3N~oi;7b0TYZj>I$T;oc+r2;p-QljJA~!(K!BR- zOgbdc%#F#P|70hgB}P6AdFg;1emc4Rcj~Ny>GXZ=?-*(u0mRO4Eb?(5NwI^19~U7` zuhxI#vGiE$bT7S0pg8XD`Xrc?IrcICV})_HW9MUGnpK@NlCTcyywFHF)0}s*itgZe zAP`}(H*wf6klKj)?q9(}ygE$x&DqwMerXQiZ>d~c8H6rT*TrDT;$Tm2f4Yx7@uZ@uMF345%fLz6@=nW-5>tCMj ztq*HJ3SXvxNJ!;EIqlJO$u@^?o%Av3)j#BoFF9SlDT+&ghJSXtPq`_Est;=j4aNa zl)vxXehOU34AXA6RX{zLPPO=SS?%3Od)r6m0sN^77X#y11l9>``1b5|W}n-ynOl!8 z`GGKT>-pMV3w-pvTjsA_g)5%MJa5le)Rg2O$OFXD!R#wNi`Xzoa(HUIN58X?1*Nk} z4;YFQ;+?M|i>fR7-5@

    >5(9LhcY!ztnkkI5XJ=TATRVN8h*{Z|qWc>i%d;x4Lch zg+u>_GVkY_`;p%4@D?NH2K%7_QltJD5YmN#kj_430w2PG_uowScqXyRBtxWdfVWW| zFY-NQn;yxfndbEr%7vH4$c(FS5Pmhqywizk$~)HR5-XnlQ8E1~lw>Uj8Xd75BUBeP zXJp@BajwQI90B70TNvlj=5SaFiMs>HdVDLv32Qz|V4#l-7Dpl+ja9?hlMHCFJQ|X0 zcpmMDfJRc|B6X_DMM5j_6c(1E|1@iBX;NuC7P`xDMXUS z>z?2)d@G`ca9cd#iLyDNg8xvoN4KOgm{mN9+W(U1%}B#CM}=ryQ5R{iCpJvAgH#9rBq51{>M|L#QOkJklJn zF!-0_uBja67U)0ODhhkMpx#oB8ZvaoN(soi3_|&pk~57T{kE|yCzCotCDeAuoT*?} z8m}$o==c=YdH1=m50>^~mGJGSA8y2#JWQ~Ou2UJu;^8tYB#Fa?^l?9-?*2RB--P>u z=o;iR2vi9_X$(FifgTm+N!Wr9>Acq7e`A};sN~MtSFLXq!Jv;; zwAa|STrtni>R12Hn5#WT6mleN`4@)E=eVZALetZQUNtv6M;WpGc}ad72<9AGL+TD$ zcnN$58LSO5Yu_ z+!gbYvAde)rftz2YFsz!UgIh(bsw+kI~oKk-xZW28Eza zx^BxU6C*c}NtXt=-8T#*nSKzzx(yDGZDUR2(uqTrHzM?rcLSCJOt@TS3;t$i188RE zY9%qac+cQ{TH<;8OFFBIw>x2*9O-w)*o5S6%xn48JC+I8ZxOa5F;?C&CDG4Qnf!PE z;}Z#06b&H_P zgZ(c0UujIMBwh_CaeQP|t*^92I74vd5(-P*+I!|To zlu3kIj3weJC>|NUsCo#s0XZ+@C-K39>H(}Zf(NmyyiZLT`fM+Ss=Vj-R4+x4m*Esk1l+l2w6kzgx3I6+{RODZu*%v#Hvf_Zx|UOt+Qy1J zRt;Y!T}mblWRB!N0y{Jrwwqy4F3ReTM?jjnrm^nc|E(=~f5dU^_niQ2O!J|_GEKOf zhDw9A2DP=ty=hRp=CJuCGz4Svnb^W${(q_#xW@6?0Yz(2PW|D^y0Qfc(V8b_fLOv( z(CH1c2x5<=$tcU_2?e6Yunk?(WvnBK+wO&FcVoFlz)OneHt>7?da=%)Aj9_4HA~GS znW#+HIa}UN9~J-f6Ul_kL)WdXfA|^Ey#iWF#Ro(CtI4Zwhe0hdF;a)KRjfOT1U_QCsC&5SoPUG(mbID!ON!D7dPu!q^0d#4Z| z%TYF_==Q6*q(6Dvk*8L9mCP!aJNLAh+#)u2Og39)4$I~QY38QOxfT_en{6L^JwenyFqij%B?$unY4%>UB1GrPIJQk{izWNd;s5_E(-0ZWUcB*QXt z(seg!L;P3h=HdQ#6;4lg6!EW#3iTa;u{6>y~EU zlkCo4yluH$9yikaF*>*W567C|LNgO@eOF@f>oB?4B7_ z)h$1BsHaf2CW85cOc4e{08@~H@xm5 z{q{>fULt$BTNp~2E>Ew1Z6TL5AEUS`UMU3u3YW96&bRc;pxc@*ahBi%LBIq2N2FU$ zPRsqbFutb9Pj1Hmca}asVe5`{+1#WyMSFHF3$VaI<_^T*}*oQQSBP9 zpUO@_Y;ppeB~uwSP5|l@U0flLHE8yPio@p|53k;3kVE>Uo*Ai}4(;hBArCgys5R@pRn1qdYJ_2_emsBKEsA=t?Z!7-IojE9`wOVa z!Uj1Cf1kW9{&?~fdC7epU?uJIzd5J>Y$%$vPt!~XXCA_`X)|!5g0D1*(9M-O{T3bz zsOqP;k$y!D;gU{o@1z^~=x@(C`B&9`oshPC3}M0jE%XiNA&bNw9Vn!EhLOQW6ZuZu z(btfoY$XR2?U4q2|9G-j-^gXCD9T;lv7@u2Lm};bZQQKo!Z>UV+yY+i6;x~uw zNHj+n$~KPF9=&ITe~auvDz1~Sh5jz|Bn;P3*+SJHYqAg`KK}I_qb@R+)?d6465RPh zF?A9|xdh#3U1D(rPu)m9dtR6uPBZ!a^pXs3+kdqXQ`U_cC?>M0uf|}#5|+S;+R%HU zIX`%XE>x+4dXkYP-6kBQi8KWmuZwNAzk+*UrEOvOOe)Af2eQh1b%;E(e%JN>{d2SG z@9)#*=t6F$TJbX)a(vJRFE!W!O=o6>ecOK43*~2SSr@_{WY>$Q&J$(9jBRppdzb>+ zOzH%!i|SYp_CVdh2vCe{yB};sPhpB%g8>o@KA523I0f?+sQF_9l~SDvt~@k_xlcY6 z2Jak5Q!d4sm{XR$S1I<&_=qvs3`weR4{Y|{bsx6pozFwD_L)|-b&c3DQo(O@Fw@e^ z!(6nnS{)69_^+1OfZ+nlL4(C$_(r@EfirseWrIF@iFywdi3KSllFr?_g1bKHGj$+_ zUekuq9Ij}|W;z{KZJJK4pSE?v_wDjvG{EWpinH&EX}T$(LXJ9wmr`=NU0;(VLUjBl zj&+5A@`tg!D%Tez5B^iwq0c;!S0ARhq1JPlJ!YEbuSED1Yy#KJ59VKI?TUI_ryQ#m zIDRsG&WR}Lrs+51g zi_4Go{7`|Nnrix6?m+NuOl{!&>%Vr$*pQrr>)ls8$b5lDlt&QHfqZIDq@Qg9ov!Gy z(_r4axVKl{lrk;_xbN8JSDTTW>_$W3$EgIFVFipVv5Wz~)j zaa=rL%_)oZ`6^dpgYcs3>pC_%LBOJquzK#IUd@Gz=&(P?R1fyHvmj5W(VfPDi9Cn& zF>u{0NQgLOiMvYTUAeN~F`O?d+?I;C`i4szDX#bo#&DbPgWRL2@2n-lQum>dYS+S& zmP5z9qla;xQ|oyfd0W-=TcJlJZ-<b>fF$GZOX zj^pSTc*CXx5u#oak#Jv3*hQwbwrb2WX3vvz#+KdQ)?xa8nLW{WSJijfjAo5iM*+TE}~ofmdH{p401I=UaR+ z&FLsBQ+fV6YF1mZ`Zd;4X{Eg7e3LNp!Tb)4Uj|`4w;UdjN3RD$`T?F2sA-TdO0geEAGZG#?mUs02;DD1gVZa?5Xz^2s+AB&lHE)e+~Me5DJgc?8OFUU?7qjD+_krnW)3>-;4Z zalkcbsA(-}p;5#}>4V|gYmIVbgu9{s9$)$O&MRFf*ppJCi(P;BYo*1mTC23bny0AM z(1yHX42~_kAFnD>N4kdBXeC?HJUKu`qF~Vb0Y5+oH*s#c&GbqvO~fExW%P`-R7arF z2ucT#N6Ko~4f>A7;dteua@CuXIsBW;(iZHxEP|?B`RT2RTOG=h5po@j4=D8DNuxq4NLxlJ%9Ae#Rks%tz(rl;TPu#2%2(At=;BOpLn!bQ z=lD#XU>4};GK@17DMY%11h@tO1*x}DsWiKW0o0n~oo+>xHUcbu_TA_BnD%%Ii!oo`7m9FL zxN}?S^&9akh))xWN8b|3FmoqX5?ww#^<%ZQ>l zzZ-BL|F_UM9a|k$>^w}FDoe3@n-GS7a8o7_6Qv~)@6F4lZ%uCURn?@S@swYMe{!?* zBZi@l;hv3G0y}u^CgiIXm!98O7^flR*G}xN=5t>U3;B2Fi@%fhHt@FSGFkvv+EQ2a z-y^lK*@?xXWX%ysL%I_a#?tS z+=1L^a$4L{Is-xY{2g%wc0ix_ zGgABF=&Xds1*gu^8?-}ENG)C>b7))3+GfJ7r-qHQRZqqZHlD%HwS)CO&#DIYJKXd1 ztvMU&!9}_cKGKf}bbs`^?334vgkEQ^@AS%(Qiz+F`%TmJITl;fRJw^dZnWb!)hEU0 zt$=oxGJW5NNvY0%`535nX@@WEfB#b@+YT-m&M@h2V`G7|yph;_+V`{aw{)Q=J+UsR zxhm&svHR3ht~z6>HVaM9&lE|F*|By{=jC#cS3Faqv@r$dDY`^jE@ z+TZ@FH%dmC%Jy}hz%l+E=8(2;iFXC{OJFso9u*ACr_nq*R2jaU?#lmdp5VcC>u1w%KXwqlo@#cW+ z%G$T}tfl3MTUO~=SNxtbt;jLQ@ujC{L4+BLSafh^WZTKBi%Q*v&4$L#z0|xwm<7m1 zi^oV2zdM6=QGQzbvQ^Br)!H*?(uDODe(P}B{Bp1O5o%nZ;kDbBqoYd|r9khZE+6Ty z9WiI;x6)$^9yh!C{TB9-5N#+K+tapOOT$@kZWW(%^AL|OWP9to62SI0CH=PNnluof zVUHlUkj%V;b5X2~AWdqaY}@1z7%g#RfapE!AoaoNa)?!Q1GDgh>Vq=c^5x+(tuPXft;)3;pP^snauj!w+_{vnpt1!#GT1d=)Ynj4WX;P9 z=Ie}GFn&$Igw-EDfeX_QOs^Agk^EdEP=)R)j^Vn{Kz>QQdT>88KFOuONu73N5ytKYJDM}ny zOX4lw=6)j57|G3+OqY4HBCZQKcU$ zisdIIXB41LjN;7?CC>&)KM21#rykGib`y&w*?QbHhWkA6DuzcFxG;hiWtAuofA_6M*%?u{M&f@V}Wz zN)~MXQo~aa0+f+EUW{5dC4hw6aQ#NlEdVIAg#&7wX*QvY5R}>f6Mvlh0dYf^$j?9Z?!XncbVk(Cg zd<_f6S7d9)yH3@6smMHYMo9*xe9iKhm^;i4la!EQyHdZQ!TvYF!dyD&xZRcgb#p`# zoH!si2`)#uT1becYYSXIw}&2B5{<{bIq@BpLydnLzK$#n8re_r@P1W5P1HTQ$K3^9 z3AT4IyNDcin_WJ+gV_6`kU~o+aFQ-2s(WesnXh!x@ttUkIE^3}Cv&mGkg(jqc&>p| zw_!O0Dk7ScxV8I;-y)!cr0p*r$LIU&qNy&t3w~Fqd)|&vR zE7Z$IE&h0tx0LLq;^g&V#bb=Nd3UwSJPD4I_o_p^%6x;6l$&N=09bRHf&k_w!@$o{ zvp6m5U_KmOre}H08@Cj8aI+{zIFk5fe7UcfQonBU#rGF=H}N@mxWPrWJ--4vRTum> zDwZBNaimTC#pK@O($#e2rb#5GE8t=;>0{|4Cz@?Ut}(Jgh0%%mYoLKp3zpzD3Ek!j z`EbLHg#?)v^{vJ=Pn;{OO8EP{u!PaNUI&BgPu6$yYBjpk`)ZILRCtE{UOivlaaWzZ zV|*K(oW>K{(y&;9lguf%9)FGa=~`>Tr%ue7C_b)(p>tu1?(>q=WP1FnHZNM6mr~;T zV2zWx@rY(72R{_%#F%@q#QSmLodI_*l{+E_)~ezL%jJr_+rGOmnbW`Br%GsPkEC#E z{);Dy;CZBQYF#uxUin1)Y}(Nh-hnij4GH{mUfk22aljj<(gA` zUXH67gEx5nmW!tv=BcxTby1a*C)kx4snK|>7uc;Gm7lt|W+|)`H1MB{zSar7Xq^zw z4fTq+s(7G(ud8?CxJFRKv8*xf6au@Ud-hj!U&%`hEG|&OU;q)WFk-FFU!Td$p z28kaY#uwbA))%RY@Dni4^fnzE(cxW9^zkzte}RgKQF=bQoEW+`7uDLYCmydXAD7}iFK)aj|amP=*Q6IMO&QF`loZN8eP z>zg=?-_=rTshoVSk-&vB;%U4l=@lYH>UOe)-F6>IW9WzT*z*yi$n_sD3ZgvsZp>oS zdO{z8g9RCuFLCiPpJX%)QyVgs4^n5s5VS-j0UckiaE4{Nb`p9%$_Xh?ttaPkb@)tK z>DKnHd_TDH3{vTh)Ise{3nzOKrmu|M6`+sU61XQidw->k8K<$1;?kxdSW&uU64|oA zf-FdiaUn=LA>1tn{JuXo4behp+@sj)z3*FKw>?kBP{uHm%YTM#;)~MJ`gHD~T&l#; zUYB$wID7xf`dAg)#8LjqtHJf~16AZy#I3dh<|E#w%^s|Vx;L3IEgQ2ICHA{>jGLrO z-M@n^XJIM#iFWhBI1!+{tA)AzuXt6F2;o%_A@@Bh@QSN1g+}F;QplfGQ9SNkv0|DC z_0ppY!9cNyvaoT4d!_$gLj=da);*XMRb75wx>0#;`kHNG;ML$l!g#_g-9$l_2;pN| zy7_;U-Ai#ksfz?DxkdgF<6gH{^|!|=cfxch(m783r}>ZvK&E#O?ViW>bKaLiib>=D{f*r>+3Z~Y&wYu$=#iP!SQ4KuiYK>byA7lgP+&A;j zPk-uuG~YwO<&#&qlhXc#)EmJyT^Ac;r8$(xa<&T0?Ms^B1Zlo-@uhjV`}9+kNig4v zod+DMPq>>4L}xnGz!tUIwg;dWm@hKHiboet;fZ^rSx zl=}!A(G3UsKL2xMfE)UfYhZ;SpH4hy#0{GCjP+=`)aDESi%0ipUDFQ_2I*g^TShS) z6?^S;`D6dIG&u}4O+M=U67u||h&YdIa}PV@11qFhKQhnkA-s*~;-f3GuTzF$YZW|A zQnUE8LGx8de_Mo^O2Tb*=6ZgLMsTj|8=%4us6=K%{FxwbMW&GB6#K;`)fjIXwoqVc z&7rEuWa(KQyONf?2U@Z(*!A8=mz?cwh_8;un46CF(N9mBZVs-5xApV~IlA_+h2Sr( zglf3Cq!@zTJ4KL+_#PCON;fYW(C$VZKbLBe37c;n`H|iJi=-{>OiIkhr%`zSb4p_M zVs&a7;E5=!cZd4{+qgVQ48xY>6gqxAm=P6fKh)n&AdT(D5VLDY?G~S-Om7?OuprOU zpWQ1lu+4ppS-s-muCptXX^h?S`O7Zesu)!b?~9 zxD2f7PofTDKh12_6H;OPB(A!ut&z0dd&%*9IVBhwr>kD`;s0yz%KxG6qCaC~jj>cj zw(MjH*_)9qd)n+v(Sj^lLc+*X5hGhW&*s#Q&dPl#Xwz>+CT-G!1xsfq>1xYAMoLzf+mJ~U2kz0*M=Vt+YuTitx; zLqGn2$J*dwT^WI+R*2_lryN?ke%5C^e|&+oqx=w$-ErqbgH`ty{L9dO0g_DPD~*$5 ziq5hZw>rkyKz$%1T>{i4Rq&oY2lKk`l9(AS&vTaL&$mVaWZ%*|jX%6NyFUir*ZUV( z3ylS(wlt~T*yli)90}n|*MFC^-!$SIm#_I*k0)Kx&9Lb(FlF5G4npfNKGj-QM%IG@L@dvT))O}WADJg zzGo>ng9Jyy#qBruRMOnWy+Kx0HbPdPbrrB-GfoLX1fFs2Rhw$xAC8BY;GWyikss2L z@r@NR=;&J)=d;J{X4yKPX$#Nj`z(t0zpd!jW+;d((~`m7)9g`x@K#wj(XacmO< zgX6Y(BTBtB`Qn#e8477U<$Z}$%`R6F>vZ#SQnJU2WJS>o5`nvP;X?>z;IoROa6gX0_OCm~oxO<>vr!l4*0mln zyLN|JTic6gxEaj}`uLvv<-a*|CzQ}%^l)6>F}bQH)Ly?m^g~+Ove}u~@-q|8HjD?( zK+WX^P|3$B{UWIO?b5zylbNc&vL!n_I?Hh}-lU+hP%?I{^cuXpPV=Pn*B+0c1b=K1 zh>pn0W6G=Zt)ro1yFj{Sp4URMc9-n*0bFYd!y$A`OUt%4r>i$ca^-4F_a2#^`TEsu zXeUA%G6qXGn`S+s2Z6G-o(G33=kS5|AII|;TMBvOZXDntxf;KAokh}yUJ-;U69Ubnv~=*33X^^uwCCLq!( z%{-rTsbO`?nG31TP)+Fu%c!wWEs&l544Z23T3Z)--Ktov$f}8@f(>m#z#+=6{b(cBHUVm1$dY8P1bM#i>`KpDj-Y-gg zyIi#D%F!VUD(hV`sD_Rr*~1SU63feungo~*&H`lCnCFLW;Y$z7oEO96RnYM)*Pg#F z?<~xi6#w%&eLD*)=QUQoT5E=^5vh>LMG|rd-)MSwn!M24))za*`tF6hc>&2R)wh0Q zN9g=#H_K0_&DV~mCUH}#ByAnZ`nK_6%~f^D(n|pp`7N7m+fOkuhai<{)nBcam<xY37=rdqG%XS%K5$7k0R?r7+UlSS#+ z1lUs}21Tm_!)-To?np9zB81z9P4x8fGIOpU`!aBA4y&Rp9)^v`axY3qIL-43AtL|= zk>+RxmOB2J6hRMQUOOs9# z1NR3zj;~xXk(zEjr4}Eowzwrl~n1l zm1-=t7RZ^k3hV(}=t*=H^cj*Ea&q&$N{_#lAwhh#&gv*1UUT=i2Ez=z3-#h~2<0Dd zmF&KU(#x&31D_^6_dara@FCq?ZFQz5j=QuYn1?!gZzPL5+G()_azpi<{PwY*u!Ca4 zBlf$Ubg%5)um0ko@6^h&RAv8Et+szopYlbxYGMz8lU^|bItu>?9sjL-LAE6M@u3y& zsO+O!yRi*T(#7-yt8J)8KexL&$$5L+Qn+*aT11x$Nb3@zfiowHz2}@KUJfyKj9^4U z&6-dR(aOuUCSR{i6&J`XKJ?)E7TzF`8`98d(%7(4BYTU|#;9`VQ8hPz9yZrM=i8{R$+pXxxyq)V!l{Gk@7YBpYA9-_^*lsKFo@xBt{XRQ1*($@{d^Tn>QjM| zso6pW5@Q8J_C7?E=n2_gu%s#*<=>C+9e-g}!GRoyd(Fh2dLA`Y0#{AbI{utjy#ZIV zGXL$}G&Y02?Mh6WCVEY&H+i4MSEZg+Z=u4EMbRVCLky21TyU^u)v2AiRjNCDkV_=( z*(Vy`hKK^{eM?j3T;zI8qCKhHwjDg|LSa>e{D=?6slfr8iVNlCDc~M-YL_9Mv3s9CUJ@B{cN3pVOOMTryw&kWsG2q)EjpWiRSJYBgu0gHQ0U%IKX;TM zB_3GLjkyugD~Tuo9ZH{TR$%?xsWVei5!n26R~`}EUVLRCq7O$W~6v~=d~k3DghzYWMWLeY8?Lg65MI zSpfbn7*Z`>b5(dxL}>Wjp5z=YEt2;uke!GUFYG0K>q%YU?kH(ixhXYuWmtum{@k%5 zWf&$h96ko{e!G|Q;23xkyfDipr_bIx2;0#Uppe3i&U*0CqqpoPFDCUbKFQ@N#VGNq zI>#YDjZuMfd*qjzq{WV8J7upp8hJ_|LhQ50sr@Uh*{I1=6@x9y3m;jHRh_+#B zl5wlao8-Nb5tI^0r?g~`$~9!qAez{L+*UQ0odx<6c7y!Jzx3yS!dm;`C>jL=D6yG{ zKY266=kBFqzw1sG{T#>y5u@5B=?>3KaIMB=Vc|N-&BO1w+%s^0fAQdiF3AjB``PzMF@a~qfiVvj!<=Z|-x=QZE8PvHeQY3r`M15~^bmtOxJV+f&H zs)#NcfPKSN8NL+;jv`s|P+1$0AMilD;|*;Klhcqj5MVv{^to8=KFv-CIs=f@Fap<- zH_?~z!Hl`(WhrM$1f)?RD;N>Dn1vIOM71}+3*qZpxA=)L0$eGNhh$)CuGauBv{OBx z((0rF`9tTUO3xXt*Hx0x&&}0UvH$xt7N(4I1aIic&AfIf zq#s5RKIc@r>KCd)bW&;f@h6%bFXKa-n$Qf3Q#~ou0Tf~KfuSeB)g*+ZU6KrVBvH=X zv+U?oU)p6gFBZpz($}YkoJ92Ys?7gF7|!qEc#I!X)_rC=dK|juWt>;Uij3@3v_{7i z$ozc(S_N+VFU0UV=}RaeO9^c_rSf{Y$d{W_!V)@%?+|$D>k}dDh;$^45n3cUJbUnouX^OBO$+YA#i{$_H3tnDpb)n&gHG~rW54v!!_tYcwYkmk1 zSGr_^&u)A(ka+O+d7!>i(PPkF9qd!wS&r*?tJA;|q-uXI5u@c+ib5}gTXrz)fH@WN4)4{HA6)8?~PCa5l{FvVPEsX!lt z>;^~9ZDu8$qVrV{Q;o%U1i!o4og}tR?)s^~f|uSWdR-9xmxb9Dv_7+>4MDYkj(NfJ+L%>?~xzJJD^*m5nyv#Z2dG> z>Hh&;9heh=z`61cK*WHP2>z+Fjy_0Z84YM8K=}NY&Kd-XauGfMg)_^gj8O;?!EumE z>CquXc+ycF7j~ruNo7f+{8W*BuYiFj|6UQ1s?8q^q*1=wfTlK#S3w&Ep4Io%re`Z0 z*$|tltnYJzt&@OTb&lLt23MM1PodvB+RK|Xa*abO6VWIP^tL7HsTmymvQSXNReI^f zAOH>d^ja+N@(Ic#d6O(nw2eQ8uyBBi#asmyJ1bqu38VT0=N48ZKXgc@2SmAK(8>av zM^Mgnd_l1VuM_&!o#IGk5*)G7LIj~<0uxNB)N=t<`GU%c%9kIvl`vKeQdY!IJ~Cv2 z4vnM6X$}VMK7^Wchf*vH(%&y*-Rnf8E;3X;_`+>SH^yUe3C?8F^a12N-X$|Tlc?^4 zX6KJ?&a%UD69d7jSiZz;fNkwyUEhGh=aM^TWKbIW^x?RO4&-KrY?S%tud52yMdTP@ zxB5Yd*R2Xf8Fj2bGGM&)ffh>V;Y#NyV|)}mLpqJpW%i|Wt?<#4K^0N2QEg);1ZdL1 zG4Qi%orMPhX;|gg-!>5%rE-9er>M3B^oouO80s6WPJbls$HCc2h-(blAQN(s*KDL# zf!CJFEa>BNGueXa&m&LWXh4%Go~8tg<@5cv&fX0z%HIyYF%B+g!KTCh26-xEhy(9a z%-{cUVnpWO<^!D*@$|ngOh&=S>3+?WF+mR6o)p}Tqi#LHJG@ro&Fi54#!*)?`AgqIf=AXPtC{#26E| zAN(HJl46P!7gbTi0r{G@gcH4I5RB>rH51Gc(gLvc*?#sj>$C7_CijIa|B&C%8Oe8V zC6eM_1;g;K;HJu{cMe2Qo@NWy2KXDvXPyMa2F^IJX(3b$9mwhAoWnaT#DwWUK4!|EU9!+QAqr}W?MO8lM2NAARi?3 z_WZ$doiG!FZ7AD)O0uO0pPryXZ`h5dOrm1Xj^r7vYP8wLu3VKmnCBYkL9b$w0T9^MiYZS!2-*C(Y+qUJ5r_zcMBW_I?XR=q>TM zKp4BhU`hkx&qW0~A7%|4@j-Cbw98TD{0Z|%br#KoVL|vlHC7bIL5vej zxB~wMA9=XaYCl%x$o>=+6C=u{gR~#fI0zaRovderm<}qMnwN>%@IaHukIF><9E`xwDJ27p5f>0{gGJmm^jls9!EzR&;V@?d8}zmzG&Whr~9G@d!X ze6Vy(l2;UvZWy?fBzZ>t7E3=xtQ6FTQ{dzeo(M+(nFHHGPI*V*_ z&}rnQ0;$pe+zRZMzurUss{$jFe@u&ocBuRJ+wciO^*Eq#4jIsYo8aW&{oftXWb#`? zKb7OR7X6gO?~V2^Ui^lNUzDt>N|-%#;W62GD1H&py~y#9ZE)78y*{+(YMo}Xo< PgFh2POM|ilu9yD@)d*=D literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon128.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..9c878460b730176a635ecee798b8d57899f1961f GIT binary patch literal 6347 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 DpyX;e literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon16.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..35c074e65fce35de2c52eb6ff6c1dd24443dcd91 GIT binary patch literal 1263 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 R#@qsxk)E!8F6*2UngCKxVE+IB literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon512.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon512.png new file mode 100644 index 0000000000000000000000000000000000000000..640e594251def3c35281db43f89760401fa4e290 GIT binary patch literal 34732 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon64.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AppIcons.appiconset/Icon64.png new file mode 100644 index 0000000000000000000000000000000000000000..4027b6bf9adaae773747c9f0e241079c47e5df0f GIT binary patch literal 3107 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000000..a6e8f990e420 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Icon-blue-1280x768.png", + "idiom" : "tv" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon-blue-1280x768.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon-AppStore.imagestack/Back.imagestacklayer/Content.imageset/Icon-blue-1280x768.png new file mode 100644 index 0000000000000000000000000000000000000000..459f3f221296ac62ace390fc71b680834517ec9e GIT binary patch literal 77516 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Content.imageset/Icon240x400.png new file mode 100644 index 0000000000000000000000000000000000000000..c13d206cbf2b934b00c994d1de49e6892eb71f11 GIT binary patch literal 20204 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000000..73c00596a7fc --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Contents.json new file mode 100644 index 000000000000..de59d885ae8d --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ] +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000000..4d96e08a3eb1 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon240x400.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon240x400 1.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400 1.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400 1.png new file mode 100644 index 0000000000000000000000000000000000000000..c13d206cbf2b934b00c994d1de49e6892eb71f11 GIT binary patch literal 20204 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Content.imageset/Icon240x400.png new file mode 100644 index 0000000000000000000000000000000000000000..c13d206cbf2b934b00c994d1de49e6892eb71f11 GIT binary patch literal 20204 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000000..73c00596a7fc --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000000..4d96e08a3eb1 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon240x400.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon240x400 1.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400 1.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400 1.png new file mode 100644 index 0000000000000000000000000000000000000000..c13d206cbf2b934b00c994d1de49e6892eb71f11 GIT binary patch literal 20204 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Content.imageset/Icon240x400.png new file mode 100644 index 0000000000000000000000000000000000000000..c13d206cbf2b934b00c994d1de49e6892eb71f11 GIT binary patch literal 20204 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 000000000000..73c00596a7fc --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/AppIcon.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/Contents.json new file mode 100644 index 000000000000..9b55b2086ce6 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/Contents.json @@ -0,0 +1,32 @@ +{ + "assets" : [ + { + "filename" : "AppIcon-AppStore.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "1280x768" + }, + { + "filename" : "AppIcon.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "400x240" + }, + { + "filename" : "TopShelfImage.imageset", + "idiom" : "tv", + "role" : "top-shelf-image", + "size" : "1920x720" + }, + { + "filename" : "TopShelfImageWide.imageset", + "idiom" : "tv", + "role" : "top-shelf-image-wide", + "size" : "2320x720" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Contents.json new file mode 100644 index 000000000000..8e75d958b544 --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon-blue-1920x720.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon-blue-3840x1440.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-1920x720.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-1920x720.png new file mode 100644 index 0000000000000000000000000000000000000000..024f0ba2fa2aead5dfd693d47099ac307e2cba8d GIT binary patch literal 104014 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-3840x1440.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImage.imageset/Icon-blue-3840x1440.png new file mode 100644 index 0000000000000000000000000000000000000000..73af924f80a144fc44efbe3236e10dafa6be5b42 GIT binary patch literal 351834 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

    -kUJR9zf6qut|@x~<}jVZ^Zpk@U!Y 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

    ZGIQ?L`|fZ>{B4`O}P$)PYs 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 TSGj`={5f^f_~-neF5Uir4zA*B literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json new file mode 100644 index 000000000000..5050c073a89d --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon-blue-2320x720.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon-blue-4640x1440.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-2320x720.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/BrandAssets.brandassets/TopShelfImageWide.imageset/Icon-blue-2320x720.png new file mode 100644 index 0000000000000000000000000000000000000000..a831d23a64e1e0cb9d8a392958041db121fa8c40 GIT binary patch literal 120691 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 z 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�A}de@Q;!y> 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 z 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

    &kOPu-aEQv1vQXO;%{Z@L5AU=|OzN zyR@Gv88%CuXLwRnV=tYk9VsfVlpTqhqZ`0v6>e@1hlaEK5^#aY3&vGpX+MF+PK)XvaeyG-A56HJNLuG2z%qwQr1f7B0f?Fk^bn z1TY)V*`9tCEKSs@OS%G^=zu^+9c?NE8lmo7(frgq{(ab;&DatD(zCn>Bx_Q9`jV;> z0(mra^r?0_!`ZVs*I@Tkvyp|D)Rf&t{hgln^z8`BPczNybmA96$w3#3DkQz5FU#SQ z1G11$JVa0)c05}5+mDS7ZDh?3OnFN@j~EIx`T;J(is&025;LOFdId4KB7+Q!6u+`3 zXGu=`_OG{R0`$|%`cGs&uo?32;|{8}q4NOs;De5>(iM zkjmp(Oc3cyNztf|CCU+juP998M zXfJyS2n6uBy)fAlFfvo8W7zgV*Wyb|_{2UZoI4P(j-|zUM|={L`SB@N8wHOw;=B%7 zc&zAz?~z7H8EIe;ngo+hXR)etJuStAMDTF=-i%>Y!GeDd<{kbD_>kKFmM%ve8Rfx= zYlh(Fr!Vwh(F6$!vA3y&GHY1KAII)|w;JF)Wjv@n;0V@Zh~7E( zf5Rb!=!qbR5|I!+dh{Mqq7z*rdXL@>K@vd{(L2!@Vldh$DG1S`8!Ztf#^^?w;JM`- zCFgtc`@PR^<$c$BpT|FE&B`(NT-UYt{_M|g*NsVIY^-1zN>-la`z5er!l((z^FMSrmhYOm%f{C4u)K*Rw58GBWcD`nJ}NcJhGtk_&wWOD!+~A?<9L>V zvX1~}4W`lEMZOGLiT7P}n3BOc=6nWbe)Z5hW#Tb`Rr}|+tuZn0YfthV5%yL1t7G#> zY8d~fGg4Ao@75RVVed{Smn9u>MUN7!x8ue#;;pa!0$j0)V0vI(xhd@W8_92Kh^CO4 zbNTZt%WBjrjMawG>*SzuM5A6TkYW8B2$uZzv-I_WwR8uxYxXoq8<5H)%qK>w^xdbM z1?D$m-9KHBaq(oxKE==n@t}VZ^WhdA2HGTxJM8pz67n(PZ*K`_rQXzE>LP2qe>p&6 z9M6#rS+CXnrfjdD(plsp=9q38@r$vDp3|Y^HiTrjF7shquSSJqA^J0`Zhhb4l(R`= z9y2Rx^lX1Clf;{?{5vIyfpz8%;7mdKS!^T+%XQ3_P^}#B&dZa?pvj{5FH)_b1M;Zp zQTix{{x-?)#@dZCknVF~`HUst?;CZCpH#j9>D)v5_}8bk%m8<-X^^*CxFn@yja{O$ zt5Lrd+%+%G*UzihZ@JV8J>k;v@JZ!W({pAtbNqq~6UB4`f~$vFtfU%1=ri^oUL8DG z!WjP%hNR!Pt$Sgw*Q8t#zt`IpgtU)rMf9r?Gu;11SCAwwg(G;2dE6poc6fiNl?GN-1 zl)i6TmfC#y2c>-6r0Wy1p@d}Q_N-UBom=JB2GtvBby_2XjxzAVoyd!Xk9y?#7y}(f=^b^Dqp4!9%iM! z>bqW6x@{6JK`6iafF)k(zQZqn+?4Ys$~eCLO4`2#(-sti7h@x(&VKn|@hN|!qP z0~>ib*3>DZYZ4P(b;aCu2mMAQf{yzUR;AWkg2M^VZTcwAfi~KE4<_;G6Es?#iD_9Zh3X?&q|Y63iofw4cfJ^yZrdWOGLD5t+qD!= z=?Jw-zoziF=QVd%2_MdhxC1Zexk;_1V|LcC2fdb}8>hInW2oapePF4M&jCylYOx9R zJfzhe=>ZgsUc;9=xi#~l^U>`ueI3l&>LAso{$=SB3}gy-C3>q`fgVQk z`PP2@@_^a=^{H|blUCwF51&uzXax;6adOvA4&-c&21t5?CZ&X!#nF;Gy6iPK(a&Vw z-|D#Jw%;q0Oi+9%P25~ub!mZ@EmYN8ab;$~RoY3kk#+{)#3;Wyx8K?F;vvIJL1BuZu(P9B5g@Hj@-V1$ky>b0_ zH7e36Sot6x?{}%OiAIYW(h<>4vt4)PK+@;JW-&!;`I#K$O@Q+3!R8!T0WF7rUcxz8 z<|z;aySA$v{}L?A)X*@lDDU}7bkR#u7ogmn^8uNr57B(^ewyK2Sl;u}Zr0@2&sS`3 zryQN~U(a>4$Mj<#>vpYlmmu%C+cR0N4bKnH&Uhj>56$6rTa+5JPf09kYr4e_gyxo< zjxFPg&1O<2M`HKT0nlkI`Y}Lt4^(07P8zj*Z$*}RyV2e8H@9Ae&-&|+zL7JuW6-+m zDa&o`G#U#}reA8&7vnzM+rcgys?I(FNz;<_YIdo<87gJRCNU(Zep9n@yT%TvMu_s7 z>D)1A&->JHgKzFE57Cx@BblFlhf?t2A*VUtO7>Y0jeU=GD9lr!4MviRM}@gI5COMV z)JPr;dTgb_*R<$Cr#5wrI)6r+`f}PS$Xree3rzEt#o~A2xI-BEdrzQyq)T(u4xv42 z)XCNbW(9L#rOtT@=i4<7LNCSJT8=CLJ+(S2W_BX+C6%Q_TN49AynSbxkGwpIpbD^* z4$=tdAqwHvmIqMi@%OSk%;_(U5+?Jub$YiOIhlxxQh)cdRqmCV(7Iaq4Zh5^x5^IU z9}oBRx5OGs@Bx1sdU~t8RD8^m-%dZ?*WuH9Bpod!G?7furB9~c{8rQ)m`!NjfKB`W zbOIW%$$@@M%%Byg19_jqG{higw5|}=R%QK23O7Teo)DsqRW8`7b^5lj##ySH!dKt$ z{8LT1USra-UFazVx{huWK8(?`w$7YL&-|FX^KK|<^bPR(q4fimz2TD&eYl=a9%6bDcGy@Npr9!VFAKdC9JUhGtQ zFdqR_w(Gd8ZaGtiU3YBB>Cq1aRS5dluEe_@81qB`9?+B^p+f*U)MkQ&0E&m&eNP|e zX_luJQXu1jUJFOpX4=ub0+KRQogC6>>@+jwf$q}|p8qKz`m zEeE+r(q9v9&L*IvqXj;J z($6p1+}CQs8mLjYcHzPK{OgFWj8dZbQq*q$gQf*>-g|W7ytG(EW~Mj7wjUh>J>2;y zfC{3q+6Ru5zy%w1=Dbz{yS_GkcMsq-vq%$BQ&N3}LvIT4ZZl=7g(1dj_<9ss47Bi- zAC^HVk97X$Gu9FVa=!JEgq(K0z*Uxy_@a<`FSU&c85^NA)I3cl_!``Ljr**k3`1j? zWS3e!JL~FUS%ba{3OI&!WWH(Bf%rkY25b8 z1)}X{-GExA8@G){{DUqn-MHiyiV%L@;~uZX7+4cBmUkQ|<^F9}jv*2x60ddMnxw_x zX$uq(di&PgSK+w+Sl%#EG)*ESqFNYjB0}}rp3{0edyHh%cYu=aBk6%69%wX2RRB=+ z=Cd~#D84O=VK-OpRzB8MKvQ#*2GZFXK4jM_=<-f!%>07jw;}giyvg;PwQ_ae@EZw^ zXs%vua>luLkR@a0OaOE7i(!V(?LYKsDPX$2`+I z-cwfS9DVfqwX6Qb)%>g431z*PI_yHT{?4fVy`=qsln7}QxgAu&0kp}x7>q`j_pMCT z$9)_godeH@4As(5w%wJ}bvt{h`jySI#iMU~uf|j7lkhOY`Wc-fZ3NRZp2S?C}h{<6lhi_CH*xV>hDs|%4LD!0RCq58;K=cT3xpSxu?geBhT_qRLk^b`%OVR3N=;h@U#T>)f42FN z(FUh~_?WdHA98K;!h!aj0^u_OxE&1n7Io~rN&{jcG1Tn(9NNf_S<2|dC~S08a=va6 z+3SE*9gwYJRtXk~;Wx6z=3l+3G|R+5;#kYobQ=|7+F{jqF&g1=B(iI5L$7_ORmbcT z=%5AHnrubLpt+^ryh>C#?Jec|?%EzL#g7C?rqcDFUwwRNb|knSipq=WpYUzM@EC=_ z6X_PwFJ=?Nu+cgQ*>%(YimmQPQ@0qj`*@R$B-wqAT;N}yfb;aFz7DMeNbvkxG#19N*Gv}K>f5I|9)aC zMZK=gpiS`09TPJ+tuD(To&Bqz?BwRpPUX1aSdDT(bX3kK8Vt3S`Nwh=Wz#0vb$K_} zAIJdQGMc?WQn4Vj;FHIDKL;@jcR*JAY+fv};t}RkhOw34Bkl~eWsm|V)2V$Catt?> zcj^Yx$E@|!wV|mj_}$Q0eAId$jd$5y;%k?}Z`mmXLvKfq^J^|pW1UxvtBH+l{>O4G z&dw8FS`pt`%?687=(CI3z!yJ73{h|-mLe=x_@i#?36WoQoMn?vIbvUHu>kt)l-I=_ z^ZO92x6fpDOL5NI0l|CZ9Xt4b?nR&aD%wvgxQ1mm`I!tGP550F?)%EHkK?xzyC7Vi zhjIU3xJF{Y>D8cWKyGJN=UY^SXa!(qUOed&v!i8`Sm8qJG|&Eh9Mu)y=3cg+IaL3& zJ;0yN?YXu9Gdl;`l5|y7qj5nl>s}|=c1W5DI`1IBin?Ew?z4KuO%)bk7>K z|A?^+=q=MS8q!~v_UEs>Cr7Ze@+Vf1(7iE^lZX3;UYl>Ksx^#hyUTx$7|iNEo`dt~ zT-BMQ@KK^3AQ`>IHW6FLFz6Nr=O#O!UWFcbC{i1WeDgsW4exuoBM*{Y{azUk%;V&J z9!&$fnpe+Ye^}gn^5fj$zJ40G2?_R(>MovvYc4aoq5ag#!dcz-&!M9YTE+5grRjP$ zK_71<$}_PkKnFRR4tGz_wO@H89K|~e}*2=7l1}Yy69?^d^P0?OGRod| z1rJo%DCQ-@jjwA4`h9AeypgDxYVH)y2g}Rrt`W?X*i?R9d$hIvPiwFM0s1G_YX)W2 znq_)5b_MM*R532L{QUR#hSF(HY~{4RQ>+TzGPN|?m$D^PZMd+E_*lP*tu zXfa|O=?_xKv|)oa0^?ub5I~CmwzGM==v3;&uo5} zlmi%d7#pBOvS+3zkGuj=oy0{zD9=^3uFq41X`y$4sYldDc65Eef;o#Nt(sg$8^bxp z{BKp$jWS+Q6kI*m)+dUMrw@}^`+E+Nml&`)#|}0w=vyCzbddK2uU8t?N{&YRepz}n z>SPIY4rj*bOsKNuU+1F%NlTZ7m*gJPY@q$FTfcOP;YhQ&@IC0&bS0&mp=~HwbfB-h zS#w>L)|*%x_AD6Pn|P1+>T_eCPCwCOu|QqeI35}7OD^^f{j8gk@gkuNgI`g$Cd4MW zLTjy6&G6k$hfjx?vuzVt9cp$Ho9Kh9G6j)A_wl45E&&A4p?9??UAF@yI0bUQV42@g zl?!e+8e<#Mz+?2XEw|hQtG@Aq*g^29o;GDlEFB2OZhN-;v-$JY@k#BG*VywA0(2-NMDXIw5fB2>)of0W zn(wg~dVBA=pr4gYMpGxf9O|>)9rOg3 z*-Kwxci+B`zMd2-p_-m60ZzvqU>P_l|)b+#PxOTbl?xCqM_2hhoeTCav6(2{}&yb z9lRhqTbIEc^5R?@Yg|jubOF+)>%-8NFYDqFl>M~ZLDmUmx~OGKaa(Kag&OdiQR^We zk^An?t|G&LrlbDgv)Dvt7X*8e4~Kb3u#R7ip)wMaat&fWf$MHM~N18qZ(PsFng0Ar&Ix z*zzvmhmfr_NV>0rqipT#==a>6Y|PLFVSZB}anLp^#FigI^NZpwjRDBx`X&1%bQ!y7luGx07xJtw#p6H$A_ zeghh+_QxtX6qJsl3E;4BJzlu!2M=8(dq6kN0f!X8QRP4>skv4D+tpF$7r9xc=fV(g zW|&sK*L;}3B88o1^*=5v&}FivXVPEzG^B`ys>il_z&ZRkNB~t?mh5Uw+)ZS>P-2O6spjpKk zqFdvA?=3i)7V=$5oscg>GDOEe(c=2CDh>e1tNX*qKad_whw6O_(*oBeth$Di@0Ff^ zL4S!(Z}LzS5L#U|WAyU5#cn=%PMG`rn;Y2Y`7~P%d%m4hsP1(9cJ|oUaS382E(%`Q z_@GS>WWso~6YwsnyLank-A6f-W}=3!kfPpH)wVxSkI@X#sgGE(;rbd9Vxxc0>c}N< zr0hG=&KQ*=LU>UfR6+vRZ|sNL!3+84o2i9SqgjEzzCh;bI*YBmf1;Xp24#6%(cBxH z^Rj&Eo1(9&3B!(`GYQ@%Ulg&LA+9IW16NnI3UJd!Gs9bk$&Uv`O>d*Ou0**Z(r+iW zWwWJ+TvWph#pF32<5zY8k~6ea6C*xmUZR-EMjSf{c#Q%qd}vTLpSMqy2{AZ&KJO*> z`Md_7%al;7^0amB3PP9w0R!IRhR-G9qb&lg0R$q!1xJ@Lj(u=eA5dI3hZ|{~0%}us zJ0mi!3yE~lNE?v^x^gwXI-sLNqR@@}XOa6SyPY_-KL;J4Lj*ZY;?e`1L9jFBS?oC>&XArdPPL1l>lfwwd7Ma1`d*aS#=J=@pXy0^~5a>PEq z6Rrh}nPh#nHaK?{Gvrk+U!~YwrmUIvv9q341eoIX!}1$FM?PSOr3=x`*22-Ne%s?V zNTwNDfcm7+Sm$!Thn87WQ;4=4TNd9;%VbPFuli|kdsqj+(FV#pe2$zUJy$K}Jz$od zg4a*9tj8X1otYIw#*Vh-uu4s$fd~^R54vjHq*h5Kx`bDp9HJ9(^{`g}xVpg~h`ol5 z9qI^=>65@&UM+4TfK8W64b?#nN{S0?AoYXl^e+^KotGceMBFOMwz6iijm$6L!F)0% z(}I7r8KA%G6n1R^_hP`O;(Ju>F@d3a+Fg@qGG>=H;6?)12XDoM1ni@}zy1*YqAzDP z;7a{W^(|b2yTtDN2X_G+d)9m=V14Mv?K;O&f=hQW3C$RX0n5ut6h>{d!BK;A5xzyL z!&$qP#j=}S+|UiVd$mJ$}RtakO~$KbcfgXccp;VY>mJnS=RaK8u0478u?}E$i)* zXX0O1YAT+~%a)#98TB#OjNyvpoPTQFC_W<|{){(WBh7JWqAyv*1g1)Yj8hr;`pJ0L z^t6(>SqZzvQ|KTnERM68fZI=^D+j89vR(r`yBuJvM-7L@0eG>i7XY+8|8=$R*m2cn z1t@gF``_g2&4HtBP(6TqT>`GTSZtMl9c!oHpdiCQu0^jln57Gi+hrFIr#PmU`-GUK zYZ;$xC(`;7<@dXWAQ>hRNBIHXdY;t%GVb6lb7wcU*f+KeauZ#$hSWZS$M!O_pLW`+ zTIM+B4p6dbMSJJwgo zCsTnt>rYG1ld(vyj$64Ba#4ic)w;T^>|6fuJT^}k4Cc7{mg$!>A~`#|%|L)-UD4NG z3cfwJ9%7jKbg-E78?xeElpBnjsNGDx_2qE8Ag_!N8_O|;@dfHjYU9OHjO0%MYY0hfDU%T$>Y=cVyql#NN8amd~6~(Yg$0ncDd7 zn|8Mz(ZGIeCAhV^X+^9!oq`tzuw?+cS`2k@I_IKej;aBOko&z6`=mB_x6iQpn?ZZ1 z`R?uaB(R|+y6?9aEiZppW63?1r5va{)DE5~z+Y z^j7%lOvY*}x@C-%e1Fgz!Dy=8FC(i=gMj6r&yE~(!vPIkcvys_wUG}9pQI6gizou> zLX(Zs%jeJ=&Q>*TK!et``GmY1ZSPG-!L7YeN@dc&27V9K_Kezof3raW+Yv%Hbm6(+ z@0M>qWnAfhODpdp1(NZvS1)m3cYrSzM}Nv!PE=?{KE~T&O~?j+>`M{6SR01<3m?8n z1hQ{=9vDzf92gvtn^^j^THZ(-r=>nF9Bx6ef?D1>Tl4UKZ#K_upmQIqhc(ZtE8w2s zYv7`ZBdMJ+2A0)m+{||QP!k%SuY~)w z;&FgCj$Dh5XU<1p`K!23JiX@#C5$=hr!o-)Tsu|AddIOsIYCrF>{5YC{W+}jd_TRr z>;0ZxCCVpbs{9#bz^qZj>Bkx8Y&;uYWUt$IiBO-5#(Y#xYP$E3%8m8Gwsnqw38^LmX(zK$#w&OrEs5V~w@(p6J-k^I^*ueo371RBP2wFU5x zvfo_KFfE`YD2a@Ay?1`qb*7Oi09n)>s-TPRdl7%FR(mu-R#S39Qif1;!@f%ncy}9p zH<$fQHlCw%ra$WuqE3A2sr4nTG}X+$ir50ea$3v8&-g>)@idScqHuV)v!^g{=SF4r zWk<{B6{ljbkFg#1{i=Ji?4mA21(J=Ct~4gdm{EQz zsEUdiGG?oGf6y=3po!a?n}`sDIP6%MxSwvrd^~vJNV7;TN`bhZw=5!nJB0cZQFG=% z6TfyD4motbjrwXIm&|-?Tt4M1P|K}UZM&$TZl3cmqUCXqQ=dx`7~<|5&!mCYnx5Rs z%dS=<6*{7h@}tqCQ7S_@06J=$QCGWJe=_I3uGpNJQ*#4lbLv;~U;&mCV(khkIZ_0m z(U0WJ`Kx#56O>prho+S=Ls3D^S`DK+YVXh*>mQ3Lzwzt zL$NwxsGx_^MbXhg^5Fm^G>p8|J0W$+*$8?AkkWETYoOG>9$ zwFK>I+(1V%ak~`+hJX`Wht0O0DQBOTtVoaBusBw5*ax1ZtH3ep(u*7=lK?^nG*g~l zr@Fzaoonh^exHLS&azw+LRX9&>;YI^di&EI7&jUA3n?H8+52>>g!@8xp88ujk2lE+ z_m~O86wj>CNURHIk2Q}0NkkId⪼7;{FlV&$eJGo8uxTmb#-+TB1FwiWZ}OE3}b= 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 z z+mo+dnHqhvv0o49Uj@B2etg!=L=U!)d5I>PnK8^UDv0t)Fs z%~Y%5vderc2d|S~Z1WZ3k5q@80AA=n_Y!c|I&uNw+Lh~q&<_w<{}D49+~Ml3E$t85 zeYZSE(Y+U&u^P(&4n9e{P*XFm6r%wCBBOrnOWa~lYMdUHM z_R6(XM$@=Tq}_tzgrHu@VrZge~{)xp9hRUM_F`(AM52J6GVW zt^?fGw{ggK_-s1?06qSh=j%5rvUNrEEArvXc^T8V^$(Ss zi-+YLmp^VF^N4jsYi)C+0nTFwntTR`pC``v+9*u_O+;~$4&lJsXIlfx>KIXQuD4^p4xwVR*YagbJV5dF>xcP)`>}B= z_3*c6N^(^I5!HQ6uD^i{5N*u9GX%v9X@B)kSrk-tDo7@4f1Pew@mIr5oB=htR4y90 ze62k?&bq4`QG(&`XcYs2Pn6|FCUk7y_lA4~MHCNDg9#0ojL&Eq=KzPIhMi+wzN$~t zT6dy#M9DX+V%Dzy@3LChrMbAl%EZMFSPdxB3g;4a67qS3c4iE z8hMtRKM*(I|W_S3Fol==9a*@(Uaj5-n^cE12F|!~yTnD?<=m%Pz z;*$kZ3B{K(y(`y8FCbXdWm_z#XQ?iS@S|%B;jpjnlQE~u;(jX&N8#3xSocp;0{`<~6 zjoNWv~*{14fX!B2*MH`E!t90qeQk zyZj>mrj3AHA#ITJ(zCx@vlvhgjF7ZrA@djF7jP@%EpOBP6EI7RoDVA??jp|MKn%BLdo z6+P%_Y4qv60TgPXNs=bKQwIdnsqg5+m@#3(!jgltC$j2( zeN{_6;tudN59R~B&jr9lej(ri+#_tQxr=MCtZI4fg{il#hYm!6A zT*)+=mSs#;>;*RQ=EPwWxj002tuTxU2Krkc3?-xXc6$P-%7W|pN93n9FwSOg&XLM8 z;jX@(6OExX`lBkHNB zS{v{8WlDwUBzyl$BU?o5E2|r$YBn`p8;ge@<5zxJCDXM*GS%2Z?P`n+M57QKsEVqpke`m@4_9i^|2+IDo zVnC^{l>TT%<|JG^S7cqQ4Y%7AygE!VmeuKuPL{<xv$yU@$hvh$4sQFTYvmClUn2K%nd;*0Crn@>l-35Y zjB6r#0N{5UeVU^3WP1B}D#YDTR5|k;>k5*HN!Nvou|Q z5_H4HnsD}o@6FIQm8a0SWa(#^wPo2D7@{R7!i{|Yc zJG^wyu*`HCxdY~YMp=)AvMaWfcS;ZQfe>|6a3tb$2rVXJT(?G%_(xP2dKTa6S_xuQED47;Qo((0ORWGF{x_loxYeG+&nT z*QLt>+I1OjA>t*->6T`eu!=g3_Cj}vFCE*(9pnL%t&HyFk$?#&8%A9yGc)f+0NzrS zajHXk5Bgq^!o&?QL3tBt>741aK7J{=bAJQ(GgeoD#Ohq^od3@iWI$~p-h#nwb5OXv zxr3u5RJm>dkP{C-c{$`PdF&-HX?8L4RKkv{X+tTXLxeY{T!m4EDhz5DI!w`1`AxrP zhoDsO*tK;hVzI-9^^b=~bD-vg?hs?RMNF|6T{cx{SW&8&2>t!~&}49KH}Q=V|-g)Q)qVaHvUiJ+18& zsC61<;p$^(X*M=--_(iOt|;qa*b(()35+d<;QeH^&dih@;Wlh(i`RMm3hb2M)lFy(0KpF5^>{1bBxpp{c}8)FZqB7F5Ox z$EL*9fJ^kr8}WC1!jW%sUO#S>yzOR*eF~|x&f}tzkBl*r|2^k#IEAZ&mABfC2OO*Q z%eY*X$NS~D4q<&(7QZAKm%O1FTMCHaqJIB!>G}cOy3|L7x@5GvP4%CyfPAbW@2(=E zFoK%rhl5T!zd!e?me{{ybnRcZ`N{lUOH>h$5zr-fuaj?0vaT=%bc{k7!>Mp=VT!KL z3ghj$n>Hl4=^1~@F?a^QtDp?%@a$=yik95<%_g2Ih?J?m%;z!kS2^iBNm)^5NXx!bH|^b>Y9Fj!eJ&OZ5}jf&AHx@l3gM> z&=x6#xr=H>%uMvo8=`Z0tXky&_JkW}tz^P7U~nKdXShIk#1tda>>9Dr$90Fcpg}Pw z!G;3Y-hyHVzNx@cXZKx+*ZhC*r?TcBG zg4%B05$D1L`|d&ap#FZ+Gd^zPRv{mLB{TuYVCb-~!S9Dm2b6bj1Q7_qv{f;z%T;*#(uAgL>rAIAGz=acdPnzpy9E8G1t!Co$ zL$)j)HZSqoafTmj|L2ghqG)a9#sW%iIE6y}emc&DY^-PqDA-JVvw_Wir}cI#hDBqh zU5a=2ax`nuK>mmo*2PqjhKRHx+-YIyup3Yfqw0~pv)MC~>1S@B>dvDR2 zN=DFym8_jh>8=qDk${LZ047gHBRd^$t*p_Y?@8i?%g^GVR@n7JEUYksNQ8E#mG@7- z^6r}a8_GR&gzA0(-{`l}ep;I0jC+VV-Fw#s$_b+rJ8ZI@&l*=CwLv2@7KCi##NXlV zlcr_)Mb7kB1k2R`yb$1CI*nZwwfruP7Wekbjp0h?j9zsanXuLWn`-QZ7@lTv&$exUIZ;vVFTv-z(k$vsD&${vl7?wJ-O~Wd1rm5 zVY$i<;zkIEO|T>|iFw>RbsuDaudSaVTGe3~GrkJ#<*?)b%bTaNRH zoTn#|r^%$7X1%Sx_(xpxr^!5F4$S(^vqb4OV>-YSwn>ut$saAb7tk5ghy3g-IGPi` z1%q#zZ36UO@`0F^+MYl{UqE;}Nf%9xa|&q+dy!g zv!y?qqhw7A%U~{!@w^~nE2AR^x?PU8PsQ>sbz*AB= zpwXTBS0+nPh#Zt%)t7SO*#AvZD>5tRf)X{G(Je424@7uYt25EClZXl%U7O*D5yrd1 zQuBZ>rX}-@)+1tP9W3mO2EQez0=$7taZ{OEfHZXws^hwh6VRttb%N0nUV&jDF3SM} zCb~;p%JVxkcL<1;dLMV@qiVsZOxnn%mY-b3%X^KNd>9;NM~kT`T1P%>xvbIGUEw>S8+Z~&sG9I#oXsR-b#rV4W!%eU&g+I+rP zCbB1EVOc~gIKD`C!>S>UlUVzQSJRUQ>2sET&Wp;;u(zP+tl!HOsy7=VI3n9rxtsa_ zgwg{Q7`(#R%&Iy^(@l}9N;!@>Tv3ge(rCYU%Un`A@7~8s);SsqtShWF(GH6bAD`U= zcuQqEmJQ(#ZDvRa2Q>e9-v6{1Jm`T#?L~jvPUf$$4?qM=kT3_mW(~T@Lu=LKwVYFc z&T19W;EdIo;TpPf5392ZTsmetJ;~qKIqy5x0fkjx3N`N9R=kvz?TkNV*cd~demX?~umS|_ zopirXIc?U>tC4}MZ&@JxBK!2`9WdJq-QiZ+SQdz8HNn~=Y=}DbmIX69|UAaHj zIA1;*%cWlo{PF&`h{u4Ecy;X}o^6LJh6_M?&yh0eP9xhHwlnf~O3!$G>PD9(gd;K* zR(-?_8XSnv<-6E3vWTpUG!^#n4Wa+u)??Z>g8-R(`&*lo-xlRRNTHdcv4i80p91`b z+iH{?(=c!|(npi5LYQl+MpWGuK79E+pv0+t>4?a}m0Bnpo!n_?}Rqi-Dg2o!0Q zPr{|zbj}RS32;2)$sSJ6U|dP}DkBY$87e&MS6e;>7Q0!J!L|dUH^4Yv7dnX!I+X`} z)9^08C1K?JlxkzP7TjTiE#l)ls6y?w+y^Bbv#jF>FM>QiUDZVmYDnWzfv$56bim_J zkRRIbxF@Q&Z!VoO@|%`Pi!K=PT@5rj6DTw9+KMpU?5NddFXJB>`CdHzm9j4j$`E<2 zG30u4EdGs?o)?$$)FWrc%@AAd0PdG!^OV+8`(HPUd`;{Mf}d@^lURCs>t2M);jY*G zZrJ9xFHe7V6WyCnCpk)WNEo7Be>?Fhs$BF5C-Ev-X*?P7eTrP<`{)MU+p^zr@qw&z z82Zicdo?ME&}Z6{a1{_`RdTs0!RaywUkinnXS8d^B1xr$<->@jfxNfk<&tw7OumW( zT8L@hr{s&z78dgZm&t!8Swst<9G!7P%?0I%KT=2DEM^o;ICOgyTsn1`rK{Klw39l= zz5$ar1OT=Jpi_ab@m6%IJHDsM<}kAuUQa&db?blfTSWQa)MERT1lU1GmP;bPAyxmg z)EF`>s64kJA)XI~f}?vDJ6j)ZLCslE+#iljTw~t-yE#!vP8y zh4oAJS9h`opRtFvvOTS)&Ao^=>UsXhH%q{;`y?TwdvMB1@%?kV@GEFn0aC6D;$>gi zB^Ayd`Li6?cuJdMM89Cz0lAK0Y5@tCA;;7Fs1~2AI$IcrhJx_UNtD3}UI;(#0IVi* zzi!e3|6ST;#cAyVc? zsnn_^(#+2_fep38yqzf!&R3InesRYpxs!N&w26{>gTOJy05#>KG>uwGT5Loy5}k@|!eHQ6a>91i~1<#WDYk_>md zmlsu8#ePbo(UuBEW#%gXbFxLUVmG4mPsdF!G9c!)u}vH4O|~1Z`6HH6&i!tE7_XflP<`WXs>vRpJ+tgtv((WJ?64W;N#c zY~mQ{pRE%O#L%sgCi1O%1~ld&UC$35b4;?BT#V@Ra;U(BTktC$bsLJP%=y$lRwV7c zGI!34X(*|}2*&x2IrMAwd+xir53w|LIUr+=WPzEu9lJ#QKUO?H#@GE^&8=VEe^}ox zk`-fY%ZT8Asy#A}Ut0F_dC&`uNcXY$)H;6|KSrEXVXQHEjgVq`|1V=&>q|6PqYuM$ zO{TpQi&r?ub@oFqZOYzUq%wV#NX}5!QfR{a@C;qa^j3rCt8M2?cq+}$U>u~!dNXIMq7Of1% z6c*A}D~q8pFH!}sl#Ts24ZEyh64C$!=#>LR`6B$}rFJx!u3mXtj#erQ{0mLX{poQ~ zN(^>D3+#`K1Lcbar4iTcos|k&R*yN?%YLx~rZf7LdK01kak%fzE7z1D%mmOQdh;P~ zvBT>Pv$jwAj{;ysAk1ZW@E7J)2u_I^x!YAme+X*xZ{9J9*uhR5u*6?xHGR64W(Z(R zPj{$bi>5SzEf`kxz01VKdJ|>F=ahwDi%jP`lTSz1ZkbWu@Ct35;)02{aXa^nMyxG7 zEB())2}e^f0zTy-G?o-BcH7iWWO&3_U<1ZQT&bOM!(TTAIf@)S#m{VC8`B%Lgm^JY zZDF~M-Zn+VkLg?37CGG}Ytj;OtE576{IaYnCB45m!TP;&-@}|Zo(jaJ^L=6ZivYc4wf%T>(4M0CE>m6zkeN9!U( zizZx_@od!~HD@H{QQ+M6tR?NPocrIMLEv_xziJ%PgZr!g<`@C;dg!<7q(ZT9tWLdi zsULvdPZX#wdDiXKxSf%$`=HE~)!?#UUIxFAlURVb6+^(cXCU|6jSE5MvF!r5ESIq{ z&fCHglLBSG+wKCymaz#UI-=Kakw}7Rvl!zY+JIIqg@*)DReC z^Q3AN#TX8S?Mt^WDI-75Go_*Pw?~09A4mhF zV{5c6^rg+|_HKi|Eny=bZu=nbbyEI`M`yJxw9>TLMQx{Z#{-+%*wDT>;C-L{kT(zz zkN+L_6&weZZTRP!XhBQ{GKpWX`pXX?o0xC=I)5Eu6>SYp_O;KEtHBJE>*eTkn`A?>G` zoxeuETw%xARC$_F3ot7`0`V;EL)@77Z6K-fbo!vt{ZKCo|G1RLuQnzoGHu}lkPT$v zv}}nYLZvCPWioc^CRK_dR9@YJEklKFHEJ(U?-Bo`=V5UY04D5hk%JE<9Yz_d2nyLTgmry)2c~J>4+un%$tY0V>VkJORWz9ccoc#GMMCTc-+7QqGOcGp1^3Y z?nV-=MC$vlK|U2pXI9a=m#=e&9Nr~smYoDKkN(AI$Ps>lKsEl&#RTwbD9{~>9-wcI`I{sN zVB;Y83!kqv_)LB6!XR(k=cm?zCti6eh5!%*;m!)}wm&6(9w-?LXe(=H37(Y;wU$Xe zkdM-hHr}NfZ!86K(Gwl8VM&@M{jtSIK!nvq&E~^^NLw=bScCDK2qM&rDaTE4MmUS9W3{iHB`cK>8p&?Etd;bgtH z(g*aFdyezVd4`mg;t!faB3kP2;sls=>3YKPhxcQ_j#!Y?21xGu2ud+iBTy5 z4wiDZbb8qBW%i|N z{utU9W)G0DEXop#_Rf~!0pB7bMYv1_y=; zIh{Pi0D}Slum1b*M~o^+&WYi4DH_{heak#Y#{8RCRnmw^t#l+?KqoyEc@g<`7m4p9 z^Kjpm*TSJw_rM5Bn;tl4Wa9_Cwj9oyhLm%G|PvcxfD}Ke|1K9?TsQDb3tR|Ni zUUffVc?&Z4fpBf6I8!q1v=5D=AXZ>mPRQAylWu4FP;ah0%iJUr!;e(A)Ssy^9Dvt4Caw5n#Oy1)2pS;6T~{LTBZ)*e`VN^yB5;$T%z!k1felnm>bqK3 z+lqp);sOp_`0G3`zVws@`jX4dva?P#gy^v)4bqz|`GzwLY<%u07d7B)VWxid(8dvf zf;tDR=!|otvPw9&s5ZB+QXXs2+>+>-?9#=2b8!uDu_yg(Y4e`m%>535hcC&Ex%ZVG z(b*mix*%BnN2gUpvZsvcZWKvPt6xW8LQVQ)PvhRwbj<=Hp)9r1f4oTGV|z%0{Go8P zG)(XT&qQ)zjg}Ti=;1jaM${?hDsHMp7yNJ;Npth8#57> z0x*YpNT5W5)!oXrBVXUW=HsG&%`42VGy!IZ*gNyTfAjxDm?7xcCeff?K>M`1k!{sb zN}8b;6>5bbmOC`>c)Ze%=tevDmeo;0gbBBdZ#?dfXpOuxm`_Xbow>LQP#bZnGl zubni;Jk)jEu^AU6zBPQCf(Dd{4?GGJ(IwTfNYRK(Gc={G}s!Q0lGrF6_ipZp6=WB$jLYWtLUtg2n^ z&fSR=p_d+|O)ZgYY7K-Xp`0@nw`ia=)qFmv}md@8t0$Njy<$A_CmQSu{F6!OII{qv9U5r7~AP`5*9& z1P>}^{c>PTYHZEtwEJGq9PtQNPxdV zq33_S0A%)}bl(&`313p;CUh$Cah)s;Jh@@UrT+)cdv#OHAg-V(#M$e=m{C`^hYvlL zP|5sz$!NhTn7U6WQ^L`Pp%-um?iH$fsTvPJkQ_j85a=(N(keH(%zG`VA zR$vptX2yDyRXBUl8$%Q|xztZpIlNJRt5?tbtbH#n3CC_R0 zd91+Y2jM#?cHOg`(Z11crPG+0obvpL5ibd|(OAadG3Rw#t`%>eEqE zk)S)jmx>K)^2XB_(MmH%SRlw!A*j78h=}BsKR%(vo}R7zE#v#&xFJY+)nKCZXO;L{qYq?X z09tTQ=TOF~9yj_eBsAdirZ1rVfKwX)fy;R*;FT)`sZR;7?Yz$0lNs|J3PJI$Bc zeJJMRY`=-;d!E2u|BoPo%EmGOB8(j!x~$%t^N*@vb5qQ?5AE#T)=B0IlaIVRuOnTqfa z?mlMhVR$SgTWBgmm+0t$U-yAt3gA4VK;d=p9~6a=yP-#V1bW4?8KqHn6n)WIMfN5F z@W;ooOGwTVT6$BNy7jGGzLVE`LQ_o;2wuB_gIHH&2WTfT>)nltYmO{yIhKiRs{x$UG z3IaSw(ZR&O#0wy=I+wg1y~vQTGjw83EGOv+CT_*ADt50~fl4EY`1MvkM!9(@ z!RPP-dPa|Wa|A#Ih&dCc(g#)r$`P$T6WKGnvp2={nTyU%o}GOt`e!XWQ$RvdHEiN! z%nL$?D-L?Z92^brQH+w8lyLGY*@4jhJdcz{^WO9JTpfA59L%?-;e7^wdc@~*rY9<*Yx8)JfaODVB&Pof zB6R+E04rWg87@rYchR^cKT8xzu7Yu*`t7a%Z*XyZb44O~b6Mjj@Xu84e^Y|GxCWF* z98u#m_7rL3-3c(Uoh!C=;dg~+K>JuK5;)|(fDPocfF1yAq~rZ5&Wg6+d3hU$tymt8 zd!6G;d8Fom_OX?jZT-i81Ttbl5m1>}df|NXYktMAZ8osoM#c4*%ah?-YbpWloW@pa zPZVVzVpu=*xVqT$7%(}WHJOX4BtmIE@F;P(dD?%m^4Nb_oN`3#rYipHA@HtsKyyd6 zN)k{%A8H9d>YW*PG+u3vcx#M*0MX^qmiypk-M9*;j3ZkMWB7WUi*@26{%e-mF8TVB zb{?j%EY8mJkn@{d|2gfd3@E@6WUEWbCp7ESQfNjJ46UFToowmFH_0+(Jqp?b6QAR9 zcgfmzNx-FchF;6n1aEv6eWJFT6l_yD)- zC;ja4=Fy{2gL{X+I{n{YT4C7*g^awO zbW1aD)e=eD&jnD%<`=uz6KVTz&W`{t@{2uqZ;oPY7gh(GESHcIyHKpCv~Jstr_ps; z^8YP4{!{s!0C1kieeOqgplFhN={4-`f|ZRY_-jk~-0d4ki zQa5XCi!80c>qm)F(y!Qv`s30B^#Yhto6!_Td}SpuRWUSCU_naB$FN%>dS+$6-LZo3o$u;M_m zD+-gt}k^+8dOD_{C3)bwY`0@hjC%7^U-cCm2lgF3zmmkIc7A@ka=5< zNd!*%L|Fn;&quXbb_RBa9JcXSc;HP*?_CabZD#WRW!&b~de%_`@IW0kYv1pEssCLV zd15OP_BvJPdGCPEt4!Yofu@W7i2*#rH{0;5KnW5vsqS%5h1aHSg_Jg+SMBR#pYdaU zaR7_(|2vC<79cs){P-q;Qu0@OV$P#M?;x2PP_#VT@q^NtDjcv8P*ZIHoKZ$ApJ2(I zRxn*gL0+(21#&mNAc5#RZpVhD7d`vt*LEPka2y0L00s={W?}%GfEhCgg7NRPj()++ z>!mf(U)t2Z61O~`o=E}bIIp&g91hZ4xF`LPWbz2N2ySy*kqwa#MeIHg(fc1QeS;3n zvE-5{vm2=vsXJ#Jwn%sgxUOcL;szj?#Co47u4KfIVX%2+q_Wm{dt9MqXG4Wt? zO;dad4d_+J>JW^mC&rR7`BdayV{P{(CB4msk>!&I(l?Oc6d%<+I#&8our07eY32Th zube?>TuXt(>?{TimRaCl`tSRhafMQNE@aDUH{jg*Ps+%;R>W>L>C?v$t77lEZd$n9>;e7JUstRlN!{Nu9`rJ#fAS2qW`_l+rS7( z&m{ANDC7%U_o2H0zbD@vhuw(41b~QT(91&414X~x_krV-DKcZ1A)n%CWYK6Ef<{ug zL;MW>e*i!YNihU8yWpJi6IW$($=m&4Y21At_q8@u(o*qWPS}G8>7^boW&AChSzDBEe7QoP?Oc!K``e^|Rc2Oj7sx*YZ)?8njM5gKXD% zeq42UZmeCW%1DwBKy$`|Wr_Yz45mkk28FD4vX?_LC*ed(czGcrS>5u&d^RO^=Q+co3 zswTZ?{u$@anbnK$e4TwMjeHvf;qP7;2@fO*5rg=yaZ6rlfI)Bih4MpvVtM`Nr1 zh4uk(dIUl6{8A-J<)l{!z+8D|7!MGD5$85(FPyQu>EkFqcX$@#i2AqlJl(311cnX0 zYPYR|DyQEtF%8jEy`#v!cQJ6E{QvePuwyX6IFSY42TXq&(%uT^eZ;{#tZMxIzN6!< zh{Ib_^GQ&e8tzAGNeUy;OdEKhC?f_BAF9SossPxP>xwNgI72vy?gtvj?&x%dK>YbI zE0|D>QRg&*;I6`t%ewFK*RlkKQmtO9^yV-VSFV}c$h$w7;Uf%1AZTLhtiSq)PyVk8 zwm|^;EdVjj6U99NA+hGpoxnLwJfO9Sk-P7B`PuL_GU>zOgQ)F(TEJ{3j=|Hr^7Z{v z(dqXata2gmk?4UX;-f+~`a}Gx{~(EUs59?qHNP>3n)XlGzyO^}FBuVcj&=PObo#?B z(=Bn6Q;EGZD~=#OYZEGs9-Xs!$YE3++mGppM51S@X1~dDX;`tw#R>QL=CYdJ(w5l9 zoULqNN-(3Di2aWg)2+pIWb5|Hs!?hef${Z!3;EsK79Q zO4k4?CEX!0bV-Ax64D3)l7ht0DTs8JbV?14N{56$ zVOkm~%&1uT4uhp6jnf;@I{afyexw>PPPoC+YQow%K9v(Fx=Xp$ibp+-+qeU-PMLCc zT_!%=7ME~88>(C1-2`e^hc@?C&EBjQS%i@9wBQ;)DkV6!rBK7}p2Lg3e@lDhS~Eba_rXq6r(dw|FNIyPzKvx?!gz4yn%OB8e&al z5dUrw0(CYlmbGs_K@x zIw_P5`bT|>pLFylrD-%nJfsi%33jD{=Kb+_K}j*mp7)=`Mz_Vw-; z7$4D{0GNjG>UuU$WQACN&()|>Gwh~3WlV)O0!mcq}hHCXa4`gs64$aj^2bba>-le7!K zuuw|A;hqP>#Eo8bXe@qTu_uT<>=D{={@}f9>E;3k3{~sGzpd&#t*|K9zRv0~Y)Fom zF*`8ah^z;wO#vlS`jl)m9o_^!iC&M`7g7LimSuLbjUg>7jXWXuHemKhU+~s=tvV!C z`u1Q~ioo|c2ODo(RBLRz4!N`>dUEADuiq}@cPcN+>6x_2@xHOcjNsuTL5Qvf2tv^ z@l?y1_jE$i!~71=+VABEZ{SyG2%PC(fYTMu&;}^ETW80|X0Lo09pV&|m{t8h(lAf` zbES8EeFK0^{ZHICdnXE-lo-dW=ZknW$$&CVfW?FYA)bDAdrvVgvrEHOzH9*i)kXkw zH3a%A9|`_+g6LTBM~NAiZVpmRtr3!4 zcU@p@=$ghN`{nsK>0H1wUN`!yV`#0I*h^3_t7;!lK1^LxH3LHSg}D|G5i4?dfA@HH zz~dSXVOkwgy;$-4mo7PUtgKb3v1j0SC?-j!~f)osQ@VOi`(MkV7Hmp%f=E+!K5VE zac3lTN9TlO_}~K9+M*wvS+B`6`O$~+Ky$N@v)Gz=xNf_s9TR|nH3iZ~V1nNm%*{9? z^0FqAzl4x{TiPAeO(re0sTy3-5DF-Vz&;O4oaCC0dvQxS*`^P@}=W&J>i|-)= zgQF5eB3ceKx0}n>x_12vXtBBTldkFOMpMz&t~nwyyg6v*7bKN>d$SVX~#)pXQ>b=16EUnwVW$ej5N4CiryH zdAP~{WaQm)?VGU{r{a_;z-`MqCoXwzzG!ZBiq;;@HsK}b(P6L10t)ykn^h5Fs7*9G zDck@LpPXf&9e=&wg1Rw3$~Q1`jQZ=V+daVkVLx4CKy<*Q-)k>2F|W__h}|^M#0?Mg z9y4)kMQjv*yIzkq2RLVwEk%t!R0Ch+IhZ5gy`oS_=NEJ5+6ZS0dxF3pVCe}ZnKo#n zIM3L{unCdRg#{+X25dvRr%r4MIwu54E%q?W0Hte6Me~(uMNq`zm9-THL4n$?%-fqT zRl6@RUC(qdg?O6AXG<|xq`v>5rsuT;mGvAp3zKbNPjizE zx_l$(6m#M6e_1`oGP}s_66P4cD0OG$t)p30vJF+0TT(5;w(hQvICw)*g|R);l2WJ7 zy}YD&z9}97+*}ve!0$)Y&N=kHIJ>6)zYzl1^N}F`Sw2ci3cTXLd0>7BgN|9jgwiU2 z!>v^*0f(k;N>)i`%DsOjhuNohR2uBn`f4K4%Nw5Wi(bQjLUAT(EL%ak4q#7*FFT7n z|6~C*5mQC1H(TB8fUerV>n0lyi_x>{V&OIgg>B-i2nQ(e^=#h`9MEKl&x?J%1vE_0 zZQFOic#_7BfU-m8Mfdt`=B*bG?aOLjpX0BAv=7(Fg-^$h4w4T#_y(LSq&cxE_pNW* zQy-7zz$Cr!8<_$J&KP~fuk^~m;8J-3x!PdHl3OWUP6t{YuKQ+q`T^pRoN6 z@=DnU1Jdy%u?IDUNyUpEJBO!3sA!p)I_M|lqI6T(w4-8E?1lID? z^R`$DDez`xkgd19zD~<+z8X?T$ClL1BZWvp^v$Zxk6Oz!zB@6kOLaW2Vfp8n^t4Z$`s^mmpF$&S<9t#I17J#BfG8@hOC+;Nf1fi0^vdC_BC?7^r`KaV8_+j5@ zPgiTvK_%V-?!}h$CXh-kIS{TV^!{#yku-EpR&eqOWuKsy7+%y0HAxz`hOR~zZJpCsUAqiG^J=u>wUU$Ra08A`OabR(Fm8L) zdhY&RhGWVgN`t@dX#kd#Hq9+*mP?cgGmY#H>@^FrpC(@+;c658_%U5kL^_W>@-$sV z(TiVIiHA0lz)cX!m(i=ih z7EAirmZtY%M`LUr@wySdyK_}c!YEqAh${ao&kD@!1N-lPL|{7|>^5H8F;A6NgHV#baIuHgZ*ay<8bW%s=Y0zf^X?R6 zRrr{1w3~7j&J_5M^}mg@+YrPQw2RY{5HlJXnAUM8lz&Tj`ug7*b)r~EDgfE>d~~R< z^Jn_<`&x0ogN5%-u#ih^Gp`jVnqmzUi=As#wz`uv1La^QshA}b0M9KCPu<3xOb)|* z>h<4CD`0uh@HTW}u1oCvxI~#lcr*Q?B(mcN|Hy1RvE^WA5jW3mbA=IhFjcNgKYr$s z{9*Cc2x~0E;H`9V=j_$x+b`eEJW&cp;3|}QEMY5J!qo9^S7Bl>sAGp3kns{ZY!iwDaapMJZ%JXp@(VF z!}t09Nh&3JKGRA1a9H1759beaUwfv!t@^7`>M4RXZW``p_#GpLxW}}fOSciK9&5ev zQHf@jqYZ(U_KW&)R4lV`Jaj}~l0_DvE2#tM50ziIgb~z0KW~MJ|((v-Rt0Mnw%g0Pc2?F*QTF+S=TV35{)2%m( z>JTGbC-aaRTN&4_{a_Gcy*Hb*>$TRlef91stY zE6=|gf}6)~b%3sEn1dG2fcA7$C&L3mB(Sd)E0Qk6_0Nu?A)Ja?qW# zcK#r7-l*M22+G79{kFvqgYa-r`%mQpum=~;xw&YgUCzh`&GwDw(GF@0~K#I}M&Kuc`+B3y|_JR(;Qn2iF|=YYq-Q<`As zMA9nsRSQ4Q3`!c);THXH&mW}4Z3%xj6aP;8JA*{4?#zo5ZC9*;Cs-^Hb92Vo4u|iE zG+IpEd%Ptj0%EnM+KTHr)fISN**Fp-IgWcEO#n6sX(}Xea8&y|8oK(glplZyc5V|8 zb~gP<>E6YXU(_0nk)pU`p9AmDzoNDOp!8b#HcSV&Ar_njgkY)1Y+V@L$qJy01F-M0 zA1$zA!z}tmqn9Y@Yv@XjpXB$$yG;|We97p^y#~JAd=cOPTYoSi!&%KefX!lKkMMWI zC;KM)F!M8-$w$2F+|BRPo++1JntoDI&P|}ii2hLDv@cjb3ZJRro@T>b!Pvu498g3N z?D#Y8iPZ3(Vlm{SN8{J#VzL|Gg(o+%y$mtM6CV7ek7J(RwgTbCYH4iI*6qsZk*o}8 zz#azJ5}yQl-282e?M({~={`zh>*FgWKj>ri$?I$ZuA<4dm3c|K0Or7oPvqg-a~1?Vz1y23JL&isnQQJyc16FXahi3P;UaQU zdCxzhn(*0rzF%13qQ&_@JI2Y!!$h!`x1#k;mWwCnoA6hmpC7Q$@H(0mMcM!q+Lzh! zw_Qv*!db%t`a4F#Qr`YzUq%iab}(-;mI_Ky$F_KU z!bb7!BMqSWqI~)+@V0?N)+k*XKDz4! z?OYBgRjU+R_TQN=ekMu?OlG>X)l_Uwy;iD)gP(rc>ANA`0HkUfpVyN>U;_&O9_q@+ z%mYA4+e8upMe;z;2cK7;&aOTxA3;E_j$5~{vRDh;=DgmZ!^i;Sm{d2FZ&#Jun>0ga z&v}mH4!6V5a1^Omz*2wt2GwM1F%y}XdwbVmVDzva`n`}vsh~Ib_?P7+;8_S*fVI+x zlgyV>lNro4>KczPXo15TaUY3pEJ)5~>cYZK9~CAFOPcROu`@?yDD;vgTpY`ie_DzU z4BXueb*jngJZqi6l=#i=F?XN;-1vYSC@>x9 z+TH}ZBmjXtWI^-rayY;dPK4i<;kO-hCJdEyb9*Ip?2X5~xEi*Ow(I``nenC!72Utn zxn5MCoI|?$w9|T?Wnar5)lXRY1+8%0(IqH=26@^0Ey713WVNqT*RlGdvfq754_s2d z%J$_AomIn|ef`Ft%?^|QYY}sP0sQ}Y8qh--u*5^i{R~*_ez3L;Apdw-E_t3LN`)*@ zzYJ{~RA1p|sLmUbhzWoU*ht_Ky(AQKd}w^aaMZ?qLG$aS@D?Ps9<#arraCzF1+Fhx zrCWp4ZN)5 z@lj#4M0Ysg`}f!PuL8{_>k`^DMcyD0lc>RJKdJ6I zalP_r(D~?Rw=1>0uNP`sNn-)q4Wm|b!%q7~ z)b{)i;Mg8yxDH*7gXD)|GiF=9rS)ie9!nU;rk*SZG*p=$;N)L!cVK)@9XQ577MkXs5$EtIw60GEYvcKcl!7SU zJDpwRrnjStvYOQk97%w|kPjvELz2nc5%690KLb1^eCBC$+N?u{utF7tRELppv6Vo6 znf*--PXWO)R=PM3V20vX%RYHNOd33!=HkSuTX4J4VC&ldn2P?L)b(-#H+k=F$}}tB zGyO+)_vly_u>o+8tdqsn91Q;n6E!jfW3&^?o=YWLnoSy__SJ*f~7* zJoeeXG(1$>CWG+#eN6m)%ImS4n-s|_1s6D^C_MzbImQJiA+Jp*#RG`dupK(9V#sNY zJ}4}1u-$@hG7*@J3_yiAvuW>2odTP-_@eyH@`<`DTA7Py)#qeeUmR*5<({uGj9_WL z?4`8uvagraAj%aG(#=f!&8)SCYPgntRYaO#M5y3uV5r&`aIa#f2|6A^`e0Cfi8For z-UE#BbEJLLnfl@QUuE!21^y@O-0Miq@5KXW_uLVm#I0vl+um)0JliKwLO}#BvyErx zWNy4IW+3FqYijAg|By58%GE<9tA@um1eAGaaCnosJu1ou=#=KX17<9$0L%i{(YcTK z#sI^P9msZxPTQU)lQztKR6)esNT#%YRIs4q$L(Mc8)nkTI8%-QgD+MYRS0^R4=2O3@Ga#(VYKs|C7gib11&9$x0`S6$Iu^?!~vqKKm-I<{=?^^fXFsQ}yXI!Ak3t zjSkKu8j@UmN&Tl;&FrRibiL1!do_x~CwfN_7m0%12pB>oZ1cviXV^?Cp>0OfNYlv6 zZ^7~H70vi8r({>gHh-XAU-g?&hFxQQc+Sii#UT^1Jo7njgdUQ3r)iAakn|%ZjO`G( z4d3C)v1mh&rOp%bma?-j-&tQgOhSY)SX>j^H#DPySn$HmPjlovVuRfe;Fp0 zLoKZaq}Bk-s;w>3IOpj7IVF5ZfyyZTZRuo^$flJ7}0l78=McFC9 z(qUDRoXqgb>vxvlX*6DYvp~@oo^J5q#_DxUk^83$`XcX5P|NM0yYEkU-_HRJya?Xc zTC~NL@P8V4P%#+{0cy$XlI!h1he}KprC>(rTd3h`H9?? zLH1RBTb{b+3D8hI9&K+nD2kkfwHYdsISD>Pv-FR~fE9G8s-Bss{}+Xg=jcD+AIZ@*VQ4yT4!uybgG(~_kU za|01Z8IK>VffXx(aAx-U(xjA%9i{LC>G&*M59weu1^%$JybeB1uF59uYXCFx?DV~@ zgp$!8nvPi#G49Urz613bu&JotjFvEXIfF&1*MsvVME&Bp9h?16b;iU# z7`YHds}o)u)93Fyx>=v5*bq9?ukK!^1o!-Al1$ppk-_I)EwlCkSkhLP&CU<-pNS(Q zom$^7-t!-a(<~Wq=`%Y`d41_$khq8@JO)U!4BL=(!gv`Etz9D3b{wo0AkpA!0cF+s zjAw!?c}EIWt!APzVT01@t*>VKr%S{{v6+LKT@wCZr1qc{le^^*uFv>6(;`o z9U|)ztP}No+B5u9p9YXDs=M&@5v$(SsJ2)D^davzy152#G|y|kD|8BL+8TF#o4OUK z#;gzlOY{>H&L$W|q?2>~m?;1$vIE`m-f3#j(O1*@1L0JJufxC6HyHi>*cR)3}2t`f6Dk`pR;n|i$e001+D z_@6Y|KV7?P?ceZ7*=S3sRr8esxv!2z%vkut0X1MImH_DS+43<=xa*ltyyfk{B96)% z>Hdd|YNxDGdI7e(=TeFS5Fn?^8C9|@Ohax%sMB)}nGb+gUa05*FuJGkMK2?8S8%?c z%kr0c{8SrYMt=y$JQyJ5o3ht9<2q{i1)MUZG<_uvjr`XkNq{lQ{#E)8gi6O^1aKv}<|8ik7H^b1IkNcG@X6l=N$*~P1 zhQe}+%RfvA17pYdT2EJDD4=8GX?Crd8n}8??f`Q^8`%=`s=NVq%{GO`_RF0;T!GHN z@HQH|vCa23SEj)RjG%yAQfgEXV41s~hFTSZzS@j#!<^Z?9BSx&-5bEu?+iQsaLw~8 zQx|_1gfhr!4)q$I5zgP)xFo(Nr8t5l5GnloYtMATAanjI9qZm>s$inqo&GfW)Nr+q z*j#(#ntR2(%g8p{BOL4!Bs}8Yal9O?O_4UAKa@%Zr?U0NOXFv@AuQ!yXl&^_uIJh8+eQy| zd9s$Ia{X9aOWg}wiyYFa(X+qNbKbY08xvOp?pej<60C`8=Dy1{zEYa@uA7mpL~@@w zt}lxynV8vs1`@6QMC{qpiX$xmv}I*|cBQ@~pdI-9fpClwrqx=W{=d|||0H6KJm-Wu z9`@<~yw889X?AzL!G~dYvsc5}C3LsyrGyi#74Ksx8&0qW=KDGiJ08Z!Mh~COu2Y1d}bQ z?tg&PE6pc(zRVR1I8jGo#wj;p{5epp?E5H;mM=%{l9KTG_!x zhXI%r%Z#eJ`3E^!n>C6VHotylM8i+0C1usN{y#*(#Ftp(ET3ue=eflX?-?ojB8+a5 znly+=Gq;HWehFCIpBT>PLbxn(3-_w8$VO7>Dg__%QA-ngDuN4Q^Tu(Ja!qh)~_j2Crvd(*?+ncAi!Y<-HVu-a{T!HKa!RC$jrU1F<#X@J|fV9iUEl0dB2 zMeuoYGA$_ZTAHVSUo=A*!c5xlkfZCE7`Ki-;6gDm!$22d9qEn_t-3MIU=^J^tGaGn z>e!MJ#AaX-x}G4&qw`4F+}liQ>w7LL=UoYndtSTPOy&FR0%{bx`OEzxNsNkE=D-E| z^&hu@H>E5<%%ha;Klrzd4#@Xp4G9+=YpC$ql=V#Qf>XDv*KJ%ogF#i$geR)XJHksnvxV5t18;#04#kc8UqT9V& z&^w6NThgvKOT$aNuZ{7Mfwl z$3y~V^%68TPZ$Aqt-Ir~{JBbg2vDamNA^$WY(yaH0u3tsT~TdzLwH@f#BR6kXh2C=BEix9q-B*+UiL9h$Xp5-wj& zgPAK0ot`pa`rBDRgGRDE%7*K~GHzhGrdR}G;p%ZJ%8#CLVfbF$UJ>J!%M^nt63AUeo>~qM}WCjJg*i`smQUO}K z@`YlVq{9857Ks&~vF!$Q7`0d8)omQ|T~Oe?rvsX5LJ9WaMYH0POmZOyKiQ@!1jOue zo13f=pOngv36aZyYJW00K|apKsRHmjAT$=Ip3!-VRm{FfUh#CBYiCi&MR3#kPo~vB zAp!t7HpPM6uqoc<@H;A95KPW9ibfu9vO@`ZbrnP?S|>2I02lkgrVc2EKn=(h;Ku9X zD*`?}niFcKA3fSaz7h3?()*`Nz&=9Eg&$?G$$e*$qIpDTuoEHYvHor2;)ACps3wT) z6|0zyiSw-5oj?%|kHcXfxn=B#Mi_vE#OgaS)JEjF#t`5)GivsJnPyJBOEr{J4r}8{ z!~6HJ34dN`7W@zjx|_HQCx0c};)X~i;=%}9B}(=+sTKwc+9&(BOVc#{42Bi^WNJK0 z#$}XbDjMWGy7*YHyFI6es=L_oL6tv^r8KbyDc=7Ulr1$Gc=CDqC}*DM7otEW01U~x z2byaw#vVAlTNi3_hv7a*n+FwrBOs8#^b5fNM88!DK-NFPiP$0o zX+Bmtj$LB6{^i($kp$e>#=aQMQw@asdJz(6*XIa#O1buOWLy^%acx0QG9S|emd=&5TG|2h*sBzI<%k3#a)lpB5o&Ii zo6}y!5}|`AaQ2r4`(Y28aJzbj|Vs327eF(o2FU*wE}OU}sl6%Q4J zVr`8-dlRn^23E5rV>%J|9zM#ew$k+tTmpQ%DX1j+f(5bH!X2&|a5ww-^vOB8B6DEr z6mNPPv9j;Jof9xYnjT|bLO3mFDH~dy0j1Y2A$2++gb->9cWvH(GuG*l0fD_wn>L>z zo#o#;2HRH{lbIfV2S~n>Epk{OiSc$iHQd5lx#?GZR?Zb1r~|%S(V$>%Aapya7;|#6y-&;dS7LNTrqyT}3PV z4XkEueB~*VafVw3h_A+Oyx|)tj-Qqt8XqXhd$|Os0si&hwWcDEcj7~VQ|4A-@GSM9 zaj;3s0{5eNYCElkF){{u6-|q*3JKI<4j4yI%5LeKBP}y${`2H-_u}3aRyk&-Dp$!= zNOpX#WATobqdLo;Ck;6(+Bv1bzNgpbTjlDpLe(H}Gxs z&Ple@GkX8qSyp4kC~(L;)v%77lSo5ZXk>R8KDHH&F#&DcYS&Qkz=OVE3Ys5i;J;HF zfp+Un0QgByc@?N*`G&{uu1aznO)_;-h7z{NYg9pc&v%xBi_1)T?ArX@mT7EK7=6~g z@>>I`mpj_%_dBjVZ4?0ac=i}b;Jv!)#R#Gry_TessRF1o3u@1kMp0|?*oC#X>*&#P3# zk26}>t+Ec*yu2G?_=Tq0t_gol;p|%Gfh~D*tIBCI1bB{KJudQt$&j{|xkvTcoA(+JG*xBNe+Za<_MGoLknpR(GlyKfONUVA)^`rva;JI z6O!B&ciW|&by|o_L^W)4DP0jkzWIGlMItVp$`}QdBsMADEeTnKlOk{{bLDt>G~*G* zS^A2>!=&I`{n_yWb)cerjRI0Eg*l`|VF-q0{#s`>F~10k@zCk_sr-*c|4UH~z(tfg z$-tZZC$qbFM3v)zV$+OtfSSa(VN|eW$W{Q$9ZB|0pdVW&PQ|zP*_4zzU9qThphG7eqB=cNY3u3>}^BdSdFdmU(Uk-xDEocXr zBoM$HA70&cs-CBiC*qK2e&ZH*R^L{L4X$Q=wy13hsf;|V{j|>{CNYG-{VMJL7i<%A zDM@yq*w^5Z2)kj1z}-v@Tb>3fD|3T~L}x#4N(6WY&-5c1j=0uaf_KDGR^A7(_`C&C zzEEM=L)!LPUXu@HwFYx!7Zn!3wP@+UF6}6J-ja}C27OxP;a+wC+inDV!#mvPXKYcQ zPtEgn4xjOuksO*(Uz?C##J~5xKvR`mARj)sDTUp@KopV!5bl9)g$t8f%$DHkaR=}4 zyvaF3?(iA4^llK^rTne_Ot{dGBY-AODg=)(FKBb1buWo`0KYG7Qdnca1G zZ|nO#kSggRgL?0{?GD6!epL8JN!@=f_wOY}1)p>M?lf;m{vY`vt2f!}x6{sQB^urD z8+w_lExWBSoW2M^7~XAFy{U7u`=MRfH)z8tJ~C{_$-Dyo2B^NJcvB%T8kcTu8xE6S zg&82_F`N#2;;NqY+Y4akl#*KlRs+BEisu1#5jpfpATfi{+i{CmA4LsaKw$=E+1~*F zF91t7sWOAmyblFw`gCUCoRcf}!9Px6fU#H(>3yIf?j`!dlC^=ldGAPrp`i&cux+Gs zqG4C}IO42WI-SA#s$cqx`j3K{|u!2)-`CR%=`^=1BOX=5N$;1_QZ^)LevYO6!E4u*or3yBc?nrz@85KtEqgtZ90Y zyq*96?wmKskirQBT8w^6$~ch`B{#z!9DS2Yu^$$g1lmrCFs!3$3J+OUsMZ$Uh>Wqv z$4O?W7NvCsL}WdawMt-F7=yeuKpmwQTmg+zi(Qs8h5LvLIR&^_q-5CpV{bDo8~CLB zCf0kW_=qCf;MmBZG;Q}P2S3Wu=41j(fu$2|WBJoEs3Ye>}}`+<~4n)JpbHTEI-qlHaiP)FleSyrGBj<=yz zITUVQ&;`Xd&_-r;e)Pcl{28AGbe%?J;Rz@<{Oa39ONy65|9}jrA?O$$A*G(bz)KZ> zF>(7%(^$8SRm*3|?dVsEynPA{y=Z2@s4XfJecxEzZw7Mt$IeSo0GOiq=_TK#2<&{? zR2GO-idz~ru-2ZM*qiPu#1Akuo?n#xM&@a6!qN)C$rr?y5g z1>(u8s)I2KG`@Y*AN=_lDsRD`B%XR&^3)W%>B+6JHzLzhspbWy?TM z8A4y^JXae`TD}(8Qd!aRB2QcHW~haQ#+N+BC_C&FyC=tN21=`IGX^cz*oin;j&$t~ z8SmQWh@&+H$Hruo#3R6IEp?JPTnRu=h3OYUp43G;a8_ z`d2NKcn|9k*RQ9KT{iw(OSlV#@tavC!&}Ej3r}h_3Nm#OIC>pkHT-%?!Qey|g^?k_ z#x}A}vG1J8r2irO`(r8p|B88_@E6CHFxLk8I-}oIOs;YaS+h1UAdas#FBEjYaIj_t!gohQ(G?F)rzdSd?T7Y^ObLTBH`O`>MdYb(vC?C;k(S#i0jv z*zG-9%6?C}dB1fzoYuEd)JfrT!q8_y#cVG`(sgmKLQS` zRCC?wYdO(t#kc1BwwbCE8uWE6Uk;JB1tj0T{BzyWD?_i_2@{@lnd5u*ZdjF5(8yzc zC8}4^RbubVX>=$pc@&BDoE)oe{tgSCVDAQZaY`=eXFVaCxm5&?wPZi<+nO!MI`&8# zTHXrzOGiCG zIzj^=)`{LfZ3?yq$yN(2vz#_*>H;z>frj1N_(RT#nrU6Y?00FMVnqoYFGKS)sfmv# z_1&ZPe;`$;E7&2&0K-J1#vUY|4ZTva-Y~h#(RtGo~fV{h`zKf|w7gW*!3(rEB(;|+c zpP52c9=-y7TrbrJC3wxh75rVOG*uHIM7Iz`(~O|Y!Bj7N1HP<%h+N`o6{-_J7u!?0~I}OFf&Voh4A1^2>zPhVgTX3zS0h>Gt8G!_v|D%m(&xIKv}I!mBrMOJwz|M0Q}joNU)0Vqk#^_A z4>33KBO$bd^#W5~ULr{#PkAhi=cG6MsTUir-&xK0de)vIYlDRQy_ItUM-bl8)jbO)PJAe^CI~vJ|eXWP&H0fKw#gjaIOY|?|HTF6GTNDyu7w7L&lJ| zK=jC(%jZi@pF-w+pOG)m=r^Ip6x8+uifaFC%V|X_pU!{-1^puttY+E>_h=Bn7;A(c zO!a+P9Atonp1M{=7O80F2E!uYNqKLFo_%}*b5pOO>|*ik{Poj;g>y zovytZ&c=H+v5~0>;Ac;4voOH_e*zbnl(Jf~#ix}W=#;qbD>R+TVl<(-EG1T9-n0=x z8)S@RKkwN74pF=;ppL77EoV3J)AX!rAb8JdC5Cam*g=60_f1PTS)Q&=0&`8`T{$GI zWZ;08!?sE69TX!&feAEP&JUu3AYE3ah(lJSh+~NedD~%UkR4BUo@&@eRNakp^=Ca= z0JOV2mb%NuTg+!l^u=J27s;pTpI@0+BvMAJOMJFoFex1Znsk4^Y+)MImXOOmL0}kO z`w78>aGRuzuPnJ0#ta;uyx7D}p!TFtG4tx$LBiO!X6d?S$ttVj$SZv{rJ*&vv;mSu zat#1DFKzAnBK3dp*8xE<6k(=&fxY~(xaW^E0uV%M1@TJdxT(cK{Bo?e4Nq=y6+Vra z?~;ADqa4ohYJ7qr^o3T+Ja0o*_Rp8u36D z$sYM07Ox4{rl)2nyuV`2bf6V(-1pcJb&){<@c6j?O&)d&u(bbGO`s~jMrs>Y7`(Qs z445}iYM;()@MP^d$re{V&Hy?nx)L@bv_?k+9o}&{7Q^uO#hQawg)Li;^J!S1*8WtH zz~}NdfN(K>cRcBhuM0_7ijOh*`h7tVa}q~e_}37pU*j1!_~}xOk`(!=x=UUfd_X>O z+G$qzi@3r&32M>rJ7}$^Xb~&5^%9v7#FC}^fPoNtJO+1eW?iikDU2NyS$NgI{u~rg zGOL*#pPJqbA_7Bt4C|zevX*GtD4hM$#@p+xfU{e8K77G>#4Q7cJ4xS?QF^O zKaGfgpKtF?MXKw`p-9?mU$egus6{D(_3PMp;&s3{){f}s<)cbKcU5Q7D#s1RC1QBg zuE=9O(9i#9ap`sz%d8c?4n?z7E6HlB;f{NQ*3Z3~s>`;Ieo@%X{F)*U8hD#<%D`Y& zoAf-$RpQi@Q8N*=mt^S67xfUvZBJK?)1E`2zT1~Qzfs=6zNgZX999W=u)00J8HFed zEa~S@7cbCV-zBU&W(0{-(%eQ%7Q{L6p5C5!Z;&?Ui_4alE>_KX&HxhcGAbC--=(D% z-W}i?KS$VqrzT{!SmVV^ew)(R2{sT$S`1s;o1Z{30yLTK>f(CS!E{vR2{foVjxi-}$BL z%>lpxJY=2&CoeYw?Y(X_1L`~>_7S;Z?$vOhO;*#nkv$E`*qWBt7_^oUE2cViep;Ix z3w&CKaEjUEAhCypfMkJENNa9{)WijkQs1(s^P=eguWdj@VCc?*m$jhxpKfq}>=o|} z@Y?m3P{l*nB@!%gP?I&S#BSKLMdu`=mL0%*5TIaJOBniy9zL{~PbNwLYcC05JcH(WUj{^6Y zo_UsRS%yv93T|u+Fi7B#x?jOy_7oW!#6Y|F>EcQyNU!Q~8Rv{mT^ZvR0+zy=U8f88Ia+zO>&}J+W*%WtD~02HO4t$BOPfKieeUFG}gpGWvOG z?}9Sy?|Wf7&o{;I3IDN{s4<~vRvZoE+ur(OEquV(rwHZU=l+ya4XtuhZ-k^$Bo zNz$XGm8`=Mik4ITc$-X1CRW4nJ{o?t*>NR5w>6hQQ-}A%je5eKKC8b^!XJm?ug9je zbFK|x@W0KtINziIBpzZs*Rca{-0u*^ey}imdHv2wn3L$?-M zlPa|^CGkqs7$4YYtA{|%ZJi496%YQB?7;-+OSB7)PZqT#O=&+>dxYW-b>_-URR$$l8)b_@K}M9oYF zWA;UDTI4Lde}dWL`sCxg8?FLX36sMkgvu2~o9Uk156WxVC@PoHnoxt$L-OvGNu*2K4&a7Hp=~qI|vX zoOI59qFAb15)qu#C_c%8izC&)=8J;7^e}CfZaNqWizk8v>%0Rw#(3o0O=${#o;FJk`(;x~UMpEnnnvQzU#A`PQYtld0^8A6 zfTd<`rcWxdEg_6p>nZ3Bk@(>ik38d2bAOFCQc>GX$|exAwU{|ds(9|T+~y?5@Y?42Yc$ta zQj$bZ^}V1X#KfSCAq8A*RP?1tp4yq>l#Bcuo(X>X(=@bmLH}vYRy}v!A5=YMjjFXq}#K}ufbmW!=0a3oX53x zPPM;^OQX@>Un$3yi_)Amu%Dn2=GmiyL!W|wynde1mti1Ns0>&HC0oNxq5y7TEM1o7Q5{& z^^_csZD(ZuAttprAy#9h=j)q*7esgngRcSW1tiz)Au|n7?mE)LWvpRA}hZ{vt`!DN2h$!}5d!$B@$E;gqOz|EuAVVXB5t z#qSG`20K^P@p8F~k!u6?tbgyFMh5S8DjKivp6yTY2)0Di<#+02S9h9Mg>xGKg(uST z5~lA4U2WP6sb&ctPV*BuLn-5P<1U$JGUZ0hZzXIiBCiv?N^nK)*>5p0_@L`4*S;HV ze1+QpZ=M5m>}%l_h?Ysx$H*|~vnPEL(ts>Rw(#Ta5xXccI5(0jtYrz4BGr@^k%aua zUb{z!c>y@f4vu@5$3zG*fe&1pUB{I3zZoDsTWV6S>6lN63w~t-oGBN^SC2R-nCdPL z))QH8)T;q6x4pR(Jr4`lfsX7((h)+z9|b~pN8bcap=}$`g1R0Wdu~T&>K>FQDQFf~ zB+-PP2cDj$M*~`zWc&q*`n05g%FyHWJF9IggmYd_J5+&`Cb#2Yr0<6mp$ICePxbwqqn1d&7#%=r)lDA;K)R$xEspG5RXW9 zw{N~X?B(Nq0lx?G!&=-)S7}{>)eAfy2f=rquYaDYi?-g$NVx?{WL5q9OrwNu`p*75 zJ-scvcd&%>5HM}(CtW*T3t?|C(%5|WP0~n`pKT4f@?oH-<~butx2GP1r~cPtE*u*J zjme#Yl@(CG1cpnU#5KBb%52Y5w;?4TSM}Y^!hpSDU>Qz*pL-?wjxI=~m@T00A_51k2fL*t8ilFCN z>grH2cejQ^a8uTue#=$^3Uzbu#(S=pd<^ckyz#$wG>p5~uwx!IA%Il&{dutGv0DiQ zF2H?Yn&3&cJ&hPqi`{kIzX|^_RpfNDSv>8GpM6$iRv2wcKaVY=%0HFrEnEYh0d<$4EyJ={`hB2<5=a?E|enJ-;^E` zFF&Z2+VS2LxB+v0#aUrMD81XY_32bx^E-I~H6F~h@X?M3xrM^~#&J;HSCn8+Ky+!J zC*cRlzpl`kP6&9jfFwX4N8%ur3dvuDCv^}lT42BYZOO<>c;-ZFukl)gCc|rVl3;0@ zWy(+Wmu6gc;?Dc2(P}UCBtJ4(C~a2g@OX75O-gpn7M1(|zxLictf_2m8%GdP6oM2{ zx}wrVP^y%GQWTNiq>CcGDZLvN5RoRmlh8x&(h*b`klu+DMT&t40tpb>Z!t4x#+f0W zbKc*3UElS6m;SX4JK1}!^_2U$pL^~73jD0E+FZsZo_MZRvG!Gu`T4i&%G1tn+Z!P} z#9|}5e1dghFd zN<$7Zn?)>&G$@ug#l%s)$|DXc^xLpTdMH@bk=^!`?v}luJ@gTdHuP0PPb{pZE`92G zj;_gyo}G}}7Pr(73NKt!DEB4n(AwI}>Dr{#i{*U~^m}4rr@DCX<6^>2)!@WRt!9dS z`NQSF43JzPY;a^~BOi0~y2{kW?{ zu&(3Xznt6ATYYp|D!fms5MPqw^r=u6vauYa=d7O9a7bv8!^LN5d1YJEiyUhc_&a|3 zH5Fg$%mi}di*;2z5^uUVB4&47 zdXk2CCqAyh9~l#BH{+bgD_M6!gV%G?Nu!+JH)*guVxqkv)Z^J>vI&1S17p_bBGZ0H zezhVPt6Hi@L!Y^-Z{f;npXa^iHv!jt4B>xpYG-bJ9Cyl%jU$uA|J7$n^3W%486|G$i=krYo@{{ zZ1XtCqMPmoZt36M^PhL0$O9fk77)=C!r@LQ{~0FR6(Wzzld2#iKRe2(v{2mU%Ndrv z7&AX$(U74xRxMU~E}4w_)M?pSe93{mTb_J)czrV`hM%`Hz}aNU`*x;05v-7%%19r+ zBbMJw{$1e!gvVbN((A$##2AbwUKeHQcQ*uOh+fE^^4j5aaSgv)L|DaLR&)>QFBk(}jQh`d&wq1YUUcqkDu;OD%m#lolz$Al z(Unb_sK<5b>^G|YBZdKtzld+aw{yLL`^6l8!mvp+s(?7qh&2@R%g5GaEZwdCt_4hb z(X6gzD4hX_Q991kO$Efy&_-nj$yRPitj~f*ZgX?0{9mHf-$(g-tb*CIO@6!v^@DDr z&&UiQb8=7<<9O1bGL>}6f^3b3jGb-I2V=q!nPck1-SK1)E{8d7k#c=STYX!OK|A64 z*X-bRX#4*3t8C(fREGWL{w;p{!WbReSPGFuAvf(Cs>U!G`|IQ^3`#axh0+KUGnG(z zoKqNAn1#*eR1=G3inj{8I>`_N`Pt=mMyorBN_ygFCs>z1U7{Zn2;J|u|M8jeMJoJM zUBfuv8BLv6s!BXZNh$8jS&nGZGxk1IoY%0Oc+TL$ZaLhcY@&5Icz@W(7$&W7$c)vp$aP52Swi7Ya))|_} zNfKChVZ(42G(l%LY*E*_RmB$B4Of5L9B}KkOtOTN;r6;UIWt}XCQ~UMIHqei;!hk< zdx4{vm+L8~t?-3jpCF9y64CAbF9lO%2S%IWj@*#h*JwqJ8(U7})8T=cOs7F9LUHLr zSz=VR*xgIzB&5_Big&mL@X`Rv>o~rsqz85?B_AqQawPkFpzc&^I_K0FDTLC#J+~@7 z@eZ2&ly;-OG;N*f_v-DtnD`GzA|j5_VLM1k3X9lTbq}c58DBA4^YP|ge^`(J$D=)~ zH405|Yc4ix9yw#ib|^EE;$USf9tBN5%5u6Jk;3!nW+}@mvHq$S3dmE2e=P2=Q|{vi z!mtl`x3(13ekZ_GjwXtyc8k1kVZqxJ@SF=lN+Wv5L(W&ASVz*Hz$8^q_DF@wyYO>i zqJaN$70p%M)FELNuQo;;c%eiGIfJAQDeFY>%#D&F{`vfr zF(j*@z_|U_jE_g-YmL3rH%PEUF=)#*pLIG+nANs%Z>Fs?tyo!q2_rdE^?>z=9*?#{ zUe+W$-DvH6XJXT(FIiF%0a5?_d2j~?++frf2l_f#e}lY#yQ#+6BTr%eCW|YFnD7I% zWbP&{5luLB~{ds9rXCP;nO+u;|2GLea zrp~t@oOiGNCq_+1AFCaMiQ5hz_Z`>F`SiFSlEP&(XR9_UyP~MqkY10IWn2VN$%SDg zy2-zw{2nP~Mn#VTrn>DWgT5EH!`zel-3{WgWdTQkA@{r9WF2tgMc!DM{r*S?g?9H$p^}JG@g}SD8{=e0tc=s&M!BE$*>5Q^(fiu!eqv>uN>vYUzBs}-giaW9Mlei6wBFlFqC9p zLta$9Bc^h8`BHcmN#Mzh z?mLVhXCUcG6#3KFQK$LmR(rfW3#1VSPq-n!nQp`rxTFNrh?LeiXZqYUXJuV&5vGaE zs8jETAX90Myfwp9-Q62(J?`LXEuy#g%Wi-7rOCC!w`Q3~$5jlYxD8st`&3mkH{dtZ zp^F7CpGEf%G3OR;E@E1J&|D4{RreV|J&=8YBRoI5Y|6|TmfRQ0wc6~-9OCT3x_=S1 zN5<||28#W!AOrxj)&W+wE81*5uQ)N7ZjwNG+=7F}9+0>JlLaWkD8$iIfNP(#*dNzt|{XZwg1^>*=GL7f#jqD*=w} zufP8Lf5BF3Q1{E(d>{Zi>iwlp^1FLHGA%d>hc)@v)}Ausrt!?-M__h_S#rlunc{BG zyDaw_SxwGZrI{4Vn|hoKSMfvYQmM6`6Z3vr_-)Q|-w^QEurPV~aJIf)UtR!;B*3dP z$k^1pf%5`ic{+tYIg_5&WOtWkpBsesy)oMk-6JmThg*ey@v7HM%H8!q;BSxh ziCAgq_pyjf`R8+4%o*{OqsICxqG|WoPV1yM;2=_%ahAn$+|USXpHf4^NFa{G>^T8Y z5_ywhx$hvU*73v{@vDjO`le^&!2&2K%ZOuCKmfaEjswUdg)M%Pagn&2PoUnrnbglb zknHCe-*Q9CN()9Szi;I1YdL$F+YW|ixUv#<8gdY{)sXgjD_V15(bxNWqn&k=?qiC2 zvQcz?l-ssk<(uucH8s5z&ZLxvwk?Ap@q_Ao!M$JEJdN2#Qp;3+ID zOaz?pW-7y0PLf2Jg>URgX)|0>dqZv->vp%xpT;wZ4tEVE>rFwEP%X64KYaD$|FwuPU6T!xU#G z4KWJM3(w;!?e0qPmM@GyY$V|8gy2zQtuDsh)HOB}{$nIO2fN9*~ z0=3IF*8&smU(M!U_fj9#C`)pUW4fP`4q7JFy70C~^}eZ!ChmGwohn;T=c}Swcau1I zmlGarf&MTLs_^A!d6}cv{W_bTSuK(!`s9+`sv+S0-$ShlBWdqnf+EN$r}acMcbAQH z&*(PhK;<2x1D>Ay_&I3c@Ife@CQNyDh@9sKstYlH9LFXcr-tQk_ zh=}Rc9}yvrZj>#h?r+4C)`#6*b&K-ZYDT*7#}A{_%upa94zTLLWcl!MlA0sGJoGfU zB_v&D7bx$0o`Gmom0T@nBL{LQDfBQ!vzpAd5DU94p^JYvaxY0(cSm2u?+> zX|-M4z@Ba% z(LlQ2(!mrjF8Qp_9s9KEcQ)#hsSL##jLI@7vV*S$8gYls`4I>DTwxl~@H@V}$=@g4 zm&0r^p+#{S!|9a`0&F$Iigel+i5IP*4tO_{jnxO{q5j`FvdR4?BOvr*u z0#Y~TYC32|%LyaZ=VEjx!`A3hZi%Tn z=WQVUcsXkLpL}l{-%nyFFjnu-E{4!k`we-o_r!KgkU~5~h^U_=Fr?&z3*EIcfs?4I zG5ilo;bkP1@qCQQEx7cPbg3ICYv8n)>r_YC z@m1y)!J`B#%0`OH)C%#ix{in)W2xsmNla_GTXcet2@KnSX|G7>bbQUezb(M*FHjwN z+Sw92Dj_xZBrU{gpxrg?eMRVX+$T4iP|AP`@%IasQl&amP08GO*?@OokE&*PK_?uE zgx`2O^(<5GB6#p$%Lt`teN)th%G!(7`2og=I_Z`@D4+z;K$DH_)? z6r_~A*U6cHxIqOj;|eI}{D@&Ip5hSV05P?x&rJeZtRqdQbCnDNX3D7AzgyeyCpK-b zACM*yvBgZ_gc0J?CpkZS%zKoo&gh64PWg<}J|J62d!uZOb)+<{xDLo1;y@V+kWeC> zaDS^t!$Y&{YnEqo^5@)Y_7B-qe-89 z#aeuxkl(Osfhfg_jhkNFzpQ|%kUu?;ZgM?XCI3)Fvh(!KhPyMjNpwPK#hmz)hn0P8 z3J=}$bP_GeiuZMpsBmS^*RcYR532CMcWafO$Vs;7k$JY2!YUByU{L6tB>a7Ql0bTm zQE!y-YtqCfq2D$8*Y@d&z)v4xKew4~F#<_eb%T?(6%I#oLN`uO`Yu82<=kqvO zWYCQ~q}Cl>I&tEBxfZkK_@!G?n8y^Q`>&w`*B%oZsUq$xNFc-BVmoGyy_5$XUd@w6 zDCFc?THTp95k7j>BZCN`1Bw?n{<7;W?3)2()Jiu!v*dft#^SBg)hM0_wGU)M0`nP$ zYFYW1G)f2Funnmt{@R4afJpANN4cF|{#wwR1zJC$0jZiy=umLB z9S^q@sK{M7ip3RqYYOllBKb}J(S0Bn$qz`)+v?E3WUf9Yz^_n=YJfEs(7he_y*qt3 zH?{PKKT5M6J=-QY>CFEN24iv89$<+aDg+SkI0=@SZ@=Hkab8^RbtyNdlTUwLTugb~ zlGavc1sYqS`R$&cdY{L?FV7~gQ^j_Y1Z>$KF_D2TZl`BdM2%}8cQgynjJ+AP%rPnr zp$@dmQbJj@;OI#y-RHVHj8Fw-clB?c31W1Pihmq5vz#SB0x%mIp*jIx<_i4 z1_s0w+mVN?2L~rdWHWL$feXT~mX9mPnq87J2_!Vvf0k^oUJ+}kQ1{Z}HR^E35LWqS z==fi>AZ3}VW7$fWYP>=rFk%7AQM#xGZkxHR=?Yt3R~rzqZZhPkU^ORIog>#od|p_^ zvx+k9ZnM1quCM=B$GHI1HD%eaB?t{U_+Uv%*^{0(MqDpi+xyrdXWD*^$jyP0+P8b^ z3udbFr4bc}-n?VD%?Qp2x;Usy(Uyc3ei5}T4~a1Qw{Q_wc!r-sK^pxzFE^`?@6D(A z%h(`~Q%Z`YlyUiT&NUfDaG@xm_^27P9>GjUgEFmV^k&|G&FxW(*lOjj#A~eRD+yh- z5FUaT8V7KAb^P&_{eiypWbWao56ar8#2l9o6m8d*{VF_Trz53iro?2RTgcCkGT&Ml zNiQN1a>(n3N8{G05IG{*>MJGP4^OJr6g~gFJ4+xu?&bPP$nnG5Q5@c}<0i;Y?SANM zLH0pS{_Z9@+B>t^CaxNQ3kx6nat=H%&K779kWK!Bqs7=yna*jMZ-enG+1`&Zzoeozyd5cCb+q;3bpapv0e5Ihm#yb@ zcQWUTIb&||y(C+d4Nzji5`3mCljo@iTlnnpj+r_fR~c)FZvN*(`$L!S#=d@&SOaoW zFZLSieWlzid|^LM1`A{1bZX5i_vr8mVRYfO95t>9v<0o0n*I{3i+WV@;M%8F@HmU~ zhSKVLqPIk)%U?1Q7|9+;17jUJks(Roj7cUKKUCNTYMq#8e84H4$Cu@Wqi2lLf);=f za~+O@Au-fMzpi=8_<{BJlhFDlNdG zdcoc{o?dic{p6i8UKy8*YlN%Oi3w^oO!sSp?gTt2*T8ZRV<%n$niSi$A4>9#+J&{E z`&z5XnVzGuZmvS z8>_1pHiaPYB1&Rna1QFDH4n!ThgOZ$zG%Z_%Oj=|p)4u{8kyf&l!IR5CSCJ6Wn|-N zzoQ$U$HG~JKMTa6E2{->BC$NqrJxq&6+%~JIKUb6Gq>+o-E)mWxqx20j@|>%SJT|h zaJgbxV--nw4W$f0GLhQmnmq8`RsRx_8k8o1{Kwjl3WF2y^pWWGGE)hmQ%=Y4wGZiT zl;tiX84eqi3Q^!}=h1MbV9Ek(ReN~z2Gz$A{*MzbHn@Msguz%9*;W~~O=R$WP6!1o zna6aDxTV!Qk^mf?grMdZi=6^7)}b{2F}2}tthT9ZjGjwr76Jez%$w+lR&}h#J9L(W zJ$VZSDqwQ;^uL}3ATy`7*QqApA?x?{c+Pu?SH5pwfA7*uN(bc`COs3UE3%{!-cd2v z*->9YF+HG@$Q3sCk+bq11-Xw-C#7*8)kiaLm-{`{#`}L#2hdg4^wBqqjG4$#B86m`qn4vF(O=wH3iUj`VX3Y>{=?mz+~$Bh3N#HWUxR4 zpwl-jrq(w~e$HwR!ATflPlWC%E4m!tvVSKD`s2EQ6jZ!O)dW+93}LZ;b`L4Gm_N&D zjlVcwA@zP?<70O+atk4iz`TCLVm?}M=uovv`lr*fLKG(otf`8OJ-{^ zw2Pp_{L6YKavnALH333)Tt!qXDF@1VQ(Qge9zwY}CEmGa$ZAvw_+nlvJU`?)T8I>q z&-E;uk;fr>BoEIZ<7pHCeb>Es68+XY_WE}>|CjZACA!xwO`Lsvolw2w72UY`v9WZl zi?K+&XL52%!H!JVuI9Ef*n1fTo~1!Ym5CBh#5VrybP){4cwMO z{KM8Majd4_hG&`AN_P&s?2o7aydjwVc~vYH0IR;0M{wOZ?W;0A4ClHIR)Z2F zHG;~g>f}4@S}63jswNa{01H?LK!THozRsMgNMIhFP(FO~qB4t-rZX4PzJ~*UoZgw> z&@a}5HKyOa^65As=#+8}EOIAfcY^ig(rdT7_VP5Suc0=TDI|J;)|6zD3XR$zSLYM2#^d6_G;L#j?L`*cb^U%tj}po<;3Izu8>jy5HP6ZYtNE- z!Yn-bD?n8f0VuWUD4cjV`-nwjdn$7b^Ts8OZe%Q@!q%k^U_-eB zvWg0QXAHB`ABY)Rj8}*-pU0CuIVeO3=z-UNNUwTJ`AT>Yh$R3jnKC#@s1A46sA)%G zcCvp>sU=z4?|n`wFQmqfGWs3gcy^!l)(6#-YBEnk=U1f9u(mFc#LH}OLte;#2NV7T zxqlwL`b<2&dm@v2^}4qwl=l#kQ2E6kv;h{@_Ugg~^@(weS;wFTgz2VDDKjc5BYLcR z%l}${wq77FM|e2{g*9?waaFT3lm<_tVsB1>VgXsZg$j_{Ep99uJOu6r)^*}ANu;mj zQ@6pVkh3h7{LB1&3wI=nE4jNu{bx*McRfVPm`SN68R=cp580~uKo1a-B z=}~L<{HO40Cn`Ha+J4Zs`Ev|tm-1NMMg|2ZCTCg=h0c0=Lp$tpbqPxkeD3T~ zZIc`^QWSqij=vnOGr_2iIgJzDg`8zL;fG!69X}?3V&w$yBqIs*$F=vg8ik(6o#9zf zl?j_bUTQ#EX^`1j-zgc=5RzadmV}&+huq!)?_-`VE+x?P`6JCs#XllDu<`l$Rij$g zuFZw>NDicTec@$JMU?6UsxI5kwKvmHk-cU}(WW$E6l2t00Kh)7_jx?%WPE8oO&oBr zjbH}2bCBwr6bR0Ln$!13pvwrQJElotk<94;8Wk!q*+Q~=o&{{bc4JuYR|s@se&MXF ztZqXaT`AXONA!6pId?E1k22>c(o1Q-dWj`@AMdUZTY zSj`w^suy2CgII#+1Z#d3w5k}-M#+CDih5T z&2PIA&a(g%zS%uQV2B3}`ouKe*3riDBcAMSozVqC^(KdI7(rU|g5kW3CK#t+V zSFGfBObaH1c~ijSWpOSrFN<0PePYO$nTK|C8yj7?e!Yj5K)QI;2;l+67-X}5Ie<{= z^nD?HvYRQyWxUbMFnge+M3YU;GCRG?7c=;|`kl{oUov5Hx$Xdb=I(JK+ds_dx z#~)b#oZr750acfu$-n?Ul){sR>&2X#`Y_0ab*Id5%NC}n?Qlsb6RQ2=8`U{T_?w~O zW(1=M)%qS|54|4fP4JZZcwXQ!;p)=koe7L(21oNa4k-? z(TRS};8g5WV9*L3(83ynH)2&p3EQ#A>59Q`}fhId&*~T>nw7FB^9Y*ci`hocsH1p?_tc4iK znd7nMhA!qiJ_NI0&}rbPZ{1kjX#b4re>-x7@uzxTV!JU_nfn?ANZY(+y#qi4$^Pq} zC&ArNAF~#B6O_AUD0zA6>#@M5XWCBpM>4;nG^xVDnyx(aihae}j9T^hCaP!pk2KwIe7bjNr94rfzHm6gIvbIIxwM;&uY*VdS7!|%<+h3wz_hzr%77xS|7q}d< zX@v4~ptQj?wxr3FYYw14LI-$wf9e^Y1=lho3?N-$Fk z_E^|7#4mhHFWO`OXysS8fF6a6#1p}fFg_GVQSQBm7`&u}JY<5;vOv>EQMnsz_S;8c zvOXUiY$kr+3rQf&u`S&re+oU_kS!OB++pWk&$!?P9m<4Nc>ba}%KfFR43ws*TL~_e z3Bw@KxYA0L!HZ6(H1s~tqrZOQ%e7PHpDDEHTbHKXV~_tpYe_E$5>3$ZttC-{UfW6Q zCbi&Mv61JHdQF@nsEP7j74wVBD4@l`eH&(Bp~Q^vmj;lZ6>BBm`>Y)q7eCe;Wu_6l zbx|{u+a%RB2a^@*K0|Wv+z-QWqwBfUV{ohGw#`HatvGFGc<_^wyo(P%t^~R)l>o_Z z@GFzb(c*kAw>f2zaz^e-02egox^FUomCj?yTk}>nx6fxG|9&gPAL#M7h1>eF*Yy9Q zasWawd`v1HY}+{e4Sy;ow4)p&+K%Y}{Rlegy#|}IR4K=GcF!w`!)ZIiEYXmgM_dP zQy-pcm$}`oySZL%K=Ou+oEfb`j>3duri&jxqdbJWZ6XWVjH`&MD8$qtjV%Q?N)Y~M z#=210tJ4%?>%$Kld+Cp2*qb z4ZqN|G!v#xg^8=;K}plx^Tq|w?&&UAay@{=vj9kWffyo&4rir4s_%E4qRd`}y(594 z$B2}QE70P^_4NDlslEvu&$NF4GA4V;-6q3Sd>%Zjo{@BFB?-WzD^Ky5X6LXZBnxL& zKYC*bwujyVmK=!D<0-fnuqXO((x{1lHyE5SOGcSvDD{%HEi-@Btc&*MY8#M)wBT%FM|Oey0Ztt7 z32dMgN|o&Of-5dW58R7`C=7|E9BtVQhD410V7!2aJ*SGzc~24`VbQv&+fQ+C+*jbD z6a3jVZ&7s17pt+G_fCj983N%05We(0w^6(*GbA2J9H8d{c%*g(8--^5ADAx@Ob)=t z6G8+DM5$%^@uS#DOlfw^mi*vJEfJJfSrZUIju=m2Ho5d0~@r?3VhSQKHj*ei1@F-{?8Si zqy~~tr@&;J9ZiBri;qgw{Bu=dvPIaYXi9v*am=w_5o0Kw{N9$|alrguYQyw^O+nS< zg1>FkyduMaF4`NPhfw*s>vSHH zFF3UU3wR$bH{V3$)+QJOqWXxoiuGQ> zui_Ny>@tX-Nd(QE4ZDE}xaWrtV&QlFA;<^HOJI7LoyQhM)G7ml%kA{(%{ZT5gUe{> z=O&C<4BGNoj(X%;?lDJYQ`~MAb!i*Q?FHO!*#kB^Xf=Q6%RcYR4Wr?7f4~3lu;7xy zUYV-!hLZ3(TQ0Cr3NJpv?D1a(bznOP>Wg_rnkpg-C~$zz-nbS3-Cgk>A}>Fx0YUEF z3NmVtJrDtic_QngdjEc%T{D^a=5Icm?9(iSuL7Q)vq-D@Ds1icg=m9$`M3S!*(#=& zd3gtMp6JEl=je*~eoU6KO=V5an2{aIgQMI!-uUJjpf#8CaX$1T*~_}jUdvD>_R3*G zD5>#2{ow;w%_(BmY-uPO*Z2{2ABU4YiGba*Ablj`hiL!>(MrBqsbDEY@oG(242g>G zTlZR--@#Ys47!Vk$M7dP*A@l;P>Hh6OFW+S(HkO^03P77?5oXbb0bEpNF56{<_BGJ zD$B@9(g8b2wKi&q1HST=FJ$r9*7Sf=fq21rD)U^hzmUwFs_3)Pdq1!jm^~lx%u11& z!-Qvf>tbdYDn_;2Qu<6n@jO&l?Se25N3|Rl8IxwU_BqpP z#Z-ab%uT9`fC&3nQ}$v6MqD4vlTQ%bvn{E?M)-7?wQPMTs?aj5floOLJTHiKhc#ro_+GuQDPa{5 zFys5wu~_!^c6EHO6%B)gqNM-TQLonQOq%1Om|6( z83lq+t^7s#aG}mt#_C%ITls`n&_EN6^&(oJd5WMZyow|){kXNbyV`g9D%i`*`64@I z8s`!@k^sa<03*EJt5cCIra16uA5Vt$2^|4zhIQ7Qa09H9QLVF-vgqKK(aIEPLE(>< z_}AY5akp52{N}w62D@7#JNsvgj3ZsLsd>ESl7aXJ;Xh`5eNPw(b`}iMU3N+vDiPu} zw&tjals&N#MLiQyDK7q|%&H+1dh|!``|9LgulU6*>^h7PGw=v(+J>HN0H*n1-JIfW zS9$Xt^MtOAY>8mW%Grcu154~{xT3-pk$z=#UDPi zB?{GQN$Bw5mok<@{r=4{FnX%3z8W-2{5U?M;NBa||EcMm2NCqr0% zK-jX<#dcnV7zFoANor4!t;CFucaeL7r)Qb-7qkhGQroTxc)CT7^!2>ik+NMozFUP0 z)uiT4XV@q_dO|0{*z=X@Y8Wn_Z}X!WqYA5I{ZTqX5faS2fhvsq*p1K*->Jg+wOw?j zPyXt~0QL6L0_GME_TGZ$%|5wKSb*JVPaT^?t2%u=$-TjVgOVxO5yfhT+j2AI z3vJnpWcIYOt9Qdjf*zQJmeh*D*);C?#6L1l5-k|YS1bH7F18_UP8#WRrYY|FogeWq z2DGrghH1|w6)hyC-$>}T&m|ILrY~l$dZQ&S;9U@n@l8)hol6^>_x4Vw0Kk|t3CG%5 zC1qP;vP}Z<5U8-<)aIohF7oDHA9d3$*)5W=$0u@89a;_uPGRVlx_DDubv=xXx=xj< zr+ue2Iol`0xvR`hipR!NeYBo|<(6{^jKSth`jgD(4+EXfeU5K>mWiB&$=1L85hJlf z3+q)u5m|%7~@8V7(LXv(|88Ab%(i1)yUk?PaH-W`B>p z&;?wX8*rx#qnle?Oey1!SAvHL2|7Srl-sM!5mGV|P(rvLC;+4<9S?1JKI`V>TX0B3 z0RcqKb}>Nzpp0AbF;meDIq!$bmf*?4DF?eaUu$~VdFGjx2rX1IsgfUZn!M#0mR`c< zE8%+}A~rw#bYfiPvCkG6UL(Rj*V$RDy|3PPw%^_}Y=jp93VP76XzSNjOcR1^GVq&aAh-@a! zaeTywL*&e(jHcvg8AhhSE+R3O5kB&>XzT5H1) zrO0TpEpLWPUBsw7UwJM$gP!fVLB%ukvPwZS^h~$Y4JD#?zy44#Bvk>}2Pxc2yK%se z;`8Z)oHi1Rt1ttO3&&P^$+O3){XMKmJ|7v;ekSKPQ@uSAJROEW- zV^L~G9SvHXJq2yz8OQ6m6;a8olhw+PEH-qHuCSdE(&`wBR24LKeyQbzzm#MIod<$% z!gX2D`K2CyR?;IIv_2$-mhYPV@Z5`D2|I7AM>OjSwo;?a#YMTzlQh1+e>A>_H!tT11nSapOU={mPFuVljI%_V$h16&=D8w3Kkr$w)@Xd*N(g z_+x+ny=Eo(dG&9q2oa<)SFDA~N}(p@J3ovP=-DoJhcI{_XYpe&QeO=Vppj#dPsjT7 zJ{fZEnETW*P%9Pk7V$PB;rg0YF%1goz{}CkL*ub@Pso-J4(VDu$;Lq0fqEx6FnV@I$^ofF)h2C%@>*E?`J(ljIv%X~hP2<6ty7gVnGH!w8)p`Iu^VclSvlG6&*+RNvGi zK@>2Kig-tmp97*H$AepKog}1`SgnwEH1j;Ea~S^8N^*7&fi`3#!kc%|+z%6cl#y0L zTr;dE98Hpx+B38rN(&VnIKsd?z&sGH+`D9RW;<7T$t^|Wv-P-&&vL*-SJp-q%fL>( z&jYbKrV8(2y&pVQ!lCD2=VsCntND8Vnv=JO{xEcN+I?rUl%XKUZBjMII98w|RMWG& zTYA1AJ3O~~>bVct?qO0J@RS&(Y|;ejN_O9_G+NqOIPUIZ6Sr*{g8bOPKVQOa!xVrZRL-$WGt$JiNoR1YwxP+)E@PKefuU?j&d-}mGrWxmSs&Ho8|T3@6low z8n`siO~JeAezIEfidpPROVw>JdSl!#DrnKTwP`ENh6uc4W$n&ULZ;lfczk_$v22IY zc0I`jm#}m}ur+k{8`LC;Zxd2KU7K8p1 z#S5TY4jK@E~dF0LCs%d&Y+Hk4vy`?$p4P0EAB|G2dS#8SbHSzbKeU&Sr4yxZ6f7mbw7nECv?tH{fc=w0`E zAvEKnOy_*rL`K$Q%%WqT34SLEmz$V%g~wp-%&a@He~9BwyaU{r=JIOc!6S9ZRCwvs zlcAj5_($-dsWhd=Zuf$u0v$4rBj>Cp;#LYE%!>jp9adM2E=;7)hD@*V4n_Taw*I(D zm_0982>l=r);~V_+riQZaZLgb`s1iWPsnsrZS$vl2jteubR-Qye(QV+*XhknuOtVvu%zhAc(2%m6-n)S8Jzn_wrRdC5; z%CKR)sy^88*zl_SVxO^wvW|H47oD^LM|j(`jR-F$DZv%l=eQC)&`|5??$WR|jNRTW zKl0aA|LtBurmmT|EH%x%Il-4ZhF>3T1veEar|GEdcs z=U`IBunCFI6AGO%RkIiPJflh<`(32wb}G?hPAr5#Iv>_6J9OtBJXQxa%Hq4<y(+%#6O5Mh(XwY%aMuBsm~ZPbt9^J70UY z)4FjH+m1R&KQ_j?6`qPfHsmxSKCJ0u%QsmdUzfMEcH9@{7ff@MF1VgryezPx(za_# znfo3*o0}^yTez`S^mZ2CZn=9Vcx6q*W=U5DGZwX6ZCf|GQjWG6njg`O_NDQx_pYz_ z&}Z~b*Vii6W2n<11zVf2-`uZ%I~ctflp?S)&G^YqcLJJ)`#SL@Uqj^+YW8)-gu=@E zEwz&8Ur=*ieFhSlrNonqz4a=(6ZZ<$8`_56qj!ZcyDFP8{XDnl1ZTx&e?c!zibjzi zN3O(>)7^a4&3A-aOiJvQ`0Hy&jw2tzOAVyN^;q*z0=ZnbIlZq3966~69iQ1|6@$|9 zmmQBI5)NGy64~Y^Z0ik*0QF6rvp3ksMSuO)WWteKj2f9lNnbKnzDBw~J+U6)VQaGy zIdxiOObW{Kfx|Sr>A9UoVHg5zor#e~BpjqR%=C&;MYOLDNzy5=3U4=5h9M4~%GkNx zRpCg^Q{9mn>w1K@x@~j9?798Jo$>R60W=wgjHaEJd$>b23LNWjuWo6iaAW7K9F-~- z%DPj@*^%`bb?GOy+|;ltEx2(jm9?%IWL@2Z*|@RU$~CAC%6+S<9lxI`ty2 zQNcGOE4l17#y{_nyA@72#Nu)z3zrc=wV%&o$=#*e$$G_jj#<>T#U3F?cBcj%JhE+k z&Ce)bytC&Y~MDU~&nwTo2o`ksc{M`+vJBV9FLb?-0qh7Mlrr$JVz5XPRr|zv^|W=F&c`Fe!p?{tvjBlc8+tJ+uWAcN=n>Y zYj8t!DC=^t*r*b!?&ur9;3zHqacoo-nw}% z;;5RH;LDhn)qdBu`F?x#83FU75TyM}bIX*ODzTvrGxx~SHmy$69i}{*Gft5!g0l}g zgPxKlanNSBk&{(tQ^7&xVsm;)1lQr>xt-nFw~^djYmwxsgAIw)k}9Y#v;Lam(eL^R zuZzhVkjW{_5-E)3j`I)~9@FSECgdxR8dcaq>d4Z)DfRT9L;dZObp}{P&sj$09eiv> ztj*5-1-{`2%V7st^s>9}?Yv#=XXQ5Kgvs%`ahk{-xlpaVEp}CoPTncP0TB?nc7=6j z({AOxmLJ3Pc;ywoKA(h5bd|@9x6xLtp;Ty9!#kvlEiuwpt+weockSF|b6cwTwpu>y z=BQ|72`yTrz;Q4W?(AdkcS>u5d+h>tVfKpX`>zRiv#p)Az18yYGZw+qXzHLcUX=F= zN&DpmXoJ4-_{1U9u_9(yRJlaC`(00k;D3&*k>ltV)-`k5%5zL01%dW(UNqKA*2m`> z;JLTVpYO)CPp6FtEauFj_3s@ev${{*k;^wLGu~UTpe;FMr!j68=3(gFC0-zaUHRbp z5--=b@*Y8&q+|Rwp9pTcdu!qd4Nk*kE;lmZips-}7d}cAY8a(&U!JyXD~-IKd+=a} zL1kmA7V$G=ofZ5l-DSvOIU6U=hk1+k73W-FR$S{l+I}dSZf^24OCS-b>j@)Qg ztw867TNK@~{3N9eytrr%J4NH# z)3{{kY|5=ZO1C)P==ShYA*IsV&h|U1G>t?H&3Fwu@GW!5iEDU`97pK|s8G`C$>+da zL+WNa>9h#Dnv_1sTvDFf+a83@Nqy2-rocsV&LJyAsiwTbR~ROzIOIBdTw_XQ_l!ry z!u!+G0|gtBotXPC`><6~YaeFck&9I)J$Y_NZQzuE!*0tQy;`kwN3DiqNS|MQ6#JF@ zn$_aPC-_1-)VCOy8sY7@%PefJ|46W|BcefCs*m}HTMU8J9#v#j*-ip@T-(_Q`1}NZ z?IN_QlsF)B34Sgz`)hLY`if(_^_me};h!!z8Q7T8a6u_1W>GO}s`SW_whSfTftYs@ zBAvl5yeeNQy5liPH4v>u+*3S_L4uWLF3NGMI8K!*8)BuxliSv zGxx7gmbz#GYUna>ZHOm)V`HQqwoYiFPFFGkf+rEO5wW98E-YORKbYeG!Jit5h>4#a zx_wZC5YqV{{3aM#9oV0PJt4yK&k6ni@ySVPU_nGdcgX)|_e9`Zsg;088UOT-ozT4h z%YX@d|6l9>*RPX+?m5Gqjp_p&HlmE@&8RHfE@s6hN9?j z=3fot->t^}=Je;cJiwzT(7bjM|Em+g{|NZNffKK3e`I|BwGBwy1H-C&8+`rWjp@I- z>LE~^2{xXICH|pZp(&~QiHI%@D9B#b{B!dDvkT1uCMvt~)wlob?Elbaeg@i~f%a#h z{TXQgUkkK9gX@2pCVryWpD6Yxiv5XV{}UAZGr0Z?uK%SC{0y!?gX_=W`ZKuxCoS-k7WhdE{M5Yu)V%)Gy#Ca@{=cJn{Vz+xpPcJYDb`O~;3qBclNR_% h3;bV13pDN$H7C8{;ACc}Cj$QzqW5`v`E5CaS`G)PG)ox%`` zA}Beam{@CUcUEh9Y$LSBWS@MjQ21iuPjhM<6J5VT?sK??66h{Y$P(GUUt z#ff`5nl~X5{C9RUCIS40+FwggoqCy;<`jqg*&5CV5EL4xb@RH(qp9DAfi;<$A-iE= zi&K9HKT59Xm?_0``_oX;h)~`NrwmnXdq#QgR6)JgqCo3Rwbysgwt_k+0wPo6PK0t^ ze2&UTdzEDT2%h#_+?!jDr>czUlXqSZv0b0EYFPhnDYS};8A2&-r>;NlmRrgI-vokG zvx6EqkAH$Jg5iaNzn(#4|NU@D^}jz=Y0m!l!&&nGdj#yn|LqGL4*wSn$4T*j!SH{< z@c);JIbuT(K^4fwQMMS7eCf)J3Ev4p*UWg!l04hJb>oTN2AkM(sz0s?MYTWbDD2rD zI-Gg^3e#tCGobUq`1wvI@vDopOUMD z`1S>s<{cfQYpSl;?X8Ds#NVwvGrRjw=X%)n<)I@keIe!>LzbPY|ay^sO zktTYneIzl>0MgR#@ z0wYUxL~M*oxavmAJ4<)w1l)`GcPN}qe(Tg&wveEXuMz^H;RXMpg|p=np}*2HggF1M zMG{fciA~x>G!iIi^0v#VJLYThh07*AyvDL>CyNyr`gb-UZW9^^vge2q&L^ZMpozZg zdC2p|LKnhh4k5LVmO@Jz+6X*b%tE7^P6DT?dD*+A1*8jfmKN+!#TkhSe5+c+}SgBAkMzN z8*`<4^sAmqdKh$fK}@AIK)YvUuQUmXdn4mn#?N5P17SJf72V*`5olgt&Tbh~ENZ|e z{2b$gh8_%Q4QWlRh)b(ChMG5Ve!E>nvwa1^o`j#L&>ww`r<#78ZJ>g(xNY^~Y8bR} zcF2^%vD!`S&B`A|D?;w+9Rd{;F0BeerDQ-$LB1(3@L(}IRJoGByGR8(xE^X3-dO05 zTYGre`QijP6@AD;?`8>9(MMcN*$JDOL}%#X@J-9*GV=UF%H69#`gaFWN6 zhnuRyAKRg|Vr}vDfHeH?iQ}VR^pI#Wc(5SjXgK1|;ba@-B?!V^hQBRuby4&hVyt{U zcAz&hAq=Xw2t}JPzIKuG+!>;1ChmN}3bTP{Y2jz7da>i0vGn-#r;=3}2NZ1!+m}}? z2UZsMkx~^ES0o^){xLWgpHzt2uZHzdJ`cz+i}x9BSje4Bo91SEWz#bu%H2sGx;8NM!bZ*w8pSwrSrPxIFqQ zu|xc~;N`rn8p3Pdz#&PScSSa3m?5mZL$qTwb_vg7+~3&LWWMd1Mo!+=34dhN?3K)S zmZP38iPD*sQil}b0bBOQs_1fp!K$4>48I-?9mMh+d_&QX9llm|4|nlLdx;nGNl-g-Nkv)zkqpJTfh7ry+XP+fb3x+-B-$N77FGnL8^ zqz=mq`14e|6ha!D)$CR>O%{Lms$jrJ9t{mPci~>|C3-1-M&nHsCO?sfKT!n_hlK}> zign%JLGe6I8}=Qbgc=rQsRob?hr3^%{0Oc$h)VS+dr1Wa#e!!!BNF_PURvvjFPIUN zAzmxQZrXl#PN&%HZ=oNQydU5iLLC|qUU z!?-PalaTq-GUVV(c5?N=479Nic54=)Z$$c7^&=?TfI`PL?TAb@Vk4bgv>(^a#X3?) z>`Dr-IRS-l!wU*JKg!m;)RP^m*nAVG0`Xr9HEy#MnhvP9n`ZR8OaX;c!%tZXxbO5* zYY?~&aeY-_*&i3w$Ex3r4^ktgYU*{3RUx@3@C~mxW#V?JF*|SfHERbHN1@vl2OASX zs8H!zY!m%oSLMvXoeGFs42)ScN__Z#gj_F0scd}o+z%CqNv@Skwd)aaYPLo>kQ8T> zTo4Yaf)R8qBX1->(M$dd#+Xh({`H^=L>bOSF06pw&0?LPr^YzC(m>qvV9C#>jINgK za&n9rbg{S)sUb4Q=n+Sa#y|Gupr?LjI;&a;)Nzk)>g_Xwpist=-Oq$pJ# zBp?mkwsPK9>f5cSe|8?$0cyjfDC`3aIJ~d+L%8rQeY9{r*bmG8gP^8p` zSb64xv=z`{%F+eif8Pk*00#{Z0^A#mILqeMjqtT}t3*c7SlXUmYQsu5uHJ5KjVew zQSj1@;DZ@TXT;%sq}KY%+W6z+D%zF?66WkJ{m~J;`t(B=Rb$sQMKXvpjq8lF?oB(c zj1kNlmr-OvI7A)^hW%MNts7BV&D*Nw$n!X`*%0Eg3Z;dw23JGa&6x`sCKC_XAk__c zb21j9$M@fySy^I?^7S|(gILi z+qrdFp*C(p1cc1{#LJY>S$+^Ps*kJC0s?fCzes@r$l^DqA&3Wx#PKXYMJneffhhd@6$C zT`q_}{{0bmGBa#*xxf>e5R{$mgvGV)>MmDf_!1f5$5yU&-RkOLGtgWbZJe`@y&sRa zp{IjH>EMq98C~ABL|8*VP3!j+rGPAKLuu@l3}!B*PVS%C#euxK4jSC;xQx7(=XqZE zwMicd9Z*Kv(m=f_a3nNH&JmI8^%9_I-OdJE$&{CBq5(p5b(U}rjtTcZIK9pDt z@*%zrL(*FiDqVR)R5~t-H z9z!iI2pj%d|0@mbgc=-L{g|eZI1&oD5!&;OkxXu#bN*9jpGoS7Xz6c z)T_mAtBqfL8luqft^m&kYVh76bRIjhA4|X5{mB@dPFx*W%Y42g+_PQ~<|>0g(}1?p zxX5+yXLu=nDKW0rAy7bZDezO7(E-F?poqSAR%5FKXTx-2N!|aka_P4-1ebgA>YyO6 zgXHQF0uZ@+gl#(5;})Isx}h(T9_k4^@=lUQwWugy=r7_YB|zlPv%z05-}_RLHT`Lq zE2&BRAa9uBw$sT&j|QH#_}({R17+`cQrLQuAeE}S`hG2x17(|x2J6U%*c`45WaUYxu zlo^s5&Ha|m+bx`@Md8-w1-9EF5NvmIyFduxh#`NdEL;w3BV|$;a~qpMYns()^UM9( z#NOjC2wvRQ=o|lLSa{|Ajl;BC)@vZV)!Myj-@P44*}u9|#0WwM?74*<2*`<;1gXZv zQ4#9>0OX}X5Z-4My0&ZP5h4FNDnjMt)ImpB1vR&=(X!8RCju0t-haonN44jlIa&0Q z>t&wlsp%5x`{%)yA2%cm7PeKwbDRUwX84)Jy*YY_M%Fo+^PK_cJO8Vu6`~->u=1dq zDu6c6#WfKhvO!4+g_aKGh^94UE!5ZBwB5R1{?7N&59S?%B7#NU(ez zqXI!oYT?m{kTQT25%Rgw`Deg`m%)SgGxB;DYTznW*>D9eKXS3+8e51#Yjp6NGs{b8 zNstH?1@PNbO(s?xcIj8Cd8*;$pS|=?k4zJ%U&py@y8iv#A$Wpq?xHwP_;^ZyzMZmU z8EHL2c`&Pa;uaK_mEkAYV@J*tbf9;M`rnX!ZRvrYyt;?kuxHWd!Po}1@z)jr(s769 z0!BJ~wsHtBJLiX-9JxN|%#lwDT5KPTO2{xCyT!{;KKtW-&n>F~EBO(NbMC`4*}d|e zN=0%;kJJ-|W>T@=zj`-`b9!2CJyQvDYJSxsDOIA^eZqgR>7=ASf6 zvEz3wHMJdE9=38P5R%=JIxkc0X7(z$UQV4b(7eBs`I9Y1*!jxvoMHmsLDJ9ZVRHa0TU2B};DUio59rN#eJ`)5KN1m}0#S zrcK)28UED_{UK320PDoz9Jc&SM}+=Bg~9=2m~-i0GhV{`Oi!fRjr>UTTO0a6Rl-i# zGx|fTe{WC_cgAurUiZB7V5s*ic504cdcR|E%Gx}K998gNWhuGpRI2>g;b;D-&YGdlHvU`47G^v#l+<)9I{oVNXUhiB#u+ z9p^ITC4?QhBs`p;blw)z>bmuSUgRrfjh*gJ2dP{p+Uw~BwRc+`Y3zpxf%e`T0z7whdjiiw!EqVS4b4b(ESowLo4vn?{(w~>yftZ zXh~gW{PJg@??nM1vC`)-qT(uO9a(SLLT3NHN{>D+Bs(E+ zwHVsy89EG+E6HR&X}BoWEbGxWH6tZDtxe`$yCYKwAYcD`T3m>!@&#QO zjU1yU8!0|~#8=+w(dqIL6SG`GD|cSzh_ikyo&_ygb;;rni#nn?)V&%tVj(&wd(rb9)tb#=%aWbSNyU|v$}z^O;Jsd!KjCT`iBhqel9$hls5 zw&v5Y0;YUNe;J4APEuBkl}uqd(R$AQ$^wjWcLqeBUml>UK!O5pQvps#d$=C%xUTxq zv~OB{2H4Twrw5nO-6s-HwKt8T#F5&@Nk3{zwK@-0em)-R^)rht5gn0kQZP9mHIKaM zKBR!3?Rc`LEK&INly&zL$LI`k1(~c-k=-2^UwJ(mX!c1Z6S>cI@ScS)8Ef(~dHEo8 zX~+AtvM`B=kd?7_E#FiaBF~M!b0$n)Slv085L9=eWknwKwq}@W8s6Oh>t9&LpS*gv zGzuPY@oTs?qZdLpRDI=ND(>8z;mVxsj-?l5esYbaZ3W=R4QhFB?H#a4k?J^&|5oV(N*7RisvtfOoY?R9~>CBgSo8PU*#uH^wE4O!BAO|(vXnEBK# zH&LzSg6ThQLXo| z>HoU;lzEV{1zKd zb27Ddc|OY$;=7u#z?TaBQ53CvDWJkw1zud49BH^>UQgavPT7NG2nn&*AU(c!%k{!R zq$rdE;9uJffZbOX*OYgJ3oNBhd}-Kijltw3S_@pVrO`a;>Up`~LX%Z(k(8*sS~$1g zP_JdlWrv*?Lg|G0#g*IN_YLlsDhH8XwJ0Kl`g_B&_xysiHMp9>EM`vj(uqN$oS^)Y zoJ3(Fk$xp5AogGn6H*raDVF9T;$DF9PT&g(y9S zj@GVcUv5}fB9K-OHMkJUSgter&vUs{2PBa@iyDWPI!PbSKK@Z5K2*fZIdY_w=_VpV z+iCglkwm^V{mv@kUZh~zH3<#Sd7TrE=dbglU*XQn3C2lo*L?iUW~w^Cx8<*;_%w1B zgVF}%rb8>t`3hLn7|2b!(2ZW^=?~4%_kX76K6?;MT0r4y!BJt}BbZVb)vlHVzd5z+ zJV)o-<-kdwvn|xv@C}PWWI>kwK8wsEI`Bx2FA_w#ShLVV53;p2Sl`u}z0^ zBMh`_le=oY154P?F{F{7mun@ch?b;y7vi!4#st`(1d{;BPC}hLv|dk?kUFHRohe@? zZr+v?Y=jQ(g5a%r*Sit|=DZn)?JAF>OPNBK4oCidQ1;2Q(@C98i9>cRR|YUQ-nXvS z=6Os_n>0fht~N6$6~bKzd|xET{wA2z%ASR5iaq6~+^<3JT=EZLfOaiOr~kV$|2zI) zKLjYEXEt35hryr#2j91GH9H}<+Rm4c2w5c5xBO7#1XZ!nnGkxoN68$=#=@N9-ml9Ha zWyyDV?=c{bIY#3HgxNP0qs1jqm>{9%{hn|D5TD=sX~7h;9P`bJ@T}2@NXEq4N@x|l z=O1F;^xh=tSuTD?O`&OvBhwO$#Gx;_7VpPkxZVundAg|+2PjF;S&oTZnxZ5|H1G7| z3cDM<*o(XBn?4_25tFML7gS?koR5#7CyUPOim(5>?uC0X%6bUVK5N|*lhG$t)Eb73 z+LYd+S*!u0MAjPDgzO1S!^h_@{X^9!RkGM8Q--7YFFXM`P9Fn^sG?Ly4Y(A%{pzHD zv{`Y`O1BgQuxl~W)-z~tVCFzGb9_5Zh!8nA7^(TB zwF3~AT&ISY=jfva@$WuuZX86GQMvmA(df|E|3yK#>MbhLBtsji>ha%><<=L@NelB_ zVQo(hwAGK{-de=n{2M+0&QmVtt0-W`8Ml^%7YR89Bu52*%~~5Jut`E&XVpp9g2{ zN7$N4|0+TyBsd~*=$jq5)%P;12I+$H@;c0_EmdYB>Zrf#U$fs={c4-p4~*|hF#=Od zmj0%{kmw6>Uliu4pVst4yV!yRe4E`W`9>2B6n?f+U*Vc~c_0Vd=;OuTMQl+THry(d z?|S5>k=dHgiyt@hOw@&oS0BE24Gv<^BioL)Bij9vx2EfZw!?et{v zL(6C&em$LjndO}GAGx=!Fry_@WRgJvoSyc98ye!`3$|R4KA7G6h-qT+PV5LFW)TUk+g-ONw zI|sI&(H~$Shb~H3VHKU74cRAT!dt=QfPS`6?I zNCK_bf*NFG8z3Q`wu5=5AYfH2=q(xDQE=uB90@I|YNXC^RFW7GArQauh66;w){tEN%Xt|NO}#i7t?ZvAU~I z`7~;O*YC!TFAXpB4=q3Cd$EIV*CLWZWakg;^ttoSOIS|(`QIiVacRNvAHl)0R3LOpP6DGW8+-|O!2wOwyfuhe1Om$EuE%d*Ky)S z*4v8&p}LIq>n{Ete~s_FZL>=L@f9d4*`Ve64%fqi?kPGAY-Q5fHeCERA;RGXaj(ap zUq3eTGU`sCQvzz@wrFe#!jAT$3u$!k>Oh8A2Eio-(XnU;P@ ztBZqN!7WzR-=qONOs$}_nfLbzET5Fw^ItzmKq_+pTXgtV-tvhJ_GR_5#v<^ni+)dSxV&}3Yt8b*6l)OjXi;L7l6TLAQ2P03#WGR>O5T$ZEE%$-w{ z;{}cNd~Wy6Q)UQaf+Z|d?BX^d>E>?Hp>R#U8!Bf9T>O0YTs#8)U?7K%aLaFd0O*?v^R&J{6uD0sXNSu`m46G zrk?Dq73CHNuL`#qvI<%L7uO;y!PozULH^hAfZX$%Aw=xTblw~a)B5#$AHYO)SlwWKF(Temt_%^~h zK2ne3(MNG!bl9KF&tZf&0*p_ZAj9G1=Nz@f)gdc&4m~olL{iq<2m0Uo92!FdF@kfI zHuUa)RO<3jd&g7zrhjt7#h~tEt)qH$`sIGWOvlAb(Cs!50pv-2R)^cYhA@q6c|N+w z_~_$BK1z>D z`*Gd{DFI9EoWM}jz{1uY=vc>B05>?Bw7kp>oeoR4N) zx>!RzeXO#SY+s+n3?6}Q;{tbfz zA$n1;*-Pi?xl7BAVU-}JyR80{>Ml=Ba|lMM`zc{-N#Eo32ZWE?h%PlLIDGb4k5x2) zXM}Zn-RHkj&AD&Er&INAXhli$#7^~V_*Lzj`((oMX!>cDTrPTjfeTL|-ABuv7KZlNCtl*9Gk23BQeI_sMP<1tE&v1K+!91~HhE4Os~s)(ML1 zd;j>6t2u7Ye@gvaza?N)E{qyu;+00fI2X^hweE5Snw5XIz_56_ z+`a;OGthjtQpH354m^{HC=XDb&Ge-Gm++cu+ON=n4)0N>NjXan>OjztJYcHSVW#Re zllM*Z#vVo!l=7pV3}s)eU9ZOm%bTuSu_fi7r2&?y+7edfzX6ecgmqXdHI(UkfB8}T z3*ebg$9M+$SbvxE!o!Wia1;g&_rz>- zoB&X9_JBImb3=c$ynD%i_wDsTDw3Pj$2AX?a63KG71XDnE>{-V(6-V}$o)6xO>dgX zJiC5|3?ycUl~Q@FQF%+1I$+%n>hy^t8#T(0NUxHeZqBGsriu5l0}VJ6r}^fTi@bxM z(q)J~0=!33-)Q)t%1imt-?Bm%rswwCATjUUBu&WXhbc+t>e8@lsYj1&Pq`7M26rM~ zX0HKU($_|W{N;4k3XbRM+in^tKmgi&Vdov$?FDLg#~4F~~)EQC@)`7S8Dv-XVq zCg5C9sX9(D!K5Jf$=2}M%T^zoqXvM6T~mPv~?PR&_x?W)=WE_kx*@RTHHW( zZS8ijr6K>Bj~HXu>4|CJRy3A6yx{_rou$%|rZ@Kb;5_7TI{Wb3%vE`(!@yN&2>#gOnisNe}OdId;Jt57xtgQzmEb z261E=;V1vGcYCbPac2m2j-5SdxX6D6{_Z^rnDtZo_&ESUPF>%V+}JOagHG{qGm)a)J(B!yz9JMo$fqM^ zG1R*Nph5XyOu zGXG-oE_W?!#UvpQlQo!wg#6SlnUnu>*v%Mcbkp(Q8IoaE=V{=amcpl)iNG74oq4Feg!iW1dSaKee9$d1TW9 zWX6pSKwVv9i)^^q69^XcMkKGgaj7RfRJ;}lrnADWZ^w>(Cs}6)Te)I!0Ow)VQ6d2Ez4lJz8OJv&_h=`|9IPdxG=}s)axzU`H+8^;4 z$o})Urxd`DRM;}Al8?2xMox+nS7?4W4r7?gjJ_S0iK97fHxVrt(wdAkUoO=o)90B3 zzG$4g%=oIMXKmyQ`#b-W8_NG0NTyKGcd}+$^{gZVddiOW$mYzvBtWs6u;JyUGvR3N zlhwfaA#yGYu`bqLR?A_W0bdFMb)(s8z!7w)fPde?v>{>JgjQ!B`M8$~=v)?!jPWd) zYi|7oOPE%f+@}x*4wU+qh^`#K!M`i$$)%&0@mC-m6>R^A; z0J$DnL;wf^EE@DW?e%9ZpA~Zkz9xj}M~ABnkjmudih^Z|0t0v5lrv!}^2kqT%E%IX z0fsZb7Ho}GNp5Om^34^s+G5jV*%mYpNnjTK6QOmujen5OyXZShp1F@=HRxV4YCKeh znGBGmu$#+1(}E9J7xV#k9<#X`c78)OXXApF(*phi;6^((ujf|*9mvWLV49jm?ZZz= zF@k+)JI_{pmUHP*Veu{RZ__zj7Bp*ziufKv?wTAT8()*8w%K#30y#9eaOb89tMzB< zHw0G!%F}lu9>3MpImulQ>*YGIEDX3c5ECgqVaCX>Y#|2`hKKe(Mqd#M40b{fhH*l& zvdcjtNs;r$%;A1+Vp}y~-Wc|%xdzU`sW2NYU>BbD%{B;$VgqYCw`VFTz;@W5dh$?n z*n*$^1NmM!I4x?J+E7Mhuch(=cSTAsJ=xW2SfNAOBMt9b$Ru~?BKL=60!*0~4g|yf z^oOjHg7m$ozZNLfE^Mh?D;II9BDPgtKYV=edh(zOm`xfU!^n6eJ5*Bn0$dWL!S=<7 zI3Fv#Gwf+OhD;TaK&Am>2RKrxmPFbE06N{oL`ILw9@a9c`%N%?2EZm|yrjHva$9kg z`DFX|WFX)pB+G_(b@>^e4AWsR4CCx2N&zKcgcq|h2x4+9>a`^3Xi?=C7G-8vFzM-Oco_&6&jR$} zkptLmTzi4Z%|c|UMe~RD)5)gBVCfXv(5L3yDPZV0J^w1f-^KTO;6+ZvH-6eSw=EC{ zjs!7G_s+N^8ocN1PV}8IOH4|@gkaiJrNReh={mWM4-7DFQNJR*Vf&ugm4NMb<!rWdDSYw>4M{Qr8@P7nbW7^n( zDrRO0NG)OntSV>&lWkjLWfwe{_`@3cXnX4opebnvye^v=FD_p08{V^e1_6BfyP3rD z-VEgx`|E@bCU{2j1DUJr{%f(S#iw440&61u_tb!3LR8Hy` z_B)l8ldX0Et>)dUmMN9eVWn%i{xm-l{{j`=s$^$MXocCX#Hk8go^bPaQuF>go>OHZ zHOUnWkPSz=E)7skph!x7C_pfYuGmgDThUz4ro-}qXik#T+8u`LHAR}P z^;#tP>hA-^JT3+CJQ7e1FD5t#Q*#}!8>h;nB4G;EksOy2JqLGBuGZl zB2U;~G3CA2*ixdW*cat!R>bvRRtAHt9Ld$3H0_~l|L`6b4>YNFfJqEl56M@ZBY$KC zh&x5)Jkl90ungcOwPzM~u0oPP>OS&_pyG+U(e*Bg(QO#_8q6FjUrLT`+Ax(|)GU<~ zVq5BV>tY9sBWb=8tmQS8eB6gSR z3I1Ilx%1KOD`{pEJD%XCL+Il8BN(aSd$>7~k>EemkpTqXJSrirt4xy|;UDft1KHu8 zXsP0vziz;^)#e0hf#}nKQHts)@0E42dc8X23d0Q#h;9~FH=CG9AuEs zYrsyIG|v&se_A?qK4IvwMqwnQEI~=vK~oN;j^?3AuhKiG9U6y|5*cvDlbbowtr$fpS4L7mwvF(Mek&wb6Biw7m0 zs_hCSJ-nU1C|>C$vF65?WRPzlmzEP4ccBDybB6kO)O+95)Dz@dbWR5?-S2y|d;dSb3>(OiS3WZs*x-Wm} z;d5VMWIfy`a2NWWGD7~9KoiB{KV3Lk=4vc4x$OYHRy(`y6Z>v^GC?M*v zS+N7pavOvyrodK3B|bQowh#TZ6x1o6cd^D`GJ)F$m)fwIrAzBl7i0<=Z!P%rT2(?)J0@-s$SQS4@sEbqdj0HU$U`w!8K z<_)P{-|W}S-1L8RwFsP*6w4D0qpn-&LXiQV%FIl=Kltg99g-q@S33WUBR5~1==?D2 z{j7QjzY0_g0$x1db(WTiiL{@VGy*Pajki{GL;=?baMp>A8g;GICD2s~UyOJHLN#+I zxO{bF4Fso92k+!+Fr%@%Te?0@?yi>n&t~tNthEwIOvX>2u*aX9 z3|6>9w8=}ZBkYH6{>kqD`*5`hd5$d0F@J>%k)wCHUzrJ#A@b+(2_WH`k6zyv=AJ{1 z^aBLGS85t52Q>CKxv#vw<8m5vfzPf^R3pW>v9`&MLWd0?5UQ2$QIJ0IPlpZvqPM*? zU=Ua?t>)Rq48Im~R=o@SoG46DwEwr9P;kBFlzO50f36BbVew^C^*r~$+M<&8Hg{-b zK5pZ&Yf1pt>WczHHcdD-I#jVC`&1w}M>Vk9&#-<9a<$nW{8Nr(?Mu-ksrk`fM}OD= zS4+-C&Z;%Yd-5>s@5AL4&lsdvaOP#eusLIKEWpka)toReqpE751uks>IYXTR^7#n| z$7}}fvys)%=R+=j|0P+fgWir@<;OKDR}P`PY3T*zeRog(v?G8vtHFh|*^Y{MX9L>Q z)`*V}%d(>KBKGot9mm>!2UJRycC9phC#|%I@C}x?u55tJ`Ogy3rv)w`+K0+-Ojl>- zp@1v>afJbxfWeg=ReM&4c}J-v-D*(^QF2f<7$hcKuV!9yK0)3E><-wGX3z*$N7&M| zsXF{6K%LxKUABoY2vddRU3sCN9o2Ahct^PTTtzbtul{5Hs9Feop^k{tyro{sU(l}? z?8W$%cxscF1$ty5qlpzs;E=ZaRE_vXOPT05sw=^x=|X37jU1Z2EQe9`rVYO>si8mW z+a<^`dj|rV7vP9yR~-TNBRM7rCzI&&mwR%fqh2 zsXC0YUjA#OlF9w71<|<2rGNFW}i+s;iAvPYHtajgNH&vE@8~Xta0C`buG*C z)cjuR+hgu#`p=XFdjbtvc$;{9F{3z}+5I*uxRE@0Yoa%Lit>e@zOTNaWphQTc6no! ze1)kpXnWqyU4(@r0jFW*urE!CBO<$*Cq0HKc<_CF_onMh^rXcNYG|pSe3Iwm!4&7R zu1d^aK0aSoG`R8^&B&*v8sX<`@GPblX<}Mg_VsJof4mwapuRKTO;YPe^9Ma#k?86P zVmNfXXGrpYtXdTQSLqe&u?3?TfEZc&qb3S|o6twA@|fg!N@lQrfVV`|I&L);YtK_{ zVNcO;&1G1fLwQZ%ir!b{s)}C91UGf^fG~_{Ux@zx_02yaF)r48Cqfapg}B!C%tKYS zYx5PRL=XfSDuoX8eYAs(L=dCyJs^xvqfZEo<6sCBR^6|~qegt~-3dGAZ>VY(*Y z9AcjScPyFO7l=_{_FDrjaYkRHH}&PCGsD|b=}EA1%7}}ibumyi?LZ^<0a0ek+|Oug zqnZ=d#S` z6=e6$dWdn~a+vqg@FDQo7}L2LKS9krkb$FxEPq8@kiZI?QfY(s1?@SB zdp~KIXqPe^ON%d$?f{wA%=8>E^(0H0aVaZf0d(y-iWqDi27GlDY*`;uth@N-A*OTW z)sGL&rm^J$Nq5hHZd7gdK)%_-m|~X{0jmTyPqr*f#PEftQj-*9KGzS7e_XbNr&?md zVpl@bM8uNc;>}B#5&y?2TM&-38%bN!e9LQ&uI}~A6-96#YAf`nq2kl zsJ=n4;?O$$7&bit#u8^wX*b=Qyv5)az@qmNdT2#{FbUb2e7}>Y{b0{eUqPX{aQEVc z(O+MKNi4p^_3bR`fwWgZfWr)kmW*;n>y2X^!Go)PW;%soJY=)3HKxq(WzEU&M!n;RRGR(!{Cq&S$polVCM) z-_8ZAF$dUWsqS?V4Gu0PKzW;0q=%!DBjYnl}JLSV3i35e{jmG_< z4i32QWq3XF*EvwnzKvp?WlVd}v``Pw^JUx!f6E@4^5sTk_D3AQ;l&m#|BV#Cc=T+` zkb4-L7-hwL0aH>}w=BMs6w$IvnvM`SbRT{;+ITQXY9NKo;d^Y1z+EQXJ(={?*oOOp zbB4C9C3@EVi~|d*D0y?D7_cE>aa>f7M5!mh^(7xR1jxEZlk%C-!h6~y;U6A&wJ&4u zwB(qH{rGbBi?88Q9`*ec|E0HNdKmNdmKJdhV7Ce)E`G);``x>Z&;CnsZL|RREY{tO zLlBo=10RdB54e=vTWuCwBswzV<$3Zq7(rP;hmhz*pi?~EKGRv1F#QyS;_P!M6IYqb z5p-w2IG>Gp@+(6jif5`7b7TB9Yd)#X3BVn*>#oANb!#5u=;BBLE-GJ-g^r%$X8z(s zkdJmu!#i;kx)T50mz+WSRh8T(lKztoghgO`*r%wXHm_(0)QFDk#HzZdX=KJ}GH4!j zfgvl?NBWa%Zj)tGzS^V+Q;;oKa-O1mshq&yUgnxw(X#mw7r~Y6iDE%Fe+TpQ_mhc& zg{z&we)kiQ^G9v(j8=WF-j5l{X~d1Jd&v)09m*{zR8ZP?UX9ABQ(Dj;%)XINMVQ)SY zp{ua^Cqq`k?-q^vW(IqU1cvJ9EM$+Kh~FzkP21$OPEX~&WBD%j(?bv)$ie>ka9f~3 zTJVq*B6KMn!@Gq4fxZF6Wtj@*EtL3_wRJ(Am$#v%nwk}EeDyr5z{6i&|GHqs~+=KhSLZQmT}nf4}a_`u}t5Ts@~9K1@Hjg^uv9N zxgXoNrPAI5uUYH~mK2I_^xXHNk3OKy%70j3EbLWy<6dG-tqpIkf58>~t;%g1T2L(m zb<#ciGUs@0(^O4$?mNZ2Humic>f;(QFz|e{H7m+m`ky&`YrfEEt$p-h=NE~z5RKU{ zNFdIRkO9Bzo>cY~-pi@a~#*~E_ z_OR*O*t=KSxsRDF=#Ca!$NUj{>Ci{2a{?tc0kTr?r6eA-7%)kL z`=?L#rLyxHLDdYXb@g-2fN7IWS<(Z*fXR&EsWNwfO)2Al6xS>9(YaM2!h4QE!G-h_ z*v6!#qm0}tq@i`~ot6fzN=S@#$%qZU7u>xRKdO**pu#j4WCiG5C7Htgt|do`Msb<= zvO@len5HQc9X}R(&tsdCRY>a5UCngu+_%6tNh2KE3;Gyfu|6A?02Yg1dyl`uZAd!O z7tZF1^uYHea&2^7z_v08E(rbo99^|KMp%EF(S)=|oW5G>rSiGt^@4vH$-znz(4k|C z+Ra{mPtSE_Dwb0E1Pz6xV8@e3-+?12TA|b<9rpul<*3U|b8qi)uE~^MP|7WoCW=KE zM)ZOe#*NZw2+btB=)o0=?w7S0-jjb~-U6eqbaUP==L*g!e4ngC$)Nn}_dFHvqWEsa z87!y!_*q%F5Tpy~_y#ncq&W?U4vw*__ZllpY|WFI0VJr`1wxJQFuu{&bIR11^UGjs z!dPqEnCJ9iTF;jc{D&%8b|>SKM_9lutHBm=Cl8;cy3zma7tQ0H5+(s;DV=e_VsCxK7 zv?**xgMAfjb_G=CUJQk38t~8Dt0pE8jhgQUr$=6HKV*ZQ-Y8C-`98*J+h>lnpCP_t z-3K&|W_D|BDjCX+Xu|T8M6;)6b>HPZ(mMG(@6x<{Nw;~*N~tXn->K?e(#3f{Y4RoC zy8T^}xEd3Hylb6wIWd-;<@fi%PD@XLC_GUqv-p$`njcJN1_OBDol5dwlAi82KKhrj zgm-3)g70ePSGE5+=0m@LNP75rmbspFDeXwU3m@AkLu&$^wy@J|3vb- znTgxBE+$k7r7`V3*~h_hGO($bQx_x+;tIlI=f9g$&EW^`nFRuOn1^5{xNtDNlvGn% zd~|5> z*_>-Jmvh{~9SMfmMQ}%=OQ9&(?G8}X@}7G{cwde&1UKYo=IDq$BV@c3-{C@v8Zjzu z{q{W@XoMS|GZHF~_1@6Hm&N4YLC6Ijn2^aQzIp`ywdQucitGq&tmTBwI2%Mh|W*|$g| zWtn-edwRa_as1wY;r$&)hmMwe?)mK3bzbLreyBCah3c<)qAaJnBRxYw76v&`Yyh5h zthqksZ4d3ouLQ&ZN12070+kUlq>rJY&LEJAp-e=J&`PQ~CbSW}G?K)xnaJYF>&mzYTf3flKn2vn_ONTntxzTKzkh~9LvAK&B_-jF>8vSo(k{HzE;isYo=@O+U*qBD<78dACks@ZQDstB8mKK^ZKietL+TkYq;4yuo!_OzBon9B z5f1u*hGdk~EkuD8Dn%fW3I}#8_tD=1Y|$sXB4zRC?H-O+H(DP{SJBjQ{k^*l=%C&n zMfS}^BfV}wRH|G6Q8AJPefS$2wP7hOmIB&I8YV=MBPjT)eMVg{hzq{lML+;^C+Oj5 zfb-MvPO7?Gl5k{aMn^`s6$vd`+=CR}emsR`G7KWnnZthgsW!FNdzI8(QpsM%{NXu6 z&Hnf2BPJL$4g`O?DwhWwb#gCs&U6q0UZa@SRF%@Rcj?s}sDt`?7m?o!yQd--0a(d$wK9K(8mb*tV9hNA!*nQ11g^z3P^VW{v$7{tU zGDCQU0b9H1Ioh9l<*qu1Z|C1C1k!5lXj6k37YNMGytpNR?U@7<7Qc0ZzpUiLEDBA7 z+8Y8EEGP@P;7xD)&H%GRvie=_gl>W|`Gh|BYm5vEt{YV4;d?uk658$!w{VGFMY}E> zvd57NrEp@1w;#U96d!!WTtE>8R1Q1qg*J&NLnY>GD93i!=a<*tE74B=p<<7Y5V9U# z&8$IF|K^dNT%3Z%r(x#M$*u`+3;u9n^l?AE?3J+&HauF!U8>7&^!jsdeOgA z?LG6o5TK6uq{rT}NSdt&s(voKV|+_FTfovR+x?awRKFJ+vMbS&XkRI?PyPv5U1kJ0 zEHMp)_s;Bu;My;JZxz`tEuE1LO2xr%lK;{UzvXAv<@m{1HwkI(pxbXqJGL4u61b^i9(D+QM=Tn!nse|%5* z(?0p;l3^fq3MG78ySbVutFJc9J}w^AyYUq`(u||*nZ%N_%b!O`iP>U4s%*V=f;HIN z3*vAd(@Aw92MvgMdiB>#8ipdWQ;%eor3MLa@J2b~N2)Ej^zLmRP)KP9Ud#?P*^D@d zmrmc+3em$+ntZ{bH(C(l&$Cu?Ok=+ z`H_+mL-n}a(#`SsWj2!iC;pv{ z9Fhc{DvP;NCB>c8sM$Z38h!r^I;U?npku@APWcA-s)nM#teU7(E-~R){S6!e<0Rf8 zH|;%nK;%cgQF)q$I) zr4G{GE8YeIkT02|P7&^yBi||EMtktaK6ye9>fY}Fkjcx!q)42+P*YPZ#s?e|#P&E4 zhL9_NpaN%pH?BPtRbIA7RhS>SDEu&5@7T<-B(g^`A56dQg3lY9@6-E!V3rnXs*jS| zZO3L0n<j%!0sVEw}z6 z#2&aUeN$Q0?T`6tjhXVlJWosKR^rzol>q4nEqO)bqxBr{+I@Z9?3G%4Qeyiol0O-N z=;B0pyG)YsnXQ6L3s>|v*L_`moLN(X1;HjI1SygXcXzN%QHp=7s`9+IE2a&kkC2SrlAaK{nZ1@v?E?pbo;(8^;;}`cRDXu=R z!9lnv;WjOmT6(y7zu>VPlZ+$1>l>mw#@I7O_`3OPs%FEgY!_auscqsroZJm5iD^ri z-M8E#%EK~C zv%h^ab&;;K>c!{$wmU7bdYUIbWpLL`T6$s6cu~n!}%bCs5p!AB6_UK#vWH2tEtpw0?)T6&hGa~uZ`xr5DY;Qalbnd90)Rd zls<1Gz)&27;_XMSweY!D%ZJNswwjB83|U!ps%x%r&mAtFKjNLhHdjxNy3uNM$A(_p zqf*dTTd;jwt9mMOY{M9-q-@bUBwpeNhCWiQ4Pzi4kg`f7h4(a-r0<#h(UR4r1sDx_?@(4wO9YhBg(5!4=lP_8Yp~Tr>5mj^!^D?xF&%HA=+~xDH7rRbkdkM(cC1AgPN#Q^xv$QA_LMxXFdG8Z?_ahRWx5a-!x7! z%t0f)Dv0!ATs%ON{T*Cb7GN~IZL%p^rI5{mM#_mja$Xb-NblH3K&Uy~2Q<-A(+7cv zl3LikbG)H=kKdkZd(>j-#SpL$WGzCFz}V_OB#ri$T#3mKsa3gK=L)iSklaGRx06b8 z1@|!%5EVWB9%yYy`w=Ir-}Xa+?(Jm)a*Gy!^%G(GlzfO$&Kt3ABR5Su8%M8H;%$N; zk7~q*u?#Z^p8wUh?+ejimTf);J&oqDKrZsmt*0hTPs(s4wiq(1u@K!NUN zC=?iAMIC!sZZX_G0h*OR1Z?+@A9H)^e_UubmJ$hEE!8f0$>tdEiwdW69ils#Hm+$K zgyZ$QJW9L8mHJL3F1!*f{cTwr9!1u&9n39Iuw-ru-`%1MfU-{eSukm}QU<+`6gNk~ znE)$D$1bDFCAE(G!B^rx*aR(tfslflG)_Z__7FxU`Bwd!W6TCm;*Q|%B9*Um0@aEO zCVU-J9MfNqrjAjTj~xd72Gnpgsu69g?@POMKFI5vcog?6)F_Buc4d1!=J##1*$dzn z7tO4rzq(FCA&LF3g0<(p6NcTC((%;Ib-DDtACLQWK}3{aiJmBg$alWmU}$mT8~}sO z6SlotxV2x&SL_-q?OGXv>$zHl(S}G(^McSl$Nq~w@$7h4`^~J*kzO)_auhzANfo!p8woF9lZ|$!vVDe z9F0!PI~9{e7#&)f$75mJzYqw?&!Q`N!p#uc<0I5L@1=MQf6lU@{mLsX*<_HUZD!ro zl*x#zU3d7jRlvXl{$0^~<_4T9D;P2cG=#Ukz|W$#%2aP_PKRA-n-FcN{OtyNYcCO@ zLOg`TIeoV0#dKhs6eiFF77Gosz}j zr1N_uj_9`AU{9x#hROM)p;gfK)^yIjdn3Q`Da`bks=)3;z~s5*Vt@j!IxHJdtPln* zK*~>Z?p}7mTu|+B;MQ=G2^+&iVkkNw51o{do5rvQ*AVqf8?)`bHW(g62VdcQ+6%es zLf~P)P%T+>G$828IN6{&NzqdIFz6N?sj+=&ES{Q!lUUhCB6FwXYX5*VVqA8YeXHlj zM%y2dmgda^S<-JXql61&EBarW-Iqj+;aT0cptZhk5!_>y50#4I02bp&I=yNoB>E!| zowwOVXqc94`TCjJOyIFFpB$w`cIPa#`+fZBk`VB6W&d%i?I`EEZ*RJBRRVawwk)$z z=l8bg(YXLnJHs|$!o`m6;g~2PNyNBA4oBu}Wo&jme~C`7QvS;Yd?0sa%v_UsPUoRl zJp0cbmVL7N(({GA1f_lq_b<@jyaLf4M*)b0=1t)oYJSZ;{uL%vz*&zx){z$tc1H0} zcBZ5CC8$vR^z(Do4fGmUrU8HA4y^4UM{@(*?1sQiYBLeVzpHZDk1SbY__qp_hjoI`Sk_WiW$`go|QTi)g7YlDnpex`#Yby*)u95b( zHqu_T0xduxvwRW?u60K^`@ewsT+?UyBHAo3M5jK+eYf+DL7W;D%8Qy=MS`$h@HwP% zc*TSdllZglQYheQn+KSk- z_ns&-9X`P}RYg%K>zdHZy3MXHfT8pYF1WaUHe!qQFMH5W4NhjC^nKybaTGYfF(_L4 z6!4@IF{&E-;IJr~fmHh={)!oP9DM`oO-vOOzUHJ?4z2`dK|(sL*FrC;ZdYQ~Q%9RB zjc&V%GdBNTU)~>GcAEPJ zjtEX!#me8Vv$t|dA%y$jf5IFQm~QW-cb{6EqtC$|#r)25W5${wI*>F!pXQNerQiZ~ zmTA1b&1*)Ojy8eju83L6Mg1Cq#qLROwUwhNufozH%e`9j*X!MEF^-Fw@~@=@DmTNWG{}K95h&aIPNVqcaPhgptsS*uFf>x( zv3=&LXu32n_K)4%J?~rH0VpDgO%VIf<~SM{Eq@yr_Xd|I0rpqRyPhN#n56NM*LNOg zq(RA$>x?kI_ooGbobmY~%&*6`c>bPWu2GnulT-wsx|`jwdD$vB`vBvP^nEvY7f~ATO^)reIyBHU;!zx~ zr=r*CL**hpF0ub)lLwYqVn;6XvX6h2^+9Syp!QZENyaZhKpv4F^8169VtD&JFOi(( zx{*|FJhqt8mxLEh0BcbVxn?%)bb976IP!0NiW*3?hwryDO~1gB|M1=vt%(nZrXeUF z@L2iyx+g=K650wmn%&$?jk&3g4Wgl1mB`IZrHmPRo0_y|-|* zc?_9ddNnQ3;tZSL%|V-UUs1XFbT$ikOvKCTTcjJGm&WjqGdZd{t#u!GvoZJKG4qeqG1p&Cy2>7*i&ELyD z#y5UoS|`z~XZunD zWkhJoAQ0-nZl2@V4kZDm*Ms@N4VbU>H&8Kj_kYdmtQ1igcxF-Lyc`($>E5X8mbOv_nR}XB%!u z_d%Hna14}0O-(nZ-rkdtcAn${dlzso0F==~LOMU6wWU}#noBJNJ1LTueyNA7rCyX% zX)x;0B~118Bx3zeIcO!#;z>$}P3?}pcS%;a+9i`BI6 zzd9!m2dmzwu+}6to%TO@H)1|~f*E_2F;nJ~DN{=_upOm`KWCa%c5L`|J*bdyTJ34y zX@e=TaS`+fS4$$uSrRJ>e=d)-z*0!gVigQgG~-;Ov_V33(T*34UBTO&&bs81g`8Ix zimgzzutKf1`y*kW**{>^F#IA*gfr#&r{gfj>UkTxZq+5YR9(xx#5&#p5B+uU4QIH zQ&3xkk-=iE;uEo=#R!7@GcmSVx{?Z7l6+9hf?0G4SW+MhZD-xYC3}qQJlqUUgUKDj z!WH}@Lk3XV?#!7N11ILow|AA@h5f8V+$ndY${9^hF;3~H;R9J109!q6(RBkeFy`rr z6?%Q~P|L=ZeulDd*=@6d0C=D!w@CVDzVK=G>2$Ny(;0xKpoH}@@l4M5^f zEWP@JT@VLfaWXRYMHXFlYVKbxfWYo1D7Mu@t4+1hU-_*Mohx_IsH1@9X{?im0eVuL$~!Q$-ZWTPg(NlYSqrTZT(k(k{D6b*EL%|ByUM3F8jzi52 zc9+`sgCQ}(DFVG1=7sOAc7ZZ`mBuaFzy80MMLdcmy3t|{82TXEq2Ix_ER7s7R7@E_ zoj}UJ?0lm2EEbtefFie>Pu}QF=bZ3oSzwp&n!N;Qv$jTIqoXKD1*S)gA!Dyr`LsvF zZl~M(>D{;Qvmmly;Ti;;%au?_A{#+ApCxjXjm9vEPKm%G5pJ>~Ktj)w_XFPmOq4-{ zDko%D1DYClLkI)jpF`Ul7u#o({7L;*4WUs5s&3G<)#Ys--U29=7vieO7#(PGAZWL> zN9E#f^~cXYf|M#!&JIkOBj|kLB(hJ6xG%Y%`PSp-R7W)V!ef zOWjj$sC&7}sKePN%hqt-9YMC-0=r1;Bl$HaS{{^C5bZ2!fP z%%2rPUo9hCV-P&jB4zd40quCzea^LkOEG((pm>+R2XGW|XP~h?7 zya}J-T8#Rz`61Lf1-bbOW+P`jOr6)!HrswUVmA29ASF+IniV_U+yiZu7r&WfHNZOY zUtjN=;W-?3jUe$PNCTSzaon~7pFPyg4fL59U0J>mM%WlL1<4|GrVdaQ<@Te)r#NAm zl5nuVy}AYz&{$Z}oFXuM%zvL9vISWunkOjI-^&VMppQlHpgobt^SXH?9GPsKu=wtA zfmhZSt0F>;Vv)$}EB`^t>LFuIufpqil#dR9?&}~p40B4MA1MhK!X2mk)NJC0Elftl zBFbmToR19Ouvk1C=(}L)j<)z^oE4yOu4E^|xvRBoaAq+7*+9L}%U8gyGz=E>L)2dS zm3&;X;a9Y{r4-)=HWCoq01|lx<dFGX`F$oGQxf0$3W3IV5NF}qw1)slAhT_KKFZtd8ICW*h704i#; zX?+W$+_Joi0v**!t$y3zZed$df*_bTqYbe*6g4XVNc>#Xlw2nmup@Vqs@%>8pbRg5 zaYHz`1wWx*(H^Ujzu;eW?Y1h~f#NX6$J*vT4qu`?Xu||9QW==w0+WyydHo?<)9fHS zkK(8^B0A6kiV)EqM@eq8t-$^G0f!&UNq9%rIPV&5pX6ArFj$Om)Cf0E{A!>K=nXziyvv27VH%iQ9PE z?*^A)===p!Yxbb9N2wH~$u?Nt@95#f03KIo(t3eaO9{5?&aHhXcToG6%nt^ZJlHt( zeG>j`oU9CjWftGI)ZrB9#_H8q6X^5<*xFTJRq$xLwnA00s_s;9|HUG7=iF!8S(Kv! zyUmih6DzEe2RzV)7sO-q{FX?!mWWc*80dE}s|G#r?Ve$!}UVT zJ}20jXM|y^8gq)I{CdRJ=m*wgQ6g}#YTE;keVDRb<^OH&LFhi~xSva>GXS-*{)DId8Bwj86kJ`gO@PoWhV!yGV7xE+yhYk6E3P9c;e zE_DO0WZLUdgy9%~@0tZ~YY{H|w|bY<#>#*QcKs0pYS|B#Xx$)X%?ThHur6Mf+33@HejK#U|@R0OWlw`$yVWnoD> zHvTT4u})B+mPkphwt?AmlLO||xKM!pkewM&2VG6AeVw~O42*yY`_`FMvJam)Mfs8q zXGB>%b4bLi5>^mR0Pr(xpECeqUo9;4min8Aj*%BNy2QLNTXt52Z9n=gv)cpAl^5N5qr-*5;39ysFz)~D3GlU*?Oo07|B-T$0 z^es4IXLlZ^WGxfQ*i60gd9awrqr~z7#O(Bg$jbQ=#t`UC#byoS`(OSC4x;y3ze_2p zqZK)N!G3x-43C#Gk&-eorm2k?DXUYDY-vY zLax~qU2B@qRXdp!pAakiNSp!Dd8aBW`nOAEaSU%`VWWQOSbuh6Pqr=l9)uBH4gFz0 zJ>Cv@8r-F{W{j=PUkgP_|t zZJN_zromVdoUyIB))T}Eq+|%mS z3OBK|(3;a4X1sFP-pFj>x1wYp82yUNJ{zxn|A7!S*nlsdvHMi$3(npAab?vwkFG2$ z?uYwW*|HZ`Z7r2Y&ig3L^aplD!Ib`TL6@*`t#=@&a%OFKB=v4k()5DXsP#ui?FMESvzXbSMeI*eW#5M6K%dXY*VX{8tiGa@u?SW?c9`ir$dt2vd`6y$BHr7=d1 zNog{!`AcnieJxk3uXnqABa1vG)7OMu`m5N2Xe-XLHA2=8wq2V!PQ&K}<4zVm9n3vx zdw!mJ=?A_nc>pI$sBgCEyP_dCz<#p>)-mnC=H?PO;8dPV>dOnM~=Gn57X4Tc_p$pd@_cqN1t+UU;^gc1FX2_^;v3nA!FgaM}J z|2`s!cEbPm7}^W}J7J&`{(oOD%Wz-ZE)npXKWn|Q3WR4)eB>u+(9-ddPxdi^d4=AX~DgAli$3-P$ctGs` rzQOmJhqI6GWsjTx;~6p;Fe6-PlXW(%5$*l0C8{#L$khZ()qxWS1pdmNv4D7=x6h ztV2=u1~cF1=(WDTpU*$=dA#rYhdl24>bjoWd7j649LH0X5nP9vk(&{MAZFdGS4<#? z7W_y9F&qMaG&i4Q27jD(zG`v}fLFFeVr>1neuOLD<&EI7y1C*Yg+V+j0{J36hBL{H2(gn!Eo&F567q}>jD0G1pV(L5cI$6 z^1p`x`rja-9D@JN3j)O#JR>t!I>{)xhoBo}a~b&9R;l(|4}Fe&K|t;Ab%&~~kD_fw zm4v!Q1WRf!RPvf1{#hx4!!AjKKTKV*ls1E0ho7`&ae$P4!7L1@peQ>wW95E>dO~rA5lR@ zz6=nQ+krwmSWNXLkp`yg!WCcUmIS~>mTw}h_YK>>74k#!k?oHH;61Ri7bwvJ^j(Y2 z&9`Yvsx2jY%B8(#?6I?%+k%FEhW{m5}Wg^d^yw+_XPk7QR%V4 zsYnT2Q;8QNLDX*?oaW0@7f?%1=y1$SldASo-BDSyLGZb?2(X6o)=I9M{dw;DKTGa} zA)Jh@33g%X5N#~EC&C}zX;YuBy*Xa7Ni3*{^$-=ydwm#^X9ZvLIxbX#I8)TFCZ8|K z((iWjeA%;wm%r(caf37Bc`_X*(~v?CSGL(e6?31@-=K#g`Zd6}vQ9f!w8<-0(8nEJ z9{UR~XBW_$Ude?g}=ZBZEzqM}L(?d|C4)`lPUT2bVQ)*JB@j0CM zE8}_roAk&07SidiWaC#G%m|&WKgW&jCE~kTA^9Veapevc)v4|5e&6`Y!HxQ zJlQL^9FMO*%=>jT&sEj}clsD4&p>$?5+cn0NFsfI86M{9WX#3Yyi3zjH7%*-ErG!f zy}14POL2OToN$jh1X%@v&8^0w3T4(s_7UNJ+EY1JDRVvQ(4I}WAq2y8KHng#ekvi4 z>4L+w9Gg}K9@b8`*x-oYTn;_KRO4w$vVKe5VJg%4ab1OL0C%sGu=S3Hxb-Q;4`oW# z(R>zce&F|WvErCb4pkcB{Mc*Mwf6uIx? z>LBE6M-)DA8FtO%n#&f-i!F!#@UcU*)L>2Q1eXhSgyuK%oZs2>!J;a_!|dv`)t$I) z!L$uW2b12&-3U#nuyoGG$T+_#Iadfiz=mh4mb_9NHC7K9H$5mS%A z0Ky-djVu-DJl%ZQt+hm=%GKa>J~x0f8zEG_qfwG;xB}+A!wind^yo)xj1D$#d3C@* zR7{=(8M&c;2l$<-Q07xED=~WlrX0=;cIO`B2yFkJ({+|pyn{pIwx%c&jmEcMIfwd! zS@(O#9`Gs2zc7dk2V*p&yi^2v0TZa>W1=ZS`L@xYGaA}xwJ?v%4uqUseh5;b18>|p zIWJ>9@kRMXPXC48mw)IZ9?WmkJnx51;Iho7h96KCJe?IRxa3DG%u~bI<(P*uJuf3@ zBfj5IIdAFLy#6vgR-%fs)!|fNt5ID_7=C2`QbCta{f|?YWUAb&V8+fVGU#x{`WNwP z=wUy3P#vi>E>WUL4nCCeIOVoFYWSX#P!u?lY{~1pR4VsxndGRe7Nh3)!0^C49Q*B* z%0iC{1$u=)PDVh&CY_uhf|J%az7@O+3Ak^O_5}2!QDC*t>59S14AGqUQJsa9nOS}) zI@96k#X6_JF6Vu2YrTcgtB}z#@WMyvK={lGXi2@YvdDf;beGTk$9w-#2>(XjrVY7<~ZOUz@T~*}C&@nSK zCaMm{tGchG+He6x)(tK2SW3+ZL9AP3e?LRlWlfb6>UaXzZ^6;la05wg0gGHtjC6Myt=z8#Uq2?TEyN-7uZ+eFd2xdimgktgvH1Qq zpQ3#Jhf`gu&@qc}b;wgC%*RQWW$S!Bs(&uj3aSUAiUeNDCKoRI8RP)&Z4pX@y81^f)(CJ0W zLpI|!Vc*|BYm=1~=Gf@UAA3$++X5it&{7Db{`5G?Mgt_=PmcJjaYEZ|%~})N=`N9f*MU zVcd!I&`v!ik8y`Bj#Y=t%8N-u(4{M2qkW}EmhwQd9T|IlAqxR=k#wh*Z=N?)e|ju(|Cc-=)*a$Mhq zC3M@R{#zCAL99f?Oh1KS&Y(!16Nz-|dL>XwoMr%pB zX7j<6E8CT2O3KG}XrPg&GHCdPLJ)qga;ZI_b_j=nwTaFQgsY>UkJ9Mq)YWa>Isr;Y zMDLtBvs>#kl8e_R7G54RK^-uo53%5s8S_}fm*XZ2pO{d_IFim!eRGz8!w7DqMji&= z751RKa0I~G(A`6uwHYoj5K|G%)Bj9i!-*wyiQq8{%3~&-O8f5!cfzD#1*e##pbl*r zbW#aw7HAIL3tXCDx<1u9(8Tzh)1K$ec z`m21`z*A=bha46SFi}MQ%cNT3aJO+-SO6RbCs9Gc)9ExvDmH02|0XcsH4JIzt#z)_ zC!}H|kM=L|!~fP^tq3s0H(A%a7b_=;$|kODvW>< zi+Jz~)lU%6dAc$2n+`SuDh9;H4)D}CAr2j$jkaZHg${ayTt}A*oMnv%WdG9UN(Fe+xrgdkQU_;RkZvCu%mvXlkV>r@I`>1*WUdTw#|=eRoPfiwm${*OGi zcM2SDx_3&1!Kh$WU#}}MusA?|e)zCT?-+|&y>@}{rmZlow&^|#6NCkY&FC1aF!FKA ziXv+GijojlCfLR3cn8LWw83|-f}2I8!!9LskkM(%Mn3vr0N>tbE_JJOjd%D`(HBHdjoCip3F<+MOf zvz{Rg5?oY2Dd!d)*#|G<0L%0GP7<~c6X5D&lI$)s4NYkDtpU)1@|-9T zxZ)#DQ%GmCN)y)ui>89S_$ZGGrq&b325;;;`Xz!QtsxBH-~jIC2m$*qIF<##L`U&I z(HQnG8jJAt@5FUKu3K3ojGBpRGC+=|ATN&j{wEmwqC*L;w>=2%iwjyCk_GD_i(|Rc zFfjG8d*GbOfBooZ69h^}O8yGKUWD#rrv(gi)a3H2ju-&=)bRwM(CWMcET-@x2YZ0U zpy^ZX{2g9c0(!DA&OrRx5sKbna~qu%wgF!v z#SYqND~MV+a}^|XJ|RNiWxWP|xQ9x1!Ad*yC#E0epX4w4J9>4hORvXD#0jYq&*VL3 zMJiTztw0u9{SI@vdA`U$$rY(G@X`6Y1SiSoW@m5+$b_#fQwi-}o)(1+3%8)hAggyY zXI=YeHmv?5d6CpPrC3&+^dj6-zp1iR)ZAOQe38%9z!uY%aX!rdrUl4cT(!jQwAIKn zzI&_JzFO~ZrTMAWzSJ}S?KZey;gXHJCt8Ls(b~V~p)2A!AeXO6`m+zEl~Vv>b7`qr zJKpM=5sjn0F*W39Uol&*cGt^_Ur9dyWY^o81jU8fa`UJ=A$R;!E2k#QdGRi#B2jap zZs}g~+4$|QTY==n8@$Y0kw&^}j&Bh6qq`tYi`3gVrXSRo!WcPLgL`zBUfzH`Dbsu++?fFNNJ5FwPVILPTz+%ahRrkreVNx`{%^0Efz`j`dg-Z{=W zL9XSEO+Xto0oBfqmnPLuBQ2EtlPE40bma+al{*dlvqS%9=PqNsOpttZ5EUeq6zEgF78xsil zB3tU(Kk0?fT{l|9<%ovawrr+%6y%R^leM)i&~1vcWe7#NeB|5|eFu>NE6Ek{I`iL^ zDUb(V>yRCT%X_baI#3rx=DL~s%wBG9?s*15~{<8UYOG%4b z5%WRC5K&iuJ?iQ&HQSeYV9x?9i7Ld&3Db-37K=Qk1yG>I#Uqg70a zh-}%j81g5plG6&QlNR>HYImFsh^RxmvX_l*`_4O6| zx!)QCOj`Zxvgo^%))BLi_95lav>(8FjTfw!H&SO)NTj|(=|6l&(3yZY8aFwfZW++p zD~U=B*i6%#Xl&6cDmx6Ffh3;WhO*0iFGpKC*#&fYP1c&my#f_d)TCR}oHQsA9Ub<%r0`R%Q`q*_15ttX00T>Cc` z*jr0$;l`v>cOtQLTG-Mu+0rjZ13dIu)#8Ii{D#vxF4S(lb|1M%>|8{t1>e6a2BV}z zVJDDmB%+dKYf?sjs_LFkm+{LdI9!s^hH>%c*qd>t#mx;qyZseciWwbZfjHjS;I9;Z z*$Q;ixz_adVi5?Aq!{<5UZ&?$Y!}ZPBEtL(rcR;0Pce0z2l>fYH%%I*`fDebFZ+6u zt#Y2mjWv#VF4v9ExD%N+OkNKvrC4!qR_@lH&rhMA9#z^lC@!CDtdOd{Mh-XbR8sZ3 zb@^S1Z{Oh$|6PeW6d*fBkeoThowL<~?%Ks4F%WCH`%`^Kf9`v_jJ7(;X1FV!Su~ZI zqzVmis(R}eO*WNTyLj?q8K{26?De<1R#bYI59j=FGw)*}t$lH=ua7Eo??6kHw=fivNDx0S>gio|5r`XvH^0w;67W66+?>IFSAmo zXbXhwRxaah+v_KQH2+iC3GtaRE>_5S6>C-W9=Vp)Pt99 z*)5lsv^IQ9dx=I<8p4$cA==}Xws~1W4KL1moJ;G?n@1(1k{8Oaf3nIWH0jw{#14ptYO%F&;l-eD+DbdOp5WWWd55})NS%->sSdoGGj^N zuod^{o3NiAlJ-Bh;OY^-e&y`N^e%~8$`Qs#l)z_jpf{8;M4G%ksR0nzB2q0N;Gc-g z;VH;}ragZtu&e@qK!MRL?1>esXI>wA7)GP_IF~;naoFCrGHbi;#nnbc1r9k%)J zShRmJD^XZ+JFGQ<06irl0FDTBG7!-@Y-vQ{&tCq6KZ|4mb7-C>uTeFggDq?fbc=)$ zhaWwd5>k7O{y{%Y@Tb8MF)}lG1o~gQKLbO&N7?Dxi98F`e4h2KD#fLz0X9P81I;PVVg?KZphgHKKX7<}eg$!ya zZx^P>5jzquZ5m*oerI&Imd#h6n8xK6&3f89imglhlmBw1+ww04cyc?wA7G-o+p- zG@lZz7{Qxq5eH-LkUR~*m%oX1Sv)WA2#X*Gcz2?ZVZ6%zJ;9=Q6+m_|5UK8IkK5W- z@_>y{sUbGN8IGL_$Egp@Z{*L5w%!Phak~C1U2Oyw78GE?uMR6sz0YzetLLBnH7}*V zE;4%51WDNaLeNp!Rigq!W`8u2R{9ESoM!mt4Yz165`TQw4I^z>2@|QVAP4yayast* zjfnM_z}GWvCuT6{^k3fiU{fC4?i&nr61wFN584(Cyy&An}s>gP+5HsalW*;_J!t6_*X|Ji4U)%XQRPrZfWr=6l0P7dSq&{#@ zuh_47hQg*koq5aw83LHhAoZ7uppTFB_zYu@-GKpWVdvA#J0jt|oiIFJ?<{L;plb{O z9dB?ES|4GU<`;wByGnKS(s>{>m_DOce(EnR-q(vOBP$O4k$k=9>tW2#+|48jp}DD` zVT-OZ@yx4%qPiuKHF&aUjL$=PNyS}vUW&XcUy-o%?fAd-?_AhD=3dz zWO^t={8}<-v_bQXyMW`>$Wn8~X7pU>#d~@S54b$*Th10|Z3n)P=Ih_CmM8h^E6L;x z*@x*~yJgWrl1iT$g^?epEAuapel+>zaF6O&F9Q^j@DfYN(!>#WqNFMm*<%_n{-Xm1 z`8eabDT6e0{w(_T*ysEOIg5{qz2Xs*w?+#uYhe)w#6Qh4t{2I=KTf zl^Jh5VPxg5x0qy}h-2jMDv}Tq_vNnq^5-)py8~7j!<V!N!~63<;@&0^RQW``xTAn!X{kTwqV|ONOuHg!!UFS+qJ}TnlxW znk%alQ$?j0hxe6%B3QGs!ZU2v89i$2Ypr59;wH~D0xhU5CFN;XOGm5IBQTLj|Lz4k2OzA3vg2A!!iRR%QpDIaPOS;eEZfby$ zX$DD3h`nUDYYw*EFcYlwDq(O!6|`hG9z%}+|8UF~ZnC=ZU`18BoKEbH)1%GlDO%2J z%9Mop?E}cs?xw?_AT`#gNDQ)^mZT&o(HrHr$0o~Nbn?z-a0 zn{22<3c za4_KPLbg4#8yzzbLjpo{Z;KP?M|%HE6t=6Vlp$1j<8BYJI&ZX8$Ps6}nJFQ1=DQCm zwszdXJYRiz#mM?X(&`Ow#pOch+On#KzV#3$`3Q#*xh$}FK^pOflE;=cAAEE}H2C zy9>|PeGbqD!rK~nKUylpNvfbF1nUuUen+7>q8iX0)E^Icx3I;-9058jGI^EdW-IMKPGS$pp{2?{1Jr}sfQ=V zCyJXn_aXV{_CN8>sOuvZ1(pt<*+7~q_a}CKLXx&N9u4hT-#7sVJ|s;cKH9#jvqrmK zkE{j+8TBoxWZXW`S~IMRO=ac#lP3ye+kk-Dj&Qo-&a+3^i2!f^*vhGq+)C9WXtbM%%0BvQhRUs;vMgDg6d36~j;6r%Y&TyR-=xrzL4~9Fqqz4#tTW zGDI%wYs%DIV1Li`sc~QDbLEJJ88Dia=(pS`aPwM zIAHI-qN;IbaC@{2qV*xtpB8oou|PbN>oAq^vtNT{aIWoH-?u#<&?LnQY*3MQL1!EZu8^g(Z^9X7rX#>r!;5(eVBP3TK&YO6(&X zc6qN7xA!|Ixc~VxK3({-Kj!W4KCxqmz+4jjlZs8aCV~}9PORH;Xpw+I3fFev${fVR zv51^_5DtO!815en0{g}BaC^yk|1}gIk3T#yJdqcDkgLY}k|w9NZ%(Ku7#?7BK1HQ+ z{@DKLBam?T1>=ab=`Srt84M4WxmrmRw7#{hpn!)oX=Hd4qT zZ!U6Kq~rV@tS+{s=soVuezu1wQ+TMBkh|ac0%g$qIbe^^=I4Ti{uf9Gf<^Qx;GTK! zhb82IiEfnOm-98wNOfKXiXt*#^jqN}c9T3SMT-vw%|$KtU&Qo;=^C$wPasNOhI9c4 z*P3T@ok9LBP)ysE)bdy3C4Yr5G4}j%vHvGZ2lN0%UeQSOgNNLwNaGYL_JfSEuo;$< zH`@W^OINv;r2cJRc|eC~xms44bvxeprPk0d^<~l^Q(?e}Ekoc6KfUph;;D>p`Vr!;{=|w0?M(&-!8d>r}}C;l0y= zo+8h?H~&^8;8wgTE{kh2K!l_L^65^aa}~Y=GT|ipwtd^@FAuTgmgSo@1U8gOEIocDGMyYqhF7hW<9eI9DTN!=rg*VrV9QXX zMLwRMY%1_^uSvyKWuF4kL+=~?b@@yyfc}#4d2+zre@cu|HpaA%+kNW*nCN8R7}a@t zd61<;W~i3CY$GnaUzGWqWVJus500)UR*ajpmbGZQP=XH*3_ipA@hqNdJbUf_kGeod zqeAf(fUfbmpZxtdf<^|H8~32-E{e}0Bw0zm{cX28br+|=Ot7AEfnhfHXv34@%Y#=% z=eb(9dJeVL)oUkSOanY^+#`%8eKTM==R#$9$am^3wh@XYc`n?IXYcJb-S6fK+gYsU zXhkuv|dt4QBGHwm^DciC* zf7z4~gh+ZQTw%p~v`zfv+U1K?MKu=us!D~39J>@yHzL-20-1~cT2L+&t*f4c3?sqD zYk+3j-_3?!U8?wGmlNxo1tdm@U4{}&xDtbDO-P`mKqc?t?l_*)p_Q6{_SkfHGoozN zyJECgiHGg*8*Rk}6bbmISaR$ucIm16Ijsk91M?=$4GZP-xX<_F89J&oK&W$4P|;sw z$cTp)OzLvNAGt!9WWG<7nOnwF zo*hE`xsi<<5aig%D|lyfy)5dMgigXA|6stVUz9BaRvU^dDtDTe%)u!vEhEM?fzKKS zlnSge=IlAN*EyGsZlTVN&71d#RIhJ&KBSCt9F< zlts7+WLN<;^wF5%O?fW0`yI}+5%K8x&n!1`?_II~-K`xM`& zs0^*gHzusOVwUDxy~iE06Aq7wLkDEo*`ZKS-hJ#Jzr9!?e#@UYop@&dW=KZA`rGb* zQt7Vq=`;=_bZjT6pJ%{3c3m;UM3f+sb4Je`c0Oh=J@&5Zsp&A{cxAvQ8pUz z6-ZIH701-P`mvh5{9H3hpl}a91e+l!&oB|QoB`;j1BRUUock7Ga)kI!iO@{@_5qEVF2JeK@5DO|oOmqkUb{Ja=?Pty(T358_;h*Aqw0h!CoMX9EBdtp~q?E6gp==0DtR88+hH zYbN8H?rQ~sCH58VwTt_-zOa^}vX4IyutnLx7l3;uLgl}3yA=Iftj{?)*Vu!We#1$a zJ2bZC8F-NDrXjfnP|&jgFkoC9DA->bR^Ibm~B)G-mt7wzpj1 z&b2=vbAmYD@u)_AC#xKYRyoZUyHr#5zK8-Y=H|7=o*xcN0heWA|O?^|NQ&sR#7uX$qY&QyY_a&$Rgh`(Vyb zcRbER&xP?d+cenO?H}HwE8~8Ez8y`gfrah-1{E$O3QU0+B*aPG?M>#=AdfSYO?CsD zd@b#jMUE0IUy`~1V~rK9#B&)mwva*t)n;13>BGOdovTktTl~~^xBgtdv}hlOYQjd5 zH66eCg?rj7779AZjI6k+gr@FxNM~9f!(BWGbVUY8yTJXN2)5T`ULF2 zrn(GEB!4VLRUt0^HWsg{FLIQi50@c_I>lo64JDT&C#l3;9#B4ZZl`@nBhvT4TL65A zCkXhH0!-S|Zvn2hKvPJ|wjuRAJ1Xxd3VOpbAzGsph09`)I#U`;$NF!9OZNhsWCq2$ z2E1jGm0j2vl zH~1KV{#2NjE25`>b)petZdfH=9S)6@3Z9*KRi&xy(R1>NySEx>$XY=|cC8!ie)@YB zD)#I_8enrOcxeqhLs<_gUjVKK1tIN?{y~^EJF;UAIEH{1_P14gr|Fwj`qR3xQH@9M zHk668_J@j47A+aiQ|0xE>B|zRB(Kw6!gG{WDb|CxyPKilQ_`q)%ra<+H$ zhgcnyei9Y8$Iuh?A^YZ>$x$PXC3x^Ct*l_CsHE8 zkQVAVbSJ6P#C>8g*^GQVHa}u>zFnmCK~X2=z~w~{W5C;$_c8z zG>UU#Xdx4(-kCJc1Ezvql?0UOeai6UI9V za21e>%2)3HC>Jz+BUvYvl&Pm5;O3BJBma^gER|#;j^Dw$isR9X6*9#%(W_b8b0>yr z>{$52(e83w_EY)*kK0ke<$5&g(2*YLfZ0dcc!%*P=jQERux^S=c$$c=V^Ir4GSEfwT#9B*4|2Eu(aFp0>+? zPrlx3RW_g^RSNW*k58u8sUN>zrN5Y!ys~m_>ErNQ?VDK|ZXhKup93m!Xo!KsRk&Ce z%gJiOUPnK-;eqg_b0~%Jk~$>d?&IAwS&Pw{L!YZKG}UNdQU6YnBmWP=R|8Q&>p9bG zG`0#%gsA>QI+E>=_y%0GSaE#@1rl#fo1@14hF<+1D2O!c;P>As3ugB&>cJhmp zbZb3e#y+u>g;q^oXS{SMcgXF^>es*OSK|*`kiaAaDGAKdB3~c@kyWyA zF_~o>PkxF=2fuL;wF2d6&^l~y_Jsw--Q3>C$y{j_w)hb+aw^OWc5&0>QW~E3y4*H) zgHPj*dP*JHj)^=wOD|8p>L?B$uw0m*gQ)4oxlzUwu0znP6&7=XK>m1J`jIR%!3iQPYH)PUvhu>tU_a|(c) zTciD<<7Ox2hD=jvC_A#Su}e|AT>q+F8ThWac#p>=r-bi?KhH`X2DOptH{1QT@!)ffJxH4VmqGE`5d~1oPI1?4R6>CZzLF6aQQ9 zT37wSynqVuP%CN)rI$;t1*Y2QXENv~rq*Gq04ldhbc6sdT*3r!6Jc&P0wws_3@rhp zQ`lAdUwK`YyHt}ed!vZsK*Unj_HY1E@V;;|F9< zmU4k*6!BJCT|#Z7x*Y9;B_NfZ7$ozd1{dJ5PxARShB;fSD=a_*YuR_T)8=O-a#?j( z$&8id(nLGuved+c!iy4QD#M+~{8@yjKb%Mye&F{er!6uN$nSQKP=Unm_bTf08j0(g z5n7%b9pLQWbb_Dx2&Fu`*L(x0i&I9G^NoXf``Jt77ntuWn+mz#Iu987WF@JbVgmm$ z2*$N(ASrr{ADYewwVC70LZN_6Z%w3w1kE?czli6rf)$;mivRtb^o0bUc-?Sqz=IJ; zw?H^p17s*nS_sfy3}6wx&SSn6r5e#Tc7%XxEb$;2=O!xPx=3PSQwBYWtBR_8OFljE z&|lW$)snQmsYB6KhT@k%DBSub8%WlO*jaB#m3>`zmLqzH-HIO|5-s1PThgD6RCo_P zifn(@*Rzmlm*<$)=1m?6KiT0Vj&`>>WJA=l?&b|E1EFmQr_9>7w1`q>_d?<*KN zW&0vgg?|hzxI+4&$Qd9XSs&Odl1mJ7)05GON}_smbobOzFD-IlFhCph_xi1|&?fm0 zT~Gk$^)ls5g*yWE=F90~KMR7LZzvVWnzh|@`#G~Wb92-K;5L0qiJz(8+_FYdaZpmS zhPH`|N~!P^_i0~X)T}R!aFa zh=SSy1Ov^DU{MJwz{kPFbs?R`dd2aaoZxq*#wvU7BIBrI5W^_}U_B6g*K>qoCF;;B zjY^cIxda4(1BcKU@S?1Gn5!J`%jpCg=;3EV_PwhIt58GS^8g|cP{7i$^P%^6-f~hZ z`t3Q0S0K)9k-DuK#Sf6%15PS`W^UJS|~av(TpR$v|ib=Vr3P0S2)-ye+TOtf>%M4MRgY8IcFV|{%&bxJ$SXb1F($^{wBpSD4 zV+)@Q;lm+&7bz})Xoc^x!hTkXo9b%xzKV!_t8l21fz^4~-m=mJO$|k-Ap&KW%C8UG z6)nGNplx0u?+VlsHwcG|5FgH4s~_?0G#xO|<6q%166NU=Iu=_vAqQ^h=;n)@HbUfL(PICyWp;50=)7>n+wH$jJB4Q~ac8*M2 z(sr}{1Qer_s|a9_J`!i!ps?ITRk=H0gONM}ZXJQ^ZuWg_E(e$0S}+c^1cNs9&L<_} zQOmDZjsiM?l^W7|zdCh18CTZ)%81NjN8KjZp(UM^+50`@hJS4SSFrXE+TAw1;O$d( zMWgok^5-0VIT{OvZ3Hb~rL0cNE}Zfuu2Sx8aT!i!S$z_UX9kJs4@r^dt;`S_xKu(7 z%X&uTk3E7k?p(x{oZ%bPS6)6@1oF$^gC-)CycH+_^U)!xT07sUq95OZhl=WNOwzom z+|9A-Uc|oBWiG0*nIJptr~vKLDiPBj>|`*-laa{0*f}Pn4Qwj7tXFt3?dMEvulNl3MS-j!I+>a=*>;&d`=SL97|Iu9M}?1nI&gweB-RCj zu1j4=5<(&?%gh|I5E3ZPmd~s`an}(s+1VKHjynFuLU?pW|^G+B_Q3ZzI@&`U5sdtBFj$K ztZ$@u>1@_U{pr}EdB$15QIB6@wyfNu0bC2?Q}rB$_p!IXeyLn@^IhJ?ajElGkZ4>*m#eioI zbO}ajaD1%wcd_#e3AT;B&Oa?J;VAQ4oOT!EyjVKl zA;FnlI5=0gvcx-lQ?TK-B^i-OmUSHG410wznYs!WZ85%~iRRM%QmPl&J1MkF1#XvR zt?o%zVyaT_q|!AanZ^v>*qx*bKDLge*!npd%+^tC3G@qX{v)L=qQDqQ*RrCXT1)J8 z1|;c5(hntveX>^BnF!41f0eUcSw}z^-}a0p?ev6vpxG6Pe7k@$HSNRY(b#)1{aUZ+ zxCL2bU`;9c!A621|ItN)ann?_+C?mldF?1NztaQMta+C2yen9*3A1ET3{OPq~xUbZYDh&}SbnY^T(SeaZt3zXN|zVam+kNbgM6Y-Rn9S} z&^f>P>x4iLZ5^9NQt5Z8)`k{)Wl=qbfXHj#N7_84tXqp~Evm-GKPDqOlqhqt2GSn* zr3yY@1`FShD=NTyVb9_JQHxWdW4q>s-|*6V@AC_ zhxuROdz{}ecwJbSg<IiB-j8>CM=>+NkxLHR3vb8@_wBv>a0oXNV`Mz2P~df0{C?s3M=k- zxq25_I$HT>QzFeG2W2F)_rdN_oxe8N95vO-0KW7O;fvEq3>vhuUlnrAz)fXx@WCGO zG{^yZ$2=O)+dOY2XG+(;dPo+H`^l64l19%Ghb_>b-h_F3eKk*=|6xE*Sp}QAu>-}rI*n95Iyq{w>;BUSv zw%!1e&akoJgnD%(KncvVT!ba@)R1koh4~dE+gMCZ$NZWhslYG9T&IHMW^0)l#Ui$ zB&iT@R$<#(Z#ZuuSRH6YVhmp!4 zz@&j+=RlnOeWS=9_blcRPC2!@-jlDFRU^>NiD$0dkuj2ylK>(|Q zX0PYj6=o6NJA3^IaK)>~kaVaVGGa18RZ(8A?Cgp1}A+ zRY;(uEdL77jNSFU0=Yie9kpxpSG7ao^leH5C$`u>lgX!*DqpSYbiG(4KEZkRT8FrzN<4g{!rPU`+Y-IUW$K=;*10YrfTSyI!rWBTCVLi zz3x+N^|y>ce>T$u)*O0ZV&MZe?Ca*Gwp*`2;m%70QV|xv-%Bw68AyCr`6Oa=UpWle zx7yUCF{o(I_0@GB>LbPFD=UQ2VLjiRL$ccAHrAyNCw>AKUf*1Y>92*g7vxA(YE#4JrA@ioxqodqES zlNLWK;J#sOR{oV1!~P+omF&DPs*VIyxQV)Mrgs5vHR1f{v#msOjD;p-SPLUewiRL} zF3>kSgo8fx!2e}_*dJCs-_0ihM0|H#r1%?jZ=@3-K4&u$hm8|I<$=o&64tGgeQ#NB z+^t-h0-|pjys9zZI1!TM1cFmeax!qyrPNS)`78nvKTWzBgK_XDc(pyPy@4#OjDAFs zUe53(x-mXW2(5V)>$7em)+U z7n)RmWsiXvLtxqnycI(3;;jTtzsZ!_IY*X`39wYHP03KbTN0MTn!RKOHn`1D+<`v3 zFS%^{g2N5_BcIlgw2oz(pPA|+VTYqK3>=l9Qb(I%bm)MgWB?K9XZ03U>K#bZ+4GPw zc*a4Q;tox^jPz5@NF{T$yOshNOC)Or0}IGqRN?DCipI!#U{g=bsDswA*|Ep*YFyEl z(}T4oUq_Z5gO|(aWk<=kXwRU$iKe~dS%RIgw+;4~m`UWhDB+g;`eO31mn|a59@=F) zq4WZ@0yN%b)bowpo%N%~$$siuWA$JHvEhbO(B1^Qmx{mh>VPFU z;!qx+IuN0;q3}-)Ib&E#SwAyhap00WogLchyRHsySh_>&0D1}olX%d#pn3{)QovR~ z@s_%h+*&7~g_dXT$+4*&ii0k&`oL_=gyeW?CgbdFQHN-h>T`_8?%9?Zqb@4X9}3C! zqw+;vJldbsTyap3sAo1tRhP%#8IF<51a{p*H;W1k8Qu$i_FNQJ?O#0Q^v1X+yWFI*M;Bt``6`HCw3qSu<)!)zW!(nsbKF`XOiU1nV+vqu zpjvV+Q>U|BP2qL``t()Nku zau<}p74z_8@?8Jp#8BE*i8yY;doJuk@AdI4t@E34iY|?*{6iz3ZV49<^x&(Yq!Y%y zYR8Z0K>L!|LpZu$=M^>edrR1cwYT$$lcIpa0z@7oAo7qb#!Q5v*zLZxNop5c;*&NV zo0_BT5!tpL;?R@!r@BC8ONia!hLU6jbb4r67~u2I?p2H4eFUnomo?H`R9Rx(3*s9` zW#)c>2*;41bbC!a|55E|#o;@^nm*9=pGq>v<}LP`+ez5)_{T*1l$NsVg(+?Rimb}- zcevT)q7pjGoC48L+stppZJMv!!Wix^iq+C1IDKwTylY}1lIxMrq%InN z#^R}LI$%{yMY&neP{tOeXg2B@qCO5+k9^jqtAX%mp_65l-^uqTc0-_l<0Y zky#)}<#&Ws(Nko31=C*PG`45WSJfx3&;L5Wpsj#SoZl4z-bBY9Q431>o7Z*w*rIeL z``yjl?ag8Jx9jeF!GdgP%38^SL|;1|P4pF+xloeo-$XwUBGPG?GbbJI0* zAc;tJGxYNUUxWzDCqG6h$|l=rSYDhEQ|cFYc7ylsjr8H`+?XD3Qv+sE-MFw?zRNWxjzR$UQyT^{GN})m zv;^3PwM%oNrf1*j0<~w|w&>fn6rdeF7aW}%eJHE^c{Kr9+GZ|qhjBbp;`F)orBc-$ zbIuQo^R&uGe+!IXrfcbtVhe}7^{WIZ?^0yB(50N7cE`t}O?Kq-&nG8uTr$=uX+H+a zYSyM>8?t%go$-xh95H)!c=~-PA7u~1c|bK3i~B$T zf$Mvsp*)ED@$TPwkj<}`I+e4!yW;vB`gSgk#m_|GC&t*@Qj_xcV<=(Oe!DMJ?}Oxy zSzh)e`>;#v*{l45&8SWiYOBq7cdg^hBON{mz;x~sNQAnUuDDd*4>P1a;EYwl znp)g*>S|AO>)ohCV_a@<#XumvX#7e`fl$G(@NQf@>(AZ$n0BhP0JR6?N}2>_HS%$JW1XOR^qpph+pX;W$gT8BfaRrR8ajV9%>og?olmlqh?K~(?t(m?&+v5; zA147G!rpcXJJ*BNqI8C=myuh~tsjdw^~~9Vhb_vwJv1F7wk9DT?zsE8cU;xBHJ|M1 zd{K8p0_2d{S`g>KYFVx)J5RY&(x6Vd{ta_v9TY>Lud7JYsq8E~GS#UZmMhcacj-LT zl5K0wOg4Bt$-Y;8fn#4=&Pa9D0^JqipfQw`6sp^CPcFw$^GFN?3Vl^ue$Pl8sNoUX zmjVY{Gf^TM03w_DB?C}|EyFkYg>L8MH3PM(tf0%8t*k4&bJc@*x0?-;G1UG$>TJ~# zaWmwyjY3-D8fG_kfw+g@1qifcuwPL6-;93OA}1?jnG(fF=tP3Dgbg4v4&ea=R{9zWC3xKOr86hQ|SBLu5ENMV1Mk?-HDP`SO&|p zpGrj34HMy96t>GRrR|T&7C)Yt1m}JVl=iz5ga)8b`E$7lSonu$hx2$5C@de9~1BaKt z4aS3`jf7-~sEW8uGWepkL+v=*ihBY)+>w6rcFZ%CO*GjT0SlW~Qkp#RDXB)cYZKim zX!p?@LuL*PwbtHI`XsPa1XiE5JBV`B*QOsDR=>JH$$%cy`l)yqPQ}NUS1P?$brCzc z0})ou4}g2eGL=jtZf=XF^!cfO{J2KwCwtoTo=z5~3fH0|zK_*s4c{@J5u){SN57%p0IWd$ku;YYzxd@VxR?D3nR*oN_e3@+0`DO z+rE&w#KW@buKVw$nW6D-XAh22@LEQht5(V{@Ul=`Vu5n4yA0k!y71 zzJ(CBBh=07B}aW;Wu>L?R9&bWCC2z_X3|sat7??YQ7vnxgnD>Ty&HK< z$RbGx<+3j;$xWRSMnHTdAz)1ZanrI18VjTxc#eX>VZr?(8$Vez%PBUN;x32iM!4 zwKlOZ23*MMLRO>TJtn*R)THdqclymZN3{~`!kv0MQv__c-QOW%X}~;bKps^VgoVT*jV6*Xbzt zw1Bf{lfE#mr7CuBk{bw|B{O2r9jkSltK`hQkHlPdSDBn-|MX?4UtwFgzshW3v=H{X z&-y7L+_sce^eUx9*STxoYNr{pDpxVB_yL-A^|D37Az9bX7`A+iS1gYlZ_*yj3Q>!~?*hFXvTs&x~AEz%}N!cS&@1NPR=4rqKzL$qs ze(v6nv#LFtb}V3|A2e$^dlDigVp>Wnw>T6eaJ@v03=HHxV<=A~Vrz$?K@e@KUazxY z#R7o~Z7eq)WG*u zxzoUarl1VOIY^XERBKG#&K@^T$VfCm3Ic>IA9pa(42nWM@+6#-(17xJ*1CU%=0?r% zk#S6^ubKR@SBfnl^4J~Is_AWtCh=b992AEkKY^?fWcYWWD#mA7ZsVqB%!(ajDX%;; zen?uh4%&?K+M`>*$!W25$9AgDWFp45AyFJHgaiX_EI%D@z#csI>TZl*kRVTbr$@&q z!Hj*k?ZOU4dI0QULjXMC@%AClk&mPCkE?AKqx$%lg}Ni>eh&3}244Ty3CO{?j-ZwS zf;#&LLH*ox)LujFToEwyjQHXA5Gc;jC$eiJj2!Tm)n`kZ;HVOyMG(?I)Ax8$k48-3 zbuGV7rkPTAY_B%@1v3CPfv#!*8FMJa4BwMMX>Jr%<%?v@b?FnerMGPq0`&tOlZOfFvfl|1``} zp1qelxEan(rzj$1u&kbKPzm;jLBnkENX%nmuWreF;hP^6uICR& z1h@a9tzf=RKj{CL$;;cxt&B~lViHTT8S@QVDWn9(x$N1#=2rB&|i<sKh)skq*Xl1S>S8l7ChZ<_vm<&xL z(;CIL5(L<>I@kQ^V9S)+rdB zcc}}Z;0F93EFKMm#n+r1r#T4i^`_}_qk@qvTVDG#|JEQs9XVn`BtPi7%Ghr&Y3JeG z2YOis3X1%mNYlW~#7G)6Lqj>*>P)xoey^xaLS zCOwRK!9S`6*rfKNK%1=}QCL6tx<0HQd`z?V_yTTV2Y^L-%7(!8aX`8D*f#+)!Ee~h zdfPA*M0hW_pKTf1XYXy0>eSQy^7)m!o=HI;Az&Ih_kD@)yP9FhO&?UVbWUYqe%ol9 zt|_?aM!lyNgFZiD^UIxN4Q183^|sM=Bgy;mcehZTxm|SR zY@j1^wcJNFVdqCq@AI-f%%nk+bcd_z7(LGi0;kWv*>J%p=O%+o^LOZ7T760B zb51q9+nNynO(r?nfOodB`~biYzvQE~g`ovuWGip%UZdxu#&R1JSOAc-$>W#5aY->1 zHHYeQi4iR=Oj3cG>+uj#`OOYDDhRI_#-_0pM&~k(I!8UJyP+>NNln&`&TfhFvz53U zW$9^q=Xt$4ZRG*LGEk5dXx}64p1m?_@Aam^n0Rnx2E2LHDN1}X8}VK$S!KC8nMu=C zO`ED4VKx?`!1(JW-5deDRExRMRTc0Th!-%C*W{t+yU@tbl}u+Q@Z;Wv)XHZKkm+n} zmkI;RLe_Vv9PoKji;wC?%+1T9usQIFfyPSR0vas01LNW`!tV%wvhx?ieY6*BASf1J zT1Vi?*X)Ao@Wq?X_v51ktaUc{^n^nL@n>usMXQnTee7Z3P-+FZV6*mI&F+`{b4{It zbKI)_X8x-V6aei1Cgk;=NZ7-D^i{S2@ZCz|Ewe^53?%y5>#a$bB+8#`n&s+KlNHNL z*>UhdbMDi3BMQQ|DFTX(H8ivAnOsQ zF}JDiICLQ4qzlXB+S45DZHm!!Ox;?9Y<@B=_v6y+z;uaXY~T)IB9&7^t@G?s@j;Mp zprjh`1Oj6WhIs>o*B<=xr%Rq)JFjplC(p2ed880UD?pLOZce>Z2#0A7_aF0FInl1e zc7&c!gv=v70H=URY7%l?+S9aWl~M_w^$fd$z>-NBDP=Bs{%FL zud2kCEnlkc@2?&O?P9W&MSBWsVJBF&Ua){MH)f3y?Xof=vU?V#UCWGQIiz^8c3;B# z%b{~cy!Q+CXEXKxys1uUYFeHne3OADq>G8bfbP;Z8e6>9G26L5Kd{zkkI<1+d_M>l z7;T^omLYEK3%w02mcx?CtjCQ;mk$8Ie)J1XM#zU)%2F)FtAc@sb1(FKZ4FXG#ZBZT z%lQOHv$ou$Og_TsHnqh^6i#PPGvsGC7*!`fvZP7CUbiVo3lyRMAe%gLPOH3CV|n6p)Jw5>^VF>~9v592 z)jHA+@$}4a5Zh)<9ZHsAupzZG_H0yBwPT%o$Z_(8UeG?Ru+4adaZ<+9C0qQb z+E4}>iwkS;`Jb79Xz#Z%d9H#Zw%wyq{VP4+*~XH1C$jCk+9Q&zefzG_Q$hp4ZLP;L zQ=#&5q=0p`XFa{*H{fz)Uu@|Zd42fK^3=3W(k2AWP{>2zvzcrZHcZ#l`(i$j{>M2) zl71l&xfcF6$u>Qx4Y>A{pbV*vWyWJzF|4cZ%PQSxX$TgQ_`gIK0~0Rby&*0Stro1l z$@Ju-0;{Yi?;%y(2ry~(3w$DQ@eg!$5^EN(${z+qi1X)a&6D4BldoMVd}V$JJLm+f z?n5hpBw+w2+w*54>5+b?!Mn+Lsqz-Uswx%{y*bHel9U(oxpCj2cXUAyQqaGY5wKcj zJmJtD;XmxdKs>K!vI))@Nw{qQr>VCmc(_JB6N`0>kZT5GdZv>=sv(e2q2YNn(pH8SHV{v&9i`S3mJ9eqd% zhUD0PC0OvLml|cjj?ruZ>=-c-#Y;OlIp9qP@BJ%NN(OtH*Lm3bhBSRDQ?x(`^J^=N z=MoSdIGyo{Jq15XZJi?p4nMiE4?dEU+)hbx$Es-*^k$bUyMjONAhS3V?o}XoBLT%M z*lcWf)4~N<$-E?5M+Y?X`0I{@+yxdh?v)0lT3|CpbW8(|k{N>FE@c0K{OoK~ix+or z_Q6}S+#S7v^5PuqlmqYyEMS8Cit5{i; yr*`6Tw-w>07tY_U__A*OT|sB>!Uu8< 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

    #woG;Tgo_K*#f0ImI> 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%0A_1U?7K?QFXRD2 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

    m`Zm0NA(5W6J;!x1H(lBqD2(8aO%CYCTDeP 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%0AZMOD~YuS9pRaF4nzqlSSlM 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json new file mode 100644 index 000000000000..dda2fc25910e --- /dev/null +++ b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "Icon-green-2320x720.png", + "idiom" : "tv", + "scale" : "1x" + }, + { + "filename" : "Icon-green-4640x1440.png", + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-2320x720.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-2320x720.png new file mode 100644 index 0000000000000000000000000000000000000000..97562c2f4b7d2dc7231e6909b344da015926b4f2 GIT binary patch literal 116884 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-4640x1440.png b/tests/dotnet/AppWithXCAssets/MacCatalyst/Resources/Images.xcassets/AlternateBrandAssets.brandassets/TopShelfImageWide.imageset/Icon-green-4640x1440.png new file mode 100644 index 0000000000000000000000000000000000000000..388aa9f88e9de25eb706d6b6df2f22f994e0addd GIT binary patch literal 340507 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