From c6469e7f8eca41c86a545502ed71d910bbe26648 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Mon, 10 Nov 2025 10:13:37 +1000 Subject: [PATCH 1/8] Bump .NET SDK to 10 --- .github/workflows/ci.yml | 6 +++--- .github/workflows/release.yml | 2 +- .gitlab-ci.yml | 2 +- Dist/historical.nix | 3 ++- contributing.md | 4 ++-- default.nix | 3 ++- global.json | 4 ++-- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cceeb7203f5..d953e59fec1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: "8" + dotnet-version: "10" - name: Debug build with analyzers run: Dist/BuildDebug.sh -p:ContinuousIntegrationBuild=true -warnaserror @@ -40,7 +40,7 @@ jobs: - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: "8" + dotnet-version: "10" - name: Test run: dotnet test BizHawk.sln -c Release -p:ContinuousIntegrationBuild=true -p:RunStyleCop=false @@ -56,7 +56,7 @@ jobs: - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: "8" + dotnet-version: "10" - name: Build solution run: Dist/BuildRelease.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f21dbeb7e35..729419f467a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: "8" + dotnet-version: "10" - name: Get BizHawk version run: echo "BIZHAWK_VERSION=$(grep -Po "MainVersion = \"\K(.*)(?=\")" src/BizHawk.Common/VersionInfo.cs)" >> $GITHUB_ENV diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e2352128f0f..0728e1df042 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -24,7 +24,7 @@ stages: CACHIX_CACHE_NAME: mono-for-bizhawk .with_dotnet_sdk: - image: mcr.microsoft.com/dotnet/sdk:8.0 + image: mcr.microsoft.com/dotnet/sdk:10.0 build_asms_debug: artifacts: diff --git a/Dist/historical.nix b/Dist/historical.nix index c574c241f17..830476a89cd 100644 --- a/Dist/historical.nix +++ b/Dist/historical.nix @@ -9,6 +9,7 @@ , dotnet-sdk_5 , dotnet-sdk_6 , dotnet-sdk_8 +, dotnet-sdk_10 }: let /** * updating? make sure to hit the rest of this file, the hand-written deps `/Dist/deps-historical.nix`, @@ -219,7 +220,7 @@ in { inherit neededExtraManagedDepsApprox; __contentAddressed = false; #TODO try w/ CA copyingAssetsInEmuHawkProj = isVersionAtLeast "2.6.3" version; - dotnet-sdk = dotnet-sdk_8; + dotnet-sdk = dotnet-sdk_10; exePathRespectsEnvVar = isVersionAtLeast "2.9.2" version; hasAssemblyResolveHandler = isVersionAtLeast "2.3.3" version; hasAssetsInOutput = !isVersionAtLeast "2.6.1" version; diff --git a/contributing.md b/contributing.md index df08fbbf306..f1751391954 100644 --- a/contributing.md +++ b/contributing.md @@ -67,9 +67,9 @@ It's probably a good idea to get the .NET SDK, even if you're not working on a . ## For any: .NET project -Currently, you'll need version 8.x of the SDK. +Currently, you'll need version 10.x of the SDK. - Linux - - Install the .NET SDK (package name is usually `dotnet-sdk-8.0`, see [full instructions](https://learn.microsoft.com/dotnet/core/install/linux)). + - Install the .NET SDK (package name is usually `dotnet-sdk-10.0`, see [full instructions](https://learn.microsoft.com/dotnet/core/install/linux)). - VS Community isn't available for Linux, but Rider and VS Code are. - Nix/NixOS users can get the .NET SDK ephemerally with the provided `shell.nix`. For IDE setup and more, see the [Nix-specific docs](Dist/nix_expr_usage_docs.md#ide-setup). - macOS diff --git a/default.nix b/default.nix index c70e1052c77..711aa318dbf 100644 --- a/default.nix +++ b/default.nix @@ -24,6 +24,7 @@ in { src = builtins.path { path = ./.; name = "BizHawk-${version}"; }; # source derivation; did have filter here for speed, but it wasn't faster and it wasn't correct and it couldn't be made correct and I'm mad } # makedeps +, dotnet-sdk_10 ? pkgs.dotnet-sdk_10 , dotnet-sdk_8 ? pkgs.dotnet-sdk_8 , dotnet-sdk_6 ? pkgs.dotnet-sdk_6 , dotnet-sdk_5 ? let result = builtins.tryEval pkgs.dotnet-sdk_5; in if result.success @@ -91,7 +92,7 @@ in { inherit lib isVersionAtLeast replaceDotWithUnderscore fetchFromGitHub fetchFromGitLab mkNugetDeps - dotnet-sdk_5 dotnet-sdk_6 dotnet-sdk_8; + dotnet-sdk_5 dotnet-sdk_6 dotnet-sdk_8 dotnet-sdk_10; }) depsForHistoricalRelease populateHawkSourceInfo releaseArtifactInfos releaseFrags releaseTagSourceInfos; launchScriptsFor = bizhawkAssemblies: isManualLocalBuild: import Dist/launch-scripts.nix { inherit lib diff --git a/global.json b/global.json index 8746d74b567..5fd1447a98f 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,7 @@ { "sdk": { - "version": "8.0.0", + "version": "10.0.0", "allowPrerelease": true, - "rollForward": "latestMajor" + "rollForward": "latestMinor" } } From 6bf9666869e56419e0333f172fb0ebef6d6e0dd7 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Fri, 11 Apr 2025 19:41:30 +1000 Subject: [PATCH 2/8] Remove `.sln.DotSettings` I think this is or was for ReSharper? Needs testing, and if it turns out this did something useful, hopefully it can be re-added as EditorConfig --- BizHawk.sln.DotSettings | 620 ---------------------------------------- 1 file changed, 620 deletions(-) delete mode 100644 BizHawk.sln.DotSettings diff --git a/BizHawk.sln.DotSettings b/BizHawk.sln.DotSettings deleted file mode 100644 index 6fba05cef2b..00000000000 --- a/BizHawk.sln.DotSettings +++ /dev/null @@ -1,620 +0,0 @@ - - False - True - ExplicitlyExcluded - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - HINT - DO_NOT_SHOW - 0 - None - False - False - False - USE_TABS_ONLY - Tab - NEXT_LINE - True - False - True - True - CHOP_ALWAYS - CHOP_ALWAYS - CHOP_ALWAYS - False - False - AF - AL - API - AR - ARGB - AV - BG - BMP - CDL - CGB - CRC - DB - DC - DMG - DS - DX - GB - GBA - GBC - GBL - GG - GL - GPGX - ID - II - IO - IPS - IRQ - LR - MGBA - NDS - NES - NMI - NT - NTSC - OBJ - OR - OSD - PAL - PC - PCE - PCECD - PPU - PSP - PSX - RAM - RL - RTC - SG - SGB - SGX - SHA - SNES - SQ - TA - TAS - TI - TIA - UI - VBA - ROM - ZX - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB"><ExtraRule Prefix="" Suffix="" Style="AaBb" /></Policy> - <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /> - <Policy><Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB"><ExtraRule Prefix="" Suffix="" Style="AaBb" /></Policy></Policy> - <Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></Policy> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - C:\Users\Andy Delikat\AppData\Local\JetBrains\Transient\ReSharperPlatformVs15\v11_5c6a09eb\SolutionCaches - LIVE_MONITOR - LIVE_MONITOR - DO_NOTHING - LIVE_MONITOR - LIVE_MONITOR - LIVE_MONITOR - LIVE_MONITOR - LIVE_MONITOR - LIVE_MONITOR - LIVE_MONITOR - DO_NOTHING - DO_NOTHING - LIVE_MONITOR - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - \ No newline at end of file From 2dac5bfc21b5fccd504e3802cdc5d66b81861493 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Mon, 8 Sep 2025 15:37:05 +1000 Subject: [PATCH 3/8] Migrate solution file to new format --- .github/workflows/ci.yml | 2 +- BizHawk.sln | 136 ------------------------------ BizHawk.slnx | 24 ++++++ Dist/.BuildInConfigX.sh | 2 +- Dist/.BuildTestInConfigX.sh | 2 +- Dist/.InvokeCLIOnMainSln.sh | 4 +- Dist/QuickTestBuildAndPackage.bat | 2 +- Dist/nix_expr_usage_docs.md | 2 +- README.md | 2 +- contributing.md | 6 +- 10 files changed, 35 insertions(+), 147 deletions(-) delete mode 100644 BizHawk.sln create mode 100644 BizHawk.slnx diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d953e59fec1..ce9707d3f08 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: dotnet-version: "10" - name: Test - run: dotnet test BizHawk.sln -c Release -p:ContinuousIntegrationBuild=true -p:RunStyleCop=false + run: dotnet test BizHawk.slnx -c Release -p:ContinuousIntegrationBuild=true -p:RunStyleCop=false shell: pwsh package: diff --git a/BizHawk.sln b/BizHawk.sln deleted file mode 100644 index 380906593ad..00000000000 --- a/BizHawk.sln +++ /dev/null @@ -1,136 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.33627.172 -MinimumVisualStudioVersion = 16.0.28729.10 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Client.Common", "src\BizHawk.Client.Common\BizHawk.Client.Common.csproj", "{24A0AA3C-B25F-4197-B23D-476D6462DBA0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Common", "src\BizHawk.Common\BizHawk.Common.csproj", "{866F8D13-0678-4FF9-80A4-A3993FD4D8A3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Client.EmuHawk", "src\BizHawk.Client.EmuHawk\BizHawk.Client.EmuHawk.csproj", "{DD448B37-BA3F-4544-9754-5406E8094723}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Client.DiscoHawk", "src\BizHawk.Client.DiscoHawk\BizHawk.Client.DiscoHawk.csproj", "{C4366030-6D03-424B-AE53-F4F43BB217C3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Emulation.DiscSystem", "src\BizHawk.Emulation.DiscSystem\BizHawk.Emulation.DiscSystem.csproj", "{F51946EA-827F-4D82-B841-1F2F6D060312}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Emulation.Common", "src\BizHawk.Emulation.Common\BizHawk.Emulation.Common.csproj", "{E1A23168-B571-411C-B360-2229E7225E0E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{B51F1139-3D2C-41BE-A762-EF1F9B41EACA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Emulation", "Emulation", "{3627C08B-3E43-4224-9DA4-40BD69495FBC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Emulation.Cores", "src\BizHawk.Emulation.Cores\BizHawk.Emulation.Cores.csproj", "{197D4314-8A9F-49BA-977D-54ACEFAEB6BA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Bizware.Audio", "src\BizHawk.Bizware.Audio\BizHawk.Bizware.Audio.csproj", "{9F84A0B2-861E-4EF4-B89B-5E2A3F38A465}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Bizware.Input", "src\BizHawk.Bizware.Input\BizHawk.Bizware.Input.csproj", "{17E7D20D-198C-4728-ACEC-065DE834FF02}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Bizware.Graphics", "src\BizHawk.Bizware.Graphics\BizHawk.Bizware.Graphics.csproj", "{368BC91D-48CD-492A-B6CF-B5B77F7FE7D4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Bizware.Graphics.Controls", "src\BizHawk.Bizware.Graphics.Controls\BizHawk.Bizware.Graphics.Controls.csproj", "{3D050D35-B57D-4D14-BE0F-FD63552DADB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.BizInvoke", "src\BizHawk.BizInvoke\BizHawk.BizInvoke.csproj", "{E5D76DC1-84A8-47AF-BE25-E76F06D2FBBC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.WinForms.Controls", "src\BizHawk.WinForms.Controls\BizHawk.WinForms.Controls.csproj", "{B5A2214B-3CB0-48C4-8DB1-98B38D48AC4A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{74391239-9BC1-40CE-A3D7-180737C5302A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Tests.Client.Common", "src\BizHawk.Tests.Client.Common\BizHawk.Tests.Client.Common.csproj", "{284E19E2-661D-4A7D-864A-AC2FC91E7C25}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Tests.Common", "src\BizHawk.Tests.Common\BizHawk.Tests.Common.csproj", "{39546396-C4D0-45D3-8C6A-D56D29B5BD72}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BizHawk.Tests.Emulation.Common", "src\BizHawk.Tests.Emulation.Common\BizHawk.Tests.Emulation.Common.csproj", "{D95E2B42-757A-4D19-8A76-84C6350BAD8D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {24A0AA3C-B25F-4197-B23D-476D6462DBA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24A0AA3C-B25F-4197-B23D-476D6462DBA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24A0AA3C-B25F-4197-B23D-476D6462DBA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24A0AA3C-B25F-4197-B23D-476D6462DBA0}.Release|Any CPU.Build.0 = Release|Any CPU - {866F8D13-0678-4FF9-80A4-A3993FD4D8A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {866F8D13-0678-4FF9-80A4-A3993FD4D8A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {866F8D13-0678-4FF9-80A4-A3993FD4D8A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {866F8D13-0678-4FF9-80A4-A3993FD4D8A3}.Release|Any CPU.Build.0 = Release|Any CPU - {DD448B37-BA3F-4544-9754-5406E8094723}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD448B37-BA3F-4544-9754-5406E8094723}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD448B37-BA3F-4544-9754-5406E8094723}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD448B37-BA3F-4544-9754-5406E8094723}.Release|Any CPU.Build.0 = Release|Any CPU - {C4366030-6D03-424B-AE53-F4F43BB217C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4366030-6D03-424B-AE53-F4F43BB217C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4366030-6D03-424B-AE53-F4F43BB217C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4366030-6D03-424B-AE53-F4F43BB217C3}.Release|Any CPU.Build.0 = Release|Any CPU - {F51946EA-827F-4D82-B841-1F2F6D060312}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F51946EA-827F-4D82-B841-1F2F6D060312}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F51946EA-827F-4D82-B841-1F2F6D060312}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F51946EA-827F-4D82-B841-1F2F6D060312}.Release|Any CPU.Build.0 = Release|Any CPU - {E1A23168-B571-411C-B360-2229E7225E0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E1A23168-B571-411C-B360-2229E7225E0E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E1A23168-B571-411C-B360-2229E7225E0E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E1A23168-B571-411C-B360-2229E7225E0E}.Release|Any CPU.Build.0 = Release|Any CPU - {197D4314-8A9F-49BA-977D-54ACEFAEB6BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {197D4314-8A9F-49BA-977D-54ACEFAEB6BA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {197D4314-8A9F-49BA-977D-54ACEFAEB6BA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {197D4314-8A9F-49BA-977D-54ACEFAEB6BA}.Release|Any CPU.Build.0 = Release|Any CPU - {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465}.Release|Any CPU.Build.0 = Release|Any CPU - {17E7D20D-198C-4728-ACEC-065DE834FF02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {17E7D20D-198C-4728-ACEC-065DE834FF02}.Debug|Any CPU.Build.0 = Debug|Any CPU - {17E7D20D-198C-4728-ACEC-065DE834FF02}.Release|Any CPU.ActiveCfg = Release|Any CPU - {17E7D20D-198C-4728-ACEC-065DE834FF02}.Release|Any CPU.Build.0 = Release|Any CPU - {368BC91D-48CD-492A-B6CF-B5B77F7FE7D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {368BC91D-48CD-492A-B6CF-B5B77F7FE7D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {368BC91D-48CD-492A-B6CF-B5B77F7FE7D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {368BC91D-48CD-492A-B6CF-B5B77F7FE7D4}.Release|Any CPU.Build.0 = Release|Any CPU - {3D050D35-B57D-4D14-BE0F-FD63552DADB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D050D35-B57D-4D14-BE0F-FD63552DADB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D050D35-B57D-4D14-BE0F-FD63552DADB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D050D35-B57D-4D14-BE0F-FD63552DADB0}.Release|Any CPU.Build.0 = Release|Any CPU - {E5D76DC1-84A8-47AF-BE25-E76F06D2FBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5D76DC1-84A8-47AF-BE25-E76F06D2FBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5D76DC1-84A8-47AF-BE25-E76F06D2FBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5D76DC1-84A8-47AF-BE25-E76F06D2FBBC}.Release|Any CPU.Build.0 = Release|Any CPU - {B5A2214B-3CB0-48C4-8DB1-98B38D48AC4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B5A2214B-3CB0-48C4-8DB1-98B38D48AC4A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B5A2214B-3CB0-48C4-8DB1-98B38D48AC4A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B5A2214B-3CB0-48C4-8DB1-98B38D48AC4A}.Release|Any CPU.Build.0 = Release|Any CPU - {284E19E2-661D-4A7D-864A-AC2FC91E7C25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {284E19E2-661D-4A7D-864A-AC2FC91E7C25}.Debug|Any CPU.Build.0 = Debug|Any CPU - {284E19E2-661D-4A7D-864A-AC2FC91E7C25}.Release|Any CPU.ActiveCfg = Release|Any CPU - {284E19E2-661D-4A7D-864A-AC2FC91E7C25}.Release|Any CPU.Build.0 = Release|Any CPU - {39546396-C4D0-45D3-8C6A-D56D29B5BD72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39546396-C4D0-45D3-8C6A-D56D29B5BD72}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39546396-C4D0-45D3-8C6A-D56D29B5BD72}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39546396-C4D0-45D3-8C6A-D56D29B5BD72}.Release|Any CPU.Build.0 = Release|Any CPU - {D95E2B42-757A-4D19-8A76-84C6350BAD8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D95E2B42-757A-4D19-8A76-84C6350BAD8D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D95E2B42-757A-4D19-8A76-84C6350BAD8D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D95E2B42-757A-4D19-8A76-84C6350BAD8D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {24A0AA3C-B25F-4197-B23D-476D6462DBA0} = {B51F1139-3D2C-41BE-A762-EF1F9B41EACA} - {DD448B37-BA3F-4544-9754-5406E8094723} = {B51F1139-3D2C-41BE-A762-EF1F9B41EACA} - {C4366030-6D03-424B-AE53-F4F43BB217C3} = {B51F1139-3D2C-41BE-A762-EF1F9B41EACA} - {F51946EA-827F-4D82-B841-1F2F6D060312} = {3627C08B-3E43-4224-9DA4-40BD69495FBC} - {E1A23168-B571-411C-B360-2229E7225E0E} = {3627C08B-3E43-4224-9DA4-40BD69495FBC} - {197D4314-8A9F-49BA-977D-54ACEFAEB6BA} = {3627C08B-3E43-4224-9DA4-40BD69495FBC} - {B5A2214B-3CB0-48C4-8DB1-98B38D48AC4A} = {B51F1139-3D2C-41BE-A762-EF1F9B41EACA} - {284E19E2-661D-4A7D-864A-AC2FC91E7C25} = {74391239-9BC1-40CE-A3D7-180737C5302A} - {39546396-C4D0-45D3-8C6A-D56D29B5BD72} = {74391239-9BC1-40CE-A3D7-180737C5302A} - {D95E2B42-757A-4D19-8A76-84C6350BAD8D} = {74391239-9BC1-40CE-A3D7-180737C5302A} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9B9E4316-9185-412E-B951-A63355ACA956} - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = BizHawk.Client.EmuHawk\BizHawk.Client.EmuHawk.csproj - EndGlobalSection -EndGlobal diff --git a/BizHawk.slnx b/BizHawk.slnx new file mode 100644 index 00000000000..03193280753 --- /dev/null +++ b/BizHawk.slnx @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dist/.BuildInConfigX.sh b/Dist/.BuildInConfigX.sh index fdcafac1997..33927f96fc8 100755 --- a/Dist/.BuildInConfigX.sh +++ b/Dist/.BuildInConfigX.sh @@ -1,6 +1,6 @@ #!/bin/sh set -e -if [ ! -e "BizHawk.sln" ]; then +if [ ! -e "BizHawk.slnx" ]; then printf "wrong cwd (ran manually)? exiting\n" exit 1 fi diff --git a/Dist/.BuildTestInConfigX.sh b/Dist/.BuildTestInConfigX.sh index 1958ce13c54..2548cd2bcd5 100755 --- a/Dist/.BuildTestInConfigX.sh +++ b/Dist/.BuildTestInConfigX.sh @@ -1,5 +1,5 @@ #!/bin/sh -if [ ! -e "BizHawk.sln" ]; then +if [ ! -e "BizHawk.slnx" ]; then printf "wrong cwd (ran manually)? exiting\n" exit 1 fi diff --git a/Dist/.InvokeCLIOnMainSln.sh b/Dist/.InvokeCLIOnMainSln.sh index fa09f310984..7c907952e81 100755 --- a/Dist/.InvokeCLIOnMainSln.sh +++ b/Dist/.InvokeCLIOnMainSln.sh @@ -1,6 +1,6 @@ #!/bin/sh set -e -if [ ! -e "BizHawk.sln" ]; then +if [ ! -e "BizHawk.slnx" ]; then printf "wrong cwd (ran manually)? exiting\n" exit 1 fi @@ -12,4 +12,4 @@ if [ -z "$NUGET_PACKAGES" ]; then export NUGET_PACKAGES="$HOME/.nuget/packages"; printf "running 'dotnet %s' in %s configuration, extra args: %s\n" "$cmd" "$config" "$*" version=$(grep -Po "MainVersion = \"\K(.*)(?=\")" src/BizHawk.Common/VersionInfo.cs) git_hash="$(git rev-parse --verify HEAD 2>/dev/null || printf "0000000000000000000000000000000000000000")" -dotnet "$cmd" BizHawk.sln -c "$config" -m -clp:NoSummary -p:Version="$version" -p:SourceRevisionId="$git_hash" "$@" +dotnet "$cmd" BizHawk.slnx -c "$config" -m -clp:NoSummary -p:Version="$version" -p:SourceRevisionId="$git_hash" "$@" diff --git a/Dist/QuickTestBuildAndPackage.bat b/Dist/QuickTestBuildAndPackage.bat index 9ce22bf921f..388cb16006c 100644 --- a/Dist/QuickTestBuildAndPackage.bat +++ b/Dist/QuickTestBuildAndPackage.bat @@ -9,7 +9,7 @@ if "%1"=="" ( git --version > NUL @if errorlevel 1 goto MISSINGGIT -dotnet build ..\BizHawk.sln -c Release --no-incremental +dotnet build ..\BizHawk.slnx -c Release --no-incremental @if not errorlevel 0 goto DOTNETBUILDFAILED rem -p:Platform="Any CPU" diff --git a/Dist/nix_expr_usage_docs.md b/Dist/nix_expr_usage_docs.md index 850b74c88cd..f3755c7ebff 100644 --- a/Dist/nix_expr_usage_docs.md +++ b/Dist/nix_expr_usage_docs.md @@ -84,7 +84,7 @@ nix-build --pure -A emuhawk.fetch-deps && ./result ```sh nix-shell # = `nix-shell -A emuhawk-latest` # (in shell): -Dist/BuildDebug.sh # = `dotnet build -c Debug BizHawk.sln` +Dist/BuildDebug.sh # = `dotnet build -c Debug BizHawk.slnx` emuhawk-monort-local # = `cd output && mono EmuHawk.exe` # if deps (besides NuGet packages) have changed, may need to do this instead, but it will do a slow copy of the repo to the Nix store diff --git a/README.md b/README.md index b6e274dc970..056d0fbc595 100644 --- a/README.md +++ b/README.md @@ -218,7 +218,7 @@ See the [contributor guidelines](https://github.com/TASEmulators/BizHawk/blob/ma tl;dr: - On Unix, run `Dist/BuildRelease.sh` (uses .NET SDK CLI). You can also use Rider or VS Code. -- On Windows, run in [VS2022](https://visualstudio.microsoft.com/vs/community). You can also use the command-line (`dotnet build BizHawk.sln`), Rider, or VS Code. +- On Windows, run in [VS2022](https://visualstudio.microsoft.com/vs/community). You can also use the command-line (`dotnet build BizHawk.slnx`), Rider, or VS Code. [to top](#bizhawk) diff --git a/contributing.md b/contributing.md index f1751391954..234e51edf74 100644 --- a/contributing.md +++ b/contributing.md @@ -113,10 +113,10 @@ Uses C#; you will need the .NET SDK or an IDE which includes it. See the [.NET s Most projects target .NET Standard 2.0, with some targeting .NET Framework 4.8. It's written at the top of their project files, or you can check the [project graph](https://github.com/TASEmulators/BizHawk/wiki/Dependencies#main-solution). The source for EmuHawk, plus DiscoHawk and the supporting libraries, is in `/src`, with a few extra files used by the build system elsewhere. -EmuHawk's project file `/src/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj` includes the other projects [in a tree](https://github.com/TASEmulators/BizHawk/wiki/Dependencies#main-solution), and they're all included in `/BizHawk.sln`. +EmuHawk's project file `/src/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj` includes the other projects [in a tree](https://github.com/TASEmulators/BizHawk/wiki/Dependencies#main-solution), and they're all included in `/BizHawk.slnx`. -In VS2022, open `BizHawk.sln`, then select the "BizHawk.Client.EmuHawk | Release" configuration to build and run. -To build from the command-line on Windows, simply run `dotnet build BizHawk.sln` from the repository's root, and then `output\EmuHawk.exe` will be available. Alternatively, you can run one of the existing build scripts that apply additional checks and configurations, such as `Dist\QuickTestBuildAndPackage_Release.bat`. +In VS2022, open `BizHawk.slnx`, then select the "BizHawk.Client.EmuHawk | Release" configuration to build and run. +To build from the command-line on Windows, simply run `dotnet build BizHawk.slnx` from the repository's root, and then `output\EmuHawk.exe` will be available. Alternatively, you can run one of the existing build scripts that apply additional checks and configurations, such as `Dist\QuickTestBuildAndPackage_Release.bat`. To build from the command-line on Unix, run `Dist/BuildRelease.sh`, and then `output/EmuHawkMono.sh` will be available. There are 2 build configurations. Besides `Release` there is `Debug`, which *does not run* bytecode optimisations, *does not remove* debugging symbols, *enables* additional logging and assertions, and *enables* some features. On Windows, a `Debug` executable will spawn a console window for stdout. Note there is also a "stronger" release build in the form of `VersionInfo.DeveloperBuild == false`, which is only used by GitLab CI for preparing a release (during `Dist/UpdateVersionInfoForRelease.sh`). From f0b4c5ebea43e79e82b5c06887ae7a295763abd6 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Mon, 8 Sep 2025 14:46:18 +1000 Subject: [PATCH 4/8] Bump `$(LangVersion)` to 14 temporarily muting IDE0031 "Use null propagation" (because of new `?=`) --- .editorconfig | 2 +- Common.props | 2 +- src/BizHawk.Client.Common/movie/HeaderKeys.cs | 2 -- .../Consoles/PC Engine/PCEngine.cs | 2 +- .../Consoles/PC Engine/QuickCollections.cs | 4 ++-- src/BizHawk.Tests.Common/TestAssertions.cs | 8 -------- src/MainSlnCommon.props | 2 +- 7 files changed, 6 insertions(+), 16 deletions(-) diff --git a/.editorconfig b/.editorconfig index a633ec06d4c..26ab9e5ba44 100644 --- a/.editorconfig +++ b/.editorconfig @@ -58,7 +58,7 @@ dotnet_diagnostic.IDE0029.severity = warning # Null check can be simplified dotnet_diagnostic.IDE0030.severity = warning # Use null propagation -dotnet_diagnostic.IDE0031.severity = warning +dotnet_diagnostic.IDE0031.severity = suggestion # Use auto property dotnet_diagnostic.IDE0032.severity = suggestion # Simplify default expression diff --git a/Common.props b/Common.props index 1c211f9435a..63298e3ad33 100644 --- a/Common.props +++ b/Common.props @@ -17,7 +17,7 @@ strict true $(TargetFramework.StartsWith("net4")) - 12.0 + 14.0 true $(NoWarn);CS1591 enable diff --git a/src/BizHawk.Client.Common/movie/HeaderKeys.cs b/src/BizHawk.Client.Common/movie/HeaderKeys.cs index 938bfa07d12..d7b260eb753 100644 --- a/src/BizHawk.Client.Common/movie/HeaderKeys.cs +++ b/src/BizHawk.Client.Common/movie/HeaderKeys.cs @@ -29,8 +29,6 @@ public static class HeaderKeys public const string VsyncAttoseconds = "VsyncAttoseconds"; // used for Arcade due to it representing thousands of different systems with different vsync rates public const string Core = "Core"; - private static FrozenSet field; - private static ISet AllValues => field ??= typeof(HeaderKeys).GetFields() .Select(static fi => fi.GetValue(null).ToString()) diff --git a/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs b/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs index 24b6bb7c2a7..06cb6dbe18c 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs @@ -223,7 +223,7 @@ private void Init(GameInfo game, byte[] rom) // 384k roms require special loading code. Why ;_; // In memory, 384k roms look like [1st 256k][Then full 384k] RomData = new byte[0xA0000]; - ((ReadOnlySpan) rom.AsSpan(start: 0, length: 0x40000)).ConcatArray(rom, dest: RomData); + rom.AsSpan(start: 0, length: 0x40000).ConcatArray(rom, dest: RomData); } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/PC Engine/QuickCollections.cs b/src/BizHawk.Emulation.Cores/Consoles/PC Engine/QuickCollections.cs index 7d7ccb58748..53253b559f1 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/PC Engine/QuickCollections.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/PC Engine/QuickCollections.cs @@ -53,7 +53,7 @@ public QuickQueue(int capacity) public void Enqueue(T item) { if (size >= buffer.Length) - throw new Exception($"{nameof(QuickQueue)} capacity breached!"); + throw new Exception($"{nameof(QuickQueue<>)} capacity breached!"); buffer[tail] = item; tail = (tail + 1) % buffer.Length; @@ -78,7 +78,7 @@ public T[] ToArray(int elemSize) public T Dequeue() { if (size == 0) - throw new Exception($"{nameof(QuickQueue)} is empty!"); + throw new Exception($"{nameof(QuickQueue<>)} is empty!"); T item = buffer[head]; head = (head + 1) % buffer.Length; diff --git a/src/BizHawk.Tests.Common/TestAssertions.cs b/src/BizHawk.Tests.Common/TestAssertions.cs index 6fa0b4fde3c..148d3240125 100644 --- a/src/BizHawk.Tests.Common/TestAssertions.cs +++ b/src/BizHawk.Tests.Common/TestAssertions.cs @@ -39,14 +39,6 @@ public static void AreEqual( Assert.Fail(message); } - public static void AreEqual( - this CollectionAssert assert, - Span expected, - Span actual, - string? message = null) - where T : IEquatable - => assert.AreEqual((ReadOnlySpan) expected, actual, message); - public static void Contains( this CollectionAssert assert, IEnumerable collection, diff --git a/src/MainSlnCommon.props b/src/MainSlnCommon.props index 5d3c6addaba..45a1a7e9b02 100644 --- a/src/MainSlnCommon.props +++ b/src/MainSlnCommon.props @@ -47,7 +47,7 @@ - + From 99e4a03b3aac8320425e15d0e4e183bea1e74554 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Sun, 16 Nov 2025 20:22:55 +1000 Subject: [PATCH 5/8] Remove redundant `.AsSpan()` / casts to `{ReadOnly,}Span` --- src/BizHawk.Bizware.Graphics/D3D11/D3D11GLInterop.cs | 2 +- src/BizHawk.Client.Common/RomLoader.cs | 2 +- .../lua/LuaHelperLibs/EventsLuaLibrary.cs | 2 +- .../movie/import/bkm/BkmControllerAdapter.cs | 2 +- src/BizHawk.Common/BPSPatcher.cs | 2 +- src/BizHawk.Emulation.Common/N3DSHasher.cs | 6 +++--- .../Computers/AmstradCPC/Media/Disk/FloppyDisk.cs | 2 +- .../Computers/AppleII/AppleII.ISaveRam.cs | 2 +- .../Computers/Commodore64/Cartridge/Am29F040B.cs | 4 ++-- .../Computers/Commodore64/Cartridge/Mapper0013.cs | 2 +- .../Computers/Commodore64/Media/DiskTrack.cs | 8 +++----- .../Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs | 2 +- .../Consoles/Nintendo/GBA/MGBAHawk.ISaveRam.cs | 2 +- .../Consoles/Nintendo/NDS/NDSFirmware.cs | 2 +- .../EndiannessUtils/EndiannessUtilsTests.cs | 6 +++--- 15 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/BizHawk.Bizware.Graphics/D3D11/D3D11GLInterop.cs b/src/BizHawk.Bizware.Graphics/D3D11/D3D11GLInterop.cs index d445bc9085c..e80b188466b 100644 --- a/src/BizHawk.Bizware.Graphics/D3D11/D3D11GLInterop.cs +++ b/src/BizHawk.Bizware.Graphics/D3D11/D3D11GLInterop.cs @@ -182,7 +182,7 @@ static D3D11GLInterop() if (vendor == Vendor.Intel) { - if (_blacklistedIntelDeviceIds.AsSpan().Contains(adapter.Description.DeviceId)) + if (_blacklistedIntelDeviceIds.Contains(adapter.Description.DeviceId)) { return; } diff --git a/src/BizHawk.Client.Common/RomLoader.cs b/src/BizHawk.Client.Common/RomLoader.cs index f8064d82add..b74bd917cbf 100644 --- a/src/BizHawk.Client.Common/RomLoader.cs +++ b/src/BizHawk.Client.Common/RomLoader.cs @@ -557,7 +557,7 @@ private void LoadOther( const string ERR_MSG_NOT_PSXEXE = "Got an .exe which is not in the PSX-EXE format!" + "\nIf you're trying to load a PE (Windows program), you need to load the unextracted disc image. See https://tasvideos.org/BizHawk/DOSBox for details." // sadly won't be clickable + "\n"; // extra blank line to separate from stacktrace below - if (!rom.FileData.AsSpan().StartsWith("PS-X EXE"u8)) throw new /*NoAvailableCoreException*/InvalidOperationException(ERR_MSG_NOT_PSXEXE); + if (!rom.FileData.StartsWith("PS-X EXE"u8)) throw new /*NoAvailableCoreException*/InvalidOperationException(ERR_MSG_NOT_PSXEXE); break; } var cip = new CoreInventoryParameters(this) diff --git a/src/BizHawk.Client.Common/lua/LuaHelperLibs/EventsLuaLibrary.cs b/src/BizHawk.Client.Common/lua/LuaHelperLibs/EventsLuaLibrary.cs index 706fd9dcbbe..56a44235b1f 100644 --- a/src/BizHawk.Client.Common/lua/LuaHelperLibs/EventsLuaLibrary.cs +++ b/src/BizHawk.Client.Common/lua/LuaHelperLibs/EventsLuaLibrary.cs @@ -351,6 +351,6 @@ private string ProcessScope(string scope) private bool HasScope(string scope) => string.IsNullOrWhiteSpace(scope) - || DebuggableCore.MemoryCallbacks.AvailableScopes.AsSpan().Contains(scope); + || DebuggableCore.MemoryCallbacks.AvailableScopes.Contains(scope); } } diff --git a/src/BizHawk.Client.Common/movie/import/bkm/BkmControllerAdapter.cs b/src/BizHawk.Client.Common/movie/import/bkm/BkmControllerAdapter.cs index c7979d9f033..ed73ed7055a 100644 --- a/src/BizHawk.Client.Common/movie/import/bkm/BkmControllerAdapter.cs +++ b/src/BizHawk.Client.Common/movie/import/bkm/BkmControllerAdapter.cs @@ -134,7 +134,7 @@ public void SetControllersAsMnemonic(string mnemonic) SetFromMnemonic(mnemonic.AsSpan(3)); break; case "Dual Gameboy Controller": - SetFromMnemonic(mnemonic.AsSpan()); + SetFromMnemonic(mnemonic); break; case "WonderSwan Controller": SetFromMnemonic(mnemonic.AsSpan(1)); diff --git a/src/BizHawk.Common/BPSPatcher.cs b/src/BizHawk.Common/BPSPatcher.cs index 68b0c50f8f4..9bf17f80bc9 100644 --- a/src/BizHawk.Common/BPSPatcher.cs +++ b/src/BizHawk.Common/BPSPatcher.cs @@ -205,7 +205,7 @@ internal void DoPatch(Span rom) private const string ERR_MSG_UNINIT = "uninitialised struct"; private static bool CheckCRC(ReadOnlySpan data, ReadOnlySpan reversedChecksum) - => ((ReadOnlySpan) CRC32Checksum.Compute(data)).ReversedSequenceEqual(reversedChecksum); + => CRC32Checksum.Compute(data).ReversedSequenceEqual(reversedChecksum); public static bool IsBPSFile(ReadOnlySpan dataWithHeader, out BPSPayload patchStruct) { diff --git a/src/BizHawk.Emulation.Common/N3DSHasher.cs b/src/BizHawk.Emulation.Common/N3DSHasher.cs index 953dabbce98..a2966984746 100644 --- a/src/BizHawk.Emulation.Common/N3DSHasher.cs +++ b/src/BizHawk.Emulation.Common/N3DSHasher.cs @@ -382,7 +382,7 @@ private void HashNCCH(FileStream romFile, IncrementalHash md5Inc, byte[] header, if ((exeFsSectionSize & 0xF) != 0) { var ivCopy = new byte[iv.Length]; - iv.AsSpan().CopyTo(ivCopy); + iv.CopyTo(ivCopy); exeFsSectionOffset &= ~0xFU; // First decrypt these last bytes using the secondary key @@ -390,11 +390,11 @@ private void HashNCCH(FileStream romFile, IncrementalHash md5Inc, byte[] header, // Now re-encrypt these bytes using the primary key aes.Key = primaryKey; - ivCopy.AsSpan().CopyTo(iv); + ivCopy.CopyTo(iv); AesCtrTransform(aes, iv, exeFsBuffer.AsSpan((int)exeFsSectionOffset, (int)(0x10 - (exeFsSectionSize & 0xF)))); // All of the padding can now be decrypted using the primary key - ivCopy.AsSpan().CopyTo(iv); + ivCopy.CopyTo(iv); exeFsSectionSize += 0x10 - (exeFsSectionSize & 0xF); } diff --git a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs index 581db2ef738..ec15ab67ec1 100644 --- a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs @@ -641,7 +641,7 @@ public byte[] ActualData if (size > ActualDataByteLength) { var buf = new byte[SectorData.Length + size - ActualDataByteLength]; - SectorData.AsSpan().CopyTo(buf); + SectorData.CopyTo(buf); // SectorData.AsSpan(start: 0, length: buf.Length - SectorData.Length) // .CopyTo(buf.AsSpan(start: SectorData.Length)); buf.AsSpan(start: SectorData.Length).Fill(SectorData[SectorData.Length - 1]); diff --git a/src/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.ISaveRam.cs b/src/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.ISaveRam.cs index b686ccf80e9..cd45af3d5fa 100644 --- a/src/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.ISaveRam.cs +++ b/src/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.ISaveRam.cs @@ -69,7 +69,7 @@ private void LoadDelta(bool maybeDifferent) } else if (maybeDifferent) { - original.AsSpan().CopyTo(current); + original.CopyTo(current); } }); } diff --git a/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Am29F040B.cs b/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Am29F040B.cs index 66470c29226..e20a647ed08 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Am29F040B.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Am29F040B.cs @@ -144,8 +144,8 @@ public void Reset() _endAddress = ImageMask; } - public Span Data => - _data.AsSpan(); + public Span Data + => _data; public int Peek(int addr) => _data[addr & ImageMask] & 0xFF; diff --git a/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Mapper0013.cs b/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Mapper0013.cs index f3c19877cf2..5bd326fbc26 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Mapper0013.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Mapper0013.cs @@ -62,7 +62,7 @@ public Mapper0013(IEnumerable chips) var bank = new byte[BankSize]; bank.AsSpan().Fill(DummyData); - chip.ConvertDataToBytes().CopyTo(bank.AsSpan()); + chip.ConvertDataToBytes().CopyTo(bank); _banks[chip.Bank] = bank; diff --git a/src/BizHawk.Emulation.Cores/Computers/Commodore64/Media/DiskTrack.cs b/src/BizHawk.Emulation.Cores/Computers/Commodore64/Media/DiskTrack.cs index 9c5242669fa..2cea3881ec3 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Commodore64/Media/DiskTrack.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Commodore64/Media/DiskTrack.cs @@ -67,15 +67,13 @@ public DiskTrack Clone() /// True only if the content differs. /// public bool IsModified() - => !_original.AsSpan().SequenceEqual(_bits); + => !_original.SequenceEqual(_bits); /// /// Resets this track to the state of the original media. /// public void Reset() - { - _original.CopyTo(_bits.AsSpan()); - } + => _original.CopyTo(_bits); /// /// Write an entry to . @@ -146,6 +144,6 @@ public void ReadFromGCR(int density, ReadOnlySpan bytes, int fluxBitOffset } } - _bits.CopyTo(_original.AsSpan()); + _bits.CopyTo(_original); } } diff --git a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs index cbe56f61e13..934b92bdd26 100644 --- a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs @@ -644,7 +644,7 @@ public byte[] ActualData if (size > ActualDataByteLength) { var buf = new byte[SectorData.Length + size - ActualDataByteLength]; - SectorData.AsSpan().CopyTo(buf); + SectorData.CopyTo(buf); // SectorData.AsSpan(start: 0, length: buf.Length - SectorData.Length) // .CopyTo(buf.AsSpan(start: SectorData.Length)); buf.AsSpan(start: SectorData.Length).Fill(SectorData[SectorData.Length - 1]); diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.ISaveRam.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.ISaveRam.cs index cade996e413..d5b567aa56d 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.ISaveRam.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.ISaveRam.cs @@ -30,7 +30,7 @@ public byte[] CloneSaveRam(bool clearDirty) public void StoreSaveRam(byte[] data) { - if (data.AsSpan().StartsWith("GBABATT\0"u8)) + if (data.StartsWith("GBABATT\0"u8)) { data = LegacyFix(data); } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs index 1963b575d40..c9344b58404 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs @@ -65,7 +65,7 @@ private static unsafe void CheckDecryptedCodeChecksum( try { var hash = SHA1Checksum.ComputeDigestHex(Util.UnsafeSpanFromPointer(decryptedFw, decrypedFwLen)); - if (!_goodHashes.AsSpan().Contains(hash)) + if (!_goodHashes.Contains(hash)) { warningCallback($"Potentially bad firmware dump! Decrypted hash {hash} does not match known good dumps."); } diff --git a/src/BizHawk.Tests.Common/EndiannessUtils/EndiannessUtilsTests.cs b/src/BizHawk.Tests.Common/EndiannessUtils/EndiannessUtilsTests.cs index edb987380fd..58b9711207a 100644 --- a/src/BizHawk.Tests.Common/EndiannessUtils/EndiannessUtilsTests.cs +++ b/src/BizHawk.Tests.Common/EndiannessUtils/EndiannessUtilsTests.cs @@ -11,7 +11,7 @@ public sealed class EndiannessUtilsTests public void TestByteSwap16() { var b = new byte[] { 0x23, 0x01, 0x67, 0x45, 0xAB, 0x89, 0xEF, 0xCD }.AsSpan(); - var a = b.ToArray().AsSpan(); + var a = b.ToArray(); EndiannessUtils.MutatingByteSwap16(a); CollectionAssert.That.AreEqual(expected, a, "should match expected after 1 application"); EndiannessUtils.MutatingByteSwap16(a); @@ -22,7 +22,7 @@ public void TestByteSwap16() public void TestByteSwap32() { var b = new byte[] { 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, 0x89 }.AsSpan(); - var a = b.ToArray().AsSpan(); + var a = b.ToArray(); EndiannessUtils.MutatingByteSwap32(a); CollectionAssert.That.AreEqual(expected, a, "should match expected after 1 application"); EndiannessUtils.MutatingByteSwap32(a); @@ -33,7 +33,7 @@ public void TestByteSwap32() public void TestShortSwap32() { var b = new byte[] { 0x45, 0x67, 0x01, 0x23, 0xCD, 0xEF, 0x89, 0xAB }.AsSpan(); - var a = b.ToArray().AsSpan(); + var a = b.ToArray(); EndiannessUtils.MutatingShortSwap32(a); CollectionAssert.That.AreEqual(expected, a, "should match expected after 1 application"); EndiannessUtils.MutatingShortSwap32(a); From c906b510988d7b37f7600ec1687603f8bb105a75 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Sun, 16 Nov 2025 18:28:59 +1000 Subject: [PATCH 6/8] Remove redundant `SequenceEqual` overload --- src/BizHawk.Bizware.Graphics/BitmapBuffer.cs | 2 -- src/BizHawk.Client.Common/movie/import/GmvImport.cs | 1 - src/BizHawk.Common/Extensions/CollectionExtensions.cs | 3 --- src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs | 1 - src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Unif.cs | 1 - src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs | 1 - 6 files changed, 9 deletions(-) diff --git a/src/BizHawk.Bizware.Graphics/BitmapBuffer.cs b/src/BizHawk.Bizware.Graphics/BitmapBuffer.cs index 510e23f39b4..c6c9c44dee5 100644 --- a/src/BizHawk.Bizware.Graphics/BitmapBuffer.cs +++ b/src/BizHawk.Bizware.Graphics/BitmapBuffer.cs @@ -10,8 +10,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using BizHawk.Common.CollectionExtensions; - using SDGraphics = System.Drawing.Graphics; namespace BizHawk.Bizware.Graphics diff --git a/src/BizHawk.Client.Common/movie/import/GmvImport.cs b/src/BizHawk.Client.Common/movie/import/GmvImport.cs index a09fa906122..b971522426b 100644 --- a/src/BizHawk.Client.Common/movie/import/GmvImport.cs +++ b/src/BizHawk.Client.Common/movie/import/GmvImport.cs @@ -1,7 +1,6 @@ using System.IO; using System.Text; -using BizHawk.Common.CollectionExtensions; using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores; using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; diff --git a/src/BizHawk.Common/Extensions/CollectionExtensions.cs b/src/BizHawk.Common/Extensions/CollectionExtensions.cs index 6be01284502..069bf4df9f4 100644 --- a/src/BizHawk.Common/Extensions/CollectionExtensions.cs +++ b/src/BizHawk.Common/Extensions/CollectionExtensions.cs @@ -650,8 +650,5 @@ public static bool IsSortedDesc(this ReadOnlySpan span) for (int i = 0, e = span.Length - 1; i < e; i++) if (span[i + 1].CompareTo(span[i]) > 0) return false; return true; } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool SequenceEqual(this T[] a, ReadOnlySpan b) where T : IEquatable => a.AsSpan().SequenceEqual(b); } } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs index 0b1833d426d..36520f2fc51 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs @@ -2,7 +2,6 @@ using System.IO; using BizHawk.Common; -using BizHawk.Common.CollectionExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Nintendo.NES diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Unif.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Unif.cs index 7b2c1c4a381..c788f5f0772 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Unif.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Unif.cs @@ -4,7 +4,6 @@ using BizHawk.Common; using BizHawk.Common.BufferExtensions; -using BizHawk.Common.CollectionExtensions; using BizHawk.Common.IOExtensions; diff --git a/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs b/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs index 32636bbf457..6b7ffa055a5 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs @@ -3,7 +3,6 @@ using System.Text; using BizHawk.Common; -using BizHawk.Common.CollectionExtensions; using BizHawk.Common.StringExtensions; using ISOParser; From 14a3f647e43c89d29ccf8d322353c861b4ad0829 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Sun, 16 Nov 2025 19:31:33 +1000 Subject: [PATCH 7/8] Re-enable IDE0031 and adopt `?=` --- .editorconfig | 2 +- src/BizHawk.Client.EmuHawk/MainForm.cs | 6 ++---- .../tools/Lua/Libraries/TAStudioLuaLibrary.cs | 5 +---- .../tools/SNES/SNESGraphicsDebugger.cs | 7 +------ .../tools/TAStudio/BookmarksBranchesBox.cs | 10 ++-------- .../Computers/Commodore64/C64.Motherboard.cs | 6 ++---- .../Computers/SinclairSpectrum/ZXSpectrum.cs | 12 ++---------- .../Consoles/Nintendo/BSNES/SNESGraphicsDecoder.cs | 2 +- .../Nintendo/GBHawk/Mappers/Mapper_Default.cs | 5 +---- .../Consoles/Nintendo/GBHawk/Mappers/Mapper_MBC6.cs | 5 +---- .../Consoles/Nintendo/GBHawk/Mappers/Mapper_MMM01.cs | 5 +---- .../Consoles/Nintendo/NDS/MelonDS.cs | 6 +----- .../Consoles/Nintendo/NES/Boards/ExROM.cs | 3 +-- .../Consoles/Nintendo/NES/Boards/Mapper252.cs | 3 +-- .../Consoles/Nintendo/NES/Boards/NesBoardBase.cs | 12 ++---------- .../Consoles/Nintendo/NES/Boards/Sunsoft3.cs | 3 +-- .../Consoles/Nintendo/NES/Boards/SxROM.cs | 3 +-- .../Consoles/Nintendo/NES/Boards/VRC1.cs | 3 +-- .../Consoles/Nintendo/NES/Boards/VRC7.cs | 3 +-- .../Consoles/Nintendo/NES/Boards/VS_M99.cs | 3 +-- .../Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs | 2 +- .../Consoles/PC Engine/PCEngine.cs | 5 +---- .../DiscFormats/CUE/CUE_Compile.cs | 7 +------ src/BizHawk.Emulation.DiscSystem/DiscMountJob.cs | 2 +- 24 files changed, 29 insertions(+), 91 deletions(-) diff --git a/.editorconfig b/.editorconfig index 26ab9e5ba44..a633ec06d4c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -58,7 +58,7 @@ dotnet_diagnostic.IDE0029.severity = warning # Null check can be simplified dotnet_diagnostic.IDE0030.severity = warning # Use null propagation -dotnet_diagnostic.IDE0031.severity = suggestion +dotnet_diagnostic.IDE0031.severity = warning # Use auto property dotnet_diagnostic.IDE0032.severity = suggestion # Simplify default expression diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index b79c806b86e..4115e3a9d42 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -3688,13 +3688,11 @@ private bool LoadRomInternal(string path, LoadRomArgs args, out bool failureIsFr { oaRetro.token.Path = loader.CanonicalFullPath; } - - if (oaOpenrom != null) + else if (oaOpenrom is not null) { oaOpenrom.Path = loader.CanonicalFullPath; } - - if (ioa is OpenAdvanced_MAME oaMame) + else if (ioa is OpenAdvanced_MAME oaMame) { oaMame.Path = loader.CanonicalFullPath; } diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs index a8b45ea4edf..cec87c21ded 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs @@ -425,10 +425,7 @@ public void SetBranchText(string text, int? index = null) if (index != null) { var branch = Tastudio.CurrentTasMovie.Branches[index.Value]; - if (branch != null) - { - branch.UserText = text1; - } + branch?.UserText = text1; } else { diff --git a/src/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs b/src/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs index 975972f0f7a..40a196cb968 100644 --- a/src/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs +++ b/src/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs @@ -816,12 +816,7 @@ private void paletteViewer_MouseClick(object sender, MouseEventArgs e) bool valid = TranslatePaletteCoord(e.Location, out var pt); if (!valid) return; selectedColorNum = pt.Y * 16 + pt.X; - - if (currTileDataState != null) - { - currTileDataState.Palette = currPaletteSelection.start; - } - + currTileDataState?.Palette = currPaletteSelection.start; SyncColorSelection(); InternalUpdateValues(); } diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs index da77a10f1bd..9eb72f1180f 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs @@ -27,9 +27,7 @@ public partial class BookmarksBranchesBox : UserControl, IDialogParent private BranchUndo _branchUndo = BranchUndo.None; public void SetBackupMaxSteps(int value) - { - if (_backupBranch != null) _backupBranch.ChangeLog.MaxSteps = value; - } + => _backupBranch?.ChangeLog.MaxSteps = value; private enum BranchUndo { @@ -353,11 +351,7 @@ private void UndoBranchToolStripMenuItem_Click(object sender, EventArgs e) else if (_branchUndo == BranchUndo.Text) { var branch = Branches.SingleOrDefault(b => b.Uuid == _backupBranch.Uuid); - if (branch != null) - { - branch.UserText = _backupBranch.UserText; - } - + branch?.UserText = _backupBranch.UserText; Tastudio.MainForm.AddOnScreenMessage("Branch Text Edit canceled"); } else if (_branchUndo == BranchUndo.Remove) diff --git a/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.Motherboard.cs b/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.Motherboard.cs index a2c5e3fa97c..0985d242f5c 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.Motherboard.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Commodore64/C64.Motherboard.cs @@ -147,10 +147,8 @@ public Motherboard(C64 c64, C64.VicType initRegion, C64.BorderType borderType, C CharRom = new Chip23128(); KernalRom = new Chip23128(); - if (Cpu != null) - Cpu.DebuggerStep = Execute; - if (DiskDrive != null) - DiskDrive.DebuggerStep = Execute; + Cpu?.DebuggerStep = Execute; + DiskDrive?.DebuggerStep = Execute; } public int ClockNumerator { get; } diff --git a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/ZXSpectrum.cs b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/ZXSpectrum.cs index 1932abe480c..46687c450ba 100644 --- a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/ZXSpectrum.cs +++ b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/ZXSpectrum.cs @@ -135,16 +135,8 @@ public ZXSpectrum( ay38912.PanningConfiguration = settings.AYPanConfig; ay38912.Volume = settings.AYVolume; } - - if (_machine.BuzzerDevice != null) - { - _machine.BuzzerDevice.Volume = settings.EarVolume; - } - - if (_machine.TapeBuzzer != null) - { - _machine.TapeBuzzer.Volume = settings.TapeVolume; - } + _machine.BuzzerDevice?.Volume = settings.EarVolume; + _machine.TapeBuzzer?.Volume = settings.TapeVolume; DCFilter dc = new DCFilter(SoundMixer, 512); ser.Register(dc); diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/SNESGraphicsDecoder.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/SNESGraphicsDecoder.cs index 2d592059689..16a73163b9c 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/SNESGraphicsDecoder.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/BSNES/SNESGraphicsDecoder.cs @@ -386,7 +386,7 @@ public void RenderSpriteToScreen( screen[dofs] = color; Paletteize(screen, dofs, oamInfo.Palette * 16 + 128, 1); Colorize(screen, dofs, 1); - if (spriteMap != null) spriteMap[dx, dy] = (byte)spritenum; + spriteMap?[dx, dy] = (byte) spritenum; } } } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_Default.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_Default.cs index 8f6560219bd..8705eb16cde 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_Default.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_Default.cs @@ -66,10 +66,7 @@ public override void WriteMemory(ushort addr, byte value) } else { - if (Core.cart_RAM != null) - { - Core.cart_RAM[addr - 0xA000] = value; - } + Core.cart_RAM?[addr - 0xA000] = value; } } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MBC6.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MBC6.cs index 3611dd14138..7eaeb2d6afd 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MBC6.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MBC6.cs @@ -73,10 +73,7 @@ public override void WriteMemory(ushort addr, byte value) } else { - if (Core.cart_RAM != null) - { - Core.cart_RAM[addr - 0xA000] = value; - } + Core.cart_RAM?[addr - 0xA000] = value; } } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MMM01.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MMM01.cs index d8047525605..b608ac4983b 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MMM01.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Mappers/Mapper_MMM01.cs @@ -73,10 +73,7 @@ public override void WriteMemory(ushort addr, byte value) } else { - if (Core.cart_RAM != null) - { - Core.cart_RAM[addr - 0xA000] = value; - } + Core.cart_RAM?[addr - 0xA000] = value; } } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs index 17eed60594b..bc1a87c3026 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs @@ -879,11 +879,7 @@ protected override void FrameAdvancePost() _frameThreadEndEvent.Wait(); _renderThreadRanThisFrame = false; } - - if (_glTextureProvider != null) - { - _glTextureProvider.VideoDirty = true; - } + _glTextureProvider?.VideoDirty = true; } protected override void LoadStateBinaryInternal(BinaryReader reader) diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/ExROM.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/ExROM.cs index 1ca127d8ef0..c26d1a047fe 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/ExROM.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/ExROM.cs @@ -396,8 +396,7 @@ public override void WritePpu(int addr, byte value) { if (addr < 0x2000) { - if (Vram != null) - Vram[MapCHR(addr)] = value; + Vram?[MapCHR(addr)] = value; } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper252.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper252.cs index 2a00b6a2258..0e15ffd1355 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper252.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper252.cs @@ -151,8 +151,7 @@ public override void WritePpu(int addr, byte value) { if (addr < 0x2000) { - if (Vram != null) - Vram[addr&0x7FF] = value; + Vram?[addr & 0x7FF] = value; } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NesBoardBase.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NesBoardBase.cs index f4db5515596..9dbb1a596fe 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NesBoardBase.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NesBoardBase.cs @@ -158,12 +158,7 @@ public virtual void WritePrg(int addr, byte value) } public virtual void WriteWram(int addr, byte value) - { - if (_wram != null) - { - _wram[addr & _wramMask] = value; - } - } + => _wram?[addr & _wramMask] = value; private int _wramMask; public virtual void PostConfigure() @@ -204,10 +199,7 @@ public virtual void WritePpu(int addr, byte value) { if (addr < 0x2000) { - if (Vram != null) - { - Vram[addr] = value; - } + Vram?[addr] = value; } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Sunsoft3.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Sunsoft3.cs index 95da9fc16e6..449242c2eed 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Sunsoft3.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Sunsoft3.cs @@ -189,8 +189,7 @@ public override void WritePpu(int addr, byte value) if (addr < 0x2000) { addr = ApplyMemoryMap(11, chr_banks_2k, addr); - if (Vram != null) - Vram[addr] = value; + Vram?[addr] = value; } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/SxROM.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/SxROM.cs index f26c4fa6f66..32285ac849b 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/SxROM.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/SxROM.cs @@ -349,8 +349,7 @@ public override void WritePpu(int addr, byte value) { if (addr < 0x2000) { - if (Vram != null) - Vram[Gen_CHR_Address(addr) & vram_mask] = value; + Vram?[Gen_CHR_Address(addr) & vram_mask] = value; } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC1.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC1.cs index 099e3175958..2b1ae7842dc 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC1.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC1.cs @@ -122,8 +122,7 @@ public override void WritePpu(int addr, byte value) { if (addr < 0x2000) { - if (Vram != null) - Vram[addr] = value; + Vram?[addr] = value; } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC7.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC7.cs index 500ec2e3e32..23ba8c8da1b 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC7.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VRC7.cs @@ -197,8 +197,7 @@ public override void WritePrg(int addr, byte value) case 0x1001: //sound address port - if (fm != null) - fm.RegisterLatch = value; + fm?.RegisterLatch = value; break; case 0x1003: //sound data port diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VS_M99.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VS_M99.cs index b09c06dd253..850d6410e74 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VS_M99.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/VS_M99.cs @@ -82,8 +82,7 @@ public override void WritePpu(int addr, byte value) { if (addr < 0x2000) { - if (Vram != null) - Vram[addr] = value; + Vram?[addr] = value; } else { diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs index 97777e60f5c..7357a756993 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs @@ -1071,7 +1071,7 @@ public void RenderSpriteToScreen(int* screen, int stride, int destx, int desty, screen[dofs] = color; Paletteize(screen, dofs, oam.Palette * 16 + 128, 1); Colorize(screen, dofs, 1); - if (spriteMap != null) spriteMap[dx, dy] = (byte)spritenum; + spriteMap?[dx, dy] = (byte) spritenum; } } } diff --git a/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs b/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs index 06cb6dbe18c..bc2de68c585 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs @@ -350,10 +350,7 @@ private void CheckSpriteLimit() { bool spriteLimit = ForceSpriteLimit | Settings.SpriteLimit; VDC1.PerformSpriteLimit = spriteLimit; - if (VDC2 != null) - { - VDC2.PerformSpriteLimit = spriteLimit; - } + VDC2?.PerformSpriteLimit = spriteLimit; } diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Compile.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Compile.cs index 61af7c0b8d5..6ec52f3306d 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Compile.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Compile.cs @@ -194,12 +194,7 @@ private void UpdateDiscInfo(CUE_File.Command.TRACK trackCommand) private void CloseFile() { - if (curr_track != null) - { - //flag this track as the final one in the file - curr_track.IsFinalInFile = true; - } - + curr_track?.IsFinalInFile = true; curr_file = null; } diff --git a/src/BizHawk.Emulation.DiscSystem/DiscMountJob.cs b/src/BizHawk.Emulation.DiscSystem/DiscMountJob.cs index 0188e0e37ca..07b76049ebd 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscMountJob.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscMountJob.cs @@ -217,7 +217,7 @@ void LoadCue(string cueDirPath, string cueContent) } // set up the lowest level synth provider - if (OUT_Disc != null) OUT_Disc.SynthProvider = new ArraySectorSynthProvider { Sectors = OUT_Disc._Sectors, FirstLBA = -150 }; + OUT_Disc?.SynthProvider = new ArraySectorSynthProvider { Sectors = OUT_Disc._Sectors, FirstLBA = -150 }; } public static string GenerateCue(string binFilePath, bool isMode2) From eddff780b573ac3e30155115ce3b9def611c1169 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Thu, 3 Jul 2025 11:19:01 +1000 Subject: [PATCH 8/8] Add Analyzer to prevent empty `ArraySegment` collection expression see 83d04b048 --- Directory.Packages.props | 6 +-- .../BrokenCollectionExpressionAnalyzer.cs | 35 ++++++++++++++++++ References/BizHawk.Analyzer.dll | Bin 90624 -> 91648 bytes 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 ExternalProjects/BizHawk.Analyzer/BrokenCollectionExpressionAnalyzer.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index a6e9f40d89c..c7037022933 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -12,8 +12,8 @@ - - + + @@ -34,7 +34,7 @@ - + diff --git a/ExternalProjects/BizHawk.Analyzer/BrokenCollectionExpressionAnalyzer.cs b/ExternalProjects/BizHawk.Analyzer/BrokenCollectionExpressionAnalyzer.cs new file mode 100644 index 00000000000..9ea33e6d546 --- /dev/null +++ b/ExternalProjects/BizHawk.Analyzer/BrokenCollectionExpressionAnalyzer.cs @@ -0,0 +1,35 @@ +namespace BizHawk.Analyzers; + +using System.Collections.Immutable; + +[DiagnosticAnalyzer(LanguageNames.CSharp)] +public sealed class BrokenCollectionExpressionAnalyzer : DiagnosticAnalyzer +{ + private static readonly DiagnosticDescriptor DiagBrokenCollectionExpression = new( + id: "BHI1234", + title: "don't this", + messageFormat: "don't this", + category: "Usage", + defaultSeverity: DiagnosticSeverity.Warning, + isEnabledByDefault: true); + + public override ImmutableArray SupportedDiagnostics { get; } + = ImmutableArray.Create(/*HawkSourceAnalyzer.DiagWTF,*/ DiagBrokenCollectionExpression); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterCompilationStartAction(initContext => + { + var arraySegmentSym = initContext.Compilation.GetTypeByMetadataName("System.ArraySegment`1")!; + initContext.RegisterOperationAction( + oac => + { + var operation = (ICollectionExpressionOperation) oac.Operation; + if (arraySegmentSym.Matches(operation.Type.OriginalDefinition)) DiagBrokenCollectionExpression.ReportAt(operation, oac); + }, + OperationKind.CollectionExpression); + }); + } +} diff --git a/References/BizHawk.Analyzer.dll b/References/BizHawk.Analyzer.dll index cc011cf95c912eae57e476cfe8babeb8caddaddc..adb621256353ae9f2b349cf88a3b2a3e45243fa1 100644 GIT binary patch literal 91648 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≺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%0Ay?+CbJ6mTlI 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