GeezerVison is showing github.com — Optimise LINQ queries by bergmeister · Pull Request #2160 · PowerShell/PSScriptAnalyzer
Conversation
PR Summary
NOTE: This was created using GH Copilot agent when being asked for optimizations. They seem sensible. Not sure if we will see the benefit of it as many LINQ methods have internal optimisation to use Count property if available but having code the right way seems better practice. Below is Copilot's summary:
Replaced inefficient LINQ patterns with performant alternatives across core analysis paths.
Changes
List count checks (ScriptAnalyzer.cs:274-276)
List<T>.Count() → List<T>.Count property access
Enumerable emptiness checks (ScriptAnalyzer.cs:616, RuleSuppression.cs:345, Settings.cs:456)
IEnumerable<T>.Count() == 0 → !IEnumerable<T>.Any()
Filtered counting (AvoidMultipleTypeAttributes.cs:40)
.Where(predicate).Count() → .Count(predicate)
// Before
if (paramAst.Attributes.Where(typeAst => typeAst is TypeConstraintAst).Count() > 1)
// After
if (paramAst.Attributes.Count(typeAst => typeAst is TypeConstraintAst) > 1)
Impact: Eliminates unnecessary enumerations in settings parsing and per-rule execution paths. Any() short-circuits on first match; Count(predicate) eliminates intermediate allocations.
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
0t3vsblobprodcus362.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
1k9vsblobprodcus379.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
4myvsblobprodcus32.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
5dkvsblobprodcus355.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/Engine/Engine.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
7tjvsblobprodcus341.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
c78vsblobprodcus322.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
jd4vsblobprodcus366.vsblob.vsassets.io
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/F1242452CC06D4F8E99F297E498B3485/missingpackages_workingdir --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
josvsblobprodcus372.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
jrqvsblobprodcus343.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/Rules/Rules.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
kh4vsblobprodcus325.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
l49vsblobprodcus358.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
m6xvsblobprodcus342.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
p2ovsblobprodcus312.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
rcxvsblobprodcus328.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
sqdvsblobprodcus333.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
tphvsblobprodcus375.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
u6ovsblobprodcus377.vsblob.vsassets.io
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/F1242452CC06D4F8E99F297E498B3485/missingpackages_workingdir --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
uy6vsblobprodcus34.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
v53vsblobprodcus320.vsblob.vsassets.io
- Triggering command:
/usr/share/dotnet/dotnet /usr/share/dotnet/dotnet build --framework net8 --configuration PSV7Debug (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSScriptAnalyzer.sln --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
- Triggering command:
/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/PSScriptAnalyzer/PSScriptAnalyzer/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj --packages /home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/PSScriptAnalyzer/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
www.powershellgallery.com
- Triggering command:
/usr/bin/pwsh pwsh -Command ./build.ps1 /rg (dns block)
If you need me to access, download, or install something from one of these locations, you can either:
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.
PR Checklist
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR refines several LINQ usage patterns in the ScriptAnalyzer engine and built-in rules to avoid unnecessary enumerations and iterator allocations in common execution paths.
Changes:
- Replaced
Count() == 0 emptiness checks with !Any() for IEnumerable<T> sequences.
- Replaced
Where(predicate).Count() with Count(predicate) to avoid intermediate iterators.
- Replaced
List<T>.Count() calls with List<T>.Count property access.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File |
Description |
| Rules/AvoidMultipleTypeAttributes.cs |
Uses Count(predicate) instead of Where(...).Count() when checking type-constraint attribute count. |
| Engine/Settings.cs |
Uses Any() for hashtable-AST presence checks while parsing settings files. |
| Engine/ScriptAnalyzer.cs |
Uses List<T>.Count properties and switches hashtable-AST emptiness checks to Any(). |
| Engine/Generic/RuleSuppression.cs |
Uses Any() for suppression target resolution emptiness checks. |
Comments suppressed due to low confidence (3)
Engine/Settings.cs:461
- This still enumerates
hashTableAsts twice (Any() then First()), which can be expensive since FindAll(...) may involve a traversal. Consider using FirstOrDefault() once and null-checking the result to avoid multiple enumerations (see similar pattern in Rules/AvoidUsingDeprecatedManifestFields.cs).
IEnumerable<Ast> hashTableAsts = profileAst.FindAll(item => item is HashtableAst, false);
// no hashtable, raise warning
if (!hashTableAsts.Any())
{
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.InvalidProfile, settingsFilePath));
}
HashtableAst hashTableAst = hashTableAsts.First() as HashtableAst;
Engine/ScriptAnalyzer.cs:621
- This emptiness check uses
Any() but the code then enumerates hashTableAsts again via First(). To keep the optimization end-to-end, consider replacing the Any()/First() pair with a single FirstOrDefault() and checking for null before proceeding.
IEnumerable<Ast> hashTableAsts = profileAst.FindAll(item => item is HashtableAst, false);
// no hashtable, raise warning
if (!hashTableAsts.Any())
{
writer.WriteError(new ErrorRecord(new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.InvalidProfile, profile)),
Strings.ConfigurationFileHasNoHashTable, ErrorCategory.ResourceUnavailable, profile));
hasError = true;
}
else
{
HashtableAst hashTableAst = hashTableAsts.First() as HashtableAst;
Engine/Generic/RuleSuppression.cs:361
targetAsts is enumerated twice here (Any() and then the foreach). If FindAll(...) returns a non-materialized enumerable, this causes repeated traversal. Consider materializing once (e.g., to a list) or restructuring to avoid a separate emptiness check before iterating.
if (!targetAsts.Any())
{
if (String.IsNullOrWhiteSpace(scopeAst.Extent.File))
{
ruleSupp.Error = String.Format(CultureInfo.CurrentCulture, Strings.RuleSuppressionErrorFormatScriptDefinition, ruleSupp.StartAttributeLine,
String.Format(Strings.TargetCannotBeFoundError, ruleSupp.Target, ruleSupp.Scope));
}
else
{
ruleSupp.Error = String.Format(CultureInfo.CurrentCulture, Strings.RuleSuppressionErrorFormat, ruleSupp.StartAttributeLine,
System.IO.Path.GetFileName(scopeAst.Extent.File), String.Format(Strings.TargetCannotBeFoundError, ruleSupp.Target, ruleSupp.Scope));
}
result.Add(ruleSupp);
continue;
}
foreach (Ast targetAst in targetAsts)
{
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Lol it's doing it how I'd do it.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Reviewers
+1 more reviewer
Reviewers whose approvals may not affect merge requirements
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|